Skip to content

ADR 0041: AgentStreamBus 与 AgentSessionHostPort

状态

Accepted

背景

ADR 0039/0040 引入 Host /zhin/v1/session* 与 HTTP step checkpoint 后,Agent stream egress 出现多条并行路径:

  • process-stream / turn-pipelineHookRegistry.triggerStream 发 wire 事件
  • HttpAgentSessionStore.runTurn 二次映射 TurnEventappend + triggerStream
  • agent-core-run 对 HITL 事件双写 hooks 与 getHttpAgentSessionRuntime()?.store.publishEvent
  • OAuth complete 在 REST 层手写 publishEvent

全局 get/setHttpAgentSessionRuntime 使 Host API 与 agent 运行时隐式耦合,不利于测试与多 agent 场景。

决策

D1. AgentStreamBus(每 orchestrator 一个实例)

  • bus.publish(AgentStreamEvent, ctx?)唯一 egress;producer 不再直接 triggerStream
  • Sinks:
    • HookSink — 调用 HookRegistry.triggerStream(..., { skipBus: true }) 防重入
    • HttpSessionSink — 过滤 ctx.httpSessionId,append SessionEventLog 并驱动 StepProjector / ParkController
  • TurnEvent 仅在 process-stream 映射一次;HttpTurnRunner 只调用 processStream,不再二次映射。

D2. SessionInteractionPort(仅阻塞交互)

  • requestApproval(opts): Promise<boolean> 抽象 IM AskUserBuiltinTool 与 HTTP HttpApprovalWaiter
  • Stream 事件(input.requested / input.completed)统一由 runToolApprovalGate 经 bus 发出
  • 删除 httpSessionId 分支与 onStreamEvent 回调参数

D3. HTTP Session 模块拆分

模块职责
SessionEventLogappend-only + subscribe
StepProjectorstep.* wire 投影
ParkControllerpending 同步 + mid-turn session.waiting
HttpTurnRunnerrunTurnprocessStream
HttpSessionSinkbus → log / projector / park
HttpAgentSessionStore薄 facade:start/continue/submitInput/hydrate

D4. AgentSessionHostPort(Host 注入)

  • 工厂 createAgentSessionHostPort({ getAgent, bus, dataDir? }) 装配 store、sinks、turn runner
  • create-zhin-agentroot.provide('agentSessionHost', port)priv.httpApprovalAdapter = port.httpApprovalAdapter
  • 删除 http-agent-session-runtime-registry.tsget/setHttpAgentSessionRuntime 公开 export
  • Host REST:registerZhinAgentStreamRoutes(router, base, port: AgentSessionHostPort)

D5. OAuth

  • authorization-flowpublish 回调发 authorization.*;REST complete 使用 port.publishHttpSessionEvent

后果

正面

  • 单点映射 TurnEvent → wire;NDJSON 重放与 hooks 订阅同源
  • Host API 显式依赖注入,测试可传 mock port
  • HTTP 审批 waiter 实例级,无进程单例

负面(Breaking)

  • 删除 set/getHttpAgentSessionRuntimegetHttpApprovalWaiterresolveHttpApproval exports;仓库内调用方须迁移

实现追踪

落点状态
AgentStreamBus + HookSinkevent/agent-stream-bus.tshook-stream-sink.ts已实现
process-stream / turn-pipeline 迁 busturn/process-stream.tsturn-pipeline.ts已实现
SessionInteractionPortsession/session-interaction-port.ts、IM/HTTP adapters已实现
tool-approval-gate + authorization-flowtool/tool-approval-gate.tsconnection/authorization-flow.ts已实现
Session 拆分 + HttpSessionSinksession/*已实现
AgentSessionHostPortsession/agent-session-host-port.ts已实现
Host 注入init/create-zhin-agent.tshost/api已实现

相关