@kenkaiiii/ggcoder 5.34.2 → 5.35.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 (52) hide show
  1. package/dist/app-sidecar.js +11 -0
  2. package/dist/app-sidecar.js.map +1 -1
  3. package/dist/core/compaction/compactor.d.ts +50 -0
  4. package/dist/core/compaction/compactor.d.ts.map +1 -1
  5. package/dist/core/compaction/compactor.js +136 -35
  6. package/dist/core/compaction/compactor.js.map +1 -1
  7. package/dist/core/compaction/compactor.test.js +131 -1
  8. package/dist/core/compaction/compactor.test.js.map +1 -1
  9. package/dist/core/lsp/manager.d.ts +44 -9
  10. package/dist/core/lsp/manager.d.ts.map +1 -1
  11. package/dist/core/lsp/manager.js +64 -69
  12. package/dist/core/lsp/manager.js.map +1 -1
  13. package/dist/core/lsp/pool.d.ts +113 -0
  14. package/dist/core/lsp/pool.d.ts.map +1 -0
  15. package/dist/core/lsp/pool.js +255 -0
  16. package/dist/core/lsp/pool.js.map +1 -0
  17. package/dist/core/lsp/pool.test.d.ts +2 -0
  18. package/dist/core/lsp/pool.test.d.ts.map +1 -0
  19. package/dist/core/lsp/pool.test.js +286 -0
  20. package/dist/core/lsp/pool.test.js.map +1 -0
  21. package/dist/core/lsp/servers.d.ts.map +1 -1
  22. package/dist/core/lsp/servers.js +44 -3
  23. package/dist/core/lsp/servers.js.map +1 -1
  24. package/dist/core/lsp/servers.test.d.ts +2 -0
  25. package/dist/core/lsp/servers.test.d.ts.map +1 -0
  26. package/dist/core/lsp/servers.test.js +67 -0
  27. package/dist/core/lsp/servers.test.js.map +1 -0
  28. package/dist/core/lsp/windows.test.js +2 -14
  29. package/dist/core/lsp/windows.test.js.map +1 -1
  30. package/dist/core/mcp/client.d.ts +40 -0
  31. package/dist/core/mcp/client.d.ts.map +1 -1
  32. package/dist/core/mcp/client.js +119 -1
  33. package/dist/core/mcp/client.js.map +1 -1
  34. package/dist/core/mcp/index.d.ts +2 -0
  35. package/dist/core/mcp/index.d.ts.map +1 -1
  36. package/dist/core/mcp/index.js +1 -0
  37. package/dist/core/mcp/index.js.map +1 -1
  38. package/dist/core/mcp/session-elicitation-wiring.test.d.ts +2 -0
  39. package/dist/core/mcp/session-elicitation-wiring.test.d.ts.map +1 -0
  40. package/dist/core/mcp/session-elicitation-wiring.test.js +138 -0
  41. package/dist/core/mcp/session-elicitation-wiring.test.js.map +1 -0
  42. package/dist/core/mcp/shared-pool.d.ts +158 -0
  43. package/dist/core/mcp/shared-pool.d.ts.map +1 -0
  44. package/dist/core/mcp/shared-pool.js +235 -0
  45. package/dist/core/mcp/shared-pool.js.map +1 -0
  46. package/dist/core/mcp/shared-pool.test.d.ts +2 -0
  47. package/dist/core/mcp/shared-pool.test.d.ts.map +1 -0
  48. package/dist/core/mcp/shared-pool.test.js +425 -0
  49. package/dist/core/mcp/shared-pool.test.js.map +1 -0
  50. package/dist/core/mcp/types.d.ts +12 -0
  51. package/dist/core/mcp/types.d.ts.map +1 -1
  52. package/package.json +4 -4
@@ -0,0 +1,425 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import crypto from "node:crypto";
3
+ import fs from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
8
+ import { McpCatalogCache } from "./catalog-cache.js";
9
+ import { MCPClientManager } from "./client.js";
10
+ import { DEFAULT_MCP_SERVERS } from "./defaults.js";
11
+ import { isShareableServer, SharedMcpPool, } from "./shared-pool.js";
12
+ function toolContext() {
13
+ return { signal: new AbortController().signal, toolCallId: "call-1" };
14
+ }
15
+ const FIXTURE_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "__fixtures__");
16
+ const FIXTURE = path.join(FIXTURE_DIR, "legacy-mcp-server.mjs");
17
+ const ELICIT_FIXTURE = path.join(FIXTURE_DIR, "elicit-mcp-server.mjs");
18
+ let dir;
19
+ let cachePath;
20
+ const managers = [];
21
+ const pools = [];
22
+ beforeEach(async () => {
23
+ dir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-mcp-shared-"));
24
+ cachePath = path.join(dir, "mcp-catalog.json");
25
+ });
26
+ afterEach(async () => {
27
+ await Promise.all(managers.splice(0).map((instance) => instance.dispose()));
28
+ await Promise.all(pools.splice(0).map((pool) => pool.disposeAll()));
29
+ await fs.rm(dir, { recursive: true, force: true });
30
+ });
31
+ function newPool() {
32
+ const pool = new SharedMcpPool();
33
+ pools.push(pool);
34
+ return pool;
35
+ }
36
+ /** A manager wired to a test-local pool, standing in for one session. */
37
+ function session(pool) {
38
+ const instance = new MCPClientManager({
39
+ catalogCache: new McpCatalogCache(cachePath),
40
+ sharedPool: pool,
41
+ });
42
+ managers.push(instance);
43
+ return instance;
44
+ }
45
+ /**
46
+ * A real stdio MCP server, tagged with a marker argument so its process can be
47
+ * counted in `ps` and so each test gets its own pool key (args are part of the
48
+ * config hash).
49
+ */
50
+ function sharedFixture(overrides = {}) {
51
+ return {
52
+ name: "shared-fixture",
53
+ command: process.execPath,
54
+ args: [FIXTURE, `--gg-marker=${crypto.randomUUID()}`],
55
+ timeout: 10_000,
56
+ ...overrides,
57
+ };
58
+ }
59
+ /** Live child processes carrying this config's marker argument. */
60
+ function processCount(config) {
61
+ const marker = config.args?.find((arg) => arg.startsWith("--gg-marker="));
62
+ if (!marker)
63
+ throw new Error("fixture config has no marker argument");
64
+ const out = execFileSync("ps", ["-eo", "command"], { encoding: "utf8" });
65
+ return out.split("\n").filter((line) => line.includes(marker)).length;
66
+ }
67
+ function fakeConnector(log, name = "fake") {
68
+ return {
69
+ connect: async (config) => {
70
+ log.push(`connect:${config.name}`);
71
+ return { name: config.name, ok: true, toolCount: 0, tools: [] };
72
+ },
73
+ dispose: async () => {
74
+ log.push(`dispose:${name}`);
75
+ },
76
+ };
77
+ }
78
+ describe("isShareableServer", () => {
79
+ /** Sharing is the default for stdio: no config change makes a server share. */
80
+ it("shares any stdio server by default", () => {
81
+ expect(isShareableServer({ name: "s", command: "node" })).toBe(true);
82
+ });
83
+ it("honours an explicit opt-out", () => {
84
+ expect(isShareableServer({ name: "s", command: "node", shared: false })).toBe(false);
85
+ });
86
+ /** Sharing collapses duplicate processes; HTTP has none and carries auth. */
87
+ it("never shares an HTTP server, even when explicitly asked to", () => {
88
+ expect(isShareableServer({ name: "s", url: "https://x.test/mcp", shared: true })).toBe(false);
89
+ });
90
+ it("shares every default server, kencode-search included", () => {
91
+ const stdio = DEFAULT_MCP_SERVERS.filter((s) => s.command);
92
+ expect(stdio.length).toBeGreaterThan(0);
93
+ expect(stdio.every((s) => isShareableServer(s))).toBe(true);
94
+ });
95
+ });
96
+ describe("SharedMcpPool refcounting", () => {
97
+ const config = { name: "pooled", command: "node" };
98
+ it("connects once for two acquirers and disposes only after both release", async () => {
99
+ const log = [];
100
+ const pool = newPool();
101
+ let built = 0;
102
+ const factory = () => {
103
+ built += 1;
104
+ return fakeConnector(log);
105
+ };
106
+ const first = await pool.acquire(config, factory);
107
+ const second = await pool.acquire(config, factory);
108
+ expect(built).toBe(1);
109
+ expect(log).toEqual(["connect:pooled"]);
110
+ expect(pool.refCount(config)).toBe(2);
111
+ await first.release();
112
+ expect(log).toEqual(["connect:pooled"]); // still held by the second session
113
+ expect(pool.refCount(config)).toBe(1);
114
+ await second.release();
115
+ expect(log).toEqual(["connect:pooled", "dispose:fake"]);
116
+ expect(pool.refCount(config)).toBe(0);
117
+ expect(pool.size).toBe(0);
118
+ });
119
+ it("shares one in-flight connect between concurrent acquirers", async () => {
120
+ const pool = newPool();
121
+ let built = 0;
122
+ let release;
123
+ const gate = new Promise((resolve) => {
124
+ release = resolve;
125
+ });
126
+ const factory = () => {
127
+ built += 1;
128
+ return {
129
+ connect: async (target) => {
130
+ await gate;
131
+ return { name: target.name, ok: true, toolCount: 0, tools: [] };
132
+ },
133
+ dispose: async () => { },
134
+ };
135
+ };
136
+ const both = Promise.all([pool.acquire(config, factory), pool.acquire(config, factory)]);
137
+ release();
138
+ const [a, b] = await both;
139
+ expect(built).toBe(1);
140
+ expect(a.result.ok && b.result.ok).toBe(true);
141
+ expect(pool.refCount(config)).toBe(2);
142
+ });
143
+ /** Session dispose can run twice; a double release must not evict early. */
144
+ it("ignores a repeated release instead of dropping another session's claim", async () => {
145
+ const log = [];
146
+ const pool = newPool();
147
+ const factory = () => fakeConnector(log);
148
+ const first = await pool.acquire(config, factory);
149
+ const second = await pool.acquire(config, factory);
150
+ await first.release();
151
+ await first.release();
152
+ expect(log).toEqual(["connect:pooled"]);
153
+ expect(pool.refCount(config)).toBe(1);
154
+ await second.release();
155
+ expect(log).toEqual(["connect:pooled", "dispose:fake"]);
156
+ });
157
+ it("does not pool a failed connection, so a later session retries", async () => {
158
+ const pool = newPool();
159
+ let attempts = 0;
160
+ const factory = () => ({
161
+ connect: async (target) => {
162
+ attempts += 1;
163
+ if (attempts === 1) {
164
+ return { name: target.name, ok: false, toolCount: 0, tools: [], error: "boom" };
165
+ }
166
+ return { name: target.name, ok: true, toolCount: 0, tools: [] };
167
+ },
168
+ dispose: async () => { },
169
+ });
170
+ const failed = await pool.acquire(config, factory);
171
+ expect(failed.result.ok).toBe(false);
172
+ expect(pool.size).toBe(0);
173
+ const retried = await pool.acquire(config, factory);
174
+ expect(retried.result.ok).toBe(true);
175
+ expect(attempts).toBe(2);
176
+ });
177
+ /**
178
+ * Elicitation is the one genuinely per-window concern on a shared connection:
179
+ * "ask the user" has to name a window. The pool routes each request to the
180
+ * session that has a tool call in flight, which is by definition the one that
181
+ * provoked it.
182
+ */
183
+ describe("elicitation routing", () => {
184
+ /** Captures the handler the pool installs on the shared connection. */
185
+ function connectorCapturingElicit(sink) {
186
+ return (opts) => {
187
+ sink.onElicit = opts.onElicit;
188
+ return {
189
+ connect: async (target) => ({ name: target.name, ok: true, toolCount: 0, tools: [] }),
190
+ dispose: async () => { },
191
+ };
192
+ };
193
+ }
194
+ const request = { server: "pooled", message: "who?", requestedSchema: {} };
195
+ it("routes a prompt to the session whose tool call is in flight", async () => {
196
+ const pool = newPool();
197
+ const sink = {};
198
+ const seen = [];
199
+ const handlerFor = (id) => {
200
+ return async () => {
201
+ seen.push(id);
202
+ return { action: "accept", content: { id } };
203
+ };
204
+ };
205
+ const windowA = await pool.acquire(config, connectorCapturingElicit(sink), {
206
+ onElicit: handlerFor("A"),
207
+ });
208
+ const windowB = await pool.acquire(config, connectorCapturingElicit(sink), {
209
+ onElicit: handlerFor("B"),
210
+ });
211
+ // Only window B is mid-call, so only B's window should see the form.
212
+ const endB = windowB.beginCall();
213
+ const result = await sink.onElicit(request);
214
+ endB();
215
+ expect(seen).toEqual(["B"]);
216
+ expect(result).toEqual({ action: "accept", content: { id: "B" } });
217
+ await windowA.release();
218
+ await windowB.release();
219
+ });
220
+ /** Guessing would show one project's consent form in another's window. */
221
+ it("cancels rather than guessing when two sessions are calling at once", async () => {
222
+ const pool = newPool();
223
+ const sink = {};
224
+ let prompted = 0;
225
+ const handler = async () => {
226
+ prompted++;
227
+ return { action: "accept", content: {} };
228
+ };
229
+ const windowA = await pool.acquire(config, connectorCapturingElicit(sink), {
230
+ onElicit: handler,
231
+ });
232
+ const windowB = await pool.acquire(config, connectorCapturingElicit(sink), {
233
+ onElicit: handler,
234
+ });
235
+ const endA = windowA.beginCall();
236
+ const endB = windowB.beginCall();
237
+ expect(await sink.onElicit(request)).toEqual({ action: "cancel" });
238
+ expect(prompted).toBe(0);
239
+ endA();
240
+ endB();
241
+ await windowA.release();
242
+ await windowB.release();
243
+ });
244
+ it("cancels an unsolicited prompt that belongs to no call", async () => {
245
+ const pool = newPool();
246
+ const sink = {};
247
+ const handle = await pool.acquire(config, connectorCapturingElicit(sink), {
248
+ onElicit: async () => ({ action: "accept", content: {} }),
249
+ });
250
+ expect(await sink.onElicit(request)).toEqual({ action: "cancel" });
251
+ await handle.release();
252
+ });
253
+ /**
254
+ * A connection declares its elicitation capability once, at initialize, and
255
+ * servers use that to decide whether to ask at all. So a headless caller
256
+ * (CLI, JSON mode) gets its OWN connection that declares nothing, rather
257
+ * than sharing one that promises prompting it cannot deliver.
258
+ */
259
+ it("separates headless callers from windowed ones, and declares no handler for them", async () => {
260
+ const pool = newPool();
261
+ const headlessSink = {};
262
+ const windowedSink = {};
263
+ const headless = await pool.acquire(config, connectorCapturingElicit(headlessSink), {});
264
+ const windowed = await pool.acquire(config, connectorCapturingElicit(windowedSink), {
265
+ onElicit: async () => ({ action: "accept", content: { from: "window" } }),
266
+ });
267
+ expect(pool.size).toBe(2);
268
+ // No dispatcher on the headless connection => it declares no capability.
269
+ expect(headlessSink.onElicit).toBeUndefined();
270
+ expect(windowedSink.onElicit).toBeDefined();
271
+ const end = windowed.beginCall();
272
+ expect(await windowedSink.onElicit(request)).toEqual({
273
+ action: "accept",
274
+ content: { from: "window" },
275
+ });
276
+ end();
277
+ await headless.release();
278
+ await windowed.release();
279
+ });
280
+ });
281
+ it("keeps distinct configs and protocol eras in separate entries", async () => {
282
+ const pool = newPool();
283
+ const log = [];
284
+ const factory = () => fakeConnector(log);
285
+ await pool.acquire(config, factory);
286
+ await pool.acquire({ ...config, args: ["--different"] }, factory);
287
+ await pool.acquire(config, factory, { modernProtocol: true });
288
+ expect(pool.size).toBe(3);
289
+ });
290
+ });
291
+ /**
292
+ * The user-visible claim: two sessions on one machine share ONE child process,
293
+ * and that process outlives the first session's dispose. Counted in `ps`,
294
+ * because a refcount in memory is not what was costing 43 MB per session.
295
+ */
296
+ describe.skipIf(process.platform === "win32")("shared servers across two sessions (real child process)", () => {
297
+ it("spawns one process for two sessions and kills it only after both dispose", async () => {
298
+ const config = sharedFixture();
299
+ const pool = newPool();
300
+ const sessionA = session(pool);
301
+ const sessionB = session(pool);
302
+ const resultA = await sessionA.connectAllDetailed([config]);
303
+ const resultB = await sessionB.connectAllDetailed([config]);
304
+ // Both sessions get working tools...
305
+ expect(resultA[0]?.ok).toBe(true);
306
+ expect(resultB[0]?.ok).toBe(true);
307
+ expect(resultA[0]?.tools.map((t) => t.name)).toEqual(["mcp__shared-fixture__echo"]);
308
+ expect(resultB[0]?.tools.map((t) => t.name)).toEqual(["mcp__shared-fixture__echo"]);
309
+ // ...from a single child process.
310
+ expect(processCount(config)).toBe(1);
311
+ expect(pool.refCount(config)).toBe(2);
312
+ // A tool call still works through the shared connection.
313
+ const echo = await resultB[0].tools[0].execute({ text: "hello" }, toolContext());
314
+ expect(echo).toBe("hello");
315
+ // First session leaving must not take the other session's server with it.
316
+ await sessionA.dispose();
317
+ expect(processCount(config)).toBe(1);
318
+ expect(pool.refCount(config)).toBe(1);
319
+ // Last one out turns off the lights.
320
+ await sessionB.dispose();
321
+ await waitForProcessExit(config);
322
+ expect(processCount(config)).toBe(0);
323
+ expect(pool.size).toBe(0);
324
+ }, 40_000);
325
+ /** Opted-out servers must keep per-session isolation. */
326
+ it("still gives each session its own process when the server opts out", async () => {
327
+ const config = sharedFixture({ shared: false });
328
+ const pool = newPool();
329
+ await session(pool).connectAllDetailed([config]);
330
+ await session(pool).connectAllDetailed([config]);
331
+ expect(processCount(config)).toBe(2);
332
+ expect(pool.size).toBe(0);
333
+ }, 40_000);
334
+ /**
335
+ * A pooled child that dies must not become a permanent daemon-wide outage.
336
+ *
337
+ * Stdio servers have no in-call recovery on purpose (`canRecoverSession`
338
+ * excludes them: respawning a child mid-call would be a surprise). Before
339
+ * pooling, a crash broke the one session that owned it. Shared, the same
340
+ * crash would break every holder AND every session that connects later,
341
+ * because the pool would keep handing out the corpse. The connection must
342
+ * therefore retire itself on close.
343
+ */
344
+ it("retires a shared connection whose server dies, so the next session reconnects", async () => {
345
+ const config = sharedFixture();
346
+ const pool = newPool();
347
+ const first = session(pool);
348
+ const [connected] = await first.connectAllDetailed([config]);
349
+ expect(connected?.ok).toBe(true);
350
+ expect(pool.size).toBe(1);
351
+ // Kill the child out from under the pool, exactly like a crash. Located
352
+ // with `ps` rather than `pgrep`, whose BSD build reads this fixture's
353
+ // leading `--` marker as an illegal option.
354
+ const marker = config.args.find((arg) => arg.startsWith("--gg-marker="));
355
+ const row = execFileSync("ps", ["-eo", "pid,command"], { encoding: "utf8" })
356
+ .split("\n")
357
+ .find((line) => line.includes(marker));
358
+ expect(row, "the shared child should be running").toBeDefined();
359
+ process.kill(Number(row.trim().split(/\s+/)[0]), "SIGKILL");
360
+ // Give the transport's close event a moment to propagate.
361
+ const deadline = Date.now() + 5000;
362
+ while (pool.size > 0 && Date.now() < deadline) {
363
+ await new Promise((resolve) => setTimeout(resolve, 25));
364
+ }
365
+ // The dead entry is gone rather than cached forever...
366
+ expect(pool.size).toBe(0);
367
+ // ...so a session connecting afterwards gets a working server again.
368
+ const second = session(pool);
369
+ const [reconnected] = await second.connectAllDetailed([config]);
370
+ expect(reconnected?.ok).toBe(true);
371
+ expect(processCount(config)).toBe(1);
372
+ const echo = await reconnected.tools[0].execute({ text: "alive" }, toolContext());
373
+ expect(echo).toBe("alive");
374
+ }, 40_000);
375
+ /**
376
+ * End-to-end proof of the mechanism that makes default-on sharing safe: a
377
+ * REAL server elicits mid tool call over a connection two sessions share,
378
+ * and the prompt reaches the window that made the call — not the other one.
379
+ */
380
+ it("routes a real server's mid-call prompt to the calling session's window", async () => {
381
+ const config = {
382
+ name: "elicit-fixture",
383
+ command: process.execPath,
384
+ args: [ELICIT_FIXTURE, `--gg-marker=${crypto.randomUUID()}`],
385
+ timeout: 10_000,
386
+ };
387
+ const pool = newPool();
388
+ const prompted = [];
389
+ const windowed = (id) => {
390
+ const instance = new MCPClientManager({
391
+ catalogCache: new McpCatalogCache(cachePath),
392
+ sharedPool: pool,
393
+ modernProtocol: true,
394
+ onElicit: async () => {
395
+ prompted.push(id);
396
+ return { action: "accept", content: { name: id } };
397
+ },
398
+ });
399
+ managers.push(instance);
400
+ return instance;
401
+ };
402
+ const sessionA = windowed("window-A");
403
+ const sessionB = windowed("window-B");
404
+ const [connectedA] = await sessionA.connectAllDetailed([config]);
405
+ await sessionB.connectAllDetailed([config]);
406
+ // One shared child serves both windows.
407
+ expect(processCount(config)).toBe(1);
408
+ // Window A makes the call, so window A must be the one that is asked.
409
+ const ask = connectedA.tools.find((tool) => tool.name.endsWith("__ask"));
410
+ const answer = await ask.execute({}, toolContext());
411
+ expect(prompted).toEqual(["window-A"]);
412
+ expect(answer).toContain("window-A");
413
+ expect(answer).toContain("accept");
414
+ }, 40_000);
415
+ });
416
+ /** Child exit is asynchronous after `close()`; poll briefly rather than sleep. */
417
+ async function waitForProcessExit(config, timeoutMs = 10_000) {
418
+ const deadline = Date.now() + timeoutMs;
419
+ while (Date.now() < deadline) {
420
+ if (processCount(config) === 0)
421
+ return;
422
+ await new Promise((resolve) => setTimeout(resolve, 100));
423
+ }
424
+ }
425
+ //# sourceMappingURL=shared-pool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-pool.test.js","sourceRoot":"","sources":["../../../src/core/mcp/shared-pool.test.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,18 @@ export interface MCPServerConfig {
11
11
  env?: Record<string, string>;
12
12
  timeout?: number;
13
13
  enabled?: boolean;
14
+ /**
15
+ * Opt OUT of connection sharing. Defaults to true for stdio servers, so one
16
+ * child process serves every session in the daemon rather than one per
17
+ * window (see core/mcp/shared-pool.ts).
18
+ *
19
+ * Set `false` for a server that keeps per-CALLER state across requests — a
20
+ * cursor, a selected workspace, an open handle — where multiplexing two
21
+ * sessions over one connection would let one session's state change the
22
+ * other's answers. Sharing is already skipped for HTTP servers, whose auth
23
+ * and session id are per-connection.
24
+ */
25
+ shared?: boolean;
14
26
  /** Explicit HTTP transport hint. "http" tries Streamable HTTP first (SSE
15
27
  * fallback); "sse" connects via the legacy SSE transport directly. When
16
28
  * unset, both are tried (Streamable HTTP → SSE). */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;yDAEqD;IACrD,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC5B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;yDAEqD;IACrD,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC5B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kenkaiiii/ggcoder",
3
- "version": "5.34.2",
3
+ "version": "5.35.0",
4
4
  "type": "module",
5
5
  "description": "CLI coding agent with OAuth authentication for Anthropic, OpenAI, and Gemini",
6
6
  "license": "MIT",
@@ -115,9 +115,9 @@
115
115
  "typescript-language-server": "^5.3.0",
116
116
  "wrap-ansi": "^10.0.0",
117
117
  "zod": "^4.4.3",
118
- "@kenkaiiii/gg-agent": "5.34.2",
119
- "@kenkaiiii/gg-ai": "5.34.2",
120
- "@kenkaiiii/gg-core": "5.34.2"
118
+ "@kenkaiiii/gg-agent": "5.35.0",
119
+ "@kenkaiiii/gg-ai": "5.35.0",
120
+ "@kenkaiiii/gg-core": "5.35.0"
121
121
  },
122
122
  "optionalDependencies": {
123
123
  "@huggingface/transformers": "^3.6.0",