@kenkaiiii/ggcoder 5.48.0 → 5.49.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 (105) hide show
  1. package/dist/app-sidecar-auth-broadcast.test.js +1 -1
  2. package/dist/app-sidecar-auth-broadcast.test.js.map +1 -1
  3. package/dist/app-sidecar.js +253 -2
  4. package/dist/app-sidecar.js.map +1 -1
  5. package/dist/cli/shared.d.ts.map +1 -1
  6. package/dist/cli/shared.js +2 -0
  7. package/dist/cli/shared.js.map +1 -1
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +6 -2
  10. package/dist/cli.js.map +1 -1
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +1 -0
  13. package/dist/config.js.map +1 -1
  14. package/dist/core/agent-session-compaction.test.js +1 -0
  15. package/dist/core/agent-session-compaction.test.js.map +1 -1
  16. package/dist/core/agent-session.d.ts +2 -0
  17. package/dist/core/agent-session.d.ts.map +1 -1
  18. package/dist/core/agent-session.js +15 -8
  19. package/dist/core/agent-session.js.map +1 -1
  20. package/dist/core/auth-providers.d.ts.map +1 -1
  21. package/dist/core/auth-providers.js +21 -21
  22. package/dist/core/auth-providers.js.map +1 -1
  23. package/dist/core/context-limits.d.ts +35 -0
  24. package/dist/core/context-limits.d.ts.map +1 -0
  25. package/dist/core/context-limits.js +35 -0
  26. package/dist/core/context-limits.js.map +1 -0
  27. package/dist/core/context-limits.test.d.ts +2 -0
  28. package/dist/core/context-limits.test.d.ts.map +1 -0
  29. package/dist/core/context-limits.test.js +55 -0
  30. package/dist/core/context-limits.test.js.map +1 -0
  31. package/dist/core/local-endpoint-store.test.js +1 -9
  32. package/dist/core/local-endpoint-store.test.js.map +1 -1
  33. package/dist/core/mcp/deferred-catalog.d.ts +9 -0
  34. package/dist/core/mcp/deferred-catalog.d.ts.map +1 -1
  35. package/dist/core/mcp/deferred-catalog.js +15 -1
  36. package/dist/core/mcp/deferred-catalog.js.map +1 -1
  37. package/dist/core/process-manager-wake.test.js +8 -4
  38. package/dist/core/process-manager-wake.test.js.map +1 -1
  39. package/dist/core/process-manager.d.ts.map +1 -1
  40. package/dist/core/process-manager.js +8 -1
  41. package/dist/core/process-manager.js.map +1 -1
  42. package/dist/core/settings-manager.d.ts +9 -0
  43. package/dist/core/settings-manager.d.ts.map +1 -1
  44. package/dist/core/settings-manager.js +18 -0
  45. package/dist/core/settings-manager.js.map +1 -1
  46. package/dist/core/skills-routing.test.js +42 -0
  47. package/dist/core/skills-routing.test.js.map +1 -1
  48. package/dist/core/skills.d.ts +16 -1
  49. package/dist/core/skills.d.ts.map +1 -1
  50. package/dist/core/skills.js +37 -5
  51. package/dist/core/skills.js.map +1 -1
  52. package/dist/core/subagent-manager.d.ts +17 -0
  53. package/dist/core/subagent-manager.d.ts.map +1 -1
  54. package/dist/core/subagent-manager.js +92 -1
  55. package/dist/core/subagent-manager.js.map +1 -1
  56. package/dist/core/subagent-manager.test.js +161 -0
  57. package/dist/core/subagent-manager.test.js.map +1 -1
  58. package/dist/core/subagent-turn-record.d.ts +17 -0
  59. package/dist/core/subagent-turn-record.d.ts.map +1 -0
  60. package/dist/core/subagent-turn-record.js +82 -0
  61. package/dist/core/subagent-turn-record.js.map +1 -0
  62. package/dist/core/subagent-turn-record.test.d.ts +2 -0
  63. package/dist/core/subagent-turn-record.test.d.ts.map +1 -0
  64. package/dist/core/subagent-turn-record.test.js +70 -0
  65. package/dist/core/subagent-turn-record.test.js.map +1 -0
  66. package/dist/hf-pull.d.ts +66 -0
  67. package/dist/hf-pull.d.ts.map +1 -0
  68. package/dist/hf-pull.js +109 -0
  69. package/dist/hf-pull.js.map +1 -0
  70. package/dist/hf-pull.test.d.ts +2 -0
  71. package/dist/hf-pull.test.d.ts.map +1 -0
  72. package/dist/hf-pull.test.js +112 -0
  73. package/dist/hf-pull.test.js.map +1 -0
  74. package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
  75. package/dist/modes/subagent-worker-mode.js +66 -8
  76. package/dist/modes/subagent-worker-mode.js.map +1 -1
  77. package/dist/system-prompt.d.ts +7 -2
  78. package/dist/system-prompt.d.ts.map +1 -1
  79. package/dist/system-prompt.js +26 -9
  80. package/dist/system-prompt.js.map +1 -1
  81. package/dist/system-prompt.test.js +26 -0
  82. package/dist/system-prompt.test.js.map +1 -1
  83. package/dist/tools/index.d.ts +3 -0
  84. package/dist/tools/index.d.ts.map +1 -1
  85. package/dist/tools/index.js +1 -1
  86. package/dist/tools/index.js.map +1 -1
  87. package/dist/tools/skill.d.ts +3 -2
  88. package/dist/tools/skill.d.ts.map +1 -1
  89. package/dist/tools/skill.js +10 -7
  90. package/dist/tools/skill.js.map +1 -1
  91. package/dist/tools/tool-search.d.ts +2 -1
  92. package/dist/tools/tool-search.d.ts.map +1 -1
  93. package/dist/tools/tool-search.js +28 -3
  94. package/dist/tools/tool-search.js.map +1 -1
  95. package/dist/tools/tool-search.test.js +58 -0
  96. package/dist/tools/tool-search.test.js.map +1 -1
  97. package/dist/ui/App.d.ts.map +1 -1
  98. package/dist/ui/App.js.map +1 -1
  99. package/dist/ui/components/ModelSelector.d.ts.map +1 -1
  100. package/dist/ui/components/ModelSelector.js +1 -0
  101. package/dist/ui/components/ModelSelector.js.map +1 -1
  102. package/dist/ui/login.d.ts.map +1 -1
  103. package/dist/ui/login.js +7 -2
  104. package/dist/ui/login.js.map +1 -1
  105. package/package.json +4 -4
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Hugging Face → Ollama pull pipeline (pure helpers).
3
+ *
4
+ * The sidecar's `/hf/*` routes (app-sidecar.ts) use these to search the Hub,
5
+ * pick a quantized GGUF variant, and stream `ollama pull hf.co/<repo>:<quant>`
6
+ * progress to the app. Kept dependency-free and side-effect-free so the
7
+ * parsing/selection rules are unit-testable.
8
+ */
9
+ /** `org/repo` only — no tags, no traversal, no leading slashes. */
10
+ export function isValidHfRepoId(id) {
11
+ return /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}\/[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(id);
12
+ }
13
+ /** Map a Hub `/api/models?search=` result entry to what the dropdown shows. */
14
+ export function toHfSearchRow(entry) {
15
+ if (typeof entry.id !== "string" || !isValidHfRepoId(entry.id))
16
+ return null;
17
+ return {
18
+ id: entry.id,
19
+ downloads: typeof entry.downloads === "number" && entry.downloads > 0 ? entry.downloads : 0,
20
+ likes: typeof entry.likes === "number" && entry.likes > 0 ? entry.likes : 0,
21
+ updatedAt: typeof entry.lastModified === "string" ? entry.lastModified : null,
22
+ };
23
+ }
24
+ /** Preference order: best quality-per-byte first, the community default. */
25
+ const QUANT_PREFERENCE = ["Q4_K_M", "Q4_K_S", "Q4_0", "Q5_K_M", "Q6_K", "Q8_0", "Q3_K_M"];
26
+ /** Quant token from a GGUF filename (`...-q4_k_m.gguf` → `Q4_K_M`), if any. */
27
+ export function quantFromFilename(path) {
28
+ const base = path.split("/").pop() ?? path;
29
+ const match = /[-.]((?:i|t)?q\d[_a-z0-9]*)\.gguf$/i.exec(base);
30
+ return match ? match[1].toUpperCase() : null;
31
+ }
32
+ /**
33
+ * Pick which GGUF file `ollama pull` should fetch. Deterministic: the first
34
+ * entry of `QUANT_PREFERENCE` present, else the smallest file (multi-quant
35
+ * repos list big quants first), else the only file — tagless when the repo
36
+ * ships a single unnamed GGUF.
37
+ */
38
+ export function pickGgufQuant(files) {
39
+ const ggufs = files.filter((f) => f.path.toLowerCase().endsWith(".gguf"));
40
+ if (ggufs.length === 0)
41
+ return null;
42
+ for (const quant of QUANT_PREFERENCE) {
43
+ const hit = ggufs.find((f) => quantFromFilename(f.path) === quant);
44
+ if (hit)
45
+ return { tag: quant, file: hit };
46
+ }
47
+ const smallest = ggufs.reduce((a, b) => (a.sizeBytes <= b.sizeBytes ? a : b));
48
+ return { tag: quantFromFilename(smallest.path), file: smallest };
49
+ }
50
+ /** Strip terminal control noise (cursor moves, enable/disable, spinner
51
+ * frames) that ollama emits even when piped, so lines stay readable. */
52
+ // eslint-disable-next-line no-control-regex -- stripping control characters is the point
53
+ const ANSI_NOISE = /\u001b\[[0-9;?]*[A-Za-z]|[\u001b\u0000-\u0008\u000b-\u001f]|[\u2800-\u28ff]/g;
54
+ /**
55
+ * Parse one non-TTY `ollama pull` line. The CLI prints status verbs plus
56
+ * `<sha>: <pct>% <done>/<total> <rate>` lines to stderr; any unrecognized line
57
+ * is still surfaced as `downloading` with the raw text so the UI never stalls
58
+ * silently behind a parser gap.
59
+ */
60
+ export function parseOllamaPullLine(line) {
61
+ const text = line.replace(ANSI_NOISE, "").trim();
62
+ if (!text)
63
+ return null;
64
+ if (text === "success")
65
+ return { phase: "success", percent: 100 };
66
+ if (text.startsWith("verifying") || text.startsWith("writing manifest")) {
67
+ return { phase: "verifying", percent: 100, detail: text };
68
+ }
69
+ if (text.startsWith("pulling manifest")) {
70
+ return { phase: "preparing", percent: 0, detail: text };
71
+ }
72
+ const pct = /(\d{1,3})%/.exec(text);
73
+ if (pct) {
74
+ const percent = Math.min(100, Number(pct[1]));
75
+ return {
76
+ phase: "downloading",
77
+ percent,
78
+ detail: text.replace(/^(pulling\s+)?[a-f0-9]{6,64}:\s*/, ""),
79
+ };
80
+ }
81
+ return { phase: "downloading", detail: text };
82
+ }
83
+ /**
84
+ * Map a failed pull's stderr to the one action that fixes it. Ollama ≥0.32 has
85
+ * a manifest-realm bug pulling `hf.co/…` and gated/auth-required repos need a
86
+ * token — everything else is passed through with context.
87
+ */
88
+ export function explainPullFailure(stderrTail) {
89
+ if (stderrTail.includes("realm host")) {
90
+ return "This Ollama version can't pull from Hugging Face (a 0.32 manifest bug). Upgrade Ollama, then try again.";
91
+ }
92
+ if (/\b401\b|unauthorized|invalid username or password/i.test(stderrTail)) {
93
+ return "Hugging Face rejected the download as unauthenticated. Connect an HF token under the Hugging Face provider (or `ollama login huggingface.co`), then retry.";
94
+ }
95
+ if (/no such file|not found|404/i.test(stderrTail)) {
96
+ return "Hugging Face has no GGUF file in that repo, or the quant doesn't exist. Pick another model.";
97
+ }
98
+ const tail = stderrTail.trim().split("\n").slice(-3).join(" ");
99
+ return tail ? `Ollama pull failed: ${tail}` : "Ollama pull failed.";
100
+ }
101
+ /** `12.4M` → `12.4M downloads`, `3,412` stays exact under 1000. */
102
+ export function formatCount(n) {
103
+ if (n >= 1_000_000)
104
+ return `${(n / 1_000_000).toFixed(1)}M`;
105
+ if (n >= 10_000)
106
+ return `${Math.round(n / 1_000)}K`;
107
+ return n.toLocaleString("en-US");
108
+ }
109
+ //# sourceMappingURL=hf-pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hf-pull.js","sourceRoot":"","sources":["../src/hf-pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hf-pull.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hf-pull.test.d.ts","sourceRoot":"","sources":["../src/hf-pull.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,112 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { explainPullFailure, formatCount, isValidHfRepoId, parseOllamaPullLine, pickGgufQuant, quantFromFilename, toHfSearchRow, } from "./hf-pull.js";
3
+ describe("isValidHfRepoId", () => {
4
+ it("accepts org/repo with dots, dashes, digits", () => {
5
+ expect(isValidHfRepoId("Qwen/Qwen3-Coder-480B-A35B-Instruct")).toBe(true);
6
+ expect(isValidHfRepoId("bartowski/SmolLM2-135M-Instruct-GGUF")).toBe(true);
7
+ });
8
+ it("rejects traversal, tags, bare names", () => {
9
+ expect(isValidHfRepoId("../etc/passwd")).toBe(false);
10
+ expect(isValidHfRepoId("user/repo:Q4")).toBe(false);
11
+ expect(isValidHfRepoId("solo")).toBe(false);
12
+ expect(isValidHfRepoId("")).toBe(false);
13
+ });
14
+ });
15
+ describe("toHfSearchRow", () => {
16
+ it("maps a Hub entry defensively", () => {
17
+ expect(toHfSearchRow({ id: "a/b", downloads: 123456, likes: 7, lastModified: "2026-01-02" })).toEqual({ id: "a/b", downloads: 123456, likes: 7, updatedAt: "2026-01-02" });
18
+ });
19
+ it("drops entries without a usable id", () => {
20
+ expect(toHfSearchRow({ downloads: 5 })).toBeNull();
21
+ expect(toHfSearchRow({ id: "no-slash" })).toBeNull();
22
+ });
23
+ });
24
+ describe("quantFromFilename", () => {
25
+ it("reads upper, lower, dot-separated quant tokens", () => {
26
+ expect(quantFromFilename("model-Q4_K_M.gguf")).toBe("Q4_K_M");
27
+ expect(quantFromFilename("model.q5_k_m.gguf")).toBe("Q5_K_M");
28
+ expect(quantFromFilename("smollm2-135m-instruct-q4_k_m.gguf")).toBe("Q4_K_M");
29
+ });
30
+ it("returns null for unnamed or non-gguf files", () => {
31
+ expect(quantFromFilename("model.gguf")).toBeNull();
32
+ expect(quantFromFilename("README.md")).toBeNull();
33
+ });
34
+ });
35
+ describe("pickGgufQuant", () => {
36
+ const f = (path, sizeBytes = 1) => ({
37
+ path,
38
+ sizeBytes,
39
+ });
40
+ it("prefers Q4_K_M when present", () => {
41
+ const files = [f("m-Q8_0.gguf", 9), f("m-q4_k_m.gguf", 4), f("m-Q3_K_M.gguf", 3)];
42
+ expect(pickGgufQuant(files)).toEqual({ tag: "Q4_K_M", file: f("m-q4_k_m.gguf", 4) });
43
+ });
44
+ it("falls back to the smallest file, keeping its tag", () => {
45
+ const files = [f("m-IQ2_XS.gguf", 90), f("m-TQ1_0.gguf", 40)];
46
+ const pick = pickGgufQuant(files);
47
+ expect(pick?.file.path).toBe("m-TQ1_0.gguf");
48
+ expect(pick?.tag).toBe("TQ1_0");
49
+ });
50
+ it("is tagless for a single unnamed GGUF", () => {
51
+ expect(pickGgufQuant([f("model.gguf", 5)])).toEqual({ tag: null, file: f("model.gguf", 5) });
52
+ });
53
+ it("returns null with no GGUFs", () => {
54
+ expect(pickGgufQuant([f("README.md")])).toBeNull();
55
+ });
56
+ });
57
+ describe("parseOllamaPullLine", () => {
58
+ it("strips ollama's ANSI cursor/spinner noise before parsing", () => {
59
+ // Raw bytes from a real piped pull: cursor-move + spinner + clear codes.
60
+ const noisy = "\u001b[?2026h\u001b[?25l\u001b[1Gpulling manifest \u2819\u001b[K\u001b[?25h\u001b[?2026l";
61
+ expect(parseOllamaPullLine(noisy)).toEqual({
62
+ phase: "preparing",
63
+ percent: 0,
64
+ detail: "pulling manifest",
65
+ });
66
+ });
67
+ it("reads percent lines and strips the blob sha", () => {
68
+ expect(parseOllamaPullLine("pulling 8f4b3c1d2e5a: 45% 1.2 GB/2.7 GB 30 MB/s")).toEqual({
69
+ phase: "downloading",
70
+ percent: 45,
71
+ detail: "45% 1.2 GB/2.7 GB 30 MB/s",
72
+ });
73
+ });
74
+ it("maps the status verbs", () => {
75
+ expect(parseOllamaPullLine("pulling manifest")).toEqual({
76
+ phase: "preparing",
77
+ percent: 0,
78
+ detail: "pulling manifest",
79
+ });
80
+ expect(parseOllamaPullLine("verifying sha256 digest")).toMatchObject({
81
+ phase: "verifying",
82
+ percent: 100,
83
+ });
84
+ expect(parseOllamaPullLine("success")).toEqual({ phase: "success", percent: 100 });
85
+ });
86
+ it("surfaces unrecognized output instead of swallowing it", () => {
87
+ expect(parseOllamaPullLine("something odd happened")).toEqual({
88
+ phase: "downloading",
89
+ detail: "something odd happened",
90
+ });
91
+ expect(parseOllamaPullLine(" ")).toBeNull();
92
+ });
93
+ });
94
+ describe("explainPullFailure", () => {
95
+ it("maps the known failure modes to their fix", () => {
96
+ expect(explainPullFailure('Error: realm host "huggingface.co" does not match')).toMatch(/Upgrade Ollama/);
97
+ expect(explainPullFailure('Error: 401: {"error":"Invalid username or password."}')).toMatch(/HF token/);
98
+ expect(explainPullFailure("Error: 404: not found")).toMatch(/no GGUF file/);
99
+ });
100
+ it("passes unknown errors through with the tail", () => {
101
+ expect(explainPullFailure("line1\nline2\nline3\nline4")).toBe("Ollama pull failed: line2 line3 line4");
102
+ expect(explainPullFailure("")).toBe("Ollama pull failed.");
103
+ });
104
+ });
105
+ describe("formatCount", () => {
106
+ it("compacts large download counts", () => {
107
+ expect(formatCount(2_400_000)).toBe("2.4M");
108
+ expect(formatCount(45_000)).toBe("45K");
109
+ expect(formatCount(712)).toBe("712");
110
+ });
111
+ });
112
+ //# sourceMappingURL=hf-pull.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hf-pull.test.js","sourceRoot":"","sources":["../src/hf-pull.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-worker-mode.d.ts","sourceRoot":"","sources":["../../src/modes/subagent-worker-mode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAaxD,yFAAyF;AACzF,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,WAAW,CAAC,EACzD,aAAa,EAAE,MAAM,MAAM,EAC3B,aAAa,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,GACnD,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,YAAY,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAoBD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkQ3D"}
1
+ {"version":3,"file":"subagent-worker-mode.d.ts","sourceRoot":"","sources":["../../src/modes/subagent-worker-mode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAcxD,yFAAyF;AACzF,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,WAAW,CAAC,EACzD,aAAa,EAAE,MAAM,MAAM,EAC3B,aAAa,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,GACnD,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,YAAY,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA6BD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkT3D"}
@@ -3,6 +3,7 @@ import { AgentSession } from "../core/agent-session.js";
3
3
  import { isModelUnavailableError } from "../tools/subagent.js";
4
4
  import { boundSubAgentOutput, SUB_AGENT_MAX_TURN_EXTENSIONS, SUB_AGENT_TIMEOUT_MS, } from "../tools/subagent-shared.js";
5
5
  import { captureSidecarError, flushSidecarErrors } from "../core/sidecar-error-reporter.js";
6
+ import { writeTurnRecord } from "../core/subagent-turn-record.js";
6
7
  const TIMEOUT_RECOVERY_GRACE_MS = 60_000;
7
8
  const TIMEOUT_RECOVERY_PROMPT = `Your execution time limit was reached and the active operation was stopped.
8
9
  You have one final 60-second recovery turn. Do not call any tools. Immediately return the best concise answer you can from the evidence already in this conversation. Clearly state what remains incomplete or unverified.`;
@@ -25,13 +26,37 @@ export async function recoverTimedOutTurn(activeSession, currentOutput, setContr
25
26
  clearTimeout(recoveryTimer);
26
27
  }
27
28
  }
29
+ /** Set once our stdout pipe dies (parent restart). See runSubagentWorkerMode. */
30
+ let orphaned = false;
28
31
  function emit(frame) {
29
- process.stdout.write(`${JSON.stringify(frame)}\n`);
32
+ if (orphaned)
33
+ return;
34
+ try {
35
+ process.stdout.write(`${JSON.stringify(frame)}\n`);
36
+ }
37
+ catch {
38
+ // A racing pipe teardown between the guard and the write — the error
39
+ // handler below flips `orphaned` for subsequent frames.
40
+ }
30
41
  }
31
42
  function errorMessage(error) {
32
43
  return error instanceof Error ? error.message : String(error);
33
44
  }
34
45
  export async function runSubagentWorkerMode() {
46
+ // Detached child outliving its parent: a parent restart kills our stdout
47
+ // pipe, and the first write after that would crash us mid-turn (EPIPE).
48
+ // Swallow it, stop emitting, and keep running — the durable session
49
+ // transcript plus the turn record written beside it are what the
50
+ // rehydrated parent adopts.
51
+ const pipeError = (error) => {
52
+ if (error.code === "EPIPE") {
53
+ orphaned = true;
54
+ return;
55
+ }
56
+ throw error;
57
+ };
58
+ process.stdout.on("error", pipeError);
59
+ process.stderr.on("error", pipeError);
35
60
  let session;
36
61
  let initializeOptions;
37
62
  let state = "uninitialized";
@@ -43,6 +68,11 @@ export async function runSubagentWorkerMode() {
43
68
  let recoveryOutput = "";
44
69
  let recoveringAfterTimeout = false;
45
70
  let producedToolCall = false;
71
+ // This worker's LIFETIME totals — one initialize = one agent_id = one
72
+ // worker lifetime, so the durable turn record carries authoritative
73
+ // cumulative numbers an adopting parent can trust.
74
+ let turnCount = 0;
75
+ const tokenUsage = { input: 0, output: 0 };
46
76
  const setState = (next, extra = {}) => {
47
77
  state = next;
48
78
  emit({ type: "state", state: next, ...extra });
@@ -74,6 +104,13 @@ export async function runSubagentWorkerMode() {
74
104
  activeSession.eventBus.on(event, (payload) => {
75
105
  if (event === "tool_call_start")
76
106
  producedToolCall = true;
107
+ if (event === "turn_end") {
108
+ turnCount++;
109
+ const usage = payload
110
+ .usage;
111
+ tokenUsage.input += usage?.inputTokens ?? 0;
112
+ tokenUsage.output += usage?.outputTokens ?? 0;
113
+ }
77
114
  emit({ type: "event", event, payload });
78
115
  });
79
116
  }
@@ -159,8 +196,7 @@ export async function runSubagentWorkerMode() {
159
196
  const interrupted = controller.signal.aborted || (abortReason !== undefined && abortReason !== "timeout");
160
197
  const timedOut = abortReason === "timeout" && !recoveredAfterTimeout;
161
198
  setState(interrupted && !timedOut ? "interrupted" : "idle");
162
- emit({
163
- type: "turn_complete",
199
+ completeTurn({
164
200
  status: recoveredAfterTimeout
165
201
  ? "completed"
166
202
  : timedOut
@@ -192,8 +228,7 @@ export async function runSubagentWorkerMode() {
192
228
  });
193
229
  }
194
230
  setState(interrupted && !timedOut ? "interrupted" : "idle");
195
- emit({
196
- type: "turn_complete",
231
+ completeTurn({
197
232
  status: timedOut ? "failed" : interrupted ? "interrupted" : "failed",
198
233
  output: boundSubAgentOutput(output),
199
234
  error: timedOut
@@ -208,6 +243,20 @@ export async function runSubagentWorkerMode() {
208
243
  activeTurn = undefined;
209
244
  });
210
245
  };
246
+ /** Durably record the turn, then announce it. Record FIRST: an adopting
247
+ * parent must never observe a terminal frame with no record behind it. */
248
+ const completeTurn = (frame) => {
249
+ void writeTurnRecord(initializeOptions?.childSessionPath, {
250
+ status: frame.status ?? "failed",
251
+ output: typeof frame.output === "string" ? frame.output : undefined,
252
+ error: typeof frame.error === "string" ? frame.error : undefined,
253
+ model: typeof frame.model === "string" ? frame.model : undefined,
254
+ turn_count: turnCount,
255
+ token_usage: { input: tokenUsage.input, output: tokenUsage.output },
256
+ completed_at: Date.now(),
257
+ });
258
+ emit({ type: "turn_complete", ...frame });
259
+ };
211
260
  const acknowledge = (requestId, result = {}) => emit({ type: "ack", request_id: requestId, ok: true, ...result });
212
261
  const reject = (requestId, error) => emit({ type: "ack", request_id: requestId, ok: false, error: errorMessage(error) });
213
262
  const handle = async (command) => {
@@ -283,9 +332,18 @@ export async function runSubagentWorkerMode() {
283
332
  void handle(command);
284
333
  });
285
334
  await new Promise((resolve) => lines.once("close", resolve));
286
- abortReason = "stdin_closed";
287
- controller.abort();
288
- await activeTurn?.catch(() => undefined);
335
+ if (activeTurn) {
336
+ // Stdin closed mid-turn: the parent is gone. Finish the turn so its
337
+ // result lands in the durable turn record (the rehydrated parent adopts
338
+ // it); emit() is a no-op by then. The turn's own SUB_AGENT_TIMEOUT_MS
339
+ // still bounds it — the process cannot linger past that.
340
+ orphaned = true;
341
+ await activeTurn.catch(() => undefined);
342
+ }
343
+ else {
344
+ abortReason = "stdin_closed";
345
+ controller.abort();
346
+ }
289
347
  await session?.dispose();
290
348
  await flushSidecarErrors();
291
349
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-worker-mode.js","sourceRoot":"","sources":["../../src/modes/subagent-worker-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,oBAAoB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAE5F,MAAM,yBAAyB,GAAG,MAAM,CAAC;AACzC,MAAM,uBAAuB,GAAG;2NAC2L,CAAC;AAE5N,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,aAAyD,EACzD,aAA2B,EAC3B,aAAoD;IAEpD,MAAM,mBAAmB,GAAG,aAAa,EAAE,CAAC,MAAM,CAAC;IACnD,MAAM,kBAAkB,GAAG,IAAI,eAAe,EAAE,CAAC;IACjD,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAClC,aAAa,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,yBAAyB,CAAC,CAAC;IAC9F,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,MAAM,CACxB,uBAAuB,EACvB,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,QAAQ,EAAE,EACpE,EAAE,YAAY,EAAE,IAAI,EAAE,CACvB,CAAC;QACF,OAAO,CACL,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO;YAClC,aAAa,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAC7D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAiCD,SAAS,IAAI,CAAC,KAA8B;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,OAAiC,CAAC;IACtC,IAAI,iBAAuD,CAAC;IAC5D,IAAI,KAAK,GAAgB,eAAe,CAAC;IACzC,IAAI,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,IAAI,UAAqC,CAAC;IAC1C,IAAI,SAAoD,CAAC;IACzD,IAAI,WAA8E,CAAC;IACnF,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,sBAAsB,GAAG,KAAK,CAAC;IACnC,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,MAAM,QAAQ,GAAG,CAAC,IAAiB,EAAE,QAAiC,EAAE,EAAE,EAAE;QAC1E,KAAK,GAAG,IAAI,CAAC;QACb,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,aAA2B,EAAE,EAAE;QACjD,MAAM,SAAS,GAAG;YAChB,gBAAgB;YAChB,iBAAiB;YACjB,kBAAkB;YAClB,eAAe;YACf,UAAU;YACV,WAAW;YACX,sBAAsB;YACtB,WAAW;YACX,kBAAkB;YAClB,oBAAoB;SACZ,CAAC;QACX,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,EAAE;YAClD,IAAI,sBAAsB,EAAE,CAAC;gBAC3B,IAAI,cAAc,CAAC,MAAM,GAAG,OAAO;oBAAE,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;YACtE,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;gBACnC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YACzB,CAAC;YACD,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC3C,IAAI,KAAK,KAAK,iBAAiB;oBAAE,gBAAgB,GAAG,IAAI,CAAC;gBACzD,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,EAAE,OAAiC,EAAyB,EAAE;QACvF,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,CAAC;QACvF,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC;YAC5B,GAAG,cAAc;YACjB,QAAQ,EAAE,EAAE;YACZ,iBAAiB,EAAE,6BAA6B;YAChD,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,SAAS,EAAE,gBAAgB;YAC3B,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QACH,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;QAC/B,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC9E,MAAM,GAAG,EAAE,CAAC;QACZ,cAAc,GAAG,EAAE,CAAC;QACpB,sBAAsB,GAAG,KAAK,CAAC;QAC/B,gBAAgB,GAAG,KAAK,CAAC;QACzB,WAAW,GAAG,SAAS,CAAC;QACxB,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACrC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpB,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,WAAW,GAAG,SAAS,CAAC;YACxB,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EAAE,oBAAoB,CAAC,CAAC;QACzB,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,OAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpC,MAAM,aAAa,GAAG,iBAAiB,EAAE,aAAa,CAAC;gBACvD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC9B,uEAAuE;oBACvE,+DAA+D;gBACjE,CAAC;qBAAM,IACL,aAAa;oBACb,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;oBAC1B,CAAC,MAAM;oBACP,CAAC,gBAAgB;oBACjB,uBAAuB,CAAC,OAAO,CAAC,EAChC,CAAC;oBACD,MAAM,OAAQ,CAAC,OAAO,EAAE,CAAC;oBACzB,iBAAiB,GAAG;wBAClB,GAAG,iBAAkB;wBACrB,KAAK,EAAE,aAAa;wBACpB,aAAa,EAAE,SAAS;qBACzB,CAAC;oBACF,OAAO,GAAG,MAAM,aAAa,CAAC,iBAAiB,CAAC,CAAC;oBACjD,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,IAAI,qBAAqB,GAAG,KAAK,CAAC;YAClC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,sBAAsB,GAAG,IAAI,CAAC;gBAC9B,IAAI,CAAC;oBACH,qBAAqB,GAAG,MAAM,mBAAmB,CAC/C,OAAQ,EACR,GAAG,EAAE,CAAC,cAAc,EACpB,CAAC,kBAAkB,EAAE,EAAE;wBACrB,UAAU,GAAG,kBAAkB,CAAC;oBAClC,CAAC,CACF,CAAC;gBACJ,CAAC;wBAAS,CAAC;oBACT,sBAAsB,GAAG,KAAK,CAAC;gBACjC,CAAC;gBACD,IAAI,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC1B,MAAM,IAAI,mCAAmC,cAAc,EAAE,CAAC;gBAChE,CAAC;YACH,CAAC;YAED,MAAM,WAAW,GACf,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,CAAC,CAAC;YACxF,MAAM,QAAQ,GAAG,WAAW,KAAK,SAAS,IAAI,CAAC,qBAAqB,CAAC;YACrE,QAAQ,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC5D,IAAI,CAAC;gBACH,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,qBAAqB;oBAC3B,CAAC,CAAC,WAAW;oBACb,CAAC,CAAC,QAAQ;wBACR,CAAC,CAAC,QAAQ;wBACV,CAAC,CAAC,WAAW;4BACX,CAAC,CAAC,aAAa;4BACf,CAAC,CAAC,WAAW;gBACnB,MAAM,EAAE,mBAAmB,CAAC,MAAM,CAAC;gBACnC,GAAG,CAAC,qBAAqB;oBACvB,CAAC,CAAC,EAAE,uBAAuB,EAAE,IAAI,EAAE;oBACnC,CAAC,CAAC,QAAQ;wBACR,CAAC,CAAC;4BACE,KAAK,EAAE,mBAAmB,IAAI,CAAC,KAAK,CAAC,oBAAoB,GAAG,MAAM,CAAC,mCAAmC;yBACvG;wBACH,CAAC,CAAC,WAAW;4BACX,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE;4BAC1B,CAAC,CAAC,EAAE,CAAC;gBACX,KAAK,EAAE,iBAAiB,EAAE,KAAK;aAChC,CAAC,CAAC;QACL,CAAC,CAAC,EAAE;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;YAC9C,MAAM,QAAQ,GAAG,WAAW,KAAK,SAAS,CAAC;YAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,EAAE;oBACjD,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,IAAI,SAAS;oBAClD,KAAK,EAAE,iBAAiB,EAAE,KAAK,IAAI,SAAS;iBAC7C,CAAC,CAAC;YACL,CAAC;YACD,QAAQ,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC5D,IAAI,CAAC;gBACH,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ;gBACpE,MAAM,EAAE,mBAAmB,CAAC,MAAM,CAAC;gBACnC,KAAK,EAAE,QAAQ;oBACb,CAAC,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,oBAAoB,GAAG,MAAM,CAAC,mCAAmC;oBACjG,CAAC,CAAC,WAAW;wBACX,CAAC,CAAC,aAAa;wBACf,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC;gBACzB,KAAK,EAAE,iBAAiB,EAAE,KAAK;aAChC,CAAC,CAAC;QACL,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAE,SAAkC,EAAE,EAAE,EAAE,CAC9E,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,CAAC,SAAiB,EAAE,KAAc,EAAE,EAAE,CACnD,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAEtF,MAAM,MAAM,GAAG,KAAK,EAAE,OAAsB,EAAiB,EAAE;QAC7D,IAAI,CAAC;YACH,QAAQ,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,KAAK,YAAY,CAAC,CAAC,CAAC;oBAClB,IAAI,OAAO;wBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;oBAC9D,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;oBACpC,OAAO,GAAG,MAAM,aAAa,CAAC,iBAAiB,CAAC,CAAC;oBACjD,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACjB,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACjC,iBAAiB,GAAG,EAAE,GAAG,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;oBAClF,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE;wBAC9B,gBAAgB,EAAE,KAAK,CAAC,SAAS;wBACjC,kBAAkB,EAAE,KAAK,CAAC,WAAW;wBACrC,KAAK,EAAE,iBAAiB,CAAC,KAAK;qBAC/B,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,KAAK,OAAO,CAAC;gBACb,KAAK,UAAU;oBACb,IAAI,CAAC,OAAO;wBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;oBAC3D,IAAI,KAAK,KAAK,SAAS;wBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;oBAC9E,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBACvD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACtB,OAAO;gBACT,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,SAAS;wBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBAC9E,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACrD,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC5C,OAAO;gBACT,CAAC;gBACD,KAAK,WAAW;oBACd,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,SAAS;wBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBAC9E,WAAW,GAAG,WAAW,CAAC;oBAC1B,UAAU,CAAC,KAAK,EAAE,CAAC;oBACnB,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBAChC,OAAO;gBACT,KAAK,UAAU;oBACb,WAAW,GAAG,UAAU,CAAC;oBACzB,UAAU,CAAC,KAAK,EAAE,CAAC;oBACnB,MAAM,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;oBACzC,MAAM,OAAO,EAAE,OAAO,EAAE,CAAC;oBACzB,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACnB,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO;YACX,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mBAAmB,CAAC,KAAK,EAAE,yBAAyB,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACpF,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,OAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC;YAC5C,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACxF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mBAAmB,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,WAAW,GAAG,cAAc,CAAC;IAC7B,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,MAAM,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,OAAO,EAAE,OAAO,EAAE,CAAC;IACzB,MAAM,kBAAkB,EAAE,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"subagent-worker-mode.js","sourceRoot":"","sources":["../../src/modes/subagent-worker-mode.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type Skill } from "./core/skills.js";
2
+ import { type ContextLimits } from "./core/context-limits.js";
2
3
  import type { LanguageId } from "./core/language-detector.js";
3
4
  import type { Provider } from "@kenkaiiii/gg-ai";
4
5
  /** Combined byte budget for all project instruction files (Codex default). */
@@ -13,7 +14,7 @@ export declare const PROJECT_CONTEXT_MAX_BYTES: number;
13
14
  * combined budget is filled nearest-first (the nearest instructions are the
14
15
  * most binding); files dropped by the cap are reported in a one-line note.
15
16
  */
16
- export declare function collectProjectContext(cwd: string): Promise<string[]>;
17
+ export declare function collectProjectContext(cwd: string, limits?: ContextLimits): Promise<string[]>;
17
18
  /** Extra Environment-section facts that vary per session rather than per host. */
18
19
  export interface SystemPromptEnvironment {
19
20
  /** Extra workspace roots added with `/add-dir`. */
@@ -53,6 +54,8 @@ export declare function buildSubAgentSystemPrompt(agentBody: string, opts: {
53
54
  deferredToolNames?: readonly string[];
54
55
  context?: "project" | "none";
55
56
  environment?: SystemPromptEnvironment;
57
+ /** Byte budgets for skill catalog / project instructions / total ceiling. */
58
+ contextLimits?: ContextLimits;
56
59
  }): Promise<string>;
57
60
  /**
58
61
  * Build the system prompt dynamically based on cwd and context.
@@ -69,5 +72,7 @@ export declare function buildSubAgentSystemPrompt(agentBody: string, opts: {
69
72
  * promotes them. Listed as one-line hints so the capability stays discoverable
70
73
  * while its parameter schema stays out of the request.
71
74
  */
72
- export declare function buildSystemPrompt(cwd: string, skills?: Skill[], planMode?: boolean, approvedPlanPath?: string, toolNames?: readonly string[], activeLanguages?: Set<LanguageId>, provider?: Provider, environment?: SystemPromptEnvironment, deferredToolNames?: readonly string[]): Promise<string>;
75
+ export declare function buildSystemPrompt(cwd: string, skills?: Skill[], planMode?: boolean, approvedPlanPath?: string, toolNames?: readonly string[], activeLanguages?: Set<LanguageId>, provider?: Provider, environment?: SystemPromptEnvironment, deferredToolNames?: readonly string[],
76
+ /** Byte budgets for skill catalog / project instructions / total ceiling. */
77
+ contextLimits?: ContextLimits): Promise<string>;
73
78
  //# sourceMappingURL=system-prompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAM9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAYjD,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB,QAAY,CAAC;AA2PnD;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAwD1E;AAWD,kFAAkF;AAClF,MAAM,WAAW,uBAAuB;IACtC,mDAAmD;IACnD,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AA+BD;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,QAOmE,CAAC;AAEzG;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IACJ,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,GACA,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,KAAK,EAAE,EAChB,QAAQ,CAAC,EAAE,OAAO,EAClB,gBAAgB,CAAC,EAAE,MAAM,EACzB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,EAC7B,eAAe,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,EACjC,QAAQ,CAAC,EAAE,QAAQ,EACnB,WAAW,CAAC,EAAE,uBAAuB,EACrC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,GACpC,OAAO,CAAC,MAAM,CAAC,CAwCjB"}
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAgC,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE5F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAM9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAYjD,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB,QAAqC,CAAC;AA2P5E;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,aAA8B,GACrC,OAAO,CAAC,MAAM,EAAE,CAAC,CAwDnB;AAWD,kFAAkF;AAClF,MAAM,WAAW,uBAAuB;IACtC,mDAAmD;IACnD,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AA2CD;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,QAOmE,CAAC;AAEzG;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IACJ,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,6EAA6E;IAC7E,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,GACA,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,KAAK,EAAE,EAChB,QAAQ,CAAC,EAAE,OAAO,EAClB,gBAAgB,CAAC,EAAE,MAAM,EACzB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,EAC7B,eAAe,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,EACjC,QAAQ,CAAC,EAAE,QAAQ,EACnB,WAAW,CAAC,EAAE,uBAAuB,EACrC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE;AACrC,6EAA6E;AAC7E,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,MAAM,CAAC,CA2CjB"}
@@ -1,6 +1,7 @@
1
1
  import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { formatSkillsForPrompt } from "./core/skills.js";
4
+ import { clampToBytes, CONTEXT_LIMITS } from "./core/context-limits.js";
4
5
  import { TOOL_PROMPT_HINTS, buildToolSteering, DEFAULT_TOOL_NAMES } from "./tools/prompt-hints.js";
5
6
  import { stripBom } from "./utils/text.js";
6
7
  import { resolveShell } from "./core/shell.js";
@@ -17,7 +18,7 @@ const CONTEXT_FILES = [
17
18
  "CONVENTIONS.md",
18
19
  ];
19
20
  /** Combined byte budget for all project instruction files (Codex default). */
20
- export const PROJECT_CONTEXT_MAX_BYTES = 32 * 1024;
21
+ export const PROJECT_CONTEXT_MAX_BYTES = CONTEXT_LIMITS.projectContextBytes;
21
22
  const UNCACHED_MARKER = "<!-- uncached -->";
22
23
  /**
23
24
  * The agent's product identity. Anthropic models run as "Claude Code" (matching
@@ -250,7 +251,7 @@ function renderToolsSection(toolNames, deferredToolNames) {
250
251
  * combined budget is filled nearest-first (the nearest instructions are the
251
252
  * most binding); files dropped by the cap are reported in a one-line note.
252
253
  */
253
- export async function collectProjectContext(cwd) {
254
+ export async function collectProjectContext(cwd, limits = CONTEXT_LIMITS) {
254
255
  // Nearest-first collection order (cwd → root).
255
256
  const collected = [];
256
257
  let dir = cwd;
@@ -281,7 +282,7 @@ export async function collectProjectContext(cwd) {
281
282
  dir = parent;
282
283
  }
283
284
  // Budget nearest-first: the closest files are the most binding.
284
- let budget = PROJECT_CONTEXT_MAX_BYTES;
285
+ let budget = limits.projectContextBytes;
285
286
  const kept = new Set();
286
287
  const skipped = [];
287
288
  for (let i = 0; i < collected.length; i++) {
@@ -341,6 +342,18 @@ function renderUncachedDateSuffix() {
341
342
  const year = today.getFullYear();
342
343
  return `${UNCACHED_MARKER}\nToday's date: ${day} ${month} ${year}`;
343
344
  }
345
+ /**
346
+ * Emergency ceiling on the assembled prompt. Normal prompts are 15–25 KB; a
347
+ * hostile AGENTS.md stack plus a bloated skill catalog is the threat. Every
348
+ * individual input is already budgeted upstream — this is the backstop that
349
+ * bounds the total no matter what a future section adds.
350
+ */
351
+ function enforcePromptCeiling(prompt, ceilingBytes) {
352
+ if (Buffer.byteLength(prompt, "utf8") <= ceilingBytes)
353
+ return prompt;
354
+ const marker = `\n[system prompt exceeded the ${ceilingBytes}-byte ceiling and was truncated]`;
355
+ return `${clampToBytes(prompt, ceilingBytes - Buffer.byteLength(marker, "utf8")).text}${marker}`;
356
+ }
344
357
  /**
345
358
  * What every sub-agent owes its parent.
346
359
  *
@@ -373,6 +386,7 @@ export const SUBAGENT_RETURN_CONTRACT = `## Report\n\n` +
373
386
  * agents where conventions are dead weight.
374
387
  */
375
388
  export async function buildSubAgentSystemPrompt(agentBody, opts) {
389
+ const limits = opts.contextLimits ?? CONTEXT_LIMITS;
376
390
  const sections = [agentBody.trim()];
377
391
  const toolsSection = renderToolsSection(opts.toolNames, opts.deferredToolNames);
378
392
  if (toolsSection)
@@ -383,7 +397,7 @@ export async function buildSubAgentSystemPrompt(agentBody, opts) {
383
397
  if (delegationSection)
384
398
  sections.push(delegationSection);
385
399
  if ((opts.context ?? "project") === "project") {
386
- const projectContextSection = renderProjectContextSection(await collectProjectContext(opts.cwd));
400
+ const projectContextSection = renderProjectContextSection(await collectProjectContext(opts.cwd, limits));
387
401
  if (projectContextSection)
388
402
  sections.push(projectContextSection);
389
403
  }
@@ -391,7 +405,7 @@ export async function buildSubAgentSystemPrompt(agentBody, opts) {
391
405
  // Environment + date stay last so the cached prefix matches the parent's
392
406
  // layout: everything above is stable, the date suffix is the uncached tail.
393
407
  renderEnvironmentSection(opts.cwd, opts.environment), renderUncachedDateSuffix());
394
- return sections.join("\n\n");
408
+ return enforcePromptCeiling(sections.join("\n\n"), limits.systemPromptCeilingBytes);
395
409
  }
396
410
  /**
397
411
  * Build the system prompt dynamically based on cwd and context.
@@ -408,7 +422,10 @@ export async function buildSubAgentSystemPrompt(agentBody, opts) {
408
422
  * promotes them. Listed as one-line hints so the capability stays discoverable
409
423
  * while its parameter schema stays out of the request.
410
424
  */
411
- export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath, toolNames, activeLanguages, provider, environment, deferredToolNames) {
425
+ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath, toolNames, activeLanguages, provider, environment, deferredToolNames,
426
+ /** Byte budgets for skill catalog / project instructions / total ceiling. */
427
+ contextLimits) {
428
+ const limits = contextLimits ?? CONTEXT_LIMITS;
412
429
  const sections = [
413
430
  renderIdentitySection(provider),
414
431
  renderTalkSection(),
@@ -426,7 +443,7 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath,
426
443
  const delegationSection = renderDelegationSection(toolNames);
427
444
  if (delegationSection)
428
445
  sections.push(delegationSection);
429
- const projectContextSection = renderProjectContextSection(await collectProjectContext(cwd));
446
+ const projectContextSection = renderProjectContextSection(await collectProjectContext(cwd, limits));
430
447
  if (projectContextSection)
431
448
  sections.push(projectContextSection);
432
449
  if (activeLanguages && activeLanguages.size > 0) {
@@ -439,11 +456,11 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath,
439
456
  sections.push(verifySection);
440
457
  }
441
458
  if (skills && skills.length > 0) {
442
- const skillsSection = formatSkillsForPrompt(skills);
459
+ const skillsSection = formatSkillsForPrompt(skills, limits);
443
460
  if (skillsSection)
444
461
  sections.push(skillsSection);
445
462
  }
446
463
  sections.push(renderEnvironmentSection(cwd, environment), renderUncachedDateSuffix());
447
- return sections.join("\n\n");
464
+ return enforcePromptCeiling(sections.join("\n\n"), limits.systemPromptCeilingBytes);
448
465
  }
449
466
  //# sourceMappingURL=system-prompt.js.map