@kenkaiiii/ggcoder 5.29.0 → 5.30.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 (143) hide show
  1. package/dist/app-sidecar-auth-broadcast.test.js +14 -3
  2. package/dist/app-sidecar-auth-broadcast.test.js.map +1 -1
  3. package/dist/app-sidecar.js +27 -20
  4. package/dist/app-sidecar.js.map +1 -1
  5. package/dist/cli/command-routing.d.ts +1 -1
  6. package/dist/cli/command-routing.d.ts.map +1 -1
  7. package/dist/cli/command-routing.js +1 -0
  8. package/dist/cli/command-routing.js.map +1 -1
  9. package/dist/cli/command-routing.test.js +1 -0
  10. package/dist/cli/command-routing.test.js.map +1 -1
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +167 -47
  13. package/dist/cli.js.map +1 -1
  14. package/dist/config.d.ts +2 -0
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +10 -0
  17. package/dist/config.js.map +1 -1
  18. package/dist/config.test.js +10 -1
  19. package/dist/config.test.js.map +1 -1
  20. package/dist/core/agent-session-compaction.test.js +240 -2
  21. package/dist/core/agent-session-compaction.test.js.map +1 -1
  22. package/dist/core/agent-session-crash-durability.test.js +9 -2
  23. package/dist/core/agent-session-crash-durability.test.js.map +1 -1
  24. package/dist/core/agent-session-process-gate.test.js +5 -1
  25. package/dist/core/agent-session-process-gate.test.js.map +1 -1
  26. package/dist/core/agent-session-review-coverage.test.js +80 -23
  27. package/dist/core/agent-session-review-coverage.test.js.map +1 -1
  28. package/dist/core/agent-session.d.ts +12 -3
  29. package/dist/core/agent-session.d.ts.map +1 -1
  30. package/dist/core/agent-session.js +294 -134
  31. package/dist/core/agent-session.js.map +1 -1
  32. package/dist/core/compaction/active-context.test.js +21 -0
  33. package/dist/core/compaction/active-context.test.js.map +1 -1
  34. package/dist/core/compaction/compactor.d.ts +24 -6
  35. package/dist/core/compaction/compactor.d.ts.map +1 -1
  36. package/dist/core/compaction/compactor.js +246 -98
  37. package/dist/core/compaction/compactor.js.map +1 -1
  38. package/dist/core/compaction/compactor.test.js +107 -8
  39. package/dist/core/compaction/compactor.test.js.map +1 -1
  40. package/dist/core/compaction/policy.d.ts +17 -0
  41. package/dist/core/compaction/policy.d.ts.map +1 -0
  42. package/dist/core/compaction/policy.js +22 -0
  43. package/dist/core/compaction/policy.js.map +1 -0
  44. package/dist/core/compaction/policy.test.d.ts +2 -0
  45. package/dist/core/compaction/policy.test.d.ts.map +1 -0
  46. package/dist/core/compaction/policy.test.js +35 -0
  47. package/dist/core/compaction/policy.test.js.map +1 -0
  48. package/dist/core/foreign-session-import.d.ts.map +1 -1
  49. package/dist/core/foreign-session-import.js +5 -1
  50. package/dist/core/foreign-session-import.js.map +1 -1
  51. package/dist/core/ideal-review.d.ts +20 -1
  52. package/dist/core/ideal-review.d.ts.map +1 -1
  53. package/dist/core/ideal-review.js +37 -2
  54. package/dist/core/ideal-review.js.map +1 -1
  55. package/dist/core/ideal-review.test.js +99 -3
  56. package/dist/core/ideal-review.test.js.map +1 -1
  57. package/dist/core/loop-breaker.d.ts.map +1 -1
  58. package/dist/core/loop-breaker.js +1 -0
  59. package/dist/core/loop-breaker.js.map +1 -1
  60. package/dist/core/process-gate.d.ts.map +1 -1
  61. package/dist/core/process-gate.js +9 -1
  62. package/dist/core/process-gate.js.map +1 -1
  63. package/dist/core/process-manager-notifications.test.js +4 -2
  64. package/dist/core/process-manager-notifications.test.js.map +1 -1
  65. package/dist/core/regrounding.d.ts.map +1 -1
  66. package/dist/core/regrounding.js +1 -0
  67. package/dist/core/regrounding.js.map +1 -1
  68. package/dist/core/session-compaction.d.ts +5 -0
  69. package/dist/core/session-compaction.d.ts.map +1 -1
  70. package/dist/core/session-compaction.js +10 -1
  71. package/dist/core/session-compaction.js.map +1 -1
  72. package/dist/core/session-compaction.test.js +16 -1
  73. package/dist/core/session-compaction.test.js.map +1 -1
  74. package/dist/core/session-export.d.ts.map +1 -1
  75. package/dist/core/session-export.js +11 -8
  76. package/dist/core/session-export.js.map +1 -1
  77. package/dist/core/session-history.d.ts +7 -2
  78. package/dist/core/session-history.d.ts.map +1 -1
  79. package/dist/core/session-history.js +52 -9
  80. package/dist/core/session-history.js.map +1 -1
  81. package/dist/core/session-history.test.js +26 -1
  82. package/dist/core/session-history.test.js.map +1 -1
  83. package/dist/core/session-manager.d.ts +106 -0
  84. package/dist/core/session-manager.d.ts.map +1 -1
  85. package/dist/core/session-manager.js +316 -15
  86. package/dist/core/session-manager.js.map +1 -1
  87. package/dist/core/session-manager.test.js +109 -1
  88. package/dist/core/session-manager.test.js.map +1 -1
  89. package/dist/core/session-notification-visibility.test.js +34 -0
  90. package/dist/core/session-notification-visibility.test.js.map +1 -1
  91. package/dist/core/session-preview.d.ts +2 -2
  92. package/dist/core/session-preview.d.ts.map +1 -1
  93. package/dist/core/session-preview.js +8 -5
  94. package/dist/core/session-preview.js.map +1 -1
  95. package/dist/core/session-restore-display.test.js +25 -0
  96. package/dist/core/session-restore-display.test.js.map +1 -1
  97. package/dist/core/session-storage.d.ts.map +1 -1
  98. package/dist/core/session-storage.js +39 -3
  99. package/dist/core/session-storage.js.map +1 -1
  100. package/dist/core/subagent-manager.d.ts.map +1 -1
  101. package/dist/core/subagent-manager.js +9 -1
  102. package/dist/core/subagent-manager.js.map +1 -1
  103. package/dist/core/subagent-manager.test.js +4 -3
  104. package/dist/core/subagent-manager.test.js.map +1 -1
  105. package/dist/interactive.d.ts.map +1 -1
  106. package/dist/interactive.js +17 -3
  107. package/dist/interactive.js.map +1 -1
  108. package/dist/modes/acp-mode.d.ts +82 -0
  109. package/dist/modes/acp-mode.d.ts.map +1 -0
  110. package/dist/modes/acp-mode.js +802 -0
  111. package/dist/modes/acp-mode.js.map +1 -0
  112. package/dist/modes/acp-mode.test.d.ts +2 -0
  113. package/dist/modes/acp-mode.test.d.ts.map +1 -0
  114. package/dist/modes/acp-mode.test.js +611 -0
  115. package/dist/modes/acp-mode.test.js.map +1 -0
  116. package/dist/modes/index.d.ts +1 -0
  117. package/dist/modes/index.d.ts.map +1 -1
  118. package/dist/modes/index.js +1 -0
  119. package/dist/modes/index.js.map +1 -1
  120. package/dist/modes/json-mode.d.ts +28 -0
  121. package/dist/modes/json-mode.d.ts.map +1 -1
  122. package/dist/modes/json-mode.js +32 -0
  123. package/dist/modes/json-mode.js.map +1 -1
  124. package/dist/modes/json-mode.test.d.ts +2 -0
  125. package/dist/modes/json-mode.test.d.ts.map +1 -0
  126. package/dist/modes/json-mode.test.js +84 -0
  127. package/dist/modes/json-mode.test.js.map +1 -0
  128. package/dist/session.d.ts +24 -0
  129. package/dist/session.d.ts.map +1 -1
  130. package/dist/session.js +32 -0
  131. package/dist/session.js.map +1 -1
  132. package/dist/tools/subagent.d.ts.map +1 -1
  133. package/dist/tools/subagent.js +27 -6
  134. package/dist/tools/subagent.js.map +1 -1
  135. package/dist/tools/subagent.test.js +53 -3
  136. package/dist/tools/subagent.test.js.map +1 -1
  137. package/dist/tools/web-fetch.d.ts +1 -1
  138. package/dist/types.d.ts +7 -0
  139. package/dist/types.d.ts.map +1 -1
  140. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  141. package/dist/ui/hooks/useAgentLoop.js +18 -4
  142. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  143. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-mode.js","sourceRoot":"","sources":["../../src/modes/acp-mode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=acp-mode.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-mode.test.d.ts","sourceRoot":"","sources":["../../src/modes/acp-mode.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,611 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { spawn } from "node:child_process";
5
+ import { fileURLToPath } from "node:url";
6
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
7
+ import { ACP_PROTOCOL_VERSION } from "./acp-mode.js";
8
+ const FIXTURE = path.join(path.dirname(fileURLToPath(import.meta.url)), "__fixtures__", "acp-stdio-agent.mjs");
9
+ /**
10
+ * A HOME the fixture seeds sessions into, and the project directory they
11
+ * belong to.
12
+ *
13
+ * Real files rather than a stub: `session/list` and `session/load` exist to
14
+ * surface sessions the desktop wrote, so anything short of the real
15
+ * `~/.gg/sessions` layout would prove nothing about that.
16
+ */
17
+ let tmpHome;
18
+ let tmpProject;
19
+ /** A second checkout, so "list everything" can be told apart from "list here". */
20
+ let tmpOtherProject;
21
+ /**
22
+ * A live ACP agent in a child process, driven exactly the way a client drives
23
+ * it: NDJSON in on stdin, NDJSON out on stdout.
24
+ */
25
+ class AcpClient {
26
+ child;
27
+ buffer = "";
28
+ frames = [];
29
+ waiters = [];
30
+ stderr = "";
31
+ exit;
32
+ constructor() {
33
+ this.child = spawn(process.execPath, ["--import", "tsx", FIXTURE, tmpProject, tmpOtherProject], {
34
+ // Run from the package root so `tsx` resolves; the project directory is
35
+ // passed explicitly rather than inherited from the test runner.
36
+ cwd: process.cwd(),
37
+ env: {
38
+ ...process.env,
39
+ HOME: tmpHome,
40
+ USERPROFILE: tmpHome,
41
+ GG_DISABLE_TELEMETRY: "1",
42
+ },
43
+ stdio: ["pipe", "pipe", "pipe"],
44
+ });
45
+ this.child.stdout.setEncoding("utf8");
46
+ this.child.stdout.on("data", (chunk) => {
47
+ this.buffer += chunk;
48
+ const lines = this.buffer.split("\n");
49
+ this.buffer = lines.pop() ?? "";
50
+ for (const line of lines) {
51
+ if (line.trim())
52
+ this.frames.push(JSON.parse(line));
53
+ }
54
+ for (const wake of this.waiters.splice(0))
55
+ wake();
56
+ });
57
+ this.child.stderr.setEncoding("utf8");
58
+ this.child.stderr.on("data", (chunk) => {
59
+ this.stderr += chunk;
60
+ });
61
+ this.exit = new Promise((resolve) => this.child.on("close", (code) => resolve(code)));
62
+ }
63
+ send(frame) {
64
+ this.child.stdin.write(`${JSON.stringify(frame)}\n`);
65
+ }
66
+ /** Write bytes verbatim, so malformed input can be tested. */
67
+ sendRaw(text) {
68
+ this.child.stdin.write(text);
69
+ }
70
+ /** Close stdin, which is how an ACP client disconnects. */
71
+ end() {
72
+ this.child.stdin.end();
73
+ }
74
+ kill() {
75
+ this.child.kill("SIGKILL");
76
+ }
77
+ /** Every frame received so far, in arrival order. */
78
+ received() {
79
+ return [...this.frames];
80
+ }
81
+ /**
82
+ * Wait for the response to `id`, returning everything that arrived up to and
83
+ * including it. Ordering is the assertion that matters: notifications for a
84
+ * turn must precede that turn's response.
85
+ */
86
+ async until(id, timeoutMs = 20_000) {
87
+ const deadline = Date.now() + timeoutMs;
88
+ for (;;) {
89
+ const index = this.frames.findIndex((frame) => frame.id === id);
90
+ if (index >= 0)
91
+ return this.frames.slice(0, index + 1);
92
+ const remaining = deadline - Date.now();
93
+ if (remaining <= 0) {
94
+ throw new Error(`timed out waiting for response ${String(id)}; got ${JSON.stringify(this.frames)} stderr=${this.stderr}`);
95
+ }
96
+ await new Promise((resolve) => {
97
+ const timer = setTimeout(resolve, Math.min(remaining, 50));
98
+ this.waiters.push(() => {
99
+ clearTimeout(timer);
100
+ resolve();
101
+ });
102
+ });
103
+ }
104
+ }
105
+ /** Drive the handshake and return the created session id. */
106
+ async handshake() {
107
+ this.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
108
+ await this.until(1);
109
+ this.send({
110
+ jsonrpc: "2.0",
111
+ id: 2,
112
+ method: "session/new",
113
+ params: { cwd: tmpProject, mcpServers: [] },
114
+ });
115
+ const frames = await this.until(2);
116
+ return frames.at(-1).result.sessionId;
117
+ }
118
+ /**
119
+ * The stored sessions the fixture seeded, newest first.
120
+ *
121
+ * Omitting `cwd` asks for every project, which is what a phone wants; passing
122
+ * one scopes to that checkout.
123
+ */
124
+ async list(id = 90, cwd) {
125
+ this.send({
126
+ jsonrpc: "2.0",
127
+ id,
128
+ method: "session/list",
129
+ params: cwd ? { cwd } : {},
130
+ });
131
+ const frames = await this.until(id);
132
+ return frames.at(-1).result.sessions;
133
+ }
134
+ }
135
+ let client;
136
+ beforeEach(async () => {
137
+ tmpHome = await fs.mkdtemp(path.join(os.tmpdir(), "gg-acp-home-"));
138
+ tmpProject = await fs.mkdtemp(path.join(os.tmpdir(), "gg-acp-project-"));
139
+ tmpOtherProject = await fs.mkdtemp(path.join(os.tmpdir(), "gg-acp-other-"));
140
+ });
141
+ afterEach(async () => {
142
+ client?.kill();
143
+ client = undefined;
144
+ await fs.rm(tmpHome, { recursive: true, force: true });
145
+ await fs.rm(tmpProject, { recursive: true, force: true });
146
+ await fs.rm(tmpOtherProject, { recursive: true, force: true });
147
+ });
148
+ /** Session updates only, unwrapped to the `update` payload. */
149
+ function updates(frames) {
150
+ return frames
151
+ .filter((frame) => frame.method === "session/update")
152
+ .map((frame) => frame.params.update);
153
+ }
154
+ describe("ACP mode over stdio", () => {
155
+ it("negotiates initialize and creates a session", async () => {
156
+ client = new AcpClient();
157
+ client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
158
+ const frames = await client.until(1);
159
+ const initialize = frames.at(-1);
160
+ expect(initialize.jsonrpc).toBe("2.0");
161
+ expect(initialize.result).toMatchObject({
162
+ protocolVersion: ACP_PROTOCOL_VERSION,
163
+ authMethods: [],
164
+ agentInfo: { name: "ggcoder", title: "GG Coder", version: "0.0.0-test" },
165
+ });
166
+ // A client only offers resume and a session list when these are advertised,
167
+ // and `{}` — not `true` — is how ACP spells "supported" for these two.
168
+ expect(initialize.result.agentCapabilities).toMatchObject({
169
+ loadSession: true,
170
+ sessionCapabilities: { list: {}, resume: {} },
171
+ });
172
+ client.send({ jsonrpc: "2.0", id: 2, method: "session/new", params: { cwd: tmpProject } });
173
+ const created = (await client.until(2)).at(-1);
174
+ expect(created.result.sessionId).toBe("acp-fixture-session");
175
+ });
176
+ it("lists sessions from every project, newest first, titled by their first user prompt", async () => {
177
+ client = new AcpClient();
178
+ await client.handshake();
179
+ const sessions = await client.list();
180
+ // No `cwd` means the whole machine, so the other checkout's session must be
181
+ // here too — a phone asks "what have I been working on", not "what is in
182
+ // this one directory". The empty seeded session must NOT appear: there is
183
+ // nothing to resume.
184
+ expect(sessions).toHaveLength(3);
185
+ expect(sessions.map((entry) => entry.title)).toEqual([
186
+ "other project: fix the parser",
187
+ "newer: add the config panel",
188
+ "older: rename the widget",
189
+ ]);
190
+ // Each entry carries its own project, which is what lets a client group by
191
+ // checkout instead of showing one flat undifferentiated list.
192
+ expect(sessions.map((entry) => entry.cwd)).toEqual([tmpOtherProject, tmpProject, tmpProject]);
193
+ for (const entry of sessions)
194
+ expect(Date.parse(entry.updatedAt)).not.toBeNaN();
195
+ // Ids must be the ones the fixture actually wrote, or `session/load` is
196
+ // addressing something that does not exist.
197
+ expect(client.stderr).toContain(sessions[0].sessionId);
198
+ expect(client.stderr).toContain(sessions[1].sessionId);
199
+ });
200
+ it("scopes the list to one project when a cwd is given", async () => {
201
+ client = new AcpClient();
202
+ await client.handshake();
203
+ const scoped = await client.list(90, tmpProject);
204
+ expect(scoped.map((entry) => entry.title)).toEqual([
205
+ "newer: add the config panel",
206
+ "older: rename the widget",
207
+ ]);
208
+ for (const entry of scoped)
209
+ expect(entry.cwd).toBe(tmpProject);
210
+ });
211
+ it("replays a loaded session's transcript before answering, then resumes it", async () => {
212
+ client = new AcpClient();
213
+ await client.handshake();
214
+ const [newest] = await client.list(90, tmpProject);
215
+ client.send({
216
+ jsonrpc: "2.0",
217
+ id: 91,
218
+ method: "session/load",
219
+ params: { sessionId: newest.sessionId, cwd: tmpProject, mcpServers: [] },
220
+ });
221
+ const frames = await client.until(91);
222
+ const replay = frames.filter((frame) => frame.method === "session/update");
223
+ // History must arrive BEFORE the response: a client draws a resumed session
224
+ // with its live-turn renderer, so anything after the reply lands nowhere.
225
+ expect(replay.length).toBeGreaterThan(0);
226
+ expect(frames.at(-1).id).toBe(91);
227
+ for (const frame of replay)
228
+ expect(frame.params.sessionId).toBe(newest.sessionId);
229
+ expect(updates(frames)).toEqual([
230
+ {
231
+ sessionUpdate: "user_message_chunk",
232
+ content: { type: "text", text: "newer: add the config panel" },
233
+ },
234
+ {
235
+ sessionUpdate: "agent_message_chunk",
236
+ content: { type: "text", text: "Reading the panel first." },
237
+ },
238
+ {
239
+ sessionUpdate: "tool_call",
240
+ toolCallId: "call-1",
241
+ title: "read(/panel.tsx)",
242
+ name: "read",
243
+ kind: "read",
244
+ // A replayed call is settled; `in_progress` would spin forever.
245
+ status: "completed",
246
+ rawInput: { file_path: "/panel.tsx" },
247
+ },
248
+ {
249
+ sessionUpdate: "tool_call_update",
250
+ toolCallId: "call-1",
251
+ status: "completed",
252
+ content: [{ type: "content", content: { type: "text", text: "panel source" } }],
253
+ },
254
+ {
255
+ sessionUpdate: "agent_message_chunk",
256
+ content: { type: "text", text: "Added the config panel." },
257
+ },
258
+ ]);
259
+ // Resuming is worthless if the session cannot then be prompted, and the
260
+ // client must keep addressing it by the id it asked to load.
261
+ client.send({
262
+ jsonrpc: "2.0",
263
+ id: 92,
264
+ method: "session/prompt",
265
+ params: { sessionId: newest.sessionId, prompt: [{ type: "text", text: "again" }] },
266
+ });
267
+ const turn = await client.until(92);
268
+ expect(turn.at(-1).result).toEqual({ stopReason: "end_turn" });
269
+ expect(turn
270
+ .filter((frame) => frame.method === "session/update")
271
+ .every((frame) => frame.params.sessionId === newest.sessionId)).toBe(true);
272
+ });
273
+ it("loads a session listed under a different cwd than the one it is opened with", async () => {
274
+ client = new AcpClient();
275
+ await client.handshake();
276
+ const [newest] = await client.list(90, tmpProject);
277
+ // Exactly what pew2 does: its capability probe lists from its own working
278
+ // directory, then resumes against the project the session belongs to. A
279
+ // cwd-scoped lookup fails here, so this is the regression that matters.
280
+ client.send({
281
+ jsonrpc: "2.0",
282
+ id: 91,
283
+ method: "session/load",
284
+ params: { sessionId: newest.sessionId, cwd: os.tmpdir(), mcpServers: [] },
285
+ });
286
+ const frames = await client.until(91);
287
+ expect(frames.at(-1).error).toBeUndefined();
288
+ expect(updates(frames)[0]).toEqual({
289
+ sessionUpdate: "user_message_chunk",
290
+ content: { type: "text", text: "newer: add the config panel" },
291
+ });
292
+ });
293
+ it("refuses to load a session that does not exist", async () => {
294
+ client = new AcpClient();
295
+ await client.handshake();
296
+ client.send({
297
+ jsonrpc: "2.0",
298
+ id: 91,
299
+ method: "session/load",
300
+ params: { sessionId: "no-such-session", cwd: tmpProject, mcpServers: [] },
301
+ });
302
+ expect((await client.until(91)).at(-1).error).toMatchObject({
303
+ code: -32602,
304
+ message: expect.stringContaining("no-such-session"),
305
+ });
306
+ });
307
+ it("advertises model and thinking selectors, and applies changes to both", async () => {
308
+ client = new AcpClient();
309
+ client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
310
+ await client.until(1);
311
+ client.send({
312
+ jsonrpc: "2.0",
313
+ id: 2,
314
+ method: "session/new",
315
+ params: { cwd: tmpProject, mcpServers: [] },
316
+ });
317
+ const created = (await client.until(2)).at(-1);
318
+ const initial = created.result.configOptions;
319
+ const model = initial.find((option) => option.id === "model");
320
+ const thinking = initial.find((option) => option.id === "thinking");
321
+ // Categories are what let a client place these correctly without knowing
322
+ // anything about ggcoder.
323
+ expect(model).toMatchObject({ category: "model", type: "select" });
324
+ expect(thinking).toMatchObject({ category: "thought_level", type: "select" });
325
+ expect(model.currentValue).toBe("claude-opus-5");
326
+ expect(model.options.length).toBeGreaterThan(1);
327
+ expect(model.options.some((option) => option.value === "claude-opus-5")).toBe(true);
328
+ expect(thinking.currentValue).toBe("off");
329
+ expect(thinking.options[0]).toMatchObject({ value: "off" });
330
+ client.send({
331
+ jsonrpc: "2.0",
332
+ id: 3,
333
+ method: "session/set_config_option",
334
+ params: { sessionId: "acp-fixture-session", configId: "thinking", value: "high" },
335
+ });
336
+ const afterThinking = (await client.until(3)).at(-1).result.configOptions;
337
+ // The reply must carry the COMPLETE set, not just the field that changed.
338
+ expect(afterThinking.map((option) => option.id).sort()).toEqual(["mode", "model", "thinking"]);
339
+ expect(afterThinking.find((option) => option.id === "thinking").currentValue).toBe("high");
340
+ client.send({
341
+ jsonrpc: "2.0",
342
+ id: 4,
343
+ method: "session/set_config_option",
344
+ params: {
345
+ sessionId: "acp-fixture-session",
346
+ configId: "model",
347
+ value: "claude-haiku-4-5-20251001",
348
+ },
349
+ });
350
+ const afterModel = (await client.until(4)).at(-1).result.configOptions;
351
+ expect(afterModel.find((option) => option.id === "model").currentValue).toBe("claude-haiku-4-5-20251001");
352
+ // Haiku's ceiling is `high`, so the ladder must shrink with the model rather
353
+ // than keep offering a level it would silently ignore.
354
+ const haikuLevels = afterModel.find((option) => option.id === "thinking").options;
355
+ expect(haikuLevels.some((option) => option.value === "max")).toBe(false);
356
+ expect(haikuLevels.at(-1)).toMatchObject({ value: "high" });
357
+ // The level set before the switch is still legal here, so it must survive.
358
+ expect(afterModel.find((option) => option.id === "thinking").currentValue).toBe("high");
359
+ });
360
+ it("clamps a thinking level the newly selected model cannot reach", async () => {
361
+ client = new AcpClient();
362
+ await client.handshake();
363
+ client.send({
364
+ jsonrpc: "2.0",
365
+ id: 3,
366
+ method: "session/set_config_option",
367
+ params: { sessionId: "acp-fixture-session", configId: "thinking", value: "max" },
368
+ });
369
+ await client.until(3);
370
+ client.send({
371
+ jsonrpc: "2.0",
372
+ id: 4,
373
+ method: "session/set_config_option",
374
+ params: {
375
+ sessionId: "acp-fixture-session",
376
+ configId: "model",
377
+ value: "claude-haiku-4-5-20251001",
378
+ },
379
+ });
380
+ const options = (await client.until(4)).at(-1).result.configOptions;
381
+ // Reporting `max` here would be a control that lies: Haiku has no such tier,
382
+ // so the session's real effort is `high` and the client must be told that.
383
+ expect(options.find((option) => option.id === "thinking").currentValue).toBe("high");
384
+ });
385
+ it("advertises plan mode in both the config options and the modes block", async () => {
386
+ client = new AcpClient();
387
+ client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
388
+ await client.until(1);
389
+ client.send({
390
+ jsonrpc: "2.0",
391
+ id: 2,
392
+ method: "session/new",
393
+ params: { cwd: tmpProject, mcpServers: [] },
394
+ });
395
+ const created = (await client.until(2)).at(-1).result;
396
+ // Two surfaces, one truth: spec clients (Zed) read `modes`; pew2 reads the
397
+ // config option. They must agree or the two pickers would disagree.
398
+ expect(created.modes).toEqual({
399
+ currentModeId: "default",
400
+ availableModes: [
401
+ { id: "default", name: "Default", description: "Full tool access" },
402
+ { id: "plan", name: "Plan", description: "Read-only research until a plan is approved" },
403
+ ],
404
+ });
405
+ const mode = created.configOptions.find((option) => option.id === "mode");
406
+ expect(mode).toMatchObject({ category: "mode", type: "select", currentValue: "default" });
407
+ expect(mode.options.map((option) => option.value)).toEqual(["default", "plan"]);
408
+ });
409
+ it("switches mode via session/set_mode and tells the client with current_mode_update", async () => {
410
+ client = new AcpClient();
411
+ const sessionId = await client.handshake();
412
+ client.send({
413
+ jsonrpc: "2.0",
414
+ id: 3,
415
+ method: "session/set_mode",
416
+ params: { sessionId, modeId: "plan" },
417
+ });
418
+ const frames = await client.until(3);
419
+ expect(frames.at(-1).result).toEqual({});
420
+ const notes = updates(frames);
421
+ expect(notes[0]).toEqual({ sessionUpdate: "current_mode_update", currentModeId: "plan" });
422
+ // The full option set rides along so a client tracking config sees the
423
+ // same truth the modes block would tell it.
424
+ const configNote = notes.find((u) => u.sessionUpdate === "config_option_update");
425
+ expect((configNote.configOptions ?? []).find((o) => o.id === "mode")
426
+ .currentValue).toBe("plan");
427
+ // And back — via the config-option route pew2 actually uses.
428
+ client.send({
429
+ jsonrpc: "2.0",
430
+ id: 4,
431
+ method: "session/set_config_option",
432
+ params: { sessionId, configId: "mode", value: "default" },
433
+ });
434
+ const back = (await client.until(4)).at(-1).result.configOptions;
435
+ expect(back.find((option) => option.id === "mode").currentValue).toBe("default");
436
+ });
437
+ it("rejects an unknown mode", async () => {
438
+ client = new AcpClient();
439
+ const sessionId = await client.handshake();
440
+ client.send({
441
+ jsonrpc: "2.0",
442
+ id: 3,
443
+ method: "session/set_mode",
444
+ params: { sessionId, modeId: "yolo" },
445
+ });
446
+ expect((await client.until(3)).at(-1).error).toMatchObject({
447
+ code: -32602,
448
+ message: expect.stringContaining("yolo"),
449
+ });
450
+ });
451
+ it("rejects config values the active model cannot honour", async () => {
452
+ client = new AcpClient();
453
+ await client.handshake();
454
+ client.send({
455
+ jsonrpc: "2.0",
456
+ id: 3,
457
+ method: "session/set_config_option",
458
+ params: { sessionId: "acp-fixture-session", configId: "model", value: "not-a-model" },
459
+ });
460
+ expect((await client.until(3)).at(-1).error).toMatchObject({
461
+ code: -32602,
462
+ message: expect.stringContaining("not-a-model"),
463
+ });
464
+ client.send({
465
+ jsonrpc: "2.0",
466
+ id: 4,
467
+ method: "session/set_config_option",
468
+ params: { sessionId: "acp-fixture-session", configId: "nonsense", value: "x" },
469
+ });
470
+ expect((await client.until(4)).at(-1).error).toMatchObject({ code: -32602 });
471
+ });
472
+ it("maps the event bus onto session/update notifications, then answers with a stopReason", async () => {
473
+ client = new AcpClient();
474
+ const sessionId = await client.handshake();
475
+ client.send({
476
+ jsonrpc: "2.0",
477
+ id: 3,
478
+ method: "session/prompt",
479
+ params: { sessionId, prompt: [{ type: "text", text: "world" }] },
480
+ });
481
+ const frames = await client.until(3);
482
+ const turn = frames.filter((frame) => frame.method === "session/update" || frame.id === 3);
483
+ // Every notification for the turn must arrive BEFORE its response, or a
484
+ // client renders the finished turn with no content in it.
485
+ expect(turn.at(-1).result).toEqual({ stopReason: "end_turn" });
486
+ expect(turn.slice(0, -1).every((frame) => frame.method === "session/update")).toBe(true);
487
+ for (const frame of frames.filter((f) => f.method === "session/update")) {
488
+ expect(frame.params.sessionId).toBe(sessionId);
489
+ }
490
+ expect(updates(frames)).toEqual([
491
+ { sessionUpdate: "agent_thought_chunk", content: { type: "text", text: "planning" } },
492
+ { sessionUpdate: "agent_message_chunk", content: { type: "text", text: "Hello " } },
493
+ { sessionUpdate: "agent_message_chunk", content: { type: "text", text: "world" } },
494
+ {
495
+ sessionUpdate: "tool_call",
496
+ toolCallId: "t1",
497
+ title: "read(/tmp/example.ts)",
498
+ name: "read",
499
+ kind: "read",
500
+ status: "in_progress",
501
+ rawInput: { file_path: "/tmp/example.ts" },
502
+ },
503
+ {
504
+ sessionUpdate: "tool_call_update",
505
+ toolCallId: "t1",
506
+ status: "in_progress",
507
+ rawOutput: { progress: 0.5 },
508
+ },
509
+ {
510
+ sessionUpdate: "tool_call_update",
511
+ toolCallId: "t1",
512
+ status: "completed",
513
+ content: [{ type: "content", content: { type: "text", text: "file contents" } }],
514
+ },
515
+ {
516
+ sessionUpdate: "tool_call",
517
+ toolCallId: "t2",
518
+ title: "bash(exit 1)",
519
+ name: "bash",
520
+ kind: "execute",
521
+ status: "in_progress",
522
+ rawInput: { command: "exit 1" },
523
+ },
524
+ {
525
+ sessionUpdate: "tool_call_update",
526
+ toolCallId: "t2",
527
+ status: "failed",
528
+ content: [{ type: "content", content: { type: "text", text: "boom" } }],
529
+ },
530
+ ]);
531
+ });
532
+ it("reports a refusal as its own stop reason", async () => {
533
+ client = new AcpClient();
534
+ const sessionId = await client.handshake();
535
+ client.send({
536
+ jsonrpc: "2.0",
537
+ id: 3,
538
+ method: "session/prompt",
539
+ params: { sessionId, prompt: [{ type: "text", text: "refuse" }] },
540
+ });
541
+ expect((await client.until(3)).at(-1).result).toEqual({ stopReason: "refusal" });
542
+ });
543
+ it("resolves a cancelled turn with stopReason cancelled rather than an error", async () => {
544
+ client = new AcpClient();
545
+ const sessionId = await client.handshake();
546
+ client.send({
547
+ jsonrpc: "2.0",
548
+ id: 3,
549
+ method: "session/prompt",
550
+ params: { sessionId, prompt: [{ type: "text", text: "hang" }] },
551
+ });
552
+ // Let the prompt actually start; cancelling before it does is a different
553
+ // path and would make this test pass for the wrong reason.
554
+ await new Promise((resolve) => setTimeout(resolve, 300));
555
+ client.send({ jsonrpc: "2.0", method: "session/cancel", params: { sessionId } });
556
+ const frames = await client.until(3);
557
+ expect(frames.at(-1).result).toEqual({ stopReason: "cancelled" });
558
+ // A notification must never be answered — an id here is a protocol violation.
559
+ expect(frames.some((frame) => frame.id === null && frame.error)).toBe(false);
560
+ // Cancel ends ONE turn, not the session. This catches a stale aborted
561
+ // signal: AgentSession swallows that abort, so without re-arming this next
562
+ // request deceptively returns end_turn but streams no answer.
563
+ client.send({
564
+ jsonrpc: "2.0",
565
+ id: 4,
566
+ method: "session/prompt",
567
+ params: { sessionId, prompt: [{ type: "text", text: "after cancel" }] },
568
+ });
569
+ const resumed = await client.until(4);
570
+ expect(resumed.at(-1).result).toEqual({ stopReason: "end_turn" });
571
+ expect(updates(resumed).some((update) => update.sessionUpdate === "agent_message_chunk" &&
572
+ update.content?.text === "after cancel")).toBe(true);
573
+ }, 20_000);
574
+ it("rejects unknown methods and prompts sent before a session exists", async () => {
575
+ client = new AcpClient();
576
+ client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: 1 } });
577
+ await client.until(1);
578
+ client.send({
579
+ jsonrpc: "2.0",
580
+ id: 2,
581
+ method: "session/prompt",
582
+ params: { prompt: [{ type: "text", text: "hi" }] },
583
+ });
584
+ expect((await client.until(2)).at(-1).error).toMatchObject({
585
+ code: -32602,
586
+ message: expect.stringContaining("session/new"),
587
+ });
588
+ // Unimplemented methods must be refused, not silently accepted, so a client
589
+ // can fall back instead of hanging.
590
+ client.send({ jsonrpc: "2.0", id: 3, method: "session/fork", params: {} });
591
+ expect((await client.until(3)).at(-1).error).toMatchObject({ code: -32601 });
592
+ }, 20_000);
593
+ it("answers malformed input with a parse error and keeps serving", async () => {
594
+ client = new AcpClient();
595
+ client.send({ jsonrpc: "2.0", id: 1, method: "initialize", params: {} });
596
+ await client.until(1);
597
+ client.sendRaw("{ not json\n");
598
+ client.send({ jsonrpc: "2.0", id: 2, method: "initialize", params: {} });
599
+ const frames = await client.until(2);
600
+ expect(frames.some((f) => f.id === null && f.error?.code === -32700)).toBe(true);
601
+ expect(frames.at(-1).result.protocolVersion).toBe(ACP_PROTOCOL_VERSION);
602
+ });
603
+ it("disposes the session and exits cleanly when the client disconnects", async () => {
604
+ client = new AcpClient();
605
+ await client.handshake();
606
+ client.end();
607
+ expect(await client.exit).toBe(0);
608
+ expect(client.stderr).toContain("disposed=true");
609
+ });
610
+ });
611
+ //# sourceMappingURL=acp-mode.test.js.map