Help us shape the future of Go! Take the 2026 Go Developer Survey

engine

package
v0.5.1 Latest Latest
Warning

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

Go to latest
Published: Sep 7, 2026 License: Apache-2.0 Imports: 47 Imported by: 0

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

View Source
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 期校验)。

View Source
const (
	TopologySupervisor = "supervisor"
	TopologyDeep       = "deep"
)

拓扑形态常量(TopologyConfig.Kind)。

Variables

View Source
var ErrDecisionRejected = errors.New("engine: 决议被拒")

ErrDecisionRejected 决议被 DecisionGuard 拒绝(目标 ≠ 决议者,或路由卡 匿名决议 fail-closed)——ui/渠道侧映射 403(与其余内部错误区分)。

View Source
var ErrNoPendingDecision = errors.New("engine: 会话无挂起决议(已处理或超时)")

ErrNoPendingDecision 无挂起决议可恢复(已续流/超时翻转/并发迟到——幂等 语义,渠道侧把迟到按钮当已处理:静默而非告警)。

Functions

func ApprovalTimeout

func ApprovalTimeout() time.Duration

ApprovalTimeout 当前超时配置。

func DayHeader

func DayHeader(now time.Time) string

DayHeader 通用日期头(提示词机制件——业务段拼装归应用,自产品 instruction.go 的日期头拆出)。

Types

type ChannelBrief added in v0.4.0

type ChannelBrief struct {
	Channel string
	Chat    string
	Owner   string
	SID     string
}

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

type GateChecker func(ctx context.Context, workspaceRoot string) error

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

func NewManager(reg *session.Registry, opt Options) (*Manager, error)

NewManager 构造(reg = 会话注册表;opt 必填项:Providers/Instruction/ CheckPoints/WorkspaceRoot——缺一即报错,缺省 NewModel 生产构造)。 SessionToolsOff 含未知族名即报错(装配错误启动期暴露,不拖到首会话)。

func (*Manager) CancelSpawns

func (m *Manager) CancelSpawns(sid string)

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

func (m *Manager) DropSpawnReg(sid string)

DropSpawnReg 会话删除时回收注册表(自审 A2:常驻生命周期唯一下降沿—— 取消先行(CancelSpawns),在途 goroutine 仅持 reg 对象引用,map 删除后 其 remove/释放操作照常无害)。

func (*Manager) FlushQueue

func (m *Manager) FlushQueue(s *session.Session) bool

FlushQueue 立即处理排队消息:打断当前执行体 → 等其收尾 → 排队消息为输入 重启一轮(Run 头部 TakePending 消费)。仅 running 态(挂起审批无执行体可 打断——排队消息随决议 Resume 注入);等待有界:执行体不响应取消时 false 让位(调用方报错,用户可重试或显式停止)。

func (*Manager) IgnoreAsk

func (m *Manager) IgnoreAsk(s *session.Session)

IgnoreAsk 用户忽略挂起提问(ask 卡「忽略」按钮):停表(超时兜底随 之取消)+ 悬空调用补搁置回执闭环历史 + 记事件 + ended 终态落盘。不 Resume——任务停在本步,用户下一次发消息开新轮唤醒(排队消息随新轮 注入)。与超时分支的刻意差异:补配对 tool 消息而非留悬空待 sanitizeHistory 剥离——唤醒轮模型记得问过什么,新消息语境才能衔接; 且回执随 Persist 落盘,跨重启不失(超时的内存决议重启即丢)。

func (*Manager) NotifyOwner

func (m *Manager) NotifyOwner(s *session.Session, note string)

NotifyOwner 完成通知注入(W-3 核心):自激护栏(预算耗尽只入队不自续)→ 单锁原子裁定(running=排队 / idle=自续轮)→ 滞留尾巴兜底(仅 ended)。

func (*Manager) RearmPendingTimer

func (m *Manager) RearmPendingTimer(s *session.Session)

RearmPendingTimer 重启后续表(Reattach 恢复挂起态后调用):进程重启丢内存 计时器,不续则挂起永无超时兜底(排队消息卡死、列表常显等待确认)。已过点 即时触发(AfterFunc 负延迟归 0——镜像停机期间到点的超时动作)。

func (*Manager) Registry

func (m *Manager) Registry() *session.Registry

Registry 会话注册表出口。

func (*Manager) Resume

func (m *Manager) Resume(ctx context.Context, s *session.Session, fn emitFn)

Resume 审批决议后续流(hitl 配套;决议已由应用端点 SetDecision)。 入口整备(A1):BeginResume 单锁原子查清挂起域 + 翻 running + 挂 runDone ——重复/并发第二个 Resume 即拒(checkpoint 不随 Resume 消费,迟到调用放行 是脏重放:旧检查点被加载重执行、决议已被消费回喂 fail-closed 信封);执行 期状态可见为 running(FlushQueue/Drain 可寻址,此前恒显 pending)。

func (*Manager) Run

func (m *Manager) Run(ctx context.Context, s *session.Session, userMsg string, atts []session.Attachment, fn emitFn)

steering 排队兜底:上轮运行中排队的消息前置并入本轮输入。

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 = 不装配)。

type TurnEndSummary added in v0.2.0

type TurnEndSummary struct {
	Owner   string
	SID     string
	Title   string
	Task    string
	Summary string                // 会话累计文本聚合(session_end 同源;列表摘要口径截 60 字,非单轮)
	Files   []contract.FileChange // 文件变更清单(有改动才非空)
	EndedAt time.Time
}

TurnEndSummary 轮收尾交接载荷(session_end 事件同源 + 会话身份)。

Jump to

Keyboard shortcuts

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