@zhushanwen/subagent-engine-sdk 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-A75XDJIC.js → chunk-AIG5LSGK.js} +3 -0
- package/dist/{chunk-ZXEAW25V.js → chunk-BBVZK5DL.js} +1 -4
- package/dist/chunk-EUSM6ZX4.js +10 -0
- package/dist/{chunk-LEOBWKRM.js → chunk-FJT23P7T.js} +1 -1
- package/dist/{chunk-N3RL6OVM.js → chunk-J4G2MXDS.js} +3 -1
- package/dist/{chunk-ZOFFJNJD.js → chunk-LKPVN3N6.js} +1 -1
- package/dist/{chunk-RULLX6C6.js → chunk-LQR73V67.js} +2 -0
- package/dist/{chunk-YFSN3D5N.js → chunk-TGDMOLZU.js} +25 -17
- package/dist/{chunk-PPEPBVCC.js → chunk-WS4WAZVR.js} +1 -1
- package/dist/cli-entry.cjs +3 -1
- package/dist/cli-entry.js +1 -1
- package/dist/{contract-types-sSlgppBC.d.cts → contract-types-ByIFoLrY.d.cts} +18 -34
- package/dist/{contract-types-sSlgppBC.d.ts → contract-types-ByIFoLrY.d.ts} +18 -34
- package/dist/env.cjs +1 -4
- package/dist/env.d.cts +4 -1
- package/dist/env.d.ts +4 -1
- package/dist/env.js +1 -1
- package/dist/{error-codes-Dhss2Kmk.d.ts → error-codes-BUx92qYi.d.ts} +5 -4
- package/dist/{error-codes-DHco5-i_.d.cts → error-codes-DCiilt_8.d.cts} +5 -4
- package/dist/index.cjs +45 -23
- package/dist/index.d.cts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +16 -11
- package/dist/journal-io.d.cts +1 -1
- package/dist/journal-io.d.ts +1 -1
- package/dist/journal-replay.cjs +3 -0
- package/dist/journal-replay.d.cts +1 -1
- package/dist/journal-replay.d.ts +1 -1
- package/dist/journal-replay.js +1 -1
- package/dist/kill-chain.d.cts +2 -2
- package/dist/kill-chain.d.ts +2 -2
- package/dist/kill-chain.js +2 -2
- package/dist/node-executor.js +2 -2
- package/dist/port-contract.cjs +3 -0
- package/dist/port-contract.d.cts +41 -8
- package/dist/port-contract.d.ts +41 -8
- package/dist/port-contract.js +3 -1
- package/dist/protocol/index.cjs +26 -18
- package/dist/protocol/index.d.cts +95 -96
- package/dist/protocol/index.d.ts +95 -96
- package/dist/protocol/index.js +4 -4
- package/dist/ui-types.cjs +16 -0
- package/dist/ui-types.d.cts +13 -6
- package/dist/ui-types.d.ts +13 -6
- package/dist/ui-types.js +7 -1
- package/package.json +1 -1
- package/src/cli-entry.ts +6 -1
- package/src/data-dir.ts +3 -2
- package/src/env.ts +4 -4
- package/src/journal-replay.ts +4 -0
- package/src/port-contract.ts +40 -8
- package/src/protocol/contract-types.ts +20 -23
- package/src/protocol/engine-protocol.ts +19 -9
- package/src/protocol/error-codes.ts +7 -6
- package/src/protocol/methods.ts +38 -28
- package/src/protocol/reverse-channels.ts +15 -103
- package/src/protocol/schema.ts +36 -0
- package/src/ui-types.ts +22 -5
- package/dist/chunk-2DIMPZCQ.js +0 -0
package/src/port-contract.ts
CHANGED
|
@@ -28,8 +28,6 @@ import type {
|
|
|
28
28
|
AgentOutcome,
|
|
29
29
|
EngineCapabilities,
|
|
30
30
|
EngineHandleData,
|
|
31
|
-
InteractAction,
|
|
32
|
-
InteractResult,
|
|
33
31
|
ProbeReport,
|
|
34
32
|
ResumeAnchor,
|
|
35
33
|
SessionView,
|
|
@@ -64,7 +62,17 @@ export interface EngineStream {
|
|
|
64
62
|
onDelta(delta: string): void;
|
|
65
63
|
}
|
|
66
64
|
|
|
67
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* 无隔离池引擎的恒定池 key(pi / zcode 共用;值锚定):两引擎进程内全局一份运行态
|
|
67
|
+
* (pi = PI_CODING_AGENT_DIR 全局一份,zcode = 共享宿主 HOME + journal 固定分组),
|
|
68
|
+
* poolKey 恒本值。core(PI_POOL_KEY / JOURNAL_INITIAL_POOL_KEY)与两引擎包
|
|
69
|
+
* (PI_POOL_KEY / ZCODE_SHARED_POOL_KEY)的等值异名常量一律 = 本常量——**值逐字
|
|
70
|
+
* 不变**(存量 journal 落盘路径与记录含该值分段,改名不改值)。zcode 池化引擎在
|
|
71
|
+
* prepare 期经 ctx.onPoolResolved retarget 到实际池 key,与本占位值不冲突。
|
|
72
|
+
*/
|
|
73
|
+
export const SHARED_POOL_KEY = "shared";
|
|
74
|
+
|
|
75
|
+
/** run 的运行期上下文(core RunContext 结构等价镜像;resume? = 会话形态参数,缺省一次性任务)。 */
|
|
68
76
|
export interface RunContext {
|
|
69
77
|
taskId: string;
|
|
70
78
|
poolKey: string;
|
|
@@ -74,16 +82,41 @@ export interface RunContext {
|
|
|
74
82
|
stream?: EngineStream;
|
|
75
83
|
schemaEnv?: string;
|
|
76
84
|
engineFallback?: { from: string; reason: string };
|
|
85
|
+
/**
|
|
86
|
+
* [F6] 根 session id(协议 run.params.ctx.sessionRootId 的进程内还原)——pi 引擎
|
|
87
|
+
* relay 归属键 SESSION_ID 的权威来源。additive 可选:宿主缺省不传。
|
|
88
|
+
*/
|
|
89
|
+
sessionRootId?: string;
|
|
90
|
+
/**
|
|
91
|
+
* [Option C 协议化] 权威 subagent session 目录(协议 run.params.ctx.sessionDir 的
|
|
92
|
+
* 进程内还原)——pi 引擎组装 `--session-dir` 的唯一权威值(宿主
|
|
93
|
+
* getSubagentSessionDir 推导,引擎不自推导)。additive 可选:缺省走引擎内
|
|
94
|
+
* [LEGACY] fallback(独立运行/测试形态)。
|
|
95
|
+
*/
|
|
96
|
+
sessionDir?: string;
|
|
77
97
|
onPoolResolved?: (poolKey: string) => void;
|
|
78
98
|
onHandleReady?: (partial: Pick<EngineHandleData, "sessionRef" | "poolKey">) => void;
|
|
79
99
|
/** 一次性子进程 pid 上报(host/childSpawned 载荷形态;ChildProcess 句柄不跨协议面)。 */
|
|
80
100
|
onChildSpawned?: (child: { pid: number | undefined; killed: boolean }) => void;
|
|
81
101
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
|
|
102
|
+
* 子进程退出态上报(host/childStateChanged 载荷形态;SR-4 接线:宿主镜像据此取消
|
|
103
|
+
* 该 pid 的挂起 dialog)。引擎侧只在 exited 相位上报——running 由 onChildSpawned 覆盖。
|
|
104
|
+
*/
|
|
105
|
+
onChildStateChanged?: (p: {
|
|
106
|
+
pid: number;
|
|
107
|
+
recordId: string;
|
|
108
|
+
state: "running" | "exited";
|
|
109
|
+
killed: boolean;
|
|
110
|
+
exitCode?: number;
|
|
111
|
+
signal?: string;
|
|
112
|
+
}) => void;
|
|
113
|
+
/**
|
|
114
|
+
* [H1 U6 终态] resume 续聊参数(协议 run.params.resume 的进程内还原;唯一会话形态
|
|
115
|
+
* 键——原 v1.x `chat` 字段已随键切换退役)。recordId = 轮次关联键与镜像帧锚定键;
|
|
116
|
+
* resume 锚点存在 = 冷续(--session 续写原文件),不存在 = 首轮新建。缺省 =
|
|
117
|
+
* 一次性任务形态。
|
|
85
118
|
*/
|
|
86
|
-
|
|
119
|
+
resume?: { recordId: string; resume?: ResumeAnchor };
|
|
87
120
|
}
|
|
88
121
|
|
|
89
122
|
export interface EngineHandle {
|
|
@@ -101,7 +134,6 @@ export interface EnginePort {
|
|
|
101
134
|
capabilities(): EngineCapabilities;
|
|
102
135
|
probe(opts?: { force?: boolean }): Promise<ProbeReport>;
|
|
103
136
|
run(task: EngineAgentCallOpts, ctx: RunContext): Promise<EngineRunResult>;
|
|
104
|
-
interact(handle: EngineHandle, action: InteractAction): Promise<InteractResult>;
|
|
105
137
|
read(handle: EngineHandle): Promise<SessionView>;
|
|
106
138
|
listModels?(): Array<{ id: string; name?: string }> | null;
|
|
107
139
|
validateModel?(modelRef: string | undefined): { canonicalRef: string };
|
|
@@ -8,12 +8,15 @@
|
|
|
8
8
|
// - AgentEvent / AgentUsage / AgentUsageTotal / ToolCallResult / ToolCall /
|
|
9
9
|
// InternalToolCall / Turn ← core execution/types.ts(2026-09-09 实测 :164-:313)
|
|
10
10
|
// - ReplayedTurn / SessionView / EngineHandleData / EngineCapabilities / ProbeReport /
|
|
11
|
-
//
|
|
11
|
+
// AgentOutcome ← core execution/engine/types.ts
|
|
12
12
|
// - AgentFailureKind / AgentOutcomeUsage(core 名 AgentUsage,orchestration 版)/
|
|
13
13
|
// ToolCallEntry / AgentCallOpts 子集 ← core orchestration/models/types.ts
|
|
14
14
|
// - WorktreeHandle ← core execution/types.ts:349(SDK 结构等价副本——设计 §3.5.1
|
|
15
15
|
// 点名「AgentCallOpts.worktree 的 WorktreeHandle 即这类副本」)
|
|
16
16
|
//
|
|
17
|
+
// [H1] InteractAction / InteractResult 已随 chat-run 统一退役(U5 删除;
|
|
18
|
+
// docs/design/subagent-chat-run-unification.md §3.3 D5——续聊统一为新 run + resume)。
|
|
19
|
+
//
|
|
17
20
|
// core 域类型(ExecutionRecord / Turn 的宿主内部态消费)留 core;SDK 侧一切类型为
|
|
18
21
|
// 结构等价形态,漂移由双向可赋值断言(AssertMutuallyAssignable)在 typecheck 期抓出
|
|
19
22
|
// ——core 侧断言挂靠归 W2(本文件导出该类型助手供其复用),SDK 侧样板见
|
|
@@ -96,8 +99,12 @@ export interface Turn {
|
|
|
96
99
|
}
|
|
97
100
|
|
|
98
101
|
/**
|
|
99
|
-
* 引擎事件(
|
|
102
|
+
* 引擎事件(9 种,协议 event.params.event 逐字序列化——「事件与 handle 序列化逐字
|
|
100
103
|
* 兼容」不变量 3 的类型面)。语义锚点 = pi(ACP 词汇对照见 core execution/types.ts 注释)。
|
|
104
|
+
*
|
|
105
|
+
* activity = 纯活性信号:双侧 reducer no-op、不开 turn、不写状态、不落 journal
|
|
106
|
+
* (core journal-wiring 对其豁免 append),只承诺「引擎活跃时周期性出现」——供宿主
|
|
107
|
+
* 无进展守护刷新判活(长工具执行期)。节流属生产者实现细节,不进协议承诺。
|
|
101
108
|
*/
|
|
102
109
|
export type AgentEvent =
|
|
103
110
|
| { type: "tool_start"; toolName: string; args?: unknown }
|
|
@@ -107,6 +114,7 @@ export type AgentEvent =
|
|
|
107
114
|
| { type: "turn_end"; summary?: string }
|
|
108
115
|
| { type: "message_end"; usage?: AgentUsage; error?: string }
|
|
109
116
|
| { type: "compaction" }
|
|
117
|
+
| { type: "activity" }
|
|
110
118
|
| { type: "error"; message: string };
|
|
111
119
|
|
|
112
120
|
// ============================================================
|
|
@@ -114,7 +122,7 @@ export type AgentEvent =
|
|
|
114
122
|
// ============================================================
|
|
115
123
|
|
|
116
124
|
/**
|
|
117
|
-
* EngineHandle 的持久化形态(JSON v1)。协议 run 终态应答 /
|
|
125
|
+
* EngineHandle 的持久化形态(JSON v1)。协议 run 终态应答 / read 的
|
|
118
126
|
* handle 载荷(引擎不持有宿主运行时引用,data 即全部)。
|
|
119
127
|
*/
|
|
120
128
|
export interface EngineHandleData {
|
|
@@ -135,11 +143,10 @@ export interface EngineHandleData {
|
|
|
135
143
|
|
|
136
144
|
/**
|
|
137
145
|
* [v1.x] 冷续 resume 锚点——EngineHandleData 定位键的投影子集(诊断字段
|
|
138
|
-
* v/engineVersion/adapterVersion
|
|
139
|
-
* - run.params.
|
|
140
|
-
* sessionRef.sessionFile —— 对照 core SpawnResumeOpts.sessionFile
|
|
141
|
-
*
|
|
142
|
-
* 宿主据此刷新冷续依据——pi 定位键形态同 EngineHandleData.sessionRef 注释)。
|
|
146
|
+
* v/engineVersion/adapterVersion 不属锚点语义,不随锚点走)。消费点:
|
|
147
|
+
* - run.params.resume(宿主 → 引擎:冷续重开已 idle 的 session,pi 消费
|
|
148
|
+
* sessionRef.sessionFile —— 对照 core SpawnResumeOpts.sessionFile 的锚点面)。
|
|
149
|
+
* [H1 U6 已切换] 键切换单批完成(读写端同批),锚点仅经 resume 键携带。
|
|
143
150
|
* 类型层与 EngineHandleData 定位形态的对照由测试断言(Pick 可赋值闭包)锁定。
|
|
144
151
|
*/
|
|
145
152
|
export interface ResumeAnchor {
|
|
@@ -188,7 +195,11 @@ export interface EngineCapabilities {
|
|
|
188
195
|
schemaEnforcement: "native" | "emulated";
|
|
189
196
|
/** 注意区分「引擎 RPC 层有此能力」与「subagent 链路已接通」。 */
|
|
190
197
|
steer: "native" | "emulated" | "unsupported";
|
|
191
|
-
/**
|
|
198
|
+
/**
|
|
199
|
+
* [H1 D5 语义收窄] resume 能力位(chat 续聊 = 新 run + resume 锚点的承载前提;
|
|
200
|
+
* 原名字沿用——conversation 位保留、语义从「interact 长驻控制面」收窄为
|
|
201
|
+
* 「resume 续聊能力」,gate 判据与消费方不变)。
|
|
202
|
+
*/
|
|
192
203
|
conversation: "native" | "unsupported";
|
|
193
204
|
/** 决定 persona 路由策略(file/flag/prompt 通道)。 */
|
|
194
205
|
personaInjection: "file" | "flag" | "prompt";
|
|
@@ -218,20 +229,6 @@ export interface ProbeReport {
|
|
|
218
229
|
error?: { code: string; recovery: string };
|
|
219
230
|
}
|
|
220
231
|
|
|
221
|
-
/**
|
|
222
|
-
* interact 的 action(交互控制面)。interrupt: true = steer(抢占)/ false|缺省 =
|
|
223
|
-
* followUp(排队);不支持抢占的引擎忽略。
|
|
224
|
-
*/
|
|
225
|
-
export type InteractAction =
|
|
226
|
-
| { kind: "message"; payload: string; interrupt?: boolean }
|
|
227
|
-
| { kind: "close"; payload?: { force: boolean } }
|
|
228
|
-
| { kind: "cancel" };
|
|
229
|
-
|
|
230
|
-
/** interact 的结果(失败码 = engine_session_not_resumable / engine_capability_unsupported 等)。 */
|
|
231
|
-
export type InteractResult =
|
|
232
|
-
| { ok: true; delivered: true }
|
|
233
|
-
| { ok: false; code: string; message: string };
|
|
234
|
-
|
|
235
232
|
// ============================================================
|
|
236
233
|
// 终态 / 任务声明
|
|
237
234
|
// ============================================================
|
|
@@ -10,14 +10,25 @@
|
|
|
10
10
|
// engine_protocol_mismatch(含双方版本 + 升级指引),该引擎标记不可用,
|
|
11
11
|
// 不影响其他引擎与宿主。
|
|
12
12
|
//
|
|
13
|
-
// [v1.x 增量语义(chat-domain 设计 §3.2 D1-A/§3.3)]
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
13
|
+
// [v1.x 增量语义(chat-domain 设计 §3.2 D1-A/§3.3)][H1 后历史叙述——run.params.chat
|
|
14
|
+
// 已随 U6 删除,现唯一会话形态键 = run.params.resume]:chat 域增量(原 run.params.chat
|
|
15
|
+
// 可选参数、host/streamDelta 的 recordId 关联形态)曾以**可选载荷/可选参数**形态向后
|
|
16
|
+
// 兼容,major 不 bump、不引入 minor 协商位:
|
|
17
|
+
// - 新 core × 旧引擎:conversation 请求(resume 续聊形态)被 conversation gate
|
|
18
|
+
// 同步拒(manifest 无 gate 位,
|
|
17
19
|
// A6 方向——engine_capability_unsupported + 升级引擎包指引);run 域零影响;
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
20
|
+
// 事件变体增量同政策(例:activity 活性信号变体):新变体以可选载荷形态进
|
|
21
|
+
// union,旧宿主 runtime 对其 no-op(reducer default 分支安全落空 / journal
|
|
22
|
+
// 豁免面不感知),协议版本维持 1、不 bump。
|
|
23
|
+
//
|
|
24
|
+
// [H1 双键过渡(chat-run 统一,docs/design/subagent-chat-run-unification.md §3.3
|
|
25
|
+
// D3 + §5 U1 行)][H1 U6 已切换]:run.params.resume 曾与原 run.params.chat 载荷
|
|
26
|
+
// 同形并存(additive 可选,协议版本维持 1);U1 只加键——U2-U5 过渡期 core 恒
|
|
27
|
+
// 构造旧 `chat` 键、pi 引擎恒读 `ctx.chat`。U6 已单批同时切换写端(core 构造
|
|
28
|
+
// resume)与读端(pi 改读)并删 `chat` 键,resume 现为唯一会话形态键——全程不存在
|
|
29
|
+
// 「写新读旧」窗口(错配 = resume 静默失效、每轮新文件、sessionFile 被覆盖)。
|
|
30
|
+
// 同批退役已落地:轮次相位反向通道与 interact 方法已随 U5 删除(D5——续聊轮统一
|
|
31
|
+
// 为新 run + resume 锚点,轮次终态由 run 应答承载)。
|
|
21
32
|
|
|
22
33
|
/** 协议版本(引擎包 manifest `xyz-agent.subagentEngine.protocol` 与 initialize 应答同值)。 */
|
|
23
34
|
export const ENGINE_PROTOCOL_VERSION = 1;
|
|
@@ -73,8 +84,7 @@ export const ENGINE_EVENT_COALESCE_DEFAULT = "0";
|
|
|
73
84
|
/**
|
|
74
85
|
* 反向请求超时二分(帧④注释,R9-2):
|
|
75
86
|
* - 数据面类(host/log / host/streamDelta / host/poolResolved / host/handleReady /
|
|
76
|
-
* host/childSpawned / host/childStateChanged
|
|
77
|
-
* 引擎故障;
|
|
87
|
+
* host/childSpawned / host/childStateChanged):10s 未答 = 引擎故障;
|
|
78
88
|
* - 人机交互类(host/askUser / host/permission):不设统一超时——core 先回 {ack:true},
|
|
79
89
|
* 结果异步到达;按 ADR-0047「静默 ≠ 卡死」用无进展检测/用户取消,不据此判引擎故障。
|
|
80
90
|
*/
|
|
@@ -101,12 +101,13 @@ export function engineProtocolMismatchError(engineVersion: number): EngineSdkErr
|
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
// ============================================================
|
|
104
|
-
// [v1.x] conversation gate 位负向:
|
|
104
|
+
// [v1.x] conversation gate 位负向:conversation 请求(resume 续聊会话形态)同步拒
|
|
105
105
|
// ============================================================
|
|
106
106
|
|
|
107
107
|
/**
|
|
108
|
-
* [v1.x]
|
|
109
|
-
* 验收 A6:manifest 无 conversation gate 位的引擎收到
|
|
108
|
+
* [v1.x] resume 会话形态(run.params.resume)的 gate 拒绝具名错误(chat-domain
|
|
109
|
+
* 设计 §3.2 D1-A + 验收 A6:manifest 无 conversation gate 位的引擎收到
|
|
110
|
+
* conversation 请求 → 同步拒;[H1] 文案随 D5 语义收窄——续聊 = resume 续聊)。
|
|
110
111
|
* 文案契约对齐 core capability-gate.ts conversation 分支(错误码
|
|
111
112
|
* engine_capability_unsupported + 「去掉参数 / 修 manifest / 升级引擎包」恢复指引)
|
|
112
113
|
* ——W3 chat 路由切协议客户端时以本构造器替换 core 内联文案,保持两侧一致。
|
|
@@ -114,15 +115,15 @@ export function engineProtocolMismatchError(engineVersion: number): EngineSdkErr
|
|
|
114
115
|
export function engineConversationUnsupportedError(engineId: string): EngineSdkError {
|
|
115
116
|
return new EngineSdkError(
|
|
116
117
|
"engine_capability_unsupported",
|
|
117
|
-
`engine '${engineId}' 不支持
|
|
118
|
-
`manifest 无 conversation gate
|
|
118
|
+
`engine '${engineId}' 不支持 resume 续聊(capabilities.conversation = 'unsupported',` +
|
|
119
|
+
`manifest 无 conversation gate 位)`,
|
|
119
120
|
`去掉 conversation 参数(一次性任务默认形态),或修 manifest capabilities / 升级引擎包(若引擎实际支持该能力)`,
|
|
120
121
|
{ engineId, capability: "conversation", declared: "unsupported" },
|
|
121
122
|
);
|
|
122
123
|
}
|
|
123
124
|
|
|
124
125
|
/**
|
|
125
|
-
* [v1.x]
|
|
126
|
+
* [v1.x] resume 会话形态(run.params.resume / task.conversation=true)派发前的同步 gate:
|
|
126
127
|
* manifest conversation 位 unsupported 即抛 engineConversationUnsupportedError——
|
|
127
128
|
* 进程/record 创建前同步拒(A6:run 域不受影响,仅 chat 面被拦)。
|
|
128
129
|
* 判据单源:core 侧 capability-gate.assertTaskShapeSupported 的 conversation 分支
|
package/src/protocol/methods.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// src/protocol/methods.ts
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
// 设计 §3.3 方法集表 + impl-plan §2.1「10
|
|
3
|
+
// 9 正向方法(core → 引擎)params/result 逐方法写死(v1)。设计权威源:
|
|
4
|
+
// 设计 §3.3 方法集表 + impl-plan §2.1「10 正向方法」([H1] 收敛为 9)。
|
|
5
5
|
//
|
|
6
|
-
// [v1.x 增量(chat-domain 设计 §3.2 D1-A)]
|
|
7
|
-
// +
|
|
8
|
-
// run
|
|
6
|
+
// [v1.x 增量(chat-domain 设计 §3.2 D1-A)]:增量以可选参数形态落在 run.params.chat
|
|
7
|
+
// (会话形态参数 + 冷续 resume 锚点),major 不 bump。[H1] chat-run 统一后续聊 =
|
|
8
|
+
// 新 run + resume 锚点(docs/design/subagent-chat-run-unification.md §3.3 D5/D7),
|
|
9
|
+
// 既有 interact 方法已随 U5 删除,方法集收敛为 9 个。
|
|
9
10
|
//
|
|
10
11
|
// 应答面补充约定(设计 §3.3):initialize 应答仅诊断(与 manifest 不一致 → warn 留痕,
|
|
11
12
|
// 不参与同步成员判据;唯一阻断面 = 被 gate 能力位多声明 → engine_capability_mismatch);
|
|
@@ -17,21 +18,22 @@ import type {
|
|
|
17
18
|
EngineCapabilities,
|
|
18
19
|
EngineHandleData,
|
|
19
20
|
AgentOutcome,
|
|
20
|
-
InteractAction,
|
|
21
|
-
InteractResult,
|
|
22
21
|
ModelCatalogEntry,
|
|
23
22
|
ProbeReport,
|
|
24
23
|
ResumeAnchor,
|
|
25
24
|
SessionView,
|
|
26
25
|
} from "./contract-types.ts";
|
|
27
26
|
|
|
28
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* 正向方法名联合(恰好 9 个;PROTOCOL_METHODS 常量数组与之同源互证)。
|
|
29
|
+
* [H1] `interact` 成员已随 chat-run 统一退役(docs/design/subagent-chat-run-unification.md
|
|
30
|
+
* §3.3 D5:续聊轮统一为「新 run + resume 锚点」,U5 删除)。
|
|
31
|
+
*/
|
|
29
32
|
export type ProtocolMethod =
|
|
30
33
|
| "initialize"
|
|
31
34
|
| "probe"
|
|
32
35
|
| "run"
|
|
33
36
|
| "cancel"
|
|
34
|
-
| "interact"
|
|
35
37
|
| "read"
|
|
36
38
|
| "listModels"
|
|
37
39
|
| "validateModel"
|
|
@@ -44,7 +46,6 @@ export const PROTOCOL_METHODS = [
|
|
|
44
46
|
"probe",
|
|
45
47
|
"run",
|
|
46
48
|
"cancel",
|
|
47
|
-
"interact",
|
|
48
49
|
"read",
|
|
49
50
|
"listModels",
|
|
50
51
|
"validateModel",
|
|
@@ -74,24 +75,40 @@ export interface RunContextParams {
|
|
|
74
75
|
engineFallback?: { from: string; reason: string };
|
|
75
76
|
/** 事件粒度请求(引擎按 capabilities.eventGranularity 实际能力执行)。 */
|
|
76
77
|
streamMode?: "stream" | "coarse";
|
|
78
|
+
/**
|
|
79
|
+
* [F6] 根 session id——pi 引擎 relay 归属键 SESSION_ID 的权威来源(生产三来源
|
|
80
|
+
* ①本字段 ②宿主 env ③根进程 env 中,宿主派发恒走①)。additive 可选:旧引擎忽略
|
|
81
|
+
* 未知字段,undefined 不上 wire。
|
|
82
|
+
*/
|
|
83
|
+
sessionRootId?: string;
|
|
84
|
+
/**
|
|
85
|
+
* [Option C 协议化] 权威 subagent session 目录——宿主以 getSubagentSessionDir
|
|
86
|
+
* (agentDir, rootCwd) 推导(宿主单一权威,Fix Gate B S6:引擎本地推导与宿主布局
|
|
87
|
+
* 三处不等价 → 跨重启续聊链断裂)。引擎用它组装 pi `--session-dir`,不自推导;
|
|
88
|
+
* 缺省(独立运行/测试)走引擎内 [LEGACY] fallback。additive 可选:旧引擎忽略
|
|
89
|
+
* 未知字段,undefined 不上 wire。
|
|
90
|
+
*/
|
|
91
|
+
sessionDir?: string;
|
|
77
92
|
}
|
|
78
93
|
|
|
79
94
|
// ============================================================
|
|
80
|
-
// [
|
|
95
|
+
// [H1] run 的 resume 会话形态参数(chat-run 统一终态;原 v1.x chat 键已退役)
|
|
81
96
|
// ============================================================
|
|
82
97
|
|
|
83
98
|
/**
|
|
84
|
-
* [
|
|
85
|
-
*
|
|
99
|
+
* [H1] run 的 resume 会话形态参数(设计 docs/design/subagent-chat-run-unification.md
|
|
100
|
+
* §3.3 D3 + §5 U1/U6 行):原 RunChatParams(v1.x chat 会话形态参数)的泛化改名终态,
|
|
101
|
+
* 载荷同形(recordId + resume 锚点,ResumeAnchor 不变),仅键名从「chat 会话形态」
|
|
102
|
+
* 泛化为「resume 续聊」。
|
|
86
103
|
* - recordId:core 预建 record 的关联键(引擎据此回填 handle.sessionRef、上报
|
|
87
|
-
* host/childSpawned|childStateChanged
|
|
104
|
+
* host/childSpawned|childStateChanged 的 record 键形态);
|
|
88
105
|
* - resume:冷续锚点(重开已 idle 的 session 续聊;缺省 = 新 session)。对照
|
|
89
106
|
* core SpawnResumeOpts——sessionFile 经 anchor.sessionRef 携带,model/
|
|
90
107
|
* thinkingLevel 防漂移覆盖走既有 task/ctx 字段,不双写。
|
|
91
|
-
*
|
|
92
|
-
*
|
|
108
|
+
* [H1 U6 已切换] `chat` 键整体退役(读写端同批切换,无「写新读旧」窗口),本键为
|
|
109
|
+
* 唯一会话形态参数。载荷 schema 权威 = runSessionParamsSchema(schema.ts)。
|
|
93
110
|
*/
|
|
94
|
-
export interface
|
|
111
|
+
export interface RunResumeParams {
|
|
95
112
|
recordId: string;
|
|
96
113
|
resume?: ResumeAnchor;
|
|
97
114
|
}
|
|
@@ -127,11 +144,11 @@ export interface RunParams {
|
|
|
127
144
|
task: AgentCallOpts;
|
|
128
145
|
ctx: RunContextParams;
|
|
129
146
|
/**
|
|
130
|
-
* [
|
|
131
|
-
*
|
|
132
|
-
* 帧级 schema params
|
|
147
|
+
* [H1 U6 终态] resume 续聊参数(唯一会话形态键;原 v1.x `chat` 键已随键切换退役,
|
|
148
|
+
* 见 RunResumeParams)。缺省 = 一次性任务形态(向后兼容:旧引擎忽略未知字段,
|
|
149
|
+
* 帧级 schema params 不做深校验)。additive 可选:undefined 不上 wire。
|
|
133
150
|
*/
|
|
134
|
-
|
|
151
|
+
resume?: RunResumeParams;
|
|
135
152
|
}
|
|
136
153
|
|
|
137
154
|
/** run 终态应答(期间事件经 event 通知;长运行方法,应答到达即终态)。 */
|
|
@@ -153,11 +170,6 @@ export interface CancelResult {
|
|
|
153
170
|
ok: true;
|
|
154
171
|
}
|
|
155
172
|
|
|
156
|
-
export interface InteractParams {
|
|
157
|
-
handle: EngineHandleData;
|
|
158
|
-
action: InteractAction;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
173
|
export interface ReadParams {
|
|
162
174
|
handle: EngineHandleData;
|
|
163
175
|
/** 数据根必填:存量池时代引擎自算池/journal 相对 dbPath 的定位需要它(设计钉死)。 */
|
|
@@ -206,7 +218,6 @@ export interface ProtocolParamsMap {
|
|
|
206
218
|
probe: ProbeParams;
|
|
207
219
|
run: RunParams;
|
|
208
220
|
cancel: CancelParams;
|
|
209
|
-
interact: InteractParams;
|
|
210
221
|
read: ReadParams;
|
|
211
222
|
listModels: ListModelsParams;
|
|
212
223
|
validateModel: ValidateModelParams;
|
|
@@ -220,7 +231,6 @@ export interface ProtocolResultMap {
|
|
|
220
231
|
probe: ProbeReport;
|
|
221
232
|
run: RunResult;
|
|
222
233
|
cancel: CancelResult;
|
|
223
|
-
interact: InteractResult;
|
|
224
234
|
read: SessionView;
|
|
225
235
|
listModels: ListModelsResult;
|
|
226
236
|
validateModel: ValidateModelResult;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// src/protocol/reverse-channels.ts
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
// 设计 §3.3 方法集表 host/* 行 + impl-plan §2.1「8
|
|
5
|
-
//
|
|
6
|
-
//
|
|
3
|
+
// 8 反向通道(引擎 → core,帧④,必须应答)载荷与超时二分。设计权威源:
|
|
4
|
+
// 设计 §3.3 方法集表 host/* 行 + impl-plan §2.1「8 反向通道」与「反向请求超时二分」。
|
|
5
|
+
// [H1] chat 域 v1.x 增量曾新增的第 9 通道(轮次相位帧)已随 chat-run 统一退役
|
|
6
|
+
// (docs/design/subagent-chat-run-unification.md §3.3 D5,U5 删除)——轮次终态
|
|
7
|
+
// 改由 run 应答(agent_settled resolve)承载,通道集收敛回 8 个。
|
|
7
8
|
//
|
|
8
9
|
// 应答约定:数据面类回 {ok:true}(REVERSE_REQUEST_TIMEOUT_MS=10s 未答 = 引擎故障 →
|
|
9
10
|
// 杀进程 + 在途 run 失败);人机交互类走 ack 两阶段——先回 {ack:true},结果异步到达
|
|
@@ -12,10 +13,10 @@
|
|
|
12
13
|
|
|
13
14
|
import type { ReverseRequestTimeoutClass } from "./engine-protocol.ts";
|
|
14
15
|
import type { UiRequest, UiResponse } from "../ui-types.ts";
|
|
15
|
-
import type { AgentUsage, ResumeAnchor } from "./contract-types.ts";
|
|
16
|
-
import type { ProtocolError } from "./frames.ts";
|
|
17
16
|
|
|
18
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* 反向通道名联合(恰好 8 个;REVERSE_CHANNELS 常量数组与之同源互证)。
|
|
19
|
+
*/
|
|
19
20
|
export type ReverseChannel =
|
|
20
21
|
| "host/log"
|
|
21
22
|
| "host/askUser"
|
|
@@ -24,9 +25,11 @@ export type ReverseChannel =
|
|
|
24
25
|
| "host/poolResolved"
|
|
25
26
|
| "host/handleReady"
|
|
26
27
|
| "host/childSpawned"
|
|
27
|
-
| "host/childStateChanged"
|
|
28
|
-
| "host/roundLifecycle";
|
|
28
|
+
| "host/childStateChanged";
|
|
29
29
|
|
|
30
|
+
/**
|
|
31
|
+
* 通道名全集(运行时顺序化枚举;与 ReverseChannel 的同源关系由测试断言)。
|
|
32
|
+
*/
|
|
30
33
|
export const REVERSE_CHANNELS = [
|
|
31
34
|
"host/log",
|
|
32
35
|
"host/askUser",
|
|
@@ -36,13 +39,11 @@ export const REVERSE_CHANNELS = [
|
|
|
36
39
|
"host/handleReady",
|
|
37
40
|
"host/childSpawned",
|
|
38
41
|
"host/childStateChanged",
|
|
39
|
-
"host/roundLifecycle",
|
|
40
42
|
] as const satisfies readonly ReverseChannel[];
|
|
41
43
|
|
|
42
44
|
/**
|
|
43
45
|
* 超时二分归属(10s 数据面 / 不设统一超时的人机交互面)。实现归 W2 EngineClient;
|
|
44
46
|
* 引擎侧自灭计时(W12)复用同表——已 ack 的 askUser 等待不计入 in-flight(R9-2)。
|
|
45
|
-
* host/roundLifecycle 属数据面(终态回执语义:宿主必须确认收到,10s 未答 = 引擎故障)。
|
|
46
47
|
*/
|
|
47
48
|
export const REVERSE_CHANNEL_TIMEOUT_CLASS: Record<ReverseChannel, ReverseRequestTimeoutClass> = {
|
|
48
49
|
"host/log": "data-plane",
|
|
@@ -51,7 +52,6 @@ export const REVERSE_CHANNEL_TIMEOUT_CLASS: Record<ReverseChannel, ReverseReques
|
|
|
51
52
|
"host/handleReady": "data-plane",
|
|
52
53
|
"host/childSpawned": "data-plane",
|
|
53
54
|
"host/childStateChanged": "data-plane",
|
|
54
|
-
"host/roundLifecycle": "data-plane",
|
|
55
55
|
"host/askUser": "interaction",
|
|
56
56
|
"host/permission": "interaction",
|
|
57
57
|
};
|
|
@@ -97,11 +97,9 @@ export type HostPermissionResult = { approved: boolean } | { unsupported: true }
|
|
|
97
97
|
/**
|
|
98
98
|
* host/streamDelta:UI 实时通道(双通道之一;与 event 通知并行的渲染加速面)。
|
|
99
99
|
*
|
|
100
|
-
* [
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* - interact 发起的续聊轮:**recordId** 关联(续聊轮无独立 runId——InteractParams/
|
|
104
|
-
* InteractResult 均不含,recordId 经 handle.sessionRef 送达引擎)。
|
|
100
|
+
* [H1 U6 现行语义] 关联键恒 runId(run 域轮与 chat 续聊轮已统一为 run——续聊轮
|
|
101
|
+
* 是携带 resume 锚点的新 run,runId 由 core 在 run 帧分配)。recordId 键分支是
|
|
102
|
+
* v1.x 旧引擎的兼容载荷形态(存量兼容读,现行引擎不写)。
|
|
105
103
|
* 两键互斥(undefined 孪生位防双填),消费侧经 isHostStreamDeltaParams 收窄。
|
|
106
104
|
*/
|
|
107
105
|
export type HostStreamDeltaParams =
|
|
@@ -163,90 +161,6 @@ export interface HostChildStateChangedParams {
|
|
|
163
161
|
signal?: string;
|
|
164
162
|
}
|
|
165
163
|
|
|
166
|
-
// ============================================================
|
|
167
|
-
// [v1.x] host/roundLifecycle:轮次生命周期载荷(chat 域 v1.x 唯一新通道)
|
|
168
|
-
// ============================================================
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* 轮次关联键(D1-A 裁定的类型面):run 域轮 = runId(v1 现状);interact 续聊轮 =
|
|
172
|
-
* recordId(经 handle.sessionRef)。undefined 孪生位保证两键互斥。
|
|
173
|
-
*/
|
|
174
|
-
export interface RoundKeyedByRun {
|
|
175
|
-
runId: string;
|
|
176
|
-
recordId?: undefined;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
export interface RoundKeyedByRecord {
|
|
180
|
-
recordId: string;
|
|
181
|
-
runId?: undefined;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* 轮次终态相位(事件即 record 回写载体——chat 域 record 处置由相位一一映射,
|
|
186
|
-
* 设计 D2 裁决表 conversation 行:settled/idle 轮收口不终态、failed 标 failed):
|
|
187
|
-
* - settled:轮收敛(输出完整)。消费点 = settled-watchdog disarm + D3 abort
|
|
188
|
-
* 收敛判据(cancel 受理后等本事件,超 CANCEL_SETTLE_GRACE_MS 走杀链);
|
|
189
|
-
* - idle:轮收口 + 会话进 idle 稳态(core 侧 doFinalizeRoundToIdle + idle 定时器
|
|
190
|
-
* 锚点)。settled 与 idle 是两个锚点:watchdog 在 settled 即解除,idle 管置闲;
|
|
191
|
-
* - failed:轮异常终止(引擎自知失败,如 EPIPE 兜底耗尽)——error 如实上报,
|
|
192
|
-
* record 标 failed(与 run 域 AgentOutcome.error 的「失败收口」语义对齐)。
|
|
193
|
-
* usage 为本轮 message_end 增量(interact 续聊轮无 event 通知通道,用量经本帧回填)。
|
|
194
|
-
* 不设 seq:stdio NDJSON 单连接有序 + 数据面应答确认,无重排/重放面(与 event
|
|
195
|
-
* 通知的 seq 对照——后者镜像进程内事件流基线,本帧无基线可镜像)。
|
|
196
|
-
*/
|
|
197
|
-
export interface RoundSettledPhase {
|
|
198
|
-
phase: "settled";
|
|
199
|
-
usage?: AgentUsage;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
export interface RoundIdlePhase {
|
|
203
|
-
phase: "idle";
|
|
204
|
-
usage?: AgentUsage;
|
|
205
|
-
/** 冷续锚点回填(session 滚动/compaction 后锚点可能变化,宿主按帧刷新)。 */
|
|
206
|
-
anchor?: ResumeAnchor;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
export interface RoundFailedPhase {
|
|
210
|
-
phase: "failed";
|
|
211
|
-
/** 失败原因(结构对齐协议 error 帧——code/message/recovery 可操作闭环)。 */
|
|
212
|
-
error: ProtocolError;
|
|
213
|
-
anchor?: ResumeAnchor;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/** 相位联合(消费侧 switch(phase) 判别用)。 */
|
|
217
|
-
export type RoundLifecyclePhase = RoundSettledPhase | RoundIdlePhase | RoundFailedPhase;
|
|
218
|
-
|
|
219
|
-
/** host/roundLifecycle 载荷:关联键(run|record)× 相位(settled|idle|failed)。 */
|
|
220
|
-
export type HostRoundLifecycleParams =
|
|
221
|
-
| (RoundKeyedByRun & RoundSettledPhase)
|
|
222
|
-
| (RoundKeyedByRun & RoundIdlePhase)
|
|
223
|
-
| (RoundKeyedByRun & RoundFailedPhase)
|
|
224
|
-
| (RoundKeyedByRecord & RoundSettledPhase)
|
|
225
|
-
| (RoundKeyedByRecord & RoundIdlePhase)
|
|
226
|
-
| (RoundKeyedByRecord & RoundFailedPhase);
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* roundLifecycle 载荷结构判定:关联键互斥 + phase 词表 + 各相位专属形状
|
|
230
|
-
* (failed 必含 error.code/message)。引擎侧发帧前自检与 core 侧消费共用,
|
|
231
|
-
* 防两侧各写一份判别(与 isHostStreamDeltaParams 同理)。
|
|
232
|
-
*/
|
|
233
|
-
export function isHostRoundLifecycleParams(value: unknown): value is HostRoundLifecycleParams {
|
|
234
|
-
if (typeof value !== "object" || value === null) return false;
|
|
235
|
-
const v = value as Record<string, unknown>;
|
|
236
|
-
const hasRunId = typeof v.runId === "string";
|
|
237
|
-
const hasRecordId = typeof v.recordId === "string";
|
|
238
|
-
if (hasRunId === hasRecordId) return false;
|
|
239
|
-
if (v.phase === "settled" || v.phase === "idle") return true;
|
|
240
|
-
if (v.phase !== "failed") return false;
|
|
241
|
-
const err = v.error;
|
|
242
|
-
return (
|
|
243
|
-
typeof err === "object" &&
|
|
244
|
-
err !== null &&
|
|
245
|
-
typeof (err as Record<string, unknown>).code === "string" &&
|
|
246
|
-
typeof (err as Record<string, unknown>).message === "string"
|
|
247
|
-
);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
164
|
/** 通道 → 载荷类型映射。 */
|
|
251
165
|
export interface ReverseChannelParamsMap {
|
|
252
166
|
"host/log": HostLogParams;
|
|
@@ -257,7 +171,6 @@ export interface ReverseChannelParamsMap {
|
|
|
257
171
|
"host/handleReady": HostHandleReadyParams;
|
|
258
172
|
"host/childSpawned": HostChildSpawnedParams;
|
|
259
173
|
"host/childStateChanged": HostChildStateChangedParams;
|
|
260
|
-
"host/roundLifecycle": HostRoundLifecycleParams;
|
|
261
174
|
}
|
|
262
175
|
|
|
263
176
|
/** 通道 → 异步/同步结果类型映射(ack 两阶段通道的第二阶段 result)。 */
|
|
@@ -270,5 +183,4 @@ export interface ReverseChannelResultMap {
|
|
|
270
183
|
"host/handleReady": { ok: true };
|
|
271
184
|
"host/childSpawned": { ok: true };
|
|
272
185
|
"host/childStateChanged": { ok: true };
|
|
273
|
-
"host/roundLifecycle": { ok: true };
|
|
274
186
|
}
|
package/src/protocol/schema.ts
CHANGED
|
@@ -103,6 +103,7 @@ export const notificationFrameSchema = {
|
|
|
103
103
|
"turn_end",
|
|
104
104
|
"message_end",
|
|
105
105
|
"compaction",
|
|
106
|
+
"activity",
|
|
106
107
|
"error",
|
|
107
108
|
],
|
|
108
109
|
},
|
|
@@ -152,3 +153,38 @@ export const FORBIDDEN_CREDENTIAL_KEY_FRAGMENTS = [
|
|
|
152
153
|
|
|
153
154
|
/** 反向通道名词表导出(schema enum 与 W2 路由同源)。 */
|
|
154
155
|
export const REVERSE_CHANNEL_NAMES: readonly ReverseChannel[] = REVERSE_CHANNELS;
|
|
156
|
+
|
|
157
|
+
// ============================================================
|
|
158
|
+
// [H1] run 会话形态参数载荷 schema(resume 单键校验权威)
|
|
159
|
+
// ============================================================
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* run.params 的会话形态参数载荷 schema(draft-07 深载荷片段)。设计权威源:
|
|
163
|
+
* docs/design/subagent-chat-run-unification.md §3.3 D3 + §5 U1/U6 行。
|
|
164
|
+
*
|
|
165
|
+
* [H1 U6 已切换] 键切换单批完成后本 schema 面向唯一键 `resume`(RunResumeParams:
|
|
166
|
+
* recordId + 可选 ResumeAnchor),形状不变。帧级 schema(requestFrameSchema.params)
|
|
167
|
+
* 刻意不做深校验(见本文件头注释),本片段供消费方(引擎读端结构化报错 / 测试正负
|
|
168
|
+
* 样本)按需深校验。
|
|
169
|
+
*/
|
|
170
|
+
export const runSessionParamsSchema = {
|
|
171
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
172
|
+
title: "EngineRunSessionParams",
|
|
173
|
+
type: "object",
|
|
174
|
+
additionalProperties: false,
|
|
175
|
+
required: ["recordId"],
|
|
176
|
+
properties: {
|
|
177
|
+
recordId: { type: "string" },
|
|
178
|
+
resume: {
|
|
179
|
+
type: "object",
|
|
180
|
+
additionalProperties: false,
|
|
181
|
+
required: ["sessionRef", "poolKey"],
|
|
182
|
+
properties: {
|
|
183
|
+
// ResumeAnchor.sessionRef = Record<string, string>(引擎定位键值对)
|
|
184
|
+
sessionRef: { type: "object", additionalProperties: { type: "string" } },
|
|
185
|
+
poolKey: { type: "string" },
|
|
186
|
+
journalPath: { type: "string" },
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
} as const;
|