package bizdev import ( "context" "time" "chat-agent-system/internal/ctxmgr" "chat-agent-system/internal/docgov" "chat-agent-system/internal/maturity" "chat-agent-system/internal/squad" ) type TaskMeta = squad.TaskMeta type AdvisorBriefing = squad.AdvisorBriefing type MaturityStage = maturity.MaturityStage const ( StageV01_Triage = maturity.StageV01_Triage StageV05_Feasibility = maturity.StageV05_Feasibility StageV10_Quoting = maturity.StageV10_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"` StageKey string `json:"stage_key,omitempty"` // 冻结实例阶段键;空则 resolveDocStage 回落 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"` // PendingContextConflicts: dialogue-fact conflicts routed to the triggering // user (HITL trigger_user). Server projects them as chat confirmation cards. PendingContextConflicts []ContextConflictCard `json:"pending_context_conflicts,omitempty"` } // ContextConflictCard is the user-facing projection of one needs_confirm // adjudication verdict (conflictresolve route trigger_user, card-eligible). type ContextConflictCard struct { ExpectationID string `json:"expectation_id"` FactKey string `json:"fact_key"` WinningValue string `json:"winning_value"` Prompt string `json:"prompt"` Snippet string `json:"snippet"` } // 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) }