@kenkaiiii/ggcoder 5.26.2 → 5.27.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 (107) hide show
  1. package/dist/app-sidecar.js +81 -47
  2. package/dist/app-sidecar.js.map +1 -1
  3. package/dist/core/agent-session-marker-anchors.test.js +181 -2
  4. package/dist/core/agent-session-marker-anchors.test.js.map +1 -1
  5. package/dist/core/agent-session-process-gate.test.d.ts +2 -0
  6. package/dist/core/agent-session-process-gate.test.d.ts.map +1 -0
  7. package/dist/core/agent-session-process-gate.test.js +88 -0
  8. package/dist/core/agent-session-process-gate.test.js.map +1 -0
  9. package/dist/core/agent-session-slash-restore.test.d.ts +2 -0
  10. package/dist/core/agent-session-slash-restore.test.d.ts.map +1 -0
  11. package/dist/core/agent-session-slash-restore.test.js +121 -0
  12. package/dist/core/agent-session-slash-restore.test.js.map +1 -0
  13. package/dist/core/agent-session.d.ts +66 -0
  14. package/dist/core/agent-session.d.ts.map +1 -1
  15. package/dist/core/agent-session.js +304 -35
  16. package/dist/core/agent-session.js.map +1 -1
  17. package/dist/core/compaction/compactor.d.ts +21 -0
  18. package/dist/core/compaction/compactor.d.ts.map +1 -1
  19. package/dist/core/compaction/compactor.js +16 -0
  20. package/dist/core/compaction/compactor.js.map +1 -1
  21. package/dist/core/compaction/compactor.test.js +91 -0
  22. package/dist/core/compaction/compactor.test.js.map +1 -1
  23. package/dist/core/foreign-session-import.d.ts +120 -0
  24. package/dist/core/foreign-session-import.d.ts.map +1 -0
  25. package/dist/core/foreign-session-import.js +594 -0
  26. package/dist/core/foreign-session-import.js.map +1 -0
  27. package/dist/core/foreign-session-import.test.d.ts +2 -0
  28. package/dist/core/foreign-session-import.test.d.ts.map +1 -0
  29. package/dist/core/foreign-session-import.test.js +220 -0
  30. package/dist/core/foreign-session-import.test.js.map +1 -0
  31. package/dist/core/foreign-transcript-blocks.d.ts +51 -0
  32. package/dist/core/foreign-transcript-blocks.d.ts.map +1 -0
  33. package/dist/core/foreign-transcript-blocks.js +151 -0
  34. package/dist/core/foreign-transcript-blocks.js.map +1 -0
  35. package/dist/core/mcp/catalog-cache.d.ts +63 -0
  36. package/dist/core/mcp/catalog-cache.d.ts.map +1 -0
  37. package/dist/core/mcp/catalog-cache.js +163 -0
  38. package/dist/core/mcp/catalog-cache.js.map +1 -0
  39. package/dist/core/mcp/catalog-cache.test.d.ts +2 -0
  40. package/dist/core/mcp/catalog-cache.test.d.ts.map +1 -0
  41. package/dist/core/mcp/catalog-cache.test.js +99 -0
  42. package/dist/core/mcp/catalog-cache.test.js.map +1 -0
  43. package/dist/core/mcp/client.d.ts +61 -0
  44. package/dist/core/mcp/client.d.ts.map +1 -1
  45. package/dist/core/mcp/client.js +216 -31
  46. package/dist/core/mcp/client.js.map +1 -1
  47. package/dist/core/mcp/legacy-negotiation.test.d.ts +2 -0
  48. package/dist/core/mcp/legacy-negotiation.test.d.ts.map +1 -0
  49. package/dist/core/mcp/legacy-negotiation.test.js +80 -0
  50. package/dist/core/mcp/legacy-negotiation.test.js.map +1 -0
  51. package/dist/core/mcp/oauth-provider.d.ts +1 -2
  52. package/dist/core/mcp/oauth-provider.d.ts.map +1 -1
  53. package/dist/core/mcp/oauth-provider.js +5 -1
  54. package/dist/core/mcp/oauth-provider.js.map +1 -1
  55. package/dist/core/mcp/oauth-store.d.ts +1 -1
  56. package/dist/core/mcp/oauth-store.d.ts.map +1 -1
  57. package/dist/core/mcp/oauth-store.js.map +1 -1
  58. package/dist/core/mcp/when-connected.test.d.ts +2 -0
  59. package/dist/core/mcp/when-connected.test.d.ts.map +1 -0
  60. package/dist/core/mcp/when-connected.test.js +46 -0
  61. package/dist/core/mcp/when-connected.test.js.map +1 -0
  62. package/dist/core/process-gate.d.ts +45 -0
  63. package/dist/core/process-gate.d.ts.map +1 -0
  64. package/dist/core/process-gate.js +71 -0
  65. package/dist/core/process-gate.js.map +1 -0
  66. package/dist/core/process-gate.test.d.ts +2 -0
  67. package/dist/core/process-gate.test.d.ts.map +1 -0
  68. package/dist/core/process-gate.test.js +87 -0
  69. package/dist/core/process-gate.test.js.map +1 -0
  70. package/dist/core/process-manager.d.ts +9 -0
  71. package/dist/core/process-manager.d.ts.map +1 -1
  72. package/dist/core/process-manager.js +17 -15
  73. package/dist/core/process-manager.js.map +1 -1
  74. package/dist/core/session-history.d.ts +61 -4
  75. package/dist/core/session-history.d.ts.map +1 -1
  76. package/dist/core/session-history.js +144 -15
  77. package/dist/core/session-history.js.map +1 -1
  78. package/dist/core/session-history.test.js +50 -1
  79. package/dist/core/session-history.test.js.map +1 -1
  80. package/dist/core/session-manager.d.ts +35 -6
  81. package/dist/core/session-manager.d.ts.map +1 -1
  82. package/dist/core/session-manager.js +39 -10
  83. package/dist/core/session-manager.js.map +1 -1
  84. package/dist/core/session-manager.test.js +14 -2
  85. package/dist/core/session-manager.test.js.map +1 -1
  86. package/dist/core/settings-manager.d.ts +1 -0
  87. package/dist/core/settings-manager.d.ts.map +1 -1
  88. package/dist/core/settings-manager.js +6 -0
  89. package/dist/core/settings-manager.js.map +1 -1
  90. package/dist/core/slash-commands.d.ts +2 -0
  91. package/dist/core/slash-commands.d.ts.map +1 -1
  92. package/dist/core/slash-commands.js +17 -0
  93. package/dist/core/slash-commands.js.map +1 -1
  94. package/dist/core/slash-commands.test.js +1 -0
  95. package/dist/core/slash-commands.test.js.map +1 -1
  96. package/dist/tools/tool-search.d.ts +12 -1
  97. package/dist/tools/tool-search.d.ts.map +1 -1
  98. package/dist/tools/tool-search.js +22 -3
  99. package/dist/tools/tool-search.js.map +1 -1
  100. package/dist/tools/tool-search.test.d.ts +2 -0
  101. package/dist/tools/tool-search.test.d.ts.map +1 -0
  102. package/dist/tools/tool-search.test.js +69 -0
  103. package/dist/tools/tool-search.test.js.map +1 -0
  104. package/dist/ui/App.d.ts.map +1 -1
  105. package/dist/ui/App.js +27 -1
  106. package/dist/ui/App.js.map +1 -1
  107. package/package.json +5 -5
@@ -2,7 +2,7 @@ import fs from "node:fs/promises";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
- import { normalizeAppMarkersForHistory } from "./session-history.js";
5
+ import { normalizeAppMarkersForHistory, normalizeAutopilotMarkersForHistory, normalizeKenTurnsForHistory, } from "./session-history.js";
6
6
  import { useFakeHome } from "../test-support/fake-home.js";
7
7
  const shouldCompactMock = vi.hoisted(() => vi.fn());
8
8
  const compactMock = vi.hoisted(() => vi.fn());
@@ -41,7 +41,7 @@ async function writeJson(filePath, value) {
41
41
  await fs.mkdir(path.dirname(filePath), { recursive: true });
42
42
  await fs.writeFile(filePath, JSON.stringify(value, null, 2), "utf-8");
43
43
  }
44
- async function findSessionFile() {
44
+ async function listSessionFiles() {
45
45
  const root = path.join(tmpHome, ".gg", "sessions");
46
46
  const found = [];
47
47
  for (const dir of await fs.readdir(root)) {
@@ -50,6 +50,12 @@ async function findSessionFile() {
50
50
  found.push(path.join(root, dir, file));
51
51
  }
52
52
  }
53
+ // Session filenames lead with an ISO timestamp, so lexical order is
54
+ // chronological — the last one is the newest (post-compaction) file.
55
+ return found.sort();
56
+ }
57
+ async function findSessionFile() {
58
+ const found = await listSessionFiles();
53
59
  if (found.length !== 1)
54
60
  throw new Error(`expected 1 session file, found ${found.length}`);
55
61
  return found[0];
@@ -143,5 +149,178 @@ describe("AgentSession transcript marker anchors", () => {
143
149
  expect(replayed.some((m) => m.afterMessageCount > restoredCount)).toBe(false);
144
150
  await resumed.dispose();
145
151
  }, 15_000);
152
+ // The reported bug: an autopilot session that gets compacted mid-conversation
153
+ // shows every earlier Ken verdict / error row jammed at the BOTTOM (or missing)
154
+ // when reopened, even though several turns happened after them. Compaction
155
+ // re-persisted the markers into the continuation file still carrying anchors
156
+ // from the far longer pre-compaction transcript.
157
+ it("keeps markers in place when compaction rewrites the session mid-conversation", async () => {
158
+ const { AgentSession } = await import("./agent-session.js");
159
+ const session = new AgentSession({
160
+ provider: "anthropic",
161
+ model: "claude-test",
162
+ cwd: tmpProject,
163
+ systemPrompt: "test system prompt",
164
+ });
165
+ await session.initialize();
166
+ agentLoopMock.mockImplementation(async function* (messages) {
167
+ messages.push({ role: "assistant", content: "reply" });
168
+ yield { type: "agent_done" };
169
+ });
170
+ // Six turns (12 non-system messages), with markers recorded early on —
171
+ // exactly the shape of an autopilot run: Ken reviews, an error surfaces,
172
+ // and the conversation keeps going well past both.
173
+ await session.prompt("turn 1");
174
+ await session.prompt("turn 2");
175
+ await session.persistAppMarker("error", { headline: "Rate limited" });
176
+ await session.persistAutopilotMarker("done");
177
+ await session.persistKenTurn("is this right?", "looks good");
178
+ await session.prompt("turn 3");
179
+ await session.prompt("turn 4");
180
+ await session.prompt("turn 5");
181
+ // A second, later verdict — this one lands in the tail compaction keeps
182
+ // verbatim, so it exercises the shift branch as well as the collapse one.
183
+ await session.persistAutopilotMarker("prompted", { body: "fix the flake" });
184
+ await session.prompt("turn 6");
185
+ // Markers sit at messages 4 and 10 of 12 — NOT at the end.
186
+ expect(session.getAppMarkers().filter((m) => m.kind === "error")[0]?.afterMessageCount).toBe(4);
187
+ expect(session.getAutopilotMarkers().map((m) => m.afterMessageCount)).toEqual([4, 10]);
188
+ expect(session.getMessages().filter((m) => m.role !== "system").length).toBe(12);
189
+ // Compaction collapses the first 8 non-system messages into a summary +
190
+ // ack, keeping the last 4 verbatim: 12 → 6 non-system messages.
191
+ const systemMsg = session.getMessages()[0];
192
+ const tail = session.getMessages().slice(-4);
193
+ compactMock.mockResolvedValue({
194
+ messages: [
195
+ systemMsg,
196
+ { role: "user", content: "[Previous conversation summary]\n\nearlier work" },
197
+ { role: "assistant", content: "I have the full context from the summary above." },
198
+ ...tail,
199
+ ],
200
+ result: {
201
+ compacted: true,
202
+ originalCount: 13,
203
+ newCount: 7,
204
+ tokensBeforeEstimate: 100_000,
205
+ tokensAfterEstimate: 10_000,
206
+ anchorRemap: { summarizedCount: 8, prefixCount: 2, newNonSystemCount: 6 },
207
+ },
208
+ });
209
+ await session.compact();
210
+ const compactedCount = session.getMessages().filter((m) => m.role !== "system").length;
211
+ expect(compactedCount).toBe(6);
212
+ // Two more turns AFTER the compaction, so "the bottom" is unambiguously
213
+ // somewhere the old markers must not be.
214
+ await session.prompt("turn 7");
215
+ await session.prompt("turn 8");
216
+ await session.dispose();
217
+ // Resume from the continuation file compaction created.
218
+ const files = await listSessionFiles();
219
+ expect(files.length).toBe(2);
220
+ const resumed = new AgentSession({
221
+ provider: "anthropic",
222
+ model: "claude-test",
223
+ cwd: tmpProject,
224
+ systemPrompt: "test system prompt",
225
+ sessionId: files[files.length - 1],
226
+ });
227
+ await resumed.initialize();
228
+ const restoredCount = resumed.getMessages().filter((m) => m.role !== "system").length;
229
+ expect(restoredCount).toBe(10); // 6 compacted + 2 turns × 2 messages
230
+ const errors = normalizeAppMarkersForHistory(resumed.getAppMarkers(), restoredCount).filter((m) => m.kind === "error");
231
+ const verdicts = normalizeAutopilotMarkersForHistory(resumed.getAutopilotMarkers(), restoredCount);
232
+ const kenTurns = normalizeKenTurnsForHistory(resumed.getKenTurns(), restoredCount);
233
+ // All of them survive the rewrite...
234
+ expect(errors).toHaveLength(1);
235
+ expect(verdicts).toHaveLength(2);
236
+ expect(kenTurns).toHaveLength(1);
237
+ // ...the ones whose surrounding conversation was summarized away land just
238
+ // after the summary block (the earliest honest position)...
239
+ expect(errors[0].afterMessageCount).toBe(2);
240
+ expect(verdicts[0].afterMessageCount).toBe(2);
241
+ expect(kenTurns[0].afterMessageCount).toBe(2);
242
+ // ...and the one in the retained tail merely shifts with it: message 10 of
243
+ // the old transcript is message 4 of the new one. Unrebased it stayed at
244
+ // 10, which in a 10-message transcript is the very bottom — exactly the
245
+ // reported symptom, six messages below where it belongs.
246
+ expect(verdicts[1].afterMessageCount).toBe(4);
247
+ // Nothing bunches at the end, where the four post-compaction messages live.
248
+ for (const anchor of [
249
+ errors[0].afterMessageCount,
250
+ verdicts[0].afterMessageCount,
251
+ verdicts[1].afterMessageCount,
252
+ kenTurns[0].afterMessageCount,
253
+ ]) {
254
+ expect(anchor).toBeLessThan(restoredCount - 3);
255
+ }
256
+ await resumed.dispose();
257
+ }, 20_000);
258
+ // Sessions already on disk were written before the rebase existed, so their
259
+ // anchors are still pre-compaction values. They must be rescued to their
260
+ // file-order position rather than dropped or clamped to the bottom.
261
+ it("heals legacy sessions whose persisted anchors survived a compaction unrebased", async () => {
262
+ const { SessionManager, APP_MARKER_CUSTOM_KIND, AUTOPILOT_MARKER_CUSTOM_KIND, KEN_TURN_CUSTOM_KIND, } = await import("./session-manager.js");
263
+ const sessionsDir = path.join(tmpHome, ".gg", "sessions");
264
+ const manager = new SessionManager(sessionsDir);
265
+ const created = await manager.create(tmpProject, "anthropic", "claude-test");
266
+ const message = (id, text) => ({
267
+ type: "message",
268
+ id,
269
+ parentId: null,
270
+ timestamp: new Date().toISOString(),
271
+ message: { role: "user", content: text },
272
+ });
273
+ const custom = (id, kind, data) => ({
274
+ type: "custom",
275
+ kind,
276
+ id,
277
+ parentId: null,
278
+ timestamp: new Date().toISOString(),
279
+ data,
280
+ });
281
+ // Post-compaction file: 2 summary messages, then the stale markers dumped
282
+ // by the old re-persist path (anchors from a 367-message transcript), then
283
+ // the conversation continues to 6 messages total.
284
+ await manager.appendEntry(created.path, message("m1", "[Previous conversation summary]"));
285
+ await manager.appendEntry(created.path, message("m2", "ack"));
286
+ await manager.appendEntry(created.path,
287
+ // Anchor 64 overshoots the 6-message transcript entirely — previously
288
+ // dropped, so the verdict vanished on reopen.
289
+ custom("a1", AUTOPILOT_MARKER_CUSTOM_KIND, {
290
+ version: 1,
291
+ phase: "done",
292
+ afterMessageCount: 64,
293
+ }));
294
+ await manager.appendEntry(created.path,
295
+ // Anchor 5 is still IN range but far past where the marker was written —
296
+ // previously replayed near the bottom, below four unrelated later turns.
297
+ custom("e1", APP_MARKER_CUSTOM_KIND, {
298
+ version: 1,
299
+ kind: "error",
300
+ afterMessageCount: 5,
301
+ data: { headline: "Rate limited" },
302
+ }));
303
+ await manager.appendEntry(created.path, custom("k1", KEN_TURN_CUSTOM_KIND, {
304
+ version: 1,
305
+ question: "why did that fail?",
306
+ reply: "transient rate limit",
307
+ afterMessageCount: 88,
308
+ }));
309
+ for (const i of [3, 4, 5, 6])
310
+ await manager.appendEntry(created.path, message(`m${i}`, `t${i}`));
311
+ const loaded = await manager.load(created.path);
312
+ const restoredCount = manager.getMessages(loaded.entries, loaded.header.leafId).length;
313
+ expect(restoredCount).toBe(6);
314
+ const verdicts = normalizeAutopilotMarkersForHistory(manager.getAutopilotMarkers(loaded.entries, loaded.header.leafId), restoredCount);
315
+ const errors = normalizeAppMarkersForHistory(manager.getAppMarkers(loaded.entries, loaded.header.leafId), restoredCount);
316
+ const kenTurns = normalizeKenTurnsForHistory(manager.getKenTurns(loaded.entries, loaded.header.leafId), restoredCount);
317
+ // All three are pulled back to where they were actually written: right
318
+ // after the summary, above the four later messages — none dropped, none
319
+ // stacked at the bottom.
320
+ expect(verdicts.map((m) => m.afterMessageCount)).toEqual([2]);
321
+ expect(errors.map((m) => m.afterMessageCount)).toEqual([2]);
322
+ expect(kenTurns.map((t) => t.afterMessageCount)).toEqual([2]);
323
+ expect(restoredCount - 2).toBe(4);
324
+ }, 15_000);
146
325
  });
147
326
  //# sourceMappingURL=agent-session-marker-anchors.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-marker-anchors.test.js","sourceRoot":"","sources":["../../src/core/agent-session-marker-anchors.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-session-marker-anchors.test.js","sourceRoot":"","sources":["../../src/core/agent-session-marker-anchors.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-session-process-gate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session-process-gate.test.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-process-gate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ import { afterEach, describe, expect, it } from "vitest";
2
+ import { AgentSession } from "./agent-session.js";
3
+ import { ProcessManager } from "./process-manager.js";
4
+ function makeSession() {
5
+ const session = new AgentSession({
6
+ provider: "anthropic",
7
+ model: "claude-sonnet-5",
8
+ cwd: "/project",
9
+ transient: true,
10
+ systemPrompt: "test",
11
+ // Isolate the process gate from the Ideal review phase.
12
+ selfCorrectionHooks: false,
13
+ });
14
+ return { session, internal: session };
15
+ }
16
+ const managers = [];
17
+ function trackedManager() {
18
+ const manager = new ProcessManager();
19
+ managers.push(manager);
20
+ return manager;
21
+ }
22
+ afterEach(() => {
23
+ for (const manager of managers.splice(0))
24
+ manager.shutdownAll();
25
+ });
26
+ /** Poll until the process log has content, so the read is meaningful. */
27
+ async function waitForOutput(manager, id) {
28
+ for (let attempt = 0; attempt < 50; attempt++) {
29
+ const result = await manager.readOutput(id);
30
+ if (result.output.trim())
31
+ return result.output;
32
+ await new Promise((resolve) => setTimeout(resolve, 50));
33
+ }
34
+ return "";
35
+ }
36
+ describe("AgentSession background-process completion gate", () => {
37
+ it("injects once for an unread in-run process, then completes after it is read", async () => {
38
+ const { internal } = makeSession();
39
+ const manager = trackedManager();
40
+ internal.processManager = manager;
41
+ internal.runStartedAt = Date.now();
42
+ const started = await manager.start("echo gate-probe; sleep 30", process.cwd());
43
+ const first = internal.getHookFollowUpMessages();
44
+ expect(first?.[0]?.role).toBe("user");
45
+ expect(first?.[0]?.content).toContain(started.id);
46
+ expect(internal.processGateInjected).toBe(1);
47
+ // The agent does what the gate asked: reads the output.
48
+ expect(await waitForOutput(manager, started.id)).toContain("gate-probe");
49
+ expect(internal.getHookFollowUpMessages()).toBeNull();
50
+ expect(internal.processGateInjected).toBe(1);
51
+ });
52
+ it("never gates a process that predates the run", async () => {
53
+ const { internal } = makeSession();
54
+ const manager = trackedManager();
55
+ internal.processManager = manager;
56
+ await manager.start("sleep 30", process.cwd());
57
+ // Run started after the process — a deliberately long-lived dev server.
58
+ internal.runStartedAt = Date.now() + 1_000;
59
+ expect(internal.getHookFollowUpMessages()).toBeNull();
60
+ expect(internal.processGateInjected).toBe(0);
61
+ });
62
+ it("stops gating after the per-run injection cap so a turn can never wedge", async () => {
63
+ const { internal } = makeSession();
64
+ const manager = trackedManager();
65
+ internal.processManager = manager;
66
+ internal.runStartedAt = Date.now();
67
+ await manager.start("sleep 30", process.cwd());
68
+ expect(internal.getHookFollowUpMessages()).not.toBeNull();
69
+ expect(internal.getHookFollowUpMessages()).not.toBeNull();
70
+ expect(internal.getHookFollowUpMessages()).toBeNull();
71
+ expect(internal.processGateInjected).toBe(2);
72
+ });
73
+ it("yields to the child-agent gate first", async () => {
74
+ const { internal } = makeSession();
75
+ const manager = trackedManager();
76
+ internal.processManager = manager;
77
+ internal.runStartedAt = Date.now();
78
+ internal.subAgentManager = {
79
+ completionGateMessage: () => "Collect child agent recovered-child before finishing.",
80
+ };
81
+ await manager.start("sleep 30", process.cwd());
82
+ expect(internal.getHookFollowUpMessages()).toEqual([
83
+ { role: "user", content: "Collect child agent recovered-child before finishing." },
84
+ ]);
85
+ expect(internal.processGateInjected).toBe(0);
86
+ });
87
+ });
88
+ //# sourceMappingURL=agent-session-process-gate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session-process-gate.test.js","sourceRoot":"","sources":["../../src/core/agent-session-process-gate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-session-slash-restore.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session-slash-restore.test.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-slash-restore.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,121 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { restoreUserRow, resolveRestoredCommand } from "./session-history.js";
6
+ import { useFakeHome } from "../test-support/fake-home.js";
7
+ const agentLoopMock = vi.hoisted(() => vi.fn());
8
+ vi.mock("@kenkaiiii/gg-agent", async () => {
9
+ const actual = await vi.importActual("@kenkaiiii/gg-agent");
10
+ return { ...actual, agentLoop: agentLoopMock };
11
+ });
12
+ vi.mock("./mcp/index.js", async () => {
13
+ const actual = await vi.importActual("./mcp/index.js");
14
+ return {
15
+ ...actual,
16
+ MCPClientManager: vi.fn(function MCPClientManagerMock() {
17
+ return { connectAll: vi.fn(async () => []), dispose: vi.fn(async () => { }) };
18
+ }),
19
+ };
20
+ });
21
+ let restoreHome;
22
+ let tmpHome;
23
+ let tmpProject;
24
+ beforeEach(async () => {
25
+ tmpHome = await fs.mkdtemp(path.join(os.tmpdir(), "slash-restore-home-"));
26
+ tmpProject = await fs.mkdtemp(path.join(os.tmpdir(), "slash-restore-project-"));
27
+ restoreHome = useFakeHome(tmpHome);
28
+ agentLoopMock.mockReset().mockImplementation(async function* (messages) {
29
+ messages.push({ role: "assistant", content: "done" });
30
+ yield { type: "agent_done" };
31
+ });
32
+ await fs.mkdir(path.join(tmpHome, ".gg"), { recursive: true });
33
+ await fs.writeFile(path.join(tmpHome, ".gg", "auth.json"), JSON.stringify({
34
+ anthropic: {
35
+ accessToken: "test-access",
36
+ refreshToken: "test-refresh",
37
+ expiresAt: Date.now() + 3_600_000,
38
+ },
39
+ }), "utf-8");
40
+ });
41
+ afterEach(async () => {
42
+ restoreHome?.();
43
+ await fs.rm(tmpHome, { recursive: true, force: true });
44
+ await fs.rm(tmpProject, { recursive: true, force: true });
45
+ vi.clearAllMocks();
46
+ });
47
+ async function writeCustomCommand(name, body) {
48
+ const dir = path.join(tmpProject, ".gg", "commands");
49
+ await fs.mkdir(dir, { recursive: true });
50
+ await fs.writeFile(path.join(dir, `${name}.md`), body, "utf-8");
51
+ }
52
+ describe("slash-command restore", () => {
53
+ it("expands a custom command to its template and reports it as expanding", async () => {
54
+ const { AgentSession } = await import("./agent-session.js");
55
+ await writeCustomCommand("shipit", "Ship the release now.");
56
+ const session = new AgentSession({
57
+ provider: "anthropic",
58
+ model: "claude-test",
59
+ cwd: tmpProject,
60
+ systemPrompt: "sys",
61
+ });
62
+ await session.initialize();
63
+ expect(await session.willExpandPromptTemplate("/shipit")).toBe(true);
64
+ // Not a command at all, and a command with no template body.
65
+ expect(await session.willExpandPromptTemplate("just a message")).toBe(false);
66
+ expect(await session.willExpandPromptTemplate("/nope-not-real")).toBe(false);
67
+ await session.prompt("/shipit patch only");
68
+ const users = session.getMessages().filter((m) => m.role === "user");
69
+ expect(users).toHaveLength(1);
70
+ // The MODEL sees the expanded template...
71
+ const body = users[0].content;
72
+ expect(body).toContain("Ship the release now.");
73
+ expect(body).toContain("patch only");
74
+ // ...and the restored row recovers the `/name args` chip from that body.
75
+ const restored = restoreUserRow(users[0].content);
76
+ const candidates = [{ name: "shipit", prompt: "Ship the release now." }];
77
+ expect(resolveRestoredCommand(null, restored.text, candidates)).toBe("/shipit patch only");
78
+ await session.dispose();
79
+ }, 20_000);
80
+ it("still executes registry slash commands without persisting a user message", async () => {
81
+ const { AgentSession } = await import("./agent-session.js");
82
+ const session = new AgentSession({
83
+ provider: "anthropic",
84
+ model: "claude-test",
85
+ cwd: tmpProject,
86
+ systemPrompt: "sys",
87
+ });
88
+ await session.initialize();
89
+ // A registry command (no prompt template) must not expand, must not become
90
+ // a user message, and must not start an agent run.
91
+ expect(await session.willExpandPromptTemplate("/help")).toBe(false);
92
+ await session.prompt("/help");
93
+ expect(session.getMessages().filter((m) => m.role === "user")).toHaveLength(0);
94
+ expect(agentLoopMock).not.toHaveBeenCalled();
95
+ await session.dispose();
96
+ }, 20_000);
97
+ // The reported bug: after a template is edited, body matching can no longer
98
+ // recover `/name`, so the reopened session dumped the raw template.
99
+ it("restores the chip from the recorded invocation after the template changes", async () => {
100
+ const { AgentSession } = await import("./agent-session.js");
101
+ await writeCustomCommand("shipit", "Ship the release now.");
102
+ const session = new AgentSession({
103
+ provider: "anthropic",
104
+ model: "claude-test",
105
+ cwd: tmpProject,
106
+ systemPrompt: "sys",
107
+ });
108
+ await session.initialize();
109
+ await session.prompt("/shipit");
110
+ // The command file is edited after the fact.
111
+ await writeCustomCommand("shipit", "Ship the release, but carefully this time.");
112
+ const drifted = [{ name: "shipit", prompt: "Ship the release, but carefully this time." }];
113
+ const restored = restoreUserRow(session.getMessages().filter((m) => m.role === "user")[0].content);
114
+ // Body matching alone now fails — this is what rendered the raw body.
115
+ expect(resolveRestoredCommand(null, restored.text, drifted)).toBeNull();
116
+ // The invocation persisted at send time still restores the chip.
117
+ expect(resolveRestoredCommand("/shipit", restored.text, drifted)).toBe("/shipit");
118
+ await session.dispose();
119
+ }, 20_000);
120
+ });
121
+ //# sourceMappingURL=agent-session-slash-restore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session-slash-restore.test.js","sourceRoot":"","sources":["../../src/core/agent-session-slash-restore.test.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { EventBus } from "./event-bus.js";
4
4
  import { SlashCommandRegistry } from "./slash-commands.js";
5
5
  import { type BranchInfo, type KenTurnPayload, type AutopilotMarkerPayload, type AppMarkerPayload, type TurnMetricPayload } from "./session-manager.js";
6
6
  import type { BackgroundProcess } from "./process-manager.js";
7
+ import { type ImportForeignTranscriptResult } from "./foreign-session-import.js";
7
8
  import { type EnhanceResult } from "../utils/prompt-enhancer.js";
8
9
  /** A chat attachment (image / video / other file) prepared for the model. The
9
10
  * raw base64 `data` rides native blocks; `path` (when persisted to disk) lets
@@ -189,6 +190,10 @@ export declare class AgentSession {
189
190
  /** 0 = none; 1 = first nudge sent; 2 = final stop-and-report injected. */
190
191
  private loopBreakInjected;
191
192
  private regroundingInjected;
193
+ /** Wall-clock start of the current run; scopes the background-process gate. */
194
+ private runStartedAt;
195
+ /** Gate injections spent this run, capped by MAX_PROCESS_GATE_INJECTIONS. */
196
+ private processGateInjected;
192
197
  private compactionOccurred;
193
198
  private lastCompactionCompacted;
194
199
  private compactionRetryAfter;
@@ -211,6 +216,11 @@ export declare class AgentSession {
211
216
  private mcpManager?;
212
217
  /** Deferred MCP tools awaiting discovery via tool_search (bench A win). */
213
218
  private mcpCatalog?;
219
+ /** Live (connected) MCP tools by name — the reconcile target for cached stubs. */
220
+ private liveMcpTools;
221
+ /** Server name for each cached-only tool, so a stub knows what to wait on. */
222
+ private cachedMcpToolServers;
223
+ private readonly mcpCatalogCache;
214
224
  private provider;
215
225
  private model;
216
226
  private cwd;
@@ -299,6 +309,42 @@ export declare class AgentSession {
299
309
  * re-reads every turn, so promoted tools are callable on the next step.
300
310
  */
301
311
  private addMcpTools;
312
+ /**
313
+ * Register `tool_search` once. Promotion of a cached-only entry waits for its
314
+ * server so the model is told immediately when that capability turns out to
315
+ * be unreachable, instead of promoting a tool that fails on first call.
316
+ */
317
+ private ensureToolSearchTool;
318
+ /** Append tools, replacing any same-named entry (cached stub → live tool). */
319
+ private replaceOrPushTools;
320
+ /** Swap already-promoted cached stubs for their live equivalents, in place. */
321
+ private replaceLivePromotedTools;
322
+ /**
323
+ * Publish cached tool definitions into the deferred catalog so `tool_search`
324
+ * answers correctly on turn 1. A cached stub carries the real name, one-line
325
+ * description and input schema; calling it waits for the live connection and
326
+ * then dispatches against the real client, or returns a clear error when that
327
+ * server ultimately failed. Live tools replace stubs on connect.
328
+ */
329
+ private seedMcpCatalogFromCache;
330
+ /** Catalog-only registration for cached stubs — never marks them live. */
331
+ private addCachedMcpTools;
332
+ private buildCachedMcpTool;
333
+ /**
334
+ * Resolve a `/name [args]` input to the prompt template it expands into, or
335
+ * null when it isn't a prompt-template command for THIS session (an ordinary
336
+ * message, a registry/action command, or any slash input on a non-coder
337
+ * agent). Shared by {@link prompt} and {@link willExpandPromptTemplate} so
338
+ * callers can't drift from the expansion that actually happens.
339
+ */
340
+ private resolveSlashInput;
341
+ /**
342
+ * Whether {@link prompt} would expand this input into a template body and
343
+ * persist it as a user message. Hosts use it to record the typed `/name` for
344
+ * transcript restore — gating on anything looser risks tagging an unrelated
345
+ * message when the command turns out NOT to expand.
346
+ */
347
+ willExpandPromptTemplate(content: string): Promise<boolean>;
302
348
  /**
303
349
  * Process user input. Handles slash commands or runs agent loop.
304
350
  */
@@ -505,6 +551,17 @@ export declare class AgentSession {
505
551
  * Used by the host to interleave the auto-review loop's markers back into
506
552
  * the transcript on resume, mirroring `getKenTurns`. */
507
553
  getAutopilotMarkers(): AutopilotMarkerPayload[];
554
+ /** Non-system messages that are actually on disk. Transcript markers anchor
555
+ * against this (not the in-memory list, which can run ahead after a failed
556
+ * run), so hosts computing marker-derived values must use the same base. */
557
+ getPersistedTranscriptCount(): number;
558
+ /**
559
+ * Rebase every transcript anchor (Ken turns, autopilot verdicts, app markers)
560
+ * onto a freshly compacted message list. Called right after `this.messages`
561
+ * is replaced and before the markers are re-persisted into the continuation
562
+ * file, so the new file carries positions that match its own transcript.
563
+ */
564
+ private remapMarkerAnchors;
508
565
  /**
509
566
  * Record one Ken Kai (mentor agent) turn against this build session: the
510
567
  * user's question + Ken's reply. Kept in memory for the live transcript and
@@ -592,5 +649,14 @@ export declare class AgentSession {
592
649
  private prepareDynamicContext;
593
650
  private persistMessage;
594
651
  private createSlashCommandContext;
652
+ /**
653
+ * Import a Claude Code / Codex / Cursor transcript as a resumable GG Coder
654
+ * session in this session's sessions directory. Never throws — a bad path or
655
+ * an unrecognized format comes back as `{ ok: false, error }` so both the CLI
656
+ * and the desktop app can show it verbatim.
657
+ */
658
+ importForeignTranscript(filePath: string, opts?: {
659
+ cwd?: string;
660
+ }): Promise<ImportForeignTranscriptResult>;
595
661
  }
596
662
  //# sourceMappingURL=agent-session.d.ts.map