Documentation
¶
Index ¶
- Constants
- func DefaultAgents() map[string]*Info
- func DelegateReturnModeOrDefault(mode string) string
- func IsMailboxFullError(err error) bool
- func WithParentMemory(ctx context.Context, p *ParentMemoryContext) context.Context
- type AgentConfig
- type AgentPath
- type CompletionNotifier
- type Config
- type DelegateResult
- type Factory
- type FileAttachment
- type Info
- type Mailbox
- func (mb *Mailbox) Drain(taskID string) *DelegateResult
- func (mb *Mailbox) DrainAll() []*DelegateResult
- func (mb *Mailbox) Drop()
- func (mb *Mailbox) Len() int
- func (mb *Mailbox) Peek(taskID string) *DelegateResult
- func (mb *Mailbox) Put(taskID string, r *DelegateResult) error
- func (mb *Mailbox) SubscribeAll(done func()) string
- func (mb *Mailbox) SubscribeOnce(taskID string, done func()) string
- func (mb *Mailbox) Unsubscribe(taskID, id string)
- func (mb *Mailbox) UnsubscribeAll(id string)
- type MailboxEntry
- type Manager
- type Mode
- type ModelInfo
- type ParentMemoryContext
- type Request
- type Result
- type SpawnAgentTool
- func (t *SpawnAgentTool) Description() string
- func (t *SpawnAgentTool) Execute(ctx context.Context, input map[string]interface{}) (interface{}, error)
- func (t *SpawnAgentTool) Metadata() types.ToolMetadata
- func (t *SpawnAgentTool) Name() string
- func (t *SpawnAgentTool) Schema() map[string]interface{}
- type SpawnHandle
- type SpawnOptions
- type Subagent
- type SubagentConfig
- type SubagentManager
- func (sm *SubagentManager) Close()
- func (sm *SubagentManager) CloseSession(sessionID string)
- func (sm *SubagentManager) Execute(ctx context.Context, agentName, input string) (*Result, error)
- func (sm *SubagentManager) ExecuteWithSession(ctx context.Context, sessionID, agentName, input string) (*Result, error)
- func (sm *SubagentManager) SetMaxConcurrentSpawns(n int)
- func (sm *SubagentManager) SetNotifier(n *CompletionNotifier)
- func (sm *SubagentManager) SetSessionTracer(sessionID string, t hooks.Tracer)
- func (sm *SubagentManager) Spawn(ctx context.Context, parentSessionID string, req *Request, parent AgentPath, ...) (*SpawnHandle, error)
- type SubagentManagerFactory
- type SubagentTool
- func (t *SubagentTool) Description() string
- func (t *SubagentTool) Execute(ctx context.Context, input map[string]interface{}) (interface{}, error)
- func (t *SubagentTool) Metadata() types.ToolMetadata
- func (t *SubagentTool) Name() string
- func (t *SubagentTool) Schema() map[string]interface{}
- func (t *SubagentTool) WithSessionID(sessionID string) *SubagentTool
- type WaitAgentTool
Constants ¶
const ( // DefaultMaxConcurrentSpawns spawn 并发 semaphore 默认上限(对齐 codex)。 DefaultMaxConcurrentSpawns = 4 // DefaultSpawnTimeout spawn watchdog 默认超时。 DefaultSpawnTimeout = 3 * time.Minute )
spawn 默认值常量(S3,subagent-s3s4 §3.2)。
const ( // DelegateReturnModeEnvelope 返回 *DelegateResult 信封(S1 起的默认行为)。 DelegateReturnModeEnvelope = "envelope" // DelegateReturnModeString 返回裸字符串 result.Output(S1 之前的兼容行为)。 DelegateReturnModeString = "string" )
DelegateReturnMode 合法值(设计 §14 遗留点 1,P2.2)。
const ( DelegateStatusCompleted = "completed" DelegateStatusError = "error" DelegateStatusTimeout = "timeout" DelegateStatusCancelled = "cancelled" )
信封状态常量。
const DefaultDelegateTruncatedRunes = 2000
信封截断上限默认值(≈1000 tokens,对齐 codex COMPLETION_MESSAGE_MAX_TOKENS=1000)。
const DefaultMailboxCap = 64
DefaultMailboxCap mailbox 容量默认值(对齐 codex 会话线程上限量级)。
const DefaultWaitAgentTimeout = 30 * time.Second
DefaultWaitAgentTimeout wait_agent 默认阻塞等待上限。 评审 BLOCKER-3:默认 engine ToolExecutionTimeout=60s。wait 内部有效上限必须 < engine 工具超时,否则 engine 的 ctx 先 cancel,父代理拿到 tool error 而非 {timed_out:true}。 这里默认 30s < 60s;factory 注册时另配 ToolTimeouts["wait_agent"] 抬高 engine 外壳 (见 subagent-s3s4 评审 §3 BLOCKER-3 修法)。
const SubagentSystemGuidelines = `` /* 576-byte string literal not displayed */
const WaitAgentToolShellTimeout = 200 * time.Second
WaitAgentToolShellTimeout factory 为 wait_agent 配的 engine 工具外壳超时。 必须 > DefaultWaitAgentTimeout(30s),保证 wait 内部先超时返回 {timed_out:true} 信封,engine 的 select 收到 result 通道而非 EC_TOOL_EXECUTION_TIMEOUT。
Variables ¶
This section is empty.
Functions ¶
func DefaultAgents ¶
func DelegateReturnModeOrDefault ¶ added in v1.10.0
DelegateReturnModeOrDefault 解析 DelegateReturnMode 配置,空串/非法值回退 envelope (防御:旧配置没有该字段,或手写 YAML 拼错时保持 S1 行为不炸)。
func IsMailboxFullError ¶ added in v1.10.0
IsMailboxFullError 供 notifier 判断降级路径。
func WithParentMemory ¶ added in v1.8.11
func WithParentMemory(ctx context.Context, p *ParentMemoryContext) context.Context
Types ¶
type AgentConfig ¶
type AgentConfig struct {
Name string `json:"name,omitempty"`
Description string `json:"description,omitempty"`
Mode Mode `json:"mode,omitempty"`
Native bool `json:"native,omitempty"`
Hidden bool `json:"hidden,omitempty"`
TopP *float64 `json:"top_p,omitempty"`
Temperature *float64 `json:"temperature,omitempty"`
Color string `json:"color,omitempty"`
Model string `json:"model,omitempty"`
Variant string `json:"variant,omitempty"`
Prompt string `json:"prompt,omitempty"`
Options map[string]interface{} `json:"options,omitempty"`
Steps *int `json:"steps,omitempty"`
Permission map[string]interface{} `json:"permission,omitempty"`
Disable bool `json:"disable,omitempty"`
}
type AgentPath ¶ added in v1.10.0
type AgentPath string
AgentPath 子代理在委派树中的路径(docs/design/subagent.md §3.3 铺路)。 本轮只做一层:"/root"(根)| "/root/<agent>"(子代理)。多级路径留给 roadmap list_agents / depth limit。
func (AgentPath) Join ¶ added in v1.10.0
Join 追加一个子代理名形成子路径("/root" + "general" -> "/root/general")。
type CompletionNotifier ¶ added in v1.10.0
type CompletionNotifier struct {
// contains filtered or unexported fields
}
CompletionNotifier 子代理完成 → 回发父代理(S3,subagent-s3s4 §6)。
评审 BLOCKER-1 修正:`dino/agent` **不 import 根 `dino` 包**(根包 import 本包), 因此不持 `*dino.Bus`。改为:
- getMailbox:按父 session 取 mailbox(mailbox.Put = 模型可见投递);
- publish:factory 注入的 `func(eventType, sessionID string, data interface{})` 回调(signature 与 `dino.Bus.Publish` 完全一致,factory 用闭包接上即可)。
职责:Spawn 后台 goroutine 完成后调用 Notify,干两件事(均不得阻塞):
- mailbox.Put(wait_agent / S4 唤醒消费);cap 满降级为只发事件(§12 风险 3)。
- 旁路事件 "subagent.completed"(UI/审计;publish 为 nil 或 NotifyCompletion=false 跳过)。
func NewCompletionNotifier ¶ added in v1.10.0
func NewCompletionNotifier(getMailbox func(string) *Mailbox, publish func(eventType string, sessionID string, data interface{}), enabled bool) *CompletionNotifier
NewCompletionNotifier 构造 notifier。publish 为 nil 或 !enabled 时不发事件 (OPTIONAL-1:NotifyCompletion=false → notifier 直接跳过,不 Put 不发事件)。
func (*CompletionNotifier) Notify ¶ added in v1.10.0
func (n *CompletionNotifier) Notify(parentSessionID, taskID string, env *DelegateResult)
Notify 在子代理 goroutine 内调用(不得阻塞)。 mailbox.Put 失败仅降级为事件 + 日志;事件载荷是完整 *DelegateResult(不进 LLM 上下文)。
type Config ¶
type Config struct {
Agents map[string]*AgentConfig `json:"agents,omitempty"`
}
type DelegateResult ¶ added in v1.10.0
type DelegateResult struct {
// Agent 子代理名(如 "general")。
Agent string `json:"agent"`
// TaskID 每次委派生成的 run id(uuid)。B 阶段可复用 task_id 挂接既有 run。
TaskID string `json:"task_id"`
// Status 终态:"completed" | "error" | "timeout" | "cancelled"。
Status string `json:"status"`
// Output 子代理最终文本输出(裸字符串语义保留,向后兼容)。
Output string `json:"output,omitempty"`
// FilesChanged 子代理报告改动/涉猎的文件路径(程序化 tool_event 采集 + prompt 引导)。
FilesChanged []string `json:"files_changed,omitempty"`
// Error 失败时的错误摘要(截断)。
Error string `json:"error,omitempty"`
// DurationMS 墙钟耗时 ms(含队列等待)。
DurationMS int64 `json:"duration_ms"`
// Iterations 实际迭代数。
Iterations int `json:"iterations"`
// Usage 子代理本次 token 用量。
Usage types.Usage `json:"usage"`
// TimestampMS 完成时刻 unix 毫秒。
TimestampMS int64 `json:"timestamp_ms"`
// AgentPath 子代理在委派树中的路径(/root/<agent>,S3 铺路,subagent-s3s4 §9)。
AgentPath string `json:"agent_path,omitempty"`
// ParentPath 父代理路径(委派发起方,S3 铺路)。
ParentPath string `json:"parent_path,omitempty"`
}
子代理结构化结果信封(设计 docs/design/subagent.md §3.1,方案 A)。
DelegateResult 是 delegate_to_agent 的返回信封,同时是完成通知推送给父代理的载荷。 兼容策略:Output 保留子代理最终文本输出(即旧 Result.Output 语义),父代理现有消费方 不破坏;工具返回值经 FormatToolResult 自动 JSON 序列化注入观察。
字段类型统一(评审 R2):时间一律 unix 毫秒 int64,避免 time.Time 与 int64 混排 增加模型解析负担;可选字段用 omitempty,零值不出现在 JSON 里。
func DelegateResultFromResult ¶ added in v1.10.0
func DelegateResultFromResult(agentName string, result *Result, err error) *DelegateResult
DelegateResultFromResult 把子代理执行结果折叠进信封(成功路径)。err 非 nil 时返回 Status=="error" 的错误态信封(评审 R1:错误路径折叠,让错误态在 A 阶段对模型可见)。
func NewErrorDelegateResult ¶ added in v1.10.0
func NewErrorDelegateResult(agentName string, err error) *DelegateResult
NewErrorDelegateResult 构造纯错误态信封(无 Result,如 manager 取子代理失败)。
func (*DelegateResult) Truncated ¶ added in v1.10.0
func (r *DelegateResult) Truncated(maxRunes int) string
Truncated 返回给父代理 LLM 的紧凑文本视图(对齐 codex session_prefix.rs 完成消息格式)。 maxRunes<=0 时用 DefaultDelegateTruncatedRunes(2000 runes ≈ 1000 tokens)。 错误态附回退文案(复用 codex 原文,符合其回退意图)。
type FileAttachment ¶
type Info ¶
type Info struct {
Name string `json:"name"`
Description string `json:"description,omitempty"`
Mode Mode `json:"mode"`
Native bool `json:"native,omitempty"`
Hidden bool `json:"hidden,omitempty"`
TopP *float64 `json:"top_p,omitempty"`
Temperature *float64 `json:"temperature,omitempty"`
Color string `json:"color,omitempty"`
Permission permission.Ruleset `json:"permission"`
Model *ModelInfo `json:"model,omitempty"`
Variant string `json:"variant,omitempty"`
Prompt string `json:"prompt,omitempty"`
Options map[string]interface{} `json:"options,omitempty"`
Steps *int `json:"steps,omitempty"`
}
type Mailbox ¶ added in v1.10.0
type Mailbox struct {
// contains filtered or unexported fields
}
Mailbox 承载"子代理 → 父代理"的完成通知(模型可见投递,非 eventbus 旁路)。 设计 docs/design/subagent-s3s4.md §4。评审修正:
- 独立可注入组件,每 session 一个实例,不挂 SubagentManager(评审 R5)。
- 键 = task_id,wait_agent 用 task_id 精确取回;session 隔离靠实例隔离 + Drop 兜底。
- 一把锁串起 Put/Peek/Drain/SubscribeOnce,杜绝 "Put 与订阅" 竞态窗口(评审 §5.3)。
消费仲裁(评审 BLOCKER 2):wait_agent 是 Drain(taskID) 的**唯一**消费者(turn 内阻塞 订阅);SubscribeAll(B2 唤醒适配器)只做"有消息"通知、不取走消息,由 session 端在 onSubagentCompletion 里 DrainAll。这样两个消费方永不竞争同一条目。
func NewMailbox ¶ added in v1.10.0
NewMailbox 构造 mailbox。cap<=0 用 DefaultMailboxCap;ttl<=0 表示不启用过期。
func (*Mailbox) Drain ¶ added in v1.10.0
func (mb *Mailbox) Drain(taskID string) *DelegateResult
Drain 读取并删除(wait_agent 唯一消费入口)。
func (*Mailbox) DrainAll ¶ added in v1.10.0
func (mb *Mailbox) DrainAll() []*DelegateResult
DrainAll 取走全部未读(B2 session 端在 onSubagentCompletion 用)。 返回按到达序(seq 序)排序的结果。不触发订阅者(消费方已在通知回调外)。
func (*Mailbox) Peek ¶ added in v1.10.0
func (mb *Mailbox) Peek(taskID string) *DelegateResult
Peek 只读,不删除。wait_agent 首次快速检查用。
func (*Mailbox) Put ¶ added in v1.10.0
func (mb *Mailbox) Put(taskID string, r *DelegateResult) error
Put 存入一条完成记录。cap 满时返回 error(notifier 降级为只发事件)。 同一 taskID 重复 Put 视为更新(覆盖旧记录),不触发 cap 增长。 触发该 taskID 的 wait_agent 订阅者与全局订阅者;所有回调在锁内同步触发, 回调实现必须非阻塞(select+drop 或只做信号),否则会阻塞 Put 调用方。
func (*Mailbox) SubscribeAll ¶ added in v1.10.0
SubscribeAll 注册全局订阅(B2 唤醒适配器用):任意 Put 都触发。 回调只做"有消息"通知(如 select+default 往 channel 写),不取走消息。 返回订阅 id(供 UnsubscribeAll)。
func (*Mailbox) SubscribeOnce ¶ added in v1.10.0
SubscribeOnce 注册一次性的 per-task 订阅(wait_agent 阻塞用)。 若消息已存在则立即触发 done 并不注册(消除 "Drain 与订阅之间 Put 到达" 竞态)。 返回订阅 id(供 Unsubscribe);消息已存在时返回 ""。 done 回调在 Put 锁内同步触发,必须非阻塞。
func (*Mailbox) Unsubscribe ¶ added in v1.10.0
Unsubscribe 反注册 per-task 订阅(wait_agent 结束/超时时清理)。
func (*Mailbox) UnsubscribeAll ¶ added in v1.10.0
UnsubscribeAll 反注册全局订阅。
type MailboxEntry ¶ added in v1.10.0
type MailboxEntry struct {
Result *DelegateResult
CreatedAtMS int64
ExpireAtMS int64 // 0 = 不失效
// contains filtered or unexported fields
}
MailboxEntry 单条完成记录(含元数据,供 Drop/TTL 诊断)。
type Manager ¶
type Manager struct {
// contains filtered or unexported fields
}
func NewManager ¶
func (*Manager) CloseAgent ¶
func (*Manager) SetParentRuleset ¶ added in v1.10.0
func (m *Manager) SetParentRuleset(rs permission.Ruleset)
SetParentRuleset 注入父代理权限约束(restrict-only,P2.4)。 之后 GetSubagent 构造的子代理工具按「子权限 ∩ 父权限」过滤。
type ParentMemoryContext ¶ added in v1.8.11
type ParentMemoryContext struct {
SessionID string
Memory types.MemoryProvider
}
func ParentMemoryFromContext ¶ added in v1.8.11
func ParentMemoryFromContext(ctx context.Context) *ParentMemoryContext
type Request ¶
type Request struct {
AgentName string
Prompt string
Input string
Files []FileAttachment
}
type Result ¶
type Result struct {
Output string
Error error
Usage types.Usage
// —— 结构化字段(设计 docs/design/subagent.md §6.1,方案 A)——
// Status 终态:"completed" | "error" | "timeout" | "cancelled"。
Status string
// Duration 墙钟耗时(含队列等待)。
Duration time.Duration
// Iterations 实际迭代数。
Iterations int
// FilesChanged 子代理涉猎/改动的文件路径(tool_event 采集 + prompt 引导)。
FilesChanged []string
}
type SpawnAgentTool ¶ added in v1.10.0
type SpawnAgentTool struct {
// contains filtered or unexported fields
}
SpawnAgentTool fire-and-forget 派生子代理(subagent-s3s4 §3.2)。
func NewSpawnAgentTool ¶ added in v1.10.0
func NewSpawnAgentTool(manager *SubagentManager, mailbox func() *Mailbox, path func() AgentPath, sessionID func() string) *SpawnAgentTool
NewSpawnAgentTool 构造 spawn 工具。mailbox 当前 session 的 mailbox(可为 nil,纯 S3 惰性模式)。
func (*SpawnAgentTool) Description ¶ added in v1.10.0
func (t *SpawnAgentTool) Description() string
func (*SpawnAgentTool) Execute ¶ added in v1.10.0
func (t *SpawnAgentTool) Execute(ctx context.Context, input map[string]interface{}) (interface{}, error)
Execute 派生并立即返回 {task_id}。max_concurrent_spawns 反映 semaphore 容量。
func (*SpawnAgentTool) Metadata ¶ added in v1.10.0
func (t *SpawnAgentTool) Metadata() types.ToolMetadata
func (*SpawnAgentTool) Name ¶ added in v1.10.0
func (t *SpawnAgentTool) Name() string
func (*SpawnAgentTool) Schema ¶ added in v1.10.0
func (t *SpawnAgentTool) Schema() map[string]interface{}
type SpawnHandle ¶ added in v1.10.0
SpawnHandle 由 Spawn 立刻返回,后台 goroutine 异步执行。 Done 在完成且已回发(notifier.Notify 返回)后关闭。
type SpawnOptions ¶ added in v1.10.0
type SpawnOptions struct {
TimeoutMS int64 // 覆盖 watchdog(默认 SpawnTimeout / 3min)
Model string // 模型覆盖,"" = 继承(S3 仅支持继承,非空时 Spawn 拒绝)
TaskName string // 可选 run 名(roadmap list_agents 用)
}
SpawnOptions 覆盖 spawn 默认参数(subagent-s3s4 §5.1)。
type Subagent ¶
func NewSubagent ¶
type SubagentConfig ¶
type SubagentConfig struct {
Enabled bool `yaml:"enabled"`
ReplayToParentMemory bool `yaml:"replay_to_parent_memory"`
MaxHistoryMessages int `yaml:"max_history_messages"`
// —— 结果结构化/完成通知(设计 §5.4,S1 引入;B 阶段字段见 S3)——
// NotifyCompletion B 阶段:完成是否写 mailbox + 发事件,默认 true。
NotifyCompletion bool `yaml:"notify_completion"`
// CompletionMaxRunes 信封截断上限,默认 2000(≈1000 tokens)。
CompletionMaxRunes int `yaml:"completion_max_runes"`
// DelegateReturnMode delegate_to_agent 返回形态(设计 §14 遗留点 1,P2.2):
// "envelope"(默认)返回 *DelegateResult 信封;"string" 返回裸字符串
// (result.Output,S1 之前的兼容形态)。string 模式下 FilesChanged/Status/Usage
// 等信息不进工具返回值,是纯兼容开关。非法值/空串回退 envelope。
DelegateReturnMode string `yaml:"delegate_return_mode"`
// —— spawn_agent(S3,subagent-s3s4 §3.2/§9)——
// MaxConcurrentSpawns spawn 并发上限(channel semaphore,默认 4,对齐 codex)。
MaxConcurrentSpawns int `yaml:"max_concurrent_spawns"`
// SpawnTimeout spawn watchdog 默认超时(默认 3min)。
SpawnTimeout time.Duration `yaml:"spawn_timeout"`
// WakeOnCompletion S4 灰度开关:true 时 mailbox 到达 → 父代理自动开新 turn
// 消费(B2 唤醒)。默认 false(评审 RECOMMENDED-1:唯一动调度的功能默认关)。
WakeOnCompletion bool `yaml:"wake_on_completion"`
}
type SubagentManager ¶
type SubagentManager struct {
// contains filtered or unexported fields
}
func NewSubagentManager ¶
func NewSubagentManager(config *SubagentConfig, factory SubagentManagerFactory) *SubagentManager
func (*SubagentManager) Close ¶
func (sm *SubagentManager) Close()
func (*SubagentManager) CloseSession ¶ added in v1.10.0
func (sm *SubagentManager) CloseSession(sessionID string)
CloseSession 释放指定 session 派生的所有子代理 cancel(评审 B2 BLOCKER)。 dino factory 的 CloseSession 必须调用它(见 dino/factory.go 接线),否则 spawn 的子代理 goroutine 会脱离父 session 生命周期、只能靠 watchdog 收尸。 S1 阶段无 spawn(delegate 仍同步执行),此处只有分桶/释放接口,S3 落地填充。
func (*SubagentManager) ExecuteWithSession ¶ added in v1.10.0
func (sm *SubagentManager) ExecuteWithSession(ctx context.Context, sessionID, agentName, input string) (*Result, error)
ExecuteWithSession 在 Execute 基础上带 sessionID(context-trace,评审 B3): 给子代理注入该 session 的 tracer,使子代理事件落父 session 的 trace。
func (*SubagentManager) SetMaxConcurrentSpawns ¶ added in v1.10.0
func (sm *SubagentManager) SetMaxConcurrentSpawns(n int)
SetMaxConcurrentSpawns 配置 spawn 并发上限(factory 接线用)。
func (*SubagentManager) SetNotifier ¶ added in v1.10.0
func (sm *SubagentManager) SetNotifier(n *CompletionNotifier)
SetNotifier 注入完成通知器(factory 接线用)。
func (*SubagentManager) SetSessionTracer ¶ added in v1.10.0
func (sm *SubagentManager) SetSessionTracer(sessionID string, t hooks.Tracer)
SetSessionTracer 记录某 session 的 trace 句柄(context-trace,评审 B3)。 Execute/Spawn 时给子代理注入 tracer,使子代理事件落父 session 的 trace。
func (*SubagentManager) Spawn ¶ added in v1.10.0
func (sm *SubagentManager) Spawn( ctx context.Context, parentSessionID string, req *Request, parent AgentPath, mailbox *Mailbox, opts SpawnOptions, ) (*SpawnHandle, error)
Spawn 发起 fire-and-forget 子代理(subagent-s3s4 §5.1)。 ctx 为父 turn ctx(取消传播):父 ctx cancel → 子代理 ctx 取消。 后台 goroutine 执行 subagent.Execute,完成后经 notifier 回发 mailbox + 事件, 再 close(Done)(保证 Done 语义 = "已完成且已回发")。
type SubagentManagerFactory ¶
type SubagentManagerFactory interface {
GetLLMProvider() types.LLMProvider
GetTools() []types.Tool
GetAgent(name string) (*Info, bool)
// GetParentRuleset 返回父代理权限约束(restrict-only,P2.4)。
// 子代理工具按「子权限 ∩ 父权限」过滤,子代理永不比父代理更特权。
GetParentRuleset() permission.Ruleset
}
type SubagentTool ¶
type SubagentTool struct {
// contains filtered or unexported fields
}
func NewSubagentTool ¶
func NewSubagentTool(manager *SubagentManager) *SubagentTool
func (*SubagentTool) Description ¶
func (t *SubagentTool) Description() string
func (*SubagentTool) Execute ¶
func (t *SubagentTool) Execute(ctx context.Context, input map[string]interface{}) (interface{}, error)
Execute 按 DelegateReturnMode 分支返回形态(设计 §14 遗留点 1,P2.2):
- envelope(默认):返回 *DelegateResult 信封(S1 方案 A)。错误路径折叠进信封 (评审 R1):manager.Execute 出错时返回 Status=="error" 的信封 + nil error, 让错误态在 A 阶段对模型可见,而非走 toolObservationError 字符串分支。
- string:返回裸字符串 result.Output(S1 之前的兼容形态),错误直接透传,不做信封 折叠。FilesChanged/Status/Usage 等信息在该模式下不进工具返回值——纯兼容开关。
func (*SubagentTool) Metadata ¶
func (t *SubagentTool) Metadata() types.ToolMetadata
func (*SubagentTool) Name ¶
func (t *SubagentTool) Name() string
func (*SubagentTool) Schema ¶
func (t *SubagentTool) Schema() map[string]interface{}
func (*SubagentTool) WithSessionID ¶ added in v1.10.0
func (t *SubagentTool) WithSessionID(sessionID string) *SubagentTool
WithSessionID 注入父 session ID(context-trace,评审 B3)。
type WaitAgentTool ¶ added in v1.10.0
type WaitAgentTool struct {
// contains filtered or unexported fields
}
WaitAgentTool 阻塞订阅 mailbox 取回 spawn 结果(subagent-s3s4 §3.3/§5.2)。
func NewWaitAgentTool ¶ added in v1.10.0
func NewWaitAgentTool(manager *SubagentManager, mailbox func() *Mailbox, defaultTimeout time.Duration) *WaitAgentTool
NewWaitAgentTool 构造 wait 工具。defaultTimeout 工具内部等待上限; 注意:必须 < engine 对该工具的 ToolTimeouts 值(评审 BLOCKER-3),factory 注册时配。
func (*WaitAgentTool) Description ¶ added in v1.10.0
func (t *WaitAgentTool) Description() string
func (*WaitAgentTool) Execute ¶ added in v1.10.0
func (t *WaitAgentTool) Execute(ctx context.Context, input map[string]interface{}) (interface{}, error)
Execute 阻塞订阅 mailbox,返回 {task_id, completed, timed_out, message}。 message 直接是 DelegateResult.Truncated() 截断文本(父代理即可消费)。
评审 BLOCKER-3 交互:defaultTimeout(默认 30s)< engine ToolTimeouts["wait_agent"] (factory 配 200s)< engine ToolExecutionTimeout(60s 兜底)。wait 内部先超时返回 {timed_out:true} 信封(nil error),engine 的 select 先收到 result 通道 → 不触发 EC_TOOL_EXECUTION_TIMEOUT。ctx.Done 分支兜底 engine 外壳若被配得更短。
func (*WaitAgentTool) Metadata ¶ added in v1.10.0
func (t *WaitAgentTool) Metadata() types.ToolMetadata
func (*WaitAgentTool) Name ¶ added in v1.10.0
func (t *WaitAgentTool) Name() string
func (*WaitAgentTool) Schema ¶ added in v1.10.0
func (t *WaitAgentTool) Schema() map[string]interface{}