types

package
v0.2.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 12, 2026 License: MIT Imports: 10 Imported by: 0

Documentation

Overview

Package types 定义 Agent 领域的数据库实体与值对象。

本包只包含可序列化的领域数据(Task / Session / Message / PermissionRequest / QuestionRequest / Profile / Memory 等)以及请求 / 结果 / 事件等值对象,不包含 任何持久化或编排实现。Repository 与 Service 接口见 types/interface, 实现在 application/repository 与 application/service。

Index

Constants

View Source
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 时在此登记一个唯一名称。

View Source
const (
	RoleSystem    = "system"
	RoleUser      = "user"
	RoleAssistant = "assistant"
	RoleTool      = "tool"
)

消息角色。

View Source
const (
	KindUser           = "user"
	KindAssistant      = "assistant"
	KindAssistantFinal = "assistant_final"
	KindReasoning      = "reasoning"
	KindToolCall       = "tool_call"
	KindToolResult     = "tool_result"
	// KindError 是一条可回放的错误消息(任务执行失败时由 ChatService 写入),
	// 前端据此用错误样式稳定展示,而不是只依赖临时流式事件。
	KindError = "error"
)

消息类型(会话层可回放的消息种类)。

View Source
const (
	MessageKindUser           = KindUser
	MessageKindAssistant      = KindAssistant
	MessageKindAssistantFinal = KindAssistantFinal
	MessageKindReasoning      = KindReasoning
	MessageKindToolCall       = KindToolCall
	MessageKindToolResult     = KindToolResult
)

MessageKind 常量是 Kind* 的兼容别名(旧 agent 包对外的命名)。

View Source
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 中的定义)。

View Source
const (
	DecisionAllow = coretypes.DecisionAllow // 允许执行
	DecisionDeny  = coretypes.DecisionDeny  // 拒绝执行
	DecisionAsk   = coretypes.DecisionAsk   // 需要人工确认
)

PermissionDecision 取值(别名指向 internal/types 中的定义)。

View Source
const (
	BuiltinDefaultProfileID int64 = -1 // 内置默认 Profile
	BuiltinAnalysisCoderID  int64 = -2 // 内置「分析代码编写」Profile
	BuiltinArticleWriterID  int64 = -3 // 内置「科研文章撰写」Profile
	BuiltinSummaryProfileID int64 = -4 // 内置「摘要总结」Profile
)

内置 Profile 使用固定的负数 ID,避免与雪花算法生成的正整数主键冲突。 Profile 的查询 / 引用一律使用 ID;Name 仅用于展示。

View Source
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 模板。

View Source
const (
	QuestionTypeSingleChoice   = "single_choice"
	QuestionTypeMultipleChoice = "multiple_choice"
	QuestionTypeText           = "text"
)

问题类型常量。

View Source
const AskUserToolName = "ask_user"

AskUserToolName 是 ask_user 工具名(模型据此发起调用)。

View Source
const BuiltinDefaultProfileName = "通用助手"

BuiltinDefaultProfileName 是内置默认 Profile 的展示名。用于无需查询数据库即可获得 展示名的场景(如 DefaultUserAgentConfig)。

View Source
const DefaultMemoryRetrieveLimit = 5

DefaultMemoryRetrieveLimit 是单次注入检索记忆的默认条数上限。

View Source
const DefaultProvider = ProviderMock

DefaultProvider 是未配置时的兜底 Provider。

View Source
const InitialVersion = "initial"

InitialVersion 是文件第一次被记录时使用的版本号。

View Source
const OperationMetadataToolCallID = "tool_call_id"

OperationMetadataToolCallID 是 Operation.Metadata 中记录工具调用 ID 的键。

View Source
const ResumeStateVersion = 1

ResumeStateVersion 是检查点结构版本。结构不兼容变更时递增,旧检查点会被忽略。

View Source
const TitleSessionTitle = "Generate a title"

TitleSessionTitle 是标题生成子会话的固定标题(与 opencode 保持一致)。

Variables

View Source
var (
	// ErrHistoryNotFound 表示历史记录不存在。
	ErrHistoryNotFound = errors.New("history: file not found")
	// ErrDuplicateVersion 表示 (session_id, path, version) 发生唯一键冲突,
	// 调用方可据此重新推导版本号后重试。
	ErrDuplicateVersion = errors.New("history: duplicate version")
)

文件历史相关错误。

View Source
var (
	// ErrMemoryNotFound 表示记忆不存在。
	ErrMemoryNotFound = errors.New("agent: memory not found")
	// ErrMemoryNotConfigured 表示 AgentService 未配置记忆管理器。
	ErrMemoryNotConfigured = errors.New("agent: memory manager not configured")
)

记忆相关错误。

View Source
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")
)

权限相关错误。

View Source
var (
	// ErrProfileNotFound 表示 Profile 不存在。
	ErrProfileNotFound = errors.New("agent: profile not found")
	// ErrProfileNameRequired 表示 Profile 名称缺失。
	ErrProfileNameRequired = errors.New("agent: profile name is required")
)

Profile 相关错误。

View Source
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")
)

提问相关错误。

View Source
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")
)

任务相关错误。

View Source
var ErrInvalidParentSession = errors.New("session: parent session id is required")

ErrInvalidParentSession 表示创建子会话时父会话 ID 无效。

View Source
var ErrMessageNotFound = errors.New("message: not found")

ErrMessageNotFound 表示消息不存在。

View Source
var ErrNotImplemented = errors.New("agent: provider not implemented yet")

ErrNotImplemented 表示某个 Provider 尚未实现真实调用。

View Source
var ErrSessionNotFound = errors.New("session: not found")

ErrSessionNotFound 表示会话不存在。

Functions

func BuildMemoryContext

func BuildMemoryContext(memories []*Memory) string

BuildMemoryContext 把检索到的记忆格式化为注入上下文的文本块。

用于 AgentService 在调用前把相关记忆注入 SystemPrompt,让 Agent「记得」相关背景。 无记忆时返回空字符串。

func IsBlockEvent

func IsBlockEvent(t StreamEventType) bool

IsBlockEvent 判断事件类型是否应被持久化(作为时间线数据源)。

只有纯增量事件(text / reasoning_delta)是“临时”的:它们用于前端实时渲染, 默认只广播不落库;其余事件(完整块 + done/error/permission 等生命周期信号)都会落库。

func IsBuiltinProfileID

func IsBuiltinProfileID(id int64) bool

IsBuiltinProfileID 判断给定 ID 是否为内置 Profile。 内置 Profile 使用固定的负数 ID,用户自定义 Profile 使用雪花算法生成的正整数 ID。

func ToolCallIDFromContext

func ToolCallIDFromContext(ctx context.Context) string

ToolCallIDFromContext 读取当前工具调用 ID;不存在时返回空串。

func WithToolCallID

func WithToolCallID(ctx context.Context, id string) context.Context

WithToolCallID 把工具调用 ID 注入 ctx;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

func (f *File) BeforeCreate(_ *gorm.DB) error

BeforeCreate 在写入数据库前用雪花 ID 初始化主键。

func (File) TableName

func (File) TableName() string

TableName 返回文件历史表的表名。

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

func (m *Memory) BeforeCreate(_ *gorm.DB) error

BeforeCreate 在写入数据库前用雪花 ID 初始化主键。

func (Memory) TableName

func (Memory) TableName() string

TableName 返回记忆表的表名。

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

func (m *Message) BeforeCreate(_ *gorm.DB) error

BeforeCreate 在写入数据库前用雪花 ID 初始化主键。

func (Message) TableName

func (Message) TableName() string

TableName 返回消息表的表名。

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 OperationType

type OperationType = coretypes.OperationType

OperationType 描述 Agent 想要执行的操作类别。

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

func (p *Profile) BeforeCreate(_ *gorm.DB) error

BeforeCreate 在写入数据库前用雪花 ID 初始化主键(仅 ID 为 0 时)。

func (Profile) TableName

func (Profile) TableName() string

TableName 返回 Profile 表的表名。

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) TableName

func (QuestionRequest) TableName() string

TableName 返回提问请求表的表名。

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

func (s *Session) BeforeCreate(_ *gorm.DB) error

BeforeCreate 在写入数据库前用雪花 ID 初始化主键。

func (Session) TableName

func (Session) TableName() string

TableName 返回会话表的表名。

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

func NewTask(req Request, facts TaskFacts) *Task

NewTask 基于请求与执行事实构建一个 created 状态的任务。

执行事实(用户 / 会话 / 项目)由调用方显式提供:它们是任务的生命周期属性, 不再散落在 Request / RuntimeContext 里。

func (*Task) AfterFind

func (t *Task) AfterFind(*gorm.DB) error

AfterFind 在从数据库加载任务后派生 Resumable 字段,前端无需感知检查点细节。

func (*Task) BeforeCreate

func (t *Task) BeforeCreate(_ *gorm.DB) error

BeforeCreate 在写入数据库前用雪花 ID 初始化主键。

func (*Task) Facts

func (t *Task) Facts() TaskFacts

Facts 返回任务的只读事实快照;nil 任务返回零值。

func (*Task) MarkResumed

func (t *Task) MarkResumed() bool

MarkResumed 把任务从「中断态」重新置为 running。

只允许 failed / waiting_permission / running(无活跃 goroutine 的挂起态)续跑; completed / canceled / created 不允许通过该入口恢复(created 走 StartTask)。 与 TransitionTo 分开是为了保持常规状态机的严格性:failed → running 只允许 在“存在持久化检查点且人工 / 权限审批触发恢复”这一条路径上发生。

func (Task) TableName

func (Task) TableName() string

TableName 返回任务表的表名。

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

type TaskFinishedHandler func(ctx context.Context, task *Task)

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 TurnBlock

type TurnBlock struct {
	TurnID string `json:"turn_id"`
	Model  string `json:"model,omitempty"`
}

TurnBlock 描述一轮(turn)的边界(对应 turn_start / turn_end 事件)。

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、权限全部走默认策略)。

Directories

Path Synopsis
Package interfaces 定义 Agent 领域的 Repository / Service 端口。
Package interfaces 定义 Agent 领域的 Repository / Service 端口。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL