Files
Agent-System/internal/bizdev/types.go
T
weichenandCursor b5a3b72756 fix(bizdev): stop stage chain on pending agent confirmation
PendingAgentCandidateID must not continue the stage loop or inject
unconfirmed MarkdownBody/ExtractedData as PriorDoc. Return explicit
awaiting-confirmation status; user re-runs the stage after deciding.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-13 09:57:54 +00:00

165 lines
8.2 KiB
Go

package bizdev
import (
"context"
"time"
"chat-agent-system/internal/ctxmgr"
"chat-agent-system/internal/docgov"
"chat-agent-system/internal/kb"
"chat-agent-system/internal/squad"
"chat-agent-system/internal/storage"
)
type TaskMeta = squad.TaskMeta
type AdvisorBriefing = squad.AdvisorBriefing
// MaturityStage 定义商务对接成熟度螺旋收敛阶段
type MaturityStage string
const (
StageV01_Triage MaturityStage = "V0.1_triage" // 闪电摸底与盲区探测
StageV05_Feasibility MaturityStage = "V0.5_feasibility" // 方案成型与法规对齐
StageV10_Quoting MaturityStage = "V1.0_quoting" // 工程拆解与商业锁定
)
// StageMeta 商务对接阶段元数据说明
type StageMeta struct {
Stage MaturityStage `json:"stage"`
Title string `json:"title"`
Description string `json:"description"`
Tasks []string `json:"tasks"`
}
type MaterialInput struct {
Filename string `json:"filename"`
Content []byte `json:"content"`
AssetID int64 `json:"asset_id,omitempty"`
}
type Attachment = squad.Attachment
type CaseSearchOptions = ctxmgr.CaseSearchOptions
type TaskRunRequest struct {
TaskKey string `json:"task_key"`
Title string `json:"title,omitempty"` // 自由任务人类可读标题(非标任务自主规划使用)
ProjectName string `json:"project_name"`
CustomerName string `json:"customer_name"`
DeviceType string `json:"device_type"`
IntendedUse string `json:"intended_use"`
TargetMarket string `json:"target_market"`
Fields map[string]string `json:"fields"`
Materials []MaterialInput `json:"materials"`
Backend string `json:"backend"`
Timeout time.Duration `json:"timeout"`
WorkDir string `json:"work_dir"`
CustomSteps []squad.StepSpec `json:"custom_steps,omitempty"`
AutoRepair bool `json:"auto_repair,omitempty"`
KnowledgeHits []squad.KnowledgeHit `json:"knowledge_hits,omitempty"`
PriorDocs []squad.PriorDocItem `json:"prior_docs,omitempty"`
SessionID string `json:"session_id,omitempty"`
UserID int64 `json:"user_id,omitempty"`
ProjectID int64 `json:"project_id,omitempty"`
ClientTurnID string `json:"client_turn_id,omitempty"`
RunID string `json:"run_id,omitempty"`
UserContext string `json:"user_context,omitempty"`
MemoryBankFiles map[string]string `json:"memory_bank_files,omitempty"`
DocID string `json:"doc_id,omitempty"`
AuthorID int64 `json:"author_id,omitempty"`
AuthorName string `json:"author_name,omitempty"`
ReviewerID int64 `json:"reviewer_id,omitempty"`
ReviewerName string `json:"reviewer_name,omitempty"`
ApproverID int64 `json:"approver_id,omitempty"`
ApproverName string `json:"approver_name,omitempty"`
ForceDirectEdit bool `json:"force_direct_edit,omitempty"`
}
type TaskRunResult struct {
TaskKey string `json:"task_key"`
ArtifactTitle string `json:"artifact_title"`
MarkdownBody string `json:"markdown_body"`
ExtractedData map[string]string `json:"extracted_data"`
Attachments []Attachment `json:"attachments"`
WorkDir string `json:"work_dir"`
BackendUsed string `json:"backend_used"`
Duration time.Duration `json:"duration"`
Success bool `json:"success"`
ErrorReason string `json:"error_reason,omitempty"`
QualityReport *squad.QualityReport `json:"quality_report,omitempty"`
Manifest *squad.Manifest `json:"manifest,omitempty"`
AdvisorBrief *AdvisorBriefing `json:"advisor_brief,omitempty"`
DocRecord *docgov.DocumentRecord `json:"doc_record,omitempty"`
PendingProposal *docgov.ChangeProposal `json:"pending_proposal,omitempty"`
// RequiresAuthorApproval: human must decide. Disambiguate:
// - PendingProposal != nil → DocGov claimed-doc change proposal
// - PendingAgentCandidateID > 0 → high-risk revision candidate (ledger not committed)
RequiresAuthorApproval bool `json:"requires_author_approval,omitempty"`
// Pending agent revision confirmation (high/critical): fact source stays on ledger head.
PendingAgentCandidateID int64 `json:"pending_agent_candidate_id,omitempty"`
PendingChangeReportID int64 `json:"pending_change_report_id,omitempty"`
PendingRiskLevel string `json:"pending_risk_level,omitempty"`
PendingConfirmationNote string `json:"pending_confirmation_note,omitempty"`
}
// StageRunRequest 运行指定成熟度阶段请求
type StageRunRequest struct {
Stage MaturityStage `json:"stage"`
ProjectName string `json:"project_name"`
CustomerName string `json:"customer_name"`
DeviceType string `json:"device_type"`
IntendedUse string `json:"intended_use"`
TargetMarket string `json:"target_market"`
Fields map[string]string `json:"fields,omitempty"`
Materials []MaterialInput `json:"materials,omitempty"`
Backend string `json:"backend,omitempty"`
Timeout time.Duration `json:"timeout,omitempty"`
WorkDir string `json:"work_dir,omitempty"`
AutoRepair bool `json:"auto_repair,omitempty"`
PriorDocs []squad.PriorDocItem `json:"prior_docs,omitempty"`
KnowledgeHits []squad.KnowledgeHit `json:"knowledge_hits,omitempty"`
SessionID string `json:"session_id,omitempty"`
UserID int64 `json:"user_id,omitempty"`
ProjectID int64 `json:"project_id,omitempty"`
ClientTurnID string `json:"client_turn_id,omitempty"`
RunID string `json:"run_id,omitempty"`
DocID string `json:"doc_id,omitempty"`
AuthorID int64 `json:"author_id,omitempty"`
AuthorName string `json:"author_name,omitempty"`
ReviewerID int64 `json:"reviewer_id,omitempty"`
ReviewerName string `json:"reviewer_name,omitempty"`
ApproverID int64 `json:"approver_id,omitempty"`
ApproverName string `json:"approver_name,omitempty"`
ForceDirectEdit bool `json:"force_direct_edit,omitempty"`
}
// StageRunResult 成熟度阶段执行结果(双轨交付:A轨合规文档 + B轨业务参谋锦囊)
type StageRunResult struct {
Stage MaturityStage `json:"stage"`
StageTitle string `json:"stage_title"`
PrimaryArtifact *TaskRunResult `json:"primary_artifact"`
SubArtifacts []*TaskRunResult `json:"sub_artifacts,omitempty"`
AdvisorBrief *AdvisorBriefing `json:"advisor_brief,omitempty"`
Duration time.Duration `json:"duration"`
Success bool `json:"success"`
WorkDir string `json:"work_dir"`
ErrorReason string `json:"error_reason,omitempty"`
// Pending* mirror the blocking high-risk candidate that stopped the stage chain
// (no ExtractedData / PriorDoc absorption from that candidate).
PendingAgentCandidateID int64 `json:"pending_agent_candidate_id,omitempty"`
PendingChangeReportID int64 `json:"pending_change_report_id,omitempty"`
PendingRiskLevel string `json:"pending_risk_level,omitempty"`
}
type BizdevService interface {
ListTasks() []TaskMeta
ListStages() []StageMeta
ExecuteTask(ctx context.Context, req TaskRunRequest) (*TaskRunResult, error)
ExecuteStage(ctx context.Context, req StageRunRequest) (*StageRunResult, error)
InspectWorkspace(ctx context.Context, workDir string) (*squad.WorkspaceState, error)
ResumeOrModifyWorkspace(ctx context.Context, req squad.ModifyWorkflowRequest) (*squad.SquadRunResult, error)
ContextManager() *ctxmgr.ContextManager
CAS() *storage.CAS
DocGov() *docgov.GovernanceEngine
KB() *kb.Client
}