Documentation
¶
Overview ¶
channel 渠道编排机制核(传输无关):外部渠道(即时通信机器人 / 实时语音 / 任意消息入口)与引擎之间的会话编排——入站消息分流(空闲起轮 / 运行中排队 / 挂起接决议续流)、常驻事件订阅出站(覆盖挂起期与后台通知——live 回调 fn 生命周期绑定 Run/Resume 调用的既有缺口由订阅面补齐)、停止与主动推送。 渠道协议与消息渲染归适配器:应用实现 ChannelSink、调 Handle/Approve/Answer 即成一个渠道(官方通用件见 channels/ 子包,业务自定义渠道长在业务仓—— 同 llm 供应商「内置目录 + 自定义」两层模式)。三层结构与接入蓝图见 docs/04。
Package engine 是 einox 循环引擎(自产品 internal/agent/agent.go 迁入泛化): 每轮 Run 组装——Providers 解析 → NewModel 构造 ChatModel(测试可注入假 模型)→ adk ChatModelAgent(Instruction + 工具面 [hitl 审批包装 × einoext 适配] + skill middleware)→ Runner(EnableStreaming + CheckPoints 注入)→ Run + WithCheckPointID(续聊 = 会话域 History 回传,checkpoint 只承担中断/ 取消恢复)→ 事件泵分类为契约事件族。应用注入面 = Options(提示词内容/ 工具面/审批配置/模型解析/工作区根——机制归基座,内容归业务)。
spawn 后台派生(Phase W,B 方案 = 2026-08-28 后台派生定案): spawn{background:true} 调用即回 agentId,父回合继续;子代理自建 Runner 泵 跑完(事件走 Record 扇出,与主 SSE 三路同链路),结论经通知注入回传父模型 (running=排队 / idle=自续轮,session.ContinueOrNotify 单锁原子裁定)。
生命周期红线(对照审查 W-0b 整改):
- 起跑预检:父 ctx 已取消 → 拒绝派生(dsh pre-aborted refusal 同款)
- panic 容错:后台 goroutine defer recover → failed 收尾,绝不冒泡杀进程
- 取消≠释放:停止/删除全停(CancelSpawns),额度收尾完成才释放(dsh stopping 语义)
- 自激护栏:连续自续预算 3(用户消息恢复;通知自身不恢复);预算耗尽 只入队不自续(下轮用户交互消费);滞留尾巴自续仅对 ended 自然终态—— error(用户停止)只入队不自续(防把中断洗成模型请求)
- spawn_id 会话域单调分配(跨回合后台任务并存,回合内自增会撞键)
Package engine 内文件:订阅式工具钩子(ToolHooks)。与 ToolWrap 的分工—— ToolWrap 管包装改写(有状态包装、结果改写),本缝管零样板订阅:审计观察 与策略拦截不必再写包装类型。
Index ¶
- Constants
- Variables
- func ApprovalTimeout() time.Duration
- func DayHeader(now time.Time) string
- type ChannelBrief
- type ChannelConfig
- type ChannelGateway
- func (g *ChannelGateway) Answer(sid string, decider *contract.Participant, d contract.AskDecision) bool
- func (g *ChannelGateway) Approve(sid, itemID string, decider *contract.Participant, d contract.ApprovalDecision) error
- func (g *ChannelGateway) Cancel(channel, chat string) bool
- func (g *ChannelGateway) Close(deadline time.Duration) bool
- func (g *ChannelGateway) Handle(msg InboundMsg) error
- func (g *ChannelGateway) Lookup(channel, chat string) (ChannelBrief, bool)
- func (g *ChannelGateway) Push(channel, chat, text string) error
- func (g *ChannelGateway) Unbind(channel, chat string) bool
- type ChannelSink
- type CheckPointStore
- type GateChecker
- type GateConfig
- type InboundMsg
- type Manager
- func (m *Manager) CancelSpawns(sid string)
- func (m *Manager) Channels() *ChannelGateway
- func (m *Manager) Dispatch(s *session.Session, actor *contract.Participant, text string, ...) (bool, error)
- func (m *Manager) DropSpawnReg(sid string)
- func (m *Manager) FlushQueue(s *session.Session) bool
- func (m *Manager) IgnoreAsk(s *session.Session)
- func (m *Manager) NotifyOwner(s *session.Session, note string)
- func (m *Manager) RearmPendingTimer(s *session.Session)
- func (m *Manager) Registry() *session.Registry
- func (m *Manager) Resume(ctx context.Context, s *session.Session, fn emitFn)
- func (m *Manager) Run(ctx context.Context, s *session.Session, userMsg string, ...)
- type Options
- type SessionBrief
- type SpawnOutput
- type SubAgentSpec
- type SubAgentsConfig
- type ToolHookCall
- type ToolHookResult
- type ToolHooks
- type ToolSearchPolicy
- type TopologyConfig
- type TurnEndSummary
Constants ¶
const ( FamilyTodo = "todo" // todo_write(任务清单) FamilyAsk = "ask" // ask_user(结构化提问) FamilyPlan = "plan" // submit_plan(计划卡) FamilyFS = "fs" // read_file / list_dir / search_files / delete_file FamilyCmd = "cmd" // run_command / task_output / task_stop FamilyPatch = "patch" // apply_patch )
会话域工具族名(Options.SessionToolsOff 的封闭取值集——NewManager 期校验)。
const ( TopologySupervisor = "supervisor" TopologyDeep = "deep" )
拓扑形态常量(TopologyConfig.Kind)。
Variables ¶
var ErrDecisionRejected = errors.New("engine: 决议被拒")
ErrDecisionRejected 决议被 DecisionGuard 拒绝(目标 ≠ 决议者,或路由卡 匿名决议 fail-closed)——ui/渠道侧映射 403(与其余内部错误区分)。
var ErrNoPendingDecision = errors.New("engine: 会话无挂起决议(已处理或超时)")
ErrNoPendingDecision 无挂起决议可恢复(已续流/超时翻转/并发迟到——幂等 语义,渠道侧把迟到按钮当已处理:静默而非告警)。
Functions ¶
Types ¶
type ChannelBrief ¶ added in v0.4.0
ChannelBrief 渠道会话上下文(投递时回查:渠道实例/渠道会话键/归属/会话 ID)。
type ChannelConfig ¶ added in v0.4.0
type ChannelConfig struct {
ID string
Model string
Sink ChannelSink
}
ChannelConfig 渠道实例装配(Options.Channels 条目)。ID 是消息路由键 (InboundMsg.Channel 匹配),进程内唯一。Model = 渠道会话缺省模型复合键 (provider/model,渠道新建会话粘住)——不可用键首轮即 CONFIG 错误面如实 暴露,装配侧须给可用键。
type ChannelGateway ¶ added in v0.4.0
type ChannelGateway struct {
// contains filtered or unexported fields
}
ChannelGateway 渠道编排泵(Manager.Channels() 出口,懒建总可用——未装配 渠道清单时 Handle 对未注册渠道报错,而非 nil 面拒绝)。多渠道并发:绑定 键含渠道 ID 天然隔离;一个 Manager(= 一个 agent 装配)一个 Gateway, 跨 agent 分流由应用层多 Gateway 组合,基座不建路由器。
func (*ChannelGateway) Answer ¶ added in v0.4.0
func (g *ChannelGateway) Answer(sid string, decider *contract.Participant, d contract.AskDecision) bool
Answer 提问作答回写续流(ask_user 挂起——语音渠道口头回答经适配器解析 后同路)。false 同 Approve(幂等拒绝)。
func (*ChannelGateway) Approve ¶ added in v0.4.0
func (g *ChannelGateway) Approve(sid, itemID string, decider *contract.Participant, d contract.ApprovalDecision) error
Approve 审批/计划决议回写续流(决议端点编排收编:登记 → 回执落流 → 落盘 → 续流)。itemID 空 = 单决议/计划卡(plan 档回执走 plan_decision), 非空 = 合并决议卡逐项。decider(T6,可空)= 点按钮的人——随决议落回执 可审计;DecisionGuard 启用且卡有路由目标时校验一致性,mismatch 拒绝 (fail-closed 防越权点批)。ErrNoPendingDecision = 幂等迟到;其余 error = 决议被拒(渠道侧告警可见)。
func (*ChannelGateway) Cancel ¶ added in v0.4.0
func (g *ChannelGateway) Cancel(channel, chat string) bool
Cancel 停当前轮(语音打断/挂断、即时通信停止按钮):取消执行体,收束 走既有中断收尾(interrupted 事件 + 检查点 + 中断注记全落)。挂起态无 执行体不打断(等决议或超时兜底);无绑定/非运行态 false。
func (*ChannelGateway) Close ¶ added in v0.4.0
func (g *ChannelGateway) Close(deadline time.Duration) bool
Close 渠道编排收线(停机序插在 Registry.Drain 前:先停事件投递面,再收 执行体)。幂等;true = 泵组已收净,false = 到点仍有泵在投递(如实上抛, 不阻塞停机)。
func (*ChannelGateway) Handle ¶ added in v0.4.0
func (g *ChannelGateway) Handle(msg InboundMsg) error
Handle 入站消息分流:空闲(ended/error)起轮;运行中/挂起排队(Steer ——轮内注入或决议续流后前置带回,不打断执行体)。执行体与既有自续轮 同款(go Run + noopEmit——出站统一走订阅面,不依赖 fn 生命周期)。
func (*ChannelGateway) Lookup ¶ added in v0.4.0
func (g *ChannelGateway) Lookup(channel, chat string) (ChannelBrief, bool)
Lookup 绑定查询(渠道侧对账/渲染上下文回查;仅读不激活——不动消费泵)。
func (*ChannelGateway) Push ¶ added in v0.4.0
func (g *ChannelGateway) Push(channel, chat, text string) error
Push 主动推送系统通知(落 harness_note 事件——记录即扇出,消费泵投递 渠道侧渲染;不触发运行)。无有效绑定即拒(无投递面)。主动开一轮(定时 任务产出等)不经此——通知注入自续是引擎既有语义(NotifyOwner/ ContinueOrNotify),触发源归应用。
func (*ChannelGateway) Unbind ¶ added in v0.4.0
func (g *ChannelGateway) Unbind(channel, chat string) bool
Unbind 解除绑定(应用删除会话/渠道会话注销时;内存与盘面同摘,消费泵 随绑定收线信号退出——解绑后不再投递该会话的任何事件,兑现「注销即静默」; 残留在订阅通道内的事件随泵退出一并丢弃——事件流真源在会话记录,回放不受 影响)。
type ChannelSink ¶ added in v0.4.0
type ChannelSink interface {
Deliver(b ChannelBrief, ev session.Event)
}
ChannelSink 渠道出站投递(应用实现:事件 → 渠道消息渲染发送)。契约: 单会话串行投递、跨会话并发——实现须并发安全;慢消费由实现侧节流(文本 增量可聚合),偶发丢事件由订阅面的水位补投兜底(本面是尽力而为的实时 视图,事件流真源在会话记录——回放/对账走 Detail/快照)。
type CheckPointStore ¶
type CheckPointStore interface {
Get(ctx context.Context, key string) ([]byte, bool, error)
Set(ctx context.Context, key string, checkpoint []byte) error
}
CheckPointStore 会话检查点存储面(adk Get/Set 同构——结构直配 Runner)。
type GateChecker ¶ added in v0.2.0
GateChecker 确定性判据(ctx + 会话工作区根;nil error = 过)。判据归应用 ——基座不内置任何 build/test 知识;要 LLM 对抗审查(E4 形态)在 checker 内自包(应用侧调模型 + 只读工具),门循环不关心判据形态。ctx 是运行取消 面(用户停止/断连才断)而非判据超时面——慢判据应自包 WithTimeout。
type GateConfig ¶ added in v0.2.0
type GateConfig struct {
Checkers []GateChecker // 按序执行,首个失败即回灌(错误文案应含判据名——门卡展示用)
MaxRetries int // 回灌上限(负数 = 缺省 2;0 = 零回灌——首验失败即报错,codex Guardian cyber 档同型)
}
GateConfig 门配置(Options.FinalGate 闭包产物;nil = 该会话不开门)。
type InboundMsg ¶ added in v0.4.0
type InboundMsg struct {
Channel string
Chat string
Owner string
Mode string
Text string
Attachments []session.Attachment
// T6 多参与者:发送者身份(适配器解析协议后透传——feishu 的 open_id 等;
// 渠道账号 ↔ 业务用户的映射归应用)。空 = 单用户零变化(Owner 语义原样)。
// 群聊第二个及以后的发送者经此入链:名册首见登记 + 当轮说话人 + 排队署名
//——此前(实锚)已绑定会话的后续发送者身份被静默丢弃。
SpeakerID string
SpeakerName string
// T6 会话形态(p2p | group——适配器解析透传,应用据此选择装配策略;
// 基座不消费)。
ChatType string
}
InboundMsg 渠道入站消息(适配器解析协议后转投——引擎只见文本轮次,媒体 形态处理(语音转写分段/附件提取)归适配器)。Owner 判定策略归适配器 (渠道账号 ↔ 用户绑定体系在业务层);Mode 空 = manual(写工具逐次审批, 安全缺省)。
type Manager ¶
type Manager struct {
Opt Options
// contains filtered or unexported fields
}
Manager 引擎管理器(进程单例;会话态归 Registry)。
func NewManager ¶
NewManager 构造(reg = 会话注册表;opt 必填项:Providers/Instruction/ CheckPoints/WorkspaceRoot——缺一即报错,缺省 NewModel 生产构造)。 SessionToolsOff 含未知族名即报错(装配错误启动期暴露,不拖到首会话)。
func (*Manager) CancelSpawns ¶
CancelSpawns 会话域后台任务全停(api 停止端点与删除端点挂接;空注册表 no-op)。停止=全停是 2026-08-28 裁定推荐项。
func (*Manager) Channels ¶ added in v0.4.0
func (m *Manager) Channels() *ChannelGateway
Channels 渠道编排出口(懒建;进程单例)。
func (*Manager) Dispatch ¶ added in v0.5.0
func (m *Manager) Dispatch(s *session.Session, actor *contract.Participant, text string, atts []session.Attachment, mode string) (bool, error)
Dispatch 入站轮次分流(渠道 Handle 与 ui 控制面 run 共用编排——单点维护 竞态语义):首见名册登记 → 空闲起轮(actor 无条件设为当轮说话人,nil 清 陈旧归属——匿名轮不得继承上轮身份)→ 运行中/挂起转排队(SteerBy 署名)。 分流两步 BeginRun/Steer 间存在收束竞态,各重试一次;仍失败如实报错。 返回 queued = 转排队(false = 已起轮)。执行体脱离调用方生命周期 (context.Background + noopEmit——出站统一走订阅面)。
func (*Manager) DropSpawnReg ¶
DropSpawnReg 会话删除时回收注册表(自审 A2:常驻生命周期唯一下降沿—— 取消先行(CancelSpawns),在途 goroutine 仅持 reg 对象引用,map 删除后 其 remove/释放操作照常无害)。
func (*Manager) FlushQueue ¶
FlushQueue 立即处理排队消息:打断当前执行体 → 等其收尾 → 排队消息为输入 重启一轮(Run 头部 TakePending 消费)。仅 running 态(挂起审批无执行体可 打断——排队消息随决议 Resume 注入);等待有界:执行体不响应取消时 false 让位(调用方报错,用户可重试或显式停止)。
func (*Manager) IgnoreAsk ¶
IgnoreAsk 用户忽略挂起提问(ask 卡「忽略」按钮):停表(超时兜底随 之取消)+ 悬空调用补搁置回执闭环历史 + 记事件 + ended 终态落盘。不 Resume——任务停在本步,用户下一次发消息开新轮唤醒(排队消息随新轮 注入)。与超时分支的刻意差异:补配对 tool 消息而非留悬空待 sanitizeHistory 剥离——唤醒轮模型记得问过什么,新消息语境才能衔接; 且回执随 Persist 落盘,跨重启不失(超时的内存决议重启即丢)。
func (*Manager) NotifyOwner ¶
NotifyOwner 完成通知注入(W-3 核心):自激护栏(预算耗尽只入队不自续)→ 单锁原子裁定(running=排队 / idle=自续轮)→ 滞留尾巴兜底(仅 ended)。
func (*Manager) RearmPendingTimer ¶
RearmPendingTimer 重启后续表(Reattach 恢复挂起态后调用):进程重启丢内存 计时器,不续则挂起永无超时兜底(排队消息卡死、列表常显等待确认)。已过点 即时触发(AfterFunc 负延迟归 0——镜像停机期间到点的超时动作)。
type Options ¶
type Options struct {
// Providers 模型解析(组装期调用;空清单 = 未配置模型错误面)。
Providers func() []llm.ProviderSpec
// Instruction 系统提示词(应用内容——业务职责段 + 通用段 + 会话配置段 +
// 模式段拼装归应用;入参 = 会话配置概要,每轮 assemble 实时注入)。
Instruction func(sess SessionBrief) string
// Tools 业务工具面(实现 contract.Tool;入参 = 会话概要——多租户按
// Owner 裁剪工具面、按会话身份定制;nil = 无业务工具)。闭包每轮
// assemble 求值、跨会话并发调用——应快速返回且无共享可变态。
Tools func(sess SessionBrief) []contract.Tool
// ProcessTools 进程级通用件(时间/网络等——应用选择加入的基座件)。
ProcessTools func() []contract.Tool
// SessionToolsOff 排除的会话域工具族(族名见 sessiontools.go 的族常量;
// nil/空 = 全挂零行为变化——族构造失败照常上抛 CONFIG,不静默吞错),未知
// 名 NewManager 即拒——对齐 DenyTools 的 fail-fast 纪律)。
// 裁 fs 族 = 放弃 reduction 外置换指针取回(外置指针经 read_file 虚拟
// 路径取回,工具不在场则超长结果只剩截断头尾)——留装配者知情决策,
// 引擎不联动(上游截断与外置在同一 handler 内一体,禁外置须复制其逻辑)。
SessionToolsOff []string
// ToolWrap 工具包装缝(契约层最外包装,挂 hitl 审批包装之外;主面与
// 子代理面同挂——审计/脱敏/动态准入覆盖主面与子代理面的全部契约工具,
// spawn 派发本体不经包装)。nil = 不包装,零行为变化。契约义务:
// 1. Info() 须透传原名(名字是审批名单/子代理白名单/动态装载分流的
// 寻址键);
// 2. 拒绝执行以 {"ok":false,"error":…} 信封返回回喂模型自纠(勿返回
// Go error——本缝在 errFeed 外层,Go error 会终止整轮且模型不可见);
// 3. 只能收紧不能放宽:收到的是已含审批的实例,透传即保留全部审批
// 语义(ArgsForce/模式审批不可豁免——以会话域件为界成立,裸实例
// 在引擎内不可得;业务工具的裸实例本就在应用手中,绕过属应用
// 自毁);伪造结果属违约;
// 4. 包装随每次 assemble 重建(Run/Resume 各一次)——有状态包装的
// 计数不跨轮;
// 5. 勿从包装内发起 *contract.Suspend(引擎三卡分叉与决议消费链路
// 未对应用开放)。
ToolWrap func(t contract.Tool) contract.Tool
// Hooks 订阅式工具钩子(audit/拦截零样板订阅口,nil = 零变化):挂
// ToolWrap 之外的最外层(包装序 hitl → ToolWrap → Hooks → einoext——
// 审计看终局:Pre 先于审批决策触发、Post 收审批拒绝信封与工具原始
// 返回)。主面与子代理面同挂;Pre 可否决(error = 拒绝信封回喂,只能
// 收紧不能放宽——与 ToolWrap 同纪律)。语义全貌见 toolhooks.go。
Hooks *ToolHooks
// NewModel 模型构造口(缺省生产构造 llm.NewChatModel;测试注入假模型)。
NewModel llm.ModelFactory
// ImageResolve 图片引用解析(文档仓库路径 → 字节+MIME;nil = 图片不可用——
// 含图请求即错误面。vision 包装在模型调用边界消费)。
ImageResolve llm.ImageResolver
// CheckPoints 会话检查点存储构造(operator+sid 定位)。
CheckPoints func(operator, sid string) CheckPointStore
// SkillsDir skill 物化目录(nil/空 = 不挂 skill middleware;物化归应用。
// 入参 = 会话概要——按租户物化不同 skill 包;与 Tools 同契约:每轮
// assemble 求值、并发安全)。
SkillsDir func(sess SessionBrief) string
// AgentsMD AGENTS.md 注入清单(nil/空清单 = 不挂零变化;绝对路径,按序
// 注入)。发现逻辑归应用(ZCode 双层形态:用户级文件先、工作区级文件后
// 收窄覆盖——两文件按序进清单即得);跨会话记忆注入通道同走此缝(owner
// 级记忆文件进清单)。与 SkillsDir 同契约:每轮 assemble 求值、并发安全。
AgentsMD func(sess SessionBrief) []string
// AgentsMDMaxBytes 注入字节预算(0 = 缺省 32KiB;上游按序装载超限即跳过
// 余下文件——预算显式化,防提示词面失控)。
AgentsMDMaxBytes int
// ContextBudget 常驻上下文预算(token,口径 = estTokens 启发式):Instruction
// + 常驻工具面(业务面+进程件+会话域件+spawn:名+描述+参数 schema JSON)
// 合计的超限告警线。0 = 缺省关(nil 纪律:零配置零变化;推荐值 8192 与
// 调法见 docs/04)。超限动作 = harness_note(Kind: budget)+ 服务端日志、
// 不阻断运行(大工具面配 toolsearch 就是合法超标场景);会话内只发一次
// (判定扫 Events 既有同 Kind note,跨重启天然不重发)。env
// EINO_CONTEXT_BUDGET 可覆盖(对齐 EINO_MAX_ITERATIONS 惯例)。toolsearch
// 名单内工具不进核算——动态装载正是瘦身手段,只有常驻面计费。
ContextBudget int
// Approval 审批配置(写工具名单/动作名/参数豁免——业务内容)。
Approval hitl.ApprovalConfig
// ApprovalRouter 审批路由(T6,nil = 不路由——全员可见谁先点谁决议):
// 挂起卡生成时按会话概要与卡面裁决「问谁」,目标随卡下发(前端定向提示)
// 并入 pending target(DecisionGuard 校验依据)。判据归应用(机制与内容
// 分离:基座只携带身份与执行校验)。
ApprovalRouter func(brief SessionBrief, req contract.ApprovalReq) *contract.Participant
// DecisionGuard 决议校验缝(T6,nil = 不校验——应用自带认证时的零变化):
// 挂起卡有路由目标且决议带决议者时校验一致性,mismatch 拒绝(fail-closed
// ——防越权点批)。
DecisionGuard func(targetID, deciderID string) error
// WorkspaceRoot 会话工作区根(用户域 workspaces/<sid>——WorkspaceKeep
// 声明的持久子区跨任务保留、其余一轮一清;惰性创建)。
WorkspaceRoot func(owner, sid string) string
// WorkspaceKeep 任务收尾清理保留的工作区子目录(顶层目录名——挂载区、
// 参考资料区等由装配层声明,基座不预设名字;nil/空 = 无持久区全清)。
// 持久子区随会话删除/过期/孤儿清扫整清(Registry.Delete/Sweep 整目录
// 移除,不看此栏)。
WorkspaceKeep []string
// WorkspaceProtect 工作区写保护区(顶层目录名;注入 fsutil/applypatch
// 写面——delete_file 与补丁目标〔含 Move to 改名目标〕命中即整单拒绝、
// 读面不受影响;nil/空 = 不设区零变化。命令面 run_command 不在此栏——
// 命令内容不可静态可靠解析,写的硬约束归 Sandbox 档位)。
WorkspaceProtect []string
// SubAgents spawn 子代理装配(H2;nil = 不装配 spawn)。
SubAgents *SubAgentsConfig
// Topology 确定性场景多 agent 拓扑(H5:supervisor/deep 官方 prebuilt 接线;
// nil = 单 agent react 既有主线。红线表对拓扑内子 agent 全量生效)。
Topology *TopologyConfig
// ToolSearchPolicy 动态工具装载(H7:名单外常驻、名单内经 tool_search
// 检索后可见;nil = 全量常驻零变化。审批包装在分流上游——ArgsForce 与
// 模式审批对动态工具不豁免)。
ToolSearchPolicy *ToolSearchPolicy
// Sandbox run_command 沙箱策略(nil = 不沙箱——产品默认关 opt-in;
// 机制 = einox/sandbox re-exec 哨兵协议,产品 main 需挂 RunHelper 钩子)。
Sandbox *sandbox.Policy
// SandboxProvider 沙箱后端(nil = sandbox.OSProvider 平台内建;容器类
// 后端如 sandbox.DockerProvider 经此注入——与 Sandbox 正交:策略定
// 「施加什么」,后端定「怎么施加」)。
SandboxProvider sandbox.Provider
// Egress 网络出口校验器(S-9:run_command 命令串 URL 预检;nil = 不
// 预检零变化。webfetch 侧的注入在应用 ProcessTools(进程级工具归应用
// 装配),此处只管引擎持有的命令面)。
Egress *egress.Validator
// SummarizerFallbackModels 摘要模型 Failover 降级链(H9-10:主摘要模型
// 失败按序降级的复合键清单,逐个同链包装 vision/shape 后填 adk Failover;
// 空 = 不配降级零变化(单端点装配配了也白配);链尽走既有清窗兜底不外抛。
// ShouldFailover 排除 ctx 取消/中断类、MaxRetries=链长——审查补差内建。
SummarizerFallbackModels []string
// FallbackModels 主对话模型 Failover 降级链(复合键清单;空 = 零变化)。
// 重试先耗尽(有界重连)、RetryExhaustedError 触发按序换链上模型(每档
// 各享完整重连预算);粘滞上次成功模型归 adk。切换发 model_change 事件;
// 致命类(401/403/402 配置错)不降级直接停机;ctx 取消/审批中断不降级。
// 清单错配(键不在 Providers 内)不阻断运行:降级失效 + harness_note 留痕。
// 子代理/拓扑子面不挂(链按主模型语境配置,维持 retry-only)。
FallbackModels []string
// Recall 跨会话检索工具(记忆拉通道,opt-in):模型可读本 owner 历史会话
// 的摘要与消息投影(三模式 sid 深读/query 检索/最近列表;恒排除当前会话、
// 有界、摘要级——授权五律见 recall.go)。是新能力面:装配即知情决策,
// false = 不装配零变化。条件装配先例 = channels 之于 Options.Channels。
Recall bool
// TurnEpilogue 轮收尾交接钩子(记忆写通道,nil = 零变化):自然收束
// (StateEnded)每轮触发,载荷与 session_end 事件同源(摘要+文件变更)。
// einox 的 session_end 是轮级——应用自行去重/节流。同步调用应快速返回,
// 重提取(LLM 蒸馏/外部写)归应用异步;panic 由引擎兜底不影响终态。
// 最小用法:把摘要追加进 owner 域记忆 markdown,经 AgentsMD 清单注入。
TurnEpilogue func(sum TurnEndSummary)
// FinalGate 收束质量门(nil = 零变化):自然收束后、终态落盘前按
// GateConfig.Checkers 强制验证——失败经 harness_note 门卡 + 反馈消息
// 入史回灌重跑(有界,MaxRetries 缺省 2),耗尽 error 收束不静默放行。
// 闭包入参 SessionBrief:按模式/任务形态决定开门与否与判据清单(判据
// 归应用——build/test 命令或自包的对抗审查;基座只持门循环机制)。
// 挂起/中断/错误轮不触发;重试预算随 Run/Resume 执行体。
FinalGate func(sess SessionBrief) *GateConfig
// Channels 消息渠道装配(nil/空 = 不装配零变化):每条目一个渠道实例
// (ID 进程内唯一、Sink 出站投递——渲染归适配器)。渠道编排面
// Manager.Channels() 懒建总可用:入站 Handle 分流(空闲起轮/运行中
// 排队)、常驻事件订阅出站(覆盖挂起期)、Approve/Answer 决议续流、
// Cancel/Push。渠道协议归适配器(官方通用件 channels/ 子包;业务
// 自定义渠道长在业务仓)——同 llm 供应商「内置目录 + 自定义」两层
// 模式,见 docs/04。
Channels []ChannelConfig
}
Options 引擎组装配置(应用装配层构造)。
type SessionBrief ¶
type SessionBrief struct {
Mode string
Model string // 复合键 provider/model
Effort string
Owner string // 会话归属用户
SID string // 会话标识
// ParentSID 辅助对话父会话(空 = 普通会话——应用可据此调 Instruction/
// 工具面/skill 目录;side 共享父工作区与外置域,见 wsSID)。
ParentSID string
// T6 当轮说话人(空 = 单用户零变化):应用装配面可见——按人裁剪
// Instruction/工具面/审批判定(机制与内容分离:身份只透传,策略归应用)。
TurnSpeakerID string
TurnSpeakerName string
}
SessionBrief 会话概要(Instruction / Tools / SkillsDir 组装入参——三件套 随消息可变:mode 每条消息可带,model/effort 会话内可切换,运行边界生效; Owner/SID 会话身份:工具面与 skill 目录按租户裁剪的寻址键)。
type SpawnOutput ¶ added in v0.5.0
type SpawnOutput struct {
// Schema 期望结论 JSON Schema(根形必须 object——构造期校验拒收)。
Schema *contract.Schema
}
SpawnOutput 结构化回传配置(nil = 自由文本结论零变化)。
type SubAgentSpec ¶
type SubAgentSpec struct {
Name string
Description string
Instruction string // 空 = 引擎缺省子提示词(subInstruction 同款)
Tools []string // 工具白名单(红线:数据域写与 repo 写工具不进)
DenyTools []string // 硬拒名单(H9-6:交集/未同名装配期 configError,与 spawn 同闸)
Model string // 模型覆写复合键(空 = 随父会话快照)
}
SubAgentSpec 拓扑子 agent 定义(装配注入:白名单/提示词/模型覆写)。
type SubAgentsConfig ¶
type SubAgentsConfig struct {
Tools []string // 工具白名单(全量面按名筛;内容归业务——数据域写工具不列入)
DenyTools []string // 硬拒名单(H9-6 纪律升机制:与白名单交集非空或含全量面未同名 → 装配期 configError;不配 = 行为不变)
Instruction string // 子提示词(空 = 引擎缺省模板)
Model string // 模型覆写复合键(空 = 随父会话快照)
MaxConcurrent int // 并发 spawn 上限(0 = 不限)
// EmitEvents 全量转发档(H8-2 事件折叠三档之一,默认关):开 = 子代理
// 内部事件经泵翻译为 EvSubAgent 转发父流(只读流——子过程不进父上下文,
// 折叠卡展开态消费;并行多 spawn 同名事件交错,per-invocation 归组为
// 升级位)。关 = 静默/折叠一行(spawn 的 EvToolCall/EvToolResult 即卡面)。
EmitEvents bool
// Output 结构化回传(T8,nil = 自由文本结论零变化):子代理面注入
// spawn_submit 工具,合法提交即收束,canonical JSON 回父。
Output *SpawnOutput
}
SubAgentsConfig 子代理装配(engine.Options.SubAgents;nil = 不装配 spawn)。
type ToolHookCall ¶ added in v0.5.0
type ToolHookCall struct {
Sess SessionBrief // 含 ParentSID——side 面可区分
Name string
Args json.RawMessage
}
ToolHookCall 单次工具调用钩子载荷(Args = Invoke 实参原文)。
type ToolHookResult ¶ added in v0.5.0
type ToolHookResult struct {
Result json.RawMessage
Err error
Dur time.Duration
}
ToolHookResult 工具结果观察载荷(Result 信封语义同 contract.Tool: ok:false = 业务失败;Err 非 nil = 框架级失败)。Result 为工具原始返回 (reduction 截断/外置之前的真值——审计口径)。
type ToolHooks ¶ added in v0.5.0
type ToolHooks struct {
Pre func(c ToolHookCall) error
Post func(c ToolHookCall, r ToolHookResult)
}
ToolHooks 订阅式工具钩子(审计/准入零样板订阅口)。挂 wrapFace 最外层 (包装序 hitl → ToolWrap → Hooks → einoext):Pre 先于审批决策触发、Post 收工具原始返回(reduction 外真值)与耗时——审批拒绝的调用也过钩子(Pre 触发 ≠ 实际执行,Post 以拒绝信封为结果——审计完整)。主面与子代理面同挂 (wrapFace 共用)——子代理面(spawn/拓扑)的调用记在**父会话名下** (Sess = 父身份,会话粒度审计;子面调用与主面调用在钩子层不可区分); spawn 派发本体不经钩子(同 ToolWrap 纪律)。 失败语义(只能收紧不能放宽——与 ToolWrap 同纪律):
- Pre 返回 error:拒绝执行,{"ok":false,"error":"pre-hook: …"} 信封回喂 模型自纠(Go error 不上抛——轮不终止);Post 以拒绝信封为结果补发;
- Pre panic:recover 转拒绝(fail-closed——钩子崩了不放行);
- Post panic:recover 记日志(观察不破坏运行)。
双回调全 nil 的空结构 = 原样放行零变化。
type ToolSearchPolicy ¶
type ToolSearchPolicy struct {
// DynamicTools 动态面工具名(检索后可见);名单外全量常驻
// (ask_user/todo_write/submit_plan 等会话域件与高频件留常驻是装配纪律)。
DynamicTools []string
}
ToolSearchPolicy 动态工具装载策略(engine.Options.ToolSearchPolicy;nil = 全量常驻,产品零变化)。名单内工具初始对模型不可见,经 tool_search 元工具 检索命中后加载(Run 内 sticky;跨 Run 靠扫描历史 tool_search 结果恢复—— 故其结果消息在 reduction Exclude 名单禁外置,见 H1-3)。
type TopologyConfig ¶
type TopologyConfig struct {
Kind string
SubAgents []SubAgentSpec
}
TopologyConfig 拓扑装配(engine.Options.Topology;nil = 不装配)。