@kenkaiiii/ggcoder 5.23.3 → 5.24.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.js +32 -0
- package/dist/app-sidecar.js.map +1 -1
- package/dist/core/agent-session-add-dir.test.d.ts +2 -0
- package/dist/core/agent-session-add-dir.test.d.ts.map +1 -0
- package/dist/core/agent-session-add-dir.test.js +94 -0
- package/dist/core/agent-session-add-dir.test.js.map +1 -0
- package/dist/core/agent-session.d.ts +21 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +62 -4
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/network-guard.d.ts +47 -0
- package/dist/core/network-guard.d.ts.map +1 -0
- package/dist/core/network-guard.js +208 -0
- package/dist/core/network-guard.js.map +1 -0
- package/dist/core/network-guard.test.d.ts +2 -0
- package/dist/core/network-guard.test.d.ts.map +1 -0
- package/dist/core/network-guard.test.js +72 -0
- package/dist/core/network-guard.test.js.map +1 -0
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +55 -36
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/prompt-commands.test.js +49 -2
- package/dist/core/prompt-commands.test.js.map +1 -1
- package/dist/core/session-export.d.ts +98 -0
- package/dist/core/session-export.d.ts.map +1 -0
- package/dist/core/session-export.js +356 -0
- package/dist/core/session-export.js.map +1 -0
- package/dist/core/session-export.test.d.ts +2 -0
- package/dist/core/session-export.test.d.ts.map +1 -0
- package/dist/core/session-export.test.js +353 -0
- package/dist/core/session-export.test.js.map +1 -0
- package/dist/core/settings-manager.d.ts +5 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +10 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts +10 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +16 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/slash-commands.test.d.ts +2 -0
- package/dist/core/slash-commands.test.d.ts.map +1 -0
- package/dist/core/slash-commands.test.js +48 -0
- package/dist/core/slash-commands.test.js.map +1 -0
- package/dist/core/workspace-guard.d.ts +2 -0
- package/dist/core/workspace-guard.d.ts.map +1 -1
- package/dist/core/workspace-guard.js +4 -1
- package/dist/core/workspace-guard.js.map +1 -1
- package/dist/core/workspace-guard.test.js +21 -0
- package/dist/core/workspace-guard.test.js.map +1 -1
- package/dist/system-prompt.d.ts +11 -1
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +19 -4
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.js +9 -0
- package/dist/system-prompt.test.js.map +1 -1
- package/dist/tools/bash.d.ts +2 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +9 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/bash.test.js +19 -0
- package/dist/tools/bash.test.js.map +1 -1
- package/dist/tools/grep.d.ts +3 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +132 -10
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/grep.test.js +53 -0
- package/dist/tools/grep.test.js.map +1 -1
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +2 -1
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +17 -6
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-fetch.test.js +34 -0
- package/dist/tools/web-fetch.test.js.map +1 -1
- package/dist/tools/web-search.d.ts +2 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +21 -5
- package/dist/tools/web-search.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-session-add-dir.test.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-add-dir.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { useFakeHome } from "../test-support/fake-home.js";
|
|
6
|
+
vi.mock("@kenkaiiii/gg-agent", async () => {
|
|
7
|
+
const actual = await vi.importActual("@kenkaiiii/gg-agent");
|
|
8
|
+
return { ...actual, agentLoop: vi.fn(() => (async function* emptyLoop() { })()) };
|
|
9
|
+
});
|
|
10
|
+
vi.mock("./mcp/index.js", async () => {
|
|
11
|
+
const actual = await vi.importActual("./mcp/index.js");
|
|
12
|
+
return {
|
|
13
|
+
...actual,
|
|
14
|
+
MCPClientManager: vi.fn(function MCPClientManagerMock() {
|
|
15
|
+
return { connectAll: vi.fn(async () => []), dispose: vi.fn(async () => { }) };
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
let restoreHome;
|
|
20
|
+
let tempHome;
|
|
21
|
+
let tempProject;
|
|
22
|
+
let sibling;
|
|
23
|
+
beforeEach(async () => {
|
|
24
|
+
tempHome = await fs.mkdtemp(path.join(os.tmpdir(), "add-dir-home-"));
|
|
25
|
+
tempProject = await fs.mkdtemp(path.join(os.tmpdir(), "add-dir-project-"));
|
|
26
|
+
sibling = await fs.mkdtemp(path.join(os.tmpdir(), "add-dir-sibling-"));
|
|
27
|
+
restoreHome = useFakeHome(tempHome);
|
|
28
|
+
await fs.mkdir(path.join(tempHome, ".gg"), { recursive: true });
|
|
29
|
+
await fs.writeFile(path.join(tempHome, ".gg", "auth.json"), JSON.stringify({
|
|
30
|
+
anthropic: {
|
|
31
|
+
accessToken: "test-access",
|
|
32
|
+
refreshToken: "test-refresh",
|
|
33
|
+
expiresAt: Date.now() + 3_600_000,
|
|
34
|
+
},
|
|
35
|
+
}));
|
|
36
|
+
});
|
|
37
|
+
afterEach(async () => {
|
|
38
|
+
restoreHome?.();
|
|
39
|
+
await Promise.all([
|
|
40
|
+
fs.rm(tempHome, { recursive: true, force: true }),
|
|
41
|
+
fs.rm(tempProject, { recursive: true, force: true }),
|
|
42
|
+
fs.rm(sibling, { recursive: true, force: true }),
|
|
43
|
+
]);
|
|
44
|
+
vi.clearAllMocks();
|
|
45
|
+
});
|
|
46
|
+
async function createSession() {
|
|
47
|
+
const { AgentSession } = await import("./agent-session.js");
|
|
48
|
+
const session = new AgentSession({
|
|
49
|
+
provider: "anthropic",
|
|
50
|
+
model: "claude-test",
|
|
51
|
+
cwd: tempProject,
|
|
52
|
+
transient: true,
|
|
53
|
+
projectCustomization: false,
|
|
54
|
+
loadExtensions: false,
|
|
55
|
+
orchestrationPrompt: false,
|
|
56
|
+
selfCorrectionHooks: false,
|
|
57
|
+
});
|
|
58
|
+
await session.initialize();
|
|
59
|
+
return session;
|
|
60
|
+
}
|
|
61
|
+
describe("AgentSession.addDirectory", () => {
|
|
62
|
+
it("adds a root and names it in the rebuilt system prompt", async () => {
|
|
63
|
+
const session = await createSession();
|
|
64
|
+
try {
|
|
65
|
+
expect(session.getAdditionalRoots()).toEqual([]);
|
|
66
|
+
const result = await session.addDirectory(sibling);
|
|
67
|
+
expect(result).toEqual({ ok: true, root: path.resolve(sibling) });
|
|
68
|
+
expect(session.getAdditionalRoots()).toEqual([path.resolve(sibling)]);
|
|
69
|
+
const systemPrompt = String(session.getMessages()[0]?.content ?? "");
|
|
70
|
+
expect(systemPrompt).toContain("Additional roots:");
|
|
71
|
+
expect(systemPrompt).toContain(session.getAdditionalRoots()[0]);
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
await session.dispose();
|
|
75
|
+
}
|
|
76
|
+
}, 20_000);
|
|
77
|
+
it("rejects a file, a missing path, and a duplicate", async () => {
|
|
78
|
+
const session = await createSession();
|
|
79
|
+
try {
|
|
80
|
+
const file = path.join(sibling, "a.txt");
|
|
81
|
+
await fs.writeFile(file, "x");
|
|
82
|
+
expect(await session.addDirectory(file)).toMatchObject({ ok: false });
|
|
83
|
+
expect(await session.addDirectory(path.join(sibling, "nope"))).toMatchObject({ ok: false });
|
|
84
|
+
expect(await session.addDirectory(tempProject)).toMatchObject({ ok: false });
|
|
85
|
+
expect(await session.addDirectory(sibling)).toMatchObject({ ok: true });
|
|
86
|
+
expect(await session.addDirectory(sibling)).toMatchObject({ ok: false });
|
|
87
|
+
expect(session.getAdditionalRoots()).toHaveLength(1);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
await session.dispose();
|
|
91
|
+
}
|
|
92
|
+
}, 20_000);
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=agent-session-add-dir.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-session-add-dir.test.js","sourceRoot":"","sources":["../../src/core/agent-session-add-dir.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -217,6 +217,8 @@ export declare class AgentSession {
|
|
|
217
217
|
* set, the system prompt carries the `[DONE:n]` progress contract so the
|
|
218
218
|
* model emits step-completion markers the UI's plan-progress widget reads. */
|
|
219
219
|
private approvedPlanPath?;
|
|
220
|
+
/** Extra workspace roots added with `/add-dir` (resolved, de-duplicated). */
|
|
221
|
+
private additionalRoots;
|
|
220
222
|
private sessionId;
|
|
221
223
|
/** Stable identity shared by compaction and approved-plan checkpoint files. */
|
|
222
224
|
private conversationId;
|
|
@@ -398,6 +400,25 @@ export declare class AgentSession {
|
|
|
398
400
|
* custom system prompt is in force (the host owns the prompt then).
|
|
399
401
|
*/
|
|
400
402
|
setApprovedPlan(approvedPlanPath: string | undefined): Promise<void>;
|
|
403
|
+
/** Extra workspace roots added with `/add-dir`, in the order added. */
|
|
404
|
+
getAdditionalRoots(): string[];
|
|
405
|
+
/**
|
|
406
|
+
* Add another workspace root. Tools already accept absolute paths, so this
|
|
407
|
+
* only widens the write guard and tells the model the root exists. Rebuilding
|
|
408
|
+
* the system prompt costs one cache-miss turn — the alternative (an uncached
|
|
409
|
+
* suffix) would drift from the tool behaviour it describes.
|
|
410
|
+
*
|
|
411
|
+
* @returns the resolved root, or an error message for the user.
|
|
412
|
+
*/
|
|
413
|
+
addDirectory(dir: string): Promise<{
|
|
414
|
+
ok: true;
|
|
415
|
+
root: string;
|
|
416
|
+
} | {
|
|
417
|
+
ok: false;
|
|
418
|
+
error: string;
|
|
419
|
+
}>;
|
|
420
|
+
/** Environment facts that vary per session rather than per host. */
|
|
421
|
+
private promptEnvironment;
|
|
401
422
|
/** Rebuild messages[0] from current plan-mode + approved-plan state. */
|
|
402
423
|
private rebuildSystemPromptInPlace;
|
|
403
424
|
private withSystemPromptTail;
|
|
@@ -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;AAoB9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAW9D,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,7 @@ import { findUserSessionPrompt, getUserSessionPrompt } from "./session-preview.j
|
|
|
37
37
|
import { normalizeMessageImages } from "./message-images.js";
|
|
38
38
|
import crypto from "node:crypto";
|
|
39
39
|
import fs from "node:fs/promises";
|
|
40
|
+
import os from "node:os";
|
|
40
41
|
import path from "node:path";
|
|
41
42
|
// ── Tool-result policy ─────────────────────────────────────
|
|
42
43
|
/** Resolve the per-result cap passed to the agent loop for the active transport. */
|
|
@@ -158,6 +159,8 @@ export class AgentSession {
|
|
|
158
159
|
* set, the system prompt carries the `[DONE:n]` progress contract so the
|
|
159
160
|
* model emits step-completion markers the UI's plan-progress widget reads. */
|
|
160
161
|
approvedPlanPath;
|
|
162
|
+
/** Extra workspace roots added with `/add-dir` (resolved, de-duplicated). */
|
|
163
|
+
additionalRoots = [];
|
|
161
164
|
sessionId = "";
|
|
162
165
|
/** Stable identity shared by compaction and approved-plan checkpoint files. */
|
|
163
166
|
conversationId = "";
|
|
@@ -259,6 +262,11 @@ export class AgentSession {
|
|
|
259
262
|
lspDiagnostics: this.settingsManager.get("lspDiagnostics"),
|
|
260
263
|
getWriteGuardSettings: () => ({
|
|
261
264
|
allowOutsideWorkspaceWrites: this.settingsManager.get("allowOutsideWorkspaceWrites"),
|
|
265
|
+
additionalRoots: this.additionalRoots,
|
|
266
|
+
}),
|
|
267
|
+
getNetworkPolicy: () => ({
|
|
268
|
+
mode: this.settingsManager.get("networkMode"),
|
|
269
|
+
allow: this.settingsManager.get("networkAllow"),
|
|
262
270
|
}),
|
|
263
271
|
authStorage: this.authStorage,
|
|
264
272
|
onFileRead: (filePath) => this.reviewCoverage.recordRead(filePath),
|
|
@@ -313,7 +321,7 @@ export class AgentSession {
|
|
|
313
321
|
await this.connectMcpServers();
|
|
314
322
|
}
|
|
315
323
|
const basePrompt = this.customSystemPrompt ??
|
|
316
|
-
(await buildSystemPrompt(this.cwd, this.skills, false, undefined, this.tools.map((tool) => tool.name), undefined, this.provider));
|
|
324
|
+
(await buildSystemPrompt(this.cwd, this.skills, false, undefined, this.tools.map((tool) => tool.name), undefined, this.provider, this.promptEnvironment()));
|
|
317
325
|
this.baseSystemPrompt = basePrompt;
|
|
318
326
|
this.messages = [{ role: "system", content: this.withSystemPromptTail(basePrompt) }];
|
|
319
327
|
this.syncUltraOrchestrationPrompt();
|
|
@@ -1200,7 +1208,10 @@ export class AgentSession {
|
|
|
1200
1208
|
}
|
|
1201
1209
|
else if (this.provider !== "anthropic" && !hasWebSearch) {
|
|
1202
1210
|
// Switching FROM anthropic — add client-side web_search
|
|
1203
|
-
this.tools.push(createWebSearchTool()
|
|
1211
|
+
this.tools.push(createWebSearchTool(() => ({
|
|
1212
|
+
mode: this.settingsManager.get("networkMode"),
|
|
1213
|
+
allow: this.settingsManager.get("networkAllow"),
|
|
1214
|
+
})));
|
|
1204
1215
|
}
|
|
1205
1216
|
// Reconnect MCP servers ONLY when GLM is involved on either side — GLM
|
|
1206
1217
|
// is the only provider with a different server set (Z.AI tools), so a
|
|
@@ -1336,7 +1347,7 @@ export class AgentSession {
|
|
|
1336
1347
|
this.appMarkers = [];
|
|
1337
1348
|
this.turnMetrics = [];
|
|
1338
1349
|
const basePrompt = this.customSystemPrompt ??
|
|
1339
|
-
(await buildSystemPrompt(this.cwd, this.skills, false, undefined, this.tools.map((tool) => tool.name), undefined, this.provider));
|
|
1350
|
+
(await buildSystemPrompt(this.cwd, this.skills, false, undefined, this.tools.map((tool) => tool.name), undefined, this.provider, this.promptEnvironment()));
|
|
1340
1351
|
this.baseSystemPrompt = basePrompt;
|
|
1341
1352
|
this.messages = [{ role: "system", content: this.withSystemPromptTail(basePrompt) }];
|
|
1342
1353
|
this.syncUltraOrchestrationPrompt();
|
|
@@ -1513,11 +1524,56 @@ export class AgentSession {
|
|
|
1513
1524
|
this.approvedPlanPath = approvedPlanPath;
|
|
1514
1525
|
await this.rebuildSystemPromptInPlace();
|
|
1515
1526
|
}
|
|
1527
|
+
/** Extra workspace roots added with `/add-dir`, in the order added. */
|
|
1528
|
+
getAdditionalRoots() {
|
|
1529
|
+
return [...this.additionalRoots];
|
|
1530
|
+
}
|
|
1531
|
+
/**
|
|
1532
|
+
* Add another workspace root. Tools already accept absolute paths, so this
|
|
1533
|
+
* only widens the write guard and tells the model the root exists. Rebuilding
|
|
1534
|
+
* the system prompt costs one cache-miss turn — the alternative (an uncached
|
|
1535
|
+
* suffix) would drift from the tool behaviour it describes.
|
|
1536
|
+
*
|
|
1537
|
+
* @returns the resolved root, or an error message for the user.
|
|
1538
|
+
*/
|
|
1539
|
+
async addDirectory(dir) {
|
|
1540
|
+
const resolved = path.resolve(this.cwd, dir.replace(/^~(?=[/\\]|$)/, os.homedir()));
|
|
1541
|
+
let stat;
|
|
1542
|
+
try {
|
|
1543
|
+
stat = await fs.stat(resolved);
|
|
1544
|
+
}
|
|
1545
|
+
catch {
|
|
1546
|
+
return { ok: false, error: `Not found: ${resolved}` };
|
|
1547
|
+
}
|
|
1548
|
+
if (!stat.isDirectory())
|
|
1549
|
+
return { ok: false, error: `Not a directory: ${resolved}` };
|
|
1550
|
+
const covered = [this.cwd, ...this.additionalRoots].some((root) => {
|
|
1551
|
+
const relative = path.relative(path.resolve(root), resolved);
|
|
1552
|
+
return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
1553
|
+
});
|
|
1554
|
+
if (covered)
|
|
1555
|
+
return { ok: false, error: `Already in the workspace: ${resolved}` };
|
|
1556
|
+
// Drop roots the new one subsumes so the list stays minimal.
|
|
1557
|
+
this.additionalRoots = this.additionalRoots.filter((root) => {
|
|
1558
|
+
const relative = path.relative(resolved, path.resolve(root));
|
|
1559
|
+
return relative.startsWith("..") || path.isAbsolute(relative);
|
|
1560
|
+
});
|
|
1561
|
+
this.additionalRoots.push(resolved);
|
|
1562
|
+
await this.rebuildSystemPromptInPlace();
|
|
1563
|
+
return { ok: true, root: resolved };
|
|
1564
|
+
}
|
|
1565
|
+
/** Environment facts that vary per session rather than per host. */
|
|
1566
|
+
promptEnvironment() {
|
|
1567
|
+
const networkAllow = this.settingsManager.get("networkMode") === "allowlist"
|
|
1568
|
+
? this.settingsManager.get("networkAllow")
|
|
1569
|
+
: [];
|
|
1570
|
+
return { additionalRoots: this.additionalRoots, networkAllow };
|
|
1571
|
+
}
|
|
1516
1572
|
/** Rebuild messages[0] from current plan-mode + approved-plan state. */
|
|
1517
1573
|
async rebuildSystemPromptInPlace() {
|
|
1518
1574
|
if (this.customSystemPrompt)
|
|
1519
1575
|
return;
|
|
1520
|
-
const rebuilt = await buildSystemPrompt(this.cwd, this.skills, this.planModeRef.current, this.approvedPlanPath, this.tools.map((tool) => tool.name), undefined, this.provider);
|
|
1576
|
+
const rebuilt = await buildSystemPrompt(this.cwd, this.skills, this.planModeRef.current, this.approvedPlanPath, this.tools.map((tool) => tool.name), undefined, this.provider, this.promptEnvironment());
|
|
1521
1577
|
this.baseSystemPrompt = rebuilt;
|
|
1522
1578
|
const content = this.withSystemPromptTail(rebuilt);
|
|
1523
1579
|
if (this.messages[0]?.role === "system") {
|
|
@@ -2026,6 +2082,8 @@ export class AgentSession {
|
|
|
2026
2082
|
const lines = branches.map((b, i) => ` ${i + 1}. ${b.leafId.slice(0, 8)} — ${b.entryCount} entries (${b.leafId === this.currentLeafId ? "active" : "inactive"})`);
|
|
2027
2083
|
return `${branches.length} branch(es):\n${lines.join("\n")}`;
|
|
2028
2084
|
},
|
|
2085
|
+
addDirectory: (dir) => this.addDirectory(dir),
|
|
2086
|
+
getAdditionalRoots: () => this.getAdditionalRoots(),
|
|
2029
2087
|
};
|
|
2030
2088
|
}
|
|
2031
2089
|
}
|