@zhushanwen/subagent-engine-sdk 0.2.1 → 0.4.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-TW2FAMAJ.js} +24 -32
- 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-C71Sqq8d.d.cts} +31 -43
- package/dist/{contract-types-sSlgppBC.d.ts → contract-types-C71Sqq8d.d.ts} +31 -43
- 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-CiOO3PMg.d.cts} +7 -7
- package/dist/{error-codes-DHco5-i_.d.cts → error-codes-D5YlWaBx.d.ts} +7 -7
- package/dist/index.cjs +45 -41
- package/dist/index.d.cts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +16 -15
- 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 +45 -11
- package/dist/port-contract.d.ts +45 -11
- package/dist/port-contract.js +3 -1
- package/dist/protocol/index.cjs +26 -36
- package/dist/protocol/index.d.cts +95 -172
- package/dist/protocol/index.d.ts +95 -172
- package/dist/protocol/index.js +4 -8
- 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/nesting-guard.ts +1 -1
- package/src/paths.ts +1 -1
- package/src/port-contract.ts +44 -11
- package/src/protocol/contract-types.ts +36 -35
- package/src/protocol/engine-protocol.ts +22 -12
- package/src/protocol/error-codes.ts +7 -6
- package/src/protocol/frames.ts +1 -3
- package/src/protocol/methods.ts +38 -30
- package/src/protocol/reverse-channels.ts +21 -172
- package/src/protocol/schema.ts +34 -3
- package/src/ui-types.ts +22 -5
- package/dist/chunk-2DIMPZCQ.js +0 -0
package/src/env.ts
CHANGED
|
@@ -23,16 +23,16 @@ export const ENGINE_ENV_PREFIXES: readonly string[] = [
|
|
|
23
23
|
'XYZ_', 'XYZ_AGENT_', 'XYZ_SUBAGENT_',
|
|
24
24
|
];
|
|
25
25
|
|
|
26
|
-
/** L1 deny + 显式剥除键集(镜像 shared SSOT,勿单独改动)。
|
|
26
|
+
/** L1 deny + 显式剥除键集(镜像 shared SSOT,勿单独改动)。
|
|
27
|
+
* 互引(场景域分化,勿互混):dev 装配器(apps/electron/scripts/dev-instance-lib.mjs
|
|
28
|
+
* `LEAK_ENV_KEYS`)仍剥 RELAY_STD* 三键——dev 宿主进程环境防泄漏口径独立于引擎
|
|
29
|
+
* spawn 面;本清单(引擎侧)已退役同名三键,写入方已清零。 */
|
|
27
30
|
export const ENGINE_ENV_DENY_LIST: readonly string[] = [
|
|
28
31
|
'XYZ_AGENT_PACKAGED',
|
|
29
32
|
'XYZ_RUNTIME_TOKEN',
|
|
30
33
|
'XYZ_AGENT_API_KEY',
|
|
31
34
|
'XYZ_SUBAGENT_RELAY_SESSION_ID',
|
|
32
35
|
'XYZ_SUBAGENT_RELAY_RECORD_ID',
|
|
33
|
-
'XYZ_SUBAGENT_RELAY_STDIN',
|
|
34
|
-
'XYZ_SUBAGENT_RELAY_STDOUT',
|
|
35
|
-
'XYZ_SUBAGENT_RELAY_STDERR',
|
|
36
36
|
];
|
|
37
37
|
|
|
38
38
|
// ─────────────────────────────────────────────────────────────────────────────
|
package/src/journal-replay.ts
CHANGED
|
@@ -349,6 +349,10 @@ export function updateFromEvent(record: ReplayRecordView, event: AgentEvent): vo
|
|
|
349
349
|
case "compaction":
|
|
350
350
|
return;
|
|
351
351
|
|
|
352
|
+
// ── activity:纯活性信号,reducer no-op(协议语义见 contract-types)──
|
|
353
|
+
case "activity":
|
|
354
|
+
return;
|
|
355
|
+
|
|
352
356
|
default: {
|
|
353
357
|
// 穷尽性检查:新增 AgentEvent variant 时编译期报错
|
|
354
358
|
const _exhaustive: never = event;
|
package/src/nesting-guard.ts
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
//
|
|
18
18
|
// [D3-⑤ 嵌套防护合一] 进程内执行嵌套上下文(原 SubagentService.execCtxAls,pi 路径
|
|
19
19
|
// 私有)并入本文件——「嵌套防护」的两层机制(跨进程 env 标记 / 进程内 ALS 深度计数)
|
|
20
|
-
// 单点于公共层。设计权威源:docs/design/
|
|
20
|
+
// 单点于公共层。设计权威源:docs/design/dual-track(已删 git 可追溯)§3.3 D3-⑤
|
|
21
21
|
// + 双轨清单 #10。
|
|
22
22
|
|
|
23
23
|
import { AsyncLocalStorage } from "node:async_hooks";
|
package/src/paths.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { join } from 'node:path';
|
|
|
7
7
|
* 自算池/journal 路径);core 侧引用切换已完成(core execution/engine/paths.ts 为
|
|
8
8
|
* re-export shim,子入口 ./engine/paths 解析路径不变)。
|
|
9
9
|
*
|
|
10
|
-
* 设计权威源:subagent-engine-abstraction.md D5/D6
|
|
10
|
+
* 设计权威源:constraints.json C-ext-15(原 subagent-engine-abstraction.md D5/D6,已删,git 可追溯)。
|
|
11
11
|
*
|
|
12
12
|
* 为什么独立成模块:extension 写侧(journal 落盘 / preparer 池目录)与
|
|
13
13
|
* runtime 校验侧(subagent-extractor 前缀白名单)必须同源推导——
|
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,26 +62,62 @@ export interface EngineStream {
|
|
|
64
62
|
onDelta(delta: string): void;
|
|
65
63
|
}
|
|
66
64
|
|
|
67
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* journal 固定分组 key(值锚定,**只承载、不透传**):journal 落盘路径
|
|
67
|
+
* `<dataDir>/engines/<engineId>/<本值>/journal-<taskId>.jsonl` 的第二段,两引擎恒
|
|
68
|
+
* 本值(pi / zcode 均无池化实现——pi = PI_CODING_AGENT_DIR 全局一份,zcode = 共享
|
|
69
|
+
* 宿主 HOME)。[池抽象降级 2026-09-13] poolKey 协议面(RunContext/run.params.ctx/
|
|
70
|
+
* host/poolResolved 通道/EngineHandleData)已整体退役,本常量不再跨进程透传,仅
|
|
71
|
+
* 三类消费:① journal 落盘路径构造(core journal-wiring);② 存量 record 兼容
|
|
72
|
+
* (zcode read 旧相对 dbPath 的锚定分支 + 持久化 engineHandle.poolKey 字段——
|
|
73
|
+
* record-store 读侧守卫要求非空,值恒本常量);③ 引擎数据目录布局 SSOT paths.ts
|
|
74
|
+
* 的签名参数。**值逐字不变**(存量 journal 落盘路径与记录含该值分段,改名不改值)。
|
|
75
|
+
*/
|
|
76
|
+
export const SHARED_POOL_KEY = "shared";
|
|
77
|
+
|
|
78
|
+
/** run 的运行期上下文(core RunContext 结构等价镜像;resume? = 会话形态参数,缺省一次性任务)。 */
|
|
68
79
|
export interface RunContext {
|
|
69
80
|
taskId: string;
|
|
70
|
-
poolKey: string;
|
|
71
81
|
signal?: AbortSignal;
|
|
72
82
|
onEvent?: (event: AgentEvent) => void;
|
|
73
83
|
ctxModel?: EngineCtxModel;
|
|
74
84
|
stream?: EngineStream;
|
|
75
85
|
schemaEnv?: string;
|
|
76
86
|
engineFallback?: { from: string; reason: string };
|
|
77
|
-
|
|
78
|
-
|
|
87
|
+
/**
|
|
88
|
+
* [F6] 根 session id(协议 run.params.ctx.sessionRootId 的进程内还原)——pi 引擎
|
|
89
|
+
* relay 归属键 SESSION_ID 的权威来源。additive 可选:宿主缺省不传。
|
|
90
|
+
*/
|
|
91
|
+
sessionRootId?: string;
|
|
92
|
+
/**
|
|
93
|
+
* [Option C 协议化] 权威 subagent session 目录(协议 run.params.ctx.sessionDir 的
|
|
94
|
+
* 进程内还原)——pi 引擎组装 `--session-dir` 的唯一权威值(宿主
|
|
95
|
+
* getSubagentSessionDir 推导,引擎不自推导)。additive 可选:缺省走引擎内
|
|
96
|
+
* [LEGACY] fallback(独立运行/测试形态)。
|
|
97
|
+
*/
|
|
98
|
+
sessionDir?: string;
|
|
99
|
+
onHandleReady?: (partial: Pick<EngineHandleData, "sessionRef">) => void;
|
|
79
100
|
/** 一次性子进程 pid 上报(host/childSpawned 载荷形态;ChildProcess 句柄不跨协议面)。 */
|
|
80
101
|
onChildSpawned?: (child: { pid: number | undefined; killed: boolean }) => void;
|
|
81
102
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
|
|
103
|
+
* 子进程退出态上报(host/childStateChanged 载荷形态;SR-4 接线:宿主镜像据此取消
|
|
104
|
+
* 该 pid 的挂起 dialog)。引擎侧只在 exited 相位上报——running 由 onChildSpawned 覆盖。
|
|
105
|
+
*/
|
|
106
|
+
onChildStateChanged?: (p: {
|
|
107
|
+
pid: number;
|
|
108
|
+
recordId: string;
|
|
109
|
+
state: "running" | "exited";
|
|
110
|
+
killed: boolean;
|
|
111
|
+
exitCode?: number;
|
|
112
|
+
signal?: string;
|
|
113
|
+
}) => void;
|
|
114
|
+
/**
|
|
115
|
+
* [H1 U6 终态] resume 续聊参数(协议 run.params.resume 的进程内还原;唯一会话形态
|
|
116
|
+
* 键——原 v1.x `chat` 字段已随键切换退役)。recordId = 轮次关联键与镜像帧锚定键;
|
|
117
|
+
* resume 锚点存在 = 冷续(--session 续写原文件),不存在 = 首轮新建。缺省 =
|
|
118
|
+
* 一次性任务形态。
|
|
85
119
|
*/
|
|
86
|
-
|
|
120
|
+
resume?: { recordId: string; resume?: ResumeAnchor };
|
|
87
121
|
}
|
|
88
122
|
|
|
89
123
|
export interface EngineHandle {
|
|
@@ -101,7 +135,6 @@ export interface EnginePort {
|
|
|
101
135
|
capabilities(): EngineCapabilities;
|
|
102
136
|
probe(opts?: { force?: boolean }): Promise<ProbeReport>;
|
|
103
137
|
run(task: EngineAgentCallOpts, ctx: RunContext): Promise<EngineRunResult>;
|
|
104
|
-
interact(handle: EngineHandle, action: InteractAction): Promise<InteractResult>;
|
|
105
138
|
read(handle: EngineHandle): Promise<SessionView>;
|
|
106
139
|
listModels?(): Array<{ id: string; name?: string }> | null;
|
|
107
140
|
validateModel?(modelRef: string | undefined): { canonicalRef: string };
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
// src/protocol/contract-types.ts
|
|
2
2
|
//
|
|
3
3
|
// 引擎面契约类型 SSOT(协议两侧不许各写一份;core 反向 re-export 保上层消费面)。
|
|
4
|
-
// 设计权威源:docs/
|
|
4
|
+
// 设计权威源:docs/architecture/subagent-engine-protocolization.md §3.5.1 D7 类型闭包表 +
|
|
5
5
|
// impl-plan §2.1「类型闭包处置」。
|
|
6
6
|
//
|
|
7
7
|
// 搬运口径(逐字对照,结构等价、零 core import):
|
|
8
8
|
// - AgentEvent / AgentUsage / AgentUsageTotal / ToolCallResult / ToolCall /
|
|
9
|
-
// InternalToolCall / Turn ← core execution/types.ts(2026-09-09 实测 :164-:313)
|
|
9
|
+
// InternalToolCall / Turn ← core execution/assembly/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
|
-
// - WorktreeHandle ← core execution/types.ts:349(SDK 结构等价副本——设计 §3.5.1
|
|
14
|
+
// - WorktreeHandle ← core execution/assembly/types.ts:349(SDK 结构等价副本——设计 §3.5.1
|
|
15
15
|
// 点名「AgentCallOpts.worktree 的 WorktreeHandle 即这类副本」)
|
|
16
16
|
//
|
|
17
|
+
// [H1] InteractAction / InteractResult 已随 chat-run 统一退役(U5 删除;
|
|
18
|
+
// docs/architecture/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 侧样板见
|
|
@@ -41,7 +44,7 @@ export type AssertMutuallyAssignable<A, B> = [A] extends [B]
|
|
|
41
44
|
// 事件面(AgentEvent 及其字段型)
|
|
42
45
|
// ============================================================
|
|
43
46
|
|
|
44
|
-
/** token 用量(message_end 单条消息增量)。← core execution/types.ts AgentUsage。 */
|
|
47
|
+
/** token 用量(message_end 单条消息增量)。← core execution/assembly/types.ts AgentUsage。 */
|
|
45
48
|
export interface AgentUsage {
|
|
46
49
|
input: number;
|
|
47
50
|
output: number;
|
|
@@ -96,8 +99,12 @@ export interface Turn {
|
|
|
96
99
|
}
|
|
97
100
|
|
|
98
101
|
/**
|
|
99
|
-
* 引擎事件(
|
|
100
|
-
* 兼容」不变量 3 的类型面)。语义锚点 = pi(ACP 词汇对照见 core execution/types.ts 注释)。
|
|
102
|
+
* 引擎事件(9 种,协议 event.params.event 逐字序列化——「事件与 handle 序列化逐字
|
|
103
|
+
* 兼容」不变量 3 的类型面)。语义锚点 = pi(ACP 词汇对照见 core execution/assembly/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 {
|
|
@@ -123,9 +131,11 @@ export interface EngineHandleData {
|
|
|
123
131
|
engineId: string;
|
|
124
132
|
/** 引擎自定义定位键值。pi = { recordId?, sessionFile? };zcode = { sessionId, dbPath }。 */
|
|
125
133
|
sessionRef: Record<string, string>;
|
|
126
|
-
/**
|
|
127
|
-
|
|
128
|
-
|
|
134
|
+
/**
|
|
135
|
+
* journal 绝对路径(read 第②级数据源;宿主读前校验前缀白名单)。缺省 = 无 journal。
|
|
136
|
+
* [池抽象降级 2026-09-13] 原 poolKey 字段已删除——两引擎 poolKey 恒 'shared'
|
|
137
|
+
* (SDK SHARED_POOL_KEY),journal 固定落 engines/<engineId>/shared/,字段零信息量。
|
|
138
|
+
*/
|
|
129
139
|
journalPath?: string;
|
|
130
140
|
/** probe 实测版本(漂移排查锚点)。 */
|
|
131
141
|
engineVersion?: string;
|
|
@@ -135,18 +145,15 @@ export interface EngineHandleData {
|
|
|
135
145
|
|
|
136
146
|
/**
|
|
137
147
|
* [v1.x] 冷续 resume 锚点——EngineHandleData 定位键的投影子集(诊断字段
|
|
138
|
-
* v/engineVersion/adapterVersion
|
|
139
|
-
* - run.params.
|
|
140
|
-
* sessionRef.sessionFile —— 对照 core SpawnResumeOpts.sessionFile
|
|
141
|
-
*
|
|
142
|
-
* 宿主据此刷新冷续依据——pi 定位键形态同 EngineHandleData.sessionRef 注释)。
|
|
148
|
+
* v/engineVersion/adapterVersion 不属锚点语义,不随锚点走)。消费点:
|
|
149
|
+
* - run.params.resume(宿主 → 引擎:冷续重开已 idle 的 session,pi 消费
|
|
150
|
+
* sessionRef.sessionFile —— 对照 core SpawnResumeOpts.sessionFile 的锚点面)。
|
|
151
|
+
* [H1 U6 已切换] 键切换单批完成(读写端同批),锚点仅经 resume 键携带。
|
|
143
152
|
* 类型层与 EngineHandleData 定位形态的对照由测试断言(Pick 可赋值闭包)锁定。
|
|
144
153
|
*/
|
|
145
154
|
export interface ResumeAnchor {
|
|
146
155
|
/** 引擎定位键(pi = { recordId?, sessionFile? };zcode = { sessionId, dbPath })。 */
|
|
147
156
|
sessionRef: Record<string, string>;
|
|
148
|
-
/** 隔离池定位(锚点补全 handle 重建所需;pi 无池化恒 'shared')。 */
|
|
149
|
-
poolKey: string;
|
|
150
157
|
/** journal 绝对路径(read 降级链第②级数据源;无 journal 缺省)。 */
|
|
151
158
|
journalPath?: string;
|
|
152
159
|
}
|
|
@@ -188,8 +195,16 @@ export interface EngineCapabilities {
|
|
|
188
195
|
schemaEnforcement: "native" | "emulated";
|
|
189
196
|
/** 注意区分「引擎 RPC 层有此能力」与「subagent 链路已接通」。 */
|
|
190
197
|
steer: "native" | "emulated" | "unsupported";
|
|
191
|
-
/**
|
|
192
|
-
|
|
198
|
+
/**
|
|
199
|
+
* [H1 D5 语义收窄] resume 能力位(chat 续聊 = 新 run + resume 锚点的承载前提;
|
|
200
|
+
* 原名字沿用——conversation 位保留、语义从「interact 长驻控制面」收窄为
|
|
201
|
+
* 「resume 续聊能力」,gate 判据与消费方不变)。
|
|
202
|
+
* [U6 / 永久会话模型 §3.2.6 要点 4] 新值 "cold" = 冷恢复会话:resume 读通道取
|
|
203
|
+
* 结构化历史 + 新 session 注入(无热 steering)。gate 判据仍是 `=== "unsupported"`
|
|
204
|
+
* 拒绝——"cold" 在 gate 面与 "native" 等价放行,差异只在续聊形态(新 session
|
|
205
|
+
* 注入 vs 原地续写)。
|
|
206
|
+
*/
|
|
207
|
+
conversation: "native" | "cold" | "unsupported";
|
|
193
208
|
/** 决定 persona 路由策略(file/flag/prompt 通道)。 */
|
|
194
209
|
personaInjection: "file" | "flag" | "prompt";
|
|
195
210
|
/** 粗粒度引擎:GUI 显示降级为阶段态。 */
|
|
@@ -218,20 +233,6 @@ export interface ProbeReport {
|
|
|
218
233
|
error?: { code: string; recovery: string };
|
|
219
234
|
}
|
|
220
235
|
|
|
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
236
|
// ============================================================
|
|
236
237
|
// 终态 / 任务声明
|
|
237
238
|
// ============================================================
|
|
@@ -261,7 +262,7 @@ export interface ToolCallEntry {
|
|
|
261
262
|
input: string;
|
|
262
263
|
}
|
|
263
264
|
|
|
264
|
-
/** worktree 句柄(结构等价副本;core 权威定义在 execution/types.ts:349)。 */
|
|
265
|
+
/** worktree 句柄(结构等价副本;core 权威定义在 execution/assembly/types.ts:349)。 */
|
|
265
266
|
export interface WorktreeHandle {
|
|
266
267
|
/** checkout 目录(子 agent 工作目录)。 */
|
|
267
268
|
readonly path: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/protocol/engine-protocol.ts
|
|
2
2
|
//
|
|
3
3
|
// 引擎协议 v1 版本常量与协商(W1 契约根)。设计权威源:
|
|
4
|
-
// docs/
|
|
4
|
+
// docs/architecture/subagent-engine-protocolization.md §3.3 + impl-plan §2.1。
|
|
5
5
|
//
|
|
6
6
|
// 传输 = stdio NDJSON(每行一个 JSON 对象)。stdout 独占协议帧;stderr 常驻排空
|
|
7
7
|
// (内存环形缓冲尾 400 字符,崩溃现场由 engine_crashed 携带,宿主侧不落盘)。
|
|
@@ -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/architecture/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;
|
|
@@ -72,10 +83,9 @@ export const ENGINE_EVENT_COALESCE_DEFAULT = "0";
|
|
|
72
83
|
|
|
73
84
|
/**
|
|
74
85
|
* 反向请求超时二分(帧④注释,R9-2):
|
|
75
|
-
* - 数据面类(host/log / host/streamDelta / host/
|
|
76
|
-
* host/childSpawned / host/childStateChanged
|
|
77
|
-
*
|
|
78
|
-
* - 人机交互类(host/askUser / host/permission):不设统一超时——core 先回 {ack:true},
|
|
86
|
+
* - 数据面类(host/log / host/streamDelta / host/handleReady /
|
|
87
|
+
* host/childSpawned / host/childStateChanged):10s 未答 = 引擎故障;
|
|
88
|
+
* - 人机交互类(host/askUser):不设统一超时——core 先回 {ack:true},
|
|
79
89
|
* 结果异步到达;按 ADR-0047「静默 ≠ 卡死」用无进展检测/用户取消,不据此判引擎故障。
|
|
80
90
|
*/
|
|
81
91
|
export type ReverseRequestTimeoutClass = "data-plane" | "interaction";
|
|
@@ -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/frames.ts
CHANGED
|
@@ -82,13 +82,11 @@ export interface ReverseRequestFrame {
|
|
|
82
82
|
export type ReverseResponseResult =
|
|
83
83
|
/** 数据面类:处理确认。 */
|
|
84
84
|
| { ok: true }
|
|
85
|
-
/** 人机交互类(askUser
|
|
85
|
+
/** 人机交互类(askUser)两阶段第一阶段:已受理,结果异步到达(R9-2)。 */
|
|
86
86
|
| { ack: true }
|
|
87
87
|
/** 未实现的交互能力(设计:未实现回 unsupported,引擎自行降级)。 */
|
|
88
88
|
| { unsupported: true };
|
|
89
89
|
|
|
90
|
-
export type AnyFrame = RequestFrame | ResponseFrame | NotificationFrame | ReverseRequestFrame;
|
|
91
|
-
|
|
92
90
|
// ============================================================
|
|
93
91
|
// 判别守卫(W2 行解析器消费;结构判定,不抛错)
|
|
94
92
|
// ============================================================
|
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/architecture/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/architecture/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",
|
|
@@ -60,8 +61,6 @@ export const PROTOCOL_METHODS = [
|
|
|
60
61
|
* run 上下文(RunContext 字段映射的协议承载,设计 §3.3 RunContext 映射表)。
|
|
61
62
|
*/
|
|
62
63
|
export interface RunContextParams {
|
|
63
|
-
/** 隔离池归属(journal 归属错 = 缺失后果)。 */
|
|
64
|
-
poolKey: string;
|
|
65
64
|
/** 任务工作目录(worktree 隔离时 = worktree 路径)。 */
|
|
66
65
|
cwd: string;
|
|
67
66
|
/** 请求模型 ref(未传 = 引擎缺省模型)。 */
|
|
@@ -74,24 +73,40 @@ export interface RunContextParams {
|
|
|
74
73
|
engineFallback?: { from: string; reason: string };
|
|
75
74
|
/** 事件粒度请求(引擎按 capabilities.eventGranularity 实际能力执行)。 */
|
|
76
75
|
streamMode?: "stream" | "coarse";
|
|
76
|
+
/**
|
|
77
|
+
* [F6] 根 session id——pi 引擎 relay 归属键 SESSION_ID 的权威来源(生产三来源
|
|
78
|
+
* ①本字段 ②宿主 env ③根进程 env 中,宿主派发恒走①)。additive 可选:旧引擎忽略
|
|
79
|
+
* 未知字段,undefined 不上 wire。
|
|
80
|
+
*/
|
|
81
|
+
sessionRootId?: string;
|
|
82
|
+
/**
|
|
83
|
+
* [Option C 协议化] 权威 subagent session 目录——宿主以 getSubagentSessionDir
|
|
84
|
+
* (agentDir, rootCwd) 推导(宿主单一权威,Fix Gate B S6:引擎本地推导与宿主布局
|
|
85
|
+
* 三处不等价 → 跨重启续聊链断裂)。引擎用它组装 pi `--session-dir`,不自推导;
|
|
86
|
+
* 缺省(独立运行/测试)走引擎内 [LEGACY] fallback。additive 可选:旧引擎忽略
|
|
87
|
+
* 未知字段,undefined 不上 wire。
|
|
88
|
+
*/
|
|
89
|
+
sessionDir?: string;
|
|
77
90
|
}
|
|
78
91
|
|
|
79
92
|
// ============================================================
|
|
80
|
-
// [
|
|
93
|
+
// [H1] run 的 resume 会话形态参数(chat-run 统一终态;原 v1.x chat 键已退役)
|
|
81
94
|
// ============================================================
|
|
82
95
|
|
|
83
96
|
/**
|
|
84
|
-
* [
|
|
85
|
-
*
|
|
97
|
+
* [H1] run 的 resume 会话形态参数(设计 docs/architecture/subagent-chat-run-unification.md
|
|
98
|
+
* §3.3 D3 + §5 U1/U6 行):原 RunChatParams(v1.x chat 会话形态参数)的泛化改名终态,
|
|
99
|
+
* 载荷同形(recordId + resume 锚点,ResumeAnchor 不变),仅键名从「chat 会话形态」
|
|
100
|
+
* 泛化为「resume 续聊」。
|
|
86
101
|
* - recordId:core 预建 record 的关联键(引擎据此回填 handle.sessionRef、上报
|
|
87
|
-
* host/childSpawned|childStateChanged
|
|
102
|
+
* host/childSpawned|childStateChanged 的 record 键形态);
|
|
88
103
|
* - resume:冷续锚点(重开已 idle 的 session 续聊;缺省 = 新 session)。对照
|
|
89
104
|
* core SpawnResumeOpts——sessionFile 经 anchor.sessionRef 携带,model/
|
|
90
105
|
* thinkingLevel 防漂移覆盖走既有 task/ctx 字段,不双写。
|
|
91
|
-
*
|
|
92
|
-
*
|
|
106
|
+
* [H1 U6 已切换] `chat` 键整体退役(读写端同批切换,无「写新读旧」窗口),本键为
|
|
107
|
+
* 唯一会话形态参数。载荷 schema 权威 = runSessionParamsSchema(schema.ts)。
|
|
93
108
|
*/
|
|
94
|
-
export interface
|
|
109
|
+
export interface RunResumeParams {
|
|
95
110
|
recordId: string;
|
|
96
111
|
resume?: ResumeAnchor;
|
|
97
112
|
}
|
|
@@ -127,11 +142,11 @@ export interface RunParams {
|
|
|
127
142
|
task: AgentCallOpts;
|
|
128
143
|
ctx: RunContextParams;
|
|
129
144
|
/**
|
|
130
|
-
* [
|
|
131
|
-
*
|
|
132
|
-
* 帧级 schema params
|
|
145
|
+
* [H1 U6 终态] resume 续聊参数(唯一会话形态键;原 v1.x `chat` 键已随键切换退役,
|
|
146
|
+
* 见 RunResumeParams)。缺省 = 一次性任务形态(向后兼容:旧引擎忽略未知字段,
|
|
147
|
+
* 帧级 schema params 不做深校验)。additive 可选:undefined 不上 wire。
|
|
133
148
|
*/
|
|
134
|
-
|
|
149
|
+
resume?: RunResumeParams;
|
|
135
150
|
}
|
|
136
151
|
|
|
137
152
|
/** run 终态应答(期间事件经 event 通知;长运行方法,应答到达即终态)。 */
|
|
@@ -153,11 +168,6 @@ export interface CancelResult {
|
|
|
153
168
|
ok: true;
|
|
154
169
|
}
|
|
155
170
|
|
|
156
|
-
export interface InteractParams {
|
|
157
|
-
handle: EngineHandleData;
|
|
158
|
-
action: InteractAction;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
171
|
export interface ReadParams {
|
|
162
172
|
handle: EngineHandleData;
|
|
163
173
|
/** 数据根必填:存量池时代引擎自算池/journal 相对 dbPath 的定位需要它(设计钉死)。 */
|
|
@@ -206,7 +216,6 @@ export interface ProtocolParamsMap {
|
|
|
206
216
|
probe: ProbeParams;
|
|
207
217
|
run: RunParams;
|
|
208
218
|
cancel: CancelParams;
|
|
209
|
-
interact: InteractParams;
|
|
210
219
|
read: ReadParams;
|
|
211
220
|
listModels: ListModelsParams;
|
|
212
221
|
validateModel: ValidateModelParams;
|
|
@@ -220,7 +229,6 @@ export interface ProtocolResultMap {
|
|
|
220
229
|
probe: ProbeReport;
|
|
221
230
|
run: RunResult;
|
|
222
231
|
cancel: CancelResult;
|
|
223
|
-
interact: InteractResult;
|
|
224
232
|
read: SessionView;
|
|
225
233
|
listModels: ListModelsResult;
|
|
226
234
|
validateModel: ValidateModelResult;
|