gsd-pi 2.77.0 → 2.78.0-dev.aeeb2ca00

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 (878) hide show
  1. package/README.md +51 -33
  2. package/dist/claude-cli-check.js +46 -10
  3. package/dist/cli-web-branch.d.ts +1 -0
  4. package/dist/cli-web-branch.js +3 -0
  5. package/dist/cli.js +38 -2
  6. package/dist/extension-discovery.d.ts +6 -0
  7. package/dist/extension-discovery.js +37 -0
  8. package/dist/extension-registry.d.ts +3 -0
  9. package/dist/extension-sort.d.ts +18 -0
  10. package/dist/extension-sort.js +114 -0
  11. package/dist/extension-validator.d.ts +47 -0
  12. package/dist/extension-validator.js +127 -0
  13. package/dist/headless.js +49 -4
  14. package/dist/loader.js +35 -7
  15. package/dist/provider-migrations.d.ts +18 -0
  16. package/dist/provider-migrations.js +14 -0
  17. package/dist/resource-loader.d.ts +40 -0
  18. package/dist/resource-loader.js +32 -13
  19. package/dist/resources/extensions/browser-tools/capture.js +9 -0
  20. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  21. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  22. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  23. package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
  24. package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
  25. package/dist/resources/extensions/claude-code-cli/readiness.js +72 -16
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +552 -67
  27. package/dist/resources/extensions/cmux/index.js +20 -0
  28. package/dist/resources/extensions/github-sync/templates.js +103 -0
  29. package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
  30. package/dist/resources/extensions/google-search/index.js +3 -375
  31. package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
  32. package/dist/resources/extensions/gsd/auto/loop.js +124 -2
  33. package/dist/resources/extensions/gsd/auto/phases.js +57 -39
  34. package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
  35. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -2
  36. package/dist/resources/extensions/gsd/auto/session.js +6 -2
  37. package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
  38. package/dist/resources/extensions/gsd/auto-dispatch.js +201 -38
  39. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  40. package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
  41. package/dist/resources/extensions/gsd/auto-post-unit.js +215 -64
  42. package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
  43. package/dist/resources/extensions/gsd/auto-recovery.js +210 -24
  44. package/dist/resources/extensions/gsd/auto-start.js +122 -30
  45. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
  46. package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
  47. package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
  48. package/dist/resources/extensions/gsd/auto-worktree.js +180 -34
  49. package/dist/resources/extensions/gsd/auto.js +107 -35
  50. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +19 -1
  51. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
  52. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -6
  53. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +11 -0
  54. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
  55. package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -6
  56. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
  57. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
  58. package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
  59. package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
  60. package/dist/resources/extensions/gsd/component-loader.js +447 -0
  61. package/dist/resources/extensions/gsd/component-types.js +69 -0
  62. package/dist/resources/extensions/gsd/context-store.js +23 -7
  63. package/dist/resources/extensions/gsd/detection.js +49 -1
  64. package/dist/resources/extensions/gsd/dispatch-guard.js +29 -3
  65. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  66. package/dist/resources/extensions/gsd/file-lock.js +49 -9
  67. package/dist/resources/extensions/gsd/forensics.js +106 -0
  68. package/dist/resources/extensions/gsd/gate-registry.js +2 -2
  69. package/dist/resources/extensions/gsd/git-constants.js +28 -1
  70. package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
  71. package/dist/resources/extensions/gsd/git-service.js +127 -2
  72. package/dist/resources/extensions/gsd/gitignore.js +1 -0
  73. package/dist/resources/extensions/gsd/gsd-db.js +6 -3
  74. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
  75. package/dist/resources/extensions/gsd/guided-flow.js +39 -13
  76. package/dist/resources/extensions/gsd/journal.js +17 -2
  77. package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
  78. package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
  79. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
  80. package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
  81. package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
  82. package/dist/resources/extensions/gsd/model-router.js +6 -0
  83. package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
  84. package/dist/resources/extensions/gsd/notifications.js +30 -16
  85. package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
  86. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
  87. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  88. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  89. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  90. package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  91. package/dist/resources/extensions/gsd/prompts/system.md +1 -0
  92. package/dist/resources/extensions/gsd/reports.js +5 -4
  93. package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
  94. package/dist/resources/extensions/gsd/service-tier.js +5 -2
  95. package/dist/resources/extensions/gsd/session-lock.js +19 -10
  96. package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
  97. package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
  98. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
  99. package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
  100. package/dist/resources/extensions/gsd/state.js +69 -58
  101. package/dist/resources/extensions/gsd/sync-lock.js +98 -42
  102. package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
  103. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
  104. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
  105. package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
  106. package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
  107. package/dist/resources/extensions/gsd/uok/audit.js +18 -2
  108. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
  109. package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
  110. package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
  111. package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
  112. package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
  113. package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
  114. package/dist/resources/extensions/gsd/uok/plan-v2.js +10 -4
  115. package/dist/resources/extensions/gsd/uok/writer.js +82 -0
  116. package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
  117. package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
  118. package/dist/resources/extensions/gsd/worktree-manager.js +86 -8
  119. package/dist/resources/extensions/gsd/worktree-resolver.js +86 -7
  120. package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
  121. package/dist/resources/extensions/mcp-client/auth.js +10 -1
  122. package/dist/resources/extensions/mcp-client/index.js +121 -10
  123. package/dist/resources/extensions/ollama/index.js +5 -1
  124. package/dist/resources/extensions/remote-questions/manager.js +11 -5
  125. package/dist/resources/extensions/shared/cmux-events.js +12 -0
  126. package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
  127. package/dist/resources/skills/create-skill/SKILL.md +2 -2
  128. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  129. package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  130. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  131. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  132. package/dist/web/standalone/.next/BUILD_ID +1 -1
  133. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  134. package/dist/web/standalone/.next/build-manifest.json +4 -4
  135. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  136. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  137. package/dist/web/standalone/.next/required-server-files.json +3 -3
  138. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  139. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  149. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  151. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  152. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  153. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  155. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  156. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  158. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  168. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  184. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  213. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  227. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  235. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  252. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  253. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  255. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  257. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  259. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  262. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  263. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  267. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  268. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  269. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  270. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  272. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  273. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  274. package/dist/web/standalone/.next/server/app/index.html +1 -1
  275. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  276. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  277. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  278. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  279. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  280. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  281. package/dist/web/standalone/.next/server/app/page.js +2 -2
  282. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  283. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  284. package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
  285. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  286. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  287. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  288. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  289. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  290. package/dist/web/standalone/.next/server/middleware.js +2 -2
  291. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  292. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  293. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  294. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  295. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  296. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  297. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  298. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  299. package/dist/web/standalone/.next/static/chunks/app/page-5b113fd32bc2a1c3.js +1 -0
  300. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  301. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  302. package/dist/web/standalone/.next/static/chunks/{webpack-5fc74f13a25fa1bb.js → webpack-2e68521d7c82f7c2.js} +1 -1
  303. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  304. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  305. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  306. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  307. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  308. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  309. package/dist/web/standalone/server.js +1 -1
  310. package/package.json +17 -16
  311. package/packages/daemon/package.json +2 -2
  312. package/packages/daemon/src/logger.ts +4 -3
  313. package/packages/mcp-server/README.md +3 -3
  314. package/packages/mcp-server/dist/env-writer.d.ts +1 -0
  315. package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
  316. package/packages/mcp-server/dist/env-writer.js +74 -6
  317. package/packages/mcp-server/dist/env-writer.js.map +1 -1
  318. package/packages/mcp-server/dist/server.d.ts +24 -0
  319. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  320. package/packages/mcp-server/dist/server.js +111 -87
  321. package/packages/mcp-server/dist/server.js.map +1 -1
  322. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  323. package/packages/mcp-server/dist/workflow-tools.js +15 -6
  324. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  325. package/packages/mcp-server/package.json +7 -2
  326. package/packages/mcp-server/src/env-writer.test.ts +79 -1
  327. package/packages/mcp-server/src/env-writer.ts +76 -6
  328. package/packages/mcp-server/src/mcp-server.test.ts +25 -3
  329. package/packages/mcp-server/src/readers/graph.test.ts +87 -15
  330. package/packages/mcp-server/src/readers/readers.test.ts +5 -1
  331. package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
  332. package/packages/mcp-server/src/server.ts +158 -105
  333. package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
  334. package/packages/mcp-server/src/workflow-tools.ts +19 -6
  335. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  336. package/packages/native/package.json +7 -2
  337. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  338. package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
  339. package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
  340. package/packages/native/src/__tests__/ps.test.mjs +14 -8
  341. package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
  342. package/packages/native/src/__tests__/truncate.test.mjs +17 -2
  343. package/packages/native/tsconfig.tsbuildinfo +1 -1
  344. package/packages/pi-agent-core/package.json +6 -1
  345. package/packages/pi-agent-core/src/agent-loop.test.ts +226 -31
  346. package/packages/pi-agent-core/src/agent.test.ts +96 -102
  347. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  348. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  349. package/packages/pi-ai/dist/models/capability-patches.js +9 -2
  350. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  351. package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
  352. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  354. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  355. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  356. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  357. package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
  358. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
  359. package/packages/pi-ai/dist/models/generated/openai.js +17 -0
  360. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
  361. package/packages/pi-ai/dist/models.generated.test.js +43 -70
  362. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  363. package/packages/pi-ai/dist/models.test.js +36 -11
  364. package/packages/pi-ai/dist/models.test.js.map +1 -1
  365. package/packages/pi-ai/package.json +6 -1
  366. package/packages/pi-ai/scripts/generate-models.ts +44 -0
  367. package/packages/pi-ai/src/models/capability-patches.ts +10 -2
  368. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  369. package/packages/pi-ai/src/models/generated/openai.ts +17 -0
  370. package/packages/pi-ai/src/models.generated.test.ts +46 -73
  371. package/packages/pi-ai/src/models.test.ts +48 -11
  372. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  373. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
  374. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
  376. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
  378. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
  380. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
  382. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
  384. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
  386. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
  388. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
  390. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  391. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +29 -18
  392. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
  394. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
  395. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
  396. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
  397. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +56 -1
  398. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
  400. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
  402. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
  403. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
  404. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
  405. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
  406. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
  407. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
  408. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
  409. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +8 -2
  410. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  411. package/packages/pi-coding-agent/dist/core/extensions/loader.js +85 -8
  412. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  413. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +7 -0
  414. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  416. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +41 -4
  417. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  418. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
  419. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  420. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
  421. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
  422. package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -1
  423. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  424. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  425. package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
  426. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  427. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
  428. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  429. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
  430. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
  431. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
  432. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
  433. package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
  434. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
  436. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  437. package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
  438. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
  439. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
  440. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  441. package/packages/pi-coding-agent/dist/core/system-prompt.js +19 -5
  442. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  443. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
  444. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js.map +1 -1
  445. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  446. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  447. package/packages/pi-coding-agent/dist/index.js +1 -0
  448. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  449. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
  450. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  451. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
  452. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  453. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +20 -13
  454. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  455. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  456. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
  457. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  458. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
  459. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  460. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
  461. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  462. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  463. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
  464. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  465. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  466. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
  467. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +139 -0
  469. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  470. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
  471. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  472. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  473. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
  474. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  475. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +105 -13
  476. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  477. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
  478. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
  479. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
  480. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
  481. package/packages/pi-coding-agent/package.json +6 -1
  482. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
  483. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
  484. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
  485. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
  486. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
  487. package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
  488. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
  489. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
  490. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
  491. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
  492. package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
  493. package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
  494. package/packages/pi-coding-agent/src/core/extensions/loader.ts +82 -11
  495. package/packages/pi-coding-agent/src/core/extensions/types.ts +8 -0
  496. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +48 -4
  497. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +22 -2
  498. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
  499. package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
  500. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
  501. package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
  502. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  503. package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
  504. package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
  505. package/packages/pi-coding-agent/src/core/system-prompt.ts +38 -4
  506. package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -1
  507. package/packages/pi-coding-agent/src/index.ts +1 -0
  508. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
  509. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
  510. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
  511. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
  512. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
  513. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
  514. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +160 -1
  515. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
  516. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
  517. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
  518. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  519. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  520. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +31 -14
  521. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  522. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
  523. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  524. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +51 -6
  525. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  526. package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
  527. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  528. package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
  529. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  530. package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
  531. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
  532. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
  533. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
  534. package/packages/pi-tui/dist/components/editor.d.ts +14 -0
  535. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  536. package/packages/pi-tui/dist/components/editor.js +19 -0
  537. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  538. package/packages/pi-tui/dist/components/image.test.js +6 -5
  539. package/packages/pi-tui/dist/components/image.test.js.map +1 -1
  540. package/packages/pi-tui/dist/editor-component.d.ts +2 -0
  541. package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
  542. package/packages/pi-tui/dist/editor-component.js.map +1 -1
  543. package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
  544. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  545. package/packages/pi-tui/dist/stdin-buffer.js +20 -0
  546. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  547. package/packages/pi-tui/package.json +6 -1
  548. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +46 -15
  549. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
  550. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +62 -6
  551. package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
  552. package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
  553. package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
  554. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
  555. package/packages/pi-tui/src/components/editor.ts +22 -0
  556. package/packages/pi-tui/src/components/image.test.ts +10 -5
  557. package/packages/pi-tui/src/editor-component.ts +3 -0
  558. package/packages/pi-tui/src/stdin-buffer.ts +26 -0
  559. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  560. package/packages/rpc-client/dist/rpc-client.test.js +101 -51
  561. package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
  562. package/packages/rpc-client/package.json +6 -1
  563. package/packages/rpc-client/src/rpc-client.test.ts +109 -52
  564. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  565. package/pkg/package.json +1 -1
  566. package/scripts/install.js +526 -0
  567. package/scripts/lib/workspace-manifest.cjs +86 -0
  568. package/scripts/link-workspace-packages.cjs +5 -17
  569. package/scripts/postinstall.js +9 -178
  570. package/src/resources/extensions/browser-tools/capture.ts +12 -0
  571. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  572. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  573. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  574. package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
  575. package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
  576. package/src/resources/extensions/claude-code-cli/readiness.ts +75 -16
  577. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +602 -73
  578. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1028 -91
  579. package/src/resources/extensions/cmux/index.ts +35 -10
  580. package/src/resources/extensions/github-sync/templates.ts +151 -0
  581. package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
  582. package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
  583. package/src/resources/extensions/google-search/extension-manifest.json +5 -4
  584. package/src/resources/extensions/google-search/index.ts +9 -470
  585. package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
  586. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  587. package/src/resources/extensions/gsd/auto/loop.ts +142 -2
  588. package/src/resources/extensions/gsd/auto/phases.ts +62 -38
  589. package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
  590. package/src/resources/extensions/gsd/auto/run-unit.ts +16 -2
  591. package/src/resources/extensions/gsd/auto/session.ts +7 -2
  592. package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
  593. package/src/resources/extensions/gsd/auto/types.ts +1 -1
  594. package/src/resources/extensions/gsd/auto-dispatch.ts +214 -37
  595. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  596. package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
  597. package/src/resources/extensions/gsd/auto-post-unit.ts +226 -73
  598. package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
  599. package/src/resources/extensions/gsd/auto-recovery.ts +240 -25
  600. package/src/resources/extensions/gsd/auto-start.ts +146 -14
  601. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
  602. package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
  603. package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
  604. package/src/resources/extensions/gsd/auto-worktree.ts +190 -31
  605. package/src/resources/extensions/gsd/auto.ts +127 -41
  606. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +20 -1
  607. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
  608. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -6
  609. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +11 -0
  610. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
  611. package/src/resources/extensions/gsd/bootstrap/system-context.ts +13 -9
  612. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
  613. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
  614. package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
  615. package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
  616. package/src/resources/extensions/gsd/component-loader.ts +598 -0
  617. package/src/resources/extensions/gsd/component-types.ts +362 -0
  618. package/src/resources/extensions/gsd/context-store.ts +25 -8
  619. package/src/resources/extensions/gsd/detection.ts +58 -1
  620. package/src/resources/extensions/gsd/dispatch-guard.ts +26 -2
  621. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  622. package/src/resources/extensions/gsd/file-lock.ts +84 -11
  623. package/src/resources/extensions/gsd/forensics.ts +118 -1
  624. package/src/resources/extensions/gsd/gate-registry.ts +2 -2
  625. package/src/resources/extensions/gsd/git-constants.ts +30 -1
  626. package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
  627. package/src/resources/extensions/gsd/git-service.ts +150 -2
  628. package/src/resources/extensions/gsd/gitignore.ts +1 -0
  629. package/src/resources/extensions/gsd/gsd-db.ts +6 -3
  630. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
  631. package/src/resources/extensions/gsd/guided-flow.ts +57 -14
  632. package/src/resources/extensions/gsd/journal.ts +38 -3
  633. package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
  634. package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
  635. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
  636. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  637. package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
  638. package/src/resources/extensions/gsd/model-router.ts +6 -0
  639. package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
  640. package/src/resources/extensions/gsd/notifications.ts +27 -15
  641. package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
  642. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
  643. package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  644. package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  645. package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  646. package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  647. package/src/resources/extensions/gsd/prompts/system.md +1 -0
  648. package/src/resources/extensions/gsd/reports.ts +5 -4
  649. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
  650. package/src/resources/extensions/gsd/service-tier.ts +5 -2
  651. package/src/resources/extensions/gsd/session-lock.ts +20 -10
  652. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  653. package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
  654. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
  655. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  656. package/src/resources/extensions/gsd/state.ts +76 -66
  657. package/src/resources/extensions/gsd/sync-lock.ts +97 -39
  658. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
  659. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
  660. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
  661. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
  662. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +135 -285
  663. package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
  664. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
  665. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
  666. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
  667. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +166 -0
  668. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
  669. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
  670. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +64 -0
  671. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
  672. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
  673. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
  674. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
  675. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
  676. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
  677. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
  678. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  679. package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
  680. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
  681. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
  682. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
  683. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
  684. package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
  685. package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
  686. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  687. package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
  688. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
  689. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
  690. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +159 -0
  691. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
  692. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
  693. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
  694. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
  695. package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
  696. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
  697. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
  698. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +14 -9
  699. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
  700. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
  701. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
  702. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
  703. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
  704. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
  705. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
  706. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
  707. package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
  708. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
  709. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
  710. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
  711. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +131 -0
  712. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
  713. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
  714. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
  715. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
  716. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
  717. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
  718. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  719. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
  720. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
  721. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
  722. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
  723. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +11 -0
  724. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
  725. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
  726. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +64 -0
  727. package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
  728. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +47 -0
  729. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
  730. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
  731. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
  732. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +3 -3
  733. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  734. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
  735. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  736. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  737. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
  738. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
  739. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
  740. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +5 -0
  741. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -130
  742. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
  743. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
  744. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
  745. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
  746. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
  747. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
  748. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +54 -41
  749. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +213 -0
  750. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
  751. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
  752. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
  753. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
  754. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
  755. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
  756. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
  757. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
  758. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
  759. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +6 -3
  760. package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
  761. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
  762. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  763. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
  764. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
  765. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
  766. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
  767. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
  768. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  769. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
  770. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
  771. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
  772. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
  773. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
  774. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
  775. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  776. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
  777. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
  778. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
  779. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
  780. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
  781. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
  782. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
  783. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
  784. package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
  785. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  786. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
  787. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
  788. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
  789. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
  790. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
  791. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
  792. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
  793. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
  794. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
  795. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
  796. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
  797. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  798. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +19 -2
  799. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  800. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
  801. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +139 -5
  802. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
  803. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
  804. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
  805. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
  806. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +25 -2
  807. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
  808. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
  809. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
  810. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
  811. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
  812. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
  813. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
  814. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
  815. package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
  816. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
  817. package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
  818. package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
  819. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
  820. package/src/resources/extensions/gsd/types.ts +3 -3
  821. package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
  822. package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
  823. package/src/resources/extensions/gsd/uok/audit.ts +20 -2
  824. package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
  825. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
  826. package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
  827. package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
  828. package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
  829. package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
  830. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  831. package/src/resources/extensions/gsd/uok/plan-v2.ts +13 -5
  832. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  833. package/src/resources/extensions/gsd/workflow-logger.ts +22 -3
  834. package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
  835. package/src/resources/extensions/gsd/worktree-manager.ts +109 -7
  836. package/src/resources/extensions/gsd/worktree-resolver.ts +96 -9
  837. package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
  838. package/src/resources/extensions/mcp-client/auth.ts +12 -1
  839. package/src/resources/extensions/mcp-client/index.ts +132 -11
  840. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
  841. package/src/resources/extensions/ollama/index.ts +5 -1
  842. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
  843. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
  844. package/src/resources/extensions/remote-questions/manager.ts +36 -4
  845. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
  846. package/src/resources/extensions/shared/cmux-events.ts +59 -0
  847. package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
  848. package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
  849. package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
  850. package/src/resources/skills/create-skill/SKILL.md +2 -2
  851. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  852. package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  853. package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  854. package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
  855. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +0 -9
  856. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
  857. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  858. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  859. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
  860. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
  861. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
  862. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
  863. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
  864. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -143
  865. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -142
  866. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
  867. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
  868. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
  869. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  870. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
  871. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
  872. package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
  873. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
  874. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
  875. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
  876. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
  877. /package/dist/web/standalone/.next/static/{pV-mPo7rYGb5JBC09C8GG → cAJH99yNS1UPbeSEiNRrV}/_buildManifest.js +0 -0
  878. /package/dist/web/standalone/.next/static/{pV-mPo7rYGb5JBC09C8GG → cAJH99yNS1UPbeSEiNRrV}/_ssgManifest.js +0 -0
@@ -1,39 +1,103 @@
1
- import test, { describe } from "node:test";
1
+ // Regression test for #4243 abort() must be called BEFORE
2
+ // _disconnectFromAgent() inside newSession() and switchSession() so that
3
+ // message_end/agent_end events (and the #4216 finalization code) fire
4
+ // before we unsubscribe from the event bus.
5
+ //
6
+ // Verified behaviourally: we construct a real AgentSession, wrap `abort`
7
+ // and `_disconnectFromAgent` with call-order recording, trigger each
8
+ // session-transition method, and assert the observed call order.
2
9
  import assert from "node:assert/strict";
3
- import { readFileSync } from "node:fs";
10
+ import { mkdtempSync, rmSync } from "node:fs";
11
+ import { tmpdir } from "node:os";
4
12
  import { join } from "node:path";
5
- const source = readFileSync(join(process.cwd(), "packages/pi-coding-agent/src/core/agent-session.ts"), "utf-8");
6
- describe("#4243 abort() must be called before _disconnectFromAgent()", () => {
7
- test("newSession() calls abort() before _disconnectFromAgent()", () => {
8
- // Find the newSession method body where the fix was applied
9
- const newSessionStart = source.indexOf("async newSession(options?:");
10
- assert.ok(newSessionStart >= 0, "should find newSession method");
11
- // Get a window that includes the abort/disconnect section.
12
- // Use 2000 chars to accommodate guard checks inserted between the two calls.
13
- const window = source.slice(newSessionStart, newSessionStart + 2000);
14
- // Find the abort and _disconnectFromAgent calls
15
- const abortIdx = window.indexOf("await this.abort();");
16
- const disconnectIdx = window.indexOf("this._disconnectFromAgent();");
17
- assert.ok(abortIdx >= 0, "newSession should call await this.abort()");
18
- assert.ok(disconnectIdx >= 0, "newSession should call this._disconnectFromAgent()");
19
- assert.ok(abortIdx < disconnectIdx, "abort() must be called BEFORE _disconnectFromAgent() so that message_end/agent_end events fire before unsubscribing from the event bus");
13
+ import { afterEach, beforeEach, describe, it } from "node:test";
14
+ import { Agent } from "@gsd/pi-agent-core";
15
+ import { AgentSession } from "./agent-session.js";
16
+ import { AuthStorage } from "./auth-storage.js";
17
+ import { ModelRegistry } from "./model-registry.js";
18
+ import { DefaultResourceLoader } from "./resource-loader.js";
19
+ import { SessionManager } from "./session-manager.js";
20
+ import { SettingsManager } from "./settings-manager.js";
21
+ let testDir;
22
+ async function createSession(opts = {}) {
23
+ const agentDir = join(testDir, "agent-home");
24
+ const authStorage = AuthStorage.inMemory({});
25
+ const modelRegistry = new ModelRegistry(authStorage, join(agentDir, "models.json"));
26
+ const settingsManager = SettingsManager.inMemory();
27
+ const resourceLoader = new DefaultResourceLoader({
28
+ cwd: testDir,
29
+ agentDir,
30
+ settingsManager,
31
+ noExtensions: true,
32
+ noPromptTemplates: true,
33
+ noThemes: true,
20
34
  });
21
- test("newSession() references #4243 in the abort/disconnect comment", () => {
22
- const idx = source.indexOf("#4243");
23
- assert.ok(idx >= 0, "source should reference issue #4243 for the abort-order fix");
35
+ await resourceLoader.reload();
36
+ // switchSession() needs a sessionFile; in-memory manager returns undefined.
37
+ // Use file-backed manager when the test needs to resume.
38
+ const sessionManager = opts.persistSessions
39
+ ? SessionManager.create(testDir, join(testDir, "sessions"))
40
+ : SessionManager.inMemory(testDir);
41
+ return new AgentSession({
42
+ agent: new Agent(),
43
+ sessionManager,
44
+ settingsManager,
45
+ cwd: testDir,
46
+ resourceLoader,
47
+ modelRegistry,
24
48
  });
25
- test("switchSession() calls abort() before _disconnectFromAgent()", () => {
26
- // Find the switchSession method body
27
- const switchStart = source.indexOf("async switchSession(sessionPath:");
28
- assert.ok(switchStart >= 0, "should find switchSession method");
29
- // Get a window that includes the abort/disconnect section
30
- const window = source.slice(switchStart, switchStart + 800);
31
- // Find the abort and _disconnectFromAgent calls
32
- const abortIdx = window.indexOf("await this.abort();");
33
- const disconnectIdx = window.indexOf("this._disconnectFromAgent();");
34
- assert.ok(abortIdx >= 0, "switchSession should call await this.abort()");
35
- assert.ok(disconnectIdx >= 0, "switchSession should call this._disconnectFromAgent()");
36
- assert.ok(abortIdx < disconnectIdx, "abort() must be called BEFORE _disconnectFromAgent() in switchSession so that events fire before unsubscribing");
49
+ }
50
+ /**
51
+ * Wrap two methods on the same object so their call order is recorded.
52
+ * Returns the recording array — assertions use index lookups.
53
+ */
54
+ function recordCallOrder(target, methods) {
55
+ const order = [];
56
+ for (const method of methods) {
57
+ const name = String(method);
58
+ const original = target[name];
59
+ if (typeof original !== "function") {
60
+ throw new Error(`recordCallOrder: ${name} is not a function on target`);
61
+ }
62
+ target[name] = function (...args) {
63
+ order.push(name);
64
+ return original.apply(this, args);
65
+ };
66
+ }
67
+ return order;
68
+ }
69
+ describe("#4243 — abort() must run before _disconnectFromAgent()", () => {
70
+ beforeEach(() => {
71
+ testDir = mkdtempSync(join(tmpdir(), "agent-session-abort-"));
72
+ });
73
+ afterEach(() => {
74
+ rmSync(testDir, { recursive: true, force: true });
75
+ });
76
+ it("newSession() invokes abort() before _disconnectFromAgent()", async () => {
77
+ const session = await createSession();
78
+ const order = recordCallOrder(session, ["abort", "_disconnectFromAgent"]);
79
+ const ok = await session.newSession();
80
+ assert.equal(ok, true);
81
+ const abortIdx = order.indexOf("abort");
82
+ const disconnectIdx = order.indexOf("_disconnectFromAgent");
83
+ assert.ok(abortIdx >= 0, `newSession should call abort(); order=${order.join(",")}`);
84
+ assert.ok(disconnectIdx >= 0, `newSession should call _disconnectFromAgent(); order=${order.join(",")}`);
85
+ assert.ok(abortIdx < disconnectIdx, `abort() must run before _disconnectFromAgent(); order=${order.join(",")}`);
86
+ });
87
+ it("switchSession() invokes abort() before _disconnectFromAgent()", async () => {
88
+ const session = await createSession({ persistSessions: true });
89
+ // Seed a session file to switch to (switchSession reads from the session manager).
90
+ await session.newSession();
91
+ const sessionFile = session.sessionFile;
92
+ assert.ok(typeof sessionFile === "string" && sessionFile.length > 0, "need a session file to switch to");
93
+ const order = recordCallOrder(session, ["abort", "_disconnectFromAgent"]);
94
+ const ok = await session.switchSession(sessionFile);
95
+ assert.equal(ok, true);
96
+ const abortIdx = order.indexOf("abort");
97
+ const disconnectIdx = order.indexOf("_disconnectFromAgent");
98
+ assert.ok(abortIdx >= 0, `switchSession should call abort(); order=${order.join(",")}`);
99
+ assert.ok(disconnectIdx >= 0, `switchSession should call _disconnectFromAgent(); order=${order.join(",")}`);
100
+ assert.ok(abortIdx < disconnectIdx, `abort() must run before _disconnectFromAgent() in switchSession; order=${order.join(",")}`);
37
101
  });
38
102
  });
39
103
  //# sourceMappingURL=agent-session-abort-order.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-abort-order.test.js","sourceRoot":"","sources":["../../src/core/agent-session-abort-order.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,MAAM,GAAG,YAAY,CAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oDAAoD,CAAC,EACzE,OAAO,CACP,CAAC;AAEF,QAAQ,CAAC,8DAA8D,EAAE,GAAG,EAAE;IAC7E,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACrE,4DAA4D;QAC5D,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QACrE,MAAM,CAAC,EAAE,CAAC,eAAe,IAAI,CAAC,EAAE,+BAA+B,CAAC,CAAC;QAEjE,2DAA2D;QAC3D,6EAA6E;QAC7E,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC,CAAC;QAErE,gDAAgD;QAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;QAErE,MAAM,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,EAAE,2CAA2C,CAAC,CAAC;QACtE,MAAM,CAAC,EAAE,CAAC,aAAa,IAAI,CAAC,EAAE,oDAAoD,CAAC,CAAC;QACpF,MAAM,CAAC,EAAE,CACR,QAAQ,GAAG,aAAa,EACxB,wIAAwI,CACxI,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;QAC1E,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,6DAA6D,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACxE,qCAAqC;QACrC,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QACvE,MAAM,CAAC,EAAE,CAAC,WAAW,IAAI,CAAC,EAAE,kCAAkC,CAAC,CAAC;QAEhE,0DAA0D;QAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,GAAG,CAAC,CAAC;QAE5D,gDAAgD;QAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;QAErE,MAAM,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,EAAE,8CAA8C,CAAC,CAAC;QACzE,MAAM,CAAC,EAAE,CAAC,aAAa,IAAI,CAAC,EAAE,uDAAuD,CAAC,CAAC;QACvF,MAAM,CAAC,EAAE,CACR,QAAQ,GAAG,aAAa,EACxB,gHAAgH,CAChH,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import test, { describe } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst source = readFileSync(\n\tjoin(process.cwd(), \"packages/pi-coding-agent/src/core/agent-session.ts\"),\n\t\"utf-8\",\n);\n\ndescribe(\"#4243 abort() must be called before _disconnectFromAgent()\", () => {\n\ttest(\"newSession() calls abort() before _disconnectFromAgent()\", () => {\n\t\t// Find the newSession method body where the fix was applied\n\t\tconst newSessionStart = source.indexOf(\"async newSession(options?:\");\n\t\tassert.ok(newSessionStart >= 0, \"should find newSession method\");\n\n\t\t// Get a window that includes the abort/disconnect section.\n\t\t// Use 2000 chars to accommodate guard checks inserted between the two calls.\n\t\tconst window = source.slice(newSessionStart, newSessionStart + 2000);\n\n\t\t// Find the abort and _disconnectFromAgent calls\n\t\tconst abortIdx = window.indexOf(\"await this.abort();\");\n\t\tconst disconnectIdx = window.indexOf(\"this._disconnectFromAgent();\");\n\n\t\tassert.ok(abortIdx >= 0, \"newSession should call await this.abort()\");\n\t\tassert.ok(disconnectIdx >= 0, \"newSession should call this._disconnectFromAgent()\");\n\t\tassert.ok(\n\t\t\tabortIdx < disconnectIdx,\n\t\t\t\"abort() must be called BEFORE _disconnectFromAgent() so that message_end/agent_end events fire before unsubscribing from the event bus\",\n\t\t);\n\t});\n\n\ttest(\"newSession() references #4243 in the abort/disconnect comment\", () => {\n\t\tconst idx = source.indexOf(\"#4243\");\n\t\tassert.ok(idx >= 0, \"source should reference issue #4243 for the abort-order fix\");\n\t});\n\n\ttest(\"switchSession() calls abort() before _disconnectFromAgent()\", () => {\n\t\t// Find the switchSession method body\n\t\tconst switchStart = source.indexOf(\"async switchSession(sessionPath:\");\n\t\tassert.ok(switchStart >= 0, \"should find switchSession method\");\n\n\t\t// Get a window that includes the abort/disconnect section\n\t\tconst window = source.slice(switchStart, switchStart + 800);\n\n\t\t// Find the abort and _disconnectFromAgent calls\n\t\tconst abortIdx = window.indexOf(\"await this.abort();\");\n\t\tconst disconnectIdx = window.indexOf(\"this._disconnectFromAgent();\");\n\n\t\tassert.ok(abortIdx >= 0, \"switchSession should call await this.abort()\");\n\t\tassert.ok(disconnectIdx >= 0, \"switchSession should call this._disconnectFromAgent()\");\n\t\tassert.ok(\n\t\t\tabortIdx < disconnectIdx,\n\t\t\t\"abort() must be called BEFORE _disconnectFromAgent() in switchSession so that events fire before unsubscribing\",\n\t\t);\n\t});\n});\n"]}
1
+ {"version":3,"file":"agent-session-abort-order.test.js","sourceRoot":"","sources":["../../src/core/agent-session-abort-order.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Regression test for #4243 — abort() must be called BEFORE\n// _disconnectFromAgent() inside newSession() and switchSession() so that\n// message_end/agent_end events (and the #4216 finalization code) fire\n// before we unsubscribe from the event bus.\n//\n// Verified behaviourally: we construct a real AgentSession, wrap `abort`\n// and `_disconnectFromAgent` with call-order recording, trigger each\n// session-transition method, and assert the observed call order.\n\nimport assert from \"node:assert/strict\";\nimport { mkdtempSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\n\nimport { Agent } from \"@gsd/pi-agent-core\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\n\nlet testDir: string;\n\nasync function createSession(opts: { persistSessions?: boolean } = {}): Promise<AgentSession> {\n\tconst agentDir = join(testDir, \"agent-home\");\n\tconst authStorage = AuthStorage.inMemory({});\n\tconst modelRegistry = new ModelRegistry(authStorage, join(agentDir, \"models.json\"));\n\tconst settingsManager = SettingsManager.inMemory();\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\tcwd: testDir,\n\t\tagentDir,\n\t\tsettingsManager,\n\t\tnoExtensions: true,\n\t\tnoPromptTemplates: true,\n\t\tnoThemes: true,\n\t});\n\tawait resourceLoader.reload();\n\n\t// switchSession() needs a sessionFile; in-memory manager returns undefined.\n\t// Use file-backed manager when the test needs to resume.\n\tconst sessionManager = opts.persistSessions\n\t\t? SessionManager.create(testDir, join(testDir, \"sessions\"))\n\t\t: SessionManager.inMemory(testDir);\n\n\treturn new AgentSession({\n\t\tagent: new Agent(),\n\t\tsessionManager,\n\t\tsettingsManager,\n\t\tcwd: testDir,\n\t\tresourceLoader,\n\t\tmodelRegistry,\n\t});\n}\n\n/**\n * Wrap two methods on the same object so their call order is recorded.\n * Returns the recording array assertions use index lookups.\n */\nfunction recordCallOrder<O extends object>(\n\ttarget: O,\n\tmethods: Array<keyof O>,\n): string[] {\n\tconst order: string[] = [];\n\tfor (const method of methods) {\n\t\tconst name = String(method);\n\t\tconst original = (target as any)[name] as (...args: unknown[]) => unknown;\n\t\tif (typeof original !== \"function\") {\n\t\t\tthrow new Error(`recordCallOrder: ${name} is not a function on target`);\n\t\t}\n\t\t(target as any)[name] = function (this: O, ...args: unknown[]) {\n\t\t\torder.push(name);\n\t\t\treturn original.apply(this, args);\n\t\t};\n\t}\n\treturn order;\n}\n\ndescribe(\"#4243 — abort() must run before _disconnectFromAgent()\", () => {\n\tbeforeEach(() => {\n\t\ttestDir = mkdtempSync(join(tmpdir(), \"agent-session-abort-\"));\n\t});\n\n\tafterEach(() => {\n\t\trmSync(testDir, { recursive: true, force: true });\n\t});\n\n\tit(\"newSession() invokes abort() before _disconnectFromAgent()\", async () => {\n\t\tconst session = await createSession();\n\t\tconst order = recordCallOrder(session as any, [\"abort\", \"_disconnectFromAgent\"]);\n\n\t\tconst ok = await session.newSession();\n\t\tassert.equal(ok, true);\n\n\t\tconst abortIdx = order.indexOf(\"abort\");\n\t\tconst disconnectIdx = order.indexOf(\"_disconnectFromAgent\");\n\t\tassert.ok(abortIdx >= 0, `newSession should call abort(); order=${order.join(\",\")}`);\n\t\tassert.ok(\n\t\t\tdisconnectIdx >= 0,\n\t\t\t`newSession should call _disconnectFromAgent(); order=${order.join(\",\")}`,\n\t\t);\n\t\tassert.ok(\n\t\t\tabortIdx < disconnectIdx,\n\t\t\t`abort() must run before _disconnectFromAgent(); order=${order.join(\",\")}`,\n\t\t);\n\t});\n\n\tit(\"switchSession() invokes abort() before _disconnectFromAgent()\", async () => {\n\t\tconst session = await createSession({ persistSessions: true });\n\t\t// Seed a session file to switch to (switchSession reads from the session manager).\n\t\tawait session.newSession();\n\t\tconst sessionFile = session.sessionFile;\n\t\tassert.ok(typeof sessionFile === \"string\" && sessionFile.length > 0, \"need a session file to switch to\");\n\n\t\tconst order = recordCallOrder(session as any, [\"abort\", \"_disconnectFromAgent\"]);\n\n\t\tconst ok = await session.switchSession(sessionFile);\n\t\tassert.equal(ok, true);\n\n\t\tconst abortIdx = order.indexOf(\"abort\");\n\t\tconst disconnectIdx = order.indexOf(\"_disconnectFromAgent\");\n\t\tassert.ok(abortIdx >= 0, `switchSession should call abort(); order=${order.join(\",\")}`);\n\t\tassert.ok(\n\t\t\tdisconnectIdx >= 0,\n\t\t\t`switchSession should call _disconnectFromAgent(); order=${order.join(\",\")}`,\n\t\t);\n\t\tassert.ok(\n\t\t\tabortIdx < disconnectIdx,\n\t\t\t`abort() must run before _disconnectFromAgent() in switchSession; order=${order.join(\",\")}`,\n\t\t);\n\t});\n});\n"]}
@@ -1,16 +1,79 @@
1
- import test from "node:test";
1
+ // Regression test: explicit model switches must cancel any in-flight retry
2
+ // BEFORE applying the new model. Otherwise stale provider backoff errors
3
+ // from the previous model can continue to land after the switch.
4
+ //
5
+ // Verified behaviourally: construct a real AgentSession, wrap
6
+ // `_retryHandler.abortRetry` and `agent.setModel` to record call order,
7
+ // invoke setModel(), and assert the observed order.
2
8
  import assert from "node:assert/strict";
3
- import { readFileSync } from "node:fs";
9
+ import { mkdtempSync, rmSync } from "node:fs";
10
+ import { tmpdir } from "node:os";
4
11
  import { join } from "node:path";
5
- const source = readFileSync(join(process.cwd(), "packages/pi-coding-agent/src/core/agent-session.ts"), "utf-8");
6
- test("agent-session: explicit model switches cancel retry before applying new model", () => {
7
- const start = source.indexOf("private async _applyModelChange(");
8
- assert.ok(start >= 0, "missing _applyModelChange");
9
- const window = source.slice(start, start + 900);
10
- const abortIdx = window.indexOf("this._retryHandler.abortRetry();");
11
- const setModelIdx = window.indexOf("this.agent.setModel(model);");
12
- assert.ok(abortIdx >= 0, "_applyModelChange should cancel any in-flight retry");
13
- assert.ok(setModelIdx >= 0, "_applyModelChange should set the new model");
14
- assert.ok(abortIdx < setModelIdx, "retry cancellation must happen before applying the new model to prevent stale provider retries");
12
+ import { afterEach, beforeEach, describe, it } from "node:test";
13
+ import { Agent } from "@gsd/pi-agent-core";
14
+ import { getModel } from "@gsd/pi-ai";
15
+ import { AgentSession } from "./agent-session.js";
16
+ import { AuthStorage } from "./auth-storage.js";
17
+ import { ModelRegistry } from "./model-registry.js";
18
+ import { DefaultResourceLoader } from "./resource-loader.js";
19
+ import { SessionManager } from "./session-manager.js";
20
+ import { SettingsManager } from "./settings-manager.js";
21
+ let testDir;
22
+ async function createSession() {
23
+ const agentDir = join(testDir, "agent-home");
24
+ const authStorage = AuthStorage.inMemory({});
25
+ // Seed a runtime anthropic API key so modelRegistry.isProviderRequestReady()
26
+ // returns true and setModel() doesn't throw on missing credentials.
27
+ authStorage.setRuntimeApiKey("anthropic", "sk-test-not-used");
28
+ const modelRegistry = new ModelRegistry(authStorage, join(agentDir, "models.json"));
29
+ const settingsManager = SettingsManager.inMemory();
30
+ const resourceLoader = new DefaultResourceLoader({
31
+ cwd: testDir,
32
+ agentDir,
33
+ settingsManager,
34
+ noExtensions: true,
35
+ noPromptTemplates: true,
36
+ noThemes: true,
37
+ });
38
+ await resourceLoader.reload();
39
+ return new AgentSession({
40
+ agent: new Agent(),
41
+ sessionManager: SessionManager.inMemory(testDir),
42
+ settingsManager,
43
+ cwd: testDir,
44
+ resourceLoader,
45
+ modelRegistry,
46
+ });
47
+ }
48
+ describe("AgentSession — explicit model switch cancels retry before applying new model", () => {
49
+ beforeEach(() => {
50
+ testDir = mkdtempSync(join(tmpdir(), "agent-session-model-switch-"));
51
+ });
52
+ afterEach(() => {
53
+ rmSync(testDir, { recursive: true, force: true });
54
+ });
55
+ it("setModel() calls _retryHandler.abortRetry() before agent.setModel()", async () => {
56
+ const session = await createSession();
57
+ const order = [];
58
+ const retryHandler = session._retryHandler;
59
+ const originalAbortRetry = retryHandler.abortRetry.bind(retryHandler);
60
+ retryHandler.abortRetry = () => {
61
+ order.push("abortRetry");
62
+ return originalAbortRetry();
63
+ };
64
+ const agent = session.agent;
65
+ const originalSetModel = agent.setModel.bind(agent);
66
+ agent.setModel = (model) => {
67
+ order.push("setModel");
68
+ return originalSetModel(model);
69
+ };
70
+ const newModel = getModel("anthropic", "claude-3-5-sonnet-20241022");
71
+ await session.setModel(newModel, { persist: false });
72
+ const abortIdx = order.indexOf("abortRetry");
73
+ const setIdx = order.indexOf("setModel");
74
+ assert.ok(abortIdx >= 0, `setModel should cancel in-flight retry; order=${order.join(",")}`);
75
+ assert.ok(setIdx >= 0, `setModel should call agent.setModel; order=${order.join(",")}`);
76
+ assert.ok(abortIdx < setIdx, `retry cancellation must happen before applying the new model; order=${order.join(",")}`);
77
+ });
15
78
  });
16
79
  //# sourceMappingURL=agent-session-model-switch.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-model-switch.test.js","sourceRoot":"","sources":["../../src/core/agent-session-model-switch.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oDAAoD,CAAC,EAAE,OAAO,CAAC,CAAC;AAEhH,IAAI,CAAC,+EAA+E,EAAE,GAAG,EAAE;IAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;IACjE,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,EAAE,2BAA2B,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAElE,MAAM,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,EAAE,qDAAqD,CAAC,CAAC;IAChF,MAAM,CAAC,EAAE,CAAC,WAAW,IAAI,CAAC,EAAE,4CAA4C,CAAC,CAAC;IAC1E,MAAM,CAAC,EAAE,CACR,QAAQ,GAAG,WAAW,EACtB,gGAAgG,CAChG,CAAC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst source = readFileSync(join(process.cwd(), \"packages/pi-coding-agent/src/core/agent-session.ts\"), \"utf-8\");\n\ntest(\"agent-session: explicit model switches cancel retry before applying new model\", () => {\n\tconst start = source.indexOf(\"private async _applyModelChange(\");\n\tassert.ok(start >= 0, \"missing _applyModelChange\");\n\tconst window = source.slice(start, start + 900);\n\tconst abortIdx = window.indexOf(\"this._retryHandler.abortRetry();\");\n\tconst setModelIdx = window.indexOf(\"this.agent.setModel(model);\");\n\n\tassert.ok(abortIdx >= 0, \"_applyModelChange should cancel any in-flight retry\");\n\tassert.ok(setModelIdx >= 0, \"_applyModelChange should set the new model\");\n\tassert.ok(\n\t\tabortIdx < setModelIdx,\n\t\t\"retry cancellation must happen before applying the new model to prevent stale provider retries\",\n\t);\n});\n"]}
1
+ {"version":3,"file":"agent-session-model-switch.test.js","sourceRoot":"","sources":["../../src/core/agent-session-model-switch.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Regression test: explicit model switches must cancel any in-flight retry\n// BEFORE applying the new model. Otherwise stale provider backoff errors\n// from the previous model can continue to land after the switch.\n//\n// Verified behaviourally: construct a real AgentSession, wrap\n// `_retryHandler.abortRetry` and `agent.setModel` to record call order,\n// invoke setModel(), and assert the observed order.\n\nimport assert from \"node:assert/strict\";\nimport { mkdtempSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\n\nimport { Agent } from \"@gsd/pi-agent-core\";\nimport { getModel } from \"@gsd/pi-ai\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\n\nlet testDir: string;\n\nasync function createSession(): Promise<AgentSession> {\n\tconst agentDir = join(testDir, \"agent-home\");\n\tconst authStorage = AuthStorage.inMemory({});\n\t// Seed a runtime anthropic API key so modelRegistry.isProviderRequestReady()\n\t// returns true and setModel() doesn't throw on missing credentials.\n\tauthStorage.setRuntimeApiKey(\"anthropic\", \"sk-test-not-used\");\n\tconst modelRegistry = new ModelRegistry(authStorage, join(agentDir, \"models.json\"));\n\tconst settingsManager = SettingsManager.inMemory();\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\tcwd: testDir,\n\t\tagentDir,\n\t\tsettingsManager,\n\t\tnoExtensions: true,\n\t\tnoPromptTemplates: true,\n\t\tnoThemes: true,\n\t});\n\tawait resourceLoader.reload();\n\n\treturn new AgentSession({\n\t\tagent: new Agent(),\n\t\tsessionManager: SessionManager.inMemory(testDir),\n\t\tsettingsManager,\n\t\tcwd: testDir,\n\t\tresourceLoader,\n\t\tmodelRegistry,\n\t});\n}\n\ndescribe(\"AgentSession — explicit model switch cancels retry before applying new model\", () => {\n\tbeforeEach(() => {\n\t\ttestDir = mkdtempSync(join(tmpdir(), \"agent-session-model-switch-\"));\n\t});\n\n\tafterEach(() => {\n\t\trmSync(testDir, { recursive: true, force: true });\n\t});\n\n\tit(\"setModel() calls _retryHandler.abortRetry() before agent.setModel()\", async () => {\n\t\tconst session = await createSession();\n\n\t\tconst order: string[] = [];\n\t\tconst retryHandler = (session as any)._retryHandler;\n\t\tconst originalAbortRetry = retryHandler.abortRetry.bind(retryHandler);\n\t\tretryHandler.abortRetry = () => {\n\t\t\torder.push(\"abortRetry\");\n\t\t\treturn originalAbortRetry();\n\t\t};\n\n\t\tconst agent = (session as any).agent;\n\t\tconst originalSetModel = agent.setModel.bind(agent);\n\t\tagent.setModel = (model: unknown) => {\n\t\t\torder.push(\"setModel\");\n\t\t\treturn originalSetModel(model);\n\t\t};\n\n\t\tconst newModel = getModel(\"anthropic\", \"claude-3-5-sonnet-20241022\");\n\t\tawait session.setModel(newModel, { persist: false });\n\n\t\tconst abortIdx = order.indexOf(\"abortRetry\");\n\t\tconst setIdx = order.indexOf(\"setModel\");\n\t\tassert.ok(abortIdx >= 0, `setModel should cancel in-flight retry; order=${order.join(\",\")}`);\n\t\tassert.ok(setIdx >= 0, `setModel should call agent.setModel; order=${order.join(\",\")}`);\n\t\tassert.ok(\n\t\t\tabortIdx < setIdx,\n\t\t\t`retry cancellation must happen before applying the new model; order=${order.join(\",\")}`,\n\t\t);\n\t});\n});\n"]}
@@ -1,38 +1,106 @@
1
- // GSD-2 — Regression tests for #3616: tool list persistence across newSession() calls
2
- // Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
3
- import test, { describe } from "node:test";
1
+ // Regression test for #3616: newSession() must restore the full tool set
2
+ // when cwd is unchanged.
3
+ //
4
+ // The bug: extensions may narrow the active tool list via setActiveTools()
5
+ // during a session. Without a refresh in the else branch of newSession(),
6
+ // the narrowed set persists into the next session — breaking auto-mode
7
+ // subagent sessions that expect a full tool palette.
8
+ //
9
+ // Verified behaviourally: construct an AgentSession, wrap _refreshToolRegistry
10
+ // to record its args, call newSession() with cwd unchanged, and assert that
11
+ // a refresh was requested with includeAllExtensionTools: true.
4
12
  import assert from "node:assert/strict";
5
- import { readFileSync } from "node:fs";
13
+ import { mkdtempSync, rmSync } from "node:fs";
14
+ import { tmpdir } from "node:os";
6
15
  import { join } from "node:path";
7
- const source = readFileSync(join(process.cwd(), "packages/pi-coding-agent/src/core/agent-session.ts"), "utf-8");
8
- describe("#3616 newSession() must restore full tool set", () => {
9
- test("newSession() calls _refreshToolRegistry with includeAllExtensionTools when cwd is unchanged", () => {
10
- // Find the newSession method
11
- const newSessionStart = source.indexOf("async newSession(options?:");
12
- assert.ok(newSessionStart >= 0, "should find newSession method");
13
- // Get the method body (up to the next top-level method)
14
- const methodBody = source.slice(newSessionStart, newSessionStart + 3000);
15
- // Verify the cwd-changed branch rebuilds tools
16
- assert.ok(methodBody.includes("if (this._cwd !== previousCwd)"), "should have cwd-change guard");
17
- // Verify the else branch exists and refreshes tools with includeAllExtensionTools
18
- const elseIdx = methodBody.indexOf("} else {");
19
- assert.ok(elseIdx >= 0, "should have else branch for cwd-unchanged case");
20
- const elseBranch = methodBody.slice(elseIdx, elseIdx + 800);
21
- assert.ok(elseBranch.includes("_refreshToolRegistry"), "else branch should call _refreshToolRegistry");
22
- assert.ok(elseBranch.includes("includeAllExtensionTools: true"), "else branch should pass includeAllExtensionTools: true to restore narrowed tools");
16
+ import { afterEach, beforeEach, describe, it } from "node:test";
17
+ import { Agent } from "@gsd/pi-agent-core";
18
+ import { AgentSession } from "./agent-session.js";
19
+ import { AuthStorage } from "./auth-storage.js";
20
+ import { ModelRegistry } from "./model-registry.js";
21
+ import { DefaultResourceLoader } from "./resource-loader.js";
22
+ import { SessionManager } from "./session-manager.js";
23
+ import { SettingsManager } from "./settings-manager.js";
24
+ let testDir;
25
+ async function createSession() {
26
+ const agentDir = join(testDir, "agent-home");
27
+ const authStorage = AuthStorage.inMemory({});
28
+ const modelRegistry = new ModelRegistry(authStorage, join(agentDir, "models.json"));
29
+ const settingsManager = SettingsManager.inMemory();
30
+ const resourceLoader = new DefaultResourceLoader({
31
+ cwd: testDir,
32
+ agentDir,
33
+ settingsManager,
34
+ noExtensions: true,
35
+ noPromptTemplates: true,
36
+ noThemes: true,
23
37
  });
24
- test("newSession() references #3616 in the else-branch comment", () => {
25
- const idx = source.indexOf("#3616");
26
- assert.ok(idx >= 0, "source should reference issue #3616 for the tool restore fix");
38
+ await resourceLoader.reload();
39
+ return new AgentSession({
40
+ agent: new Agent(),
41
+ sessionManager: SessionManager.inMemory(testDir),
42
+ settingsManager,
43
+ cwd: testDir,
44
+ resourceLoader,
45
+ modelRegistry,
27
46
  });
28
- test("agent.reset() does not clear _state.tools (tools persist across reset)", () => {
29
- // This is a structural invariant if reset() starts clearing tools,
30
- // the newSession() refresh becomes the only defense against tool loss.
31
- const agentSource = readFileSync(join(process.cwd(), "packages/pi-agent-core/src/agent.ts"), "utf-8");
32
- const resetStart = agentSource.indexOf("reset()");
33
- assert.ok(resetStart >= 0, "should find reset() method");
34
- const resetBody = agentSource.slice(resetStart, resetStart + 400);
35
- assert.ok(!resetBody.includes("tools"), "reset() should NOT touch _state.tools — tools are managed by agent-session");
47
+ }
48
+ describe("#3616 newSession() restores narrowed tool set when cwd unchanged", () => {
49
+ beforeEach(() => {
50
+ testDir = mkdtempSync(join(tmpdir(), "agent-session-tool-refresh-"));
51
+ });
52
+ afterEach(() => {
53
+ rmSync(testDir, { recursive: true, force: true });
54
+ });
55
+ it("calls _refreshToolRegistry with includeAllExtensionTools: true when cwd unchanged", async () => {
56
+ const session = await createSession();
57
+ // Pin _cwd so newSession()'s `process.cwd()` branch takes the
58
+ // cwd-unchanged path. The production code compares `this._cwd !==
59
+ // previousCwd`; we force equality by setting _cwd to current cwd.
60
+ session._cwd = process.cwd();
61
+ const refreshCalls = [];
62
+ const originalRefresh = session._refreshToolRegistry.bind(session);
63
+ session._refreshToolRegistry = (options) => {
64
+ refreshCalls.push(options ?? {});
65
+ return originalRefresh(options);
66
+ };
67
+ const ok = await session.newSession();
68
+ assert.equal(ok, true);
69
+ assert.ok(refreshCalls.length > 0, "newSession() should invoke _refreshToolRegistry in the cwd-unchanged branch");
70
+ assert.ok(refreshCalls.some((o) => o.includeAllExtensionTools === true), `at least one _refreshToolRegistry call must pass includeAllExtensionTools: true; observed=${JSON.stringify(refreshCalls)}`);
71
+ });
72
+ it("agent.reset() does not clear _state.tools (tools persist across reset)", () => {
73
+ // Structural invariant protecting #3616: if reset() starts clearing
74
+ // tools, newSession()'s refresh becomes the only defense against loss.
75
+ // Assertion is behavioural — seed tools, call reset(), observe survival.
76
+ const agent = new Agent();
77
+ const tool = {
78
+ name: "test_tool",
79
+ description: "x",
80
+ schema: { type: "object", properties: {}, additionalProperties: false },
81
+ execute: async () => ({ content: [] }),
82
+ };
83
+ agent._state.tools = [tool];
84
+ agent.reset();
85
+ assert.deepEqual(agent._state.tools, [tool], "Agent.reset() must preserve _state.tools");
86
+ });
87
+ it("takes the cwd-changed branch (rebuilds runtime) when cwd differs", async () => {
88
+ const session = await createSession();
89
+ // Force the cwd-changed branch: set _cwd to something that won't equal process.cwd().
90
+ session._cwd = join(testDir, "some", "other", "cwd");
91
+ let buildRuntimeCalled = false;
92
+ let buildRuntimeIncludedAll = false;
93
+ const originalBuild = session._buildRuntime.bind(session);
94
+ session._buildRuntime = (options) => {
95
+ buildRuntimeCalled = true;
96
+ if (options?.includeAllExtensionTools === true)
97
+ buildRuntimeIncludedAll = true;
98
+ return originalBuild(options);
99
+ };
100
+ const ok = await session.newSession();
101
+ assert.equal(ok, true);
102
+ assert.ok(buildRuntimeCalled, "cwd-changed branch must rebuild the tool runtime");
103
+ assert.ok(buildRuntimeIncludedAll, "cwd-changed branch must rebuild with includeAllExtensionTools: true");
36
104
  });
37
105
  });
38
106
  //# sourceMappingURL=agent-session-tool-refresh.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-tool-refresh.test.js","sourceRoot":"","sources":["../../src/core/agent-session-tool-refresh.test.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,4DAA4D;AAE5D,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,MAAM,GAAG,YAAY,CAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oDAAoD,CAAC,EACzE,OAAO,CACP,CAAC;AAEF,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAChE,IAAI,CAAC,6FAA6F,EAAE,GAAG,EAAE;QACxG,6BAA6B;QAC7B,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QACrE,MAAM,CAAC,EAAE,CAAC,eAAe,IAAI,CAAC,EAAE,+BAA+B,CAAC,CAAC;QAEjE,wDAAwD;QACxD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC,CAAC;QAEzE,+CAA+C;QAC/C,MAAM,CAAC,EAAE,CACR,UAAU,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EACrD,8BAA8B,CAC9B,CAAC;QAEF,kFAAkF;QAClF,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,EAAE,gDAAgD,CAAC,CAAC;QAE1E,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC;QAC5D,MAAM,CAAC,EAAE,CACR,UAAU,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAC3C,8CAA8C,CAC9C,CAAC;QACF,MAAM,CAAC,EAAE,CACR,UAAU,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EACrD,kFAAkF,CAClF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACrE,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,8DAA8D,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wEAAwE,EAAE,GAAG,EAAE;QACnF,qEAAqE;QACrE,uEAAuE;QACvE,MAAM,WAAW,GAAG,YAAY,CAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,qCAAqC,CAAC,EAC1D,OAAO,CACP,CAAC;QACF,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,EAAE,CAAC,UAAU,IAAI,CAAC,EAAE,4BAA4B,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,CACR,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC5B,4EAA4E,CAC5E,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["// GSD-2 — Regression tests for #3616: tool list persistence across newSession() calls\n// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>\n\nimport test, { describe } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst source = readFileSync(\n\tjoin(process.cwd(), \"packages/pi-coding-agent/src/core/agent-session.ts\"),\n\t\"utf-8\",\n);\n\ndescribe(\"#3616 newSession() must restore full tool set\", () => {\n\ttest(\"newSession() calls _refreshToolRegistry with includeAllExtensionTools when cwd is unchanged\", () => {\n\t\t// Find the newSession method\n\t\tconst newSessionStart = source.indexOf(\"async newSession(options?:\");\n\t\tassert.ok(newSessionStart >= 0, \"should find newSession method\");\n\n\t\t// Get the method body (up to the next top-level method)\n\t\tconst methodBody = source.slice(newSessionStart, newSessionStart + 3000);\n\n\t\t// Verify the cwd-changed branch rebuilds tools\n\t\tassert.ok(\n\t\t\tmethodBody.includes(\"if (this._cwd !== previousCwd)\"),\n\t\t\t\"should have cwd-change guard\",\n\t\t);\n\n\t\t// Verify the else branch exists and refreshes tools with includeAllExtensionTools\n\t\tconst elseIdx = methodBody.indexOf(\"} else {\");\n\t\tassert.ok(elseIdx >= 0, \"should have else branch for cwd-unchanged case\");\n\n\t\tconst elseBranch = methodBody.slice(elseIdx, elseIdx + 800);\n\t\tassert.ok(\n\t\t\telseBranch.includes(\"_refreshToolRegistry\"),\n\t\t\t\"else branch should call _refreshToolRegistry\",\n\t\t);\n\t\tassert.ok(\n\t\t\telseBranch.includes(\"includeAllExtensionTools: true\"),\n\t\t\t\"else branch should pass includeAllExtensionTools: true to restore narrowed tools\",\n\t\t);\n\t});\n\n\ttest(\"newSession() references #3616 in the else-branch comment\", () => {\n\t\tconst idx = source.indexOf(\"#3616\");\n\t\tassert.ok(idx >= 0, \"source should reference issue #3616 for the tool restore fix\");\n\t});\n\n\ttest(\"agent.reset() does not clear _state.tools (tools persist across reset)\", () => {\n\t\t// This is a structural invariant — if reset() starts clearing tools,\n\t\t// the newSession() refresh becomes the only defense against tool loss.\n\t\tconst agentSource = readFileSync(\n\t\t\tjoin(process.cwd(), \"packages/pi-agent-core/src/agent.ts\"),\n\t\t\t\"utf-8\",\n\t\t);\n\t\tconst resetStart = agentSource.indexOf(\"reset()\");\n\t\tassert.ok(resetStart >= 0, \"should find reset() method\");\n\t\tconst resetBody = agentSource.slice(resetStart, resetStart + 400);\n\t\tassert.ok(\n\t\t\t!resetBody.includes(\"tools\"),\n\t\t\t\"reset() should NOT touch _state.tools tools are managed by agent-session\",\n\t\t);\n\t});\n});\n"]}
1
+ {"version":3,"file":"agent-session-tool-refresh.test.js","sourceRoot":"","sources":["../../src/core/agent-session-tool-refresh.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Regression test for #3616: newSession() must restore the full tool set\n// when cwd is unchanged.\n//\n// The bug: extensions may narrow the active tool list via setActiveTools()\n// during a session. Without a refresh in the else branch of newSession(),\n// the narrowed set persists into the next session — breaking auto-mode\n// subagent sessions that expect a full tool palette.\n//\n// Verified behaviourally: construct an AgentSession, wrap _refreshToolRegistry\n// to record its args, call newSession() with cwd unchanged, and assert that\n// a refresh was requested with includeAllExtensionTools: true.\n\nimport assert from \"node:assert/strict\";\nimport { mkdtempSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\n\nimport { Agent } from \"@gsd/pi-agent-core\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\n\nlet testDir: string;\n\nasync function createSession(): Promise<AgentSession> {\n\tconst agentDir = join(testDir, \"agent-home\");\n\tconst authStorage = AuthStorage.inMemory({});\n\tconst modelRegistry = new ModelRegistry(authStorage, join(agentDir, \"models.json\"));\n\tconst settingsManager = SettingsManager.inMemory();\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\tcwd: testDir,\n\t\tagentDir,\n\t\tsettingsManager,\n\t\tnoExtensions: true,\n\t\tnoPromptTemplates: true,\n\t\tnoThemes: true,\n\t});\n\tawait resourceLoader.reload();\n\n\treturn new AgentSession({\n\t\tagent: new Agent(),\n\t\tsessionManager: SessionManager.inMemory(testDir),\n\t\tsettingsManager,\n\t\tcwd: testDir,\n\t\tresourceLoader,\n\t\tmodelRegistry,\n\t});\n}\n\ndescribe(\"#3616 — newSession() restores narrowed tool set when cwd unchanged\", () => {\n\tbeforeEach(() => {\n\t\ttestDir = mkdtempSync(join(tmpdir(), \"agent-session-tool-refresh-\"));\n\t});\n\n\tafterEach(() => {\n\t\trmSync(testDir, { recursive: true, force: true });\n\t});\n\n\tit(\"calls _refreshToolRegistry with includeAllExtensionTools: true when cwd unchanged\", async () => {\n\t\tconst session = await createSession();\n\t\t// Pin _cwd so newSession()'s `process.cwd()` branch takes the\n\t\t// cwd-unchanged path. The production code compares `this._cwd !==\n\t\t// previousCwd`; we force equality by setting _cwd to current cwd.\n\t\t(session as any)._cwd = process.cwd();\n\n\t\tconst refreshCalls: Array<{ includeAllExtensionTools?: boolean }> = [];\n\t\tconst originalRefresh = (session as any)._refreshToolRegistry.bind(session);\n\t\t(session as any)._refreshToolRegistry = (options?: { includeAllExtensionTools?: boolean }) => {\n\t\t\trefreshCalls.push(options ?? {});\n\t\t\treturn originalRefresh(options);\n\t\t};\n\n\t\tconst ok = await session.newSession();\n\t\tassert.equal(ok, true);\n\n\t\tassert.ok(\n\t\t\trefreshCalls.length > 0,\n\t\t\t\"newSession() should invoke _refreshToolRegistry in the cwd-unchanged branch\",\n\t\t);\n\t\tassert.ok(\n\t\t\trefreshCalls.some((o) => o.includeAllExtensionTools === true),\n\t\t\t`at least one _refreshToolRegistry call must pass includeAllExtensionTools: true; observed=${JSON.stringify(refreshCalls)}`,\n\t\t);\n\t});\n\n\tit(\"agent.reset() does not clear _state.tools (tools persist across reset)\", () => {\n\t\t// Structural invariant protecting #3616: if reset() starts clearing\n\t\t// tools, newSession()'s refresh becomes the only defense against loss.\n\t\t// Assertion is behavioural — seed tools, call reset(), observe survival.\n\t\tconst agent = new Agent();\n\t\tconst tool = {\n\t\t\tname: \"test_tool\",\n\t\t\tdescription: \"x\",\n\t\t\tschema: { type: \"object\", properties: {}, additionalProperties: false } as any,\n\t\t\texecute: async () => ({ content: [] }),\n\t\t};\n\t\t(agent as any)._state.tools = [tool];\n\t\tagent.reset();\n\t\tassert.deepEqual(\n\t\t\t(agent as any)._state.tools,\n\t\t\t[tool],\n\t\t\t\"Agent.reset() must preserve _state.tools\",\n\t\t);\n\t});\n\n\tit(\"takes the cwd-changed branch (rebuilds runtime) when cwd differs\", async () => {\n\t\tconst session = await createSession();\n\t\t// Force the cwd-changed branch: set _cwd to something that won't equal process.cwd().\n\t\t(session as any)._cwd = join(testDir, \"some\", \"other\", \"cwd\");\n\n\t\tlet buildRuntimeCalled = false;\n\t\tlet buildRuntimeIncludedAll = false;\n\t\tconst originalBuild = (session as any)._buildRuntime.bind(session);\n\t\t(session as any)._buildRuntime = (options?: { includeAllExtensionTools?: boolean }) => {\n\t\t\tbuildRuntimeCalled = true;\n\t\t\tif (options?.includeAllExtensionTools === true) buildRuntimeIncludedAll = true;\n\t\t\treturn originalBuild(options);\n\t\t};\n\n\t\tconst ok = await session.newSession();\n\t\tassert.equal(ok, true);\n\n\t\tassert.ok(buildRuntimeCalled, \"cwd-changed branch must rebuild the tool runtime\");\n\t\tassert.ok(\n\t\t\tbuildRuntimeIncludedAll,\n\t\t\t\"cwd-changed branch must rebuild with includeAllExtensionTools: true\",\n\t\t);\n\t});\n});\n"]}
@@ -94,6 +94,22 @@ export declare function findCutPoint(entries: SessionEntry[], startIndex: number
94
94
  * budget is placed alone in its own chunk (never dropped).
95
95
  */
96
96
  export declare function chunkMessages(messages: AgentMessage[], maxTokensPerChunk: number): AgentMessage[][];
97
+ /**
98
+ * Heuristic: does this summary look like the "empty conversation" degenerate
99
+ * output that poisons the iterative UPDATE_SUMMARIZATION_PROMPT chain?
100
+ *
101
+ * The LLM occasionally returns short empty-sounding summaries when a chunk
102
+ * contains only truncated tool-call preambles without results. If the chain
103
+ * propagates this forward, every subsequent chunk is told to "PRESERVE all
104
+ * existing information" — which preserves the emptiness.
105
+ *
106
+ * Conservative match: an explicit substring hit OR length < 100 chars. We keep
107
+ * this deterministic (no fuzzy scoring) because fuzzy matching is where
108
+ * quality gates become flaky and hard to test.
109
+ *
110
+ * Exported for test access only.
111
+ */
112
+ export declare function isDegenerateSummary(summary: string | undefined): boolean;
97
113
  /** Type for the completion function, allowing injection for tests. */
98
114
  type CompleteFn = typeof completeSimple;
99
115
  /**
@@ -107,6 +123,15 @@ type CompleteFn = typeof completeSimple;
107
123
  * @param _completeFn - Internal override for testing; defaults to completeSimple.
108
124
  */
109
125
  export declare function generateSummary(currentMessages: AgentMessage[], model: Model<any>, reserveTokens: number, apiKey: string | undefined, signal?: AbortSignal, customInstructions?: string, previousSummary?: string, _completeFn?: CompleteFn): Promise<string>;
126
+ /**
127
+ * Thrown when `generateSummary` could not produce any non-degenerate summary
128
+ * from the provided messages AND no previous summary was available to fall
129
+ * back to. Callers should catch this and skip writing a compaction entry
130
+ * rather than writing an empty string to the session history (issue #4665).
131
+ */
132
+ export declare class CompactionProducedNoSummaryError extends Error {
133
+ constructor(message: string);
134
+ }
110
135
  export interface CompactionPreparation {
111
136
  /** UUID of first entry to keep */
112
137
  firstKeptEntryId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compaction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAoB,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAON,KAAK,cAAc,EAKnB,MAAM,YAAY,CAAC;AAMpB,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;CACxB;AAmCD,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,OAAO,CAAC,EAAE,CAAC,CAAC;CACZ;AAMD,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,2BAA2B,EAAE,kBAIzC,CAAC;AAMF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAE3D;AAgBD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,KAAK,GAAG,SAAS,CAShF;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAUD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,oBAAoB,CA4BpF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAGjH;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA0D5D;AA8CD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAe1G;AAED,MAAM,WAAW,cAAc;IAC9B,mCAAmC;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qFAAqF;IACrF,cAAc,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,WAAW,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAC3B,OAAO,EAAE,YAAY,EAAE,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,GACtB,cAAc,CAyDhB;AA8ED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,iBAAiB,EAAE,MAAM,GAAG,YAAY,EAAE,EAAE,CAwBnG;AAED,sEAAsE;AACtE,KAAK,UAAU,GAAG,OAAO,cAAc,CAAC;AAExC;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACpC,eAAe,EAAE,YAAY,EAAE,EAC/B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,CAAC,EAAE,WAAW,EACpB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,eAAe,CAAC,EAAE,MAAM,EACxB,WAAW,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAyDD,MAAM,WAAW,qBAAqB;IACrC,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,mBAAmB,EAAE,YAAY,EAAE,CAAC;IACpC,2EAA2E;IAC3E,kBAAkB,EAAE,YAAY,EAAE,CAAC;IACnC,iEAAiE;IACjE,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,OAAO,EAAE,cAAc,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,EAAE,kBAAkB,CAAC;CAC7B;AAED,wBAAgB,iBAAiB,CAChC,WAAW,EAAE,YAAY,EAAE,EAC3B,QAAQ,EAAE,kBAAkB,GAC1B,qBAAqB,GAAG,SAAS,CAiEnC;AAqBD;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC5B,WAAW,EAAE,qBAAqB,EAClC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,kBAAkB,CAAC,EAAE,MAAM,EAC3B,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,CAAC,CA4D3B"}
1
+ {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compaction.ts"],"names":[],"mappings":"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"}