@kenkaiiii/ggcoder 4.11.3 → 4.12.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 +368 -53
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +5 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +57 -11
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +196 -38
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/api-benchmark.d.ts +64 -0
- package/dist/core/api-benchmark.d.ts.map +1 -0
- package/dist/core/api-benchmark.js +381 -0
- package/dist/core/api-benchmark.js.map +1 -0
- package/dist/core/encode-cwd.d.ts +25 -0
- package/dist/core/encode-cwd.d.ts.map +1 -0
- package/dist/core/encode-cwd.js +40 -0
- package/dist/core/encode-cwd.js.map +1 -0
- package/dist/core/encode-cwd.test.d.ts +2 -0
- package/dist/core/encode-cwd.test.d.ts.map +1 -0
- package/dist/core/encode-cwd.test.js +61 -0
- package/dist/core/encode-cwd.test.js.map +1 -0
- package/dist/core/event-bus.d.ts +1 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/mcp/client.d.ts +32 -0
- package/dist/core/mcp/client.d.ts.map +1 -1
- package/dist/core/mcp/client.js +232 -27
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/index.d.ts +3 -1
- package/dist/core/mcp/index.d.ts.map +1 -1
- package/dist/core/mcp/index.js +2 -0
- package/dist/core/mcp/index.js.map +1 -1
- package/dist/core/mcp/loopback.d.ts +27 -0
- package/dist/core/mcp/loopback.d.ts.map +1 -0
- package/dist/core/mcp/loopback.js +66 -0
- package/dist/core/mcp/loopback.js.map +1 -0
- package/dist/core/mcp/loopback.test.d.ts +2 -0
- package/dist/core/mcp/loopback.test.d.ts.map +1 -0
- package/dist/core/mcp/loopback.test.js +87 -0
- package/dist/core/mcp/loopback.test.js.map +1 -0
- package/dist/core/mcp/oauth-provider.d.ts +51 -0
- package/dist/core/mcp/oauth-provider.d.ts.map +1 -0
- package/dist/core/mcp/oauth-provider.js +95 -0
- package/dist/core/mcp/oauth-provider.js.map +1 -0
- package/dist/core/mcp/oauth-store.d.ts +39 -0
- package/dist/core/mcp/oauth-store.d.ts.map +1 -0
- package/dist/core/mcp/oauth-store.js +63 -0
- package/dist/core/mcp/oauth-store.js.map +1 -0
- package/dist/core/mcp/oauth-store.test.d.ts +2 -0
- package/dist/core/mcp/oauth-store.test.d.ts.map +1 -0
- package/dist/core/mcp/oauth-store.test.js +94 -0
- package/dist/core/mcp/oauth-store.test.js.map +1 -0
- package/dist/core/mcp/parse-add-command.d.ts.map +1 -1
- package/dist/core/mcp/parse-add-command.js +1 -0
- package/dist/core/mcp/parse-add-command.js.map +1 -1
- package/dist/core/mcp/parse-add-command.test.js +8 -2
- package/dist/core/mcp/parse-add-command.test.js.map +1 -1
- package/dist/core/mcp/store.d.ts +4 -4
- package/dist/core/mcp/store.d.ts.map +1 -1
- package/dist/core/mcp/store.js +7 -1
- package/dist/core/mcp/store.js.map +1 -1
- package/dist/core/mcp/store.test.js +11 -2
- package/dist/core/mcp/store.test.js.map +1 -1
- package/dist/core/mcp/types.d.ts +5 -1
- package/dist/core/mcp/types.d.ts.map +1 -1
- package/dist/core/process-manager.d.ts.map +1 -1
- package/dist/core/process-manager.js +5 -1
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/project-discovery.d.ts.map +1 -1
- package/dist/core/project-discovery.js +2 -9
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +1 -3
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +5 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/shell.d.ts +51 -0
- package/dist/core/shell.d.ts.map +1 -0
- package/dist/core/shell.js +82 -0
- package/dist/core/shell.js.map +1 -0
- package/dist/core/shell.test.d.ts +2 -0
- package/dist/core/shell.test.d.ts.map +1 -0
- package/dist/core/shell.test.js +87 -0
- package/dist/core/shell.test.js.map +1 -0
- package/dist/core/speed-benchmark.d.ts +133 -0
- package/dist/core/speed-benchmark.d.ts.map +1 -0
- package/dist/core/speed-benchmark.js +410 -0
- package/dist/core/speed-benchmark.js.map +1 -0
- package/dist/core/speed-benchmark.test.d.ts +2 -0
- package/dist/core/speed-benchmark.test.d.ts.map +1 -0
- package/dist/core/speed-benchmark.test.js +97 -0
- package/dist/core/speed-benchmark.test.js.map +1 -0
- package/dist/interactive.d.ts.map +1 -1
- package/dist/interactive.js +4 -3
- package/dist/interactive.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +1 -3
- package/dist/session.js.map +1 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +17 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit-diff.d.ts.map +1 -1
- package/dist/tools/edit-diff.js +25 -8
- package/dist/tools/edit-diff.js.map +1 -1
- package/dist/tools/generate-image.d.ts +39 -0
- package/dist/tools/generate-image.d.ts.map +1 -0
- package/dist/tools/generate-image.js +301 -0
- package/dist/tools/generate-image.js.map +1 -0
- package/dist/tools/generate-image.test.d.ts +2 -0
- package/dist/tools/generate-image.test.d.ts.map +1 -0
- package/dist/tools/generate-image.test.js +223 -0
- package/dist/tools/generate-image.test.js.map +1 -0
- package/dist/tools/index.d.ts +12 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +16 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/ls.d.ts.map +1 -1
- package/dist/tools/ls.js +7 -4
- package/dist/tools/ls.js.map +1 -1
- package/dist/tools/plan-mode.test.js +5 -5
- package/dist/tools/plan-mode.test.js.map +1 -1
- package/dist/tools/prompt-hints.d.ts.map +1 -1
- package/dist/tools/prompt-hints.js +2 -0
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/safe-env.d.ts.map +1 -1
- package/dist/tools/safe-env.js +27 -0
- package/dist/tools/safe-env.js.map +1 -1
- package/dist/ui/App.d.ts +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/hooks/usePixelFixFlow.d.ts +1 -1
- package/dist/ui/hooks/usePixelFixFlow.d.ts.map +1 -1
- package/dist/ui/hooks/usePixelFixFlow.js +1 -1
- package/dist/ui/hooks/usePixelFixFlow.js.map +1 -1
- package/dist/ui/render.d.ts +1 -1
- package/dist/ui/render.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform shell resolution for the bash tool + background process
|
|
3
|
+
* manager.
|
|
4
|
+
*
|
|
5
|
+
* The agent writes shell commands assuming POSIX `bash` semantics (`&&`, pipes,
|
|
6
|
+
* `ls`, `grep`, `$(...)`, single-quoting, …). On macOS/Linux that's just
|
|
7
|
+
* `bash`. On Windows there are three cases, and getting this wrong is the root
|
|
8
|
+
* of the "files not mounted / different environment" class of bugs:
|
|
9
|
+
*
|
|
10
|
+
* 1. Git Bash (Git for Windows) — a REAL POSIX bash that operates on the
|
|
11
|
+
* native Windows filesystem. `D:\proj` is reachable as `/d/proj` AND the
|
|
12
|
+
* spawned process honors the Windows `cwd`. This is what we want, so we
|
|
13
|
+
* detect and prefer it.
|
|
14
|
+
*
|
|
15
|
+
* 2. WSL bash (`C:\Windows\System32\bash.exe`) — the Windows Subsystem for
|
|
16
|
+
* Linux launcher. It runs commands inside a SEPARATE Linux distro whose
|
|
17
|
+
* filesystem is not the project tree (`D:\proj` ≈ `/mnt/d/proj`, and a
|
|
18
|
+
* raw `D:\proj` cwd lands you somewhere else entirely). Commands appear to
|
|
19
|
+
* run "in a different project / sandbox". We deliberately SKIP it.
|
|
20
|
+
*
|
|
21
|
+
* 3. No bash at all — bare `spawn("bash", …)` fails with `spawn bash ENOENT`,
|
|
22
|
+
* so every shell command the agent runs errors out. We fall back to
|
|
23
|
+
* `cmd.exe` so commands can at least run (with different semantics, which
|
|
24
|
+
* the agent is told about).
|
|
25
|
+
*
|
|
26
|
+
* The resolver is pure: filesystem + env + platform are injected so it can be
|
|
27
|
+
* unit-tested for every OS from any host.
|
|
28
|
+
*/
|
|
29
|
+
export interface ShellResolution {
|
|
30
|
+
/** Executable to spawn (never goes through a shell wrapper itself). */
|
|
31
|
+
file: string;
|
|
32
|
+
/** Args that run the given command string as one shell command. */
|
|
33
|
+
args: string[];
|
|
34
|
+
/** True when `file` is a cmd.exe fallback (non-POSIX semantics). */
|
|
35
|
+
isCmdFallback: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface ResolveShellOpts {
|
|
38
|
+
platform?: NodeJS.Platform;
|
|
39
|
+
env?: NodeJS.ProcessEnv;
|
|
40
|
+
/** Injected for testability; defaults to fs.existsSync. */
|
|
41
|
+
exists?: (p: string) => boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolve the shell executable + args to run a single command string.
|
|
45
|
+
*
|
|
46
|
+
* `GG_BASH` env override always wins (point it at any POSIX bash, e.g. a custom
|
|
47
|
+
* Git Bash or msys2 install). Otherwise: non-Windows → `bash`; Windows → Git
|
|
48
|
+
* Bash if found, else `cmd.exe`.
|
|
49
|
+
*/
|
|
50
|
+
export declare function resolveShell(command: string, opts?: ResolveShellOpts): ShellResolution;
|
|
51
|
+
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/core/shell.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,oEAAoE;IACpE,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACjC;AAmDD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,eAAe,CAwB1F"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Fixed Git-Bash install locations to probe on Windows, in priority order.
|
|
5
|
+
* These cover the official Git for Windows installer (system + per-user) plus
|
|
6
|
+
* the common 32-bit path. We NEVER include `System32\bash.exe` (WSL).
|
|
7
|
+
*/
|
|
8
|
+
function gitBashFixedCandidates(env) {
|
|
9
|
+
const programFiles = env.ProgramFiles ?? "C:\\Program Files";
|
|
10
|
+
const programFilesX86 = env["ProgramFiles(x86)"] ?? "C:\\Program Files (x86)";
|
|
11
|
+
const localAppData = env.LOCALAPPDATA;
|
|
12
|
+
const candidates = [
|
|
13
|
+
path.win32.join(programFiles, "Git", "bin", "bash.exe"),
|
|
14
|
+
path.win32.join(programFilesX86, "Git", "bin", "bash.exe"),
|
|
15
|
+
];
|
|
16
|
+
if (localAppData) {
|
|
17
|
+
candidates.push(path.win32.join(localAppData, "Programs", "Git", "bin", "bash.exe"));
|
|
18
|
+
}
|
|
19
|
+
return candidates;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Derive Git Bash from `git.exe` on PATH: Git for Windows ships `git.exe` under
|
|
23
|
+
* `<root>\cmd` (and `<root>\bin`), with `bash.exe` at `<root>\bin\bash.exe`.
|
|
24
|
+
*/
|
|
25
|
+
function gitBashFromPath(env, exists) {
|
|
26
|
+
const rawPath = env.PATH ?? env.Path ?? "";
|
|
27
|
+
if (!rawPath)
|
|
28
|
+
return null;
|
|
29
|
+
// Windows PATH is always ';'-separated. (Don't use path.delimiter — it
|
|
30
|
+
// reflects the HOST OS, which breaks when this win32-only branch is exercised
|
|
31
|
+
// in cross-platform tests on a POSIX host.)
|
|
32
|
+
for (const dir of rawPath.split(";")) {
|
|
33
|
+
if (!dir)
|
|
34
|
+
continue;
|
|
35
|
+
const gitExe = path.win32.join(dir, "git.exe");
|
|
36
|
+
if (!exists(gitExe))
|
|
37
|
+
continue;
|
|
38
|
+
// <root>\cmd\git.exe or <root>\bin\git.exe → <root>\bin\bash.exe
|
|
39
|
+
const gitRoot = path.win32.dirname(path.win32.dirname(gitExe));
|
|
40
|
+
const bash = path.win32.join(gitRoot, "bin", "bash.exe");
|
|
41
|
+
if (exists(bash))
|
|
42
|
+
return bash;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
/** Locate a usable Git Bash on Windows, or null if none is installed. */
|
|
47
|
+
function findGitBash(env, exists) {
|
|
48
|
+
for (const candidate of gitBashFixedCandidates(env)) {
|
|
49
|
+
if (exists(candidate))
|
|
50
|
+
return candidate;
|
|
51
|
+
}
|
|
52
|
+
return gitBashFromPath(env, exists);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the shell executable + args to run a single command string.
|
|
56
|
+
*
|
|
57
|
+
* `GG_BASH` env override always wins (point it at any POSIX bash, e.g. a custom
|
|
58
|
+
* Git Bash or msys2 install). Otherwise: non-Windows → `bash`; Windows → Git
|
|
59
|
+
* Bash if found, else `cmd.exe`.
|
|
60
|
+
*/
|
|
61
|
+
export function resolveShell(command, opts = {}) {
|
|
62
|
+
const platform = opts.platform ?? process.platform;
|
|
63
|
+
const env = opts.env ?? process.env;
|
|
64
|
+
const exists = opts.exists ?? existsSync;
|
|
65
|
+
// Explicit override (power users / tests): treat as a POSIX bash.
|
|
66
|
+
const override = env.GG_BASH?.trim();
|
|
67
|
+
if (override) {
|
|
68
|
+
return { file: override, args: ["-c", command], isCmdFallback: false };
|
|
69
|
+
}
|
|
70
|
+
if (platform !== "win32") {
|
|
71
|
+
return { file: "bash", args: ["-c", command], isCmdFallback: false };
|
|
72
|
+
}
|
|
73
|
+
const gitBash = findGitBash(env, exists);
|
|
74
|
+
if (gitBash) {
|
|
75
|
+
return { file: gitBash, args: ["-c", command], isCmdFallback: false };
|
|
76
|
+
}
|
|
77
|
+
// Last resort: cmd.exe. `/d` skips AutoRun, `/s` + `/c` runs the rest as a
|
|
78
|
+
// single command verbatim (correct quoting for an arbitrary command string).
|
|
79
|
+
const comspec = env.ComSpec ?? env.COMSPEC ?? "C:\\Windows\\System32\\cmd.exe";
|
|
80
|
+
return { file: comspec, args: ["/d", "/s", "/c", command], isCmdFallback: true };
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/core/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.test.d.ts","sourceRoot":"","sources":["../../src/core/shell.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { resolveShell } from "./shell.js";
|
|
3
|
+
describe("resolveShell", () => {
|
|
4
|
+
it("uses bash on macOS/Linux", () => {
|
|
5
|
+
for (const platform of ["darwin", "linux"]) {
|
|
6
|
+
const r = resolveShell("ls -la", { platform, env: {}, exists: () => false });
|
|
7
|
+
expect(r).toEqual({ file: "bash", args: ["-c", "ls -la"], isCmdFallback: false });
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
it("honors the GG_BASH override on any platform", () => {
|
|
11
|
+
const r = resolveShell("echo hi", {
|
|
12
|
+
platform: "win32",
|
|
13
|
+
env: { GG_BASH: "C:\\msys64\\usr\\bin\\bash.exe" },
|
|
14
|
+
// Even though Git Bash also 'exists', the override wins.
|
|
15
|
+
exists: () => true,
|
|
16
|
+
});
|
|
17
|
+
expect(r).toEqual({
|
|
18
|
+
file: "C:\\msys64\\usr\\bin\\bash.exe",
|
|
19
|
+
args: ["-c", "echo hi"],
|
|
20
|
+
isCmdFallback: false,
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
it("prefers Git Bash at the standard Program Files location on Windows", () => {
|
|
24
|
+
const gitBash = "C:\\Program Files\\Git\\bin\\bash.exe";
|
|
25
|
+
const r = resolveShell("grep -r foo .", {
|
|
26
|
+
platform: "win32",
|
|
27
|
+
env: { ProgramFiles: "C:\\Program Files" },
|
|
28
|
+
exists: (p) => p === gitBash,
|
|
29
|
+
});
|
|
30
|
+
expect(r).toEqual({ file: gitBash, args: ["-c", "grep -r foo ."], isCmdFallback: false });
|
|
31
|
+
});
|
|
32
|
+
it("finds per-user Git Bash under LOCALAPPDATA", () => {
|
|
33
|
+
const gitBash = "C:\\Users\\dev\\AppData\\Local\\Programs\\Git\\bin\\bash.exe";
|
|
34
|
+
const r = resolveShell("pwd", {
|
|
35
|
+
platform: "win32",
|
|
36
|
+
env: { LOCALAPPDATA: "C:\\Users\\dev\\AppData\\Local" },
|
|
37
|
+
exists: (p) => p === gitBash,
|
|
38
|
+
});
|
|
39
|
+
expect(r.file).toBe(gitBash);
|
|
40
|
+
expect(r.isCmdFallback).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
it("derives Git Bash from git.exe on PATH (<root>\\cmd\\git.exe)", () => {
|
|
43
|
+
const gitExe = "C:\\Tools\\Git\\cmd\\git.exe";
|
|
44
|
+
const bash = "C:\\Tools\\Git\\bin\\bash.exe";
|
|
45
|
+
const r = resolveShell("node -v", {
|
|
46
|
+
platform: "win32",
|
|
47
|
+
env: { PATH: "C:\\Windows\\System32;C:\\Tools\\Git\\cmd" },
|
|
48
|
+
exists: (p) => p === gitExe || p === bash,
|
|
49
|
+
});
|
|
50
|
+
expect(r.file).toBe(bash);
|
|
51
|
+
expect(r.isCmdFallback).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
it("NEVER selects WSL's System32 bash.exe (it isn't a Git Bash candidate)", () => {
|
|
54
|
+
// Only System32\bash.exe 'exists' — the resolver must ignore it and fall
|
|
55
|
+
// back to cmd.exe, because WSL runs in a separate Linux filesystem.
|
|
56
|
+
const wslBash = "C:\\Windows\\System32\\bash.exe";
|
|
57
|
+
const r = resolveShell("ls", {
|
|
58
|
+
platform: "win32",
|
|
59
|
+
env: {
|
|
60
|
+
PATH: "C:\\Windows\\System32",
|
|
61
|
+
ComSpec: "C:\\Windows\\System32\\cmd.exe",
|
|
62
|
+
},
|
|
63
|
+
exists: (p) => p === wslBash,
|
|
64
|
+
});
|
|
65
|
+
expect(r.file).not.toBe(wslBash);
|
|
66
|
+
expect(r.file).toBe("C:\\Windows\\System32\\cmd.exe");
|
|
67
|
+
expect(r.isCmdFallback).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
it("falls back to ComSpec cmd.exe on Windows when no Git Bash exists", () => {
|
|
70
|
+
const r = resolveShell("dir", {
|
|
71
|
+
platform: "win32",
|
|
72
|
+
env: { ComSpec: "C:\\Windows\\System32\\cmd.exe" },
|
|
73
|
+
exists: () => false,
|
|
74
|
+
});
|
|
75
|
+
expect(r).toEqual({
|
|
76
|
+
file: "C:\\Windows\\System32\\cmd.exe",
|
|
77
|
+
args: ["/d", "/s", "/c", "dir"],
|
|
78
|
+
isCmdFallback: true,
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
it("defaults the cmd.exe path when ComSpec is unset", () => {
|
|
82
|
+
const r = resolveShell("dir", { platform: "win32", env: {}, exists: () => false });
|
|
83
|
+
expect(r.file).toBe("C:\\Windows\\System32\\cmd.exe");
|
|
84
|
+
expect(r.isCmdFallback).toBe(true);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=shell.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.test.js","sourceRoot":"","sources":["../../src/core/shell.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Speed benchmark harness — measures the latency impact of speedProfile
|
|
3
|
+
* optimizations (1-h cache TTL + pre-warming) against the current baseline
|
|
4
|
+
* (5-min cache TTL, no pre-warm).
|
|
5
|
+
*
|
|
6
|
+
* Uses a mock streaming provider that simulates realistic provider timing:
|
|
7
|
+
* - Cold prefill (cache miss): proportional to uncached input tokens
|
|
8
|
+
* - Warm prefill (cache hit): 10× faster (cache reads cost 0.1×)
|
|
9
|
+
* - Output streaming: at a configurable token rate
|
|
10
|
+
* - Cache TTL: configurable (5 min baseline vs 1 h optimized)
|
|
11
|
+
*
|
|
12
|
+
* No real API calls are made — the mock uses real `setTimeout` for prefill and
|
|
13
|
+
* output-token latency (so wall-clock measurements are meaningful) but a
|
|
14
|
+
* virtual clock for inter-turn delays (so multi-minute gaps are instant).
|
|
15
|
+
*
|
|
16
|
+
* Run via vitest: npx vitest run src/core/speed-benchmark.test.ts
|
|
17
|
+
* Or as a script: npx tsx src/core/speed-benchmark.ts
|
|
18
|
+
*/
|
|
19
|
+
import { StreamResult, type StreamOptions } from "@kenkaiiii/gg-ai";
|
|
20
|
+
export interface MockTimingConfig {
|
|
21
|
+
/** ms per uncached input token during prefill (cold start). */
|
|
22
|
+
coldPrefillMsPerToken: number;
|
|
23
|
+
/** ms per cached input token during prefill (cache hit). 10× faster. */
|
|
24
|
+
warmPrefillMsPerToken: number;
|
|
25
|
+
/** ms per output token (determines streaming rate). ~15ms = 66 tok/s. */
|
|
26
|
+
outputMsPerToken: number;
|
|
27
|
+
/** Cache TTL in ms. 5_000 = baseline (5 min), 3_600_000 = optimized (1 h). */
|
|
28
|
+
cacheTtlMs: number;
|
|
29
|
+
/** Fixed network overhead per request (TCP + TLS + auth). */
|
|
30
|
+
networkOverheadMs: number;
|
|
31
|
+
/** Default output tokens per turn if not specified by the workload. */
|
|
32
|
+
defaultOutputTokens: number;
|
|
33
|
+
}
|
|
34
|
+
export declare const REALISTIC_TIMING: MockTimingConfig;
|
|
35
|
+
/**
|
|
36
|
+
* A mock streaming provider that simulates LLM timing with cache semantics.
|
|
37
|
+
* Registered as provider "benchmark-mock" so the real agent loop code path
|
|
38
|
+
* is exercised end-to-end.
|
|
39
|
+
*/
|
|
40
|
+
export declare class MockBenchmarkProvider {
|
|
41
|
+
private cache;
|
|
42
|
+
private config;
|
|
43
|
+
/** Virtual clock — lets the benchmark simulate multi-minute gaps between
|
|
44
|
+
* turns without actually sleeping. The cache TTL check uses this, not
|
|
45
|
+
* Date.now(). Only prefill/output latency uses real setTimeout. */
|
|
46
|
+
private virtualNow;
|
|
47
|
+
readonly stats: {
|
|
48
|
+
cacheHits: number;
|
|
49
|
+
cacheMisses: number;
|
|
50
|
+
cacheWrites: number;
|
|
51
|
+
cacheEvictions: number;
|
|
52
|
+
totalPrefillMs: number;
|
|
53
|
+
totalOutputMs: number;
|
|
54
|
+
totalNetworkMs: number;
|
|
55
|
+
turns: number;
|
|
56
|
+
};
|
|
57
|
+
constructor(config?: Partial<MockTimingConfig>);
|
|
58
|
+
/** Update config (e.g., switch TTL for baseline vs optimized run). */
|
|
59
|
+
setConfig(config: Partial<MockTimingConfig>): void;
|
|
60
|
+
/** Advance the virtual clock (for cache TTL simulation without real sleeping). */
|
|
61
|
+
advanceClock(ms: number): void;
|
|
62
|
+
/** Clear all cache state and stats (between benchmark runs). */
|
|
63
|
+
reset(): void;
|
|
64
|
+
/** Number of entries currently in the mock cache. */
|
|
65
|
+
getCacheSize(): number;
|
|
66
|
+
/** Force a cache write (simulates pre-warming). */
|
|
67
|
+
prewarm(cacheKey: string, tokenCount: number): void;
|
|
68
|
+
stream(options: StreamOptions): StreamResult;
|
|
69
|
+
private runStream;
|
|
70
|
+
/** Compute a stable cache key from the system prompt + tool names. */
|
|
71
|
+
private computeCacheKey;
|
|
72
|
+
}
|
|
73
|
+
export interface WorkloadTurn {
|
|
74
|
+
/** User message content. */
|
|
75
|
+
prompt: string;
|
|
76
|
+
/** Delay before this turn (simulates user think time). Default: 0. */
|
|
77
|
+
delayMs?: number;
|
|
78
|
+
/** Override output tokens for this turn. */
|
|
79
|
+
outputTokens?: number;
|
|
80
|
+
}
|
|
81
|
+
export interface Workload {
|
|
82
|
+
name: string;
|
|
83
|
+
/** System prompt (simulates a realistic coding-agent system prompt). */
|
|
84
|
+
systemPrompt: string;
|
|
85
|
+
/** Tool definitions (names only for the mock). */
|
|
86
|
+
toolNames: string[];
|
|
87
|
+
turns: WorkloadTurn[];
|
|
88
|
+
}
|
|
89
|
+
export interface TurnMetrics {
|
|
90
|
+
turnNumber: number;
|
|
91
|
+
promptPreview: string;
|
|
92
|
+
delayBeforeTurnMs: number;
|
|
93
|
+
ttftMs: number;
|
|
94
|
+
cacheHit: boolean;
|
|
95
|
+
inputTokens: number;
|
|
96
|
+
outputTokens: number;
|
|
97
|
+
wallClockMs: number;
|
|
98
|
+
}
|
|
99
|
+
export interface BenchmarkResult {
|
|
100
|
+
name: string;
|
|
101
|
+
config: MockTimingConfig;
|
|
102
|
+
prewarmed: boolean;
|
|
103
|
+
turns: TurnMetrics[];
|
|
104
|
+
totalWallClockMs: number;
|
|
105
|
+
totalTtftMs: number;
|
|
106
|
+
cacheHits: number;
|
|
107
|
+
cacheMisses: number;
|
|
108
|
+
cacheHitRate: number;
|
|
109
|
+
}
|
|
110
|
+
/** Run a workload against the mock provider and collect per-turn metrics. */
|
|
111
|
+
export declare function runBenchmark(workload: Workload, config: MockTimingConfig, options?: {
|
|
112
|
+
prewarm?: boolean;
|
|
113
|
+
name?: string;
|
|
114
|
+
}): Promise<BenchmarkResult>;
|
|
115
|
+
export interface ComparisonResult {
|
|
116
|
+
baseline: BenchmarkResult;
|
|
117
|
+
optimized: BenchmarkResult;
|
|
118
|
+
wallClockImprovement: number;
|
|
119
|
+
ttftImprovement: number;
|
|
120
|
+
cacheHitRateImprovement: number;
|
|
121
|
+
}
|
|
122
|
+
export declare function compareResults(baseline: BenchmarkResult, optimized: BenchmarkResult): ComparisonResult;
|
|
123
|
+
/** Format a benchmark result as a readable table. */
|
|
124
|
+
export declare function formatResultTable(result: BenchmarkResult): string;
|
|
125
|
+
/** Format a side-by-side comparison. */
|
|
126
|
+
export declare function formatComparison(comparison: ComparisonResult): string;
|
|
127
|
+
/** A realistic multi-turn coding workload with time gaps that expose the
|
|
128
|
+
* 5-min vs 1-h TTL difference. */
|
|
129
|
+
export declare function createDefaultWorkload(): Workload;
|
|
130
|
+
/** Run baseline vs optimized and return the comparison. Uses scaled-down
|
|
131
|
+
* timing (10× faster than real) so the benchmark completes in seconds. */
|
|
132
|
+
export declare function runFullBenchmark(): Promise<ComparisonResult>;
|
|
133
|
+
//# sourceMappingURL=speed-benchmark.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speed-benchmark.d.ts","sourceRoot":"","sources":["../../src/core/speed-benchmark.ts"],"names":[],"mappings":"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"}
|