@kenkaiiii/ggcoder 5.26.3 → 5.28.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 (91) hide show
  1. package/dist/app-sidecar-sessions.d.ts +7 -2
  2. package/dist/app-sidecar-sessions.d.ts.map +1 -1
  3. package/dist/app-sidecar-sessions.js +36 -8
  4. package/dist/app-sidecar-sessions.js.map +1 -1
  5. package/dist/app-sidecar-sessions.test.js +88 -0
  6. package/dist/app-sidecar-sessions.test.js.map +1 -1
  7. package/dist/app-sidecar.js +27 -0
  8. package/dist/app-sidecar.js.map +1 -1
  9. package/dist/core/agent-session-process-gate.test.d.ts +2 -0
  10. package/dist/core/agent-session-process-gate.test.d.ts.map +1 -0
  11. package/dist/core/agent-session-process-gate.test.js +88 -0
  12. package/dist/core/agent-session-process-gate.test.js.map +1 -0
  13. package/dist/core/agent-session.d.ts +40 -0
  14. package/dist/core/agent-session.d.ts.map +1 -1
  15. package/dist/core/agent-session.js +204 -6
  16. package/dist/core/agent-session.js.map +1 -1
  17. package/dist/core/foreign-session-import.d.ts +120 -0
  18. package/dist/core/foreign-session-import.d.ts.map +1 -0
  19. package/dist/core/foreign-session-import.js +594 -0
  20. package/dist/core/foreign-session-import.js.map +1 -0
  21. package/dist/core/foreign-session-import.test.d.ts +2 -0
  22. package/dist/core/foreign-session-import.test.d.ts.map +1 -0
  23. package/dist/core/foreign-session-import.test.js +220 -0
  24. package/dist/core/foreign-session-import.test.js.map +1 -0
  25. package/dist/core/foreign-transcript-blocks.d.ts +51 -0
  26. package/dist/core/foreign-transcript-blocks.d.ts.map +1 -0
  27. package/dist/core/foreign-transcript-blocks.js +151 -0
  28. package/dist/core/foreign-transcript-blocks.js.map +1 -0
  29. package/dist/core/mcp/catalog-cache.d.ts +63 -0
  30. package/dist/core/mcp/catalog-cache.d.ts.map +1 -0
  31. package/dist/core/mcp/catalog-cache.js +163 -0
  32. package/dist/core/mcp/catalog-cache.js.map +1 -0
  33. package/dist/core/mcp/catalog-cache.test.d.ts +2 -0
  34. package/dist/core/mcp/catalog-cache.test.d.ts.map +1 -0
  35. package/dist/core/mcp/catalog-cache.test.js +99 -0
  36. package/dist/core/mcp/catalog-cache.test.js.map +1 -0
  37. package/dist/core/mcp/client.d.ts +61 -0
  38. package/dist/core/mcp/client.d.ts.map +1 -1
  39. package/dist/core/mcp/client.js +216 -31
  40. package/dist/core/mcp/client.js.map +1 -1
  41. package/dist/core/mcp/legacy-negotiation.test.d.ts +2 -0
  42. package/dist/core/mcp/legacy-negotiation.test.d.ts.map +1 -0
  43. package/dist/core/mcp/legacy-negotiation.test.js +80 -0
  44. package/dist/core/mcp/legacy-negotiation.test.js.map +1 -0
  45. package/dist/core/mcp/oauth-provider.d.ts +1 -2
  46. package/dist/core/mcp/oauth-provider.d.ts.map +1 -1
  47. package/dist/core/mcp/oauth-provider.js +5 -1
  48. package/dist/core/mcp/oauth-provider.js.map +1 -1
  49. package/dist/core/mcp/oauth-store.d.ts +1 -1
  50. package/dist/core/mcp/oauth-store.d.ts.map +1 -1
  51. package/dist/core/mcp/oauth-store.js.map +1 -1
  52. package/dist/core/mcp/when-connected.test.d.ts +2 -0
  53. package/dist/core/mcp/when-connected.test.d.ts.map +1 -0
  54. package/dist/core/mcp/when-connected.test.js +46 -0
  55. package/dist/core/mcp/when-connected.test.js.map +1 -0
  56. package/dist/core/process-gate.d.ts +45 -0
  57. package/dist/core/process-gate.d.ts.map +1 -0
  58. package/dist/core/process-gate.js +71 -0
  59. package/dist/core/process-gate.js.map +1 -0
  60. package/dist/core/process-gate.test.d.ts +2 -0
  61. package/dist/core/process-gate.test.d.ts.map +1 -0
  62. package/dist/core/process-gate.test.js +87 -0
  63. package/dist/core/process-gate.test.js.map +1 -0
  64. package/dist/core/process-manager.d.ts +9 -0
  65. package/dist/core/process-manager.d.ts.map +1 -1
  66. package/dist/core/process-manager.js +17 -15
  67. package/dist/core/process-manager.js.map +1 -1
  68. package/dist/core/project-discovery.d.ts +19 -0
  69. package/dist/core/project-discovery.d.ts.map +1 -1
  70. package/dist/core/project-discovery.js +100 -0
  71. package/dist/core/project-discovery.js.map +1 -1
  72. package/dist/core/session-manager.d.ts +5 -1
  73. package/dist/core/session-manager.d.ts.map +1 -1
  74. package/dist/core/session-manager.js +2 -1
  75. package/dist/core/session-manager.js.map +1 -1
  76. package/dist/core/settings-manager.d.ts +1 -0
  77. package/dist/core/settings-manager.d.ts.map +1 -1
  78. package/dist/core/settings-manager.js +6 -0
  79. package/dist/core/settings-manager.js.map +1 -1
  80. package/dist/tools/tool-search.d.ts +12 -1
  81. package/dist/tools/tool-search.d.ts.map +1 -1
  82. package/dist/tools/tool-search.js +22 -3
  83. package/dist/tools/tool-search.js.map +1 -1
  84. package/dist/tools/tool-search.test.d.ts +2 -0
  85. package/dist/tools/tool-search.test.d.ts.map +1 -0
  86. package/dist/tools/tool-search.test.js +69 -0
  87. package/dist/tools/tool-search.test.js.map +1 -0
  88. package/dist/ui/App.d.ts.map +1 -1
  89. package/dist/ui/App.js +27 -1
  90. package/dist/ui/App.js.map +1 -1
  91. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-store.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/oauth-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,0BAA0B,EAC1B,WAAW,EACZ,MAAM,0CAA0C,CAAC;AAGlD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;IAC/C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD;;;;;;GAMG;AACH,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,GAAE,MAAkC;YAE3D,OAAO;YAUP,QAAQ;IAahB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAK/C,0EAA0E;IACpE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvE,qEAAqE;IAC/D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,qFAAqF;IAC/E,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAIhD"}
1
+ {"version":3,"file":"oauth-store.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/oauth-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAG5F;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;IAC/C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD;;;;;;GAMG;AACH,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,GAAE,MAAkC;YAE3D,OAAO;YAUP,QAAQ;IAahB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAK/C,0EAA0E;IACpE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvE,qEAAqE;IAC/D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,qFAAqF;IAC/E,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAIhD"}
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-store.js","sourceRoot":"","sources":["../../../src/core/mcp/oauth-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKjD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAyBnC;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,WAAmB,WAAW,EAAE,CAAC,WAAW;QAA5C,aAAQ,GAAR,QAAQ,CAAoC;IAAG,CAAC;IAErE,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAAiB;QACtC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;gBAC/D,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,mCAAmC,EAAE;gBACtD,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aAC1D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,KAA6B;QACrD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;QAC/D,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,qFAAqF;IACrF,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC;IACtC,CAAC;CACF"}
1
+ {"version":3,"file":"oauth-store.js","sourceRoot":"","sources":["../../../src/core/mcp/oauth-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAyBnC;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,WAAmB,WAAW,EAAE,CAAC,WAAW;QAA5C,aAAQ,GAAR,QAAQ,CAAoC;IAAG,CAAC;IAErE,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAAiB;QACtC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;gBAC/D,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,mCAAmC,EAAE;gBACtD,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aAC1D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,KAA6B;QACrD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;QAC/D,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,qFAAqF;IACrF,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=when-connected.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when-connected.test.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/when-connected.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
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 } from "vitest";
5
+ import { MCPClientManager } from "./client.js";
6
+ import { McpCatalogCache } from "./catalog-cache.js";
7
+ let dir;
8
+ let manager;
9
+ beforeEach(async () => {
10
+ dir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-mcp-when-connected-"));
11
+ manager = new MCPClientManager({
12
+ catalogCache: new McpCatalogCache(path.join(dir, "mcp-catalog.json")),
13
+ });
14
+ });
15
+ afterEach(async () => {
16
+ await manager.dispose();
17
+ await fs.rm(dir, { recursive: true, force: true });
18
+ });
19
+ /** A stdio command that cannot possibly start, so the connect fails fast. */
20
+ const BROKEN = {
21
+ name: "broken",
22
+ command: "gg-nonexistent-mcp-binary",
23
+ args: [],
24
+ timeout: 2_000,
25
+ };
26
+ describe("MCPClientManager.whenConnected", () => {
27
+ it("reports the failure reason instead of hanging when a server cannot connect", async () => {
28
+ const waiter = manager.whenConnected("broken", 20_000);
29
+ await manager.connectAllDetailed([BROKEN]);
30
+ const outcome = await waiter;
31
+ expect(outcome.ok).toBe(false);
32
+ expect(outcome.ok === false && outcome.error.length > 0).toBe(true);
33
+ }, 30_000);
34
+ it("settles for a caller that arrives after the connect attempt finished", async () => {
35
+ await manager.connectAllDetailed([BROKEN]);
36
+ const outcome = await manager.whenConnected("broken", 20_000);
37
+ expect(outcome.ok).toBe(false);
38
+ }, 30_000);
39
+ it("times out rather than waiting forever for a server nobody ever connects", async () => {
40
+ const started = Date.now();
41
+ const outcome = await manager.whenConnected("never-attempted", 150);
42
+ expect(outcome).toEqual({ ok: false, error: "timed out after 150ms" });
43
+ expect(Date.now() - started).toBeLessThan(5_000);
44
+ });
45
+ });
46
+ //# sourceMappingURL=when-connected.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when-connected.test.js","sourceRoot":"","sources":["../../../src/core/mcp/when-connected.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { Message } from "@kenkaiiii/gg-ai";
2
+ import type { BackgroundProcess } from "./process-manager.js";
3
+ /**
4
+ * Pre-stop gate for background processes.
5
+ *
6
+ * `ProcessManager` pushes progress and exit checkpoints into the *steering*
7
+ * path, which only lands while the agent is still looping. An agent about to
8
+ * stop never sees them, so a run can claim "done" with a test run still in
9
+ * flight, or with a build that already exited non-zero and was never read.
10
+ *
11
+ * This module is the process-side twin of `SubAgentManager.completionGateMessage`
12
+ * and is deliberately pure so both hosts (AgentSession and the Ink app) wire it
13
+ * identically.
14
+ */
15
+ /**
16
+ * Hard bound on gate injections per run. A wedged gate that never lets the turn
17
+ * finish is worse than a premature "done", so after this many nudges the gate
18
+ * goes silent.
19
+ */
20
+ export declare const MAX_PROCESS_GATE_INJECTIONS = 2;
21
+ /** The subset of `BackgroundProcess` the gate reasons about. */
22
+ export type GateableProcess = Pick<BackgroundProcess, "id" | "command" | "startedAt" | "exitCode" | "lastReadOffset" | "logSize">;
23
+ /**
24
+ * A process blocks completion only when all three hold:
25
+ *
26
+ * 1. it started during the current run — a dev server the user deliberately
27
+ * left running from an earlier turn must never deadlock the agent;
28
+ * 2. it is unresolved: still running, or exited non-zero;
29
+ * 3. its output was never consumed in that state — nothing read at all for a
30
+ * running process, or unread bytes remaining for an exited one.
31
+ */
32
+ export declare function isUnresolvedProcess(proc: GateableProcess, runStartedAt: number): boolean;
33
+ /** Unresolved processes in stable start order, so the message is deterministic. */
34
+ export declare function selectUnresolvedProcesses(procs: readonly GateableProcess[], runStartedAt: number): GateableProcess[];
35
+ /**
36
+ * The gate text, or undefined when nothing blocks completion. Wording mirrors
37
+ * the child-agent gate so the model reads one contract for both.
38
+ */
39
+ export declare function buildProcessCompletionGateMessage(procs: readonly GateableProcess[], runStartedAt: number): string | undefined;
40
+ /**
41
+ * Shared pre-finalization hook used by both AgentSession and the Ink host.
42
+ * Returns null once `injected` reaches `MAX_PROCESS_GATE_INJECTIONS`.
43
+ */
44
+ export declare function buildProcessCompletionFollowUp(procs: readonly GateableProcess[], runStartedAt: number, injected: number): Message[] | null;
45
+ //# sourceMappingURL=process-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-gate.d.ts","sourceRoot":"","sources":["../../src/core/process-gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,gEAAgE;AAChE,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,iBAAiB,EACjB,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAC3E,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAKxF;AAED,mFAAmF;AACnF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CAInB;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,SAAS,CAgBpB;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,EAAE,GAAG,IAAI,CAIlB"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Pre-stop gate for background processes.
3
+ *
4
+ * `ProcessManager` pushes progress and exit checkpoints into the *steering*
5
+ * path, which only lands while the agent is still looping. An agent about to
6
+ * stop never sees them, so a run can claim "done" with a test run still in
7
+ * flight, or with a build that already exited non-zero and was never read.
8
+ *
9
+ * This module is the process-side twin of `SubAgentManager.completionGateMessage`
10
+ * and is deliberately pure so both hosts (AgentSession and the Ink app) wire it
11
+ * identically.
12
+ */
13
+ /**
14
+ * Hard bound on gate injections per run. A wedged gate that never lets the turn
15
+ * finish is worse than a premature "done", so after this many nudges the gate
16
+ * goes silent.
17
+ */
18
+ export const MAX_PROCESS_GATE_INJECTIONS = 2;
19
+ /**
20
+ * A process blocks completion only when all three hold:
21
+ *
22
+ * 1. it started during the current run — a dev server the user deliberately
23
+ * left running from an earlier turn must never deadlock the agent;
24
+ * 2. it is unresolved: still running, or exited non-zero;
25
+ * 3. its output was never consumed in that state — nothing read at all for a
26
+ * running process, or unread bytes remaining for an exited one.
27
+ */
28
+ export function isUnresolvedProcess(proc, runStartedAt) {
29
+ if (proc.startedAt < runStartedAt)
30
+ return false;
31
+ const running = proc.exitCode === null;
32
+ if (!running && proc.exitCode === 0)
33
+ return false;
34
+ return running ? proc.lastReadOffset === 0 : proc.lastReadOffset < proc.logSize;
35
+ }
36
+ /** Unresolved processes in stable start order, so the message is deterministic. */
37
+ export function selectUnresolvedProcesses(procs, runStartedAt) {
38
+ return procs
39
+ .filter((proc) => isUnresolvedProcess(proc, runStartedAt))
40
+ .sort((a, b) => a.startedAt - b.startedAt || a.id.localeCompare(b.id));
41
+ }
42
+ /**
43
+ * The gate text, or undefined when nothing blocks completion. Wording mirrors
44
+ * the child-agent gate so the model reads one contract for both.
45
+ */
46
+ export function buildProcessCompletionGateMessage(procs, runStartedAt) {
47
+ const unresolved = selectUnresolvedProcesses(procs, runStartedAt);
48
+ if (unresolved.length === 0)
49
+ return undefined;
50
+ const running = unresolved.filter((proc) => proc.exitCode === null);
51
+ const failed = unresolved.filter((proc) => proc.exitCode !== null);
52
+ const describe = (proc) => `- ${proc.id} (${proc.command})${proc.exitCode === null ? "" : ` — exited with code ${proc.exitCode}`}`;
53
+ return [
54
+ "Background-process completion gate: you cannot finish with unread background work from this run.",
55
+ ...(running.length > 0 ? ["Still running, output never read:", ...running.map(describe)] : []),
56
+ ...(failed.length > 0 ? ["Exited non-zero, output never read:", ...failed.map(describe)] : []),
57
+ `Call task_output on each of [${unresolved.map((proc) => `"${proc.id}"`).join(", ")}] and act on what it says.`,
58
+ "If a process is meant to keep running (a dev server, a watcher), call task_stop on it or state plainly that you are leaving it running.",
59
+ ].join("\n");
60
+ }
61
+ /**
62
+ * Shared pre-finalization hook used by both AgentSession and the Ink host.
63
+ * Returns null once `injected` reaches `MAX_PROCESS_GATE_INJECTIONS`.
64
+ */
65
+ export function buildProcessCompletionFollowUp(procs, runStartedAt, injected) {
66
+ if (injected >= MAX_PROCESS_GATE_INJECTIONS)
67
+ return null;
68
+ const message = buildProcessCompletionGateMessage(procs, runStartedAt);
69
+ return message ? [{ role: "user", content: message }] : null;
70
+ }
71
+ //# sourceMappingURL=process-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-gate.js","sourceRoot":"","sources":["../../src/core/process-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=process-gate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-gate.test.d.ts","sourceRoot":"","sources":["../../src/core/process-gate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,87 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { buildProcessCompletionFollowUp, buildProcessCompletionGateMessage, isUnresolvedProcess, MAX_PROCESS_GATE_INJECTIONS, selectUnresolvedProcesses, } from "./process-gate.js";
3
+ const RUN_START = 1_000;
4
+ function proc(overrides = {}) {
5
+ return {
6
+ id: "aaaa1111",
7
+ command: "pnpm test",
8
+ startedAt: RUN_START + 10,
9
+ exitCode: null,
10
+ lastReadOffset: 0,
11
+ logSize: 0,
12
+ ...overrides,
13
+ };
14
+ }
15
+ describe("isUnresolvedProcess", () => {
16
+ test("gates a running process from this run whose output was never read", () => {
17
+ expect(isUnresolvedProcess(proc(), RUN_START)).toBe(true);
18
+ });
19
+ test("exempts a process started before the run (long-lived dev server)", () => {
20
+ expect(isUnresolvedProcess(proc({ startedAt: RUN_START - 1 }), RUN_START)).toBe(false);
21
+ });
22
+ test("exempts a running process whose output was already read", () => {
23
+ expect(isUnresolvedProcess(proc({ lastReadOffset: 42, logSize: 42 }), RUN_START)).toBe(false);
24
+ });
25
+ test("exempts a clean exit", () => {
26
+ expect(isUnresolvedProcess(proc({ exitCode: 0, logSize: 900 }), RUN_START)).toBe(false);
27
+ });
28
+ test("gates a non-zero exit with unread bytes", () => {
29
+ expect(isUnresolvedProcess(proc({ exitCode: 1, logSize: 900, lastReadOffset: 100 }), RUN_START)).toBe(true);
30
+ });
31
+ test("exempts a non-zero exit whose log was fully read", () => {
32
+ expect(isUnresolvedProcess(proc({ exitCode: 1, logSize: 900, lastReadOffset: 900 }), RUN_START)).toBe(false);
33
+ });
34
+ test("treats a process started exactly at run start as in-run", () => {
35
+ expect(isUnresolvedProcess(proc({ startedAt: RUN_START }), RUN_START)).toBe(true);
36
+ });
37
+ });
38
+ describe("selectUnresolvedProcesses", () => {
39
+ test("orders by start time then id", () => {
40
+ const selected = selectUnresolvedProcesses([
41
+ proc({ id: "cccc", startedAt: RUN_START + 30 }),
42
+ proc({ id: "bbbb", startedAt: RUN_START + 10 }),
43
+ proc({ id: "aaaa", startedAt: RUN_START + 10 }),
44
+ proc({ id: "dddd", startedAt: RUN_START - 5 }),
45
+ ], RUN_START);
46
+ expect(selected.map((p) => p.id)).toEqual(["aaaa", "bbbb", "cccc"]);
47
+ });
48
+ });
49
+ describe("buildProcessCompletionGateMessage", () => {
50
+ test("returns undefined when nothing is unresolved", () => {
51
+ expect(buildProcessCompletionGateMessage([], RUN_START)).toBeUndefined();
52
+ expect(buildProcessCompletionGateMessage([proc({ exitCode: 0, logSize: 10 })], RUN_START)).toBeUndefined();
53
+ });
54
+ test("names running and failed processes separately and instructs task_output", () => {
55
+ const message = buildProcessCompletionGateMessage([
56
+ proc({ id: "run1", command: "pnpm dev" }),
57
+ proc({ id: "fail1", command: "pnpm build", exitCode: 2, logSize: 500 }),
58
+ ], RUN_START);
59
+ expect(message).toContain("run1 (pnpm dev)");
60
+ expect(message).toContain("fail1 (pnpm build)");
61
+ expect(message).toContain("exited with code 2");
62
+ expect(message).toContain("task_output");
63
+ expect(message).toContain("task_stop");
64
+ });
65
+ test("omits the failed section when everything is still running", () => {
66
+ const message = buildProcessCompletionGateMessage([proc()], RUN_START);
67
+ expect(message).toContain("Still running");
68
+ expect(message).not.toContain("Exited non-zero");
69
+ });
70
+ });
71
+ describe("buildProcessCompletionFollowUp", () => {
72
+ test("wraps the gate text in a user message", () => {
73
+ const followUp = buildProcessCompletionFollowUp([proc()], RUN_START, 0);
74
+ expect(followUp).toHaveLength(1);
75
+ expect(followUp?.[0]?.role).toBe("user");
76
+ expect(followUp?.[0]?.content).toContain("aaaa1111");
77
+ });
78
+ test("returns null once the per-run injection cap is reached", () => {
79
+ expect(buildProcessCompletionFollowUp([proc()], RUN_START, MAX_PROCESS_GATE_INJECTIONS - 1)).not.toBeNull();
80
+ expect(buildProcessCompletionFollowUp([proc()], RUN_START, MAX_PROCESS_GATE_INJECTIONS)).toBeNull();
81
+ expect(buildProcessCompletionFollowUp([proc()], RUN_START, MAX_PROCESS_GATE_INJECTIONS + 1)).toBeNull();
82
+ });
83
+ test("returns null when no process blocks completion", () => {
84
+ expect(buildProcessCompletionFollowUp([], RUN_START, 0)).toBeNull();
85
+ });
86
+ });
87
+ //# sourceMappingURL=process-gate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-gate.test.js","sourceRoot":"","sources":["../../src/core/process-gate.test.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,13 @@ export interface BackgroundProcess {
8
8
  startedAt: number;
9
9
  exitCode: number | null;
10
10
  lastReadOffset: number;
11
+ /**
12
+ * Last known size of `logFile` in bytes. Kept current by the progress
13
+ * watcher, the exit handler and every `readOutput`, so consumers (notably
14
+ * the pre-stop process gate) can tell "output was never consumed" from
15
+ * "output was read" without an fs stat per check.
16
+ */
17
+ logSize: number;
11
18
  }
12
19
  export interface StartResult {
13
20
  id: string;
@@ -52,6 +59,8 @@ export declare class ProcessManager {
52
59
  * notifications pay nothing.
53
60
  */
54
61
  private armWatcher;
62
+ /** Stat the log once and cache its size on the record. Returns 0 if unreadable. */
63
+ private refreshLogSize;
55
64
  private emitProgress;
56
65
  private notifyExit;
57
66
  /** Read the trailing bytes of a log without loading the whole file. */
@@ -1 +1 @@
1
- {"version":3,"file":"process-manager.d.ts","sourceRoot":"","sources":["../../src/core/process-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAUpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAsBD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,sBAAsB,CAAC;CACxC;AAWD,qBAAa,cAAc;IAQb,OAAO,CAAC,QAAQ,CAAC,GAAG;IAPhC,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,QAAQ,CAAmC;IACnD,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAqD;IACrE,+EAA+E;IAC/E,OAAO,CAAC,YAAY,CAA6B;gBAEpB,GAAG,GAAE,iBAAsB;IAElD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAqD/D;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;YAkBJ,YAAY;IAwB1B,OAAO,CAAC,UAAU;IAuBlB,uEAAuE;YACzD,QAAQ;IAgBtB,8EAA8E;IAC9E,OAAO,CAAC,cAAc;IAOtB,8DAA8D;IAC9D,cAAc,IAAI,MAAM,EAAE;IAIpB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgC5E;;;;;OAKG;IACG,SAAS,CACb,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAO,GAC5C,OAAO,CAAC,MAAM,CAAC;IAoCZ,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8CvC,IAAI,IAAI,iBAAiB,EAAE;IAY3B,WAAW,IAAI,IAAI;CAUpB"}
1
+ {"version":3,"file":"process-manager.d.ts","sourceRoot":"","sources":["../../src/core/process-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAUpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAsBD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,sBAAsB,CAAC;CACxC;AAWD,qBAAa,cAAc;IAQb,OAAO,CAAC,QAAQ,CAAC,GAAG;IAPhC,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,QAAQ,CAAmC;IACnD,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAqD;IACrE,+EAA+E;IAC/E,OAAO,CAAC,YAAY,CAA6B;gBAEpB,GAAG,GAAE,iBAAsB;IAElD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAwD/D;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;IAkBlB,mFAAmF;YACrE,cAAc;YASd,YAAY;IAmB1B,OAAO,CAAC,UAAU;IAkBlB,uEAAuE;YACzD,QAAQ;IAgBtB,8EAA8E;IAC9E,OAAO,CAAC,cAAc;IAOtB,8DAA8D;IAC9D,cAAc,IAAI,MAAM,EAAE;IAIpB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiC5E;;;;;OAKG;IACG,SAAS,CACb,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAO,GAC5C,OAAO,CAAC,MAAM,CAAC;IAoCZ,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8CvC,IAAI,IAAI,iBAAiB,EAAE;IAY3B,WAAW,IAAI,IAAI;CAUpB"}
@@ -73,6 +73,7 @@ export class ProcessManager {
73
73
  startedAt: Date.now(),
74
74
  exitCode: null,
75
75
  lastReadOffset: 0,
76
+ logSize: 0,
76
77
  };
77
78
  this.processes.set(id, proc);
78
79
  this.children.set(id, child);
@@ -80,7 +81,9 @@ export class ProcessManager {
80
81
  proc.exitCode = code ?? 1;
81
82
  this.children.delete(id);
82
83
  this.disposeWatcher(id);
83
- this.notifyExit(proc);
84
+ // Refresh unconditionally: the gate needs a final size even when no
85
+ // notification queue is wired and notifyExit is a no-op.
86
+ void this.refreshLogSize(proc).then(() => this.notifyExit(proc));
84
87
  });
85
88
  this.armWatcher(proc);
86
89
  return { id, pid, logFile };
@@ -112,17 +115,21 @@ export class ProcessManager {
112
115
  timer.unref?.();
113
116
  this.watchers.set(proc.id, timer);
114
117
  }
115
- async emitProgress(proc) {
116
- const queue = this.ops.notifications;
117
- if (!queue)
118
- return;
119
- let size;
118
+ /** Stat the log once and cache its size on the record. Returns 0 if unreadable. */
119
+ async refreshLogSize(proc) {
120
120
  try {
121
- size = (await fsp.stat(proc.logFile)).size;
121
+ proc.logSize = (await fsp.stat(proc.logFile)).size;
122
122
  }
123
123
  catch {
124
- return;
124
+ // Log may be gone (pruned, or never created); keep the last known size.
125
125
  }
126
+ return proc.logSize;
127
+ }
128
+ async emitProgress(proc) {
129
+ const queue = this.ops.notifications;
130
+ if (!queue)
131
+ return;
132
+ const size = await this.refreshLogSize(proc);
126
133
  const previous = this.watchedSizes.get(proc.id) ?? 0;
127
134
  if (size <= previous)
128
135
  return;
@@ -139,13 +146,7 @@ export class ProcessManager {
139
146
  if (!queue)
140
147
  return;
141
148
  void (async () => {
142
- let size = 0;
143
- try {
144
- size = (await fsp.stat(proc.logFile)).size;
145
- }
146
- catch {
147
- // Log may already be gone; the exit code is still worth reporting.
148
- }
149
+ const size = proc.logSize;
149
150
  const tail = size > 0 ? await this.readTail(proc.logFile, size) : "";
150
151
  queue.enqueue("process", proc.id, `Background process ${proc.id} (${proc.command}) exited with code ${proc.exitCode} ` +
151
152
  `after ${formatElapsed(Date.now() - proc.startedAt)}` +
@@ -197,6 +198,7 @@ export class ProcessManager {
197
198
  let output = "";
198
199
  try {
199
200
  const stat = await fsp.stat(proc.logFile);
201
+ proc.logSize = stat.size;
200
202
  if (stat.size > offset) {
201
203
  const buf = Buffer.alloc(stat.size - offset);
202
204
  const fh = await fsp.open(proc.logFile, "r");
@@ -1 +1 @@
1
- {"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../../src/core/process-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../../src/core/process-manager.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,12 @@ export interface RecentSession {
34
34
  /** Relative "3h ago" string from last activity. */
35
35
  lastActiveDisplay: string;
36
36
  messageCount: number;
37
+ /**
38
+ * Which store this row came from. Absent means `ggcoder` — a session that is
39
+ * already resumable as-is. A foreign value means `path` points at that tool's
40
+ * own transcript, which the host imports before opening.
41
+ */
42
+ source?: ProjectSource;
37
43
  }
38
44
  /**
39
45
  * List the most recent ggcoder conversations for a project cwd. Compaction
@@ -41,4 +47,17 @@ export interface RecentSession {
41
47
  * is shown. Legacy labels win; otherwise the first real user prompt is used.
42
48
  */
43
49
  export declare function listRecentSessions(cwd: string, limit?: number, sessionsDir?: string): Promise<RecentSession[]>;
50
+ /**
51
+ * List the most recent Claude Code and Codex conversations for a project cwd.
52
+ *
53
+ * The project picker has always surfaced these stores (`discoverProjects`), so a
54
+ * project can appear *because* it has Claude Code history — and then show an
55
+ * empty session list, because that only read GG Coder's own directory. These
56
+ * rows close that gap: each one points at the foreign transcript, tagged with
57
+ * its `source`, and the host imports it on click.
58
+ *
59
+ * Cheap by construction: a transcript is only opened if its cwd matches, and
60
+ * both the per-store file walk and the preview read are line-capped.
61
+ */
62
+ export declare function listForeignSessions(cwd: string, limit?: number, homeDir?: string): Promise<RecentSession[]>;
44
63
  //# sourceMappingURL=project-discovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../src/core/project-discovery.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6BrE;AA2DD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AA+VD,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,EACT,WAAW,SAA4B,GACtC,OAAO,CAAC,aAAa,EAAE,CAAC,CAkB1B"}
1
+ {"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../src/core/project-discovery.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6BrE;AA2DD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AA+VD,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,EACT,WAAW,SAA4B,GACtC,OAAO,CAAC,aAAa,EAAE,CAAC,CAkB1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,EACT,OAAO,SAAe,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC,CAS1B"}
@@ -7,6 +7,7 @@ import { getAppPaths } from "../config.js";
7
7
  import { encodeCwd, stripExtendedLengthPrefix } from "./encode-cwd.js";
8
8
  import { getUserSessionPrompt } from "./session-preview.js";
9
9
  import { isSessionPath, openSessionReadStream, resolveSessionPath } from "./session-storage.js";
10
+ import { parseForeignTranscript } from "./foreign-session-import.js";
10
11
  /**
11
12
  * Scan ggcoder + Claude Code + Codex session stores and return one row per
12
13
  * project, sorted most-recent first. Duplicates (same cwd) are collapsed; the
@@ -483,6 +484,105 @@ export async function listRecentSessions(cwd, limit = 5, sessionsDir = getAppPat
483
484
  }
484
485
  return out;
485
486
  }
487
+ /**
488
+ * List the most recent Claude Code and Codex conversations for a project cwd.
489
+ *
490
+ * The project picker has always surfaced these stores (`discoverProjects`), so a
491
+ * project can appear *because* it has Claude Code history — and then show an
492
+ * empty session list, because that only read GG Coder's own directory. These
493
+ * rows close that gap: each one points at the foreign transcript, tagged with
494
+ * its `source`, and the host imports it on click.
495
+ *
496
+ * Cheap by construction: a transcript is only opened if its cwd matches, and
497
+ * both the per-store file walk and the preview read are line-capped.
498
+ */
499
+ export async function listForeignSessions(cwd, limit = 5, homeDir = os.homedir()) {
500
+ const [claude, codex] = await Promise.all([
501
+ listClaudeSessions(cwd, limit, homeDir),
502
+ listCodexSessions(cwd, limit, homeDir),
503
+ ]);
504
+ return [...claude, ...codex]
505
+ .sort((left, right) => right.lastActiveMs - left.lastActiveMs)
506
+ .slice(0, limit)
507
+ .map(({ lastActiveMs: _lastActiveMs, ...session }) => session);
508
+ }
509
+ async function listClaudeSessions(cwd, limit, homeDir) {
510
+ const projectsDir = path.join(homeDir, ".claude", "projects");
511
+ if (!(await isDirectory(projectsDir)))
512
+ return [];
513
+ // Claude's directory encoding is ambiguous (every "/" becomes "-", colliding
514
+ // with real dashes), so we cannot map cwd → directory. Instead walk the files
515
+ // newest-first and keep the ones whose recorded cwd matches.
516
+ const files = await collectJsonlFiles(projectsDir, 3);
517
+ return collectMatchingForeignSessions(files, cwd, limit, "claude-code", claudeCwdExtractor);
518
+ }
519
+ async function listCodexSessions(cwd, limit, homeDir) {
520
+ const sessionsDir = path.join(homeDir, ".codex", "sessions");
521
+ if (!(await isDirectory(sessionsDir)))
522
+ return [];
523
+ // Layout is YYYY/MM/DD/*.jsonl — depth 4 covers it.
524
+ const files = await collectJsonlFiles(sessionsDir, 4);
525
+ return collectMatchingForeignSessions(files, cwd, limit, "codex", codexCwdExtractor);
526
+ }
527
+ /**
528
+ * Newest-first scan for transcripts belonging to `cwd`. Stops as soon as
529
+ * `limit` matches are found so a large history costs only the files it reads.
530
+ */
531
+ async function collectMatchingForeignSessions(files, cwd, limit, source, extractor) {
532
+ if (files.length === 0)
533
+ return [];
534
+ files.sort((left, right) => right.mtime - left.mtime);
535
+ const target = path.resolve(stripExtendedLengthPrefix(cwd));
536
+ const out = [];
537
+ for (const file of files) {
538
+ if (out.length >= limit)
539
+ break;
540
+ const recorded = await readFirstFromFile(file.path, extractor);
541
+ if (!recorded)
542
+ continue;
543
+ if (path.resolve(stripExtendedLengthPrefix(recorded)) !== target)
544
+ continue;
545
+ const summary = await readForeignSessionSummary(file.path, source);
546
+ if (!summary)
547
+ continue;
548
+ out.push({
549
+ ...summary,
550
+ lastActiveDisplay: formatRelativeTime(file.mtime),
551
+ lastActiveMs: file.mtime,
552
+ });
553
+ }
554
+ return out;
555
+ }
556
+ /**
557
+ * Preview + message count for a foreign transcript, using the same parsers the
558
+ * importer uses — so the row's title is exactly the title the imported session
559
+ * ends up with (notably Cursor's `<user_query>` unwrapping).
560
+ */
561
+ async function readForeignSessionSummary(file, source) {
562
+ let text;
563
+ try {
564
+ text = await fs.readFile(file, "utf-8");
565
+ }
566
+ catch {
567
+ return null;
568
+ }
569
+ try {
570
+ const parsed = parseForeignTranscript(text, source === "codex" ? "codex" : "claude");
571
+ if (parsed.messages.length === 0)
572
+ return null;
573
+ return {
574
+ id: path.basename(file).replace(/\.jsonl$/, ""),
575
+ path: file,
576
+ preview: parsed.preview ?? "(no prompt)",
577
+ messageCount: parsed.messages.length,
578
+ source,
579
+ };
580
+ }
581
+ catch {
582
+ // An unreadable transcript is skipped, never surfaced as a broken row.
583
+ return null;
584
+ }
585
+ }
486
586
  /** Single-pass parse of one session file: identity + count + activity + preview. */
487
587
  async function readSessionSummary(file) {
488
588
  try {