@kenkaiiii/ggcoder 5.19.1 → 5.19.2
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 +4 -0
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-session-compaction.test.js +9 -6
- package/dist/core/agent-session-compaction.test.js.map +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +4 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compactor.d.ts +1 -1
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +10 -5
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +23 -4
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/compaction/token-estimator.d.ts +25 -1
- package/dist/core/compaction/token-estimator.d.ts.map +1 -1
- package/dist/core/compaction/token-estimator.js +86 -1
- package/dist/core/compaction/token-estimator.js.map +1 -1
- package/dist/core/compaction/token-estimator.test.js +147 -1
- package/dist/core/compaction/token-estimator.test.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/settings-manager.js +2 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/tools/bash.d.ts +9 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +28 -18
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/bash.test.d.ts +2 -0
- package/dist/tools/bash.test.d.ts.map +1 -0
- package/dist/tools/bash.test.js +56 -0
- package/dist/tools/bash.test.js.map +1 -0
- package/dist/tools/overflow.d.ts +12 -2
- package/dist/tools/overflow.d.ts.map +1 -1
- package/dist/tools/overflow.js +49 -4
- package/dist/tools/overflow.js.map +1 -1
- package/dist/tools/overflow.test.d.ts +2 -0
- package/dist/tools/overflow.test.d.ts.map +1 -0
- package/dist/tools/overflow.test.js +62 -0
- package/dist/tools/overflow.test.js.map +1 -0
- package/dist/ui/hooks/useContextCompaction.d.ts.map +1 -1
- package/dist/ui/hooks/useContextCompaction.js +5 -2
- package/dist/ui/hooks/useContextCompaction.js.map +1 -1
- package/dist/ui/hooks/useContextCompaction.test.js +15 -0
- package/dist/ui/hooks/useContextCompaction.test.js.map +1 -1
- package/package.json +4 -4
package/dist/tools/bash.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { killProcessTree } from "../utils/process.js";
|
|
3
|
-
import { truncateTail } from "./truncate.js";
|
|
3
|
+
import { truncateTail, MAX_BYTES } from "./truncate.js";
|
|
4
4
|
import { compressToolOutput } from "./compress.js";
|
|
5
5
|
import { writeOverflow } from "./overflow.js";
|
|
6
6
|
import { localOperations } from "./operations.js";
|
|
@@ -11,6 +11,27 @@ import { isReadOnlyCommand } from "./read-only-bash.js";
|
|
|
11
11
|
import { isPlanModeActive, planModeRestriction } from "../core/runtime-mode.js";
|
|
12
12
|
const DEFAULT_TIMEOUT = 120_000; // 120 seconds
|
|
13
13
|
const MAX_OUTPUT_BYTES = 10 * 1024 * 1024; // 10 MB — cap buffered output to prevent OOM
|
|
14
|
+
/**
|
|
15
|
+
* Render command output for the tool result. Over-limit output is compressed
|
|
16
|
+
* (keeps errors + head/tail, collapses repeats) rather than blindly
|
|
17
|
+
* tail-sliced, and the raw output is offloaded to `~/.gg/tool-output/` so the
|
|
18
|
+
* model can recover the lost portion with `read --offset` instead of
|
|
19
|
+
* re-running the command. The offload is best-effort — a full disk or
|
|
20
|
+
* permission error never fails the tool result.
|
|
21
|
+
*/
|
|
22
|
+
export async function renderBashOutput(rawOutput) {
|
|
23
|
+
const result = truncateTail(rawOutput);
|
|
24
|
+
if (!result.truncated)
|
|
25
|
+
return result.content;
|
|
26
|
+
const overflowPath = Buffer.byteLength(rawOutput, "utf-8") > MAX_BYTES
|
|
27
|
+
? await writeOverflow(rawOutput, "bash").catch(() => null)
|
|
28
|
+
: null;
|
|
29
|
+
const overflowNotice = overflowPath
|
|
30
|
+
? ` Full output saved to ${overflowPath} — read it with offset/limit if needed.`
|
|
31
|
+
: "";
|
|
32
|
+
const c = compressToolOutput(rawOutput);
|
|
33
|
+
return `[${c.notice}${overflowNotice}]\n${c.content}`;
|
|
34
|
+
}
|
|
14
35
|
const BashParams = z.object({
|
|
15
36
|
command: z.string().describe("The bash command to execute"),
|
|
16
37
|
timeout: z
|
|
@@ -61,11 +82,11 @@ export function createBashTool(cwd, processManager, ops = localOperations, planM
|
|
|
61
82
|
const res = await sessionShell.run(command, timeoutMs ?? DEFAULT_TIMEOUT, context.signal, context.onUpdate
|
|
62
83
|
? (text) => context.onUpdate?.({ type: "bash_progress", output: text, totalBytes: 0 })
|
|
63
84
|
: undefined);
|
|
64
|
-
const
|
|
85
|
+
const output = await renderBashOutput(res.output);
|
|
65
86
|
const exitCode = res.exitCode === "TIMEOUT"
|
|
66
87
|
? `TIMEOUT (${timeoutMs ?? DEFAULT_TIMEOUT}ms) — session shell was reset; cd/env state is gone`
|
|
67
88
|
: String(res.exitCode);
|
|
68
|
-
return `Exit code: ${exitCode}\n${
|
|
89
|
+
return `Exit code: ${exitCode}\n${output}`;
|
|
69
90
|
}
|
|
70
91
|
if (run_in_background) {
|
|
71
92
|
const result = await processManager.start(command, cwd);
|
|
@@ -132,22 +153,11 @@ export function createBashTool(cwd, processManager, ops = localOperations, planM
|
|
|
132
153
|
clearTimeout(timer);
|
|
133
154
|
context.signal.removeEventListener("abort", onAbort);
|
|
134
155
|
const rawOutput = Buffer.concat(chunks).toString("utf-8");
|
|
135
|
-
|
|
136
|
-
let output = result.content;
|
|
137
|
-
const capNotice = outputCapped
|
|
138
|
-
? `[Output capped at ${MAX_OUTPUT_BYTES / 1024 / 1024} MB to prevent memory exhaustion]\n`
|
|
139
|
-
: "";
|
|
156
|
+
let output = await renderBashOutput(rawOutput);
|
|
140
157
|
if (outputCapped) {
|
|
141
|
-
output =
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
// Over-limit: a blind tail slice would drop the head and any
|
|
145
|
-
// mid-stream error. Compress instead (keeps errors + head/tail,
|
|
146
|
-
// collapses repeats); the overflow file preserves the original.
|
|
147
|
-
const overflowPath = await writeOverflow(rawOutput, "bash").catch(() => null);
|
|
148
|
-
const overflowNotice = overflowPath ? ` Full output: ${overflowPath}` : "";
|
|
149
|
-
const c = compressToolOutput(rawOutput);
|
|
150
|
-
output = `${capNotice}[${c.notice}${overflowNotice}]\n${c.content}`;
|
|
158
|
+
output =
|
|
159
|
+
`[Output capped at ${MAX_OUTPUT_BYTES / 1024 / 1024} MB to prevent memory exhaustion]\n` +
|
|
160
|
+
output;
|
|
151
161
|
}
|
|
152
162
|
// Windows without Git Bash: commands ran under cmd.exe, NOT bash. Tell
|
|
153
163
|
// the model so it uses cmd syntax (no `ls`/`grep`/pipes/single-quotes)
|
package/dist/tools/bash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.test.d.ts","sourceRoot":"","sources":["../../src/tools/bash.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
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 { renderBashOutput } from "./bash.js";
|
|
6
|
+
import { getToolOutputRoot } from "./overflow.js";
|
|
7
|
+
let originalHome;
|
|
8
|
+
let tmpHome;
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
originalHome = process.env.HOME;
|
|
11
|
+
tmpHome = await fs.mkdtemp(path.join(os.tmpdir(), "bash-output-home-"));
|
|
12
|
+
process.env.HOME = tmpHome;
|
|
13
|
+
});
|
|
14
|
+
afterEach(async () => {
|
|
15
|
+
if (originalHome === undefined)
|
|
16
|
+
delete process.env.HOME;
|
|
17
|
+
else
|
|
18
|
+
process.env.HOME = originalHome;
|
|
19
|
+
await fs.rm(tmpHome, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
async function listSavedOutputs() {
|
|
22
|
+
const root = getToolOutputRoot();
|
|
23
|
+
try {
|
|
24
|
+
const days = await fs.readdir(root);
|
|
25
|
+
const files = await Promise.all(days.map(async (day) => (await fs.readdir(path.join(root, day))).map((name) => path.join(root, day, name))));
|
|
26
|
+
return files.flat();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
describe("renderBashOutput", () => {
|
|
33
|
+
it("saves full output and returns a recovery pointer when output exceeds 50KB", async () => {
|
|
34
|
+
const raw = Array.from({ length: 6_000 }, (_, index) => `benchmark-line-${index.toString().padStart(5, "0")}: ${"x".repeat(40)}`).join("\n");
|
|
35
|
+
const rendered = await renderBashOutput(raw);
|
|
36
|
+
const saved = await listSavedOutputs();
|
|
37
|
+
expect(saved).toHaveLength(1);
|
|
38
|
+
expect(rendered).toContain(`Full output saved to ${saved[0]}`);
|
|
39
|
+
expect(rendered).toContain("read it with offset/limit if needed");
|
|
40
|
+
expect(await fs.readFile(saved[0], "utf-8")).toBe(raw);
|
|
41
|
+
expect(rendered.length).toBeLessThan(raw.length);
|
|
42
|
+
});
|
|
43
|
+
it("does not create a pointer file for small output", async () => {
|
|
44
|
+
const raw = "build passed\n12 tests passed";
|
|
45
|
+
expect(await renderBashOutput(raw)).toBe(raw);
|
|
46
|
+
expect(await listSavedOutputs()).toEqual([]);
|
|
47
|
+
});
|
|
48
|
+
it("does not offload line-count-only truncation below 50KB", async () => {
|
|
49
|
+
const raw = Array.from({ length: 2_100 }, (_, index) => String(index)).join("\n");
|
|
50
|
+
expect(Buffer.byteLength(raw, "utf-8")).toBeLessThan(50 * 1024);
|
|
51
|
+
const rendered = await renderBashOutput(raw);
|
|
52
|
+
expect(rendered).not.toContain("Full output saved");
|
|
53
|
+
expect(await listSavedOutputs()).toEqual([]);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=bash.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.test.js","sourceRoot":"","sources":["../../src/tools/bash.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/overflow.d.ts
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
|
+
/** Root folder for recoverable full tool outputs: `~/.gg/tool-output/`. */
|
|
2
|
+
export declare function getToolOutputRoot(): string;
|
|
1
3
|
/**
|
|
2
|
-
* Write full content to
|
|
3
|
-
*
|
|
4
|
+
* Write full content to `~/.gg/tool-output/<yyyy-mm-dd>/<prefix>-<random>.txt`
|
|
5
|
+
* so truncated tool results stay recoverable via `read` with offset/limit
|
|
6
|
+
* instead of forcing the model to re-run the command.
|
|
7
|
+
* Returns the file path. Caller uses it in truncation notices; callers must
|
|
8
|
+
* treat failures as best-effort (never fail the tool result over a full disk).
|
|
4
9
|
*/
|
|
5
10
|
export declare function writeOverflow(content: string, prefix: string): Promise<string>;
|
|
11
|
+
/**
|
|
12
|
+
* Delete `~/.gg/tool-output/` date folders older than 48h. Best-effort:
|
|
13
|
+
* every failure is swallowed — cleanup must never delay or break startup.
|
|
14
|
+
*/
|
|
15
|
+
export declare function cleanupToolOutputs(maxAgeMs?: number): Promise<void>;
|
|
6
16
|
//# sourceMappingURL=overflow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overflow.d.ts","sourceRoot":"","sources":["../../src/tools/overflow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"overflow.d.ts","sourceRoot":"","sources":["../../src/tools/overflow.ts"],"names":[],"mappings":"AAQA,2EAA2E;AAC3E,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOpF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,SAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BzF"}
|
package/dist/tools/overflow.js
CHANGED
|
@@ -1,13 +1,58 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
|
-
import
|
|
2
|
+
import crypto from "node:crypto";
|
|
3
3
|
import path from "node:path";
|
|
4
|
+
import { getAppPaths } from "../config.js";
|
|
5
|
+
/** Overflow files older than this are deleted by cleanupToolOutputs(). */
|
|
6
|
+
const TOOL_OUTPUT_MAX_AGE_MS = 48 * 60 * 60 * 1000;
|
|
7
|
+
/** Root folder for recoverable full tool outputs: `~/.gg/tool-output/`. */
|
|
8
|
+
export function getToolOutputRoot() {
|
|
9
|
+
return path.join(getAppPaths().agentDir, "tool-output");
|
|
10
|
+
}
|
|
4
11
|
/**
|
|
5
|
-
* Write full content to
|
|
6
|
-
*
|
|
12
|
+
* Write full content to `~/.gg/tool-output/<yyyy-mm-dd>/<prefix>-<random>.txt`
|
|
13
|
+
* so truncated tool results stay recoverable via `read` with offset/limit
|
|
14
|
+
* instead of forcing the model to re-run the command.
|
|
15
|
+
* Returns the file path. Caller uses it in truncation notices; callers must
|
|
16
|
+
* treat failures as best-effort (never fail the tool result over a full disk).
|
|
7
17
|
*/
|
|
8
18
|
export async function writeOverflow(content, prefix) {
|
|
9
|
-
const
|
|
19
|
+
const day = new Date().toISOString().slice(0, 10);
|
|
20
|
+
const dir = path.join(getToolOutputRoot(), day);
|
|
21
|
+
await fs.mkdir(dir, { recursive: true });
|
|
22
|
+
const filePath = path.join(dir, `${prefix}-${crypto.randomBytes(6).toString("hex")}.txt`);
|
|
10
23
|
await fs.writeFile(filePath, content, { encoding: "utf-8", mode: 0o600 });
|
|
11
24
|
return filePath;
|
|
12
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Delete `~/.gg/tool-output/` date folders older than 48h. Best-effort:
|
|
28
|
+
* every failure is swallowed — cleanup must never delay or break startup.
|
|
29
|
+
*/
|
|
30
|
+
export async function cleanupToolOutputs(maxAgeMs = TOOL_OUTPUT_MAX_AGE_MS) {
|
|
31
|
+
const root = getToolOutputRoot();
|
|
32
|
+
let entries;
|
|
33
|
+
try {
|
|
34
|
+
entries = await fs.readdir(root, { withFileTypes: true });
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return; // Folder doesn't exist yet — nothing to clean.
|
|
38
|
+
}
|
|
39
|
+
const cutoff = Date.now() - maxAgeMs;
|
|
40
|
+
await Promise.all(entries.map(async (entry) => {
|
|
41
|
+
if (!entry.isDirectory())
|
|
42
|
+
return;
|
|
43
|
+
const dirPath = path.join(root, entry.name);
|
|
44
|
+
// Creating a new output updates the day folder's mtime, so it is the
|
|
45
|
+
// authoritative age of the newest file in that folder.
|
|
46
|
+
let newestMs;
|
|
47
|
+
try {
|
|
48
|
+
newestMs = (await fs.stat(dirPath)).mtimeMs;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (newestMs < cutoff) {
|
|
54
|
+
await fs.rm(dirPath, { recursive: true, force: true }).catch(() => { });
|
|
55
|
+
}
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
13
58
|
//# sourceMappingURL=overflow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overflow.js","sourceRoot":"","sources":["../../src/tools/overflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"overflow.js","sourceRoot":"","sources":["../../src/tools/overflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,0EAA0E;AAC1E,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnD,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,MAAc;IACjE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1F,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAQ,GAAG,sBAAsB;IACxE,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,+CAA+C;IACzD,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;IACrC,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC1B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,OAAO;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,qEAAqE;QACrE,uDAAuD;QACvD,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,GAAG,MAAM,EAAE,CAAC;YACtB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzE,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overflow.test.d.ts","sourceRoot":"","sources":["../../src/tools/overflow.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
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 { writeOverflow, cleanupToolOutputs, getToolOutputRoot } from "./overflow.js";
|
|
6
|
+
let originalHome;
|
|
7
|
+
let tmpHome;
|
|
8
|
+
beforeEach(async () => {
|
|
9
|
+
originalHome = process.env.HOME;
|
|
10
|
+
tmpHome = await fs.mkdtemp(path.join(os.tmpdir(), "overflow-home-"));
|
|
11
|
+
process.env.HOME = tmpHome;
|
|
12
|
+
});
|
|
13
|
+
afterEach(async () => {
|
|
14
|
+
if (originalHome === undefined)
|
|
15
|
+
delete process.env.HOME;
|
|
16
|
+
else
|
|
17
|
+
process.env.HOME = originalHome;
|
|
18
|
+
await fs.rm(tmpHome, { recursive: true, force: true });
|
|
19
|
+
});
|
|
20
|
+
describe("writeOverflow", () => {
|
|
21
|
+
it("writes full content under ~/.gg/tool-output/<yyyy-mm-dd>/", async () => {
|
|
22
|
+
const content = "line one\nline two\nline three";
|
|
23
|
+
const filePath = await writeOverflow(content, "bash");
|
|
24
|
+
const day = new Date().toISOString().slice(0, 10);
|
|
25
|
+
expect(filePath.startsWith(path.join(getToolOutputRoot(), day))).toBe(true);
|
|
26
|
+
expect(path.basename(filePath)).toMatch(/^bash-[0-9a-f]{12}\.txt$/);
|
|
27
|
+
expect(await fs.readFile(filePath, "utf-8")).toBe(content);
|
|
28
|
+
});
|
|
29
|
+
it("generates distinct paths for concurrent writes", async () => {
|
|
30
|
+
const [a, b] = await Promise.all([writeOverflow("a", "read"), writeOverflow("b", "read")]);
|
|
31
|
+
expect(a).not.toBe(b);
|
|
32
|
+
expect(await fs.readFile(a, "utf-8")).toBe("a");
|
|
33
|
+
expect(await fs.readFile(b, "utf-8")).toBe("b");
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe("cleanupToolOutputs", () => {
|
|
37
|
+
it("removes date folders older than the max age and keeps recent ones", async () => {
|
|
38
|
+
const root = getToolOutputRoot();
|
|
39
|
+
const oldDir = path.join(root, "2020-01-01");
|
|
40
|
+
await fs.mkdir(oldDir, { recursive: true });
|
|
41
|
+
await fs.writeFile(path.join(oldDir, "bash-stale.txt"), "stale");
|
|
42
|
+
const old = new Date(Date.now() - 72 * 60 * 60 * 1000);
|
|
43
|
+
await fs.utimes(oldDir, old, old);
|
|
44
|
+
const freshPath = await writeOverflow("fresh", "bash");
|
|
45
|
+
await cleanupToolOutputs();
|
|
46
|
+
await expect(fs.stat(oldDir)).rejects.toThrow();
|
|
47
|
+
expect(await fs.readFile(freshPath, "utf-8")).toBe("fresh");
|
|
48
|
+
});
|
|
49
|
+
it("is a no-op when the tool-output folder does not exist", async () => {
|
|
50
|
+
await expect(cleanupToolOutputs()).resolves.toBeUndefined();
|
|
51
|
+
});
|
|
52
|
+
it("ages non-date folders by mtime", async () => {
|
|
53
|
+
const root = getToolOutputRoot();
|
|
54
|
+
const weirdDir = path.join(root, "not-a-date");
|
|
55
|
+
await fs.mkdir(weirdDir, { recursive: true });
|
|
56
|
+
const old = new Date(Date.now() - 72 * 60 * 60 * 1000);
|
|
57
|
+
await fs.utimes(weirdDir, old, old);
|
|
58
|
+
await cleanupToolOutputs();
|
|
59
|
+
await expect(fs.stat(weirdDir)).rejects.toThrow();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=overflow.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overflow.test.js","sourceRoot":"","sources":["../../src/tools/overflow.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContextCompaction.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useContextCompaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACpB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"useContextCompaction.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useContextCompaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACpB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAQnE,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,iBAAiB,CAAC;AAGpE,UAAU,2BAA2B;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,QAAQ,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACxD,KAAK,EAAE,MAAM,MAAM,CAAC;IACpB,mBAAmB,EAAE,gBAAgB,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC1D,WAAW,EAAE,gBAAgB,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACtD,WAAW,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;IACzC,uBAAuB,EAAE,CAAC,iBAAiB,EAAE,SAAS,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,gBAAgB,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAC7D,mBAAmB,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,uBAAuB,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAChG,mBAAmB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CAClE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,YAAY,EACZ,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,aAAa,EACb,YAAY,EACZ,KAAK,EACL,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,uBAAuB,GACxB,EAAE,2BAA2B,GAAG,iBAAiB,CAsOjD"}
|
|
@@ -2,7 +2,7 @@ import { useCallback, useRef, } from "react";
|
|
|
2
2
|
import { compact, shouldCompact } from "../../core/compaction/compactor.js";
|
|
3
3
|
import { calculateActiveContextTokens } from "../../core/compaction/active-context.js";
|
|
4
4
|
import { pruneStaleToolResults } from "../../core/compaction/tool-result-pruner.js";
|
|
5
|
-
import { estimateConversationTokens } from "../../core/compaction/token-estimator.js";
|
|
5
|
+
import { estimateConversationTokens, calibrateEstimatorFromUsage, } from "../../core/compaction/token-estimator.js";
|
|
6
6
|
import { getAuthStorageKeys, getContextWindow, } from "../../core/model-registry.js";
|
|
7
7
|
import { log } from "../../core/logger.js";
|
|
8
8
|
import { toErrorItem } from "../error-item.js";
|
|
@@ -27,6 +27,9 @@ export function useContextCompaction({ currentModel, currentProvider, authStorag
|
|
|
27
27
|
const anchor = messages[anchorIndex];
|
|
28
28
|
if (anchor?.role === "assistant") {
|
|
29
29
|
providerContextRef.current = { usage: { ...usage }, anchor };
|
|
30
|
+
// Feed the authoritative usage back into the token estimator so
|
|
31
|
+
// char-based estimates track this session's real tokenizer.
|
|
32
|
+
calibrateEstimatorFromUsage(messages.slice(0, anchorIndex), usage);
|
|
30
33
|
}
|
|
31
34
|
}, []);
|
|
32
35
|
const recordProviderUsage = useCallback((usage, messages) => {
|
|
@@ -134,7 +137,7 @@ export function useContextCompaction({ currentModel, currentProvider, authStorag
|
|
|
134
137
|
}
|
|
135
138
|
const settings = settingsRef.current;
|
|
136
139
|
const autoCompact = settings?.get("autoCompact") ?? true;
|
|
137
|
-
const threshold = settings?.get("compactThreshold") ?? 0.
|
|
140
|
+
const threshold = settings?.get("compactThreshold") ?? 0.85;
|
|
138
141
|
// Force-compact on context overflow regardless of settings or cooldown.
|
|
139
142
|
if (options.force) {
|
|
140
143
|
const result = await compactConversation(messages);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContextCompaction.js","sourceRoot":"","sources":["../../../src/ui/hooks/useContextCompaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,MAAM,GAIP,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,
|
|
1
|
+
{"version":3,"file":"useContextCompaction.js","sourceRoot":"","sources":["../../../src/ui/hooks/useContextCompaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import React, { useEffect, useRef, useState } from "react";
|
|
|
3
3
|
import { render } from "ink";
|
|
4
4
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
5
|
import { useContextCompaction } from "./useContextCompaction.js";
|
|
6
|
+
import { getCalibratedRatio, setEstimatorModel } from "../../core/compaction/token-estimator.js";
|
|
6
7
|
const compactMock = vi.hoisted(() => vi.fn());
|
|
7
8
|
vi.mock("../../core/compaction/compactor.js", async () => {
|
|
8
9
|
const actual = await vi.importActual("../../core/compaction/compactor.js");
|
|
@@ -105,6 +106,20 @@ describe("useContextCompaction", () => {
|
|
|
105
106
|
{ role: "user", content: "[compacted]" },
|
|
106
107
|
]);
|
|
107
108
|
});
|
|
109
|
+
it("calibrates the token estimator from the anchored provider usage", async () => {
|
|
110
|
+
// Model switch resets any calibration left over from previous tests.
|
|
111
|
+
setEstimatorModel("calibration-reset-sentinel");
|
|
112
|
+
setEstimatorModel("test-model");
|
|
113
|
+
expect(getCalibratedRatio()).toBeNull();
|
|
114
|
+
let transformed;
|
|
115
|
+
const mounted = render(_jsx(Harness, { provider: "openai", onTransformed: (messages) => (transformed = messages) }), { patchConsole: false });
|
|
116
|
+
await vi.waitFor(() => expect(transformed).toBeDefined());
|
|
117
|
+
mounted.unmount();
|
|
118
|
+
const ratio = getCalibratedRatio();
|
|
119
|
+
expect(ratio).not.toBeNull();
|
|
120
|
+
expect(ratio).toBeGreaterThanOrEqual(2.0);
|
|
121
|
+
expect(ratio).toBeLessThanOrEqual(5.0);
|
|
122
|
+
});
|
|
108
123
|
it("reuses authoritative usage for the first context check of the next run", async () => {
|
|
109
124
|
let transformed;
|
|
110
125
|
const mounted = render(_jsx(Harness, { provider: "openai", reuseRecordedUsage: true, onTransformed: (messages) => (transformed = messages) }), { patchConsole: false });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContextCompaction.test.js","sourceRoot":"","sources":["../../../src/ui/hooks/useContextCompaction.test.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAK9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"useContextCompaction.test.js","sourceRoot":"","sources":["../../../src/ui/hooks/useContextCompaction.test.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kenkaiiii/ggcoder",
|
|
3
|
-
"version": "5.19.
|
|
3
|
+
"version": "5.19.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "CLI coding agent with OAuth authentication for Anthropic, OpenAI, and Gemini",
|
|
6
6
|
"license": "MIT",
|
|
@@ -114,9 +114,9 @@
|
|
|
114
114
|
"typescript-language-server": "^5.3.0",
|
|
115
115
|
"wrap-ansi": "^10.0.0",
|
|
116
116
|
"zod": "^4.4.3",
|
|
117
|
-
"@kenkaiiii/gg-
|
|
118
|
-
"@kenkaiiii/gg-
|
|
119
|
-
"@kenkaiiii/gg-
|
|
117
|
+
"@kenkaiiii/gg-core": "5.19.2",
|
|
118
|
+
"@kenkaiiii/gg-agent": "5.19.2",
|
|
119
|
+
"@kenkaiiii/gg-ai": "5.19.2"
|
|
120
120
|
},
|
|
121
121
|
"optionalDependencies": {
|
|
122
122
|
"@huggingface/transformers": "^3.6.0",
|