gsd-pi 2.80.0-dev.fbe7c8c6f → 2.81.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (786) hide show
  1. package/README.md +35 -59
  2. package/dist/claude-cli-check.d.ts +30 -0
  3. package/dist/claude-cli-check.js +18 -7
  4. package/dist/cli.js +0 -19
  5. package/dist/headless-query.d.ts +10 -0
  6. package/dist/headless-query.js +6 -4
  7. package/dist/loader-entrypoint.d.ts +8 -0
  8. package/dist/loader-entrypoint.js +27 -0
  9. package/dist/loader.js +2 -11
  10. package/dist/mcp-server.d.ts +1 -0
  11. package/dist/mcp-server.js +6 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
  15. package/dist/resources/extensions/github-sync/sync.js +4 -1
  16. package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
  17. package/dist/resources/extensions/gsd/auto/loop.js +103 -9
  18. package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
  19. package/dist/resources/extensions/gsd/auto/phases.js +282 -132
  20. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  21. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  22. package/dist/resources/extensions/gsd/auto/session.js +9 -1
  23. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
  24. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  25. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  26. package/dist/resources/extensions/gsd/auto-dashboard.js +18 -0
  27. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  28. package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
  29. package/dist/resources/extensions/gsd/auto-post-unit.js +112 -78
  30. package/dist/resources/extensions/gsd/auto-prompts.js +103 -16
  31. package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
  32. package/dist/resources/extensions/gsd/auto-start.js +252 -14
  33. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  34. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  35. package/dist/resources/extensions/gsd/auto-worktree.js +229 -336
  36. package/dist/resources/extensions/gsd/auto.js +264 -86
  37. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +122 -11
  38. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  39. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  40. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  41. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  42. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  43. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  44. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  45. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -54
  46. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  47. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  48. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
  49. package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
  50. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  51. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  52. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  53. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  54. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  55. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  56. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  57. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  58. package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
  59. package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
  60. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  61. package/dist/resources/extensions/gsd/git-service.js +73 -5
  62. package/dist/resources/extensions/gsd/gsd-db.js +46 -13
  63. package/dist/resources/extensions/gsd/guided-flow.js +119 -42
  64. package/dist/resources/extensions/gsd/health-widget.js +3 -0
  65. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  66. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  67. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  68. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  69. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  70. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  71. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  72. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  73. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  74. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  78. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  80. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  81. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  82. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  83. package/dist/resources/extensions/gsd/quick.js +34 -2
  84. package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
  85. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  86. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  87. package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
  88. package/dist/resources/extensions/gsd/tool-contract.js +50 -0
  89. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  90. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  91. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  92. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  93. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  94. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  95. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  96. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  97. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  98. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  99. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  100. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  101. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  102. package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
  103. package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
  104. package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
  105. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  106. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  107. package/dist/web/standalone/.next/BUILD_ID +1 -1
  108. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  109. package/dist/web/standalone/.next/build-manifest.json +4 -4
  110. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  111. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  112. package/dist/web/standalone/.next/required-server-files.json +3 -3
  113. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  114. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  124. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  140. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  152. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  172. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  188. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  204. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  208. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/index.html +1 -1
  218. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  219. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  220. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  221. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  223. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  224. package/dist/web/standalone/.next/server/app/page.js +2 -2
  225. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  227. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  228. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  229. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/middleware.js +3 -3
  232. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  234. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  235. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  236. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  237. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  238. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  239. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  240. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  244. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  245. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  246. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  247. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  248. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  249. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  250. package/dist/web/standalone/server.js +1 -1
  251. package/dist/welcome-screen.d.ts +2 -0
  252. package/dist/welcome-screen.js +9 -7
  253. package/package.json +3 -3
  254. package/packages/daemon/package.json +2 -2
  255. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  256. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  257. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  258. package/packages/mcp-server/package.json +2 -2
  259. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  260. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  261. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  262. package/packages/native/package.json +1 -1
  263. package/packages/native/tsconfig.tsbuildinfo +1 -1
  264. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  265. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  266. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  267. package/packages/pi-agent-core/dist/agent.d.ts +9 -2
  268. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  269. package/packages/pi-agent-core/dist/agent.js +43 -11
  270. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  271. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  272. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  273. package/packages/pi-agent-core/dist/index.js +2 -0
  274. package/packages/pi-agent-core/dist/index.js.map +1 -1
  275. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  276. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  277. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  278. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  279. package/packages/pi-agent-core/dist/types.d.ts +31 -0
  280. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  281. package/packages/pi-agent-core/dist/types.js.map +1 -1
  282. package/packages/pi-agent-core/package.json +1 -1
  283. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  284. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  285. package/packages/pi-agent-core/src/agent.ts +52 -11
  286. package/packages/pi-agent-core/src/index.ts +2 -0
  287. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  288. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  289. package/packages/pi-agent-core/src/types.ts +26 -10
  290. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  291. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  292. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  293. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  294. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  295. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  296. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  297. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  298. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  299. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  300. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  301. package/packages/pi-ai/dist/types.d.ts +2 -0
  302. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  303. package/packages/pi-ai/dist/types.js.map +1 -1
  304. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  305. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  306. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  307. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  308. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  309. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  310. package/packages/pi-ai/package.json +1 -1
  311. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  312. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  313. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  314. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  315. package/packages/pi-ai/src/types.ts +3 -0
  316. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  317. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  318. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  319. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  320. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
  321. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  323. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
  325. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
  327. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +6 -2
  329. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  331. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  333. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  335. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  336. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  337. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  338. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  339. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  340. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  341. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  342. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  343. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  344. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  345. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  346. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  348. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +3 -0
  350. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/extensions/runner.js +6 -6
  352. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +5 -3
  354. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
  356. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  357. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  358. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  359. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  361. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  362. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  363. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  364. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  365. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  367. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  369. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  370. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  371. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  373. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  375. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  377. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  378. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  379. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  380. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  381. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  382. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  383. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  384. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  385. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  386. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  387. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  388. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  389. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  390. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  391. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  392. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  393. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  394. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  395. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  396. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  397. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  398. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  399. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  400. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  401. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  402. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  403. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  404. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  405. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  406. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  407. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  408. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  409. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  410. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  411. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  412. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  413. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  414. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  415. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  416. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  417. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  418. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  419. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  420. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  421. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  422. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  423. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  424. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  425. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  426. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
  427. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  428. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
  429. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  430. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
  431. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  432. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +155 -7
  433. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +31 -6
  436. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  437. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  438. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  439. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  440. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  441. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -3
  442. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  443. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  444. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  445. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  446. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  447. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  448. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  449. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  450. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  451. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  452. package/packages/pi-coding-agent/package.json +1 -1
  453. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
  454. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  455. package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
  456. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +6 -2
  457. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  458. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  459. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  460. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  461. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  462. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +5 -3
  463. package/packages/pi-coding-agent/src/core/extensions/runner.ts +8 -5
  464. package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
  465. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  466. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  467. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  468. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  469. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  470. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  471. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  472. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  473. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  474. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  475. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  476. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  477. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  478. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  479. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  480. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  481. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  482. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  483. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  484. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
  485. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
  486. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +180 -7
  487. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  488. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +39 -8
  489. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
  490. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
  491. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  492. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  493. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  494. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  495. package/packages/pi-tui/dist/tui.js +18 -8
  496. package/packages/pi-tui/dist/tui.js.map +1 -1
  497. package/packages/pi-tui/package.json +1 -1
  498. package/packages/pi-tui/src/tui.ts +20 -8
  499. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  500. package/packages/rpc-client/README.md +7 -0
  501. package/packages/rpc-client/package.json +1 -1
  502. package/pkg/package.json +1 -1
  503. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  504. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  505. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  506. package/src/resources/extensions/github-sync/sync.ts +8 -1
  507. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  508. package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
  509. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -11
  510. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  511. package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
  512. package/src/resources/extensions/gsd/auto/phases.ts +393 -200
  513. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  514. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  515. package/src/resources/extensions/gsd/auto/session.ts +9 -1
  516. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  517. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
  518. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  519. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  520. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -0
  521. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  522. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
  523. package/src/resources/extensions/gsd/auto-post-unit.ts +124 -80
  524. package/src/resources/extensions/gsd/auto-prompts.ts +112 -15
  525. package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
  526. package/src/resources/extensions/gsd/auto-start.ts +319 -19
  527. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  528. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  529. package/src/resources/extensions/gsd/auto-worktree.ts +259 -360
  530. package/src/resources/extensions/gsd/auto.ts +324 -88
  531. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +147 -11
  532. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  533. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  534. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  535. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  536. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  537. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  538. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  539. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +379 -54
  540. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  541. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  542. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
  543. package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
  544. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  545. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  546. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  547. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  548. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  549. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  550. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  551. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  552. package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
  553. package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
  554. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  555. package/src/resources/extensions/gsd/git-service.ts +87 -10
  556. package/src/resources/extensions/gsd/gsd-db.ts +50 -13
  557. package/src/resources/extensions/gsd/guided-flow.ts +148 -49
  558. package/src/resources/extensions/gsd/health-widget.ts +3 -0
  559. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  560. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  561. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  562. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  563. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  564. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  565. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  566. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  567. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  568. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  569. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  570. package/src/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
  571. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  572. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  573. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  574. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  575. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  576. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  577. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  578. package/src/resources/extensions/gsd/quick.ts +37 -2
  579. package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
  580. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  581. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  582. package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
  583. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  584. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  585. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  586. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  587. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +543 -40
  588. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  589. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
  590. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  591. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  592. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
  593. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  594. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  595. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
  596. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  597. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  598. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  599. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  600. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  601. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +142 -0
  602. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  603. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  604. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  605. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  606. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  607. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  608. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  609. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
  610. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  611. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  612. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  613. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  614. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  615. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  616. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  617. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  618. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  619. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  620. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  621. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  622. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  623. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  624. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +18 -10
  625. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  626. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  627. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
  628. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  629. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  630. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  631. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  632. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  633. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  634. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  635. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  636. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  637. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  638. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  639. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  640. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
  641. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  642. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  643. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  644. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  645. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  646. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  647. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  648. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  649. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  650. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  651. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -10
  652. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  653. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  654. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  655. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  656. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  657. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +37 -7
  658. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  659. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  660. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
  661. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
  662. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  663. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  664. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  665. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  666. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +44 -9
  667. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
  668. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  669. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  670. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  671. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  672. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
  673. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  674. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  675. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  676. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  677. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  678. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  679. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  680. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  681. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  682. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  683. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  684. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  685. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  686. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  687. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  688. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  689. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  690. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  691. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  692. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  693. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  694. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  695. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  696. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  697. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  698. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  699. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
  700. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  701. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  702. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  703. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  704. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
  705. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  706. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  707. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  708. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  709. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  710. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  711. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  712. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  713. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -77
  714. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  715. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  716. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  717. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  718. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  719. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  720. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +55 -0
  721. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
  722. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  723. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  724. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  725. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  726. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  727. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  728. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  729. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  730. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  731. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  732. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +210 -0
  733. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  734. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  735. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  736. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  737. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  738. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  739. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  740. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  741. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  742. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  743. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  744. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  745. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  746. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  747. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  748. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
  749. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
  750. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
  751. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  752. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  753. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  754. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +373 -76
  755. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
  756. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
  757. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  758. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  759. package/src/resources/extensions/gsd/tool-contract.ts +82 -0
  760. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  761. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  762. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  763. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  764. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  765. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  766. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  767. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  768. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  769. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  770. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  771. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  772. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  773. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
  774. package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
  775. package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
  776. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  777. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  778. package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
  779. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  780. package/dist/web/standalone/.next/static/chunks/app/page-fab3ebb85b006001.js +0 -1
  781. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  782. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  783. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
  784. package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
  785. /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → drLMkgfHQ8lzS229_HWYR}/_buildManifest.js +0 -0
  786. /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → drLMkgfHQ8lzS229_HWYR}/_ssgManifest.js +0 -0
@@ -2,6 +2,7 @@
2
2
 
3
3
  import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
4
4
 
5
+ import type { AgentEndEvent, ErrorContext } from "../auto/types.js";
5
6
  import { logWarning } from "../workflow-logger.js";
6
7
  import {
7
8
  checkDeepProjectSetupAfterTurn,
@@ -14,7 +15,13 @@ import { clearPathCache } from "../paths.js";
14
15
  import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, pauseAuto, setCurrentDispatchedModelId } from "../auto.js";
15
16
  import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
16
17
  import { pauseAutoForProviderError } from "../provider-error-pause.js";
17
- import { isSessionSwitchInFlight, resolveAgentEnd, resolveAgentEndCancelled } from "../auto/resolve.js";
18
+ import {
19
+ isSessionSwitchAbortGraceActive,
20
+ isSessionSwitchInFlight,
21
+ resolveAgentEnd,
22
+ resolveAgentEndCancelled,
23
+ } from "../auto/resolve.js";
24
+ import { shouldIgnoreAgentEndForActiveUnit } from "../auto/unit-runner-events.js";
18
25
  import { resolveModelId } from "../auto-model-selection.js";
19
26
  import { resolveProjectRoot } from "../worktree.js";
20
27
  import { clearDiscussionFlowState } from "./write-gate.js";
@@ -30,6 +37,10 @@ import { blockModel, isModelBlocked } from "../blocked-models.js";
30
37
 
31
38
  const retryState = createRetryState();
32
39
  const MAX_NETWORK_RETRIES = 2;
40
+
41
+ function isObjectRecord(value: unknown): value is Record<string, unknown> {
42
+ return !!value && typeof value === "object";
43
+ }
33
44
  /**
34
45
  * Cap on auto-resume attempts for sustained transient-provider errors.
35
46
  *
@@ -76,6 +87,111 @@ export function isUserInitiatedAbortMessage(message: string | undefined | null):
76
87
  return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
77
88
  }
78
89
 
90
+ function isBareClaudeCodeSessionSwitchAbortMarker(message: string | undefined | null): boolean {
91
+ if (!message) return false;
92
+ const normalized = message.trim().replace(/\s+/g, " ").toLowerCase();
93
+ return normalized === "claude code process aborted by user"
94
+ || normalized === "request aborted by user"
95
+ || normalized === "process aborted by user"
96
+ || normalized === "claude code stream aborted by caller";
97
+ }
98
+
99
+ function readAssistantTextContent(content: unknown): string {
100
+ if (!Array.isArray(content)) return "";
101
+ return content
102
+ .map((block) => {
103
+ if (!block || typeof block !== "object") return "";
104
+ const text = (block as { text?: unknown }).text;
105
+ return typeof text === "string" ? text : "";
106
+ })
107
+ .filter(Boolean)
108
+ .join("\n");
109
+ }
110
+
111
+ export function isClaudeCodeSessionSwitchAbortMessage(lastMsg: unknown): boolean {
112
+ if (!lastMsg || typeof lastMsg !== "object") return false;
113
+ const m = lastMsg as { stopReason?: unknown; errorMessage?: unknown; content?: unknown };
114
+ const carriers = [
115
+ m.errorMessage ? String(m.errorMessage) : "",
116
+ readAssistantTextContent(m.content),
117
+ ].filter((value) => value.trim().length > 0);
118
+
119
+ if ((m.stopReason === "error" || m.stopReason === "aborted") && carriers.length > 0) {
120
+ return carriers.every(isBareClaudeCodeSessionSwitchAbortMarker);
121
+ }
122
+
123
+ return false;
124
+ }
125
+
126
+ export function isBareClaudeCodeStreamAbortPlaceholder(lastMsg: unknown): boolean {
127
+ if (!lastMsg || typeof lastMsg !== "object") return false;
128
+ const m = lastMsg as { stopReason?: unknown; errorMessage?: unknown; content?: unknown };
129
+ if (m.stopReason !== "aborted" || m.errorMessage) return false;
130
+ const text = readAssistantTextContent(m.content).trim().replace(/\s+/g, " ").toLowerCase();
131
+ return text === "claude code stream aborted by caller";
132
+ }
133
+
134
+ /**
135
+ * Resolve an agent_end event observed while a session switch is in flight.
136
+ *
137
+ * #5538-followup: When `newSession()` aborts an in-flight stream as part of a
138
+ * session transition (run-unit.ts:63 → _settleCurrentTurnForSessionTransition
139
+ * → agent.abort()), the SDK emits "Claude Code process aborted by user" or
140
+ * "Request aborted by user" against the previous unit's turn. The previous
141
+ * code path treated that as a user cancellation and propagated it to the next
142
+ * unit via the pending-switch-cancellation queue, killing auto-mode with
143
+ * "Auto-mode stopped — Unit aborted: Claude Code process aborted by user"
144
+ * even though no user input occurred.
145
+ *
146
+ * Claude Code abort markers are intentionally ignored when the abort fires
147
+ * while the session-switch is in flight: the abort is the expected side-effect
148
+ * of the transition, not a user signal. Other branches (genuine `stopReason
149
+ * === "aborted"` with diagnostic content/errorMessage) preserve the prior
150
+ * behavior.
151
+ */
152
+ export function _handleSessionSwitchAgentEnd(
153
+ lastMsg: unknown,
154
+ resolveCancelled: (ctx: ErrorContext) => boolean,
155
+ ): void {
156
+ if (!lastMsg || typeof lastMsg !== "object") return;
157
+ const m = lastMsg as { stopReason?: unknown; errorMessage?: unknown; content?: unknown };
158
+
159
+ if (isClaudeCodeSessionSwitchAbortMessage(m)) {
160
+ // Internal abort from in-flight session transition — drop on the floor.
161
+ return;
162
+ }
163
+
164
+ if (m.stopReason === "error") {
165
+ const rawErrorMsg = m.errorMessage ? String(m.errorMessage) : "";
166
+ if (isBareClaudeCodeSessionSwitchAbortMarker(rawErrorMsg)) {
167
+ // Internal abort from in-flight session transition — drop on the floor.
168
+ return;
169
+ }
170
+ return;
171
+ }
172
+
173
+ if (m.stopReason === "aborted") {
174
+ const content = m.content;
175
+ const hasEmptyContent = Array.isArray(content) && content.length === 0;
176
+ const hasErrorMessage = !!m.errorMessage;
177
+ if (!hasEmptyContent || hasErrorMessage) {
178
+ resolveCancelled(_buildAbortedPauseContext(m as { errorMessage?: unknown }));
179
+ }
180
+ }
181
+ }
182
+
183
+ export function resolveAgentEndErrorDisplay(
184
+ rawErrorMsg: string,
185
+ content: unknown,
186
+ ): string {
187
+ const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
188
+ if (isUseless && Array.isArray(content)) {
189
+ const textBlock = content.find((b: any) => b.type === "text" && b.text);
190
+ if (textBlock) return (textBlock as any).text.slice(0, 300);
191
+ }
192
+ return rawErrorMsg;
193
+ }
194
+
79
195
  async function pauseTransientWithBackoff(
80
196
  cls: ErrorClass,
81
197
  pi: ExtensionAPI,
@@ -112,7 +228,7 @@ async function pauseTransientWithBackoff(
112
228
 
113
229
  export async function handleAgentEnd(
114
230
  pi: ExtensionAPI,
115
- event: { messages: any[] },
231
+ event: AgentEndEvent,
116
232
  ctx: ExtensionContext,
117
233
  ): Promise<void> {
118
234
  // #4648 — Invalidate the directory-listing cache before any artifact-existence
@@ -153,10 +269,32 @@ export async function handleAgentEnd(
153
269
  if (maybeHandleEmptyIntentTurn(event, isAutoActive())) return;
154
270
 
155
271
  if (!isAutoActive()) return;
156
- if (isSessionSwitchInFlight()) return;
272
+
273
+ if (shouldIgnoreAgentEndForActiveUnit(event)) {
274
+ return;
275
+ }
157
276
 
158
277
  const lastMsg = event.messages[event.messages.length - 1];
159
- if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "aborted") {
278
+ if (isSessionSwitchInFlight()) {
279
+ _handleSessionSwitchAgentEnd(lastMsg, resolveAgentEndCancelled);
280
+ return;
281
+ }
282
+
283
+ if (isSessionSwitchAbortGraceActive() && isClaudeCodeSessionSwitchAbortMessage(lastMsg)) {
284
+ // Claude Code can report the abort from `newSession()` a few hundred ms
285
+ // after the guard drops. That event belongs to the old turn; do not let it
286
+ // cancel the freshly-dispatched unit.
287
+ return;
288
+ }
289
+
290
+ if (isBareClaudeCodeStreamAbortPlaceholder(lastMsg)) {
291
+ // The Claude Code adapter can emit this placeholder after a prior turn has
292
+ // already completed and the next unit is active. It has no user/provider
293
+ // diagnostic value and must not cancel the newly-dispatched unit.
294
+ return;
295
+ }
296
+
297
+ if (isObjectRecord(lastMsg) && "stopReason" in lastMsg && lastMsg.stopReason === "aborted") {
160
298
  // Empty content with aborted stopReason is a non-fatal agent stop (the LLM
161
299
  // chose to end without producing output). Only pause on genuine fatal aborts
162
300
  // that carry error context — e.g. errorMessage field or non-empty content
@@ -182,7 +320,7 @@ export async function handleAgentEnd(
182
320
  await pauseAuto(ctx, pi, _buildAbortedPauseContext(lastMsg as { errorMessage?: unknown }));
183
321
  return;
184
322
  }
185
- if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "error") {
323
+ if (isObjectRecord(lastMsg) && "stopReason" in lastMsg && lastMsg.stopReason === "error") {
186
324
  // #3588: errorMessage can be useless (e.g. "success") while the real error
187
325
  // is in the assistant message text content. Fall back to content when
188
326
  // errorMessage looks uninformative.
@@ -195,15 +333,13 @@ export async function handleAgentEnd(
195
333
  });
196
334
  return;
197
335
  }
198
- const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
199
336
  // #3588: When errorMessage is uninformative, extract the real error from
200
337
  // the assistant message text content for display purposes only.
201
338
  // Classification still uses rawErrorMsg to avoid false positives from prose.
202
- let displayMsg = rawErrorMsg;
203
- if (isUseless && "content" in lastMsg && Array.isArray(lastMsg.content)) {
204
- const textBlock = lastMsg.content.find((b: any) => b.type === "text" && b.text);
205
- if (textBlock) displayMsg = (textBlock as any).text.slice(0, 300);
206
- }
339
+ const displayMsg = resolveAgentEndErrorDisplay(
340
+ rawErrorMsg,
341
+ "content" in lastMsg ? lastMsg.content : undefined,
342
+ );
207
343
  const errorDetail = displayMsg ? `: ${displayMsg}` : "";
208
344
  const explicitRetryAfterMs = ("retryAfterMs" in lastMsg && typeof lastMsg.retryAfterMs === "number") ? lastMsg.retryAfterMs : undefined;
209
345
 
@@ -5,7 +5,7 @@ import type { ExtensionAPI } from "@gsd/pi-coding-agent";
5
5
  import { Text } from "@gsd/pi-tui";
6
6
 
7
7
  import { loadEffectiveGSDPreferences } from "../preferences.js";
8
- import { ensureDbOpen } from "./dynamic-tools.js";
8
+ import { ensureDbOpen, resolveCtxCwd } from "./dynamic-tools.js";
9
9
  import { loadWriteGateSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "./write-gate.js";
10
10
  import { StringEnum } from "@gsd/pi-ai";
11
11
  import { logError } from "../workflow-logger.js";
@@ -16,6 +16,7 @@ async function loadWorkflowExecutors(): Promise<typeof import("../tools/workflow
16
16
  return import("../tools/workflow-tool-executors.js");
17
17
  }
18
18
 
19
+
19
20
  /**
20
21
  * Register an alias tool that shares the same execute function as its canonical counterpart.
21
22
  * The alias description and promptGuidelines direct the LLM to prefer the canonical name.
@@ -38,8 +39,8 @@ function registerAlias(pi: ExtensionAPI, toolDef: any, aliasName: string, canoni
38
39
  });
39
40
  }
40
41
 
41
- function requirementRootWriteGuard(operation: string): { content: Array<{ type: "text"; text: string }>; details: Record<string, unknown>; isError: true } | null {
42
- const guard = shouldBlockRootArtifactSaveInSnapshot(loadWriteGateSnapshot(process.cwd()), "REQUIREMENTS");
42
+ function requirementRootWriteGuard(operation: string, basePath: string): { content: Array<{ type: "text"; text: string }>; details: Record<string, unknown>; isError: true } | null {
43
+ const guard = shouldBlockRootArtifactSaveInSnapshot(loadWriteGateSnapshot(basePath), "REQUIREMENTS");
43
44
  if (!guard.block) return null;
44
45
  return {
45
46
  content: [{ type: "text", text: `Error ${operation} requirement: ${guard.reason ?? "requirements write blocked"}` }],
@@ -65,7 +66,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
65
66
  // ─── gsd_decision_save (formerly gsd_save_decision) ─────────────────────
66
67
 
67
68
  const decisionSaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
68
- const dbAvailable = await ensureDbOpen();
69
+ const basePath = resolveCtxCwd(_ctx);
70
+ const dbAvailable = await ensureDbOpen(basePath);
69
71
  if (!dbAvailable) {
70
72
  return {
71
73
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot save decision." }],
@@ -84,7 +86,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
84
86
  when_context: params.when_context,
85
87
  made_by: params.made_by,
86
88
  },
87
- process.cwd(),
89
+ basePath,
88
90
  );
89
91
  return {
90
92
  content: [{ type: "text" as const, text: `Saved decision ${id}` }],
@@ -152,9 +154,10 @@ export function registerDbTools(pi: ExtensionAPI): void {
152
154
  // ─── gsd_requirement_update (formerly gsd_update_requirement) ───────────
153
155
 
154
156
  const requirementUpdateExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
155
- const gateBlock = requirementRootWriteGuard("update_requirement");
157
+ const basePath = resolveCtxCwd(_ctx);
158
+ const gateBlock = requirementRootWriteGuard("update_requirement", basePath);
156
159
  if (gateBlock) return gateBlock;
157
- const dbAvailable = await ensureDbOpen();
160
+ const dbAvailable = await ensureDbOpen(basePath);
158
161
  if (!dbAvailable) {
159
162
  return {
160
163
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot update requirement." }],
@@ -170,7 +173,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
170
173
  if (params.description !== undefined) updates.description = params.description;
171
174
  if (params.primary_owner !== undefined) updates.primary_owner = params.primary_owner;
172
175
  if (params.supporting_slices !== undefined) updates.supporting_slices = params.supporting_slices;
173
- await updateRequirementInDb(params.id, updates, process.cwd());
176
+ await updateRequirementInDb(params.id, updates, basePath);
174
177
  return {
175
178
  content: [{ type: "text" as const, text: `Updated requirement ${params.id}` }],
176
179
  details: { operation: "update_requirement", id: params.id } as any,
@@ -232,9 +235,10 @@ export function registerDbTools(pi: ExtensionAPI): void {
232
235
  // ─── gsd_requirement_save ─────────────────────────────────────────────
233
236
 
234
237
  const requirementSaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
235
- const gateBlock = requirementRootWriteGuard("save_requirement");
238
+ const basePath = resolveCtxCwd(_ctx);
239
+ const gateBlock = requirementRootWriteGuard("save_requirement", basePath);
236
240
  if (gateBlock) return gateBlock;
237
- const dbAvailable = await ensureDbOpen();
241
+ const dbAvailable = await ensureDbOpen(basePath);
238
242
  if (!dbAvailable) {
239
243
  return {
240
244
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot save requirement." }],
@@ -255,7 +259,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
255
259
  validation: params.validation,
256
260
  notes: params.notes,
257
261
  },
258
- process.cwd(),
262
+ basePath,
259
263
  );
260
264
  return {
261
265
  content: [{ type: "text" as const, text: `Saved requirement ${result.id}` }],
@@ -335,7 +339,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
335
339
 
336
340
  const summarySaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
337
341
  const { executeSummarySave } = await loadWorkflowExecutors();
338
- return executeSummarySave(params, process.cwd());
342
+ return executeSummarySave(params, resolveCtxCwd(_ctx));
339
343
  };
340
344
 
341
345
  const summarySaveTool = {
@@ -386,24 +390,24 @@ export function registerDbTools(pi: ExtensionAPI): void {
386
390
 
387
391
  const milestoneGenerateIdExecute = async (_toolCallId: string, _params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
388
392
  try {
393
+ const basePath = resolveCtxCwd(_ctx);
389
394
  // Claim a reserved ID if the guided-flow already previewed one to the user.
390
395
  // This guarantees the ID shown in the UI matches the one materialised on disk.
391
396
  const { claimReservedId, findMilestoneIds, getReservedMilestoneIds, nextMilestoneId } = await import("../guided-flow.js");
392
397
  const reserved = claimReservedId();
393
398
  if (reserved) {
394
- await ensureMilestoneDbRow(reserved);
399
+ await ensureMilestoneDbRow(reserved, basePath);
395
400
  return {
396
401
  content: [{ type: "text" as const, text: reserved }],
397
402
  details: { operation: "generate_milestone_id", id: reserved, source: "reserved" } as any,
398
403
  };
399
404
  }
400
405
 
401
- const basePath = process.cwd();
402
406
  const existingIds = findMilestoneIds(basePath);
403
- const uniqueEnabled = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
407
+ const uniqueEnabled = !!loadEffectiveGSDPreferences(basePath)?.preferences?.unique_milestone_ids;
404
408
  const allIds = [...new Set([...existingIds, ...getReservedMilestoneIds()])];
405
409
  const newId = nextMilestoneId(allIds, uniqueEnabled);
406
- await ensureMilestoneDbRow(newId);
410
+ await ensureMilestoneDbRow(newId, basePath);
407
411
  return {
408
412
  content: [{ type: "text" as const, text: newId }],
409
413
  details: { operation: "generate_milestone_id", id: newId, existingCount: existingIds.length, uniqueEnabled } as any,
@@ -423,8 +427,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
423
427
  * later writes the full row. Silently skips if the DB isn't available yet
424
428
  * (pre-migration).
425
429
  */
426
- async function ensureMilestoneDbRow(milestoneId: string): Promise<void> {
427
- const dbAvailable = await ensureDbOpen();
430
+ async function ensureMilestoneDbRow(milestoneId: string, basePath: string): Promise<void> {
431
+ const dbAvailable = await ensureDbOpen(basePath);
428
432
  if (!dbAvailable) return;
429
433
  try {
430
434
  const { insertMilestone } = await import("../gsd-db.js");
@@ -471,7 +475,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
471
475
 
472
476
  const planMilestoneExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
473
477
  const { executePlanMilestone } = await loadWorkflowExecutors();
474
- return executePlanMilestone(params, process.cwd());
478
+ return executePlanMilestone(params, resolveCtxCwd(_ctx));
475
479
  };
476
480
 
477
481
  const planMilestoneTool = {
@@ -541,7 +545,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
541
545
 
542
546
  const planSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
543
547
  const { executePlanSlice } = await loadWorkflowExecutors();
544
- return executePlanSlice(params, process.cwd());
548
+ return executePlanSlice(params, resolveCtxCwd(_ctx));
545
549
  };
546
550
 
547
551
  const planSliceTool = {
@@ -590,7 +594,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
590
594
  // ─── gsd_plan_task (gsd_task_plan alias) ───────────────────────────────
591
595
 
592
596
  const planTaskExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
593
- const dbAvailable = await ensureDbOpen();
597
+ const basePath = resolveCtxCwd(_ctx);
598
+ const dbAvailable = await ensureDbOpen(basePath);
594
599
  if (!dbAvailable) {
595
600
  return {
596
601
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot plan task." }],
@@ -599,7 +604,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
599
604
  }
600
605
  try {
601
606
  const { handlePlanTask } = await import("../tools/plan-task.js");
602
- const result = await handlePlanTask(params, process.cwd());
607
+ const result = await handlePlanTask(params, basePath);
603
608
  if ("error" in result) {
604
609
  return {
605
610
  content: [{ type: "text" as const, text: `Error planning task: ${result.error}` }],
@@ -664,7 +669,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
664
669
 
665
670
  const taskCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
666
671
  const { executeTaskComplete } = await loadWorkflowExecutors();
667
- return executeTaskComplete(params, process.cwd());
672
+ return executeTaskComplete(params, resolveCtxCwd(_ctx));
668
673
  };
669
674
 
670
675
  const taskCompleteTool = {
@@ -735,7 +740,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
735
740
 
736
741
  const sliceCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
737
742
  const { executeSliceComplete } = await loadWorkflowExecutors();
738
- return executeSliceComplete(params, process.cwd());
743
+ return executeSliceComplete(params, resolveCtxCwd(_ctx));
739
744
  };
740
745
 
741
746
  const sliceCompleteTool = {
@@ -835,7 +840,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
835
840
  // ─── gsd_skip_slice (#3477 / #3487) ───────────────────────────────────
836
841
 
837
842
  const skipSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
838
- const dbAvailable = await ensureDbOpen();
843
+ const basePath = resolveCtxCwd(_ctx);
844
+ const dbAvailable = await ensureDbOpen(basePath);
839
845
  if (!dbAvailable) {
840
846
  return {
841
847
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot skip slice." }],
@@ -868,7 +874,6 @@ export function registerDbTools(pi: ExtensionAPI): void {
868
874
  // Rebuild STATE.md so it reflects the skip immediately (#3477).
869
875
  // Without this, /gsd auto reads stale STATE.md and resumes the skipped slice.
870
876
  try {
871
- const basePath = process.cwd();
872
877
  const { rebuildState } = await import("../doctor.js");
873
878
  await rebuildState(basePath);
874
879
  } catch (err) {
@@ -928,7 +933,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
928
933
 
929
934
  const milestoneCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
930
935
  const { executeCompleteMilestone } = await loadWorkflowExecutors();
931
- return executeCompleteMilestone(params, process.cwd());
936
+ return executeCompleteMilestone(params, resolveCtxCwd(_ctx));
932
937
  };
933
938
 
934
939
  const milestoneCompleteTool = {
@@ -974,7 +979,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
974
979
 
975
980
  const milestoneValidateExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
976
981
  const { executeValidateMilestone } = await loadWorkflowExecutors();
977
- return executeValidateMilestone(params, process.cwd());
982
+ return executeValidateMilestone(params, resolveCtxCwd(_ctx));
978
983
  };
979
984
 
980
985
  const milestoneValidateTool = {
@@ -1012,7 +1017,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1012
1017
 
1013
1018
  const replanSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1014
1019
  const { executeReplanSlice } = await loadWorkflowExecutors();
1015
- return executeReplanSlice(params, process.cwd());
1020
+ return executeReplanSlice(params, resolveCtxCwd(_ctx));
1016
1021
  };
1017
1022
 
1018
1023
  const replanSliceTool = {
@@ -1063,7 +1068,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1063
1068
 
1064
1069
  const reassessRoadmapExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1065
1070
  const { executeReassessRoadmap } = await loadWorkflowExecutors();
1066
- return executeReassessRoadmap(params, process.cwd());
1071
+ return executeReassessRoadmap(params, resolveCtxCwd(_ctx));
1067
1072
  };
1068
1073
 
1069
1074
  const reassessRoadmapTool = {
@@ -1122,7 +1127,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
1122
1127
  // Single-writer v3, Stream 3: reversibility tools for closed units.
1123
1128
 
1124
1129
  const reopenTaskExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1125
- const dbAvailable = await ensureDbOpen();
1130
+ const basePath = resolveCtxCwd(_ctx);
1131
+ const dbAvailable = await ensureDbOpen(basePath);
1126
1132
  if (!dbAvailable) {
1127
1133
  return {
1128
1134
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot reopen task." }],
@@ -1131,7 +1137,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1131
1137
  }
1132
1138
  try {
1133
1139
  const { handleReopenTask } = await import("../tools/reopen-task.js");
1134
- const result = await handleReopenTask(params, process.cwd());
1140
+ const result = await handleReopenTask(params, basePath);
1135
1141
  if ("error" in result) {
1136
1142
  return {
1137
1143
  content: [{ type: "text" as const, text: `Error reopening task: ${result.error}` }],
@@ -1188,7 +1194,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
1188
1194
  // ─── gsd_slice_reopen (gsd_reopen_slice alias) ─────────────────────────
1189
1195
 
1190
1196
  const reopenSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1191
- const dbAvailable = await ensureDbOpen();
1197
+ const basePath = resolveCtxCwd(_ctx);
1198
+ const dbAvailable = await ensureDbOpen(basePath);
1192
1199
  if (!dbAvailable) {
1193
1200
  return {
1194
1201
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot reopen slice." }],
@@ -1197,7 +1204,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1197
1204
  }
1198
1205
  try {
1199
1206
  const { handleReopenSlice } = await import("../tools/reopen-slice.js");
1200
- const result = await handleReopenSlice(params, process.cwd());
1207
+ const result = await handleReopenSlice(params, basePath);
1201
1208
  if ("error" in result) {
1202
1209
  return {
1203
1210
  content: [{ type: "text" as const, text: `Error reopening slice: ${result.error}` }],
@@ -1254,7 +1261,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
1254
1261
  // ─── gsd_milestone_reopen (gsd_reopen_milestone alias) ─────────────────
1255
1262
 
1256
1263
  const reopenMilestoneExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1257
- const dbAvailable = await ensureDbOpen();
1264
+ const basePath = resolveCtxCwd(_ctx);
1265
+ const dbAvailable = await ensureDbOpen(basePath);
1258
1266
  if (!dbAvailable) {
1259
1267
  return {
1260
1268
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot reopen milestone." }],
@@ -1263,7 +1271,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1263
1271
  }
1264
1272
  try {
1265
1273
  const { handleReopenMilestone } = await import("../tools/reopen-milestone.js");
1266
- const result = await handleReopenMilestone(params, process.cwd());
1274
+ const result = await handleReopenMilestone(params, basePath);
1267
1275
  if ("error" in result) {
1268
1276
  return {
1269
1277
  content: [{ type: "text" as const, text: `Error reopening milestone: ${result.error}` }],
@@ -1319,7 +1327,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1319
1327
 
1320
1328
  const saveGateResultExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1321
1329
  const { executeSaveGateResult } = await loadWorkflowExecutors();
1322
- return executeSaveGateResult(params, process.cwd());
1330
+ return executeSaveGateResult(params, resolveCtxCwd(_ctx));
1323
1331
  };
1324
1332
 
1325
1333
  const saveGateResultTool = {
@@ -1,4 +1,7 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers workspace-aware dynamic filesystem and shell tools.
1
3
  import { existsSync } from "node:fs";
4
+ import { homedir } from "node:os";
2
5
  import { dirname } from "node:path";
3
6
 
4
7
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
@@ -8,6 +11,24 @@ import { DEFAULT_BASH_TIMEOUT_SECS } from "../constants.js";
8
11
  import { setLogBasePath, logWarning } from "../workflow-logger.js";
9
12
  import { resolveGsdPathContract } from "../paths.js";
10
13
 
14
+ export function safeWorkspaceCwd(): string {
15
+ try {
16
+ return process.cwd();
17
+ } catch {
18
+ const projectRoot = process.env.GSD_PROJECT_ROOT;
19
+ if (projectRoot && existsSync(projectRoot)) return projectRoot;
20
+ return homedir();
21
+ }
22
+ }
23
+
24
+ export function resolveCtxCwd(ctx?: unknown): string {
25
+ if (ctx && typeof ctx === "object" && typeof (ctx as { cwd?: unknown }).cwd === "string") {
26
+ const cwd = (ctx as { cwd: string }).cwd;
27
+ if (existsSync(cwd)) return cwd;
28
+ }
29
+ return safeWorkspaceCwd();
30
+ }
31
+
11
32
  /**
12
33
  * Resolve the correct DB path for the current working directory.
13
34
  * If `basePath` is inside a `.gsd/worktrees/<MID>/` directory, returns
@@ -18,7 +39,7 @@ export function resolveProjectRootDbPath(basePath: string): string {
18
39
  return resolveGsdPathContract(basePath).projectDb;
19
40
  }
20
41
 
21
- export async function ensureDbOpen(basePath: string = process.cwd()): Promise<boolean> {
42
+ export async function ensureDbOpen(basePath: string = safeWorkspaceCwd()): Promise<boolean> {
22
43
  try {
23
44
  const db = await import("../gsd-db.js");
24
45
  const contract = resolveGsdPathContract(basePath);
@@ -50,8 +71,9 @@ export async function ensureDbOpen(basePath: string = process.cwd()): Promise<bo
50
71
  }
51
72
 
52
73
  export function registerDynamicTools(pi: ExtensionAPI): void {
53
- const baseBash = createBashTool(process.cwd(), {
54
- spawnHook: (ctx) => ({ ...ctx, cwd: process.cwd() }),
74
+ const fallbackRoot = safeWorkspaceCwd();
75
+ const baseBash = createBashTool(fallbackRoot, {
76
+ spawnHook: (ctx) => ctx,
55
77
  });
56
78
  const dynamicBash = {
57
79
  ...baseBash,
@@ -62,16 +84,20 @@ export function registerDynamicTools(pi: ExtensionAPI): void {
62
84
  onUpdate?: unknown,
63
85
  ctx?: unknown,
64
86
  ) => {
87
+ const basePath = resolveCtxCwd(ctx);
88
+ const fresh = createBashTool(basePath, {
89
+ spawnHook: (spawnCtx) => ({ ...spawnCtx, cwd: basePath }),
90
+ });
65
91
  const paramsWithTimeout = {
66
92
  ...params,
67
93
  timeout: params.timeout ?? DEFAULT_BASH_TIMEOUT_SECS,
68
94
  };
69
- return (baseBash as any).execute(toolCallId, paramsWithTimeout, signal, onUpdate, ctx);
95
+ return (fresh as any).execute(toolCallId, paramsWithTimeout, signal, onUpdate, ctx);
70
96
  },
71
97
  };
72
98
  pi.registerTool(dynamicBash as any);
73
99
 
74
- const baseWrite = createWriteTool(process.cwd());
100
+ const baseWrite = createWriteTool(fallbackRoot);
75
101
  pi.registerTool({
76
102
  ...baseWrite,
77
103
  execute: async (
@@ -81,12 +107,12 @@ export function registerDynamicTools(pi: ExtensionAPI): void {
81
107
  onUpdate?: unknown,
82
108
  ctx?: unknown,
83
109
  ) => {
84
- const fresh = createWriteTool(process.cwd());
110
+ const fresh = createWriteTool(resolveCtxCwd(ctx));
85
111
  return (fresh as any).execute(toolCallId, params, signal, onUpdate, ctx);
86
112
  },
87
113
  } as any);
88
114
 
89
- const baseRead = createReadTool(process.cwd());
115
+ const baseRead = createReadTool(fallbackRoot);
90
116
  pi.registerTool({
91
117
  ...baseRead,
92
118
  execute: async (
@@ -96,12 +122,12 @@ export function registerDynamicTools(pi: ExtensionAPI): void {
96
122
  onUpdate?: unknown,
97
123
  ctx?: unknown,
98
124
  ) => {
99
- const fresh = createReadTool(process.cwd());
125
+ const fresh = createReadTool(resolveCtxCwd(ctx));
100
126
  return (fresh as any).execute(toolCallId, params, signal, onUpdate, ctx);
101
127
  },
102
128
  } as any);
103
129
 
104
- const baseEdit = createEditTool(process.cwd());
130
+ const baseEdit = createEditTool(fallbackRoot);
105
131
  pi.registerTool({
106
132
  ...baseEdit,
107
133
  execute: async (
@@ -111,7 +137,7 @@ export function registerDynamicTools(pi: ExtensionAPI): void {
111
137
  onUpdate?: unknown,
112
138
  ctx?: unknown,
113
139
  ) => {
114
- const fresh = createEditTool(process.cwd());
140
+ const fresh = createEditTool(resolveCtxCwd(ctx));
115
141
  return (fresh as any).execute(toolCallId, params, signal, onUpdate, ctx);
116
142
  },
117
143
  } as any);