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.
Files changed (69) hide show
  1. package/dist/cli/acp/command.js +5 -3
  2. package/dist/cli/acp/command.js.map +1 -1
  3. package/dist/cli/acp/framing.js +151 -19
  4. package/dist/cli/acp/framing.js.map +1 -1
  5. package/dist/cli/acp/invariants.js +183 -0
  6. package/dist/cli/acp/invariants.js.map +1 -0
  7. package/dist/cli/acp/protocol.js +40 -5
  8. package/dist/cli/acp/protocol.js.map +1 -1
  9. package/dist/cli/acp/server.js +57 -17
  10. package/dist/cli/acp/server.js.map +1 -1
  11. package/dist/cli/acp/turnAdapter.js +2 -1
  12. package/dist/cli/acp/turnAdapter.js.map +1 -1
  13. package/dist/cli/app.js +2 -2
  14. package/dist/cli/app.js.map +1 -1
  15. package/dist/cli/budget/cacheHitReport.js +94 -0
  16. package/dist/cli/budget/cacheHitReport.js.map +1 -0
  17. package/dist/cli/budget/messageUsage.js +77 -0
  18. package/dist/cli/budget/messageUsage.js.map +1 -0
  19. package/dist/cli/companion/framePolicy.js +116 -0
  20. package/dist/cli/companion/framePolicy.js.map +1 -0
  21. package/dist/cli/components/SelectList.js +51 -14
  22. package/dist/cli/components/SelectList.js.map +1 -1
  23. package/dist/cli/components/StatusBar.js +6 -2
  24. package/dist/cli/components/StatusBar.js.map +1 -1
  25. package/dist/cli/components/fuzzyMatch.js +108 -0
  26. package/dist/cli/components/fuzzyMatch.js.map +1 -0
  27. package/dist/cli/components/statusChips.js +47 -0
  28. package/dist/cli/components/statusChips.js.map +1 -1
  29. package/dist/cli/headless/protocol.js +39 -2
  30. package/dist/cli/headless/protocol.js.map +1 -1
  31. package/dist/cli/headless/runOneTurn.js +68 -18
  32. package/dist/cli/headless/runOneTurn.js.map +1 -1
  33. package/dist/cli/hooks/useChatTurn.js +76 -16
  34. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  35. package/dist/cli/hooks/useSlashDispatch.js +5 -2
  36. package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
  37. package/dist/cli/inbox.js +220 -0
  38. package/dist/cli/inbox.js.map +1 -0
  39. package/dist/cli/main.bundled.js +3959 -2560
  40. package/dist/cli/main.bundled.js.map +4 -4
  41. package/dist/cli/main.js +22 -0
  42. package/dist/cli/main.js.map +1 -1
  43. package/dist/cli/metrics.js.map +1 -1
  44. package/dist/cli/provider/anthropic.js +42 -6
  45. package/dist/cli/provider/anthropic.js.map +1 -1
  46. package/dist/cli/provider/chatgpt.js +4 -0
  47. package/dist/cli/provider/chatgpt.js.map +1 -1
  48. package/dist/cli/provider/openai-compatible.js +25 -3
  49. package/dist/cli/provider/openai-compatible.js.map +1 -1
  50. package/dist/cli/provider/responsesApi.js +4 -0
  51. package/dist/cli/provider/responsesApi.js.map +1 -1
  52. package/dist/cli/serve/harnessServer.js +7 -0
  53. package/dist/cli/serve/harnessServer.js.map +1 -1
  54. package/dist/cli/sessionManager.js +9 -2
  55. package/dist/cli/sessionManager.js.map +1 -1
  56. package/dist/cli/skillsCheck.js +209 -0
  57. package/dist/cli/skillsCheck.js.map +1 -0
  58. package/dist/cli/slashCommands.js +9 -0
  59. package/dist/cli/slashCommands.js.map +1 -1
  60. package/dist/cli/slashHandlers/provider.js.map +1 -1
  61. package/dist/cli/slashHandlers/sessions.js +131 -0
  62. package/dist/cli/slashHandlers/sessions.js.map +1 -0
  63. package/dist/cli/statusline/statuslineItems.js +22 -3
  64. package/dist/cli/statusline/statuslineItems.js.map +1 -1
  65. package/dist/cli/statusline/verdictFeed.js +245 -0
  66. package/dist/cli/statusline/verdictFeed.js.map +1 -0
  67. package/dist/cli/utils/doctor.js +30 -0
  68. package/dist/cli/utils/doctor.js.map +1 -1
  69. package/package.json +2 -2
@@ -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 with LSP-style framing\n' +
51
- '(`Content-Length: <bytes>\\r\\n\\r\\n<json>`). Point an ACP-capable editor\n' +
52
- '(e.g. Zed) at this command as a custom agent server.\n' +
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":"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"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/acp/command.ts"],"names":[],"mappings":"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"}
@@ -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(encodeMessage(message));
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 incremental decoder to a readable stream. Chunk boundaries are
53
- * irrelevant: partial frames are buffered, several frames per chunk are all
54
- * delivered, and a throwing `onMessage` is contained (it cannot desync the
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 = createMessageParser();
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 messages;
219
+ let decoded;
83
220
  try {
84
- messages = parser.push(chunk);
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 message of messages) {
91
- try {
92
- options.onMessage(message);
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":"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"}
1
+ {"version":3,"file":"framing.js","sourceRoot":"","sources":["../../../src/cli/acp/framing.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -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, framed LSP-style (see framing.ts).
6
- * Implemented by hand ZERO new dependencies (P5).
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
- /** Typed JSON-RPC error, mapped 1:1 onto the wire by the server loop. */
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
- constructor(code, message) {
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
- return { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text } };
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":"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"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/cli/acp/protocol.ts"],"names":[],"mappings":"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"}