ycodium-acp-executor 0.2.3208 → 0.2.3212
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/README.md +14 -0
- package/dist/executor.d.ts +6 -1
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +27 -2
- package/dist/executor.js.map +1 -1
- package/dist/protocol-log.d.ts +32 -0
- package/dist/protocol-log.d.ts.map +1 -0
- package/dist/protocol-log.js +113 -0
- package/dist/protocol-log.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -120,6 +120,20 @@ re-exports the SDK's method tables and request and response types (`CLIENT_METHO
|
|
|
120
120
|
`AGENT_METHODS`, `PromptRequest`, `SessionNotification`, and so on). Reach for it only if
|
|
121
121
|
`createAcpExecutor` does not fit; everything above is built on it.
|
|
122
122
|
|
|
123
|
+
## Diagnosing dropped output
|
|
124
|
+
|
|
125
|
+
Some agents answer `session/prompt` before they have actually run the turn, then never send
|
|
126
|
+
that turn's `session/update` frames. When the UI shows nothing but the CLI's own transcript has
|
|
127
|
+
a reply, the canonical event log cannot tell you whether frames ever crossed the process
|
|
128
|
+
boundary: it is written after parsing and filters transient events.
|
|
129
|
+
|
|
130
|
+
Set `YCODIUM_ACP_PROTOCOL_LOG=1` to make `createAcpExecutor` write every frame the connection
|
|
131
|
+
sees (`direction`, `stage`, `payload`) to a per-session NDJSON file under the system temp
|
|
132
|
+
directory, or under `YCODIUM_ACP_PROTOCOL_LOG_DIR` when set. The path is logged once at
|
|
133
|
+
session start. Files stop at 8 MiB. Payloads contain user content, so keep this off outside an
|
|
134
|
+
investigation. Embedders that already own a sink can pass `protocolLog` instead; the executor
|
|
135
|
+
does not create a file then.
|
|
136
|
+
|
|
123
137
|
## Stability
|
|
124
138
|
|
|
125
139
|
Ycodium's own agent plugins (ACP, DSH, Grok, Kimi Code) depend on this package, so its exports
|
package/dist/executor.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type * as NodeStream from "node:stream";
|
|
2
2
|
import { AcpExecutorError } from "./errors.ts";
|
|
3
3
|
import { type AcpOpenToolCall } from "./openCommands.ts";
|
|
4
|
-
import { type InitializeResponse } from "./protocol.ts";
|
|
4
|
+
import { type AcpProtocolLogEvent, type InitializeResponse } from "./protocol.ts";
|
|
5
5
|
import { type AcpAvailableCommand, type AcpPermissionRequest } from "./runtime-model.ts";
|
|
6
6
|
import type { AcpApprovalDecision, AcpPromptInput, AcpSessionStartResult, AcpSessionStatus, AcpTurnResult, ExecutorEvent } from "./types.ts";
|
|
7
7
|
import { type AcpVendorHooks } from "./vendor-hooks.ts";
|
|
@@ -66,6 +66,11 @@ export type AcpExecutorOptions = {
|
|
|
66
66
|
readonly info: (message: string, fields?: Readonly<Record<string, unknown>>) => void;
|
|
67
67
|
readonly warn?: (message: string, fields?: Readonly<Record<string, unknown>>) => void;
|
|
68
68
|
};
|
|
69
|
+
/**
|
|
70
|
+
* 调试缝:连接层看到的每一帧原始/解码 ACP 消息。设了就不再看环境变量。
|
|
71
|
+
* 载荷是协议原文(可能含用户内容),只在排查时接。
|
|
72
|
+
*/
|
|
73
|
+
readonly protocolLog?: (event: AcpProtocolLogEvent) => void;
|
|
69
74
|
readonly cancelGraceMs?: number;
|
|
70
75
|
/** 已收到结果的收尾等待上限;不罩进程或连接清理。 */
|
|
71
76
|
readonly resultDrainTimeoutMs?: number;
|
package/dist/executor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,UAAU,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAc/C,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/executor.js
CHANGED
|
@@ -17,6 +17,7 @@ import { createExecutorUpdates } from "./executor/updates.js";
|
|
|
17
17
|
import { acpTransportIfEstablished } from "./failureCategory.js";
|
|
18
18
|
import { Mutex } from "./mutex.js";
|
|
19
19
|
import { readOpenToolCalls } from "./openCommands.js";
|
|
20
|
+
import { createAcpProtocolLogFromEnv } from "./protocol-log.js";
|
|
20
21
|
import { CLIENT_METHODS, RequestError, createAcpConnection, } from "./protocol.js";
|
|
21
22
|
import {} from "./runtime-model.js";
|
|
22
23
|
import {} from "./user-input-pending.js";
|
|
@@ -113,9 +114,20 @@ export function createAcpExecutor(options) {
|
|
|
113
114
|
});
|
|
114
115
|
const { rememberSettledPromptKey, abortPendingSettlement, settleFromNotification } = createExecutorSettlement({ hooks, shared });
|
|
115
116
|
const promptResults = createPromptResults({ options, shared });
|
|
117
|
+
// 默认关闭的原始帧记录:环境变量开启时每会话写一个 NDJSON 文件;嵌入方可以用
|
|
118
|
+
// `protocolLog` 直接接走。关闭交给 dispose,别把句柄留到进程结束。
|
|
119
|
+
const protocolLogSink = options.protocolLog === undefined
|
|
120
|
+
? createAcpProtocolLogFromEnv({
|
|
121
|
+
provider: options.provider,
|
|
122
|
+
threadId: options.threadId,
|
|
123
|
+
...(options.log === undefined ? {} : { log: options.log }),
|
|
124
|
+
})
|
|
125
|
+
: undefined;
|
|
126
|
+
const protocolLog = options.protocolLog ?? protocolLogSink?.write;
|
|
116
127
|
const connection = createAcpConnection({
|
|
117
128
|
readable: options.readable,
|
|
118
129
|
writable: options.writable,
|
|
130
|
+
...(protocolLog === undefined ? {} : { logger: protocolLog }),
|
|
119
131
|
onInboundFailure: (error) => {
|
|
120
132
|
options.log?.warn?.("acp connection closed: an inbound request could not be answered", {
|
|
121
133
|
threadId: options.threadId,
|
|
@@ -218,7 +230,7 @@ export function createAcpExecutor(options) {
|
|
|
218
230
|
notifyPromptSettled,
|
|
219
231
|
shared,
|
|
220
232
|
});
|
|
221
|
-
const { cancel, compact, dispose } = createExecutorLifecycle({
|
|
233
|
+
const { cancel, compact, dispose: disposeLifecycle, } = createExecutorLifecycle({
|
|
222
234
|
promptResults,
|
|
223
235
|
failIfDisposed,
|
|
224
236
|
requireStarted,
|
|
@@ -245,6 +257,7 @@ export function createAcpExecutor(options) {
|
|
|
245
257
|
onInputDead,
|
|
246
258
|
shared,
|
|
247
259
|
});
|
|
260
|
+
let disposeOnce;
|
|
248
261
|
return {
|
|
249
262
|
get generation() {
|
|
250
263
|
return shared.generation;
|
|
@@ -267,7 +280,19 @@ export function createAcpExecutor(options) {
|
|
|
267
280
|
setNativeMode,
|
|
268
281
|
compact,
|
|
269
282
|
openToolCalls: () => readOpenToolCalls(toolCalls, shared.activeTurnId),
|
|
270
|
-
dispose
|
|
283
|
+
dispose: () => {
|
|
284
|
+
// 同一轮清理只跑一次,调用方拿到的永远是同一个 Promise(与 disposeLifecycle 的
|
|
285
|
+
// 契约一致;调试用的文件句柄也算在这次清理里)。
|
|
286
|
+
disposeOnce ??= (async () => {
|
|
287
|
+
try {
|
|
288
|
+
await disposeLifecycle();
|
|
289
|
+
}
|
|
290
|
+
finally {
|
|
291
|
+
await protocolLogSink?.close();
|
|
292
|
+
}
|
|
293
|
+
})();
|
|
294
|
+
return disposeOnce;
|
|
295
|
+
},
|
|
271
296
|
};
|
|
272
297
|
}
|
|
273
298
|
export function isAcpExecutorError(error) {
|
package/dist/executor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,qCAAqC;AACrC,uCAAuC;AACvC,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAgC,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAwB,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EACL,cAAc,EACd,YAAY,EACZ,mBAAmB,
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as NodeStream from "node:stream";
|
|
2
|
+
import type { AcpProtocolLogEvent } from "./connection.ts";
|
|
3
|
+
export type AcpProtocolLogSink = {
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly write: (event: AcpProtocolLogEvent) => void;
|
|
6
|
+
readonly close: () => Promise<void>;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* 每个进程每次会话一个文件,写到上限后停机(不再写,保留已写的部分)。
|
|
10
|
+
* 用流写入是热路径:ACP 每个 token 都会经过这里,同步写会把每帧都变成一次系统调用。
|
|
11
|
+
*/
|
|
12
|
+
export declare function createAcpProtocolLogFile(input: {
|
|
13
|
+
readonly directory: string;
|
|
14
|
+
readonly provider: string;
|
|
15
|
+
readonly threadId: string;
|
|
16
|
+
readonly maxBytes?: number;
|
|
17
|
+
/** 测试用:换掉文件流,验证 close() 等的是 close 事件而不是 end()。 */
|
|
18
|
+
readonly openStream?: (path: string) => NodeStream.Writable;
|
|
19
|
+
}): AcpProtocolLogSink;
|
|
20
|
+
/**
|
|
21
|
+
* 按环境变量决定开不开。返回 undefined 表示这次会话不记录原始帧。
|
|
22
|
+
* 路径只在开启时打一条 info:排查的人要能从日志里找到文件。
|
|
23
|
+
*/
|
|
24
|
+
export declare function createAcpProtocolLogFromEnv(input: {
|
|
25
|
+
readonly provider: string;
|
|
26
|
+
readonly threadId: string;
|
|
27
|
+
readonly log?: {
|
|
28
|
+
readonly info: (message: string, fields?: Readonly<Record<string, unknown>>) => void;
|
|
29
|
+
readonly warn?: (message: string, fields?: Readonly<Record<string, unknown>>) => void;
|
|
30
|
+
};
|
|
31
|
+
}): AcpProtocolLogSink | undefined;
|
|
32
|
+
//# sourceMappingURL=protocol-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol-log.d.ts","sourceRoot":"","sources":["../src/protocol-log.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAK3D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC,CAAC;AAMF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC,QAAQ,CAAC;CAC7D,GAAG,kBAAkB,CA2DrB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE;QACb,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;QACrF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;KACvF,CAAC;CACH,GAAG,kBAAkB,GAAG,SAAS,CAyBjC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// @effect-diagnostics nodeBuiltinImport:off
|
|
2
|
+
// @effect-diagnostics globalDate:off
|
|
3
|
+
/**
|
|
4
|
+
* ACP 原始帧的可选落盘。
|
|
5
|
+
*
|
|
6
|
+
* 线上排查「界面没有回复、但 provider 说成功了」这类问题时,canonical 事件日志不够:
|
|
7
|
+
* 它写在解析与过滤之后,证明不了 stdio 上到底有没有帧。这个 sink 把连接层看到的原始
|
|
8
|
+
* 方向、阶段与载荷逐行写成 NDJSON,用来跨进程边界定位。
|
|
9
|
+
*
|
|
10
|
+
* 默认关闭:设 `YCODIUM_ACP_PROTOCOL_LOG=1` 才写,目录默认在系统临时目录下(可用
|
|
11
|
+
* `YCODIUM_ACP_PROTOCOL_LOG_DIR` 改)。载荷可能包含用户内容,只在排查时开。
|
|
12
|
+
*
|
|
13
|
+
* @module protocol-log
|
|
14
|
+
*/
|
|
15
|
+
import * as NodeFS from "node:fs";
|
|
16
|
+
import * as NodeOS from "node:os";
|
|
17
|
+
import * as NodePath from "node:path";
|
|
18
|
+
import * as NodeStream from "node:stream";
|
|
19
|
+
const DEFAULT_MAX_BYTES = 8 * 1024 * 1024;
|
|
20
|
+
const UNSAFE_FILE_CHARS = /[^A-Za-z0-9._-]+/gu;
|
|
21
|
+
function safeFileName(value) {
|
|
22
|
+
return value.replaceAll(UNSAFE_FILE_CHARS, "_");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 每个进程每次会话一个文件,写到上限后停机(不再写,保留已写的部分)。
|
|
26
|
+
* 用流写入是热路径:ACP 每个 token 都会经过这里,同步写会把每帧都变成一次系统调用。
|
|
27
|
+
*/
|
|
28
|
+
export function createAcpProtocolLogFile(input) {
|
|
29
|
+
const maxBytes = input.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
30
|
+
NodeFS.mkdirSync(input.directory, { recursive: true });
|
|
31
|
+
const filePath = NodePath.join(input.directory, `${safeFileName(input.provider)}-${safeFileName(input.threadId)}-${Date.now().toString(36)}.ndjson`);
|
|
32
|
+
const stream = (input.openStream ?? ((path) => NodeFS.createWriteStream(path, { flags: "a" })))(filePath);
|
|
33
|
+
let bytes = 0;
|
|
34
|
+
let stopped = false;
|
|
35
|
+
const closed = Promise.withResolvers();
|
|
36
|
+
let closing = false;
|
|
37
|
+
stream.once("close", () => closed.resolve());
|
|
38
|
+
// 磁盘满、目录被删:调试记录不能把宿主带崩,停写并释放句柄。close() 等的是真正的
|
|
39
|
+
// close 事件,不是 error:解析上的错误不等于句柄已经交还给操作系统。
|
|
40
|
+
stream.on("error", () => {
|
|
41
|
+
stopped = true;
|
|
42
|
+
stream.destroy();
|
|
43
|
+
});
|
|
44
|
+
const writeTruncated = () => {
|
|
45
|
+
stopped = true;
|
|
46
|
+
const marker = `${JSON.stringify({ at: new Date().toISOString(), stage: "truncated" })}\n`;
|
|
47
|
+
// 上限覆盖最终文件:截断标记自己也算字节,放不下就不写。
|
|
48
|
+
if (bytes + Buffer.byteLength(marker) <= maxBytes)
|
|
49
|
+
stream.write(marker);
|
|
50
|
+
stream.end();
|
|
51
|
+
};
|
|
52
|
+
const writeLine = (value) => {
|
|
53
|
+
if (stopped)
|
|
54
|
+
return;
|
|
55
|
+
const line = `${JSON.stringify(value)}\n`;
|
|
56
|
+
const lineBytes = Buffer.byteLength(line);
|
|
57
|
+
if (bytes + lineBytes > maxBytes) {
|
|
58
|
+
writeTruncated();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
bytes += lineBytes;
|
|
62
|
+
stream.write(line);
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
path: filePath,
|
|
66
|
+
write: (event) => writeLine({
|
|
67
|
+
at: new Date().toISOString(),
|
|
68
|
+
direction: event.direction,
|
|
69
|
+
stage: event.stage,
|
|
70
|
+
payload: event.payload,
|
|
71
|
+
}),
|
|
72
|
+
close: async () => {
|
|
73
|
+
if (closing)
|
|
74
|
+
return closed.promise;
|
|
75
|
+
closing = true;
|
|
76
|
+
stopped = true;
|
|
77
|
+
stream.end();
|
|
78
|
+
await closed.promise;
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 按环境变量决定开不开。返回 undefined 表示这次会话不记录原始帧。
|
|
84
|
+
* 路径只在开启时打一条 info:排查的人要能从日志里找到文件。
|
|
85
|
+
*/
|
|
86
|
+
export function createAcpProtocolLogFromEnv(input) {
|
|
87
|
+
const flag = process.env.YCODIUM_ACP_PROTOCOL_LOG;
|
|
88
|
+
if (flag !== "1" && flag?.toLowerCase() !== "true")
|
|
89
|
+
return undefined;
|
|
90
|
+
const configured = process.env.YCODIUM_ACP_PROTOCOL_LOG_DIR?.trim();
|
|
91
|
+
const directory = configured && configured.length > 0
|
|
92
|
+
? configured
|
|
93
|
+
: NodePath.join(NodeOS.tmpdir(), "ycodium-acp-protocol");
|
|
94
|
+
try {
|
|
95
|
+
const sink = createAcpProtocolLogFile({
|
|
96
|
+
directory,
|
|
97
|
+
provider: input.provider,
|
|
98
|
+
threadId: input.threadId,
|
|
99
|
+
});
|
|
100
|
+
input.log?.info("acp protocol frames are being recorded", { path: sink.path });
|
|
101
|
+
return sink;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
// 目录不可建、权限不足:这是可选诊断,不能把会话启动带下去。调用方这时可能已经
|
|
105
|
+
// 起好了子进程,异常穿出去就没人回收它。
|
|
106
|
+
input.log?.warn?.("acp protocol frame log could not be opened", {
|
|
107
|
+
directory,
|
|
108
|
+
error: error instanceof Error ? error.message : String(error),
|
|
109
|
+
});
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=protocol-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol-log.js","sourceRoot":"","sources":["../src/protocol-log.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ycodium-acp-executor",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3212",
|
|
4
4
|
"description": "Agent Client Protocol client and executor state machine for Ycodium agent plugins. Speaks ACP over stdio and emits Ycodium executor events.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"acp",
|