@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.
- package/dist/app-sidecar-sessions.d.ts +7 -2
- package/dist/app-sidecar-sessions.d.ts.map +1 -1
- package/dist/app-sidecar-sessions.js +36 -8
- package/dist/app-sidecar-sessions.js.map +1 -1
- package/dist/app-sidecar-sessions.test.js +88 -0
- package/dist/app-sidecar-sessions.test.js.map +1 -1
- package/dist/app-sidecar.js +27 -0
- package/dist/app-sidecar.js.map +1 -1
- package/dist/core/agent-session-process-gate.test.d.ts +2 -0
- package/dist/core/agent-session-process-gate.test.d.ts.map +1 -0
- package/dist/core/agent-session-process-gate.test.js +88 -0
- package/dist/core/agent-session-process-gate.test.js.map +1 -0
- package/dist/core/agent-session.d.ts +40 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +204 -6
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/foreign-session-import.d.ts +120 -0
- package/dist/core/foreign-session-import.d.ts.map +1 -0
- package/dist/core/foreign-session-import.js +594 -0
- package/dist/core/foreign-session-import.js.map +1 -0
- package/dist/core/foreign-session-import.test.d.ts +2 -0
- package/dist/core/foreign-session-import.test.d.ts.map +1 -0
- package/dist/core/foreign-session-import.test.js +220 -0
- package/dist/core/foreign-session-import.test.js.map +1 -0
- package/dist/core/foreign-transcript-blocks.d.ts +51 -0
- package/dist/core/foreign-transcript-blocks.d.ts.map +1 -0
- package/dist/core/foreign-transcript-blocks.js +151 -0
- package/dist/core/foreign-transcript-blocks.js.map +1 -0
- package/dist/core/mcp/catalog-cache.d.ts +63 -0
- package/dist/core/mcp/catalog-cache.d.ts.map +1 -0
- package/dist/core/mcp/catalog-cache.js +163 -0
- package/dist/core/mcp/catalog-cache.js.map +1 -0
- package/dist/core/mcp/catalog-cache.test.d.ts +2 -0
- package/dist/core/mcp/catalog-cache.test.d.ts.map +1 -0
- package/dist/core/mcp/catalog-cache.test.js +99 -0
- package/dist/core/mcp/catalog-cache.test.js.map +1 -0
- package/dist/core/mcp/client.d.ts +61 -0
- package/dist/core/mcp/client.d.ts.map +1 -1
- package/dist/core/mcp/client.js +216 -31
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/legacy-negotiation.test.d.ts +2 -0
- package/dist/core/mcp/legacy-negotiation.test.d.ts.map +1 -0
- package/dist/core/mcp/legacy-negotiation.test.js +80 -0
- package/dist/core/mcp/legacy-negotiation.test.js.map +1 -0
- package/dist/core/mcp/oauth-provider.d.ts +1 -2
- package/dist/core/mcp/oauth-provider.d.ts.map +1 -1
- package/dist/core/mcp/oauth-provider.js +5 -1
- package/dist/core/mcp/oauth-provider.js.map +1 -1
- package/dist/core/mcp/oauth-store.d.ts +1 -1
- package/dist/core/mcp/oauth-store.d.ts.map +1 -1
- package/dist/core/mcp/oauth-store.js.map +1 -1
- package/dist/core/mcp/when-connected.test.d.ts +2 -0
- package/dist/core/mcp/when-connected.test.d.ts.map +1 -0
- package/dist/core/mcp/when-connected.test.js +46 -0
- package/dist/core/mcp/when-connected.test.js.map +1 -0
- package/dist/core/process-gate.d.ts +45 -0
- package/dist/core/process-gate.d.ts.map +1 -0
- package/dist/core/process-gate.js +71 -0
- package/dist/core/process-gate.js.map +1 -0
- package/dist/core/process-gate.test.d.ts +2 -0
- package/dist/core/process-gate.test.d.ts.map +1 -0
- package/dist/core/process-gate.test.js +87 -0
- package/dist/core/process-gate.test.js.map +1 -0
- package/dist/core/process-manager.d.ts +9 -0
- package/dist/core/process-manager.d.ts.map +1 -1
- package/dist/core/process-manager.js +17 -15
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/project-discovery.d.ts +19 -0
- package/dist/core/project-discovery.d.ts.map +1 -1
- package/dist/core/project-discovery.js +100 -0
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts +5 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +2 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +6 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/tools/tool-search.d.ts +12 -1
- package/dist/tools/tool-search.d.ts.map +1 -1
- package/dist/tools/tool-search.js +22 -3
- package/dist/tools/tool-search.js.map +1 -1
- package/dist/tools/tool-search.test.d.ts +2 -0
- package/dist/tools/tool-search.test.d.ts.map +1 -0
- package/dist/tools/tool-search.test.js +69 -0
- package/dist/tools/tool-search.test.js.map +1 -0
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +27 -1
- package/dist/ui/App.js.map +1 -1
- package/package.json +5 -5
|
@@ -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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"}
|
|
@@ -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,27 @@ 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;
|
|
302
333
|
/**
|
|
303
334
|
* Resolve a `/name [args]` input to the prompt template it expands into, or
|
|
304
335
|
* null when it isn't a prompt-template command for THIS session (an ordinary
|
|
@@ -618,5 +649,14 @@ export declare class AgentSession {
|
|
|
618
649
|
private prepareDynamicContext;
|
|
619
650
|
private persistMessage;
|
|
620
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>;
|
|
621
661
|
}
|
|
622
662
|
//# sourceMappingURL=agent-session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,QAAQ,EAEb,KAAK,aAAa,EAInB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,oBAAoB,EAGrB,MAAM,qBAAqB,CAAC;AAQ7B,OAAO,EAML,KAAK,UAAU,EAEf,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAqB9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,QAAQ,EAEb,KAAK,aAAa,EAInB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,oBAAoB,EAGrB,MAAM,qBAAqB,CAAC;AAQ7B,OAAO,EAML,KAAK,UAAU,EAEf,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAqB9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAS9D,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,6BAA6B,CAAC;AAOrC,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAuChF;;gDAEgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kFAAkF;IAClF,mBAAmB,CAAC,EAAE,MAAM,MAAM,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,0DAA0D;IAC1D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;OAQG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;;;OASG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;;;;;;;OAQG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,qFAAqF;IACrF,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iFAAiF;IACjF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kDAAkD;IAClD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wFAAwF;IACxF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,wFAAwF;IACxF,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC;CAC/B;AAID,oFAAoF;AACpF,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAKR;AAED;;;;;;;GAOG;AACH,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAGR;AAeD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB;;mDAE+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,qBAAa,YAAY;IACvB,QAAQ,CAAC,QAAQ,WAAkB;IACnC,QAAQ,CAAC,aAAa,uBAA8B;IAEpD,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,eAAe,CAAyB;IAEhD,OAAO,CAAC,QAAQ,CAAiB;IAMjC,OAAO,CAAC,QAAQ,CAAwB;IAMxC,OAAO,CAAC,gBAAgB,CAAgC;IAKxD,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,KAAK,CAAmB;IAChC;;0EAEsE;IACtE,OAAO,CAAC,eAAe,CAA6C;IACpE,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,cAAc,CAAS;IAI/B,OAAO,CAAC,SAAS,CAQf;IACF,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,2BAA2B,CAAK;IACxC,OAAO,CAAC,mBAAmB,CAAiC;IAC5D,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,aAAa,CAAsE;IAC3F,OAAO,CAAC,gBAAgB,CAA6C;IACrE,8EAA8E;IAC9E,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IACvD,0EAA0E;IAC1E,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,mBAAmB,CAAS;IACpC,+EAA+E;IAC/E,OAAO,CAAC,YAAY,CAAK;IACzB,6EAA6E;IAC7E,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,oBAAoB,CAAK;IACjC,6EAA6E;IAC7E,OAAO,CAAC,eAAe,CAAkD;IACzE,OAAO,CAAC,eAAe,CAAM;IAS7B,OAAO,CAAC,SAAS,CAA6E;IAC9F,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgC;IAC9D,OAAO,CAAC,kBAAkB,CAAC,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAElC;IACF,OAAO,CAAC,UAAU,CAAC,CAAmB;IACtC,2EAA2E;IAC3E,OAAO,CAAC,UAAU,CAAC,CAAsB;IACzC,kFAAkF;IAClF,OAAO,CAAC,YAAY,CAAgC;IACpD,8EAA8E;IAC9E,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB;;;0DAGsD;IACtD,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,gFAAgF;IAChF,OAAO,CAAC,gBAAgB,CAAM;IAC9B,4EAA4E;IAC5E,OAAO,CAAC,WAAW,CAAsB;IACzC;;mFAE+E;IAC/E,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAClC,6EAA6E;IAC7E,OAAO,CAAC,eAAe,CAAgB;IAEvC,OAAO,CAAC,SAAS,CAAM;IACvB,+EAA+E;IAC/E,OAAO,CAAC,cAAc,CAAM;IAC5B,sFAAsF;IACtF,OAAO,CAAC,cAAc,CAAM;IAC5B;sFACkF;IAClF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAuB;IAC1D,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,kBAAkB,CAAK;IAE/B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,wBAAwB;IAIhC,wFAAwF;IACxF,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO,CAAC,IAAI,CAAsB;gBAEtB,OAAO,EAAE,mBAAmB;IAYxC;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAUlB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwOjC;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAYrB;;;;;;;;OAQG;YACW,iBAAiB;IA6D/B;;;;;;;;OAQG;IACH,OAAO,CAAC,WAAW;IAoBnB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAyB5B,8EAA8E;IAC9E,OAAO,CAAC,kBAAkB;IAQ1B,+EAA+E;IAC/E,OAAO,CAAC,wBAAwB;IAOhC;;;;;;OAMG;YACW,uBAAuB;IAyBrC,0EAA0E;IAC1E,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,kBAAkB;IAgC1B;;;;;;OAMG;YACW,iBAAiB;IA8B/B;;;;;OAKG;IACG,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjE;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B5C;;;;;;OAMG;IACG,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1F;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAsD5B;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA4BtB;;;;OAIG;YACW,cAAc;IAoD5B;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IA2F/B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAuC9B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IA0E/B,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,qBAAqB;IAiB7B,oFAAoF;YACtE,OAAO;IAkUf,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0HjE;;;;;;;;;;OAUG;IACH,OAAO,CAAC,qBAAqB;IAYvB,OAAO,CAAC,mBAAmB,CAAC,EAAE;QAClC,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyFX,UAAU,CAAC,oBAAoB,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDvD,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD;;;;;;OAMG;IACG,MAAM,CAAC,SAAS,SAAI,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAoCpF;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAM3C,QAAQ,IAAI,iBAAiB;IAa7B,WAAW,IAAI,OAAO;IAItB;;;;OAIG;IACH,wBAAwB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAQnD;;mBAEe;IACf,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,iBAAiB,EAAO,GAAG,MAAM;IAMzE,6EAA6E;IAC7E,kBAAkB,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAIzD;;;0BAGsB;IACtB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAOxC,2CAA2C;IAC3C,cAAc,IAAI,MAAM;IAIxB;;;sEAGkE;IAClE,qBAAqB,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,iBAAiB,EAAE,CAAA;KAAE,GAAG,IAAI;IASlF;sFACkF;IAClF,UAAU,IAAI,MAAM;IAOpB,+EAA+E;IAC/E,uBAAuB,IAAI,iBAAiB,EAAE;IAI9C,+EAA+E;IACzE,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKxD,0FAA0F;IAC1F,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI;IAahF;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD;;;;;OAKG;IACG,eAAe,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1E,uEAAuE;IACvE,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;;;;;;OAOG;IACG,YAAY,CAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BrE,6DAA6D;IACvD,eAAe,CACnB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAYrE,oEAAoE;IACpE,OAAO,CAAC,iBAAiB;IAQzB,wEAAwE;YAC1D,0BAA0B;IAqBxC;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAU/B,WAAW,IAAI,OAAO,EAAE;IAIxB,cAAc,IAAI,iBAAiB,EAAE;YASvB,iBAAiB;YAkBjB,oBAAoB;IAOlC;;4DAEwD;IACxD,WAAW,IAAI,cAAc,EAAE;IAI/B;;6DAEyD;IACzD,mBAAmB,IAAI,sBAAsB,EAAE;IAI/C;;iFAE6E;IAC7E,2BAA2B,IAAI,MAAM;IAIrC;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;;;;;;;;OASG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpE;;;8EAG0E;YAC5D,iBAAiB;IAe/B;;;;;;;OAOG;IACG,sBAAsB,CAC1B,KAAK,EAAE,sBAAsB,CAAC,OAAO,CAAC,EACtC,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GACzC,OAAO,CAAC,IAAI,CAAC;IAsBhB;;sEAEkE;YACpD,yBAAyB;IAevC;;iFAE6E;IAC7E,aAAa,IAAI,gBAAgB,EAAE;IAInC;;;;;;;;OAQG;IACG,gBAAgB,CACpB,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,YAAY,SAAI,GACf,OAAO,CAAC,IAAI,CAAC;IAgBhB;;4DAEwD;YAC1C,mBAAmB;IAejC;;;;;;OAMG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAyBzD,2EAA2E;IAC3E,gBAAgB,IAAI,aAAa,GAAG,SAAS;IAI7C;gFAC4E;IAC5E,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI;IAKxD,0DAA0D;IAC1D,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKpC,OAAO,CAAC,uBAAuB;IAO/B;iFAC6E;IAC7E,OAAO,CAAC,gBAAgB;IAOxB;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,iBAAiB;IAMzB,mEAAmE;IACnE,kBAAkB,IAAI,MAAM,GAAG,SAAS;IAIlC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAc9B,OAAO,CAAC,cAAc;YAOR,gBAAgB;YAWhB,mBAAmB;YAkInB,qBAAqB;YAIrB,cAAc;IAmB5B,OAAO,CAAC,yBAAyB;IAgDjC;;;;;OAKG;IACG,uBAAuB,CAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,GAC1B,OAAO,CAAC,6BAA6B,CAAC;CA2B1C"}
|
|
@@ -18,10 +18,14 @@ import { discoverSkills } from "./skills.js";
|
|
|
18
18
|
import { ensureAppDirs } from "../config.js";
|
|
19
19
|
import { buildSystemPrompt } from "../system-prompt.js";
|
|
20
20
|
import { createTools, createWebSearchTool, } from "../tools/index.js";
|
|
21
|
+
import { buildProcessCompletionFollowUp } from "./process-gate.js";
|
|
21
22
|
import { buildSubAgentCompletionFollowUp } from "./subagent-manager.js";
|
|
22
23
|
import { applyAsyncSubagentPolicy } from "./subagent-policy.js";
|
|
24
|
+
import { z } from "zod";
|
|
23
25
|
import { MCPClientManager, getAllMcpServers } from "./mcp/index.js";
|
|
24
26
|
import { DeferredToolCatalog } from "./mcp/deferred-catalog.js";
|
|
27
|
+
import { McpCatalogCache } from "./mcp/catalog-cache.js";
|
|
28
|
+
import { describeDropped, importForeignSession, } from "./foreign-session-import.js";
|
|
25
29
|
import { createToolSearchTool } from "../tools/tool-search.js";
|
|
26
30
|
import { log } from "./logger.js";
|
|
27
31
|
import { setEstimatorModel, calibrateEstimatorFromUsage } from "./compaction/token-estimator.js";
|
|
@@ -136,6 +140,10 @@ export class AgentSession {
|
|
|
136
140
|
/** 0 = none; 1 = first nudge sent; 2 = final stop-and-report injected. */
|
|
137
141
|
loopBreakInjected = 0;
|
|
138
142
|
regroundingInjected = false;
|
|
143
|
+
/** Wall-clock start of the current run; scopes the background-process gate. */
|
|
144
|
+
runStartedAt = 0;
|
|
145
|
+
/** Gate injections spent this run, capped by MAX_PROCESS_GATE_INJECTIONS. */
|
|
146
|
+
processGateInjected = 0;
|
|
139
147
|
compactionOccurred = false;
|
|
140
148
|
lastCompactionCompacted = false;
|
|
141
149
|
compactionRetryAfter = 0;
|
|
@@ -168,6 +176,11 @@ export class AgentSession {
|
|
|
168
176
|
mcpManager;
|
|
169
177
|
/** Deferred MCP tools awaiting discovery via tool_search (bench A win). */
|
|
170
178
|
mcpCatalog;
|
|
179
|
+
/** Live (connected) MCP tools by name — the reconcile target for cached stubs. */
|
|
180
|
+
liveMcpTools = new Map();
|
|
181
|
+
/** Server name for each cached-only tool, so a stub knows what to wait on. */
|
|
182
|
+
cachedMcpToolServers = new Map();
|
|
183
|
+
mcpCatalogCache = new McpCatalogCache();
|
|
171
184
|
provider;
|
|
172
185
|
model;
|
|
173
186
|
cwd;
|
|
@@ -343,7 +356,10 @@ export class AgentSession {
|
|
|
343
356
|
// its listening handshake until this resolves), `backgroundMcpConnect`
|
|
344
357
|
// moves the connect off the critical path so the session becomes usable
|
|
345
358
|
// immediately and tools are appended whenever the servers come up.
|
|
346
|
-
this.mcpManager = new MCPClientManager(
|
|
359
|
+
this.mcpManager = new MCPClientManager({
|
|
360
|
+
catalogCache: this.mcpCatalogCache,
|
|
361
|
+
modernProtocol: this.settingsManager.get("mcpModernProtocol"),
|
|
362
|
+
});
|
|
347
363
|
if (this.opts.backgroundMcpConnect) {
|
|
348
364
|
void this.connectMcpServers();
|
|
349
365
|
}
|
|
@@ -506,6 +522,11 @@ export class AgentSession {
|
|
|
506
522
|
if (this.opts.allowedTools && mcpWhitelist) {
|
|
507
523
|
servers = servers.filter((s) => mcpWhitelist.includes(s.name));
|
|
508
524
|
}
|
|
525
|
+
// Seed the catalog from the on-disk cache BEFORE connecting. With
|
|
526
|
+
// `backgroundMcpConnect` the first turns would otherwise run against an
|
|
527
|
+
// empty catalog and tool_search would answer "the catalog is empty" for
|
|
528
|
+
// capabilities that genuinely exist — a wrong answer, not a slow one.
|
|
529
|
+
await this.seedMcpCatalogFromCache(servers);
|
|
509
530
|
const connected = await this.mcpManager.connectAll(servers);
|
|
510
531
|
// Defense-in-depth: even from a whitelisted server, only push tools that
|
|
511
532
|
// pass the allow-list (no-op when there's no allow-list).
|
|
@@ -541,18 +562,137 @@ export class AgentSession {
|
|
|
541
562
|
addMcpTools(mcpTools) {
|
|
542
563
|
if (mcpTools.length === 0)
|
|
543
564
|
return;
|
|
565
|
+
for (const tool of mcpTools) {
|
|
566
|
+
this.liveMcpTools.set(tool.name, tool);
|
|
567
|
+
this.cachedMcpToolServers.delete(tool.name);
|
|
568
|
+
}
|
|
544
569
|
const defer = !this.opts.allowedTools && this.settingsManager.get("deferredMcpTools");
|
|
545
570
|
if (!defer) {
|
|
546
|
-
this.
|
|
571
|
+
this.replaceOrPushTools(mcpTools);
|
|
547
572
|
return;
|
|
548
573
|
}
|
|
549
574
|
this.mcpCatalog ??= new DeferredToolCatalog();
|
|
575
|
+
// `add` is name-keyed, so live definitions replace cached stubs in place.
|
|
550
576
|
this.mcpCatalog.add(mcpTools);
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
577
|
+
// A stub the model already promoted lives in `this.tools`; swap it for the
|
|
578
|
+
// live tool so later calls dispatch directly instead of through the stub.
|
|
579
|
+
this.replaceLivePromotedTools(mcpTools);
|
|
580
|
+
this.ensureToolSearchTool();
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Register `tool_search` once. Promotion of a cached-only entry waits for its
|
|
584
|
+
* server so the model is told immediately when that capability turns out to
|
|
585
|
+
* be unreachable, instead of promoting a tool that fails on first call.
|
|
586
|
+
*/
|
|
587
|
+
ensureToolSearchTool() {
|
|
588
|
+
if (!this.mcpCatalog)
|
|
589
|
+
return;
|
|
590
|
+
if (this.tools.some((t) => t.name === "tool_search"))
|
|
591
|
+
return;
|
|
592
|
+
this.tools.push(createToolSearchTool(this.mcpCatalog, (promoted) => {
|
|
593
|
+
this.tools.push(...promoted);
|
|
594
|
+
}, async (toolName) => {
|
|
595
|
+
if (this.liveMcpTools.has(toolName))
|
|
596
|
+
return undefined;
|
|
597
|
+
const serverName = this.cachedMcpToolServers.get(toolName);
|
|
598
|
+
if (!serverName)
|
|
599
|
+
return undefined;
|
|
600
|
+
const outcome = (await this.mcpManager?.whenConnected(serverName)) ?? {
|
|
601
|
+
ok: false,
|
|
602
|
+
error: "MCP is disabled for this session",
|
|
603
|
+
};
|
|
604
|
+
return outcome.ok
|
|
605
|
+
? { serverName, ok: true }
|
|
606
|
+
: { serverName, ok: false, error: outcome.error };
|
|
607
|
+
}));
|
|
608
|
+
}
|
|
609
|
+
/** Append tools, replacing any same-named entry (cached stub → live tool). */
|
|
610
|
+
replaceOrPushTools(tools) {
|
|
611
|
+
for (const tool of tools) {
|
|
612
|
+
const index = this.tools.findIndex((t) => t.name === tool.name);
|
|
613
|
+
if (index >= 0)
|
|
614
|
+
this.tools[index] = tool;
|
|
615
|
+
else
|
|
616
|
+
this.tools.push(tool);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
/** Swap already-promoted cached stubs for their live equivalents, in place. */
|
|
620
|
+
replaceLivePromotedTools(tools) {
|
|
621
|
+
for (const tool of tools) {
|
|
622
|
+
const index = this.tools.findIndex((t) => t.name === tool.name);
|
|
623
|
+
if (index >= 0)
|
|
624
|
+
this.tools[index] = tool;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Publish cached tool definitions into the deferred catalog so `tool_search`
|
|
629
|
+
* answers correctly on turn 1. A cached stub carries the real name, one-line
|
|
630
|
+
* description and input schema; calling it waits for the live connection and
|
|
631
|
+
* then dispatches against the real client, or returns a clear error when that
|
|
632
|
+
* server ultimately failed. Live tools replace stubs on connect.
|
|
633
|
+
*/
|
|
634
|
+
async seedMcpCatalogFromCache(servers) {
|
|
635
|
+
if (!this.opts.backgroundMcpConnect)
|
|
636
|
+
return;
|
|
637
|
+
if (this.opts.allowedTools || !this.settingsManager.get("deferredMcpTools"))
|
|
638
|
+
return;
|
|
639
|
+
let entries;
|
|
640
|
+
try {
|
|
641
|
+
entries = await this.mcpCatalogCache.entriesFor(servers);
|
|
642
|
+
}
|
|
643
|
+
catch {
|
|
644
|
+
return;
|
|
645
|
+
}
|
|
646
|
+
const stubs = [];
|
|
647
|
+
for (const [serverName, entry] of entries) {
|
|
648
|
+
for (const cached of entry.tools) {
|
|
649
|
+
if (this.liveMcpTools.has(cached.name))
|
|
650
|
+
continue;
|
|
651
|
+
this.cachedMcpToolServers.set(cached.name, serverName);
|
|
652
|
+
stubs.push(this.buildCachedMcpTool(serverName, cached));
|
|
653
|
+
}
|
|
555
654
|
}
|
|
655
|
+
if (stubs.length === 0)
|
|
656
|
+
return;
|
|
657
|
+
log("INFO", "mcp", "Seeded deferred tool catalog from cache", {
|
|
658
|
+
tools: String(stubs.length),
|
|
659
|
+
servers: String(entries.size),
|
|
660
|
+
});
|
|
661
|
+
this.addCachedMcpTools(stubs);
|
|
662
|
+
}
|
|
663
|
+
/** Catalog-only registration for cached stubs — never marks them live. */
|
|
664
|
+
addCachedMcpTools(stubs) {
|
|
665
|
+
this.mcpCatalog ??= new DeferredToolCatalog();
|
|
666
|
+
this.mcpCatalog.add(stubs);
|
|
667
|
+
this.ensureToolSearchTool();
|
|
668
|
+
}
|
|
669
|
+
buildCachedMcpTool(serverName, cached) {
|
|
670
|
+
return {
|
|
671
|
+
name: cached.name,
|
|
672
|
+
description: cached.description,
|
|
673
|
+
parameters: z.record(z.string(), z.unknown()),
|
|
674
|
+
rawInputSchema: cached.rawInputSchema,
|
|
675
|
+
execute: async (args, context) => {
|
|
676
|
+
const live = this.liveMcpTools.get(cached.name);
|
|
677
|
+
if (live)
|
|
678
|
+
return live.execute(args, context);
|
|
679
|
+
const outcome = (await this.mcpManager?.whenConnected(serverName)) ?? {
|
|
680
|
+
ok: false,
|
|
681
|
+
error: "MCP is disabled for this session",
|
|
682
|
+
};
|
|
683
|
+
if (!outcome.ok) {
|
|
684
|
+
return (`MCP tool ${cached.name} is unavailable: server "${serverName}" did not connect ` +
|
|
685
|
+
`(${outcome.error}). This tool was offered from a cached catalog. ` +
|
|
686
|
+
`Use a different approach or ask the user to check their MCP configuration.`);
|
|
687
|
+
}
|
|
688
|
+
const connected = this.liveMcpTools.get(cached.name);
|
|
689
|
+
if (!connected) {
|
|
690
|
+
return (`MCP tool ${cached.name} no longer exists: server "${serverName}" connected but ` +
|
|
691
|
+
`does not expose it. The cached catalog entry was stale.`);
|
|
692
|
+
}
|
|
693
|
+
return connected.execute(args, context);
|
|
694
|
+
},
|
|
695
|
+
};
|
|
556
696
|
}
|
|
557
697
|
/**
|
|
558
698
|
* Resolve a `/name [args]` input to the prompt template it expands into, or
|
|
@@ -731,6 +871,8 @@ export class AgentSession {
|
|
|
731
871
|
this.idealReviewPhase = "idle";
|
|
732
872
|
this.loopBreakInjected = 0;
|
|
733
873
|
this.regroundingInjected = false;
|
|
874
|
+
this.runStartedAt = Date.now();
|
|
875
|
+
this.processGateInjected = 0;
|
|
734
876
|
this.compactionOccurred = false;
|
|
735
877
|
this.originalRequest = originalRequest;
|
|
736
878
|
}
|
|
@@ -922,6 +1064,17 @@ export class AgentSession {
|
|
|
922
1064
|
const childCompletionFollowUp = buildSubAgentCompletionFollowUp(this.subAgentManager);
|
|
923
1065
|
if (childCompletionFollowUp)
|
|
924
1066
|
return childCompletionFollowUp;
|
|
1067
|
+
// Background processes started this run and never read block completion:
|
|
1068
|
+
// their progress/exit checkpoints only land on the steering path, which an
|
|
1069
|
+
// agent about to stop never reaches.
|
|
1070
|
+
const processFollowUp = buildProcessCompletionFollowUp(this.processManager?.list() ?? [], this.runStartedAt, this.processGateInjected);
|
|
1071
|
+
if (processFollowUp) {
|
|
1072
|
+
this.processGateInjected += 1;
|
|
1073
|
+
log("INFO", "process-gate", "Injecting background-process completion gate", {
|
|
1074
|
+
injected: String(this.processGateInjected),
|
|
1075
|
+
});
|
|
1076
|
+
return processFollowUp;
|
|
1077
|
+
}
|
|
925
1078
|
if (this.opts.selfCorrectionHooks === false || this.idealReviewSuppressed)
|
|
926
1079
|
return null;
|
|
927
1080
|
if (this.idealReviewPhase === "reviewing") {
|
|
@@ -1387,6 +1540,8 @@ export class AgentSession {
|
|
|
1387
1540
|
// re-adding. Some tools may already have been promoted out of the catalog.
|
|
1388
1541
|
this.tools = this.tools.filter((t) => !t.name.startsWith("mcp__"));
|
|
1389
1542
|
this.mcpCatalog?.removeWhere((name) => name.startsWith("mcp__"));
|
|
1543
|
+
this.liveMcpTools.clear();
|
|
1544
|
+
this.cachedMcpToolServers.clear();
|
|
1390
1545
|
this.addMcpTools(mcpTools);
|
|
1391
1546
|
}
|
|
1392
1547
|
catch (err) {
|
|
@@ -2340,5 +2495,48 @@ export class AgentSession {
|
|
|
2340
2495
|
getAdditionalRoots: () => this.getAdditionalRoots(),
|
|
2341
2496
|
};
|
|
2342
2497
|
}
|
|
2498
|
+
/**
|
|
2499
|
+
* Import a Claude Code / Codex / Cursor transcript as a resumable GG Coder
|
|
2500
|
+
* session in this session's sessions directory. Never throws — a bad path or
|
|
2501
|
+
* an unrecognized format comes back as `{ ok: false, error }` so both the CLI
|
|
2502
|
+
* and the desktop app can show it verbatim.
|
|
2503
|
+
*/
|
|
2504
|
+
async importForeignTranscript(filePath, opts = {}) {
|
|
2505
|
+
try {
|
|
2506
|
+
const imported = await importForeignSession({
|
|
2507
|
+
filePath: resolveHomePath(filePath),
|
|
2508
|
+
sessionManager: this.sessionManager,
|
|
2509
|
+
provider: this.provider,
|
|
2510
|
+
model: this.model,
|
|
2511
|
+
cwd: opts.cwd ?? undefined,
|
|
2512
|
+
});
|
|
2513
|
+
log("INFO", "import", "Imported foreign transcript", {
|
|
2514
|
+
format: imported.format,
|
|
2515
|
+
messages: String(imported.messageCount),
|
|
2516
|
+
});
|
|
2517
|
+
return {
|
|
2518
|
+
ok: true,
|
|
2519
|
+
sessionId: imported.sessionId,
|
|
2520
|
+
sessionPath: imported.sessionPath,
|
|
2521
|
+
cwd: imported.cwd,
|
|
2522
|
+
format: imported.format,
|
|
2523
|
+
messageCount: imported.messageCount,
|
|
2524
|
+
dropped: describeDropped(imported.dropped),
|
|
2525
|
+
...(imported.preview ? { preview: imported.preview } : {}),
|
|
2526
|
+
};
|
|
2527
|
+
}
|
|
2528
|
+
catch (err) {
|
|
2529
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
2530
|
+
}
|
|
2531
|
+
}
|
|
2532
|
+
}
|
|
2533
|
+
/** Expand a leading `~` so `/import ~/.codex/...` works from any shell. */
|
|
2534
|
+
function resolveHomePath(filePath) {
|
|
2535
|
+
if (filePath === "~")
|
|
2536
|
+
return os.homedir();
|
|
2537
|
+
if (filePath.startsWith("~/") || filePath.startsWith("~\\")) {
|
|
2538
|
+
return path.join(os.homedir(), filePath.slice(2));
|
|
2539
|
+
}
|
|
2540
|
+
return filePath;
|
|
2343
2541
|
}
|
|
2344
2542
|
//# sourceMappingURL=agent-session.js.map
|