Stop hardcoding V0.5_feasibility when creating docgov records; prefer frozen-instance StageKey from TaskRunRequest with main-task fallback. Co-authored-by: Cursor <cursoragent@cursor.com>
160 lines
8.0 KiB
Go
160 lines
8.0 KiB
Go
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"`
|
|
}
|
|
|
|
// 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)
|
|
}
|