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