zelari-code 2.52.0 → 2.54.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/cli/acp/command.js +5 -3
- package/dist/cli/acp/command.js.map +1 -1
- package/dist/cli/acp/framing.js +151 -19
- package/dist/cli/acp/framing.js.map +1 -1
- package/dist/cli/acp/invariants.js +183 -0
- package/dist/cli/acp/invariants.js.map +1 -0
- package/dist/cli/acp/protocol.js +40 -5
- package/dist/cli/acp/protocol.js.map +1 -1
- package/dist/cli/acp/server.js +57 -17
- package/dist/cli/acp/server.js.map +1 -1
- package/dist/cli/acp/turnAdapter.js +2 -1
- package/dist/cli/acp/turnAdapter.js.map +1 -1
- package/dist/cli/app.js +2 -2
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/budget/cacheHitReport.js +94 -0
- package/dist/cli/budget/cacheHitReport.js.map +1 -0
- package/dist/cli/budget/messageUsage.js +77 -0
- package/dist/cli/budget/messageUsage.js.map +1 -0
- package/dist/cli/companion/framePolicy.js +116 -0
- package/dist/cli/companion/framePolicy.js.map +1 -0
- package/dist/cli/components/SelectList.js +51 -14
- package/dist/cli/components/SelectList.js.map +1 -1
- package/dist/cli/components/StatusBar.js +6 -2
- package/dist/cli/components/StatusBar.js.map +1 -1
- package/dist/cli/components/fuzzyMatch.js +108 -0
- package/dist/cli/components/fuzzyMatch.js.map +1 -0
- package/dist/cli/components/statusChips.js +47 -0
- package/dist/cli/components/statusChips.js.map +1 -1
- package/dist/cli/headless/protocol.js +39 -2
- package/dist/cli/headless/protocol.js.map +1 -1
- package/dist/cli/headless/runOneTurn.js +68 -18
- package/dist/cli/headless/runOneTurn.js.map +1 -1
- package/dist/cli/hooks/useChatTurn.js +76 -16
- package/dist/cli/hooks/useChatTurn.js.map +1 -1
- package/dist/cli/hooks/useSlashDispatch.js +5 -2
- package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
- package/dist/cli/inbox.js +220 -0
- package/dist/cli/inbox.js.map +1 -0
- package/dist/cli/main.bundled.js +3959 -2560
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +22 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/metrics.js.map +1 -1
- package/dist/cli/provider/anthropic.js +42 -6
- package/dist/cli/provider/anthropic.js.map +1 -1
- package/dist/cli/provider/chatgpt.js +4 -0
- package/dist/cli/provider/chatgpt.js.map +1 -1
- package/dist/cli/provider/openai-compatible.js +25 -3
- package/dist/cli/provider/openai-compatible.js.map +1 -1
- package/dist/cli/provider/responsesApi.js +4 -0
- package/dist/cli/provider/responsesApi.js.map +1 -1
- package/dist/cli/serve/harnessServer.js +7 -0
- package/dist/cli/serve/harnessServer.js.map +1 -1
- package/dist/cli/sessionManager.js +9 -2
- package/dist/cli/sessionManager.js.map +1 -1
- package/dist/cli/skillsCheck.js +209 -0
- package/dist/cli/skillsCheck.js.map +1 -0
- package/dist/cli/slashCommands.js +9 -0
- package/dist/cli/slashCommands.js.map +1 -1
- package/dist/cli/slashHandlers/provider.js.map +1 -1
- package/dist/cli/slashHandlers/sessions.js +131 -0
- package/dist/cli/slashHandlers/sessions.js.map +1 -0
- package/dist/cli/statusline/statuslineItems.js +22 -3
- package/dist/cli/statusline/statuslineItems.js.map +1 -1
- package/dist/cli/statusline/verdictFeed.js +245 -0
- package/dist/cli/statusline/verdictFeed.js.map +1 -0
- package/dist/cli/utils/doctor.js +30 -0
- package/dist/cli/utils/doctor.js.map +1 -1
- package/package.json +2 -2
package/dist/cli/acp/command.js
CHANGED
|
@@ -47,9 +47,11 @@ export function parseAcpFlags(argv) {
|
|
|
47
47
|
export function acpHelpText() {
|
|
48
48
|
return ('zelari-code acp — Agent Client Protocol server on stdio (for editors)\n' +
|
|
49
49
|
'\n' +
|
|
50
|
-
'Speaks JSON-RPC 2.0 over stdin/stdout
|
|
51
|
-
'(
|
|
52
|
-
'(
|
|
50
|
+
'Speaks JSON-RPC 2.0 over stdin/stdout as newline-delimited JSON\n' +
|
|
51
|
+
'(the ACP stdio transport, as spoken by Zed). LSP-style frames\n' +
|
|
52
|
+
'(`Content-Length: <bytes>\\r\\n\\r\\n<json>`) are also accepted and\n' +
|
|
53
|
+
'mirrored on output. Point an ACP-capable editor at this command as\n' +
|
|
54
|
+
'a custom agent server.\n' +
|
|
53
55
|
'\n' +
|
|
54
56
|
'Methods (implemented subset):\n' +
|
|
55
57
|
' initialize protocolVersion + agent capabilities\n' +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/acp/command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAe7C,8EAA8E;AAC9E,SAAS,aAAa,CAAC,IAAuB,EAAE,IAAY;IAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAC7E,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,IAAuB;IACnD,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IACpE,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACnD,IAAI,GAAG,KAAK,SAAS;QAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;IACrC,IAAI,KAAK,KAAK,SAAS;QAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;IAC3C,IAAI,QAAQ,KAAK,SAAS;QAAE,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACpD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CACL,yEAAyE;QACzE,IAAI;QACJ,
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/acp/command.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/acp/framing.js
CHANGED
|
@@ -1,17 +1,136 @@
|
|
|
1
1
|
import { createMessageParser, encodeMessage } from '../lsp/protocol.js';
|
|
2
2
|
export { createMessageParser, encodeMessage };
|
|
3
|
+
/** Runaway-buffer guard (advisory drop, the loop keeps running). */
|
|
4
|
+
const MAX_PENDING_BYTES = 4 * 1024 * 1024;
|
|
5
|
+
const HEADER_PREFIX = 'content-length:';
|
|
6
|
+
/**
|
|
7
|
+
* Byte-accurate dual-format incremental decoder. Works on Buffers (never on
|
|
8
|
+
* pre-decoded strings) so a UTF-8 sequence split across chunk boundaries
|
|
9
|
+
* cannot corrupt a message.
|
|
10
|
+
*/
|
|
11
|
+
export function createDualWireDecoder(format) {
|
|
12
|
+
const fmt = format ?? { mode: 'ndjson' };
|
|
13
|
+
let buf = Buffer.alloc(0);
|
|
14
|
+
let locked = false;
|
|
15
|
+
const lock = (mode) => {
|
|
16
|
+
if (locked)
|
|
17
|
+
return;
|
|
18
|
+
locked = true;
|
|
19
|
+
fmt.mode = mode;
|
|
20
|
+
};
|
|
21
|
+
/** One decoding step; `false` = more input needed before progressing. */
|
|
22
|
+
const step = (out) => {
|
|
23
|
+
while (buf.length > 0 && (buf[0] === 0x0a || buf[0] === 0x0d))
|
|
24
|
+
buf = buf.subarray(1);
|
|
25
|
+
if (buf.length === 0)
|
|
26
|
+
return false;
|
|
27
|
+
// LSP-style frame: `Content-Length: <n>\r\n\r\n<exactly n bytes>`.
|
|
28
|
+
if (buf.subarray(0, HEADER_PREFIX.length).toString('latin1').toLowerCase() === HEADER_PREFIX) {
|
|
29
|
+
const sep = buf.indexOf('\r\n\r\n');
|
|
30
|
+
if (sep === -1) {
|
|
31
|
+
if (buf.length > MAX_PENDING_BYTES) {
|
|
32
|
+
out.warnings.push('runaway header block without \\r\\n\\r\\n (dropped)');
|
|
33
|
+
buf = Buffer.alloc(0);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
const header = buf.subarray(0, sep).toString('latin1');
|
|
39
|
+
const m = /content-length:\s*(\d+)/i.exec(header);
|
|
40
|
+
if (!m) {
|
|
41
|
+
out.warnings.push(`frame without a usable Content-Length: ${JSON.stringify(header.slice(0, 80))}`);
|
|
42
|
+
buf = buf.subarray(sep + 4);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
const bodyStart = sep + 4;
|
|
46
|
+
const bodyEnd = bodyStart + Number(m[1]);
|
|
47
|
+
if (buf.length < bodyEnd)
|
|
48
|
+
return false;
|
|
49
|
+
const body = buf.subarray(bodyStart, bodyEnd).toString('utf8');
|
|
50
|
+
buf = buf.subarray(bodyEnd);
|
|
51
|
+
try {
|
|
52
|
+
out.messages.push(JSON.parse(body));
|
|
53
|
+
lock('lsp-frame');
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
out.warnings.push(`unparseable frame body (dropped): ${JSON.stringify(body.slice(0, 80))}`);
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
// NDJSON (the spec): one JSON object per line, `\n`-terminated.
|
|
61
|
+
const nl = buf.indexOf(0x0a);
|
|
62
|
+
if (nl === -1) {
|
|
63
|
+
if (buf.length > MAX_PENDING_BYTES) {
|
|
64
|
+
out.warnings.push('runaway line without a newline (dropped)');
|
|
65
|
+
buf = Buffer.alloc(0);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
const line = buf.subarray(0, nl).toString('utf8').replace(/\r+$/, '');
|
|
71
|
+
buf = buf.subarray(nl + 1);
|
|
72
|
+
if (line.trim().length === 0)
|
|
73
|
+
return true;
|
|
74
|
+
try {
|
|
75
|
+
out.messages.push(JSON.parse(line));
|
|
76
|
+
lock('ndjson');
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
out.warnings.push(`unparseable JSON line (dropped): ${JSON.stringify(line.slice(0, 80))}`);
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
};
|
|
83
|
+
const drain = () => {
|
|
84
|
+
const out = { messages: [], warnings: [] };
|
|
85
|
+
while (step(out)) {
|
|
86
|
+
/* keep draining */
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
};
|
|
90
|
+
return {
|
|
91
|
+
push(chunk) {
|
|
92
|
+
const data = typeof chunk === 'string' ? Buffer.from(chunk, 'utf8') : Buffer.from(chunk);
|
|
93
|
+
buf = buf.length === 0 ? data : Buffer.concat([buf, data]);
|
|
94
|
+
return drain();
|
|
95
|
+
},
|
|
96
|
+
/** EOF: salvage a trailing NDJSON line that lacks the final newline. */
|
|
97
|
+
flush() {
|
|
98
|
+
const out = drain();
|
|
99
|
+
if (buf.length === 0)
|
|
100
|
+
return out;
|
|
101
|
+
const line = buf.toString('utf8').trim();
|
|
102
|
+
buf = Buffer.alloc(0);
|
|
103
|
+
if (line.length > 0) {
|
|
104
|
+
try {
|
|
105
|
+
out.messages.push(JSON.parse(line));
|
|
106
|
+
lock('ndjson');
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
out.warnings.push(`unparseable JSON line at EOF (dropped): ${JSON.stringify(line.slice(0, 80))}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
3
116
|
/**
|
|
4
117
|
* Frame writer. `sink.write` is bound HERE, at construction time, on purpose:
|
|
5
118
|
* an in-flight turn may temporarily patch `process.stdout.write` (see
|
|
6
119
|
* turnAdapter.ts — the headless dispatch writes its NDJSON stream there), and
|
|
7
120
|
* ACP frames must never be swallowed by that capture window.
|
|
121
|
+
*
|
|
122
|
+
* With a shared `format` (the same object given to the reader) the writer
|
|
123
|
+
* mirrors the inbound wire: `ndjson` after NDJSON input, LSP frames after
|
|
124
|
+
* framed input. Without one it emits LSP frames (legacy callers/tests).
|
|
8
125
|
*/
|
|
9
|
-
export function createFrameWriter(sink, onError) {
|
|
126
|
+
export function createFrameWriter(sink, onError, format) {
|
|
10
127
|
const write = sink.write.bind(sink);
|
|
11
128
|
return {
|
|
12
129
|
write(message) {
|
|
13
130
|
try {
|
|
14
|
-
write(
|
|
131
|
+
write(format && format.mode === 'ndjson'
|
|
132
|
+
? `${JSON.stringify(message)}\n`
|
|
133
|
+
: encodeMessage(message));
|
|
15
134
|
}
|
|
16
135
|
catch (err) {
|
|
17
136
|
try {
|
|
@@ -49,13 +168,13 @@ export function malformedFrameWarnings(chunk) {
|
|
|
49
168
|
}
|
|
50
169
|
}
|
|
51
170
|
/**
|
|
52
|
-
* Attach the
|
|
53
|
-
* irrelevant: partial frames are buffered, several
|
|
54
|
-
* delivered, and a throwing `onMessage` is contained (it cannot
|
|
55
|
-
* stream).
|
|
171
|
+
* Attach the dual-format decoder to a readable stream. Chunk boundaries are
|
|
172
|
+
* irrelevant: partial lines/frames are buffered, several messages per chunk
|
|
173
|
+
* are all delivered, and a throwing `onMessage` is contained (it cannot
|
|
174
|
+
* desync the stream).
|
|
56
175
|
*/
|
|
57
176
|
export function attachFrameReader(stream, options) {
|
|
58
|
-
const parser =
|
|
177
|
+
const parser = createDualWireDecoder(options.format);
|
|
59
178
|
let closed = false;
|
|
60
179
|
const report = (detail) => {
|
|
61
180
|
try {
|
|
@@ -65,10 +184,28 @@ export function attachFrameReader(stream, options) {
|
|
|
65
184
|
/* diagnostics must never throw */
|
|
66
185
|
}
|
|
67
186
|
};
|
|
187
|
+
const deliver = (message) => {
|
|
188
|
+
try {
|
|
189
|
+
options.onMessage(message);
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
report(`consumer error: ${err instanceof Error ? err.message : String(err)}`);
|
|
193
|
+
}
|
|
194
|
+
};
|
|
68
195
|
const finish = () => {
|
|
69
196
|
if (closed)
|
|
70
197
|
return;
|
|
71
198
|
closed = true;
|
|
199
|
+
try {
|
|
200
|
+
const rest = parser.flush();
|
|
201
|
+
for (const warning of rest.warnings)
|
|
202
|
+
report(warning);
|
|
203
|
+
for (const message of rest.messages)
|
|
204
|
+
deliver(message);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
/* EOF salvage is best-effort */
|
|
208
|
+
}
|
|
72
209
|
try {
|
|
73
210
|
options.onEof();
|
|
74
211
|
}
|
|
@@ -77,30 +214,25 @@ export function attachFrameReader(stream, options) {
|
|
|
77
214
|
}
|
|
78
215
|
};
|
|
79
216
|
const onData = (chunk) => {
|
|
80
|
-
for (const warning of malformedFrameWarnings(chunk))
|
|
217
|
+
for (const warning of malformedFrameWarnings(chunk.toString('utf8')))
|
|
81
218
|
report(warning);
|
|
82
|
-
let
|
|
219
|
+
let decoded;
|
|
83
220
|
try {
|
|
84
|
-
|
|
221
|
+
decoded = parser.push(chunk);
|
|
85
222
|
}
|
|
86
223
|
catch (err) {
|
|
87
224
|
report(`decoder error: ${err instanceof Error ? err.message : String(err)}`);
|
|
88
225
|
return;
|
|
89
226
|
}
|
|
90
|
-
for (const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
catch (err) {
|
|
95
|
-
report(`consumer error: ${err instanceof Error ? err.message : String(err)}`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
227
|
+
for (const warning of decoded.warnings)
|
|
228
|
+
report(warning);
|
|
229
|
+
for (const message of decoded.messages)
|
|
230
|
+
deliver(message);
|
|
98
231
|
};
|
|
99
232
|
const onError = (err) => {
|
|
100
233
|
report(`stdin error: ${err.message}`);
|
|
101
234
|
finish();
|
|
102
235
|
};
|
|
103
|
-
stream.setEncoding('utf8');
|
|
104
236
|
stream.on('data', onData);
|
|
105
237
|
stream.on('end', finish);
|
|
106
238
|
stream.on('close', finish);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"framing.js","sourceRoot":"","sources":["../../../src/cli/acp/framing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"framing.js","sourceRoot":"","sources":["../../../src/cli/acp/framing.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExE,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,CAAC;AAe9C,oEAAoE;AACpE,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAC1C,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAExC;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAmB;IAIvD,MAAM,GAAG,GAAe,MAAM,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACrD,IAAI,GAAG,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,IAAI,GAAG,CAAC,IAAc,EAAQ,EAAE;QACpC,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC,CAAC;IAEF,yEAAyE;IACzE,MAAM,IAAI,GAAG,CAAC,GAAiB,EAAW,EAAE;QAC1C,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;YAAE,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEnC,mEAAmE;QACnE,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,KAAK,aAAa,EAAE,CAAC;YAC7F,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACpC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,IAAI,GAAG,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;oBACnC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;oBACzE,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACvD,MAAM,CAAC,GAAG,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,QAAQ,CAAC,IAAI,CACf,0CAA0C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAChF,CAAC;gBACF,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC;YAC1B,MAAM,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,GAAG,CAAC,MAAM,GAAG,OAAO;gBAAE,OAAO,KAAK,CAAC;YACvC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/D,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,CAAC;gBACH,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACpC,IAAI,CAAC,WAAW,CAAC,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9F,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gEAAgE;QAChE,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACd,IAAI,GAAG,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;gBACnC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;gBAC9D,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACtE,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,CAAC;YACH,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,oCAAoC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAiB,EAAE;QAC/B,MAAM,GAAG,GAAiB,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACjB,mBAAmB;QACrB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,CAAC,KAAsB;YACzB,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzF,GAAG,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;YAC3D,OAAO,KAAK,EAAE,CAAC;QACjB,CAAC;QACD,wEAAwE;QACxE,KAAK;YACH,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;YACpB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC;YACjC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;oBACpC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACjB,CAAC;gBAAC,MAAM,CAAC;oBACP,GAAG,CAAC,QAAQ,CAAC,IAAI,CACf,2CAA2C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAC/E,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAaD;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAe,EACf,OAAmC,EACnC,MAAmB;IAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO;QACL,KAAK,CAAC,OAAgB;YACpB,IAAI,CAAC;gBACH,KAAK,CACH,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;oBAChC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI;oBAChC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAC3B,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC;oBACH,OAAO,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9D,CAAC;gBAAC,MAAM,CAAC;oBACP,kCAAkC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,SAAS,CAAC;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACxC,0EAA0E;QAC1E,kDAAkD;QAClD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,IAAI,CAAC,0CAA0C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAiBD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAgB,EAChB,OAA2B;IAE3B,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,MAAM,GAAG,CAAC,MAAc,EAAQ,EAAE;QACtC,IAAI,CAAC;YACH,OAAO,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,OAAgB,EAAQ,EAAE;QACzC,IAAI,CAAC;YACH,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ;gBAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACrD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;QACD,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,KAAa,EAAQ,EAAE;QACrC,KAAK,MAAM,OAAO,IAAI,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACtF,IAAI,OAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ;YAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACxD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ;YAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,GAAU,EAAQ,EAAE;QACnC,MAAM,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5B,OAAO;QACL,MAAM;YACJ,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Invariant 3 — stable STRING error codes (the single source of truth)
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
/**
|
|
5
|
+
* The machine vocabulary of the ACP error surface. `protocol.ts` keeps the
|
|
6
|
+
* numeric JSON-RPC envelope the spec requires and re-exports THESE constants,
|
|
7
|
+
* so a code exists once and every emit site uses it: never a number where a
|
|
8
|
+
* code belongs, never an ad-hoc message used as a code (see server.ts, which
|
|
9
|
+
* puts the string in `error.data.code`, next to the numeric `error.code`).
|
|
10
|
+
*/
|
|
11
|
+
export const ACP_ERROR_CODES = {
|
|
12
|
+
PARSE_ERROR: 'parse_error',
|
|
13
|
+
INVALID_REQUEST: 'invalid_request',
|
|
14
|
+
METHOD_NOT_FOUND: 'method_not_found',
|
|
15
|
+
INVALID_PARAMS: 'invalid_params',
|
|
16
|
+
INTERNAL_ERROR: 'internal_error',
|
|
17
|
+
/** A turn ended without delivering (dispatcher rejected, or exit != 0). */
|
|
18
|
+
TURN_FAILED: 'turn_failed',
|
|
19
|
+
/** A stream invariant was violated (this module's guards). */
|
|
20
|
+
PROTOCOL_ERROR: 'protocol_error',
|
|
21
|
+
/** A payload was clamped, or claims to be complete while over the cap. */
|
|
22
|
+
TRUNCATED_PAYLOAD: 'truncated_payload',
|
|
23
|
+
};
|
|
24
|
+
/** `sessionUpdate` values that ARE a terminal frame (reserved, see header). */
|
|
25
|
+
export const ACP_TERMINAL_UPDATE_KINDS = ['input_required'];
|
|
26
|
+
/**
|
|
27
|
+
* A broken stream invariant. `errorCode` is one of the protocol's stable
|
|
28
|
+
* string codes (invariant 3), so a violation reads the same in a log line and
|
|
29
|
+
* in an error frame.
|
|
30
|
+
*/
|
|
31
|
+
export class AcpInvariantViolation extends Error {
|
|
32
|
+
invariant;
|
|
33
|
+
errorCode;
|
|
34
|
+
constructor(invariant, errorCode, detail) {
|
|
35
|
+
super(`${errorCode} ${invariant}: ${detail}`);
|
|
36
|
+
this.invariant = invariant;
|
|
37
|
+
this.errorCode = errorCode;
|
|
38
|
+
this.name = 'AcpInvariantViolation';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Terminal kind of one update frame, or null when the frame is not terminal. */
|
|
42
|
+
export function terminalUpdateKind(frame) {
|
|
43
|
+
const kind = frame?.sessionUpdate;
|
|
44
|
+
if (typeof kind !== 'string')
|
|
45
|
+
return null;
|
|
46
|
+
return ACP_TERMINAL_UPDATE_KINDS.includes(kind)
|
|
47
|
+
? kind
|
|
48
|
+
: null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Per-turn stream state: the one place that decides whether a frame may still
|
|
52
|
+
* be emitted. One instance per turn (never reused across turns).
|
|
53
|
+
*/
|
|
54
|
+
export class TurnStreamTracker {
|
|
55
|
+
sessionId;
|
|
56
|
+
#frames = 0;
|
|
57
|
+
#terminalKind = null;
|
|
58
|
+
constructor(sessionId) {
|
|
59
|
+
this.sessionId = sessionId;
|
|
60
|
+
}
|
|
61
|
+
/** Non-terminal frames emitted so far (diagnostics/tests). */
|
|
62
|
+
get frames() {
|
|
63
|
+
return this.#frames;
|
|
64
|
+
}
|
|
65
|
+
/** True once a terminal frame was recorded (the stream is closed). */
|
|
66
|
+
get terminated() {
|
|
67
|
+
return this.#terminalKind !== null;
|
|
68
|
+
}
|
|
69
|
+
/** The single terminal kind, or null while the stream is still open. */
|
|
70
|
+
get terminalKind() {
|
|
71
|
+
return this.#terminalKind;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Record one update frame. Throws `post_terminal_frame` when the stream is
|
|
75
|
+
* already closed — a closed stream never reopens and never emits again.
|
|
76
|
+
*/
|
|
77
|
+
push(frame) {
|
|
78
|
+
if (this.#terminalKind !== null) {
|
|
79
|
+
throw new AcpInvariantViolation('post_terminal_frame', 'protocol_error', `session ${this.sessionId}: frame after the terminal '${this.#terminalKind}' frame`);
|
|
80
|
+
}
|
|
81
|
+
this.#frames += 1;
|
|
82
|
+
const terminal = terminalUpdateKind(frame);
|
|
83
|
+
if (terminal !== null)
|
|
84
|
+
this.#terminalKind = terminal;
|
|
85
|
+
return terminal;
|
|
86
|
+
}
|
|
87
|
+
/** Record the ONE terminal frame. Throws `double_terminal` on a second one. */
|
|
88
|
+
terminate(kind) {
|
|
89
|
+
if (this.#terminalKind !== null) {
|
|
90
|
+
throw new AcpInvariantViolation('double_terminal', 'protocol_error', `session ${this.sessionId}: terminal '${kind}' after '${this.#terminalKind}'`);
|
|
91
|
+
}
|
|
92
|
+
this.#terminalKind = kind;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* A turn that ends must have terminated exactly once. Returns the kind, or
|
|
96
|
+
* throws `missing_terminal` — call this when the turn is over to make a
|
|
97
|
+
* dropped terminal loud instead of a hung stream.
|
|
98
|
+
*/
|
|
99
|
+
assertTerminated() {
|
|
100
|
+
if (this.#terminalKind === null) {
|
|
101
|
+
throw new AcpInvariantViolation('missing_terminal', 'protocol_error', `session ${this.sessionId}: stream closed after ${this.#frames} frame(s) with no terminal frame`);
|
|
102
|
+
}
|
|
103
|
+
return this.#terminalKind;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
// Invariant 2 — no silent truncation
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
/**
|
|
110
|
+
* Payload cap for ONE outbound text payload. Deliberately generous: it is a
|
|
111
|
+
* wire-safety bound (a runaway provider/error message must not produce a
|
|
112
|
+
* multi-megabyte frame), not a display policy — so it does not fire on normal
|
|
113
|
+
* traffic and never changes what an existing client sees.
|
|
114
|
+
*/
|
|
115
|
+
export const ACP_PAYLOAD_MAX_CHARS = 64 * 1024;
|
|
116
|
+
/** Clamp to the cap, REPORTING whether it bit (never silently). */
|
|
117
|
+
export function clampMessageText(text, cap = ACP_PAYLOAD_MAX_CHARS) {
|
|
118
|
+
return text.length <= cap ? { text, truncated: false } : { text: text.slice(0, cap), truncated: true };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Invariant 2 guard for hand-built frames (a factory call cannot fail this):
|
|
122
|
+
* a text payload over the cap without `truncated: true` throws
|
|
123
|
+
* `truncated_payload`.
|
|
124
|
+
*/
|
|
125
|
+
export function assertTruncationDisclosed(update) {
|
|
126
|
+
const text = update?.content?.text;
|
|
127
|
+
if (typeof text !== 'string' || text.length <= ACP_PAYLOAD_MAX_CHARS)
|
|
128
|
+
return;
|
|
129
|
+
if (update.truncated === true)
|
|
130
|
+
return;
|
|
131
|
+
throw new AcpInvariantViolation('truncated_payload', 'truncated_payload', `a ${text.length}-char payload exceeds the ${ACP_PAYLOAD_MAX_CHARS}-char cap without a truncated:true flag`);
|
|
132
|
+
}
|
|
133
|
+
/** One log line for any thrown violation (stable code first, detail after). */
|
|
134
|
+
export function violationSummary(err) {
|
|
135
|
+
if (err instanceof Error)
|
|
136
|
+
return err.message;
|
|
137
|
+
return String(err);
|
|
138
|
+
}
|
|
139
|
+
/** Build the guarded stream for one turn (`log` receives `[zelari-code acp] …`). */
|
|
140
|
+
export function createTurnStream(sessionId, log) {
|
|
141
|
+
const tracker = new TurnStreamTracker(sessionId);
|
|
142
|
+
const report = (err) => {
|
|
143
|
+
try {
|
|
144
|
+
log(`[zelari-code acp] dropped frame — ${violationSummary(err)}`);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
/* diagnostics must never throw into the transport */
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
tracker,
|
|
152
|
+
push(frame) {
|
|
153
|
+
try {
|
|
154
|
+
assertTruncationDisclosed(frame);
|
|
155
|
+
tracker.push(frame);
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
report(err);
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
terminate(kind) {
|
|
164
|
+
try {
|
|
165
|
+
tracker.terminate(kind);
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
report(err);
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
close() {
|
|
174
|
+
try {
|
|
175
|
+
tracker.assertTerminated();
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
report(err);
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=invariants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.js","sourceRoot":"","sources":["../../../src/cli/acp/invariants.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/acp/protocol.js
CHANGED
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
* acp/protocol — the ACP subset served by `zelari-code acp`.
|
|
3
3
|
*
|
|
4
4
|
* Agent Client Protocol front door for editors (Zed and any client that
|
|
5
|
-
* speaks ACP): JSON-RPC 2.0 over stdio
|
|
6
|
-
*
|
|
5
|
+
* speaks ACP): JSON-RPC 2.0 over stdio as newline-delimited JSON (the ACP
|
|
6
|
+
* stdio spec — as spoken by Zed); LSP-style frames are also accepted and
|
|
7
|
+
* mirrored on output (see framing.ts). Implemented by hand — ZERO new
|
|
8
|
+
* dependencies (P5).
|
|
7
9
|
*
|
|
8
10
|
* ---------------------------------------------------------------------------
|
|
9
11
|
* INBOUND (client -> agent)
|
|
@@ -50,6 +52,7 @@
|
|
|
50
52
|
* (dispatchHeadlessTurn exposes no abort seam). Bounded by the CLI's own
|
|
51
53
|
* turn/tool budgets.
|
|
52
54
|
*/
|
|
55
|
+
import { ACP_ERROR_CODES, clampMessageText } from './invariants.js';
|
|
53
56
|
/** ACP protocol version this agent implements (echoed back on initialize). */
|
|
54
57
|
export const ACP_PROTOCOL_VERSION = 1;
|
|
55
58
|
/** JSON-RPC 2.0 error codes used by this server. */
|
|
@@ -60,12 +63,34 @@ export const JSON_RPC_ERRORS = {
|
|
|
60
63
|
INVALID_PARAMS: -32602,
|
|
61
64
|
INTERNAL_ERROR: -32603,
|
|
62
65
|
};
|
|
63
|
-
/**
|
|
66
|
+
/**
|
|
67
|
+
* STABLE STRING error codes — re-exported from invariants.ts, which owns the
|
|
68
|
+
* single definition (invariant 3). `JSON_RPC_ERRORS` stays the numeric
|
|
69
|
+
* envelope the spec requires; the string code travels next to it in
|
|
70
|
+
* `error.data.code`, so a client never parses a message and never sees a
|
|
71
|
+
* number where a code belongs.
|
|
72
|
+
*/
|
|
73
|
+
export { ACP_ERROR_CODES } from './invariants.js';
|
|
74
|
+
const JSON_RPC_TO_ERROR_CODE = {
|
|
75
|
+
[JSON_RPC_ERRORS.PARSE_ERROR]: ACP_ERROR_CODES.PARSE_ERROR,
|
|
76
|
+
[JSON_RPC_ERRORS.INVALID_REQUEST]: ACP_ERROR_CODES.INVALID_REQUEST,
|
|
77
|
+
[JSON_RPC_ERRORS.METHOD_NOT_FOUND]: ACP_ERROR_CODES.METHOD_NOT_FOUND,
|
|
78
|
+
[JSON_RPC_ERRORS.INVALID_PARAMS]: ACP_ERROR_CODES.INVALID_PARAMS,
|
|
79
|
+
[JSON_RPC_ERRORS.INTERNAL_ERROR]: ACP_ERROR_CODES.INTERNAL_ERROR,
|
|
80
|
+
};
|
|
81
|
+
/** Numeric JSON-RPC code -> its stable string code (default: internal). */
|
|
82
|
+
export function errorCodeForJsonRpc(code) {
|
|
83
|
+
return JSON_RPC_TO_ERROR_CODE[code] ?? ACP_ERROR_CODES.INTERNAL_ERROR;
|
|
84
|
+
}
|
|
85
|
+
/** Typed JSON-RPC error, mapped 1:1 onto the wire by the server loop. Both
|
|
86
|
+
* codes travel: the numeric one for the spec, `errorCode` for machines. */
|
|
64
87
|
export class AcpError extends Error {
|
|
65
88
|
code;
|
|
66
|
-
|
|
89
|
+
errorCode;
|
|
90
|
+
constructor(code, message, errorCode = errorCodeForJsonRpc(code)) {
|
|
67
91
|
super(message);
|
|
68
92
|
this.code = code;
|
|
93
|
+
this.errorCode = errorCode;
|
|
69
94
|
this.name = 'AcpError';
|
|
70
95
|
}
|
|
71
96
|
}
|
|
@@ -170,8 +195,18 @@ export function readSessionIdParams(params, method) {
|
|
|
170
195
|
}
|
|
171
196
|
return { sessionId };
|
|
172
197
|
}
|
|
198
|
+
/**
|
|
199
|
+
* One assistant text chunk. The ONLY cap on the outbound payload path lives
|
|
200
|
+
* here (invariants.ts `clampMessageText`), so no emit site can truncate
|
|
201
|
+
* silently: when the text does not fit, the frame says so (`truncated: true`).
|
|
202
|
+
*/
|
|
173
203
|
export function agentMessageChunk(text) {
|
|
174
|
-
|
|
204
|
+
const { text: body, truncated } = clampMessageText(text);
|
|
205
|
+
return {
|
|
206
|
+
sessionUpdate: 'agent_message_chunk',
|
|
207
|
+
content: { type: 'text', text: body },
|
|
208
|
+
...(truncated ? { truncated: true } : {}),
|
|
209
|
+
};
|
|
175
210
|
}
|
|
176
211
|
export function toolCallStart(input) {
|
|
177
212
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/cli/acp/protocol.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/cli/acp/protocol.ts"],"names":[],"mappings":"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"}
|