Documentation
¶
Overview ¶
Package types 定义 Agent 领域的数据库实体与值对象。
本包只包含可序列化的领域数据(Task / Session / Message / PermissionRequest / QuestionRequest / Profile / Memory 等)以及请求 / 结果 / 事件等值对象,不包含 任何持久化或编排实现。Repository 与 Service 接口见 types/interface, 实现在 application/repository 与 application/service。
Index ¶
- Constants
- Variables
- func BuildMemoryContext(memories []*Memory) string
- func IsBlockEvent(t StreamEventType) bool
- func IsBuiltinProfileID(id int64) bool
- func ToolCallIDFromContext(ctx context.Context) string
- func WithToolCallID(ctx context.Context, id string) context.Context
- type AgentEvent
- type AgentEventType
- type AskUserAnswer
- type AskUserInput
- type ContextConfig
- type EventHandler
- type File
- type Memory
- type MemoryExtractor
- type MemoryExtractorFunc
- type MemoryKind
- type MemoryQuery
- type MemoryTurn
- type Message
- type MessageBlock
- type MessageCreateParams
- type Operation
- type OperationType
- type PermissionDecision
- type PermissionRequest
- type PermissionStatus
- type Profile
- type Question
- type QuestionAnswer
- type QuestionOption
- type QuestionRequest
- type QuestionStatus
- type ReasoningBlock
- type Request
- type Result
- type ResumeMessage
- type ResumeToolCall
- type ResumeToolResult
- type ResumeTurn
- type Session
- type SessionChildParams
- type SessionCreateParams
- type SessionListParams
- type StreamEvent
- type StreamEventType
- type StreamHandler
- type Task
- type TaskFacts
- type TaskFinishedHandler
- type TaskResumeState
- type TaskStatus
- type ToolCall
- type TurnBlock
- type Usage
- type UserAgentConfig
Constants ¶
const ( ProviderMock = "mock" // 自研 mock,用于保证链路可跑通 ProviderClaudeCode = "claude_code" // Anthropic Claude Code CLI ProviderCodex = "codex" // OpenAI Codex CLI ProviderCopilot = "copilot" // GitHub Copilot CLI ProviderCustom = "custom" // 自研 Agent(内置 LLM 协议客户端 + 工具循环) )
Provider 名称常量。新增第三方 Agent 或自研 Agent 时在此登记一个唯一名称。
const ( RoleSystem = "system" RoleUser = "user" RoleAssistant = "assistant" RoleTool = "tool" )
消息角色。
const ( KindUser = "user" KindAssistant = "assistant" KindAssistantFinal = "assistant_final" KindReasoning = "reasoning" KindToolCall = "tool_call" KindToolResult = "tool_result" // KindError 是一条可回放的错误消息(任务执行失败时由 ChatService 写入), // 前端据此用错误样式稳定展示,而不是只依赖临时流式事件。 KindError = "error" )
消息类型(会话层可回放的消息种类)。
const ( MessageKindUser = KindUser MessageKindAssistant = KindAssistant MessageKindAssistantFinal = KindAssistantFinal MessageKindReasoning = KindReasoning MessageKindToolCall = KindToolCall MessageKindToolResult = KindToolResult )
MessageKind 常量是 Kind* 的兼容别名(旧 agent 包对外的命名)。
const ( OperationRead = coretypes.OperationRead // 读取文件 OperationWrite = coretypes.OperationWrite // 写入 / 修改文件 OperationDelete = coretypes.OperationDelete // 删除文件 OperationMove = coretypes.OperationMove // 移动 / 重命名文件 OperationExecute = coretypes.OperationExecute // 执行命令 / 脚本 OperationNetwork = coretypes.OperationNetwork // 网络访问 OperationAnalysisNode = coretypes.OperationAnalysisNode // 运行分析节点(区别于直接执行 shell / 脚本) )
OperationType 取值(别名指向 internal/types 中的定义)。
const ( DecisionAllow = coretypes.DecisionAllow // 允许执行 DecisionDeny = coretypes.DecisionDeny // 拒绝执行 DecisionAsk = coretypes.DecisionAsk // 需要人工确认 )
PermissionDecision 取值(别名指向 internal/types 中的定义)。
const ( BuiltinDefaultProfileID int64 = -1 // 内置默认 Profile BuiltinAnalysisCoderID int64 = -2 // 内置「分析代码编写」Profile BuiltinArticleWriterID int64 = -3 // 内置「科研文章撰写」Profile BuiltinSummaryProfileID int64 = -4 // 内置「摘要总结」Profile )
内置 Profile 使用固定的负数 ID,避免与雪花算法生成的正整数主键冲突。 Profile 的查询 / 引用一律使用 ID;Name 仅用于展示。
const ( BuiltinPromptDefault = "default" // builtin/prompts/default.md BuiltinPromptAnalysisCoder = "analysis_coder" // builtin/prompts/analysis_coder.md BuiltinPromptArticleWriter = "article_writer" // builtin/prompts/article_writer.md BuiltinPromptSummary = "summary" // builtin/prompts/summary.md // BuiltinPromptBaseCoder 是所有 Profile 共用的基础编码提示词(拷自 opencode 的 // baseAnthropicCoderPrompt),作为系统提示词的前置部分统一注入,见 buildSystemPrompt。 BuiltinPromptBaseCoder = "base_coder" // builtin/prompts/base_coder.md )
内置 Profile 的 SystemPrompt 不硬编码在代码里,而是从内置提示词目录 (utils.BuiltinPromptDir,即 builtin/prompts)读取同名 .md 文件: 文件名 = 提示词名(不含 .md 后缀),内容为 pongo2 模板。
const ( QuestionTypeSingleChoice = "single_choice" QuestionTypeMultipleChoice = "multiple_choice" QuestionTypeText = "text" )
问题类型常量。
const AskUserToolName = "ask_user"
AskUserToolName 是 ask_user 工具名(模型据此发起调用)。
const BuiltinDefaultProfileName = "通用助手"
BuiltinDefaultProfileName 是内置默认 Profile 的展示名。用于无需查询数据库即可获得 展示名的场景(如 DefaultUserAgentConfig)。
const DefaultMemoryRetrieveLimit = 5
DefaultMemoryRetrieveLimit 是单次注入检索记忆的默认条数上限。
const DefaultProvider = ProviderMock
DefaultProvider 是未配置时的兜底 Provider。
const InitialVersion = "initial"
InitialVersion 是文件第一次被记录时使用的版本号。
const OperationMetadataToolCallID = "tool_call_id"
OperationMetadataToolCallID 是 Operation.Metadata 中记录工具调用 ID 的键。
const ResumeStateVersion = 1
ResumeStateVersion 是检查点结构版本。结构不兼容变更时递增,旧检查点会被忽略。
const TitleSessionTitle = "Generate a title"
TitleSessionTitle 是标题生成子会话的固定标题(与 opencode 保持一致)。
Variables ¶
var ( // ErrHistoryNotFound 表示历史记录不存在。 ErrHistoryNotFound = errors.New("history: file not found") // ErrDuplicateVersion 表示 (session_id, path, version) 发生唯一键冲突, // 调用方可据此重新推导版本号后重试。 ErrDuplicateVersion = errors.New("history: duplicate version") )
文件历史相关错误。
var ( // ErrMemoryNotFound 表示记忆不存在。 ErrMemoryNotFound = errors.New("agent: memory not found") // ErrMemoryNotConfigured 表示 AgentService 未配置记忆管理器。 ErrMemoryNotConfigured = errors.New("agent: memory manager not configured") )
记忆相关错误。
var ( // ErrPermissionDenied 表示权限请求被拒绝,或策略直接判定为 deny。 ErrPermissionDenied = errors.New("agent: permission denied") // ErrPermissionNotFound 表示权限请求不存在。 ErrPermissionNotFound = errors.New("agent: permission request not found") // ErrPermissionNotPending 表示尝试对非 pending 状态的权限请求做批准 / 拒绝。 ErrPermissionNotPending = errors.New("agent: permission request is not pending") // ErrPermissionExpired 表示等待的权限请求已过期。 ErrPermissionExpired = errors.New("agent: permission request expired") // ErrPermissionCanceled 表示等待的权限请求已取消。 ErrPermissionCanceled = errors.New("agent: permission request canceled") // ErrInvalidPermissionTransition 表示非法的权限状态迁移。 ErrInvalidPermissionTransition = errors.New("agent: invalid permission state transition") )
权限相关错误。
var ( // ErrProfileNotFound 表示 Profile 不存在。 ErrProfileNotFound = errors.New("agent: profile not found") // ErrProfileNameRequired 表示 Profile 名称缺失。 ErrProfileNameRequired = errors.New("agent: profile name is required") )
Profile 相关错误。
var ( // ErrQuestionNotFound 表示提问请求不存在。 ErrQuestionNotFound = errors.New("agent: question request not found") // ErrQuestionNotPending 表示尝试对非 pending 的提问请求作答。 ErrQuestionNotPending = errors.New("agent: question request is not pending") // ErrQuestionCanceled 表示等待的提问已被取消。 ErrQuestionCanceled = errors.New("agent: question request canceled") // ErrQuestionExpired 表示等待的提问已过期。 ErrQuestionExpired = errors.New("agent: question request expired") // ErrInvalidQuestionTransition 表示非法的提问状态迁移。 ErrInvalidQuestionTransition = errors.New("agent: invalid question state transition") // ErrNoUserInputResolver 表示当前 Runtime 无法向用户提问(无 UI)。 ErrNoUserInputResolver = errors.New("agent: no user input resolver in runtime") // ErrUnknownQuestionID 表示提交的答案引用了本次提问不存在的问题 ID。 ErrUnknownQuestionID = errors.New("agent: unknown question id") )
提问相关错误。
var ( // ErrTaskNotFound 表示任务不存在。 ErrTaskNotFound = errors.New("agent: task not found") // ErrTaskAlreadyRunning 表示任务已经在执行中。 ErrTaskAlreadyRunning = errors.New("agent: task already running") // ErrTaskNotResumable 表示任务没有可恢复检查点,或当前状态不允许续跑。 ErrTaskNotResumable = errors.New("agent: task not resumable") // ErrInvalidTaskTransition 表示非法的任务状态迁移。 ErrInvalidTaskTransition = errors.New("agent: invalid task state transition") )
任务相关错误。
var ErrInvalidParentSession = errors.New("session: parent session id is required")
ErrInvalidParentSession 表示创建子会话时父会话 ID 无效。
var ErrMessageNotFound = errors.New("message: not found")
ErrMessageNotFound 表示消息不存在。
var ErrNotImplemented = errors.New("agent: provider not implemented yet")
ErrNotImplemented 表示某个 Provider 尚未实现真实调用。
var ErrSessionNotFound = errors.New("session: not found")
ErrSessionNotFound 表示会话不存在。
Functions ¶
func BuildMemoryContext ¶
BuildMemoryContext 把检索到的记忆格式化为注入上下文的文本块。
用于 AgentService 在调用前把相关记忆注入 SystemPrompt,让 Agent「记得」相关背景。 无记忆时返回空字符串。
func IsBlockEvent ¶
func IsBlockEvent(t StreamEventType) bool
IsBlockEvent 判断事件类型是否应被持久化(作为时间线数据源)。
只有纯增量事件(text / reasoning_delta)是“临时”的:它们用于前端实时渲染, 默认只广播不落库;其余事件(完整块 + done/error/permission 等生命周期信号)都会落库。
func IsBuiltinProfileID ¶
IsBuiltinProfileID 判断给定 ID 是否为内置 Profile。 内置 Profile 使用固定的负数 ID,用户自定义 Profile 使用雪花算法生成的正整数 ID。
func ToolCallIDFromContext ¶
ToolCallIDFromContext 读取当前工具调用 ID;不存在时返回空串。
Types ¶
type AgentEvent ¶
type AgentEvent struct {
ID int64 `json:"id,string"`
TaskID int64 `json:"task_id,string"`
// UserID / SessionID 是事件的推送路由与归属信息:由服务层从 TaskFacts 填充,
// 传输层(WS / SSE)据此决定推给谁,不需要再维护 taskID → userID 的映射表,
// 也不需要按任务逐个订阅。
//
// UserID 为 0 表示无登录用户(后台任务 / 系统摘要),不应推送给任何客户端。
UserID int64 `json:"user_id,string,omitempty"`
SessionID int64 `json:"session_id,string,omitempty"`
Type AgentEventType `json:"type"`
Payload any `json:"payload,omitempty"`
CreatedAt time.Time `json:"created_at"`
}
AgentEvent 是发布到 EventBus 的实时通知事件。
它只承担实时推送职责(WS / SSE),**不落库**:任务时间线的持久化由 TimelineRecorder 投影到 agent_messages(见 timeline.go)。 前端刷新 / 恢复历史请读会话消息,而不是事件流。
type AgentEventType ¶
type AgentEventType string
AgentEventType 枚举任务生命周期与实时通知事件。
流式内容事件统一使用 EventStream,具体细分见 StreamEvent.Type; 权限与任务状态变化使用独立类型,便于前端按类型订阅与恢复。
const ( EventTaskCreated AgentEventType = "task.created" // 任务已创建 EventTaskStarted AgentEventType = "task.started" // 任务开始执行 EventTaskWaiting AgentEventType = "task.waiting" // 任务进入等待权限状态 EventTaskCompleted AgentEventType = "task.completed" // 任务完成 EventTaskFailed AgentEventType = "task.failed" // 任务失败 EventTaskCanceled AgentEventType = "task.canceled" // 任务取消 EventPermissionCreated AgentEventType = "permission.created" // 新增待确认权限 EventPermissionResolved AgentEventType = "permission.resolved" // 权限已被批准 / 拒绝 EventQuestionCreated AgentEventType = "question.created" // 新增待作答提问(Payload 为 QuestionRequest) EventQuestionResolved AgentEventType = "question.resolved" // 提问已作答 / 取消(Payload 为 QuestionRequest) EventMemorySaved AgentEventType = "memory.saved" // 记忆已保存(Payload 为 Memory) EventMemoryDeleted AgentEventType = "memory.deleted" // 记忆已删除(Payload 为 Memory) EventStream AgentEventType = "stream" // 透传的流式事件(Payload 为 StreamEvent) )
type AskUserAnswer ¶
type AskUserAnswer struct {
RequestID string `json:"request_id,omitempty"`
Answers []QuestionAnswer `json:"answers"`
AnsweredIDs []string `json:"answered_ids,omitempty"` // 本次已作答的问题 ID(用于逐题提交合并)
}
AskUserAnswer 是用户对一次提问的全部作答,也是 ask_user 工具回传给模型的结果。
一次提问可包含多个问题,界面通常按「一题一页」逐题作答:前端在翻页 / 提交时 只回传已完成的问题,并附带 AnsweredIDs(本次已作答的问题 ID)。服务端据此把 本轮作答合并进暂存进度,直到所有必答问题都有答案才真正唤醒 Agent;因此 AnsweredIDs 让「已作答」与「当前值恰为空」两种情形可以区分。
func (AskUserAnswer) AnsweredQuestions ¶
func (a AskUserAnswer) AnsweredQuestions(questions []Question) map[string]bool
AnsweredQuestions 返回已作答的问题 ID 集合(显式 AnsweredIDs 优先,缺省时取 Answers 中出现在 questions 里的 ID)。
func (AskUserAnswer) IsComplete ¶
func (a AskUserAnswer) IsComplete(questions []Question) bool
IsComplete 判断是否所有必答问题都已在作答中给出答案。
文本题以 Value 非空为准;选择题以 Value / Values / Custom 任一非空为准。 所有问题都不是必答时,只要作答集合非空即视为完成。
func (AskUserAnswer) Merge ¶
func (a AskUserAnswer) Merge(base *AskUserAnswer, questions []Question) AskUserAnswer
Merge 把本次作答合并进已有作答(按问题 ID 覆盖),返回合并结果。
base 为 nil 时以本题作答为基础。合并保持 questions 的顺序,未出现在本次作答中的 问题沿用 base 中的答案;AnsweredIDs 取并集。
type AskUserInput ¶
type AskUserInput struct {
RequestID string `json:"request_id,omitempty"` // 模型侧请求 ID(可选,用于回填)
Title string `json:"title,omitempty"` // 提问卡片标题
Description string `json:"description,omitempty"` // 补充说明
Questions []Question `json:"questions"` // 需要用户回答的问题列表
}
AskUserInput 是 ask_user 工具的入参,也是持久化到 QuestionRequest 的提问内容。
结构对齐前端的提问卡片:一个 request 可携带多个 questions,每个 question 支持单选 / 多选 / 文本,并可允许用户自定义输入。
func (*AskUserInput) Normalize ¶
func (in *AskUserInput) Normalize()
Normalize 规整模型生成的提问内容,使其可以直接渲染与匹配答案。
模型并非总会遵守 JSON Schema:选项常常漏填 value(只给 label),甚至出现 重复 value。前端的 Radio / Checkbox 以 value 作为选中标识,value 缺失或不唯一 时会让所有选项共享同一个值,表现为「点一个选项,全部选项都被选中」。 因此这里统一补齐 value(回退 label / value)并保证同一题内取值唯一。
type ContextConfig ¶
type ContextConfig struct {
InjectMemory bool `json:"inject_memory"`
}
ContextConfig 控制 AgentService 在调用前注入哪些背景。
- InjectMemory:检索长期记忆并拼进 SystemPrompt。
type EventHandler ¶
type EventHandler func(ctx context.Context, event AgentEvent) error
EventHandler 是事件订阅回调。 返回 error 表示处理失败;EventBus 目前采用同步分发,回调应避免阻塞。
type File ¶
type File struct {
ID int64 `json:"id,string" gorm:"column:id;primaryKey;type:bigint;autoIncrement:false"`
SessionID int64 `json:"session_id,string" gorm:"column:session_id;type:bigint;index:idx_history_session_path,priority:1"`
Path string `` /* 145-byte string literal not displayed */
Content string `json:"content" gorm:"column:content;type:longtext"`
Version string `json:"version" gorm:"column:version;type:varchar(64);uniqueIndex:uk_history_session_path_version,priority:3"`
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"`
}
File 是某个会话中某个文件的一个历史版本。
Path 长度受 MySQL 索引键上限约束:InnoDB(DYNAMIC 行格式)单索引最多 3072 字节, 而 DSN 使用 utf8mb4(每个字符最多 4 字节)。Path 同时出现在
idx_history_session_path (session_id, path) uk_history_session_path_version (session_id, path, version)
两个索引里,因此 path 的字符数上限为 (3072 - 8 - 64*4) / 4 = 702。 原先声明为 varchar(1024)(4096 字节)会让 AutoMigrate 直接失败并报 "Error 1071 (42000): Specified key was too long; max key length is 3072 bytes"。 这里取 512,为将来调整 version 长度留出余量。
func (*File) BeforeCreate ¶
BeforeCreate 在写入数据库前用雪花 ID 初始化主键。
type Memory ¶
type Memory struct {
ID int64 `json:"id,string" gorm:"column:id;primaryKey;type:bigint;autoIncrement:false"`
UserID int64 `json:"user_id,string" gorm:"column:user_id;type:bigint;index:idx_agent_memories_user_kind,priority:1"`
ProjectID int64 `json:"project_id,omitempty,string" gorm:"column:project_id;type:bigint;index"`
SessionID int64 `json:"session_id,omitempty,string" gorm:"column:session_id;type:bigint;index"`
Kind MemoryKind `json:"kind" gorm:"column:kind;type:varchar(32);index:idx_agent_memories_user_kind,priority:2"`
// Content 可能是整段会话 / 任务摘要或长事实,64KB 的 text 会触发 1406,这里用 longtext。
Content string `json:"content" gorm:"column:content;type:longtext"`
// Importance 表示记忆重要度(0-10),检索排序时权重更高。
Importance int `json:"importance" gorm:"column:importance"`
// Metadata 承载扩展信息(来源、标签等),由序列化为 JSON 持久化。
Metadata map[string]any `json:"metadata,omitempty" gorm:"column:metadata;serializer:json"`
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"`
LastAccessedAt *time.Time `json:"last_accessed_at,omitempty" gorm:"column:last_accessed_at"`
}
Memory 是一条可跨轮次 / 跨会话检索的持久化记忆。
UserID 是记忆的主归属维度(长期记忆按用户隔离);ProjectID / SessionID 可选, 用于把记忆与某个具体项目 / 会话关联(例如该会话的摘要),检索时优先命中。
func NewMemory ¶
func NewMemory(userID int64, projectID int64, sessionID int64, kind MemoryKind, content string) *Memory
NewMemory 构建一条记忆;主键(ID)由持久化层的 BeforeCreate 在首次写入时分配。
func (*Memory) BeforeCreate ¶
BeforeCreate 在写入数据库前用雪花 ID 初始化主键。
type MemoryExtractor ¶
type MemoryExtractor interface {
Extract(ctx context.Context, turn MemoryTurn) ([]*Memory, error)
}
MemoryExtractor 从一轮完成的对话 / 任务结果中提取值得长期记住的记忆。
这是一个可选钩子:AgentService 在任务完成后调用,把提取出的记忆写入 Repository。 返回 nil 表示本轮无需写入任何记忆。默认不配置(不提取);可由上层注入基于规则 或基于 LLM 的实现。
func MockMemoryExtractor ¶
func MockMemoryExtractor() MemoryExtractor
MockMemoryExtractor 返回一个模拟的记忆提取器:把本轮的用户提问与助手回复 组合成一条 summary 记忆(内容做截断防止过长)。
用于演示 / 测试「任务完成 → 提取 → 落库」的调用链,不接入真实 LLM 或规则引擎; 生产环境应替换为基于规则或基于 LLM 的 MemoryExtractor 实现。
type MemoryExtractorFunc ¶
type MemoryExtractorFunc func(ctx context.Context, turn MemoryTurn) ([]*Memory, error)
MemoryExtractorFunc 是把普通函数适配为 MemoryExtractor 的辅助类型。
func (MemoryExtractorFunc) Extract ¶
func (f MemoryExtractorFunc) Extract(ctx context.Context, turn MemoryTurn) ([]*Memory, error)
Extract 实现 MemoryExtractor 接口。
type MemoryKind ¶
type MemoryKind string
MemoryKind 描述记忆的类别,用于检索排序与前端展示。
const ( MemoryKindFact MemoryKind = "fact" // 用户偏好 / 事实(长期有效) MemoryKindSummary MemoryKind = "summary" // 会话 / 任务摘要 MemoryKindNote MemoryKind = "note" // 通用备注 MemoryKindEvent MemoryKind = "event" // 事件记录(带时间语义) )
type MemoryQuery ¶
type MemoryQuery struct {
UserID int64
ProjectID int64
SessionID int64
// Text 是检索关键词;为空时退化为「按上下文 + 更新时间」的分页读取。
Text string
Limit int
}
MemoryQuery 描述一次记忆检索的上下文。
UserID 是归属用户(必填);ProjectID / SessionID 是可选的业务上下文,用于优先 返回同项目 / 同会话的记忆。Text 为关键词;为空时退化为按上下文 + 更新时间读取。
type MemoryTurn ¶
type MemoryTurn struct {
UserID int64
ProjectID int64
SessionID int64
Request Request
Result *Result
}
MemoryTurn 描述一轮已完成执行的上下文,供 MemoryExtractor 提取记忆。
type Message ¶
type Message struct {
ID int64 `json:"id,string" gorm:"column:id;primaryKey;type:bigint;autoIncrement:false"`
SessionID int64 `json:"session_id,string" gorm:"column:session_id;type:bigint;index"`
Seq int `json:"seq" gorm:"column:seq;index"`
Role string `json:"role" gorm:"column:role;type:varchar(32)"`
Kind string `json:"kind,omitempty" gorm:"column:kind;type:varchar(32);index"`
TaskID int64 `json:"task_id,string,omitempty" gorm:"column:task_id;type:bigint;index"`
// Content 可能包含完整工具输出 / 长回复,64KB 的 text 会触发 1406,这里用 longtext。
Content string `json:"content,omitempty" gorm:"column:content;type:longtext"`
Data any `json:"data,omitempty" gorm:"serializer:json"`
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
}
Message 是一条会话消息,以独立表持久化。
它既用于落库(ID / SessionID / Seq / CreatedAt),也用于拼装 Agent 请求 (Role / Content / Kind / TaskID / Data),因此 agent.Request.Messages 直接复用该类型。
func (*Message) BeforeCreate ¶
BeforeCreate 在写入数据库前用雪花 ID 初始化主键。
type MessageBlock ¶
type MessageBlock struct {
ID string `json:"id"` // messageId
TurnID string `json:"turn_id,omitempty"` // 所属 turn
Content string `json:"content"`
ToolCalls []ToolCall `json:"tool_calls,omitempty"`
}
MessageBlock 是一条完整的 assistant 消息(对应 AssistantMessageData), 包含它发起的工具调用列表。
type MessageCreateParams ¶
type MessageCreateParams struct {
SessionID int64
Role string
Kind string
TaskID int64
Content string
Data any
}
MessageCreateParams 是写入一条消息的入参。
type Operation ¶
type Operation struct {
ID string `json:"id,omitempty"`
Type OperationType `json:"type"`
// read / write / delete / move
Path string `json:"path,omitempty"`
// write
Content string `json:"content,omitempty"`
// execute
Command string `json:"command,omitempty"`
// Description 是人类可读的操作摘要(如 "Execute command: ls -la" /
// "Replace content in file /a/b.go")。Provider 有更精确的描述时填入,
// 供 UI 在批准前展示;为空时前端回退到 Path / Command / Content。
Description string `json:"description,omitempty"`
// Metadata 承载操作相关的扩展信息(如命令参数、网络地址等)。
Metadata map[string]any `json:"metadata,omitempty"`
}
Operation 描述 Agent 想要执行的一个原子操作。
它刻意与 PermissionRequest 分离:Operation 只描述“要做什么”, PermissionRequest 记录“这个操作是否被允许、当前处于什么状态”。
type PermissionDecision ¶
type PermissionDecision = coretypes.PermissionDecision
PermissionDecision 是权限策略 / 决策结果。
type PermissionRequest ¶
type PermissionRequest struct {
ID int64 `json:"id,string" gorm:"column:id;primaryKey;type:bigint;autoIncrement:false"`
TaskID int64 `json:"task_id,string" gorm:"column:task_id;type:bigint;index"`
SessionID string `json:"session_id,omitempty" gorm:"column:session_id;type:varchar(64)"`
Operation Operation `json:"operation" gorm:"serializer:json"`
Status PermissionStatus `json:"status" gorm:"column:status;type:varchar(32);index"`
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"`
ResolvedAt *time.Time `json:"resolved_at,omitempty" gorm:"column:resolved_at"`
ResolvedBy *int64 `json:"resolved_by,string,omitempty" gorm:"column:resolved_by;type:bigint"`
}
PermissionRequest 记录一次权限请求及其决策结果,是权限域的持久化对象。
它是“数据库才是状态源”这一原则的载体:Agent 阻塞等待的只是内存中的 channel, 真正的状态始终保存在 Repository 中,因此浏览器刷新 / 后端重启后仍可恢复。
func NewPermissionRequest ¶
func NewPermissionRequest(taskID int64, sessionID string, operation Operation) *PermissionRequest
NewPermissionRequest 构建一个 pending 状态的权限请求。
func (*PermissionRequest) BeforeCreate ¶
func (p *PermissionRequest) BeforeCreate(_ *gorm.DB) error
BeforeCreate 在写入数据库前用雪花 ID 初始化主键。
func (*PermissionRequest) Decision ¶
func (p *PermissionRequest) Decision() PermissionDecision
Decision 把当前状态映射为 Agent 可消费的决策结果。
func (PermissionRequest) TableName ¶
func (PermissionRequest) TableName() string
TableName 返回权限请求表的表名。
func (*PermissionRequest) TransitionTo ¶
func (p *PermissionRequest) TransitionTo(next PermissionStatus) bool
TransitionTo 校验并执行权限状态迁移;非法迁移返回 false 且不改变状态。
type PermissionStatus ¶
type PermissionStatus string
PermissionStatus 是权限请求的生命周期状态。
状态机(详见 design.md 第 8 节):
pending → approved → consumed pending → denied / expired / canceled
const ( PermissionPending PermissionStatus = "pending" // 等待人工确认 PermissionApproved PermissionStatus = "approved" // 已批准 PermissionDenied PermissionStatus = "denied" // 已拒绝 PermissionExpired PermissionStatus = "expired" // 已过期 PermissionCanceled PermissionStatus = "canceled" // 已取消(任务被取消等) PermissionConsumed PermissionStatus = "consumed" // 已消费:Agent 已恢复并继续执行 )
type Profile ¶
type Profile struct {
ID int64 `json:"id,string" gorm:"column:id;primaryKey;type:bigint;autoIncrement:false"`
// Name 仅作为展示名使用,不参与任何查询。
Name string `json:"name" gorm:"column:name;type:varchar(128)"`
Description string `json:"description" gorm:"column:description;type:text"`
IsDefault bool `json:"is_default" gorm:"column:is_default"`
IsBuiltin bool `json:"is_builtin" gorm:"column:is_builtin"`
SystemPrompt string `json:"system_prompt" gorm:"column:system_prompt;type:text"`
// Model 指定本 Profile 使用的模型名(对应 config.agent.providers 的 key)。
// 为空时回退到请求级 req.Model(若仍未指定则由 Provider 兜底)。
Model string `json:"model" gorm:"column:model;type:varchar(128)"`
// Provider 指定本 Profile 使用的 Agent(Provider)名称(mock | claude_code | codex | copilot | custom)。
// 为空时回退到请求级 req.Provider(若仍未指定则由 Client 的默认 Provider 兜底)。
Provider string `json:"provider" gorm:"column:provider;type:varchar(64)"`
Skills []string `json:"skills" gorm:"column:skills;serializer:json"`
Context ContextConfig `json:"context" gorm:"column:context;serializer:json"`
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"`
}
Profile 描述一类任务的 Agent 配置(系统提示词 + 技能 + 上下文注入开关)。
与 Options / Request(每次调用的动态参数)不同,Profile 是「按任务类型选择」的静态 配置快照:HTTP 层或前端在发起调用时通过 Request.ProfileID 指定 Profile,AgentService 在调用前按 ID 解析并应用(合并系统提示词、过滤技能、按开关注入背景)。
Name 仅用于展示;Profile 的查询 / 引用一律使用 ID。 Profile 不再按用户隔离:所有 Profile 全局可见。
func (*Profile) BeforeCreate ¶
BeforeCreate 在写入数据库前用雪花 ID 初始化主键(仅 ID 为 0 时)。
type Question ¶
type Question struct {
ID string `json:"id"` // 问题标识(答案按此 ID 回填)
Type string `json:"type"` // single_choice / multiple_choice / text
Title string `json:"title"` // 问题文本
Description string `json:"description,omitempty"` // 问题补充说明
Required bool `json:"required,omitempty"` // 是否必答
Options []QuestionOption `json:"options,omitempty"` // 选项(choice 类型)
AllowCustom bool `json:"allow_custom,omitempty"` // 是否允许自定义输入
Placeholder string `json:"placeholder,omitempty"` // 自定义 / 文本输入的占位提示
}
Question 是单个问题。
type QuestionAnswer ¶
type QuestionAnswer struct {
ID string `json:"id"`
Value string `json:"value,omitempty"`
Values []string `json:"values,omitempty"`
Custom string `json:"custom,omitempty"`
}
QuestionAnswer 是单个问题的答案。
- choice:单选填 Value,多选填 Values;
- text:填 Value(Text 为兼容别名,等价于 Value);
- 自定义输入:填 Custom。
type QuestionOption ¶
type QuestionOption struct {
Label string `json:"label"` // 展示文案
Value string `json:"value"` // 提交值
Description string `json:"description,omitempty"` // 选项说明
}
QuestionOption 是单个选项。
type QuestionRequest ¶
type QuestionRequest struct {
ID int64 `json:"id,string" gorm:"column:id;primaryKey;type:bigint;autoIncrement:false"`
TaskID int64 `json:"task_id,string" gorm:"column:task_id;type:bigint;index"`
SessionID string `json:"session_id,omitempty" gorm:"column:session_id;type:varchar(64)"`
// ToolCallID 是发起本次提问的工具调用 ID(ask_user)。
// 重启后据此把“已作答的提问”与待重放的 ask_user 调用精确配对,避免重复创建提问。
ToolCallID string `json:"tool_call_id,omitempty" gorm:"column:tool_call_id;type:varchar(128);index"`
RequestID string `json:"request_id,omitempty" gorm:"column:request_id;type:varchar(64)"`
Title string `json:"title,omitempty" gorm:"column:title;type:text"`
Description string `json:"description,omitempty" gorm:"column:description;type:text"`
Questions []Question `json:"questions" gorm:"serializer:json"`
Status QuestionStatus `json:"status" gorm:"column:status;type:varchar(32);index"`
Answer *AskUserAnswer `json:"answer,omitempty" gorm:"serializer:json"`
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"`
ResolvedAt *time.Time `json:"resolved_at,omitempty" gorm:"column:resolved_at"`
ResolvedBy *int64 `json:"resolved_by,string,omitempty" gorm:"column:resolved_by;type:bigint"`
}
QuestionRequest 记录一次用户提问及其作答结果,是提问域的持久化对象。
与 PermissionRequest 一样遵循“数据库才是状态源”原则:Agent 阻塞等待的只是内存 channel,真正的状态保存在 Repository 中,因此浏览器刷新 / 后端重启后仍可恢复。
func NewQuestionRequest ¶
func NewQuestionRequest(taskID int64, sessionID string, input AskUserInput) *QuestionRequest
NewQuestionRequest 构建一个 pending 状态的提问请求。
func (*QuestionRequest) BeforeCreate ¶
func (q *QuestionRequest) BeforeCreate(_ *gorm.DB) error
BeforeCreate 在写入数据库前用雪花 ID 初始化主键。
func (*QuestionRequest) TransitionTo ¶
func (q *QuestionRequest) TransitionTo(next QuestionStatus) bool
TransitionTo 校验并执行提问状态迁移;非法迁移返回 false 且不改变状态。
type QuestionStatus ¶
type QuestionStatus string
QuestionStatus 是用户提问(AskUser)的生命周期状态。
状态机与 PermissionStatus 同构:
pending → answered pending → canceled / expired
const ( QuestionPending QuestionStatus = "pending" // 等待用户作答 QuestionAnswered QuestionStatus = "answered" // 用户已作答 QuestionCanceled QuestionStatus = "canceled" // 已取消(任务被取消等) QuestionExpired QuestionStatus = "expired" // 已过期 )
type ReasoningBlock ¶
type ReasoningBlock struct {
ID string `json:"id"` // reasoningId
Content string `json:"content"` // 完整思考文本
}
ReasoningBlock 是一段完整的思考内容(对应 Provider 的完整 reasoning 事件)。
type Request ¶
type Request struct {
// Provider 可选:强制指定 Provider 名称;为空则使用 Client 的默认 Provider。
Provider string `json:"provider"`
// ModelID 可选:模型标识(对应 config.agent.providers 的 key),为空时由 Provider 自行决定。
ModelID string `json:"model_id"`
// ProfileID 可选:AgentProfile ID,AgentService 据此解析系统提示词、技能与上下文注入开关。
ProfileID int64 `json:"profile_id,omitempty,string"`
// Skills 可选:本次调用启用的技能名列表;为空表示使用默认全部技能。
Skills []string `json:"skills,omitempty"`
// RuntimeContext 是本轮调用的业务上下文(业务类型 / 模板变量)。
//
// 由 HTTP Handler 的 RuntimeContextResolver 解析 env(type,id) 产出,随请求一路传到
// 配置了工具的 Provider;Provider 在每次调用时把它注入工具执行上下文,供
// builtin 工具(如 run_analysis_node)在执行期读取 SystemPromptVars。
//
// 它只承载业务事实;「谁在执行」(任务 / 会话 / 用户 / 项目)由 Task 与 TaskFacts
// 承载,经 Runtime 注入工具 ctx(见 tool.WithTaskFacts)。它随 Request 一起被 JSON
// 序列化进 agent_tasks.request(gorm serializer:json),因此任务从 DB 恢复后依然可用。
RuntimeContext *runtimecontext.RuntimeContext `json:"runtime_context,omitempty"`
// SystemPrompt 是最终发送给 Provider 的系统提示词(仅运行时使用)。
//
// 它是派生值:AgentService 依据 Profile.SystemPrompt 模板 +
// RuntimeContext.SystemPromptVars 在 run 时渲染后写入(见 applyProfile),
// Provider 只读该字段。因此不随 Request 持久化(json:"-"):
// 任务恢复时会按 Profile 重新渲染,避免把过期快照写进 agent_tasks.request。
SystemPrompt string `json:"-"`
// Messages 对话上下文(不含 SystemPrompt)。
Messages []Message `json:"messages"`
// Env 可选:额外环境变量(也可携带 Provider 特有开关)。
Env map[string]string `json:"env"`
// MaxTokens 可选:最大输出 token 数,0 表示不限制。
MaxTokens int `json:"max_tokens"`
// Stream 可选:任务模式下是否使用流式调用;默认 false 使用 Invoke。
Stream bool `json:"stream"`
// Timeout 可选:单次调用超时,0 表示不限制。
Timeout time.Duration `json:"-"`
}
Request 描述一次 Agent 调用请求,与具体 Provider 无关。
type Result ¶
type Result struct {
// TaskID 本次调用对应的 Agent 任务 ID(agent_tasks 表),仅任务模式(RunTaskSync)下返回。
TaskID int64 `json:"task_id,string,omitempty"`
Content string `json:"content"`
Usage Usage `json:"usage"`
Raw json.RawMessage `json:"raw,omitempty"` // Provider 原始返回,便于调试与扩展
}
Result 是一次 Invoke / Stream 调用的最终聚合结果。
type ResumeMessage ¶
type ResumeMessage struct {
Role string `json:"role"`
Content string `json:"content,omitempty"`
ToolCalls []ResumeToolCall `json:"tool_calls,omitempty"`
ToolResults []ResumeToolResult `json:"tool_results,omitempty"`
}
ResumeMessage 是检查点里的一条对话消息。
Role 取值与 LLM Provider 对齐:user / assistant / tool。
type ResumeToolCall ¶
type ResumeToolCall struct {
ID string `json:"id"`
Name string `json:"name"`
Input string `json:"input,omitempty"` // JSON 参数
}
ResumeToolCall 是检查点里的工具调用(与 provider.ToolCall 一一对应)。
type ResumeToolResult ¶
type ResumeToolResult struct {
ToolCallID string `json:"tool_call_id"`
Content string `json:"content,omitempty"`
IsError bool `json:"is_error,omitempty"`
}
ResumeToolResult 是检查点里的工具执行结果(与 provider.ToolResult 一一对应)。
type ResumeTurn ¶
type ResumeTurn struct {
Assistant ResumeMessage `json:"assistant"`
Completed []ResumeToolResult `json:"completed,omitempty"`
}
ResumeTurn 是一次「模型已响应、工具尚未全部执行完」的中间态。
Assistant 保存模型这一轮的完整响应(文本 + 工具调用); Completed 保存已经执行完成的工具结果。二者结合即可精确算出「还有哪些调用需要执行」。
type Session ¶
type Session struct {
ID int64 `json:"id,string" gorm:"column:id;primaryKey;type:bigint;autoIncrement:false"`
// ProjectID 是会话所属项目(创建时取用户当前激活项目),会话列表按项目隔离。
ProjectID int64 `json:"project_id,string" gorm:"column:project_id;type:bigint;index"`
// ParentSessionID 指向父会话(如子任务会话 / 标题生成会话),0 表示顶层会话。
ParentSessionID int64 `json:"parent_session_id,string" gorm:"column:parent_session_id;type:bigint;index"`
Title string `json:"title" gorm:"column:title;type:varchar(255)"`
UserID int64 `json:"user_id,string" gorm:"column:user_id;type:bigint;index"`
Provider string `json:"provider" gorm:"column:provider;type:varchar(64)"`
Model string `json:"model" gorm:"column:model;type:varchar(128)"`
// CurrentTaskID 记录当前活跃轮次(running / waiting_permission)的任务 ID;
// 轮次正常结束时置空。failed 但仍有检查点(可续跑)的任务会保留该指针,
// 供前端刷新 / 切换会话时展示「Continue」并从 /agent/task/resume 恢复执行。
CurrentTaskID int64 `json:"current_task_id,string" gorm:"column:current_task_id;type:bigint"`
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"`
}
Session 是一次多轮对话的持久化对象。
它只包含会话自身的字段;历史消息保存在 agent_messages 表,由 message.Service 按 SessionID 查询,因此这里不再内嵌 Messages。
func (*Session) BeforeCreate ¶
BeforeCreate 在写入数据库前用雪花 ID 初始化主键。
type SessionChildParams ¶
type SessionChildParams struct {
// ProjectID 是会话所属项目;通常与父会话保持一致。
ProjectID int64
// ParentSessionID 是父会话 ID,必须 > 0。
ParentSessionID int64
Title string
UserID int64
Provider string
Model string
}
SessionChildParams 是创建子会话的入参(父会话必填,主键由雪花 ID 生成)。
type SessionCreateParams ¶
type SessionCreateParams struct {
// ID 可选:指定会话主键(如 CreateTaskSession 以 toolCallID 作为会话 ID);
// 为 0 时由 BeforeCreate 分配雪花 ID。
ID int64
// ProjectID 是会话所属项目;0 表示未归属项目。
ProjectID int64
ParentSessionID int64
Title string
UserID int64
Provider string
Model string
}
SessionCreateParams 是创建会话的入参。
type SessionListParams ¶
type SessionListParams struct {
UserID int64 // 0 表示全部用户
// ProjectID 限定只返回该项目的会话;0 表示不按项目过滤。
ProjectID int64
Offset int
Limit int
}
SessionListParams 是会话分页查询的入参。
type StreamEvent ¶
type StreamEvent struct {
Type StreamEventType `json:"type"`
Content string `json:"content,omitempty"` // 仅增量事件使用
Data any `json:"data,omitempty"` // 完整块的结构化数据(reasoning/message/tool_call/turn)
Err error `json:"-"` // 仅当 Type == StreamEventError 时有效
}
StreamEvent 是一次流式输出过程中的单个事件。
type StreamEventType ¶
type StreamEventType string
StreamEventType 枚举流式事件类型。
事件分为两类:
- 增量(delta):text / reasoning_delta,用于前端实时渲染,默认不落库(仅走 WS/SSE 广播);
- 完整块(block):turn_start / turn_end / reasoning / message / tool_call / tool_result, 是时间线的 source of truth,由 TimelineRecorder 投影到 agent_messages。
const ( // —— 增量(delta)—— StreamEventText StreamEventType = "text" // 文本增量 StreamEventReasoningDelta StreamEventType = "reasoning_delta" // 思维链/推理增量 // —— 完整块(block)—— StreamEventTurnStart StreamEventType = "turn_start" // 一轮开始(Data 为 TurnBlock) StreamEventTurnEnd StreamEventType = "turn_end" // 一轮结束(Data 为 TurnBlock) StreamEventReasoning StreamEventType = "reasoning" // 完整思考块(Data 为 ReasoningBlock) StreamEventMessage StreamEventType = "message" // 完整 assistant 消息(Data 为 MessageBlock) StreamEventToolCall StreamEventType = "tool_call" // 完整工具调用(Data 为 ToolCall) StreamEventToolResult StreamEventType = "tool_result" // 工具调用结果 StreamEventPermission StreamEventType = "permission" // 权限请求通知(真正状态见 PermissionRequest) StreamEventPermissionResult StreamEventType = "permission_result" // 权限决策结果通知 StreamEventDone StreamEventType = "done" // 正常结束 StreamEventError StreamEventType = "error" // 出错结束 )
type StreamHandler ¶
type StreamHandler func(ctx context.Context, event StreamEvent) error
StreamHandler 消费流式事件;返回非 nil 错误时中断流式调用。
type Task ¶
type Task struct {
ID int64 `json:"id,string" gorm:"column:id;primaryKey;type:bigint;autoIncrement:false"`
SessionID int64 `json:"session_id,string,omitempty" gorm:"column:session_id;type:bigint;index"`
// ProjectID 是任务所属项目(创建时由调用方提供),0 表示未知。
ProjectID int64 `json:"project_id,string,omitempty" gorm:"column:project_id;type:bigint;index"`
// UserID 是任务归属用户(0 表示后台任务 / 无登录用户)。
UserID int64 `json:"user_id,string,omitempty" gorm:"column:user_id;type:bigint;index"`
Provider string `json:"provider" gorm:"column:provider;type:varchar(64)"`
Model string `json:"model,omitempty" gorm:"column:model;type:varchar(128)"`
Status TaskStatus `json:"status" gorm:"column:status;type:varchar(32);index"`
WorkingDir string `json:"working_dir,omitempty" gorm:"column:working_dir;type:text"`
// Request 保存原始请求,用于恢复时重建上下文。
Request Request `json:"request,omitempty" gorm:"serializer:json"`
// ResumeState 是可恢复执行检查点(Agent 循环的对话历史 / 待执行工具调用)。
// 为空表示该任务不可续跑(例如 Provider 未实现检查点,或任务从未开始执行)。
// 该列只由 TaskRepository.UpdateResumeState 维护,普通 Update 会显式 Omit,
// 避免内存中的旧 Task 快照在状态迁移时把检查点覆盖成 NULL。
ResumeState *TaskResumeState `json:"-" gorm:"column:resume_state;type:longtext;serializer:json"`
// Resumable 是非持久化派生字段:只要存在检查点就可以被手动 / 自动恢复。
Resumable bool `json:"resumable" gorm:"-"`
// Error 保存最近一次错误信息(Status == failed 时有效)。
Error string `json:"error,omitempty" gorm:"column:error;type:text"`
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"`
StartedAt *time.Time `json:"started_at,omitempty" gorm:"column:started_at"`
FinishedAt *time.Time `json:"finished_at,omitempty" gorm:"column:finished_at"`
}
Task 是一次 Agent 调用的持久化对象。
它与 PermissionRequest 形成两级状态机:Task 记录“整体执行到哪一步”, PermissionRequest 记录“某个具体操作是否被允许”。后端重启后,可根据 Task.Status 与 pending 的 PermissionRequest 重建运行态(见 Recovery)。
func NewTask ¶
NewTask 基于请求与执行事实构建一个 created 状态的任务。
执行事实(用户 / 会话 / 项目)由调用方显式提供:它们是任务的生命周期属性, 不再散落在 Request / RuntimeContext 里。
func (*Task) BeforeCreate ¶
BeforeCreate 在写入数据库前用雪花 ID 初始化主键。
func (*Task) MarkResumed ¶
MarkResumed 把任务从「中断态」重新置为 running。
只允许 failed / waiting_permission / running(无活跃 goroutine 的挂起态)续跑; completed / canceled / created 不允许通过该入口恢复(created 走 StartTask)。 与 TransitionTo 分开是为了保持常规状态机的严格性:failed → running 只允许 在“存在持久化检查点且人工 / 权限审批触发恢复”这一条路径上发生。
func (*Task) TransitionTo ¶
func (t *Task) TransitionTo(next TaskStatus) bool
TransitionTo 校验并执行任务状态迁移;非法迁移返回 false 且不改变状态。
type TaskFacts ¶
type TaskFacts struct {
TaskID int64
SessionID int64
ProjectID int64
UserID int64
WorkingDir string
}
TaskFacts 是一次 Agent 执行所需的只读任务事实快照。
与 *Task 不同,它不含 Status / ResumeState / 时间戳等可变状态: 因此可以安全地被 Runtime 持有并跨 goroutine 读取,也不会让 Agent 层依赖持久化实体。 「谁在执行」这类事实(任务 / 会话 / 项目 / 用户)与工作目录统一从这里读取。
type TaskFinishedHandler ¶
TaskFinishedHandler 是任务进入终态(completed / failed / canceled)后的回调。
供上层编排层(如 ChatService)把「轮次收尾」绑定到任务状态机,而不是依赖 Provider 是否补发了 done / error 流事件:Provider 少发一个事件不应导致会话锁泄漏。
回调在 transitionTask 写完库、广播终态事件之前同步执行,实现方应自行保证幂等 (同一任务可能因重试 / 重复收尾被多次调用)。
type TaskResumeState ¶
type TaskResumeState struct {
Version int `json:"version"`
Provider string `json:"provider,omitempty"`
Model string `json:"model,omitempty"`
History []ResumeMessage `json:"history,omitempty"`
// Pending 非空表示上一轮模型响应已落库、但工具调用尚未全部完成。
Pending *ResumeTurn `json:"pending,omitempty"`
// UpdatedAt 便于排查恢复时的检查点新旧。
UpdatedAt time.Time `json:"updated_at"`
}
TaskResumeState 是任务的可恢复执行检查点,持久化在 agent_tasks.resume_state。
func (*TaskResumeState) CompleteTurn ¶
func (s *TaskResumeState) CompleteTurn()
CompleteTurn 把当前 Pending 轮次归档进 History,表示这一轮工具往返已经全部完成。
func (*TaskResumeState) CompletedResult ¶
func (s *TaskResumeState) CompletedResult(callID string) (ResumeToolResult, bool)
CompletedResult 查询某个工具调用是否已有执行结果。
func (*TaskResumeState) MarkToolResult ¶
func (s *TaskResumeState) MarkToolResult(result ResumeToolResult)
MarkToolResult 记录一次工具执行结果(按 tool_call_id 去重)。
type TaskStatus ¶
type TaskStatus string
TaskStatus 是 Agent 任务的生命周期状态。
状态机(详见 design.md 第 7 节):
created → running → completed
↘ failed / canceled
running → waiting_permission → running
const ( TaskCreated TaskStatus = "created" // 已创建,尚未开始 TaskRunning TaskStatus = "running" // 正在执行 TaskWaitingPermission TaskStatus = "waiting_permission" // 等待权限确认 TaskCompleted TaskStatus = "completed" // 已完成 TaskFailed TaskStatus = "failed" // 失败 TaskCanceled TaskStatus = "canceled" // 已取消 )
type ToolCall ¶
type ToolCall struct {
ID string `json:"id"` // toolCallId
Name string `json:"name"` // 工具名
Arguments any `json:"arguments,omitempty"`
}
ToolCall 是一次完整的工具调用(对应 AssistantMessageToolRequest)。
type Usage ¶
type Usage struct {
InputTokens int64 `json:"input_tokens"`
OutputTokens int64 `json:"output_tokens"`
}
Usage 统计 token 用量。
type UserAgentConfig ¶
type UserAgentConfig = coretypes.UserAgentConfig
UserAgentConfig 是存储在用户记录中的 Agent 配置快照。
func DefaultUserAgentConfig ¶
func DefaultUserAgentConfig() UserAgentConfig
DefaultUserAgentConfig 返回默认用户配置(选中内置默认 Profile、权限全部走默认策略)。