@zhushanwen/subagent-engine-sdk 0.5.0 → 0.6.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-TW2FAMAJ.js → chunk-63ZNJHM5.js} +26 -11
- package/dist/{chunk-7I4XGL5J.js → chunk-BBWUC2EE.js} +2 -2
- package/dist/{chunk-3K2P2CM2.js → chunk-CNQTJJF5.js} +1 -1
- package/dist/chunk-CT3FEBDO.js +8 -0
- package/dist/{chunk-DSQ7JQKM.js → chunk-GSW3DMN6.js} +5 -5
- package/dist/{chunk-HYES77BR.js → chunk-MSAJXIP4.js} +2 -2
- package/dist/{chunk-WORT4PG7.js → chunk-QOEXD2FT.js} +1 -1
- package/dist/{chunk-3IBT7MTB.js → chunk-W3BKI2BP.js} +3 -3
- package/dist/{chunk-F5JZMK74.js → chunk-WMDMXP2F.js} +2 -2
- package/dist/{chunk-GT6YLLN4.js → chunk-X24IVQKJ.js} +5 -5
- package/dist/{chunk-365AUV6N.js → chunk-YE472JOO.js} +2 -2
- package/dist/{chunk-BBVZK5DL.js → chunk-YL5W5EMV.js} +24 -20
- package/dist/{contract-types-Dsvy79r3.d.cts → contract-types-DaULkdpG.d.cts} +44 -11
- package/dist/{contract-types-Dsvy79r3.d.ts → contract-types-DaULkdpG.d.ts} +44 -11
- package/dist/data-dir.cjs +6 -6
- package/dist/data-dir.d.cts +4 -4
- package/dist/data-dir.d.ts +4 -4
- package/dist/data-dir.js +3 -3
- package/dist/env.cjs +24 -20
- package/dist/env.d.cts +5 -5
- package/dist/env.d.ts +5 -5
- package/dist/env.js +1 -1
- package/dist/{error-codes-SA5fGtx_.d.cts → error-codes-C9BOUI5H.d.ts} +6 -5
- package/dist/{error-codes-OvQlqiQw.d.ts → error-codes-CFTOAxva.d.cts} +6 -5
- package/dist/index.cjs +81 -53
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +21 -13
- package/dist/journal-io.d.cts +1 -1
- package/dist/journal-io.d.ts +1 -1
- package/dist/journal-replay.d.cts +1 -1
- package/dist/journal-replay.d.ts +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/logs/stderr-rotation.cjs +2 -2
- package/dist/logs/stderr-rotation.d.cts +1 -1
- package/dist/logs/stderr-rotation.d.ts +1 -1
- package/dist/logs/stderr-rotation.js +1 -1
- package/dist/nesting-guard.cjs +2 -2
- package/dist/nesting-guard.d.cts +2 -2
- package/dist/nesting-guard.d.ts +2 -2
- package/dist/nesting-guard.js +1 -1
- package/dist/node-executor.cjs +2 -2
- package/dist/node-executor.d.cts +5 -5
- package/dist/node-executor.d.ts +5 -5
- package/dist/node-executor.js +2 -2
- package/dist/port-contract.d.cts +1 -1
- package/dist/port-contract.d.ts +1 -1
- package/dist/protocol/index.cjs +29 -13
- package/dist/protocol/index.d.cts +8 -7
- package/dist/protocol/index.d.ts +8 -7
- package/dist/protocol/index.js +4 -2
- package/dist/relay-env.cjs +5 -5
- package/dist/relay-env.d.cts +5 -5
- package/dist/relay-env.d.ts +5 -5
- package/dist/relay-env.js +1 -1
- package/dist/spawn.cjs +1 -1
- package/dist/spawn.d.cts +2 -2
- package/dist/spawn.d.ts +2 -2
- package/dist/spawn.js +1 -1
- package/dist/ui-channels.cjs +2 -2
- package/dist/ui-channels.js +1 -1
- package/dist/zcode-db-paths.cjs +33 -0
- package/dist/zcode-db-paths.d.cts +15 -0
- package/dist/zcode-db-paths.d.ts +15 -0
- package/dist/zcode-db-paths.js +9 -0
- package/package.json +2 -4
- package/src/best-effort.ts +0 -37
- package/src/cli-entry.ts +0 -82
- package/src/data-dir.ts +0 -89
- package/src/env.ts +0 -272
- package/src/error-message.ts +0 -22
- package/src/index.ts +0 -63
- package/src/journal-io.ts +0 -82
- package/src/journal-replay.ts +0 -436
- package/src/kill-chain.ts +0 -265
- package/src/logger.ts +0 -105
- package/src/logs/stderr-rotation.ts +0 -166
- package/src/nesting-guard.ts +0 -140
- package/src/node-executor.ts +0 -272
- package/src/paths.ts +0 -48
- package/src/port-contract.ts +0 -150
- package/src/protocol/contract-types.ts +0 -378
- package/src/protocol/engine-protocol.ts +0 -92
- package/src/protocol/error-codes.ts +0 -179
- package/src/protocol/frames.ts +0 -143
- package/src/protocol/index.ts +0 -12
- package/src/protocol/methods.ts +0 -237
- package/src/protocol/reverse-channels.ts +0 -123
- package/src/protocol/schema.ts +0 -185
- package/src/relay-env.ts +0 -60
- package/src/schema-emulation.ts +0 -192
- package/src/spawn.ts +0 -246
- package/src/ui-channels.ts +0 -219
- package/src/ui-types.ts +0 -101
|
@@ -51,6 +51,28 @@ var REVERSE_CHANNEL_TIMEOUT_CLASS = {
|
|
|
51
51
|
"host/askUser": "interaction"
|
|
52
52
|
};
|
|
53
53
|
|
|
54
|
+
// src/protocol/contract-types.ts
|
|
55
|
+
var AGENT_EVENT_TYPE_NAMES = [
|
|
56
|
+
"tool_start",
|
|
57
|
+
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺 tool 起始占位(显示降级),turn 结构不受损
|
|
58
|
+
"tool_end",
|
|
59
|
+
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺 result,turn 收口由 turn_end/message_end 承担
|
|
60
|
+
"text_delta",
|
|
61
|
+
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺正文增量,不产生半解析状态
|
|
62
|
+
"thinking_delta",
|
|
63
|
+
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺推理增量,不产生半解析状态
|
|
64
|
+
"turn_end",
|
|
65
|
+
// noop-safe: 旧宿主 default 分支零写入——丢弃则该 turn 滞留进行态,journal 重放仍按序重建
|
|
66
|
+
"message_end",
|
|
67
|
+
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺 usage 聚合与闭合计量,已累积内容不回滚
|
|
68
|
+
"compaction",
|
|
69
|
+
// noop-safe: 事件无载荷且现行 reducer 即直接 return——丢弃与处理零差异
|
|
70
|
+
"activity",
|
|
71
|
+
// noop-safe: 纯活性信号,双侧 reducer 恒 no-op(协议语义见 AgentEvent 头注),丢弃零差异
|
|
72
|
+
"error"
|
|
73
|
+
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺 lastError 诊断留痕,已写状态不回滚
|
|
74
|
+
];
|
|
75
|
+
|
|
54
76
|
// src/protocol/schema.ts
|
|
55
77
|
var ANY_JSON = {};
|
|
56
78
|
var protocolErrorSchema = {
|
|
@@ -121,17 +143,9 @@ var notificationFrameSchema = {
|
|
|
121
143
|
properties: {
|
|
122
144
|
type: {
|
|
123
145
|
type: "string",
|
|
124
|
-
enum
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
"text_delta",
|
|
128
|
-
"thinking_delta",
|
|
129
|
-
"turn_end",
|
|
130
|
-
"message_end",
|
|
131
|
-
"compaction",
|
|
132
|
-
"activity",
|
|
133
|
-
"error"
|
|
134
|
-
]
|
|
146
|
+
// 事件 enum 从词表 SSOT 派生(U2 词表锁:union⟷词表互证后,此处不再
|
|
147
|
+
// 手写字面量集合——手写即漂移面,病灶 1 的第三处同步点)
|
|
148
|
+
enum: [...AGENT_EVENT_TYPE_NAMES]
|
|
135
149
|
}
|
|
136
150
|
}
|
|
137
151
|
}
|
|
@@ -196,6 +210,7 @@ export {
|
|
|
196
210
|
PROTOCOL_METHODS,
|
|
197
211
|
REVERSE_CHANNELS,
|
|
198
212
|
REVERSE_CHANNEL_TIMEOUT_CLASS,
|
|
213
|
+
AGENT_EVENT_TYPE_NAMES,
|
|
199
214
|
protocolErrorSchema,
|
|
200
215
|
requestFrameSchema,
|
|
201
216
|
successResponseFrameSchema,
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
var NUL = "\0";
|
|
3
3
|
function normalizeChannelName(markerLiteral) {
|
|
4
4
|
let name = markerLiteral;
|
|
5
|
-
if (name.startsWith("
|
|
6
|
-
name = name.slice("
|
|
5
|
+
if (name.startsWith("TAIJI_")) {
|
|
6
|
+
name = name.slice("TAIJI_".length);
|
|
7
7
|
}
|
|
8
8
|
if (name.endsWith(":")) {
|
|
9
9
|
name = name.slice(0, -1);
|
|
@@ -33,7 +33,7 @@ function spawnEngineChild(opts) {
|
|
|
33
33
|
return child;
|
|
34
34
|
}
|
|
35
35
|
var DEFAULT_ENGINE_HOST_REQUEST_TIMEOUT_MS = 3e4;
|
|
36
|
-
var ENGINE_HOST_REQUEST_TIMEOUT_ENV = "
|
|
36
|
+
var ENGINE_HOST_REQUEST_TIMEOUT_ENV = "TAIJI_ENGINE_HOST_REQUEST_TIMEOUT_MS";
|
|
37
37
|
var SWEEP_INTERVAL_MS = 1e3;
|
|
38
38
|
function resolveHostRequestTimeoutMs(opts) {
|
|
39
39
|
if (opts.hostRequestTimeoutMs !== void 0) return opts.hostRequestTimeoutMs;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// src/relay-env.ts
|
|
2
|
-
var RELAY_ENV_SOCKET = "
|
|
3
|
-
var RELAY_ENV_NODE = "
|
|
4
|
-
var RELAY_ENV_SCRIPT = "
|
|
5
|
-
var RELAY_ENV_SESSION_ID = "
|
|
6
|
-
var RELAY_ENV_RECORD_ID = "
|
|
2
|
+
var RELAY_ENV_SOCKET = "TAIJI_SUBAGENT_RELAY_SOCKET";
|
|
3
|
+
var RELAY_ENV_NODE = "TAIJI_SUBAGENT_RELAY_NODE";
|
|
4
|
+
var RELAY_ENV_SCRIPT = "TAIJI_SUBAGENT_RELAY_SCRIPT";
|
|
5
|
+
var RELAY_ENV_SESSION_ID = "TAIJI_SUBAGENT_RELAY_SESSION_ID";
|
|
6
|
+
var RELAY_ENV_RECORD_ID = "TAIJI_SUBAGENT_RELAY_RECORD_ID";
|
|
7
7
|
var RELAY_PROTOCOL_VERSION = 1;
|
|
8
8
|
var RELAY_EXIT_CODES = {
|
|
9
9
|
/** 握手被拒:协议版本不匹配(安装损坏,重装应用)。 */
|
|
@@ -18,8 +18,8 @@ function positiveIntEnv(env, key) {
|
|
|
18
18
|
}
|
|
19
19
|
function stderrRotationParams(env) {
|
|
20
20
|
return {
|
|
21
|
-
maxBytes: positiveIntEnv(env, "
|
|
22
|
-
keepDays: positiveIntEnv(env, "
|
|
21
|
+
maxBytes: positiveIntEnv(env, "TAIJI_LOG_MAX_BYTES") ?? DEFAULT_STDERR_MAX_BYTES,
|
|
22
|
+
keepDays: positiveIntEnv(env, "TAIJI_LOG_KEEP_DAYS") ?? DEFAULT_STDERR_KEEP_DAYS
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
function stderrLogPathFor(engineDataDir, pid, prefix) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
EngineSdkError
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-WMDMXP2F.js";
|
|
4
4
|
|
|
5
5
|
// src/node-executor.ts
|
|
6
6
|
import { spawn } from "child_process";
|
|
7
|
-
var ENGINE_NODE_ENV = "
|
|
7
|
+
var ENGINE_NODE_ENV = "TAIJI_AGENT_ENGINE_NODE";
|
|
8
8
|
var PROBE_TIMEOUT_MS = 5e3;
|
|
9
9
|
function probeNodeExecutor(execPath, isElectron) {
|
|
10
10
|
return new Promise((resolve) => {
|
|
@@ -64,7 +64,7 @@ async function resolvePiExtensionLaunch(entryPath, entryArgs, env) {
|
|
|
64
64
|
if (engineNode === void 0 || engineNode === "") {
|
|
65
65
|
throw engineNotFound(
|
|
66
66
|
`pi extension host must spawn engines via injected executor ${ENGINE_NODE_ENV}, but it is not set (host process.execPath is the pi binary, not a node executor)`,
|
|
67
|
-
`The
|
|
67
|
+
`The taiji runtime injects ${ENGINE_NODE_ENV} when spawning the pi host. If you are running the extension inside a packaged app, report this as a packaging regression; standalone pi installs do not use the pi-extension host kind.`
|
|
68
68
|
);
|
|
69
69
|
}
|
|
70
70
|
const isElectron = env.ELECTRON_RUN_AS_NODE === "1";
|
|
@@ -17,7 +17,7 @@ var CRASH_REBUILD_BACKOFF_MS = [
|
|
|
17
17
|
CRASH_REBUILD_BACKOFF_STEP_3_MS
|
|
18
18
|
];
|
|
19
19
|
var STDERR_TAIL_CHARS = 400;
|
|
20
|
-
var ENGINE_EVENT_COALESCE_ENV = "
|
|
20
|
+
var ENGINE_EVENT_COALESCE_ENV = "TAIJI_ENGINE_EVENT_COALESCE";
|
|
21
21
|
var ENGINE_EVENT_COALESCE_DEFAULT = "0";
|
|
22
22
|
|
|
23
23
|
// src/protocol/error-codes.ts
|
|
@@ -71,7 +71,7 @@ function engineConversationUnsupportedError(engineId) {
|
|
|
71
71
|
return new EngineSdkError(
|
|
72
72
|
"engine_capability_unsupported",
|
|
73
73
|
`engine '${engineId}' \u4E0D\u652F\u6301 resume \u7EED\u804A\uFF08capabilities.conversation = 'unsupported'\uFF0Cmanifest \u65E0 conversation gate \u4F4D\uFF09`,
|
|
74
|
-
`\
|
|
74
|
+
`\u6539\u7528\u58F0\u660E conversation \u80FD\u529B\u7684\u5F15\u64CE\u7EED\u804A\uFF08\u6216\u4EE5\u65B0\u4EFB\u52A1\u91CD\u6D3E\uFF09\uFF0C\u6216\u4FEE manifest capabilities / \u5347\u7EA7\u5F15\u64CE\u5305\uFF08\u82E5\u5F15\u64CE\u5B9E\u9645\u652F\u6301\u8BE5\u80FD\u529B\uFF09`,
|
|
75
75
|
{ engineId, capability: "conversation", declared: "unsupported" }
|
|
76
76
|
);
|
|
77
77
|
}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
|
|
5
5
|
// src/data-dir.ts
|
|
6
6
|
var logger = getLogger("subagents");
|
|
7
|
-
var
|
|
7
|
+
var TAIJI_DATA_DIR_ENV = "TAIJI_AGENT_DATA_DIR";
|
|
8
8
|
var WARNED_SLOT_KEY = /* @__PURE__ */ Symbol.for("@zhushanwen/subagent-engine-sdk.data-dir-warned");
|
|
9
9
|
function getWarnedSlot() {
|
|
10
10
|
let slot = Reflect.get(globalThis, WARNED_SLOT_KEY);
|
|
@@ -18,19 +18,19 @@ function resetDataDirWarnForTests() {
|
|
|
18
18
|
getWarnedSlot().current = false;
|
|
19
19
|
}
|
|
20
20
|
function resolveEngineDataDir(env, opts = {}) {
|
|
21
|
-
const fromEnv = env[
|
|
21
|
+
const fromEnv = env[TAIJI_DATA_DIR_ENV]?.trim();
|
|
22
22
|
if (fromEnv !== void 0 && fromEnv !== "") return fromEnv;
|
|
23
23
|
const fallback = opts.fallbackDataRoot?.trim();
|
|
24
24
|
if (fallback === void 0 || fallback === "") {
|
|
25
25
|
throw new Error(
|
|
26
|
-
`[subagent-engine-sdk] engine_not_found: ${
|
|
26
|
+
`[subagent-engine-sdk] engine_not_found: ${TAIJI_DATA_DIR_ENV} is not set and no fallback data root was injected. Recovery: the host must inject ${TAIJI_DATA_DIR_ENV} into the engine process env (taiji runtime / pi extension host do this at spawn), or pass { fallbackDataRoot } when calling resolveEngineDataDir from a host that resolves the data root itself.`
|
|
27
27
|
);
|
|
28
28
|
}
|
|
29
29
|
if (!getWarnedSlot().current) {
|
|
30
30
|
getWarnedSlot().current = true;
|
|
31
31
|
const warn = opts.warn ?? defaultWarn;
|
|
32
32
|
warn(
|
|
33
|
-
`[engine-data-dir] ${
|
|
33
|
+
`[engine-data-dir] ${TAIJI_DATA_DIR_ENV} is not set; engine journal/pool fall back to the injected data root (${fallback}). The taiji host normally injects this env \u2014 if you are running inside taiji, check the runtime spawn env; standalone installs intentionally use the injected root.`
|
|
34
34
|
);
|
|
35
35
|
}
|
|
36
36
|
return fallback;
|
|
@@ -40,7 +40,7 @@ function defaultWarn(msg) {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
export {
|
|
43
|
-
|
|
43
|
+
TAIJI_DATA_DIR_ENV,
|
|
44
44
|
resetDataDirWarnForTests,
|
|
45
45
|
resolveEngineDataDir
|
|
46
46
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/nesting-guard.ts
|
|
2
2
|
import { AsyncLocalStorage } from "async_hooks";
|
|
3
|
-
var NESTED_SPAWN_ENV = "
|
|
3
|
+
var NESTED_SPAWN_ENV = "TAIJI_AGENT_SUBAGENT";
|
|
4
4
|
var NATIVE_NESTED_KEYS = ["CLAUDECODE", "ZSW_NESTED"];
|
|
5
5
|
var NATIVE_NESTED_PREFIXES = ["PI_SUBAGENT_"];
|
|
6
6
|
var NestedSpawnRejectedError = class extends Error {
|
|
@@ -9,7 +9,7 @@ var NestedSpawnRejectedError = class extends Error {
|
|
|
9
9
|
recovery;
|
|
10
10
|
constructor() {
|
|
11
11
|
super(
|
|
12
|
-
"nested_spawn_rejected: this process is already a subagent (
|
|
12
|
+
"nested_spawn_rejected: this process is already a subagent (TAIJI_AGENT_SUBAGENT=1)"
|
|
13
13
|
);
|
|
14
14
|
this.name = "NestedSpawnRejectedError";
|
|
15
15
|
this.recovery = "Subagents must not spawn further subagents (unbounded recursion guard). Do the work directly inside the current task instead of delegating.";
|
|
@@ -5,25 +5,29 @@ import {
|
|
|
5
5
|
// src/env.ts
|
|
6
6
|
var logger = getLogger("engine-sdk/env");
|
|
7
7
|
var ENGINE_ENV_PREFIXES = [
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
8
|
+
"TAIJI_",
|
|
9
|
+
"TAIJI_AGENT_",
|
|
10
|
+
"TAIJI_SUBAGENT_"
|
|
11
11
|
];
|
|
12
12
|
var ENGINE_ENV_DENY_LIST = [
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
13
|
+
"TAIJI_AGENT_PACKAGED",
|
|
14
|
+
"TAIJI_RUNTIME_TOKEN",
|
|
15
|
+
"TAIJI_AGENT_API_KEY",
|
|
16
|
+
"TAIJI_SUBAGENT_RELAY_SESSION_ID",
|
|
17
|
+
"TAIJI_SUBAGENT_RELAY_RECORD_ID",
|
|
18
|
+
// 预设回落事实(env 名 SSOT = shared PRESET_FALLBACK_ENV_KEYS):「本进程本次运行」
|
|
19
|
+
// 事实只对 runtime 直接 spawn 的 pi 成立,引擎一跳继承会造成子 agent pi 假披露
|
|
20
|
+
"TAIJI_PRESET_FALLBACK_FROM",
|
|
21
|
+
"TAIJI_PRESET_FALLBACK_TO"
|
|
18
22
|
];
|
|
19
23
|
var ENGINE_ENV_L0_INFRA_KEYS = [
|
|
20
|
-
"
|
|
21
|
-
"
|
|
24
|
+
"TAIJI_AGENT_DATA_DIR",
|
|
25
|
+
"TAIJI_AGENT_ENGINE_NODE",
|
|
22
26
|
"ELECTRON_RUN_AS_NODE",
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
+
"TAIJI_AGENT_SUBAGENT",
|
|
28
|
+
"TAIJI_SUBAGENT_RELAY_SOCKET",
|
|
29
|
+
"TAIJI_SUBAGENT_RELAY_NODE",
|
|
30
|
+
"TAIJI_SUBAGENT_RELAY_SCRIPT"
|
|
27
31
|
];
|
|
28
32
|
var ENV_PREFIX_SHAPE_RE = /^[A-Za-z0-9_]+$/;
|
|
29
33
|
function deleteEnvKeysCaseInsensitive(env, names) {
|
|
@@ -73,14 +77,14 @@ function applyManifestAllowlist(env, opts) {
|
|
|
73
77
|
}
|
|
74
78
|
}
|
|
75
79
|
function injectL0InfraKeys(env, opts) {
|
|
76
|
-
env.
|
|
77
|
-
if (opts.engineNode !== void 0) env.
|
|
80
|
+
env.TAIJI_AGENT_DATA_DIR = opts.dataDir;
|
|
81
|
+
if (opts.engineNode !== void 0) env.TAIJI_AGENT_ENGINE_NODE = opts.engineNode;
|
|
78
82
|
if (opts.electronRunAsNode === true) env.ELECTRON_RUN_AS_NODE = "1";
|
|
79
|
-
env.
|
|
83
|
+
env.TAIJI_AGENT_SUBAGENT = "1";
|
|
80
84
|
if (opts.relay !== void 0) {
|
|
81
|
-
env.
|
|
82
|
-
env.
|
|
83
|
-
env.
|
|
85
|
+
env.TAIJI_SUBAGENT_RELAY_SOCKET = opts.relay.socket;
|
|
86
|
+
env.TAIJI_SUBAGENT_RELAY_NODE = opts.relay.node;
|
|
87
|
+
env.TAIJI_SUBAGENT_RELAY_SCRIPT = opts.relay.script;
|
|
84
88
|
}
|
|
85
89
|
if (opts.identityEnv !== void 0) {
|
|
86
90
|
for (const [key, value] of Object.entries(opts.identityEnv)) {
|
|
@@ -62,38 +62,71 @@ interface Turn {
|
|
|
62
62
|
* activity = 纯活性信号:双侧 reducer no-op、不开 turn、不写状态、不落 journal
|
|
63
63
|
* (core journal-wiring 对其豁免 append),只承诺「引擎活跃时周期性出现」——供宿主
|
|
64
64
|
* 无进展守护刷新判活(长工具执行期)。节流属生产者实现细节,不进协议承诺。
|
|
65
|
+
*
|
|
66
|
+
* 每个成员的 type 经 `EventName<"…">` 受词表约束(编译锁①,见下方词表节)。
|
|
65
67
|
*/
|
|
66
68
|
type AgentEvent = {
|
|
67
|
-
type: "tool_start"
|
|
69
|
+
type: EventName<"tool_start">;
|
|
68
70
|
toolName: string;
|
|
69
71
|
args?: unknown;
|
|
70
72
|
} | {
|
|
71
|
-
type: "tool_end"
|
|
73
|
+
type: EventName<"tool_end">;
|
|
72
74
|
toolName: string;
|
|
73
75
|
args?: unknown;
|
|
74
76
|
result?: ToolCallResult;
|
|
75
77
|
isError?: boolean;
|
|
76
78
|
} | {
|
|
77
|
-
type: "text_delta"
|
|
79
|
+
type: EventName<"text_delta">;
|
|
78
80
|
delta: string;
|
|
79
81
|
} | {
|
|
80
|
-
type: "thinking_delta"
|
|
82
|
+
type: EventName<"thinking_delta">;
|
|
81
83
|
delta: string;
|
|
82
84
|
} | {
|
|
83
|
-
type: "turn_end"
|
|
85
|
+
type: EventName<"turn_end">;
|
|
84
86
|
summary?: string;
|
|
85
87
|
} | {
|
|
86
|
-
type: "message_end"
|
|
88
|
+
type: EventName<"message_end">;
|
|
87
89
|
usage?: AgentUsage;
|
|
88
90
|
error?: string;
|
|
89
91
|
} | {
|
|
90
|
-
type: "compaction"
|
|
92
|
+
type: EventName<"compaction">;
|
|
91
93
|
} | {
|
|
92
|
-
type: "activity"
|
|
94
|
+
type: EventName<"activity">;
|
|
93
95
|
} | {
|
|
94
|
-
type: "error"
|
|
96
|
+
type: EventName<"error">;
|
|
95
97
|
message: string;
|
|
96
98
|
};
|
|
99
|
+
/**
|
|
100
|
+
* 事件类型词表(协议事件全集 9 种,运行时 SSOT):schema 事件 `type.enum` 从本表
|
|
101
|
+
* 派生(schema.ts),测试取值遍历本表(protocol-schema.test.ts / contract-closure.test.ts)
|
|
102
|
+
* ——新增事件变体不再手写第三处。
|
|
103
|
+
*
|
|
104
|
+
* 每个成员必须带一行 `// noop-safe: <论证>`:未知成员宽容语义四行①(ADR-0071)的
|
|
105
|
+
* 逐变体登记——旧宿主 reducer 遇未知 event.type 走 default 分支零写入,标记后写
|
|
106
|
+
* 「本变体被丢弃时状态无损」的一行论证(no-op 安全性属运行时消费语义,不可静态
|
|
107
|
+
* 判定——守卫只查标记存在不查内容,落点 contract-closure.test.ts「noop-safe 标记守卫」)。
|
|
108
|
+
*
|
|
109
|
+
* 编译锁(漏改任一侧 typecheck 红,且错误指向漏点):
|
|
110
|
+
* ① union 侧——成员 type 必须经 `EventName<"x">` 取名(约束 = 本词表):union 加
|
|
111
|
+
* 成员不登词表 → TS2344 直接落在漏改的成员行;
|
|
112
|
+
* ② 词表侧——`satisfies readonly AgentEvent["type"][]`:词表加成员不加 union
|
|
113
|
+
* → 错误直接落在词表漏改的成员行;
|
|
114
|
+
* ③ 兜底——成员绕过 EventName 约束裸加字面量 → _EventVocabSyncLock 爆红。
|
|
115
|
+
* 新增事件变体的同步面分两层,漏改任一处 typecheck 均红且精确指路(验收 A1 演练
|
|
116
|
+
* 实证):协议面两笔(词表 + union)即协议面全同步——schema enum 与遍历型测试断言
|
|
117
|
+
* 自动跟随;同仓消费面另有两处编译期同步点——journal-replay reducer case(穷尽
|
|
118
|
+
* switch never 检查)与 contract-closure 构造冒烟(Record<AgentEventTypeName,…>
|
|
119
|
+
* 漏键爆红)。不 bump 版本、不改任何引擎(演进政策 additive 面,判据全文见头注)。
|
|
120
|
+
*/
|
|
121
|
+
declare const AGENT_EVENT_TYPE_NAMES: readonly ["tool_start", "tool_end", "text_delta", "thinking_delta", "turn_end", "message_end", "compaction", "activity", "error"];
|
|
122
|
+
/** 词表派生的事件名联合(编译锁②/③的词表侧源;schema enum 与测试取值同源)。 */
|
|
123
|
+
type AgentEventTypeName = (typeof AGENT_EVENT_TYPE_NAMES)[number];
|
|
124
|
+
/**
|
|
125
|
+
* 词表约束的事件 type 字面量(编译锁①):union 成员经 `EventName<"x">` 取名,
|
|
126
|
+
* 词表漏登时 typecheck 错误落在该成员行。类型恒等(解析为同一字面量),
|
|
127
|
+
* 结构与运行时语义零变化。
|
|
128
|
+
*/
|
|
129
|
+
type EventName<T extends AgentEventTypeName> = T;
|
|
97
130
|
/**
|
|
98
131
|
* EngineHandle 的持久化形态(JSON v1)。协议 run 终态应答 / read 的
|
|
99
132
|
* handle 载荷(引擎不持有宿主运行时引用,data 即全部)。
|
|
@@ -173,7 +206,7 @@ interface EngineCapabilities {
|
|
|
173
206
|
conversation: "native" | "cold" | "unsupported";
|
|
174
207
|
/** 决定 persona 路由策略(file/flag/prompt 通道)。 */
|
|
175
208
|
personaInjection: "file" | "flag" | "prompt";
|
|
176
|
-
/** 粗粒度引擎:GUI
|
|
209
|
+
/** 粗粒度引擎:GUI 显示降级为阶段态。判据 5 回指:被 streamMode 键消费(degradable 先例)。 */
|
|
177
210
|
eventGranularity: "stream" | "coarse";
|
|
178
211
|
/** emulated = worktree 隔离(无 OS sandbox 的引擎用文件写维度隔离补齐)。 */
|
|
179
212
|
sandbox: "native" | "emulated" | "none";
|
|
@@ -336,4 +369,4 @@ interface AgentCallOpts {
|
|
|
336
369
|
permissionMode?: string;
|
|
337
370
|
}
|
|
338
371
|
|
|
339
|
-
export
|
|
372
|
+
export { AGENT_EVENT_TYPE_NAMES as A, type EngineCapabilities as E, type InternalToolCall as I, type ModelCatalogEntry as M, type ProbeReport as P, type ReplayedTurn as R, type SessionView as S, type ToolCall as T, type WorktreeHandle as W, type AgentCallOpts as a, type AgentEvent as b, type AgentEventTypeName as c, type AgentFailureKind as d, type AgentOutcome as e, type AgentOutcomeUsage as f, type AgentUsage as g, type AgentUsageTotal as h, type AssertMutuallyAssignable as i, type EngineHandleData as j, type ResumeAnchor as k, type ToolCallEntry as l, type ToolCallResult as m, type Turn as n };
|
|
@@ -62,38 +62,71 @@ interface Turn {
|
|
|
62
62
|
* activity = 纯活性信号:双侧 reducer no-op、不开 turn、不写状态、不落 journal
|
|
63
63
|
* (core journal-wiring 对其豁免 append),只承诺「引擎活跃时周期性出现」——供宿主
|
|
64
64
|
* 无进展守护刷新判活(长工具执行期)。节流属生产者实现细节,不进协议承诺。
|
|
65
|
+
*
|
|
66
|
+
* 每个成员的 type 经 `EventName<"…">` 受词表约束(编译锁①,见下方词表节)。
|
|
65
67
|
*/
|
|
66
68
|
type AgentEvent = {
|
|
67
|
-
type: "tool_start"
|
|
69
|
+
type: EventName<"tool_start">;
|
|
68
70
|
toolName: string;
|
|
69
71
|
args?: unknown;
|
|
70
72
|
} | {
|
|
71
|
-
type: "tool_end"
|
|
73
|
+
type: EventName<"tool_end">;
|
|
72
74
|
toolName: string;
|
|
73
75
|
args?: unknown;
|
|
74
76
|
result?: ToolCallResult;
|
|
75
77
|
isError?: boolean;
|
|
76
78
|
} | {
|
|
77
|
-
type: "text_delta"
|
|
79
|
+
type: EventName<"text_delta">;
|
|
78
80
|
delta: string;
|
|
79
81
|
} | {
|
|
80
|
-
type: "thinking_delta"
|
|
82
|
+
type: EventName<"thinking_delta">;
|
|
81
83
|
delta: string;
|
|
82
84
|
} | {
|
|
83
|
-
type: "turn_end"
|
|
85
|
+
type: EventName<"turn_end">;
|
|
84
86
|
summary?: string;
|
|
85
87
|
} | {
|
|
86
|
-
type: "message_end"
|
|
88
|
+
type: EventName<"message_end">;
|
|
87
89
|
usage?: AgentUsage;
|
|
88
90
|
error?: string;
|
|
89
91
|
} | {
|
|
90
|
-
type: "compaction"
|
|
92
|
+
type: EventName<"compaction">;
|
|
91
93
|
} | {
|
|
92
|
-
type: "activity"
|
|
94
|
+
type: EventName<"activity">;
|
|
93
95
|
} | {
|
|
94
|
-
type: "error"
|
|
96
|
+
type: EventName<"error">;
|
|
95
97
|
message: string;
|
|
96
98
|
};
|
|
99
|
+
/**
|
|
100
|
+
* 事件类型词表(协议事件全集 9 种,运行时 SSOT):schema 事件 `type.enum` 从本表
|
|
101
|
+
* 派生(schema.ts),测试取值遍历本表(protocol-schema.test.ts / contract-closure.test.ts)
|
|
102
|
+
* ——新增事件变体不再手写第三处。
|
|
103
|
+
*
|
|
104
|
+
* 每个成员必须带一行 `// noop-safe: <论证>`:未知成员宽容语义四行①(ADR-0071)的
|
|
105
|
+
* 逐变体登记——旧宿主 reducer 遇未知 event.type 走 default 分支零写入,标记后写
|
|
106
|
+
* 「本变体被丢弃时状态无损」的一行论证(no-op 安全性属运行时消费语义,不可静态
|
|
107
|
+
* 判定——守卫只查标记存在不查内容,落点 contract-closure.test.ts「noop-safe 标记守卫」)。
|
|
108
|
+
*
|
|
109
|
+
* 编译锁(漏改任一侧 typecheck 红,且错误指向漏点):
|
|
110
|
+
* ① union 侧——成员 type 必须经 `EventName<"x">` 取名(约束 = 本词表):union 加
|
|
111
|
+
* 成员不登词表 → TS2344 直接落在漏改的成员行;
|
|
112
|
+
* ② 词表侧——`satisfies readonly AgentEvent["type"][]`:词表加成员不加 union
|
|
113
|
+
* → 错误直接落在词表漏改的成员行;
|
|
114
|
+
* ③ 兜底——成员绕过 EventName 约束裸加字面量 → _EventVocabSyncLock 爆红。
|
|
115
|
+
* 新增事件变体的同步面分两层,漏改任一处 typecheck 均红且精确指路(验收 A1 演练
|
|
116
|
+
* 实证):协议面两笔(词表 + union)即协议面全同步——schema enum 与遍历型测试断言
|
|
117
|
+
* 自动跟随;同仓消费面另有两处编译期同步点——journal-replay reducer case(穷尽
|
|
118
|
+
* switch never 检查)与 contract-closure 构造冒烟(Record<AgentEventTypeName,…>
|
|
119
|
+
* 漏键爆红)。不 bump 版本、不改任何引擎(演进政策 additive 面,判据全文见头注)。
|
|
120
|
+
*/
|
|
121
|
+
declare const AGENT_EVENT_TYPE_NAMES: readonly ["tool_start", "tool_end", "text_delta", "thinking_delta", "turn_end", "message_end", "compaction", "activity", "error"];
|
|
122
|
+
/** 词表派生的事件名联合(编译锁②/③的词表侧源;schema enum 与测试取值同源)。 */
|
|
123
|
+
type AgentEventTypeName = (typeof AGENT_EVENT_TYPE_NAMES)[number];
|
|
124
|
+
/**
|
|
125
|
+
* 词表约束的事件 type 字面量(编译锁①):union 成员经 `EventName<"x">` 取名,
|
|
126
|
+
* 词表漏登时 typecheck 错误落在该成员行。类型恒等(解析为同一字面量),
|
|
127
|
+
* 结构与运行时语义零变化。
|
|
128
|
+
*/
|
|
129
|
+
type EventName<T extends AgentEventTypeName> = T;
|
|
97
130
|
/**
|
|
98
131
|
* EngineHandle 的持久化形态(JSON v1)。协议 run 终态应答 / read 的
|
|
99
132
|
* handle 载荷(引擎不持有宿主运行时引用,data 即全部)。
|
|
@@ -173,7 +206,7 @@ interface EngineCapabilities {
|
|
|
173
206
|
conversation: "native" | "cold" | "unsupported";
|
|
174
207
|
/** 决定 persona 路由策略(file/flag/prompt 通道)。 */
|
|
175
208
|
personaInjection: "file" | "flag" | "prompt";
|
|
176
|
-
/** 粗粒度引擎:GUI
|
|
209
|
+
/** 粗粒度引擎:GUI 显示降级为阶段态。判据 5 回指:被 streamMode 键消费(degradable 先例)。 */
|
|
177
210
|
eventGranularity: "stream" | "coarse";
|
|
178
211
|
/** emulated = worktree 隔离(无 OS sandbox 的引擎用文件写维度隔离补齐)。 */
|
|
179
212
|
sandbox: "native" | "emulated" | "none";
|
|
@@ -336,4 +369,4 @@ interface AgentCallOpts {
|
|
|
336
369
|
permissionMode?: string;
|
|
337
370
|
}
|
|
338
371
|
|
|
339
|
-
export
|
|
372
|
+
export { AGENT_EVENT_TYPE_NAMES as A, type EngineCapabilities as E, type InternalToolCall as I, type ModelCatalogEntry as M, type ProbeReport as P, type ReplayedTurn as R, type SessionView as S, type ToolCall as T, type WorktreeHandle as W, type AgentCallOpts as a, type AgentEvent as b, type AgentEventTypeName as c, type AgentFailureKind as d, type AgentOutcome as e, type AgentOutcomeUsage as f, type AgentUsage as g, type AgentUsageTotal as h, type AssertMutuallyAssignable as i, type EngineHandleData as j, type ResumeAnchor as k, type ToolCallEntry as l, type ToolCallResult as m, type Turn as n };
|
package/dist/data-dir.cjs
CHANGED
|
@@ -20,7 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/data-dir.ts
|
|
21
21
|
var data_dir_exports = {};
|
|
22
22
|
__export(data_dir_exports, {
|
|
23
|
-
|
|
23
|
+
TAIJI_DATA_DIR_ENV: () => TAIJI_DATA_DIR_ENV,
|
|
24
24
|
resetDataDirWarnForTests: () => resetDataDirWarnForTests,
|
|
25
25
|
resolveEngineDataDir: () => resolveEngineDataDir
|
|
26
26
|
});
|
|
@@ -75,7 +75,7 @@ function getLogger(component) {
|
|
|
75
75
|
|
|
76
76
|
// src/data-dir.ts
|
|
77
77
|
var logger = getLogger("subagents");
|
|
78
|
-
var
|
|
78
|
+
var TAIJI_DATA_DIR_ENV = "TAIJI_AGENT_DATA_DIR";
|
|
79
79
|
var WARNED_SLOT_KEY = /* @__PURE__ */ Symbol.for("@zhushanwen/subagent-engine-sdk.data-dir-warned");
|
|
80
80
|
function getWarnedSlot() {
|
|
81
81
|
let slot = Reflect.get(globalThis, WARNED_SLOT_KEY);
|
|
@@ -89,19 +89,19 @@ function resetDataDirWarnForTests() {
|
|
|
89
89
|
getWarnedSlot().current = false;
|
|
90
90
|
}
|
|
91
91
|
function resolveEngineDataDir(env, opts = {}) {
|
|
92
|
-
const fromEnv = env[
|
|
92
|
+
const fromEnv = env[TAIJI_DATA_DIR_ENV]?.trim();
|
|
93
93
|
if (fromEnv !== void 0 && fromEnv !== "") return fromEnv;
|
|
94
94
|
const fallback = opts.fallbackDataRoot?.trim();
|
|
95
95
|
if (fallback === void 0 || fallback === "") {
|
|
96
96
|
throw new Error(
|
|
97
|
-
`[subagent-engine-sdk] engine_not_found: ${
|
|
97
|
+
`[subagent-engine-sdk] engine_not_found: ${TAIJI_DATA_DIR_ENV} is not set and no fallback data root was injected. Recovery: the host must inject ${TAIJI_DATA_DIR_ENV} into the engine process env (taiji runtime / pi extension host do this at spawn), or pass { fallbackDataRoot } when calling resolveEngineDataDir from a host that resolves the data root itself.`
|
|
98
98
|
);
|
|
99
99
|
}
|
|
100
100
|
if (!getWarnedSlot().current) {
|
|
101
101
|
getWarnedSlot().current = true;
|
|
102
102
|
const warn = opts.warn ?? defaultWarn;
|
|
103
103
|
warn(
|
|
104
|
-
`[engine-data-dir] ${
|
|
104
|
+
`[engine-data-dir] ${TAIJI_DATA_DIR_ENV} is not set; engine journal/pool fall back to the injected data root (${fallback}). The taiji host normally injects this env \u2014 if you are running inside taiji, check the runtime spawn env; standalone installs intentionally use the injected root.`
|
|
105
105
|
);
|
|
106
106
|
}
|
|
107
107
|
return fallback;
|
|
@@ -111,7 +111,7 @@ function defaultWarn(msg) {
|
|
|
111
111
|
}
|
|
112
112
|
// Annotate the CommonJS export names for ESM import in node:
|
|
113
113
|
0 && (module.exports = {
|
|
114
|
-
|
|
114
|
+
TAIJI_DATA_DIR_ENV,
|
|
115
115
|
resetDataDirWarnForTests,
|
|
116
116
|
resolveEngineDataDir
|
|
117
117
|
});
|
package/dist/data-dir.d.cts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
declare const
|
|
1
|
+
/** taiji 数据目录 env 名(与 packages/shared/src/paths.ts 的 SSOT 变量同名)。 */
|
|
2
|
+
declare const TAIJI_DATA_DIR_ENV = "TAIJI_AGENT_DATA_DIR";
|
|
3
3
|
/** 测试隔离专用:重置 warn-once 标记(生产禁用)。 */
|
|
4
4
|
declare function resetDataDirWarnForTests(): void;
|
|
5
5
|
/**
|
|
6
6
|
* 解析引擎数据目录(journal 落盘 / 隔离池的根):
|
|
7
|
-
* 1. env[
|
|
7
|
+
* 1. env[TAIJI_AGENT_DATA_DIR](宿主注入,权威通道);
|
|
8
8
|
* 2. 缺失 + opts.fallbackDataRoot 显式传入(宿主解析过的数据根)→ 用之 + warn 一次
|
|
9
9
|
* (非权威通道回退必须可观测——journal 落点变化不留静默漂移);
|
|
10
10
|
* 3. 两者皆缺 → 抛错(engine_not_found 语义:错误含 env 名、期望值示例与恢复动作;
|
|
@@ -17,4 +17,4 @@ declare function resolveEngineDataDir(env: NodeJS.ProcessEnv, opts?: {
|
|
|
17
17
|
warn?: (msg: string) => void;
|
|
18
18
|
}): string;
|
|
19
19
|
|
|
20
|
-
export {
|
|
20
|
+
export { TAIJI_DATA_DIR_ENV, resetDataDirWarnForTests, resolveEngineDataDir };
|
package/dist/data-dir.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
declare const
|
|
1
|
+
/** taiji 数据目录 env 名(与 packages/shared/src/paths.ts 的 SSOT 变量同名)。 */
|
|
2
|
+
declare const TAIJI_DATA_DIR_ENV = "TAIJI_AGENT_DATA_DIR";
|
|
3
3
|
/** 测试隔离专用:重置 warn-once 标记(生产禁用)。 */
|
|
4
4
|
declare function resetDataDirWarnForTests(): void;
|
|
5
5
|
/**
|
|
6
6
|
* 解析引擎数据目录(journal 落盘 / 隔离池的根):
|
|
7
|
-
* 1. env[
|
|
7
|
+
* 1. env[TAIJI_AGENT_DATA_DIR](宿主注入,权威通道);
|
|
8
8
|
* 2. 缺失 + opts.fallbackDataRoot 显式传入(宿主解析过的数据根)→ 用之 + warn 一次
|
|
9
9
|
* (非权威通道回退必须可观测——journal 落点变化不留静默漂移);
|
|
10
10
|
* 3. 两者皆缺 → 抛错(engine_not_found 语义:错误含 env 名、期望值示例与恢复动作;
|
|
@@ -17,4 +17,4 @@ declare function resolveEngineDataDir(env: NodeJS.ProcessEnv, opts?: {
|
|
|
17
17
|
warn?: (msg: string) => void;
|
|
18
18
|
}): string;
|
|
19
19
|
|
|
20
|
-
export {
|
|
20
|
+
export { TAIJI_DATA_DIR_ENV, resetDataDirWarnForTests, resolveEngineDataDir };
|
package/dist/data-dir.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
2
|
+
TAIJI_DATA_DIR_ENV,
|
|
3
3
|
resetDataDirWarnForTests,
|
|
4
4
|
resolveEngineDataDir
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-X24IVQKJ.js";
|
|
6
6
|
import "./chunk-75QEMUGV.js";
|
|
7
7
|
import "./chunk-JSBRDJBE.js";
|
|
8
8
|
export {
|
|
9
|
-
|
|
9
|
+
TAIJI_DATA_DIR_ENV,
|
|
10
10
|
resetDataDirWarnForTests,
|
|
11
11
|
resolveEngineDataDir
|
|
12
12
|
};
|