gsd-pi 2.77.0-dev.c9c8932c6 → 2.77.0-dev.cfd69e714

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 (708) hide show
  1. package/README.md +1 -1
  2. package/dist/claude-cli-check.js +5 -1
  3. package/dist/cli-web-branch.d.ts +1 -0
  4. package/dist/cli-web-branch.js +3 -0
  5. package/dist/cli.js +24 -2
  6. package/dist/headless.js +49 -4
  7. package/dist/provider-migrations.d.ts +18 -0
  8. package/dist/provider-migrations.js +14 -0
  9. package/dist/resource-loader.d.ts +40 -0
  10. package/dist/resource-loader.js +32 -13
  11. package/dist/resources/extensions/browser-tools/capture.js +9 -0
  12. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  13. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  14. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  15. package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
  16. package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
  17. package/dist/resources/extensions/claude-code-cli/readiness.js +5 -1
  18. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +495 -27
  19. package/dist/resources/extensions/github-sync/templates.js +103 -0
  20. package/dist/resources/extensions/google-search/index.js +3 -2
  21. package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
  22. package/dist/resources/extensions/gsd/auto/loop.js +124 -2
  23. package/dist/resources/extensions/gsd/auto/phases.js +57 -39
  24. package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
  25. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -2
  26. package/dist/resources/extensions/gsd/auto/session.js +6 -2
  27. package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
  28. package/dist/resources/extensions/gsd/auto-dispatch.js +166 -29
  29. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  30. package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
  31. package/dist/resources/extensions/gsd/auto-post-unit.js +181 -64
  32. package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
  33. package/dist/resources/extensions/gsd/auto-recovery.js +197 -48
  34. package/dist/resources/extensions/gsd/auto-start.js +107 -29
  35. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
  36. package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
  37. package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
  38. package/dist/resources/extensions/gsd/auto-worktree.js +180 -34
  39. package/dist/resources/extensions/gsd/auto.js +80 -21
  40. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +19 -1
  41. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
  42. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -6
  43. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
  44. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
  45. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
  46. package/dist/resources/extensions/gsd/component-loader.js +447 -0
  47. package/dist/resources/extensions/gsd/component-types.js +69 -0
  48. package/dist/resources/extensions/gsd/context-store.js +23 -7
  49. package/dist/resources/extensions/gsd/detection.js +49 -1
  50. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -17
  51. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  52. package/dist/resources/extensions/gsd/file-lock.js +49 -9
  53. package/dist/resources/extensions/gsd/forensics.js +106 -0
  54. package/dist/resources/extensions/gsd/gate-registry.js +2 -2
  55. package/dist/resources/extensions/gsd/git-constants.js +28 -1
  56. package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
  57. package/dist/resources/extensions/gsd/git-service.js +127 -2
  58. package/dist/resources/extensions/gsd/gitignore.js +1 -0
  59. package/dist/resources/extensions/gsd/gsd-db.js +6 -3
  60. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
  61. package/dist/resources/extensions/gsd/guided-flow.js +39 -13
  62. package/dist/resources/extensions/gsd/journal.js +17 -2
  63. package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
  64. package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
  65. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
  66. package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
  67. package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
  68. package/dist/resources/extensions/gsd/model-router.js +6 -0
  69. package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
  70. package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
  71. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
  72. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  73. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  74. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  75. package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  76. package/dist/resources/extensions/gsd/reports.js +5 -4
  77. package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
  78. package/dist/resources/extensions/gsd/service-tier.js +5 -2
  79. package/dist/resources/extensions/gsd/session-lock.js +19 -10
  80. package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
  81. package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
  82. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
  83. package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
  84. package/dist/resources/extensions/gsd/state.js +69 -58
  85. package/dist/resources/extensions/gsd/sync-lock.js +98 -42
  86. package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
  87. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
  88. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
  89. package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
  90. package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
  91. package/dist/resources/extensions/gsd/uok/audit.js +18 -2
  92. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
  93. package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
  94. package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
  95. package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
  96. package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
  97. package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
  98. package/dist/resources/extensions/gsd/uok/plan-v2.js +10 -4
  99. package/dist/resources/extensions/gsd/uok/writer.js +82 -0
  100. package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
  101. package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
  102. package/dist/resources/extensions/gsd/worktree-manager.js +86 -8
  103. package/dist/resources/extensions/gsd/worktree-resolver.js +86 -7
  104. package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
  105. package/dist/resources/extensions/mcp-client/auth.js +10 -1
  106. package/dist/resources/extensions/mcp-client/index.js +121 -10
  107. package/dist/resources/extensions/ollama/index.js +5 -1
  108. package/dist/resources/extensions/remote-questions/manager.js +11 -5
  109. package/dist/resources/skills/create-skill/SKILL.md +2 -2
  110. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  111. package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  112. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  113. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  114. package/dist/web/standalone/.next/BUILD_ID +1 -1
  115. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  116. package/dist/web/standalone/.next/build-manifest.json +3 -3
  117. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  118. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/index.html +1 -1
  200. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  207. package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
  208. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  209. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  211. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  213. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  214. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  215. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  216. package/dist/web/standalone/.next/static/chunks/{webpack-1832629448831fdc.js → webpack-2e68521d7c82f7c2.js} +1 -1
  217. package/package.json +4 -5
  218. package/packages/daemon/src/logger.ts +4 -3
  219. package/packages/mcp-server/README.md +3 -3
  220. package/packages/mcp-server/dist/env-writer.d.ts +1 -0
  221. package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
  222. package/packages/mcp-server/dist/env-writer.js +74 -6
  223. package/packages/mcp-server/dist/env-writer.js.map +1 -1
  224. package/packages/mcp-server/dist/server.d.ts +24 -0
  225. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  226. package/packages/mcp-server/dist/server.js +111 -87
  227. package/packages/mcp-server/dist/server.js.map +1 -1
  228. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  229. package/packages/mcp-server/dist/workflow-tools.js +15 -6
  230. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  231. package/packages/mcp-server/src/env-writer.test.ts +79 -1
  232. package/packages/mcp-server/src/env-writer.ts +76 -6
  233. package/packages/mcp-server/src/mcp-server.test.ts +25 -3
  234. package/packages/mcp-server/src/readers/graph.test.ts +87 -15
  235. package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
  236. package/packages/mcp-server/src/server.ts +158 -105
  237. package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
  238. package/packages/mcp-server/src/workflow-tools.ts +19 -6
  239. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  240. package/packages/native/package.json +1 -1
  241. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  242. package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
  243. package/packages/native/src/__tests__/ps.test.mjs +14 -8
  244. package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
  245. package/packages/native/src/__tests__/truncate.test.mjs +17 -2
  246. package/packages/pi-agent-core/src/agent-loop.test.ts +5 -15
  247. package/packages/pi-agent-core/src/agent.test.ts +96 -102
  248. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  249. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  250. package/packages/pi-ai/dist/models/capability-patches.js +9 -2
  251. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  252. package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
  253. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  254. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  255. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  256. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  257. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  258. package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
  259. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
  260. package/packages/pi-ai/dist/models/generated/openai.js +17 -0
  261. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
  262. package/packages/pi-ai/dist/models.generated.test.js +43 -70
  263. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  264. package/packages/pi-ai/dist/models.test.js +36 -11
  265. package/packages/pi-ai/dist/models.test.js.map +1 -1
  266. package/packages/pi-ai/scripts/generate-models.ts +44 -0
  267. package/packages/pi-ai/src/models/capability-patches.ts +10 -2
  268. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  269. package/packages/pi-ai/src/models/generated/openai.ts +17 -0
  270. package/packages/pi-ai/src/models.generated.test.ts +46 -73
  271. package/packages/pi-ai/src/models.test.ts +48 -11
  272. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  273. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
  274. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
  276. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
  278. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
  280. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +21 -16
  282. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
  284. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
  285. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
  286. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
  287. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  288. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/extensions/loader.js +61 -0
  290. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +30 -4
  292. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +17 -0
  294. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
  296. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
  299. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
  301. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
  303. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
  304. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
  305. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
  306. package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
  307. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
  309. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
  311. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
  313. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -2
  315. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  317. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  318. package/packages/pi-coding-agent/dist/index.js +1 -0
  319. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +20 -13
  325. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
  338. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +125 -0
  340. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
  342. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
  345. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +105 -13
  347. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
  349. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
  350. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
  351. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
  352. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
  353. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
  354. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
  355. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
  356. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +24 -17
  357. package/packages/pi-coding-agent/src/core/extensions/loader.ts +58 -0
  358. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +35 -4
  359. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +20 -0
  360. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
  361. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
  362. package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
  363. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  364. package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
  365. package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
  366. package/packages/pi-coding-agent/src/core/system-prompt.ts +35 -1
  367. package/packages/pi-coding-agent/src/index.ts +1 -0
  368. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
  369. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
  370. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
  371. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
  372. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
  373. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
  374. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +146 -1
  375. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
  376. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
  377. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
  378. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  379. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  380. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +18 -8
  381. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  382. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
  383. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  384. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +51 -6
  385. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  386. package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
  387. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  388. package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
  389. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  390. package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
  391. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
  392. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
  393. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
  394. package/packages/pi-tui/dist/components/editor.d.ts +14 -0
  395. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  396. package/packages/pi-tui/dist/components/editor.js +19 -0
  397. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  398. package/packages/pi-tui/dist/components/image.test.js +6 -5
  399. package/packages/pi-tui/dist/components/image.test.js.map +1 -1
  400. package/packages/pi-tui/dist/editor-component.d.ts +2 -0
  401. package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
  402. package/packages/pi-tui/dist/editor-component.js.map +1 -1
  403. package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
  404. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  405. package/packages/pi-tui/dist/stdin-buffer.js +20 -0
  406. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  407. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +24 -8
  408. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
  409. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +62 -6
  410. package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
  411. package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
  412. package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
  413. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
  414. package/packages/pi-tui/src/components/editor.ts +22 -0
  415. package/packages/pi-tui/src/components/image.test.ts +10 -5
  416. package/packages/pi-tui/src/editor-component.ts +3 -0
  417. package/packages/pi-tui/src/stdin-buffer.ts +26 -0
  418. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  419. package/packages/rpc-client/dist/rpc-client.test.js +101 -51
  420. package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
  421. package/packages/rpc-client/src/rpc-client.test.ts +109 -52
  422. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  423. package/scripts/install.js +15 -1
  424. package/src/resources/extensions/browser-tools/capture.ts +12 -0
  425. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  426. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  427. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  428. package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
  429. package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
  430. package/src/resources/extensions/claude-code-cli/readiness.ts +5 -1
  431. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +532 -29
  432. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +941 -91
  433. package/src/resources/extensions/github-sync/templates.ts +151 -0
  434. package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
  435. package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
  436. package/src/resources/extensions/google-search/index.ts +3 -2
  437. package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
  438. package/src/resources/extensions/gsd/auto/loop.ts +142 -2
  439. package/src/resources/extensions/gsd/auto/phases.ts +62 -38
  440. package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
  441. package/src/resources/extensions/gsd/auto/run-unit.ts +16 -2
  442. package/src/resources/extensions/gsd/auto/session.ts +7 -2
  443. package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
  444. package/src/resources/extensions/gsd/auto-dispatch.ts +176 -29
  445. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  446. package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
  447. package/src/resources/extensions/gsd/auto-post-unit.ts +193 -73
  448. package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
  449. package/src/resources/extensions/gsd/auto-recovery.ts +230 -51
  450. package/src/resources/extensions/gsd/auto-start.ts +127 -9
  451. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
  452. package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
  453. package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
  454. package/src/resources/extensions/gsd/auto-worktree.ts +190 -31
  455. package/src/resources/extensions/gsd/auto.ts +95 -23
  456. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +20 -1
  457. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
  458. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -6
  459. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
  460. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
  461. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
  462. package/src/resources/extensions/gsd/component-loader.ts +598 -0
  463. package/src/resources/extensions/gsd/component-types.ts +362 -0
  464. package/src/resources/extensions/gsd/context-store.ts +25 -8
  465. package/src/resources/extensions/gsd/detection.ts +58 -1
  466. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -20
  467. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  468. package/src/resources/extensions/gsd/file-lock.ts +84 -11
  469. package/src/resources/extensions/gsd/forensics.ts +118 -1
  470. package/src/resources/extensions/gsd/gate-registry.ts +2 -2
  471. package/src/resources/extensions/gsd/git-constants.ts +30 -1
  472. package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
  473. package/src/resources/extensions/gsd/git-service.ts +150 -2
  474. package/src/resources/extensions/gsd/gitignore.ts +1 -0
  475. package/src/resources/extensions/gsd/gsd-db.ts +6 -3
  476. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
  477. package/src/resources/extensions/gsd/guided-flow.ts +57 -14
  478. package/src/resources/extensions/gsd/journal.ts +38 -3
  479. package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
  480. package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
  481. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
  482. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  483. package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
  484. package/src/resources/extensions/gsd/model-router.ts +6 -0
  485. package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
  486. package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
  487. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
  488. package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  489. package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  490. package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  491. package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  492. package/src/resources/extensions/gsd/reports.ts +5 -4
  493. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
  494. package/src/resources/extensions/gsd/service-tier.ts +5 -2
  495. package/src/resources/extensions/gsd/session-lock.ts +20 -10
  496. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  497. package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
  498. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
  499. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  500. package/src/resources/extensions/gsd/state.ts +76 -66
  501. package/src/resources/extensions/gsd/sync-lock.ts +97 -39
  502. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
  503. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
  504. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
  505. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
  506. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +135 -285
  507. package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
  508. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
  509. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
  510. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
  511. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +93 -0
  512. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
  513. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
  514. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +3 -2
  515. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
  516. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
  517. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
  518. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
  519. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
  520. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
  521. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
  522. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  523. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
  524. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
  525. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
  526. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
  527. package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
  528. package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
  529. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  530. package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
  531. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
  532. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
  533. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +159 -0
  534. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
  535. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
  536. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
  537. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
  538. package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
  539. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
  540. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
  541. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +5 -0
  542. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
  543. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
  544. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
  545. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
  546. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
  547. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
  548. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
  549. package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
  550. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
  551. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
  552. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
  553. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +14 -4
  554. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
  555. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
  556. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
  557. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
  558. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
  559. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
  560. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  561. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
  562. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
  563. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
  564. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
  565. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
  566. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
  567. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +64 -0
  568. package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
  569. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +47 -0
  570. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
  571. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
  572. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
  573. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  574. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  575. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  576. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
  577. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
  578. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
  579. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -130
  580. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
  581. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
  582. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
  583. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
  584. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
  585. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +54 -41
  586. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +213 -0
  587. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
  588. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
  589. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
  590. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
  591. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
  592. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
  593. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
  594. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
  595. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
  596. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +6 -3
  597. package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
  598. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
  599. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  600. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
  601. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
  602. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
  603. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
  604. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
  605. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  606. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
  607. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
  608. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
  609. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
  610. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
  611. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
  612. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  613. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
  614. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
  615. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
  616. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
  617. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
  618. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
  619. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
  620. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
  621. package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
  622. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  623. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
  624. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
  625. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
  626. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
  627. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
  628. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
  629. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
  630. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
  631. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
  632. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
  633. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
  634. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  635. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +19 -2
  636. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  637. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +12 -0
  638. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
  639. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
  640. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
  641. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
  642. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
  643. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
  644. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
  645. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
  646. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
  647. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
  648. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
  649. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
  650. package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
  651. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
  652. package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
  653. package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
  654. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
  655. package/src/resources/extensions/gsd/types.ts +3 -3
  656. package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
  657. package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
  658. package/src/resources/extensions/gsd/uok/audit.ts +20 -2
  659. package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
  660. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
  661. package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
  662. package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
  663. package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
  664. package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
  665. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  666. package/src/resources/extensions/gsd/uok/plan-v2.ts +13 -5
  667. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  668. package/src/resources/extensions/gsd/workflow-logger.ts +22 -3
  669. package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
  670. package/src/resources/extensions/gsd/worktree-manager.ts +109 -7
  671. package/src/resources/extensions/gsd/worktree-resolver.ts +96 -9
  672. package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
  673. package/src/resources/extensions/mcp-client/auth.ts +12 -1
  674. package/src/resources/extensions/mcp-client/index.ts +132 -11
  675. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
  676. package/src/resources/extensions/ollama/index.ts +5 -1
  677. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
  678. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
  679. package/src/resources/extensions/remote-questions/manager.ts +36 -4
  680. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
  681. package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
  682. package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
  683. package/src/resources/skills/create-skill/SKILL.md +2 -2
  684. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  685. package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  686. package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  687. package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
  688. package/dist/web/standalone/.next/static/chunks/2826.d445fb428ef41fa1.js +0 -9
  689. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
  690. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
  691. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
  692. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
  693. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
  694. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -143
  695. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -157
  696. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
  697. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
  698. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
  699. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  700. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
  701. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
  702. package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
  703. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
  704. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
  705. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
  706. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
  707. /package/dist/web/standalone/.next/static/{H51SzzS_EEgdBsDVhrLBv → SvCJDZPQW104bR1KnBQg1}/_buildManifest.js +0 -0
  708. /package/dist/web/standalone/.next/static/{H51SzzS_EEgdBsDVhrLBv → SvCJDZPQW104bR1KnBQg1}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"compaction-orchestrator.js","sourceRoot":"","sources":["../../src/core/compaction-orchestrator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CompactionOrchestrator - Manages manual and automatic context compaction.\n *\n * Handles:\n * - Manual compaction (user-triggered /compact)\n * - Auto-compaction when context exceeds threshold\n * - Overflow recovery when LLM returns context overflow errors\n * - Extension integration for custom compaction providers\n * - Branch summarization abort coordination\n */\n\nimport type { Agent } from \"@gsd/pi-agent-core\";\nimport type { AssistantMessage, Model } from \"@gsd/pi-ai\";\nimport { isContextOverflow } from \"@gsd/pi-ai\";\nimport {\n\ttype CompactionResult,\n\tCompactionProducedNoSummaryError,\n\tcalculateContextTokens,\n\tcompact,\n\testimateContextTokens,\n\tprepareCompaction,\n\tshouldCompact,\n} from \"./compaction/index.js\";\nimport type { ExtensionRunner, SessionBeforeCompactResult } from \"./extensions/index.js\";\nimport type { ModelRegistry } from \"./model-registry.js\";\nimport { getLatestCompactionEntry } from \"./session-manager.js\";\nimport type { CompactionEntry, SessionManager } from \"./session-manager.js\";\nimport type { SettingsManager } from \"./settings-manager.js\";\nimport type { AgentSessionEvent } from \"./agent-session.js\";\nimport { getErrorMessage } from \"../utils/error.js\";\n\n/** Dependencies injected from AgentSession into CompactionOrchestrator */\nexport interface CompactionOrchestratorDeps {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\treadonly modelRegistry: ModelRegistry;\n\tgetModel: () => Model<any> | undefined;\n\tgetSessionId: () => string;\n\tgetExtensionRunner: () => ExtensionRunner | undefined;\n\temit: (event: AgentSessionEvent) => void;\n\tdisconnectFromAgent: () => void;\n\treconnectToAgent: () => void;\n\tabort: () => Promise<void>;\n}\n\nexport class CompactionOrchestrator {\n\tprivate _compactionAbortController: AbortController | undefined = undefined;\n\tprivate _autoCompactionAbortController: AbortController | undefined = undefined;\n\tprivate _overflowRecoveryAttempted = false;\n\tprivate _branchSummaryAbortController: AbortController | undefined = undefined;\n\n\tconstructor(private readonly _deps: CompactionOrchestratorDeps) {}\n\n\t/** Whether compaction or branch summarization is currently running */\n\tget isCompacting(): boolean {\n\t\treturn (\n\t\t\tthis._autoCompactionAbortController !== undefined ||\n\t\t\tthis._compactionAbortController !== undefined ||\n\t\t\tthis._branchSummaryAbortController !== undefined\n\t\t);\n\t}\n\n\t/** Reset overflow recovery flag (called when a new user message starts) */\n\tresetOverflowRecovery(): void {\n\t\tthis._overflowRecoveryAttempted = false;\n\t}\n\n\t/** Mark overflow recovery as not needed (called on successful assistant response) */\n\tclearOverflowRecovery(): void {\n\t\tthis._overflowRecoveryAttempted = false;\n\t}\n\n\t/** Get/set the branch summary abort controller (used by navigateTree) */\n\tget branchSummaryAbortController(): AbortController | undefined {\n\t\treturn this._branchSummaryAbortController;\n\t}\n\tset branchSummaryAbortController(controller: AbortController | undefined) {\n\t\tthis._branchSummaryAbortController = controller;\n\t}\n\n\t/**\n\t * Manually compact the session context.\n\t * Aborts current agent operation first.\n\t * @param customInstructions Optional instructions for the compaction summary\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tthis._deps.disconnectFromAgent();\n\t\tawait this._deps.abort();\n\t\tthis._compactionAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tconst model = this._deps.getModel();\n\t\t\tif (!model) {\n\t\t\t\tthrow new Error(\"No model selected\");\n\t\t\t}\n\n\t\t\tif (!this._deps.modelRegistry.isProviderRequestReady(model.provider)) {\n\t\t\t\tthrow new Error(`No API key for ${model.provider}`);\n\t\t\t}\n\t\t\t// undefined for externalCli/none providers — stripped at the streamSimple boundary (model-registry.ts)\n\t\t\tconst apiKey = await this._deps.modelRegistry.getApiKey(model, this._deps.getSessionId());\n\n\t\t\tconst pathEntries = this._deps.sessionManager.getBranch();\n\t\t\tconst settings = this._deps.settingsManager.getCompactionSettings();\n\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\tconst lastEntry = pathEntries[pathEntries.length - 1];\n\t\t\t\tif (lastEntry?.type === \"compaction\") {\n\t\t\t\t\tthrow new Error(\"Already compacted\");\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Nothing to compact (session too small)\");\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\t\t\tconst extensionRunner = this._deps.getExtensionRunner();\n\n\t\t\tif (extensionRunner?.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst result = (await extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\tsignal: this._compactionAbortController.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (result?.cancel) {\n\t\t\t\t\tthrow new Error(\"Compaction cancelled\");\n\t\t\t\t}\n\n\t\t\t\tif (result?.compaction) {\n\t\t\t\t\textensionCompaction = result.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\tconst result = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\tmodel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\tthis._compactionAbortController.signal,\n\t\t\t\t);\n\t\t\t\tsummary = result.summary;\n\t\t\t\tfirstKeptEntryId = result.firstKeptEntryId;\n\t\t\t\ttokensBefore = result.tokensBefore;\n\t\t\t\tdetails = result.details;\n\t\t\t}\n\n\t\t\tif (this._compactionAbortController.signal.aborted) {\n\t\t\t\tthrow new Error(\"Compaction cancelled\");\n\t\t\t}\n\n\t\t\tthis._deps.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);\n\t\t\tconst newEntries = this._deps.sessionManager.getEntries();\n\t\t\tconst sessionContext = this._deps.sessionManager.buildSessionContext();\n\t\t\tthis._deps.agent.replaceMessages(sessionContext.messages);\n\n\t\t\tconst savedCompactionEntry = newEntries.find(\n\t\t\t\t(e) => e.type === \"compaction\" && e.summary === summary,\n\t\t\t) as CompactionEntry | undefined;\n\n\t\t\tif (extensionRunner && savedCompactionEntry) {\n\t\t\t\tawait extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn { summary, firstKeptEntryId, tokensBefore, details };\n\t\t} finally {\n\t\t\tthis._compactionAbortController = undefined;\n\t\t\tthis._deps.reconnectToAgent();\n\t\t}\n\t}\n\n\t/** Cancel in-progress compaction (manual or auto) */\n\tabortCompaction(): void {\n\t\tthis._compactionAbortController?.abort();\n\t\tthis._autoCompactionAbortController?.abort();\n\t}\n\n\t/** Cancel in-progress branch summarization */\n\tabortBranchSummary(): void {\n\t\tthis._branchSummaryAbortController?.abort();\n\t}\n\n\t/**\n\t * Check if compaction is needed and run it.\n\t * Called after agent_end and before prompt submission.\n\t *\n\t * Two cases:\n\t * 1. Overflow: LLM returned context overflow error, remove error message, compact, auto-retry\n\t * 2. Threshold: Context over threshold, compact, NO auto-retry\n\t *\n\t * @param assistantMessage The assistant message to check\n\t * @param skipAbortedCheck If false, include aborted messages (for pre-prompt check). Default: true\n\t */\n\tasync checkCompaction(assistantMessage: AssistantMessage, skipAbortedCheck = true): Promise<void> {\n\t\tconst settings = this._deps.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled) return;\n\n\t\tif (skipAbortedCheck && assistantMessage.stopReason === \"aborted\") return;\n\n\t\tconst model = this._deps.getModel();\n\t\tconst contextWindow = model?.contextWindow ?? 0;\n\n\t\tconst sameModel =\n\t\t\tmodel && assistantMessage.provider === model.provider && assistantMessage.model === model.id;\n\n\t\tconst branchEntries = this._deps.sessionManager.getBranch();\n\t\tconst compactionEntry = getLatestCompactionEntry(branchEntries);\n\t\tconst assistantIsFromBeforeCompaction =\n\t\t\tcompactionEntry !== null && assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();\n\t\tif (assistantIsFromBeforeCompaction) return;\n\n\t\t// Case 1: Overflow - LLM returned context overflow error\n\t\tif (sameModel && isContextOverflow(assistantMessage, contextWindow)) {\n\t\t\tif (this._overflowRecoveryAttempted) {\n\t\t\t\tthis._deps.emit({\n\t\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\"Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._overflowRecoveryAttempted = true;\n\t\t\tconst messages = this._deps.agent.state.messages;\n\t\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\t\tthis._deps.agent.replaceMessages(messages.slice(0, -1));\n\t\t\t}\n\t\t\tawait this._runAutoCompaction(\"overflow\", true);\n\t\t\treturn;\n\t\t}\n\n\t\t// Case 2: Threshold - context is getting large\n\t\tlet contextTokens: number;\n\t\tif (assistantMessage.stopReason === \"error\") {\n\t\t\tconst messages = this._deps.agent.state.messages;\n\t\t\tconst estimate = estimateContextTokens(messages);\n\t\t\tif (estimate.lastUsageIndex === null) return;\n\t\t\tconst usageMsg = messages[estimate.lastUsageIndex];\n\t\t\tif (\n\t\t\t\tcompactionEntry &&\n\t\t\t\tusageMsg.role === \"assistant\" &&\n\t\t\t\t(usageMsg as AssistantMessage).timestamp <= new Date(compactionEntry.timestamp).getTime()\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontextTokens = estimate.tokens;\n\t\t} else {\n\t\t\tcontextTokens = calculateContextTokens(assistantMessage.usage);\n\t\t}\n\t\tif (shouldCompact(contextTokens, contextWindow, settings)) {\n\t\t\tawait this._runAutoCompaction(\"threshold\", false);\n\t\t}\n\t}\n\n\t/** Toggle auto-compaction setting */\n\tsetAutoCompactionEnabled(enabled: boolean): void {\n\t\tthis._deps.settingsManager.setCompactionEnabled(enabled);\n\t}\n\n\t/** Whether auto-compaction is enabled */\n\tget autoCompactionEnabled(): boolean {\n\t\treturn this._deps.settingsManager.getCompactionEnabled();\n\t}\n\n\t// =========================================================================\n\t// Private helpers\n\t// =========================================================================\n\n\tprivate async _runAutoCompaction(reason: \"overflow\" | \"threshold\", willRetry: boolean): Promise<void> {\n\t\tconst settings = this._deps.settingsManager.getCompactionSettings();\n\n\t\tthis._deps.emit({ type: \"auto_compaction_start\", reason });\n\t\tthis._autoCompactionAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tconst model = this._deps.getModel();\n\t\t\tif (!model) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this._deps.modelRegistry.isProviderRequestReady(model.provider)) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// undefined for externalCli/none providers — stripped at the streamSimple boundary (model-registry.ts)\n\t\t\tconst apiKey = await this._deps.modelRegistry.getApiKey(model, this._deps.getSessionId());\n\n\t\t\tconst pathEntries = this._deps.sessionManager.getBranch();\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\t\t\tconst extensionRunner = this._deps.getExtensionRunner();\n\n\t\t\tif (extensionRunner?.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst extensionResult = (await extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions: undefined,\n\t\t\t\t\tsignal: this._autoCompactionAbortController.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (extensionResult?.cancel) {\n\t\t\t\t\tthis._deps.emit({\n\t\t\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\t\t\tresult: undefined,\n\t\t\t\t\t\taborted: true,\n\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (extensionResult?.compaction) {\n\t\t\t\t\textensionCompaction = extensionResult.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\tconst compactResult = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\tmodel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tundefined,\n\t\t\t\t\tthis._autoCompactionAbortController.signal,\n\t\t\t\t);\n\t\t\t\tsummary = compactResult.summary;\n\t\t\t\tfirstKeptEntryId = compactResult.firstKeptEntryId;\n\t\t\t\ttokensBefore = compactResult.tokensBefore;\n\t\t\t\tdetails = compactResult.details;\n\t\t\t}\n\n\t\t\tif (this._autoCompactionAbortController.signal.aborted) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: true, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._deps.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);\n\t\t\tconst newEntries = this._deps.sessionManager.getEntries();\n\t\t\tconst sessionContext = this._deps.sessionManager.buildSessionContext();\n\t\t\tthis._deps.agent.replaceMessages(sessionContext.messages);\n\n\t\t\tconst savedCompactionEntry = newEntries.find(\n\t\t\t\t(e) => e.type === \"compaction\" && e.summary === summary,\n\t\t\t) as CompactionEntry | undefined;\n\n\t\t\tif (extensionRunner && savedCompactionEntry) {\n\t\t\t\tawait extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result: CompactionResult = { summary, firstKeptEntryId, tokensBefore, details };\n\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result, aborted: false, willRetry });\n\n\t\t\tif (willRetry) {\n\t\t\t\tconst messages = this._deps.agent.state.messages;\n\t\t\t\tconst lastMsg = messages[messages.length - 1];\n\t\t\t\tif (lastMsg?.role === \"assistant\" && (lastMsg as AssistantMessage).stopReason === \"error\") {\n\t\t\t\t\tthis._deps.agent.replaceMessages(messages.slice(0, -1));\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._deps.agent.continue().catch(() => {});\n\t\t\t\t}, 100);\n\t\t\t} else if (this._deps.agent.hasQueuedMessages()) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._deps.agent.continue().catch(() => {});\n\t\t\t\t}, 100);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Distinguish the \"no usable summary\" failure (issue #4665) so the UI\n\t\t\t// can surface a clearer message than a generic compaction failure.\n\t\t\t// Either way we drop the would-be compaction entry rather than writing\n\t\t\t// an empty string to the session history.\n\t\t\tconst errorMessage = error instanceof CompactionProducedNoSummaryError\n\t\t\t\t? `Compaction produced no usable summary — session history preserved as-is. (${error.message})`\n\t\t\t\t: getErrorMessage(error);\n\t\t\tthis._deps.emit({\n\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\terrorMessage:\n\t\t\t\t\treason === \"overflow\"\n\t\t\t\t\t\t? `Context overflow recovery failed: ${errorMessage}`\n\t\t\t\t\t\t: `Auto-compaction failed: ${errorMessage}`,\n\t\t\t});\n\t\t} finally {\n\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"compaction-orchestrator.js","sourceRoot":"","sources":["../../src/core/compaction-orchestrator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CompactionOrchestrator - Manages manual and automatic context compaction.\n *\n * Handles:\n * - Manual compaction (user-triggered /compact)\n * - Auto-compaction when context exceeds threshold\n * - Overflow recovery when LLM returns context overflow errors\n * - Extension integration for custom compaction providers\n * - Branch summarization abort coordination\n */\n\nimport type { Agent } from \"@gsd/pi-agent-core\";\nimport type { AssistantMessage, Model } from \"@gsd/pi-ai\";\nimport { isContextOverflow } from \"@gsd/pi-ai\";\nimport {\n\ttype CompactionResult,\n\tCompactionProducedNoSummaryError,\n\tcalculateContextTokens,\n\tcompact,\n\testimateContextTokens,\n\tprepareCompaction,\n\tshouldCompact,\n} from \"./compaction/index.js\";\nimport type { ExtensionRunner, SessionBeforeCompactResult } from \"./extensions/index.js\";\nimport type { ModelRegistry } from \"./model-registry.js\";\nimport { getLatestCompactionEntry } from \"./session-manager.js\";\nimport type { CompactionEntry, SessionManager } from \"./session-manager.js\";\nimport type { SettingsManager } from \"./settings-manager.js\";\nimport type { AgentSessionEvent } from \"./agent-session.js\";\nimport { getErrorMessage } from \"../utils/error.js\";\n\n/** Dependencies injected from AgentSession into CompactionOrchestrator */\nexport interface CompactionOrchestratorDeps {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\treadonly modelRegistry: ModelRegistry;\n\tgetModel: () => Model<any> | undefined;\n\tgetSessionId: () => string;\n\tgetExtensionRunner: () => ExtensionRunner | undefined;\n\temit: (event: AgentSessionEvent) => void;\n\tdisconnectFromAgent: () => void;\n\treconnectToAgent: () => void;\n\tabort: () => Promise<void>;\n}\n\nexport class CompactionOrchestrator {\n\tprivate _compactionAbortController: AbortController | undefined = undefined;\n\tprivate _autoCompactionAbortController: AbortController | undefined = undefined;\n\tprivate _overflowRecoveryAttempted = false;\n\tprivate _branchSummaryAbortController: AbortController | undefined = undefined;\n\n\tconstructor(private readonly _deps: CompactionOrchestratorDeps) {}\n\n\t/** Whether compaction or branch summarization is currently running */\n\tget isCompacting(): boolean {\n\t\treturn (\n\t\t\tthis._autoCompactionAbortController !== undefined ||\n\t\t\tthis._compactionAbortController !== undefined ||\n\t\t\tthis._branchSummaryAbortController !== undefined\n\t\t);\n\t}\n\n\t/** Reset overflow recovery flag (called when a new user message starts) */\n\tresetOverflowRecovery(): void {\n\t\tthis._overflowRecoveryAttempted = false;\n\t}\n\n\t/** Mark overflow recovery as not needed (called on successful assistant response) */\n\tclearOverflowRecovery(): void {\n\t\tthis._overflowRecoveryAttempted = false;\n\t}\n\n\t/** Get/set the branch summary abort controller (used by navigateTree) */\n\tget branchSummaryAbortController(): AbortController | undefined {\n\t\treturn this._branchSummaryAbortController;\n\t}\n\tset branchSummaryAbortController(controller: AbortController | undefined) {\n\t\tthis._branchSummaryAbortController = controller;\n\t}\n\n\t/**\n\t * Manually compact the session context.\n\t * Aborts current agent operation first.\n\t * @param customInstructions Optional instructions for the compaction summary\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tthis._deps.disconnectFromAgent();\n\t\tawait this._deps.abort();\n\t\tthis._compactionAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tconst model = this._deps.getModel();\n\t\t\tif (!model) {\n\t\t\t\tthrow new Error(\"No model selected\");\n\t\t\t}\n\n\t\t\tif (!this._deps.modelRegistry.isProviderRequestReady(model.provider)) {\n\t\t\t\tthrow new Error(`No API key for ${model.provider}`);\n\t\t\t}\n\t\t\t// undefined for externalCli/none providers — stripped at the streamSimple boundary (model-registry.ts)\n\t\t\tconst apiKey = await this._deps.modelRegistry.getApiKey(model, this._deps.getSessionId());\n\n\t\t\tconst pathEntries = this._deps.sessionManager.getBranch();\n\t\t\tconst settings = this._deps.settingsManager.getCompactionSettings();\n\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\tconst lastEntry = pathEntries[pathEntries.length - 1];\n\t\t\t\tif (lastEntry?.type === \"compaction\") {\n\t\t\t\t\tthrow new Error(\"Already compacted\");\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Nothing to compact (session too small)\");\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\t\t\tconst extensionRunner = this._deps.getExtensionRunner();\n\n\t\t\tif (extensionRunner?.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst result = (await extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\tsignal: this._compactionAbortController.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (result?.cancel) {\n\t\t\t\t\tthrow new Error(\"Compaction cancelled\");\n\t\t\t\t}\n\n\t\t\t\tif (result?.compaction) {\n\t\t\t\t\textensionCompaction = result.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\tconst result = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\tmodel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\tthis._compactionAbortController.signal,\n\t\t\t\t);\n\t\t\t\tsummary = result.summary;\n\t\t\t\tfirstKeptEntryId = result.firstKeptEntryId;\n\t\t\t\ttokensBefore = result.tokensBefore;\n\t\t\t\tdetails = result.details;\n\t\t\t}\n\n\t\t\tif (this._compactionAbortController.signal.aborted) {\n\t\t\t\tthrow new Error(\"Compaction cancelled\");\n\t\t\t}\n\n\t\t\tthis._deps.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);\n\t\t\tconst newEntries = this._deps.sessionManager.getEntries();\n\t\t\tconst sessionContext = this._deps.sessionManager.buildSessionContext();\n\t\t\tthis._deps.agent.replaceMessages(sessionContext.messages);\n\n\t\t\tconst savedCompactionEntry = newEntries.find(\n\t\t\t\t(e) => e.type === \"compaction\" && e.summary === summary,\n\t\t\t) as CompactionEntry | undefined;\n\n\t\t\tif (extensionRunner && savedCompactionEntry) {\n\t\t\t\tawait extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn { summary, firstKeptEntryId, tokensBefore, details };\n\t\t} finally {\n\t\t\tthis._compactionAbortController = undefined;\n\t\t\tthis._deps.reconnectToAgent();\n\t\t}\n\t}\n\n\t/** Cancel in-progress compaction (manual or auto) */\n\tabortCompaction(): void {\n\t\tthis._compactionAbortController?.abort();\n\t\tthis._autoCompactionAbortController?.abort();\n\t}\n\n\t/** Cancel in-progress branch summarization */\n\tabortBranchSummary(): void {\n\t\tthis._branchSummaryAbortController?.abort();\n\t}\n\n\t/**\n\t * Check if compaction is needed and run it.\n\t * Called after agent_end and before prompt submission.\n\t *\n\t * Two cases:\n\t * 1. Overflow: LLM returned context overflow error, remove error message, compact, auto-retry\n\t * 2. Threshold: Context over threshold, compact, NO auto-retry\n\t *\n\t * @param assistantMessage The assistant message to check\n\t * @param skipAbortedCheck If false, include aborted messages (for pre-prompt check). Default: true\n\t */\n\tasync checkCompaction(assistantMessage: AssistantMessage, skipAbortedCheck = true): Promise<void> {\n\t\tconst settings = this._deps.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled) return;\n\n\t\tif (skipAbortedCheck && assistantMessage.stopReason === \"aborted\") return;\n\n\t\tconst model = this._deps.getModel();\n\t\tconst contextWindow = model?.contextWindow ?? 0;\n\n\t\tconst sameModel =\n\t\t\tmodel && assistantMessage.provider === model.provider && assistantMessage.model === model.id;\n\n\t\tconst branchEntries = this._deps.sessionManager.getBranch();\n\t\tconst compactionEntry = getLatestCompactionEntry(branchEntries);\n\t\tconst assistantIsFromBeforeCompaction =\n\t\t\tcompactionEntry !== null && assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();\n\t\tif (assistantIsFromBeforeCompaction) return;\n\n\t\t// Case 1: Overflow - LLM returned context overflow error\n\t\tif (sameModel && isContextOverflow(assistantMessage, contextWindow)) {\n\t\t\tif (this._overflowRecoveryAttempted) {\n\t\t\t\tthis._deps.emit({\n\t\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\"Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._overflowRecoveryAttempted = true;\n\t\t\tconst messages = this._deps.agent.state.messages;\n\t\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\t\tthis._deps.agent.replaceMessages(messages.slice(0, -1));\n\t\t\t}\n\t\t\tawait this._runAutoCompaction(\"overflow\", true);\n\t\t\treturn;\n\t\t}\n\n\t\t// Case 2: Threshold - context is getting large\n\t\tlet contextTokens: number;\n\t\tif (assistantMessage.stopReason === \"error\") {\n\t\t\tconst messages = this._deps.agent.state.messages;\n\t\t\tconst estimate = estimateContextTokens(messages);\n\t\t\tif (estimate.lastUsageIndex === null) return;\n\t\t\tconst usageMsg = messages[estimate.lastUsageIndex];\n\t\t\tif (\n\t\t\t\tcompactionEntry &&\n\t\t\t\tusageMsg.role === \"assistant\" &&\n\t\t\t\t(usageMsg as AssistantMessage).timestamp <= new Date(compactionEntry.timestamp).getTime()\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontextTokens = estimate.tokens;\n\t\t} else {\n\t\t\tcontextTokens = calculateContextTokens(assistantMessage.usage);\n\t\t}\n\t\tif (shouldCompact(contextTokens, contextWindow, settings)) {\n\t\t\tawait this._runAutoCompaction(\"threshold\", false);\n\t\t}\n\t}\n\n\t/** Toggle auto-compaction setting */\n\tsetAutoCompactionEnabled(enabled: boolean): void {\n\t\tthis._deps.settingsManager.setCompactionEnabled(enabled);\n\t}\n\n\t/** Whether auto-compaction is enabled */\n\tget autoCompactionEnabled(): boolean {\n\t\treturn this._deps.settingsManager.getCompactionEnabled();\n\t}\n\n\t// =========================================================================\n\t// Private helpers\n\t// =========================================================================\n\n\tprivate async _runAutoCompaction(reason: \"overflow\" | \"threshold\", willRetry: boolean): Promise<void> {\n\t\tconst settings = this._deps.settingsManager.getCompactionSettings();\n\n\t\tthis._deps.emit({ type: \"auto_compaction_start\", reason });\n\t\tthis._autoCompactionAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tconst model = this._deps.getModel();\n\t\t\tif (!model) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this._deps.modelRegistry.isProviderRequestReady(model.provider)) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// undefined for externalCli/none providers — stripped at the streamSimple boundary (model-registry.ts)\n\t\t\tconst apiKey = await this._deps.modelRegistry.getApiKey(model, this._deps.getSessionId());\n\n\t\t\tconst pathEntries = this._deps.sessionManager.getBranch();\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\t\t\tconst extensionRunner = this._deps.getExtensionRunner();\n\n\t\t\tif (extensionRunner?.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst extensionResult = (await extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions: undefined,\n\t\t\t\t\tsignal: this._autoCompactionAbortController.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (extensionResult?.cancel) {\n\t\t\t\t\tthis._deps.emit({\n\t\t\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\t\t\tresult: undefined,\n\t\t\t\t\t\taborted: true,\n\t\t\t\t\t\twillRetry,\n\t\t\t\t\t});\n\t\t\t\t\tthis._scheduleAutoCompactionFollowup(willRetry);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (extensionResult?.compaction) {\n\t\t\t\t\textensionCompaction = extensionResult.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\tconst compactResult = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\tmodel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tundefined,\n\t\t\t\t\tthis._autoCompactionAbortController.signal,\n\t\t\t\t);\n\t\t\t\tsummary = compactResult.summary;\n\t\t\t\tfirstKeptEntryId = compactResult.firstKeptEntryId;\n\t\t\t\ttokensBefore = compactResult.tokensBefore;\n\t\t\t\tdetails = compactResult.details;\n\t\t\t}\n\n\t\t\tif (this._autoCompactionAbortController.signal.aborted) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: true, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._deps.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);\n\t\t\tconst newEntries = this._deps.sessionManager.getEntries();\n\t\t\tconst sessionContext = this._deps.sessionManager.buildSessionContext();\n\t\t\tthis._deps.agent.replaceMessages(sessionContext.messages);\n\n\t\t\tconst savedCompactionEntry = newEntries.find(\n\t\t\t\t(e) => e.type === \"compaction\" && e.summary === summary,\n\t\t\t) as CompactionEntry | undefined;\n\n\t\t\tif (extensionRunner && savedCompactionEntry) {\n\t\t\t\tawait extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result: CompactionResult = { summary, firstKeptEntryId, tokensBefore, details };\n\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result, aborted: false, willRetry });\n\t\t\tthis._scheduleAutoCompactionFollowup(willRetry);\n\t\t} catch (error) {\n\t\t\t// Distinguish the \"no usable summary\" failure (issue #4665) so the UI\n\t\t\t// can surface a clearer message than a generic compaction failure.\n\t\t\t// Either way we drop the would-be compaction entry rather than writing\n\t\t\t// an empty string to the session history.\n\t\t\tconst errorMessage = error instanceof CompactionProducedNoSummaryError\n\t\t\t\t? `Compaction produced no usable summary — session history preserved as-is. (${error.message})`\n\t\t\t\t: getErrorMessage(error);\n\t\t\tthis._deps.emit({\n\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\terrorMessage:\n\t\t\t\t\treason === \"overflow\"\n\t\t\t\t\t\t? `Context overflow recovery failed: ${errorMessage}`\n\t\t\t\t\t\t: `Auto-compaction failed: ${errorMessage}`,\n\t\t\t});\n\t\t} finally {\n\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t}\n\t}\n\n\tprivate _scheduleAutoCompactionFollowup(willRetry: boolean): void {\n\t\tif (willRetry) {\n\t\t\tconst messages = this._deps.agent.state.messages;\n\t\t\tconst lastMsg = messages[messages.length - 1];\n\t\t\tif (lastMsg?.role === \"assistant\" && (lastMsg as AssistantMessage).stopReason === \"error\") {\n\t\t\t\tthis._deps.agent.replaceMessages(messages.slice(0, -1));\n\t\t\t}\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._deps.agent.continue().catch(() => {});\n\t\t\t}, 100);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._deps.agent.hasQueuedMessages()) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._deps.agent.continue().catch(() => {});\n\t\t\t}, 100);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compaction-orchestrator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction-orchestrator.test.d.ts","sourceRoot":"","sources":["../../src/core/compaction-orchestrator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,130 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtempSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { describe, it, mock } from "node:test";
6
+ import { CompactionOrchestrator } from "./compaction-orchestrator.js";
7
+ import { SessionManager } from "./session-manager.js";
8
+ function createMockModel() {
9
+ return {
10
+ id: "claude-opus-4-6",
11
+ name: "Claude Opus 4.6",
12
+ api: "anthropic-messages",
13
+ provider: "anthropic",
14
+ baseUrl: "https://api.anthropic.com",
15
+ reasoning: false,
16
+ input: ["text"],
17
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
18
+ contextWindow: 200_000,
19
+ maxTokens: 16_384,
20
+ };
21
+ }
22
+ function createAssistantMessage(stopReason, contentText) {
23
+ return {
24
+ role: "assistant",
25
+ content: [{ type: "text", text: contentText }],
26
+ api: "anthropic-messages",
27
+ provider: "anthropic",
28
+ model: "claude-opus-4-6",
29
+ usage: {
30
+ input: 100,
31
+ output: 100,
32
+ cacheRead: 0,
33
+ cacheWrite: 0,
34
+ totalTokens: 200,
35
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
36
+ },
37
+ stopReason,
38
+ timestamp: Date.now(),
39
+ errorMessage: stopReason === "error" ? contentText : undefined,
40
+ };
41
+ }
42
+ function wait(ms) {
43
+ return new Promise((resolve) => setTimeout(resolve, ms));
44
+ }
45
+ function createHarness(overrides) {
46
+ const dir = mkdtempSync(join(tmpdir(), "compaction-orchestrator-test-"));
47
+ const sessionManager = SessionManager.create(dir, dir);
48
+ sessionManager.appendMessage({ role: "user", content: "First user message" });
49
+ sessionManager.appendMessage(createAssistantMessage("stop", "First assistant message"));
50
+ sessionManager.appendMessage({ role: "user", content: "Second user message" });
51
+ const emittedEvents = [];
52
+ const continueFn = mock.fn(async () => { });
53
+ const replaceMessages = mock.fn((nextMessages) => {
54
+ agent.state.messages = nextMessages;
55
+ });
56
+ const agent = {
57
+ state: {
58
+ messages: [
59
+ { role: "user", content: "queued follow-up" },
60
+ createAssistantMessage("error", "context overflow"),
61
+ ],
62
+ },
63
+ continue: continueFn,
64
+ replaceMessages,
65
+ hasQueuedMessages: () => overrides?.hasQueuedMessages ?? false,
66
+ };
67
+ const extensionRunner = {
68
+ hasHandlers: mock.fn(() => true),
69
+ emit: mock.fn(async () => ({ cancel: overrides?.cancelResult ?? true })),
70
+ };
71
+ const deps = {
72
+ agent,
73
+ sessionManager,
74
+ settingsManager: {
75
+ getCompactionSettings: () => ({
76
+ enabled: true,
77
+ reserveTokens: 16_384,
78
+ keepRecentTokens: 1,
79
+ }),
80
+ },
81
+ modelRegistry: {
82
+ isProviderRequestReady: () => true,
83
+ getApiKey: async () => undefined,
84
+ },
85
+ getModel: () => createMockModel(),
86
+ getSessionId: () => "test-session",
87
+ getExtensionRunner: () => extensionRunner,
88
+ emit: (event) => emittedEvents.push(event),
89
+ disconnectFromAgent: () => { },
90
+ reconnectToAgent: () => { },
91
+ abort: async () => { },
92
+ };
93
+ return {
94
+ dir,
95
+ agent,
96
+ continueFn,
97
+ replaceMessages,
98
+ emittedEvents,
99
+ extensionRunner,
100
+ orchestrator: new CompactionOrchestrator(deps),
101
+ cleanup: () => rmSync(dir, { recursive: true, force: true }),
102
+ };
103
+ }
104
+ describe("CompactionOrchestrator", () => {
105
+ it("overflow cancel keeps retry intent and resumes the agent (#3971)", async (t) => {
106
+ const harness = createHarness({ willRetry: true });
107
+ t.after(harness.cleanup);
108
+ await harness.orchestrator._runAutoCompaction("overflow", true);
109
+ await wait(150);
110
+ const endEvent = harness.emittedEvents.find((event) => event.type === "auto_compaction_end");
111
+ assert.ok(endEvent, "should emit auto_compaction_end");
112
+ assert.equal(endEvent?.aborted, true, "cancelled compaction should be marked aborted");
113
+ assert.equal(endEvent?.willRetry, true, "overflow cancel should preserve retry intent");
114
+ assert.equal(harness.continueFn.mock.callCount(), 1, "overflow cancel should resume the agent");
115
+ assert.equal(harness.replaceMessages.mock.callCount(), 1, "retry follow-up should trim the error message when present");
116
+ });
117
+ it("threshold cancel stays non-retrying when no queued messages exist", async (t) => {
118
+ const harness = createHarness({ willRetry: false, hasQueuedMessages: false });
119
+ t.after(harness.cleanup);
120
+ await harness.orchestrator._runAutoCompaction("threshold", false);
121
+ await wait(150);
122
+ const endEvent = harness.emittedEvents.find((event) => event.type === "auto_compaction_end");
123
+ assert.ok(endEvent, "should emit auto_compaction_end");
124
+ assert.equal(endEvent?.aborted, true, "cancelled compaction should be marked aborted");
125
+ assert.equal(endEvent?.willRetry, false, "threshold cancel should stay non-retrying");
126
+ assert.equal(harness.continueFn.mock.callCount(), 0, "threshold cancel should not resume the agent without queued work");
127
+ assert.equal(harness.replaceMessages.mock.callCount(), 0, "non-retry cancel should not trim messages");
128
+ });
129
+ });
130
+ //# sourceMappingURL=compaction-orchestrator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction-orchestrator.test.js","sourceRoot":"","sources":["../../src/core/compaction-orchestrator.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\";\nimport { mkdtempSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { describe, it, mock, type Mock } from \"node:test\";\n\nimport type { Agent } from \"@gsd/pi-agent-core\";\nimport type { Api, AssistantMessage, Model } from \"@gsd/pi-ai\";\n\nimport { CompactionOrchestrator, type CompactionOrchestratorDeps } from \"./compaction-orchestrator.js\";\nimport { SessionManager } from \"./session-manager.js\";\n\nfunction createMockModel(): Model<Api> {\n\treturn {\n\t\tid: \"claude-opus-4-6\",\n\t\tname: \"Claude Opus 4.6\",\n\t\tapi: \"anthropic-messages\" as Api,\n\t\tprovider: \"anthropic\",\n\t\tbaseUrl: \"https://api.anthropic.com\",\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 200_000,\n\t\tmaxTokens: 16_384,\n\t} as Model<Api>;\n}\n\nfunction createAssistantMessage(\n\tstopReason: AssistantMessage[\"stopReason\"],\n\tcontentText: string,\n): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [{ type: \"text\", text: contentText }],\n\t\tapi: \"anthropic-messages\",\n\t\tprovider: \"anthropic\",\n\t\tmodel: \"claude-opus-4-6\",\n\t\tusage: {\n\t\t\tinput: 100,\n\t\t\toutput: 100,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 200,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t\tstopReason,\n\t\ttimestamp: Date.now(),\n\t\terrorMessage: stopReason === \"error\" ? contentText : undefined,\n\t} as AssistantMessage;\n}\n\nfunction wait(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction createHarness(overrides?: {\n\tcancelResult?: boolean;\n\twillRetry?: boolean;\n\thasQueuedMessages?: boolean;\n}) {\n\tconst dir = mkdtempSync(join(tmpdir(), \"compaction-orchestrator-test-\"));\n\tconst sessionManager = SessionManager.create(dir, dir);\n\tsessionManager.appendMessage({ role: \"user\", content: \"First user message\" } as any);\n\tsessionManager.appendMessage(createAssistantMessage(\"stop\", \"First assistant message\"));\n\tsessionManager.appendMessage({ role: \"user\", content: \"Second user message\" } as any);\n\n\tconst emittedEvents: Array<Record<string, unknown>> = [];\n\tconst continueFn = mock.fn(async () => {});\n\tconst replaceMessages = mock.fn((nextMessages: unknown[]) => {\n\t\t(agent.state.messages as unknown[]) = nextMessages;\n\t});\n\tconst agent = {\n\t\tstate: {\n\t\t\tmessages: [\n\t\t\t\t{ role: \"user\", content: \"queued follow-up\" },\n\t\t\t\tcreateAssistantMessage(\"error\", \"context overflow\"),\n\t\t\t],\n\t\t},\n\t\tcontinue: continueFn,\n\t\treplaceMessages,\n\t\thasQueuedMessages: () => overrides?.hasQueuedMessages ?? false,\n\t} as unknown as Agent;\n\n\tconst extensionRunner = {\n\t\thasHandlers: mock.fn(() => true),\n\t\temit: mock.fn(async () => ({ cancel: overrides?.cancelResult ?? true })),\n\t};\n\n\tconst deps: CompactionOrchestratorDeps = {\n\t\tagent,\n\t\tsessionManager,\n\t\tsettingsManager: {\n\t\t\tgetCompactionSettings: () => ({\n\t\t\t\tenabled: true,\n\t\t\t\treserveTokens: 16_384,\n\t\t\t\tkeepRecentTokens: 1,\n\t\t\t}),\n\t\t} as any,\n\t\tmodelRegistry: {\n\t\t\tisProviderRequestReady: () => true,\n\t\t\tgetApiKey: async () => undefined,\n\t\t} as any,\n\t\tgetModel: () => createMockModel(),\n\t\tgetSessionId: () => \"test-session\",\n\t\tgetExtensionRunner: () => extensionRunner as any,\n\t\temit: (event) => emittedEvents.push(event as unknown as Record<string, unknown>),\n\t\tdisconnectFromAgent: () => {},\n\t\treconnectToAgent: () => {},\n\t\tabort: async () => {},\n\t};\n\n\treturn {\n\t\tdir,\n\t\tagent,\n\t\tcontinueFn,\n\t\treplaceMessages,\n\t\temittedEvents,\n\t\textensionRunner,\n\t\torchestrator: new CompactionOrchestrator(deps),\n\t\tcleanup: () => rmSync(dir, { recursive: true, force: true }),\n\t};\n}\n\ndescribe(\"CompactionOrchestrator\", () => {\n\tit(\"overflow cancel keeps retry intent and resumes the agent (#3971)\", async (t) => {\n\t\tconst harness = createHarness({ willRetry: true });\n\t\tt.after(harness.cleanup);\n\n\t\tawait (harness.orchestrator as any)._runAutoCompaction(\"overflow\", true);\n\t\tawait wait(150);\n\n\t\tconst endEvent = harness.emittedEvents.find((event) => event.type === \"auto_compaction_end\");\n\t\tassert.ok(endEvent, \"should emit auto_compaction_end\");\n\t\tassert.equal(endEvent?.aborted, true, \"cancelled compaction should be marked aborted\");\n\t\tassert.equal(endEvent?.willRetry, true, \"overflow cancel should preserve retry intent\");\n\t\tassert.equal(harness.continueFn.mock.callCount(), 1, \"overflow cancel should resume the agent\");\n\t\tassert.equal(harness.replaceMessages.mock.callCount(), 1, \"retry follow-up should trim the error message when present\");\n\t});\n\n\tit(\"threshold cancel stays non-retrying when no queued messages exist\", async (t) => {\n\t\tconst harness = createHarness({ willRetry: false, hasQueuedMessages: false });\n\t\tt.after(harness.cleanup);\n\n\t\tawait (harness.orchestrator as any)._runAutoCompaction(\"threshold\", false);\n\t\tawait wait(150);\n\n\t\tconst endEvent = harness.emittedEvents.find((event) => event.type === \"auto_compaction_end\");\n\t\tassert.ok(endEvent, \"should emit auto_compaction_end\");\n\t\tassert.equal(endEvent?.aborted, true, \"cancelled compaction should be marked aborted\");\n\t\tassert.equal(endEvent?.willRetry, false, \"threshold cancel should stay non-retrying\");\n\t\tassert.equal(harness.continueFn.mock.callCount(), 0, \"threshold cancel should not resume the agent without queued work\");\n\t\tassert.equal(harness.replaceMessages.mock.callCount(), 0, \"non-retry cancel should not trim messages\");\n\t});\n});\n"]}
@@ -23,6 +23,11 @@ export declare function containsTypeScriptSyntax(source: string): boolean;
23
23
  * creates a fresh instance. This prevents memory leaks in long-running daemon
24
24
  * processes (every loaded module stays cached forever) and ensures stale modules
25
25
  * are not returned when extension source changes on disk.
26
+ *
27
+ * #3616: resetting the singleton alone is insufficient — jiti stores compiled
28
+ * modules in Node's global require.cache when `moduleCache: true`, which is
29
+ * shared across singletons. We also evict cached entries for every extension
30
+ * path we've previously loaded so the next import recompiles from disk.
26
31
  */
27
32
  export declare function resetExtensionLoaderCache(): void;
28
33
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+BH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAIhG,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAEhB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AAsTpB,wBAAsB,qBAAqB,CAAC,CAAC,GAAG,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAI/G;AA6BD;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAuCzD;AAkMD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAeD;;;;;GAKG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAwKD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAKpB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAsBrH;AAmHD;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAiE/B"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+BH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAIhG,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAEhB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AAsTpB,wBAAsB,qBAAqB,CAAC,CAAC,GAAG,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAI/G;AA6BD;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAuCzD;AAkMD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAsBD;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CA+ChD;AAyKD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAKpB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAsBrH;AAmHD;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAiE/B"}
@@ -550,14 +550,74 @@ export function containsTypeScriptSyntax(source) {
550
550
  * are compiled once and reused across all extensions.
551
551
  */
552
552
  let _extensionLoaderJiti = null;
553
+ // Tracks every extension-module path that jiti has compiled through the shared
554
+ // singleton so resetExtensionLoaderCache() can also evict Node's global
555
+ // require.cache entries for those modules. jiti stores compiled modules under
556
+ // `nativeRequire.cache[filename]` when `moduleCache: true`, so a new singleton
557
+ // still returns the stale cached module on re-import without this eviction.
558
+ const _loadedExtensionPaths = new Set();
559
+ const _extensionRequire = createRequire(import.meta.url);
553
560
  /**
554
561
  * Reset the shared jiti singleton so the next call to getExtensionLoaderJiti()
555
562
  * creates a fresh instance. This prevents memory leaks in long-running daemon
556
563
  * processes (every loaded module stays cached forever) and ensures stale modules
557
564
  * are not returned when extension source changes on disk.
565
+ *
566
+ * #3616: resetting the singleton alone is insufficient — jiti stores compiled
567
+ * modules in Node's global require.cache when `moduleCache: true`, which is
568
+ * shared across singletons. We also evict cached entries for every extension
569
+ * path we've previously loaded so the next import recompiles from disk.
558
570
  */
559
571
  export function resetExtensionLoaderCache() {
560
572
  _extensionLoaderJiti = null;
573
+ // Build a set of exact cache keys we expect (raw path, resolved path,
574
+ // realpath) AND a set of (basename, containing-directory) pairs so we
575
+ // can also catch entries that jiti/Node wrote under a canonicalized
576
+ // form (Windows drive-letter case, separator swap, UNC prefix, symlink
577
+ // resolution). require.cache is shared across all createRequire
578
+ // instances for CJS, so iterating any instance's cache covers jiti's
579
+ // internal `nativeRequire.cache` writes.
580
+ const exact = new Set();
581
+ const signatures = new Set();
582
+ const makeSignature = (p) => {
583
+ const normalized = p.replace(/\\/g, "/").toLowerCase();
584
+ const slash = normalized.lastIndexOf("/");
585
+ const base = slash >= 0 ? normalized.slice(slash + 1) : normalized;
586
+ // Use the trailing two path segments as the signature — unique
587
+ // enough to avoid collisions in typical filesystems while tolerating
588
+ // drive-letter / separator variations that differ in the prefix.
589
+ const parent = slash >= 0 ? normalized.slice(0, slash) : "";
590
+ const parentSlash = parent.lastIndexOf("/");
591
+ const parentSeg = parentSlash >= 0 ? parent.slice(parentSlash + 1) : parent;
592
+ return `${parentSeg}/${base}`;
593
+ };
594
+ for (const raw of _loadedExtensionPaths) {
595
+ exact.add(raw);
596
+ try {
597
+ exact.add(_extensionRequire.resolve(raw));
598
+ }
599
+ catch {
600
+ // unresolvable — fall through; signature scan may still hit it
601
+ }
602
+ try {
603
+ exact.add(fs.realpathSync(raw));
604
+ }
605
+ catch {
606
+ // file may have been deleted already; ignore
607
+ }
608
+ signatures.add(makeSignature(raw));
609
+ }
610
+ for (const key of Object.keys(_extensionRequire.cache)) {
611
+ if (exact.has(key) || signatures.has(makeSignature(key))) {
612
+ try {
613
+ delete _extensionRequire.cache[key];
614
+ }
615
+ catch {
616
+ // require.cache is best-effort; ignore failures (e.g. frozen cache).
617
+ }
618
+ }
619
+ }
620
+ _loadedExtensionPaths.clear();
561
621
  }
562
622
  function getExtensionLoaderJiti() {
563
623
  if (!_extensionLoaderJiti) {
@@ -589,6 +649,7 @@ async function loadExtensionModule(extensionPath) {
589
649
  }
590
650
  const jiti = getExtensionLoaderJiti();
591
651
  const module = await jiti.import(extensionPath, { default: true });
652
+ _loadedExtensionPaths.add(extensionPath);
592
653
  const factory = module;
593
654
  return typeof factory !== "function" ? undefined : factory;
594
655
  }