@prestyj/cli 5.5.0 → 5.7.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 (235) hide show
  1. package/assets/end-notification.mp3 +0 -0
  2. package/assets/skills/evidence-led-ui/LICENSES.md +68 -0
  3. package/assets/skills/evidence-led-ui/SKILL.md +139 -0
  4. package/{LICENSE → assets/skills/evidence-led-ui/corpus/awesome-design-md/LICENSE} +1 -1
  5. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/airbnb/DESIGN.md +545 -0
  6. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/airtable/DESIGN.md +554 -0
  7. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/apple/DESIGN.md +562 -0
  8. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/binance/DESIGN.md +634 -0
  9. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/bmw/DESIGN.md +544 -0
  10. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/bmw-m/DESIGN.md +503 -0
  11. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/bugatti/DESIGN.md +454 -0
  12. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/cal/DESIGN.md +542 -0
  13. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/claude/DESIGN.md +589 -0
  14. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/clay/DESIGN.md +541 -0
  15. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/clickhouse/DESIGN.md +544 -0
  16. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/cohere/DESIGN.md +451 -0
  17. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/coinbase/DESIGN.md +570 -0
  18. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/composio/DESIGN.md +506 -0
  19. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/cursor/DESIGN.md +537 -0
  20. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/dell-1996/DESIGN.md +632 -0
  21. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/elevenlabs/DESIGN.md +504 -0
  22. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/expo/DESIGN.md +526 -0
  23. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/ferrari/DESIGN.md +531 -0
  24. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/figma/DESIGN.md +578 -0
  25. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/framer/DESIGN.md +544 -0
  26. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/hashicorp/DESIGN.md +575 -0
  27. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/hp/DESIGN.md +670 -0
  28. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/ibm/DESIGN.md +550 -0
  29. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/intercom/DESIGN.md +546 -0
  30. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/kraken/DESIGN.md +125 -0
  31. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/lamborghini/DESIGN.md +288 -0
  32. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/linear.app/DESIGN.md +548 -0
  33. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/lovable/DESIGN.md +298 -0
  34. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/mastercard/DESIGN.md +365 -0
  35. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/meta/DESIGN.md +683 -0
  36. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/minimax/DESIGN.md +746 -0
  37. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/mintlify/DESIGN.md +852 -0
  38. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/miro/DESIGN.md +825 -0
  39. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/mistral.ai/DESIGN.md +773 -0
  40. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/mongodb/DESIGN.md +767 -0
  41. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/nike/DESIGN.md +575 -0
  42. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/nintendo-2001/DESIGN.md +649 -0
  43. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/notion/DESIGN.md +821 -0
  44. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/nvidia/DESIGN.md +640 -0
  45. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/ollama/DESIGN.md +539 -0
  46. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/opencode.ai/DESIGN.md +521 -0
  47. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/pinterest/DESIGN.md +597 -0
  48. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/playstation/DESIGN.md +661 -0
  49. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/posthog/DESIGN.md +690 -0
  50. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/raycast/DESIGN.md +669 -0
  51. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/renault/DESIGN.md +589 -0
  52. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/replicate/DESIGN.md +616 -0
  53. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/resend/DESIGN.md +585 -0
  54. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/revolut/DESIGN.md +636 -0
  55. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/runwayml/DESIGN.md +244 -0
  56. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/sanity/DESIGN.md +357 -0
  57. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/sentry/DESIGN.md +551 -0
  58. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/shopify/DESIGN.md +516 -0
  59. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/slack/DESIGN.md +482 -0
  60. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/spacex/DESIGN.md +363 -0
  61. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/spotify/DESIGN.md +246 -0
  62. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/starbucks/DESIGN.md +580 -0
  63. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/stripe/DESIGN.md +487 -0
  64. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/supabase/DESIGN.md +462 -0
  65. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/superhuman/DESIGN.md +448 -0
  66. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/tesla/DESIGN.md +286 -0
  67. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/theverge/DESIGN.md +339 -0
  68. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/together.ai/DESIGN.md +633 -0
  69. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/uber/DESIGN.md +636 -0
  70. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/vercel/DESIGN.md +736 -0
  71. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/vodafone/DESIGN.md +538 -0
  72. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/voltagent/DESIGN.md +521 -0
  73. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/warp/DESIGN.md +526 -0
  74. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/webflow/DESIGN.md +588 -0
  75. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/wired/DESIGN.md +497 -0
  76. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/wise/DESIGN.md +544 -0
  77. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/x.ai/DESIGN.md +465 -0
  78. package/assets/skills/evidence-led-ui/corpus/awesome-design-md/design-md/zapier/DESIGN.md +537 -0
  79. package/assets/skills/evidence-led-ui/data/corpus-manifest.json +768 -0
  80. package/assets/skills/evidence-led-ui/data/observations.json +47053 -0
  81. package/assets/skills/evidence-led-ui/references/anti-defaults.md +203 -0
  82. package/assets/skills/evidence-led-ui/references/archetypes.md +97 -0
  83. package/assets/skills/evidence-led-ui/references/craft-rulings.md +167 -0
  84. package/assets/skills/evidence-led-ui/references/methodology.md +72 -0
  85. package/assets/skills/evidence-led-ui/references/observed-patterns.md +68 -0
  86. package/assets/skills/evidence-led-ui/references/production-contract.md +120 -0
  87. package/assets/skills/evidence-led-ui/references/provenance.md +117 -0
  88. package/assets/skills/evidence-led-ui/references/quality-rubric.md +126 -0
  89. package/dist/app-sidecar.js +159 -43
  90. package/dist/app-sidecar.js.map +1 -1
  91. package/dist/chat-agents/general.test.js +3 -0
  92. package/dist/chat-agents/general.test.js.map +1 -1
  93. package/dist/chat-agents/jiwa.d.ts +53 -0
  94. package/dist/chat-agents/jiwa.d.ts.map +1 -0
  95. package/dist/chat-agents/jiwa.js +352 -0
  96. package/dist/chat-agents/jiwa.js.map +1 -0
  97. package/dist/chat-agents/jiwa.test.d.ts +2 -0
  98. package/dist/chat-agents/jiwa.test.d.ts.map +1 -0
  99. package/dist/chat-agents/jiwa.test.js +66 -0
  100. package/dist/chat-agents/jiwa.test.js.map +1 -0
  101. package/dist/chat-agents/shared.d.ts.map +1 -1
  102. package/dist/chat-agents/shared.js +5 -1
  103. package/dist/chat-agents/shared.js.map +1 -1
  104. package/dist/cli.d.ts.map +1 -1
  105. package/dist/cli.js +15 -0
  106. package/dist/cli.js.map +1 -1
  107. package/dist/core/agent-session-review-coverage.test.d.ts +2 -0
  108. package/dist/core/agent-session-review-coverage.test.d.ts.map +1 -0
  109. package/dist/core/agent-session-review-coverage.test.js +57 -0
  110. package/dist/core/agent-session-review-coverage.test.js.map +1 -0
  111. package/dist/core/agent-session.d.ts +13 -7
  112. package/dist/core/agent-session.d.ts.map +1 -1
  113. package/dist/core/agent-session.js +143 -38
  114. package/dist/core/agent-session.js.map +1 -1
  115. package/dist/core/compaction/compactor.test.js +1 -1
  116. package/dist/core/compaction/compactor.test.js.map +1 -1
  117. package/dist/core/event-bus.d.ts +2 -0
  118. package/dist/core/event-bus.d.ts.map +1 -1
  119. package/dist/core/event-bus.js.map +1 -1
  120. package/dist/core/goal-worker.test.js +3 -2
  121. package/dist/core/goal-worker.test.js.map +1 -1
  122. package/dist/core/ideal-review.d.ts +27 -0
  123. package/dist/core/ideal-review.d.ts.map +1 -1
  124. package/dist/core/ideal-review.js +64 -0
  125. package/dist/core/ideal-review.js.map +1 -1
  126. package/dist/core/ideal-review.test.js +34 -1
  127. package/dist/core/ideal-review.test.js.map +1 -1
  128. package/dist/core/loop-breaker.d.ts +23 -16
  129. package/dist/core/loop-breaker.d.ts.map +1 -1
  130. package/dist/core/loop-breaker.js +52 -11
  131. package/dist/core/loop-breaker.js.map +1 -1
  132. package/dist/core/loop-breaker.test.js +37 -16
  133. package/dist/core/loop-breaker.test.js.map +1 -1
  134. package/dist/core/lsp/client.d.ts +3 -0
  135. package/dist/core/lsp/client.d.ts.map +1 -1
  136. package/dist/core/lsp/client.js +20 -0
  137. package/dist/core/lsp/client.js.map +1 -1
  138. package/dist/core/lsp/manager.d.ts +32 -9
  139. package/dist/core/lsp/manager.d.ts.map +1 -1
  140. package/dist/core/lsp/manager.js +89 -37
  141. package/dist/core/lsp/manager.js.map +1 -1
  142. package/dist/core/lsp/manager.test.js +56 -4
  143. package/dist/core/lsp/manager.test.js.map +1 -1
  144. package/dist/core/nolan-prompt.d.ts +3 -3
  145. package/dist/core/nolan-prompt.d.ts.map +1 -1
  146. package/dist/core/nolan-prompt.js +10 -10
  147. package/dist/core/nolan-prompt.js.map +1 -1
  148. package/dist/core/nolan-prompt.test.js +17 -0
  149. package/dist/core/nolan-prompt.test.js.map +1 -1
  150. package/dist/core/run-lifecycle.d.ts +40 -0
  151. package/dist/core/run-lifecycle.d.ts.map +1 -0
  152. package/dist/core/run-lifecycle.js +95 -0
  153. package/dist/core/run-lifecycle.js.map +1 -0
  154. package/dist/core/run-lifecycle.test.d.ts +2 -0
  155. package/dist/core/run-lifecycle.test.d.ts.map +1 -0
  156. package/dist/core/run-lifecycle.test.js +64 -0
  157. package/dist/core/run-lifecycle.test.js.map +1 -0
  158. package/dist/core/session-manager.d.ts +25 -1
  159. package/dist/core/session-manager.d.ts.map +1 -1
  160. package/dist/core/session-manager.js +66 -1
  161. package/dist/core/session-manager.js.map +1 -1
  162. package/dist/core/session-manager.test.js +80 -2
  163. package/dist/core/session-manager.test.js.map +1 -1
  164. package/dist/core/skills-routing.test.d.ts +2 -0
  165. package/dist/core/skills-routing.test.d.ts.map +1 -0
  166. package/dist/core/skills-routing.test.js +70 -0
  167. package/dist/core/skills-routing.test.js.map +1 -0
  168. package/dist/core/skills.d.ts +2 -0
  169. package/dist/core/skills.d.ts.map +1 -1
  170. package/dist/core/skills.js +32 -9
  171. package/dist/core/skills.js.map +1 -1
  172. package/dist/core/subagent-manager.d.ts +40 -3
  173. package/dist/core/subagent-manager.d.ts.map +1 -1
  174. package/dist/core/subagent-manager.js +342 -30
  175. package/dist/core/subagent-manager.js.map +1 -1
  176. package/dist/core/subagent-manager.test.js +189 -3
  177. package/dist/core/subagent-manager.test.js.map +1 -1
  178. package/dist/core/subagent-store.d.ts +20 -0
  179. package/dist/core/subagent-store.d.ts.map +1 -0
  180. package/dist/core/subagent-store.js +177 -0
  181. package/dist/core/subagent-store.js.map +1 -0
  182. package/dist/core/subagent-store.test.d.ts +2 -0
  183. package/dist/core/subagent-store.test.d.ts.map +1 -0
  184. package/dist/core/subagent-store.test.js +94 -0
  185. package/dist/core/subagent-store.test.js.map +1 -0
  186. package/dist/modes/agent-home-mode.d.ts.map +1 -1
  187. package/dist/modes/agent-home-mode.js +10 -3
  188. package/dist/modes/agent-home-mode.js.map +1 -1
  189. package/dist/modes/serve-mode.d.ts.map +1 -1
  190. package/dist/modes/serve-mode.js +10 -3
  191. package/dist/modes/serve-mode.js.map +1 -1
  192. package/dist/modes/subagent-worker-mode.d.ts +2 -0
  193. package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
  194. package/dist/modes/subagent-worker-mode.js +13 -3
  195. package/dist/modes/subagent-worker-mode.js.map +1 -1
  196. package/dist/system-prompt.js +2 -2
  197. package/dist/system-prompt.js.map +1 -1
  198. package/dist/system-prompt.test.js +7 -5
  199. package/dist/system-prompt.test.js.map +1 -1
  200. package/dist/tools/goals.d.ts +3 -3
  201. package/dist/tools/skill.d.ts.map +1 -1
  202. package/dist/tools/skill.js +8 -3
  203. package/dist/tools/skill.js.map +1 -1
  204. package/dist/tools/tasks.d.ts +2 -2
  205. package/dist/tools/web-fetch.d.ts +1 -1
  206. package/dist/ui/App.d.ts +7 -1
  207. package/dist/ui/App.d.ts.map +1 -1
  208. package/dist/ui/App.js +63 -17
  209. package/dist/ui/App.js.map +1 -1
  210. package/dist/ui/components/Footer.d.ts +1 -0
  211. package/dist/ui/components/Footer.d.ts.map +1 -1
  212. package/dist/ui/components/Footer.js +3 -3
  213. package/dist/ui/components/Footer.js.map +1 -1
  214. package/dist/ui/components/Footer.test.d.ts +2 -0
  215. package/dist/ui/components/Footer.test.d.ts.map +1 -0
  216. package/dist/ui/components/Footer.test.js +16 -0
  217. package/dist/ui/components/Footer.test.js.map +1 -0
  218. package/dist/ui/components/SkillsOverlay.d.ts.map +1 -1
  219. package/dist/ui/components/SkillsOverlay.js +8 -3
  220. package/dist/ui/components/SkillsOverlay.js.map +1 -1
  221. package/dist/ui/hooks/useAgentLoop.d.ts +8 -3
  222. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  223. package/dist/ui/hooks/useAgentLoop.js +70 -25
  224. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  225. package/dist/ui/hooks/useAgentLoop.test.js +27 -0
  226. package/dist/ui/hooks/useAgentLoop.test.js.map +1 -1
  227. package/dist/ui/hooks/useSessionPersistence.d.ts +4 -2
  228. package/dist/ui/hooks/useSessionPersistence.d.ts.map +1 -1
  229. package/dist/ui/hooks/useSessionPersistence.js +7 -1
  230. package/dist/ui/hooks/useSessionPersistence.js.map +1 -1
  231. package/dist/ui/render.d.ts +7 -0
  232. package/dist/ui/render.d.ts.map +1 -1
  233. package/dist/ui/render.js +4 -0
  234. package/dist/ui/render.js.map +1 -1
  235. package/package.json +6 -5
@@ -1,6 +1,10 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
1
4
  import { fileURLToPath } from "node:url";
2
5
  import { afterEach, describe, expect, it, vi } from "vitest";
3
- import { SubAgentManager } from "./subagent-manager.js";
6
+ import { buildSubAgentCompletionFollowUp, SubAgentManager } from "./subagent-manager.js";
7
+ import { SubAgentStore } from "./subagent-store.js";
4
8
  const workerEntry = fileURLToPath(new URL("../tools/__fixtures__/fake-subagent-worker.mjs", import.meta.url));
5
9
  const agents = [
6
10
  {
@@ -12,9 +16,15 @@ const agents = [
12
16
  },
13
17
  ];
14
18
  const managers = [];
19
+ const tempDirs = [];
20
+ async function tempDir() {
21
+ const directory = await fs.mkdtemp(path.join(os.tmpdir(), "gg-subagent-manager-"));
22
+ tempDirs.push(directory);
23
+ return directory;
24
+ }
15
25
  function manager(options = {}) {
16
26
  const instance = new SubAgentManager({
17
- cwd: process.cwd(),
27
+ cwd: options.cwd ?? process.cwd(),
18
28
  agents: options.agentDefs ?? agents,
19
29
  getProvider: () => "openai",
20
30
  getModel: () => "gpt-5.6-sol",
@@ -22,12 +32,17 @@ function manager(options = {}) {
22
32
  getCacheKey: () => "parent-cache",
23
33
  workerEntry,
24
34
  idleTimeoutMs: options.idleTimeoutMs,
35
+ store: options.store,
36
+ sessionRootDir: options.sessionRootDir,
25
37
  });
26
38
  managers.push(instance);
27
39
  return instance;
28
40
  }
29
41
  afterEach(async () => {
30
- await Promise.all(managers.splice(0).map((instance) => instance.shutdownAll()));
42
+ const activeManagers = managers.splice(0);
43
+ await Promise.all(activeManagers.map((instance) => instance.shutdownAll()));
44
+ await Promise.all(activeManagers.map((instance) => instance.waitForPersistence()));
45
+ await Promise.all(tempDirs.splice(0).map((directory) => fs.rm(directory, { recursive: true, force: true })));
31
46
  });
32
47
  describe("SubAgentManager", () => {
33
48
  it("partitions the worker cache key by selected model and agent family", async () => {
@@ -91,6 +106,22 @@ describe("SubAgentManager", () => {
91
106
  await instance.interruptAll();
92
107
  await rejection;
93
108
  });
109
+ it("keeps internally interrupted results uncollected until the parent waits", async () => {
110
+ const instance = manager();
111
+ const child = await instance.spawn("cancelled-child", "slow", "fake");
112
+ await instance.interruptAll();
113
+ expect(instance.list()).toEqual([
114
+ expect.objectContaining({
115
+ agent_id: child.agent_id,
116
+ state: "interrupted",
117
+ collected: false,
118
+ }),
119
+ ]);
120
+ expect(instance.completionGate()).toMatchObject({ unresolved: 1 });
121
+ const collected = await instance.wait([child.agent_id], "all", 500);
122
+ expect(collected.agents[0]?.collected).toBe(true);
123
+ expect(instance.completionGate().unresolved).toBe(0);
124
+ });
94
125
  it("reaps idle workers and retains a bounded closed snapshot", async () => {
95
126
  const instance = manager({ idleTimeoutMs: 5 });
96
127
  const child = await instance.spawn("short", "fast", "fake");
@@ -99,5 +130,160 @@ describe("SubAgentManager", () => {
99
130
  expect(instance.list().find((item) => item.agent_id === child.agent_id)?.state).toBe("closed");
100
131
  await expect(instance.followup(child.agent_id, "late")).rejects.toThrow("reaped");
101
132
  });
133
+ it("fails closed until active and terminal child results are collected", async () => {
134
+ const instance = manager();
135
+ const child = await instance.spawn("gate-child", "slow", "fake");
136
+ expect(instance.completionGate()).toMatchObject({ unresolved: 1 });
137
+ expect(instance.completionGateMessage()).toContain(child.agent_id);
138
+ expect(buildSubAgentCompletionFollowUp(instance)?.[0]?.content).toContain(child.agent_id);
139
+ await new Promise((resolve) => setTimeout(resolve, 180));
140
+ expect(instance.completionGate()).toMatchObject({
141
+ active: [],
142
+ uncollected: [expect.objectContaining({ agent_id: child.agent_id })],
143
+ unresolved: 1,
144
+ });
145
+ const collected = await instance.wait([child.agent_id], "all", 500);
146
+ expect(collected.agents[0]?.collected).toBe(true);
147
+ expect(instance.completionGateMessage()).toBeUndefined();
148
+ expect(buildSubAgentCompletionFollowUp(instance)).toBeNull();
149
+ });
150
+ it("hydrates interrupted state and lazily respawns a recovered child session", async () => {
151
+ const root = await tempDir();
152
+ const cwd = path.join(root, "project");
153
+ const store = new SubAgentStore(path.join(root, "state"));
154
+ await fs.mkdir(cwd, { recursive: true });
155
+ const sessionRootDir = path.join(root, "sessions");
156
+ const recovered = {
157
+ agent_id: "recovered-child",
158
+ task_name: "durable-child",
159
+ state: "running",
160
+ started_at: 1,
161
+ updated_at: 2,
162
+ elapsed_ms: 1,
163
+ turn_count: 1,
164
+ tool_use_count: 0,
165
+ token_usage: { input: 2, output: 3 },
166
+ agent_name: "fake",
167
+ provider: "openai",
168
+ model: "gpt-5.6-sol",
169
+ child_session_id: "child-session",
170
+ child_session_path: path.join(sessionRootDir, "project", "child.jsonl"),
171
+ collected: false,
172
+ };
173
+ await store.save(cwd, "parent-a", [recovered]);
174
+ const instance = manager({ store, cwd, sessionRootDir });
175
+ await instance.hydrate("parent-a");
176
+ expect(instance.list()[0]).toMatchObject({ state: "interrupted", recovered: true });
177
+ const requestSpy = vi.spyOn(instance, "request");
178
+ await instance.followup("recovered-child", "resume");
179
+ const initialize = requestSpy.mock.calls.find(([, command]) => command === "initialize");
180
+ expect(initialize?.[2]).toMatchObject({
181
+ options: { childSessionPath: recovered.child_session_path },
182
+ });
183
+ const result = await instance.wait(["recovered-child"], "all", 500);
184
+ expect(result.agents[0]).toMatchObject({ state: "completed", collected: true });
185
+ });
186
+ it("rejects recovered child paths outside the dedicated session root", async () => {
187
+ const root = await tempDir();
188
+ const cwd = path.join(root, "project");
189
+ const sessionRootDir = path.join(root, "sessions");
190
+ const store = new SubAgentStore(path.join(root, "state"));
191
+ await fs.mkdir(cwd, { recursive: true });
192
+ await store.save(cwd, "parent-a", [
193
+ {
194
+ agent_id: "outside-child",
195
+ task_name: "outside",
196
+ state: "interrupted",
197
+ started_at: 1,
198
+ updated_at: 2,
199
+ elapsed_ms: 1,
200
+ turn_count: 0,
201
+ tool_use_count: 0,
202
+ token_usage: { input: 0, output: 0 },
203
+ child_session_path: path.join(root, "outside.jsonl"),
204
+ },
205
+ ]);
206
+ const instance = manager({ store, cwd, sessionRootDir });
207
+ await instance.hydrate("parent-a");
208
+ await expect(instance.followup("outside-child", "resume")).rejects.toThrow("outside the subagent session root");
209
+ });
210
+ it("waits for an in-flight shutdown before resetting parent state", async () => {
211
+ const root = await tempDir();
212
+ const store = new SubAgentStore(path.join(root, "state"));
213
+ const instance = manager({ store });
214
+ await instance.hydrate("parent-a");
215
+ await instance.spawn("shutdown-child", "slow", "fake");
216
+ const shutdown = instance.shutdownAll();
217
+ await instance.resetParentSession("parent-new");
218
+ await shutdown;
219
+ await new Promise((resolve) => setTimeout(resolve, 20));
220
+ expect(instance.list()).toEqual([]);
221
+ expect(await store.load(process.cwd(), "parent-new")).toEqual([]);
222
+ });
223
+ it("prunes only old child transcripts unreferenced by every durable parent", async () => {
224
+ const root = await tempDir();
225
+ const cwd = path.join(root, "project-cwd");
226
+ const sessionRootDir = path.join(root, "sessions");
227
+ const sessionDirectory = path.join(sessionRootDir, "project");
228
+ const unreferencedSession = path.join(sessionDirectory, "old-unreferenced.jsonl");
229
+ const referencedSession = path.join(sessionDirectory, "old-referenced.jsonl");
230
+ await fs.mkdir(sessionDirectory, { recursive: true });
231
+ await Promise.all([
232
+ fs.writeFile(unreferencedSession, "{}\n"),
233
+ fs.writeFile(referencedSession, "{}\n"),
234
+ ]);
235
+ const old = new Date(Date.now() - 31 * 86_400_000);
236
+ await Promise.all([
237
+ fs.utimes(unreferencedSession, old, old),
238
+ fs.utimes(referencedSession, old, old),
239
+ ]);
240
+ const store = new SubAgentStore(path.join(root, "state"));
241
+ const otherParentRecord = {
242
+ agent_id: "other-parent-child",
243
+ task_name: "durable history",
244
+ state: "completed",
245
+ started_at: 1,
246
+ updated_at: 2,
247
+ elapsed_ms: 1,
248
+ turn_count: 1,
249
+ tool_use_count: 0,
250
+ token_usage: { input: 2, output: 3 },
251
+ child_session_path: referencedSession,
252
+ collected: true,
253
+ };
254
+ await store.save(cwd, "other-parent", [otherParentRecord]);
255
+ const instance = manager({ store, cwd, sessionRootDir });
256
+ await instance.hydrate("current-parent");
257
+ await expect(fs.stat(unreferencedSession)).rejects.toMatchObject({ code: "ENOENT" });
258
+ await expect(fs.stat(referencedSession)).resolves.toBeTruthy();
259
+ });
260
+ it("copies history to a compacted parent and resets a genuinely new parent", async () => {
261
+ const root = await tempDir();
262
+ const cwd = path.join(root, "project");
263
+ const store = new SubAgentStore(path.join(root, "state"));
264
+ const completed = {
265
+ agent_id: "history-child",
266
+ task_name: "history",
267
+ state: "completed",
268
+ started_at: 1,
269
+ updated_at: 2,
270
+ elapsed_ms: 1,
271
+ turn_count: 1,
272
+ tool_use_count: 0,
273
+ token_usage: { input: 2, output: 3 },
274
+ output: "done",
275
+ collected: true,
276
+ };
277
+ await store.save(cwd, "parent-before", [completed]);
278
+ const instance = manager({ store, cwd });
279
+ await instance.hydrate("parent-before");
280
+ await instance.rebindParentSession("parent-compacted");
281
+ expect(await store.load(cwd, "parent-compacted")).toEqual([
282
+ expect.objectContaining({ agent_id: "history-child", output: "done" }),
283
+ ]);
284
+ await instance.resetParentSession("parent-new");
285
+ expect(instance.list()).toEqual([]);
286
+ expect(await store.load(cwd, "parent-new")).toEqual([]);
287
+ });
102
288
  });
103
289
  //# sourceMappingURL=subagent-manager.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-manager.test.js","sourceRoot":"","sources":["../../src/core/subagent-manager.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subagent-manager.test.js","sourceRoot":"","sources":["../../src/core/subagent-manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { SubAgentSnapshot } from "./subagent-manager.js";
2
+ export interface PersistedSubAgentRecord extends SubAgentSnapshot {
3
+ agent_name?: string;
4
+ provider?: string;
5
+ model?: string;
6
+ child_session_id?: string;
7
+ child_session_path?: string;
8
+ collected?: boolean;
9
+ }
10
+ /** Versioned atomic durable state for one project's child-agent workflows. */
11
+ export declare class SubAgentStore {
12
+ private readonly rootDir;
13
+ constructor(rootDir: string);
14
+ pathFor(cwd: string, parentSessionId: string): string;
15
+ load(cwd: string, parentSessionId: string): Promise<PersistedSubAgentRecord[]>;
16
+ save(cwd: string, parentSessionId: string, records: readonly PersistedSubAgentRecord[]): Promise<void>;
17
+ /** Child transcripts referenced by every durable parent across every project. */
18
+ listChildSessionPaths(): Promise<string[]>;
19
+ }
20
+ //# sourceMappingURL=subagent-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-store.d.ts","sourceRoot":"","sources":["../../src/core/subagent-store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAkB9D,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAqBD,8EAA8E;AAC9E,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAE5C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM;IAI/C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;IA0B9E,IAAI,CACR,GAAG,EAAE,MAAM,EACX,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,SAAS,uBAAuB,EAAE,GAC1C,OAAO,CAAC,IAAI,CAAC;IA6BhB,iFAAiF;IAC3E,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CA2CjD"}
@@ -0,0 +1,177 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { createHash, randomUUID } from "node:crypto";
4
+ import { environmentSecrets, redactValue } from "@prestyj/ai";
5
+ import { log } from "./logger.js";
6
+ const STORE_VERSION = 1;
7
+ const RECORD_LIMIT = 20;
8
+ const MAX_STORE_BYTES = 5 * 1024 * 1024;
9
+ const MAX_ID_CHARS = 256;
10
+ const MAX_TASK_NAME_CHARS = 1_000;
11
+ const MAX_TEXT_CHARS = 250_000;
12
+ const VALID_STATES = new Set([
13
+ "starting",
14
+ "running",
15
+ "completed",
16
+ "failed",
17
+ "interrupted",
18
+ "closed",
19
+ "reaped",
20
+ ]);
21
+ function projectKey(cwd) {
22
+ const normalized = path.resolve(cwd);
23
+ return createHash("sha256").update(normalized).digest("hex").slice(0, 24);
24
+ }
25
+ function parentKey(parentSessionId) {
26
+ const readable = parentSessionId.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 48) || "unknown";
27
+ const digest = createHash("sha256").update(parentSessionId).digest("hex").slice(0, 16);
28
+ return `${readable}-${digest}`;
29
+ }
30
+ /** Versioned atomic durable state for one project's child-agent workflows. */
31
+ export class SubAgentStore {
32
+ rootDir;
33
+ constructor(rootDir) {
34
+ this.rootDir = rootDir;
35
+ }
36
+ pathFor(cwd, parentSessionId) {
37
+ return path.join(this.rootDir, projectKey(cwd), `${parentKey(parentSessionId)}.json`);
38
+ }
39
+ async load(cwd, parentSessionId) {
40
+ const filePath = this.pathFor(cwd, parentSessionId);
41
+ try {
42
+ const stat = await fs.stat(filePath);
43
+ if (stat.size > MAX_STORE_BYTES)
44
+ throw new Error("subagent store exceeds size limit");
45
+ const parsed = JSON.parse(await fs.readFile(filePath, "utf-8"));
46
+ if (parsed.version !== STORE_VERSION ||
47
+ parsed.project !== path.resolve(cwd) ||
48
+ parsed.parent_session_id !== parentSessionId ||
49
+ !Array.isArray(parsed.records)) {
50
+ throw new Error("unsupported or mismatched subagent store");
51
+ }
52
+ return parsed.records.slice(-RECORD_LIMIT).filter(isPersistedRecord);
53
+ }
54
+ catch (error) {
55
+ if (error.code !== "ENOENT") {
56
+ log("WARN", "subagent", "Ignoring corrupt subagent state", {
57
+ path: filePath,
58
+ error: error instanceof Error ? error.message : String(error),
59
+ });
60
+ }
61
+ return [];
62
+ }
63
+ }
64
+ async save(cwd, parentSessionId, records) {
65
+ const filePath = this.pathFor(cwd, parentSessionId);
66
+ const directory = path.dirname(filePath);
67
+ await fs.mkdir(directory, { recursive: true, mode: 0o700 });
68
+ await fs.chmod(this.rootDir, 0o700);
69
+ await fs.chmod(directory, 0o700);
70
+ const document = {
71
+ version: STORE_VERSION,
72
+ project: path.resolve(cwd),
73
+ parent_session_id: parentSessionId,
74
+ updated_at: Date.now(),
75
+ records: records.slice(-RECORD_LIMIT).map((record) => ({ ...record })),
76
+ };
77
+ const sanitized = redactValue(document, { secrets: environmentSecrets(process.env) });
78
+ const serialized = `${JSON.stringify(sanitized, null, 2)}\n`;
79
+ if (Buffer.byteLength(serialized) > MAX_STORE_BYTES) {
80
+ throw new Error("subagent store exceeds size limit");
81
+ }
82
+ const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;
83
+ try {
84
+ await fs.writeFile(tempPath, serialized, { mode: 0o600 });
85
+ await fs.chmod(tempPath, 0o600);
86
+ await fs.rename(tempPath, filePath);
87
+ await fs.chmod(filePath, 0o600);
88
+ }
89
+ finally {
90
+ await fs.unlink(tempPath).catch(() => { });
91
+ }
92
+ }
93
+ /** Child transcripts referenced by every durable parent across every project. */
94
+ async listChildSessionPaths() {
95
+ const sessionPaths = new Set();
96
+ let projectDirectories;
97
+ try {
98
+ projectDirectories = await fs.readdir(this.rootDir, { withFileTypes: true });
99
+ }
100
+ catch (error) {
101
+ if (error.code !== "ENOENT") {
102
+ log("WARN", "subagent", "Failed to enumerate durable subagent state", {
103
+ error: error instanceof Error ? error.message : String(error),
104
+ });
105
+ }
106
+ return [];
107
+ }
108
+ for (const projectDirectory of projectDirectories) {
109
+ if (!projectDirectory.isDirectory())
110
+ continue;
111
+ const directoryPath = path.join(this.rootDir, projectDirectory.name);
112
+ let files;
113
+ try {
114
+ files = await fs.readdir(directoryPath, { withFileTypes: true });
115
+ }
116
+ catch {
117
+ continue;
118
+ }
119
+ for (const file of files) {
120
+ if (!file.isFile() || !file.name.endsWith(".json"))
121
+ continue;
122
+ const filePath = path.join(directoryPath, file.name);
123
+ try {
124
+ const stat = await fs.stat(filePath);
125
+ if (stat.size > MAX_STORE_BYTES)
126
+ continue;
127
+ const parsed = JSON.parse(await fs.readFile(filePath, "utf-8"));
128
+ if (parsed.version !== STORE_VERSION || !Array.isArray(parsed.records))
129
+ continue;
130
+ for (const record of parsed.records.slice(-RECORD_LIMIT)) {
131
+ if (isPersistedRecord(record) && record.child_session_path) {
132
+ sessionPaths.add(record.child_session_path);
133
+ }
134
+ }
135
+ }
136
+ catch {
137
+ // Corrupt records are already handled when their parent is hydrated.
138
+ }
139
+ }
140
+ }
141
+ return [...sessionPaths];
142
+ }
143
+ }
144
+ function isPersistedRecord(value) {
145
+ if (!value || typeof value !== "object")
146
+ return false;
147
+ const record = value;
148
+ const optionalBoundedString = (candidate) => candidate === undefined ||
149
+ (typeof candidate === "string" && candidate.length <= MAX_TEXT_CHARS);
150
+ return (typeof record.agent_id === "string" &&
151
+ record.agent_id.length > 0 &&
152
+ record.agent_id.length <= MAX_ID_CHARS &&
153
+ typeof record.task_name === "string" &&
154
+ record.task_name.length <= MAX_TASK_NAME_CHARS &&
155
+ typeof record.state === "string" &&
156
+ VALID_STATES.has(record.state) &&
157
+ typeof record.started_at === "number" &&
158
+ Number.isFinite(record.started_at) &&
159
+ typeof record.updated_at === "number" &&
160
+ Number.isFinite(record.updated_at) &&
161
+ typeof record.elapsed_ms === "number" &&
162
+ Number.isFinite(record.elapsed_ms) &&
163
+ typeof record.turn_count === "number" &&
164
+ Number.isFinite(record.turn_count) &&
165
+ typeof record.tool_use_count === "number" &&
166
+ Number.isFinite(record.tool_use_count) &&
167
+ !!record.token_usage &&
168
+ typeof record.token_usage.input === "number" &&
169
+ Number.isFinite(record.token_usage.input) &&
170
+ typeof record.token_usage.output === "number" &&
171
+ Number.isFinite(record.token_usage.output) &&
172
+ optionalBoundedString(record.output) &&
173
+ optionalBoundedString(record.error) &&
174
+ optionalBoundedString(record.current_activity) &&
175
+ optionalBoundedString(record.child_session_path));
176
+ }
177
+ //# sourceMappingURL=subagent-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-store.js","sourceRoot":"","sources":["../../src/core/subagent-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=subagent-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-store.test.d.ts","sourceRoot":"","sources":["../../src/core/subagent-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { SubAgentStore } from "./subagent-store.js";
6
+ const tempDirs = [];
7
+ async function tempDir() {
8
+ const dir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-subagent-store-"));
9
+ tempDirs.push(dir);
10
+ return dir;
11
+ }
12
+ afterEach(async () => {
13
+ delete process.env.GG_SUBAGENT_TEST_SECRET;
14
+ await Promise.all(tempDirs.splice(0).map((dir) => fs.rm(dir, { recursive: true, force: true })));
15
+ });
16
+ function record(index, output = `output-${index}`) {
17
+ return {
18
+ agent_id: `agent-${index}`,
19
+ task_name: `task-${index}`,
20
+ state: "completed",
21
+ started_at: index,
22
+ updated_at: index + 1,
23
+ elapsed_ms: 1,
24
+ turn_count: 1,
25
+ tool_use_count: 1,
26
+ token_usage: { input: 2, output: 3 },
27
+ output,
28
+ child_session_id: `session-${index}`,
29
+ child_session_path: `/sessions/${index}.jsonl`,
30
+ };
31
+ }
32
+ describe("SubAgentStore", () => {
33
+ it("atomically creates mode-0600 bounded redacted state", async () => {
34
+ const root = await tempDir();
35
+ const store = new SubAgentStore(root);
36
+ const secret = "opaque-subagent-canary-value-123456";
37
+ process.env.GG_SUBAGENT_TEST_SECRET = secret;
38
+ const records = Array.from({ length: 25 }, (_, index) => record(index, `${secret}-${index}`));
39
+ await store.save("/project", "parent-a", records);
40
+ const filePath = store.pathFor("/project", "parent-a");
41
+ const stat = await fs.stat(filePath);
42
+ const directoryStat = await fs.stat(path.dirname(filePath));
43
+ expect(stat.mode & 0o777).toBe(0o600);
44
+ expect(directoryStat.mode & 0o777).toBe(0o700);
45
+ expect(await fs.readFile(filePath, "utf-8")).not.toContain(secret);
46
+ const loaded = await store.load("/project", "parent-a");
47
+ expect(loaded).toHaveLength(20);
48
+ expect(loaded[0]?.agent_id).toBe("agent-5");
49
+ });
50
+ it("isolates project and parent session partitions", async () => {
51
+ const root = await tempDir();
52
+ const store = new SubAgentStore(root);
53
+ await store.save("/project-a", "parent-a", [record(1)]);
54
+ expect(await store.load("/project-a", "parent-a")).toHaveLength(1);
55
+ expect(await store.load("/project-b", "parent-a")).toEqual([]);
56
+ expect(await store.load("/project-a", "parent-b")).toEqual([]);
57
+ });
58
+ it("lists child transcripts referenced by every durable parent and project", async () => {
59
+ const root = await tempDir();
60
+ const store = new SubAgentStore(root);
61
+ await store.save("/project-a", "parent-a", [record(1)]);
62
+ await store.save("/project-a", "parent-b", [record(2)]);
63
+ await store.save("/project-b", "parent-c", [record(3)]);
64
+ expect(new Set(await store.listChildSessionPaths())).toEqual(new Set(["/sessions/1.jsonl", "/sessions/2.jsonl", "/sessions/3.jsonl"]));
65
+ });
66
+ it("uses collision-resistant parent filenames", async () => {
67
+ const root = await tempDir();
68
+ const store = new SubAgentStore(root);
69
+ expect(store.pathFor("/project", "parent/a")).not.toBe(store.pathFor("/project", "parent?a"));
70
+ expect(store.pathFor("/project", "x".repeat(200))).not.toBe(store.pathFor("/project", `${"x".repeat(199)}y`));
71
+ });
72
+ it("drops records with oversized untrusted fields on load", async () => {
73
+ const root = await tempDir();
74
+ const store = new SubAgentStore(root);
75
+ await store.save("/project", "parent-a", [record(1, "x".repeat(300_000))]);
76
+ expect(await store.load("/project", "parent-a")).toEqual([]);
77
+ });
78
+ it("recovers to empty on corruption and version mismatch", async () => {
79
+ const root = await tempDir();
80
+ const store = new SubAgentStore(root);
81
+ const filePath = store.pathFor("/project", "parent-a");
82
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
83
+ await fs.writeFile(filePath, "not-json");
84
+ expect(await store.load("/project", "parent-a")).toEqual([]);
85
+ await fs.writeFile(filePath, JSON.stringify({
86
+ version: 999,
87
+ project: "/project",
88
+ parent_session_id: "parent-a",
89
+ records: [],
90
+ }));
91
+ expect(await store.load("/project", "parent-a")).toEqual([]);
92
+ });
93
+ });
94
+ //# sourceMappingURL=subagent-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-store.test.js","sourceRoot":"","sources":["../../src/core/subagent-store.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-home-mode.d.ts","sourceRoot":"","sources":["../../src/modes/agent-home-mode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAc3D,eAAO,MAAM,oBAAoB,4DAA4D,CAAC;AAE9F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAqDD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+jBnF"}
1
+ {"version":3,"file":"agent-home-mode.d.ts","sourceRoot":"","sources":["../../src/modes/agent-home-mode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAc3D,eAAO,MAAM,oBAAoB,4DAA4D,CAAC;AAE9F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAqDD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAskBnF"}
@@ -255,7 +255,10 @@ export async function runAgentHomeMode(options) {
255
255
  }
256
256
  const sessionState = state.session.getState();
257
257
  const modelInfo = MODELS.find((m) => m.id === sessionState.model);
258
- const contextWindow = getContextWindow(sessionState.model);
258
+ const contextWindow = getContextWindow(sessionState.model, {
259
+ provider: sessionState.provider,
260
+ accountId: sessionState.accountId,
261
+ });
259
262
  const contextTokens = estimateConversationTokens(state.session.getMessages());
260
263
  const pctRaw = (contextTokens / contextWindow) * 100;
261
264
  const contextStr = pctRaw > 0 && pctRaw < 1 ? "<1" : String(Math.round(pctRaw));
@@ -415,8 +418,12 @@ export async function runAgentHomeMode(options) {
415
418
  try {
416
419
  await state.session.prompt(content);
417
420
  const finalText = state.textBuffer.trim() || "Done.";
418
- const modelId = state.session.getState().model;
419
- const contextWindow = getContextWindow(modelId);
421
+ const sessionState = state.session.getState();
422
+ const modelId = sessionState.model;
423
+ const contextWindow = getContextWindow(modelId, {
424
+ provider: sessionState.provider,
425
+ accountId: sessionState.accountId,
426
+ });
420
427
  const contextTokens = estimateConversationTokens(state.session.getMessages());
421
428
  const contextPctRaw = (contextTokens / contextWindow) * 100;
422
429
  const contextStr = contextPctRaw > 0 && contextPctRaw < 1 ? "<1" : String(Math.round(contextPctRaw));