gsd-pi 2.80.0-dev.8b3a59f5c → 2.80.0-dev.a947d025c

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 (714) 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/GSD-WORKFLOW.md +2 -2
  14. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
  16. package/dist/resources/extensions/github-sync/sync.js +4 -1
  17. package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
  18. package/dist/resources/extensions/gsd/auto/loop.js +103 -9
  19. package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
  20. package/dist/resources/extensions/gsd/auto/phases.js +311 -154
  21. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  22. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  23. package/dist/resources/extensions/gsd/auto/session.js +9 -1
  24. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  26. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  27. package/dist/resources/extensions/gsd/auto-dashboard.js +18 -0
  28. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  29. package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
  30. package/dist/resources/extensions/gsd/auto-post-unit.js +122 -88
  31. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  32. package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
  33. package/dist/resources/extensions/gsd/auto-start.js +254 -17
  34. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  35. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  36. package/dist/resources/extensions/gsd/auto-worktree.js +229 -336
  37. package/dist/resources/extensions/gsd/auto.js +273 -87
  38. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +122 -11
  39. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  40. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  41. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  42. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  43. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  44. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  45. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  46. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -54
  47. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  48. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
  50. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  51. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  52. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  53. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  54. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  55. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  56. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  57. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  58. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  59. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  60. package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
  61. package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
  62. package/dist/resources/extensions/gsd/detection.js +106 -0
  63. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  64. package/dist/resources/extensions/gsd/git-service.js +73 -5
  65. package/dist/resources/extensions/gsd/gsd-db.js +46 -13
  66. package/dist/resources/extensions/gsd/guided-flow.js +149 -48
  67. package/dist/resources/extensions/gsd/health-widget.js +3 -0
  68. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  69. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  70. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  72. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  73. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  74. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  75. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  76. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  77. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  78. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  79. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  80. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  81. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  84. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  85. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  86. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  87. package/dist/resources/extensions/gsd/quick.js +34 -2
  88. package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
  89. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  90. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  91. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  92. package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
  93. package/dist/resources/extensions/gsd/tool-contract.js +50 -0
  94. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  95. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  96. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  97. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  98. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  99. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  100. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  101. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  102. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  103. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  104. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  105. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  106. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  107. package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
  108. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  109. package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
  110. package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
  111. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  112. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  113. package/dist/web/standalone/.next/BUILD_ID +1 -1
  114. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
  115. package/dist/web/standalone/.next/build-manifest.json +3 -3
  116. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  117. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  118. package/dist/web/standalone/.next/required-server-files.json +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/index.html +1 -1
  138. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  139. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  140. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  141. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -16
  146. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/middleware.js +3 -3
  149. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  150. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  151. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  152. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  153. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  154. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  155. package/dist/web/standalone/server.js +1 -1
  156. package/dist/welcome-screen.d.ts +2 -0
  157. package/dist/welcome-screen.js +9 -7
  158. package/package.json +6 -4
  159. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  160. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  161. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  162. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  163. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  164. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  165. package/packages/native/tsconfig.tsbuildinfo +1 -1
  166. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  167. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  168. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  169. package/packages/pi-agent-core/dist/agent.d.ts +9 -2
  170. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  171. package/packages/pi-agent-core/dist/agent.js +43 -11
  172. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  173. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  174. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  175. package/packages/pi-agent-core/dist/index.js +2 -0
  176. package/packages/pi-agent-core/dist/index.js.map +1 -1
  177. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  178. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  179. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  180. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  181. package/packages/pi-agent-core/dist/types.d.ts +31 -0
  182. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  183. package/packages/pi-agent-core/dist/types.js.map +1 -1
  184. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  185. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  186. package/packages/pi-agent-core/src/agent.ts +52 -11
  187. package/packages/pi-agent-core/src/index.ts +2 -0
  188. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  189. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  190. package/packages/pi-agent-core/src/types.ts +26 -10
  191. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  192. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  193. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  194. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  195. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  196. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  197. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  198. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  199. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  200. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  201. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  202. package/packages/pi-ai/dist/types.d.ts +2 -0
  203. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  204. package/packages/pi-ai/dist/types.js.map +1 -1
  205. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  206. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  207. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  208. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  209. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  210. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  211. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  212. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  213. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  214. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  215. package/packages/pi-ai/src/types.ts +3 -0
  216. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  217. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  218. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  219. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  220. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
  221. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  223. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
  225. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  226. package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
  227. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +35 -1
  229. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  231. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  233. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  235. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  236. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  237. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  238. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  239. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  240. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  241. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  242. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  243. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  244. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  245. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  246. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  248. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  250. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  252. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  254. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
  256. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  259. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  261. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  262. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  263. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  264. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  265. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  267. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  269. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  271. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  273. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  275. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  277. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  279. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  281. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  283. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  285. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  287. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  289. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  291. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  293. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  295. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  297. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  299. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  301. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  303. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  305. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  307. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  309. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  311. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  313. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  315. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  316. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  317. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  318. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  319. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  320. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  321. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  322. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  323. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  325. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +114 -22
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +32 -7
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +177 -19
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +33 -6
  345. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  347. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -3
  351. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  354. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  356. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  359. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  360. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  361. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  362. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  363. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  364. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  365. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  366. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
  367. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  368. package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
  369. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +41 -1
  370. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  371. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  372. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  373. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  374. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  375. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  376. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  377. package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
  378. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  379. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  380. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  381. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  382. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  383. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  384. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  385. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  386. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  387. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  388. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  389. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  390. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  391. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  392. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  393. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  394. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  395. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  396. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  397. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  398. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +144 -22
  399. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  400. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  401. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  402. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -10
  403. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +208 -19
  404. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  405. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +41 -8
  406. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
  407. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  408. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  409. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
  410. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  411. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  412. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  413. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  414. package/packages/pi-tui/dist/tui.js +18 -8
  415. package/packages/pi-tui/dist/tui.js.map +1 -1
  416. package/packages/pi-tui/src/tui.ts +20 -8
  417. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  418. package/packages/rpc-client/README.md +7 -0
  419. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  420. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  421. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  422. package/src/resources/GSD-WORKFLOW.md +2 -2
  423. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  424. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  425. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  426. package/src/resources/extensions/github-sync/sync.ts +8 -1
  427. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  428. package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
  429. package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -11
  430. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  431. package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
  432. package/src/resources/extensions/gsd/auto/phases.ts +427 -220
  433. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  434. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  435. package/src/resources/extensions/gsd/auto/session.ts +9 -1
  436. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  437. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
  438. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  439. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  440. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -0
  441. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  442. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  443. package/src/resources/extensions/gsd/auto-post-unit.ts +134 -90
  444. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  445. package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
  446. package/src/resources/extensions/gsd/auto-start.ts +326 -25
  447. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  448. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  449. package/src/resources/extensions/gsd/auto-worktree.ts +259 -360
  450. package/src/resources/extensions/gsd/auto.ts +336 -89
  451. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +147 -11
  452. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  453. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  454. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  455. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  456. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  457. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  458. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  459. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +379 -54
  460. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  461. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  462. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
  463. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  464. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  465. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  466. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  467. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  468. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  469. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  470. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  471. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  472. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  473. package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
  474. package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
  475. package/src/resources/extensions/gsd/detection.ts +128 -0
  476. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  477. package/src/resources/extensions/gsd/git-service.ts +87 -10
  478. package/src/resources/extensions/gsd/gsd-db.ts +50 -13
  479. package/src/resources/extensions/gsd/guided-flow.ts +175 -55
  480. package/src/resources/extensions/gsd/health-widget.ts +3 -0
  481. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  482. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  483. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  484. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  485. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  486. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  487. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  488. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  489. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  490. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  491. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  492. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  493. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  494. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  495. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  496. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  497. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  498. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  499. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  500. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  501. package/src/resources/extensions/gsd/quick.ts +37 -2
  502. package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
  503. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  504. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  505. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  506. package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
  507. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  508. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  509. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  510. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  511. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +544 -41
  512. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  513. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
  514. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  515. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  516. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
  517. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  518. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  519. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
  520. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  521. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  522. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  523. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  524. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  525. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +142 -0
  526. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  527. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  528. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  529. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  530. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  531. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  532. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  533. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  534. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  535. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  536. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  537. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  538. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  539. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  540. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  541. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  542. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  543. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  544. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  545. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  546. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  547. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  548. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +18 -10
  549. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  550. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  551. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
  552. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  553. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  554. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  555. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  556. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  557. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  558. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  559. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  560. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  561. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  562. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  563. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  564. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  565. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
  566. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  567. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  568. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  569. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  570. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  571. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  572. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  573. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  574. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  575. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  576. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  577. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -10
  578. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  579. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  580. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  581. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  582. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  583. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +37 -7
  584. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  585. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  586. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
  587. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
  588. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  589. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  590. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  591. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  592. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +44 -9
  593. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
  594. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  595. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  596. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  597. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  598. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
  599. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  600. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  601. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  602. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  603. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  604. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  605. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  606. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  607. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  608. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  609. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  610. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  611. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  612. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  613. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  614. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  615. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  616. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  617. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  618. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  619. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  620. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  621. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  622. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  623. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  624. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  625. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  626. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
  627. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  628. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  629. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  630. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  631. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  632. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
  633. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  634. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  635. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  636. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  637. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  638. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  639. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  640. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  641. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  642. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  643. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  644. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  645. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  646. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  647. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  648. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  649. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
  650. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  651. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  652. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  653. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  654. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  655. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  656. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  657. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  658. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  659. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  660. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +210 -0
  661. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  662. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  663. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  664. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  665. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  666. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  667. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  668. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  669. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  670. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  671. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  672. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  673. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  674. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  675. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  676. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  677. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
  678. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
  679. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  680. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  681. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  682. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  683. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  684. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +373 -76
  685. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
  686. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
  687. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  688. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  689. package/src/resources/extensions/gsd/tool-contract.ts +82 -0
  690. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  691. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  692. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  693. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  694. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  695. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  696. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  697. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  698. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  699. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  700. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  701. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  702. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  703. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
  704. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  705. package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
  706. package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
  707. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  708. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  709. package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
  710. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  711. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
  712. package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
  713. /package/dist/web/standalone/.next/static/{k-MDjzPMF62Rg1-FR437h → 8G7Lc96dfT0V6VXh6O6Ka}/_buildManifest.js +0 -0
  714. /package/dist/web/standalone/.next/static/{k-MDjzPMF62Rg1-FR437h → 8G7Lc96dfT0V6VXh6O6Ka}/_ssgManifest.js +0 -0
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Auto-mode orchestration, session lifecycle, and stop handling.
1
3
  /**
2
4
  * GSD Auto Mode — Fresh Session Per Unit
3
5
  *
@@ -20,7 +22,7 @@ import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveDir, milest
20
22
  import { invalidateAllCaches } from "./cache.js";
21
23
  import { clearActivityLogState } from "./activity-log.js";
22
24
  import { synthesizeCrashRecovery, getDeepDiagnostic, readActiveMilestoneId, } from "./session-forensics.js";
23
- import { writeLock, clearLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, } from "./crash-recovery.js";
25
+ import { writeLock, clearLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, emitOpenUnitEndForUnit, } from "./crash-recovery.js";
24
26
  import { acquireSessionLock, getSessionLockStatus, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
25
27
  import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, getIsolationMode, } from "./preferences.js";
26
28
  import { sendDesktopNotification } from "./notifications.js";
@@ -45,8 +47,9 @@ import { readFileSync, existsSync, mkdirSync } from "node:fs";
45
47
  import { atomicWriteSync } from "./atomic-write.js";
46
48
  import { autoCommitCurrentBranch, captureIntegrationBranch, detectWorktreeName, getCurrentBranch, getMainBranch, setActiveMilestoneId, resolveProjectRoot, } from "./worktree.js";
47
49
  import { GitServiceImpl } from "./git-service.js";
50
+ import { nativeCheckoutBranch } from "./native-git-bridge.js";
48
51
  import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
49
- import { createAutoWorktree, enterAutoWorktree, enterBranchModeForMilestone, teardownAutoWorktree, isInAutoWorktree, getAutoWorktreePath, mergeMilestoneToMain, autoWorktreeBranch, syncWorktreeStateBack, syncProjectRootToWorktree, checkResourcesStale, escapeStaleWorktree, } from "./auto-worktree.js";
52
+ import { createAutoWorktree, enterAutoWorktree, enterBranchModeForMilestone, teardownAutoWorktree, isInAutoWorktree, getAutoWorktreePath, mergeMilestoneToMain, autoWorktreeBranch, checkResourcesStale, escapeStaleWorktree, } from "./auto-worktree.js";
50
53
  import { pruneQueueOrder } from "./queue-order.js";
51
54
  import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
52
55
  import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
@@ -61,6 +64,8 @@ import { isClosedStatus } from "./status-guards.js";
61
64
  import { updateProgressWidget as _updateProgressWidget, updateSliceProgressCache, clearSliceProgressCache, } from "./auto-dashboard.js";
62
65
  import { registerSigtermHandler as _registerSigtermHandler, deregisterSigtermHandler as _deregisterSigtermHandler, } from "./auto-supervisor.js";
63
66
  import { isDbAvailable, getMilestone } from "./gsd-db.js";
67
+ import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
68
+ import { writeUnitRuntimeRecord } from "./unit-runtime.js";
64
69
  import { countPendingCaptures } from "./captures.js";
65
70
  import { CMUX_CHANNELS } from "../shared/cmux-events.js";
66
71
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
@@ -83,8 +88,24 @@ import { runAutoLoopWithUok } from "./uok/kernel.js";
83
88
  import { resolveUokFlags } from "./uok/flags.js";
84
89
  import { validateDirectory } from "./validate-directory.js";
85
90
  import { createAutoOrchestrator } from "./auto/orchestrator.js";
86
- import { WorktreeResolver, } from "./worktree-resolver.js";
91
+ import { reconcileBeforeDispatch } from "./state-reconciliation.js";
92
+ import { compileUnitToolContract } from "./tool-contract.js";
93
+ import { createWorktreeSafetyModule } from "./worktree-safety.js";
94
+ import { resolveManifest } from "./unit-context-manifest.js";
95
+ import { classifyFailure } from "./recovery-classification.js";
96
+ import { WorktreeLifecycle, } from "./worktree-lifecycle.js";
97
+ import { WorktreeStateProjection } from "./worktree-state-projection.js";
87
98
  import { reorderForCaching } from "./prompt-ordering.js";
99
+ import { initTokenCounter } from "./token-counter.js";
100
+ // Warm the tiktoken encoder at extension startup so context-budget computations
101
+ // can use accurate token counts via countTokensSync without paying the load
102
+ // cost mid-prompt-build. Fire-and-forget — failure falls back to the
103
+ // provider-aware char-ratio estimator already used by getCharsPerToken().
104
+ // Catch rejections explicitly: an unhandled rejection at module-import time
105
+ // can destabilize startup before the engine logger is configured.
106
+ void initTokenCounter().catch((err) => {
107
+ logWarning("engine", `token counter warm-up failed: ${err instanceof Error ? err.message : String(err)}`);
108
+ });
88
109
  export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session.js";
89
110
  import { autoSession as s } from "./auto-runtime-state.js";
90
111
  import { gsdHome } from "./gsd-home.js";
@@ -112,11 +133,12 @@ const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
112
133
  * the DB is unavailable (e.g. fresh project before init) we skip registration
113
134
  * silently rather than blocking session start.
114
135
  */
115
- function registerAutoWorkerForSession(session) {
136
+ function registerAutoWorkerForSession(session, projectRootOverride) {
116
137
  if (session.workerId)
117
138
  return; // already registered (e.g. resume re-runs)
118
139
  try {
119
- const projectRootRealpath = normalizeRealPath(session.scope?.workspace.projectRoot
140
+ const projectRootRealpath = normalizeRealPath(projectRootOverride
141
+ ?? session.scope?.workspace.projectRoot
120
142
  ?? (session.originalBasePath || session.basePath));
121
143
  session.workerId = registerAutoWorker({ projectRootRealpath });
122
144
  }
@@ -148,6 +170,12 @@ function restoreProjectRootEnv() {
148
170
  s.hadProjectRootEnv = false;
149
171
  s.projectRootEnvCaptured = false;
150
172
  }
173
+ export function _captureProjectRootEnvForTest(projectRoot) {
174
+ captureProjectRootEnv(projectRoot);
175
+ }
176
+ export function _restoreProjectRootEnvForTest() {
177
+ restoreProjectRootEnv();
178
+ }
151
179
  function captureMilestoneLockEnv(milestoneId) {
152
180
  if (!s.milestoneLockEnvCaptured) {
153
181
  s.hadMilestoneLockEnv = Object.prototype.hasOwnProperty.call(process.env, "GSD_MILESTONE_LOCK");
@@ -225,8 +253,21 @@ function synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile
225
253
  export function _synthesizePausedSessionRecoveryForTest(basePath, unitType, unitId, sessionFile) {
226
254
  return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
227
255
  }
256
+ export function _resolvePausedResumeBasePathForTest(basePath, pausedWorktreePath, pathExists = existsSync) {
257
+ return pausedWorktreePath && pathExists(pausedWorktreePath)
258
+ ? pausedWorktreePath
259
+ : basePath;
260
+ }
261
+ const DETACHED_AUTO_KEEPALIVE_INTERVAL_MS = 30_000;
262
+ function withDetachedAutoKeepalive(run) {
263
+ const keepAlive = setInterval(() => { }, DETACHED_AUTO_KEEPALIVE_INTERVAL_MS);
264
+ return run.finally(() => {
265
+ clearInterval(keepAlive);
266
+ });
267
+ }
268
+ export const _withDetachedAutoKeepaliveForTest = withDetachedAutoKeepalive;
228
269
  export function startAutoDetached(ctx, pi, base, verboseMode, options) {
229
- void startAuto(ctx, pi, base, verboseMode, options).catch((err) => {
270
+ void withDetachedAutoKeepalive(startAuto(ctx, pi, base, verboseMode, options)).catch((err) => {
230
271
  const message = getErrorMessage(err);
231
272
  ctx.ui.notify(`Auto-start failed: ${message}`, "error");
232
273
  logWarning("engine", `auto start error: ${message}`, { file: "auto.ts" });
@@ -264,9 +305,50 @@ export function shouldUseWorktreeIsolation(basePath) {
264
305
  */
265
306
  // Re-export budget utilities for external consumers
266
307
  export { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, } from "./auto-budget.js";
308
+ function closeOutSignalInterruptedUnit(currentBasePath) {
309
+ const currentUnit = s.currentUnit;
310
+ if (!currentUnit)
311
+ return;
312
+ const reason = "Auto-mode process received a termination signal";
313
+ const errorContext = {
314
+ message: reason,
315
+ category: "aborted",
316
+ isTransient: false,
317
+ };
318
+ const basePath = s.basePath || currentBasePath;
319
+ try {
320
+ emitOpenUnitEndForUnit(basePath, currentUnit.type, currentUnit.id, "cancelled", errorContext);
321
+ }
322
+ catch (err) {
323
+ logWarning("engine", `signal unit-end cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
324
+ }
325
+ try {
326
+ writeUnitRuntimeRecord(basePath, currentUnit.type, currentUnit.id, currentUnit.startedAt, {
327
+ phase: "crashed",
328
+ lastProgressAt: Date.now(),
329
+ lastProgressKind: "signal",
330
+ });
331
+ }
332
+ catch (err) {
333
+ logWarning("engine", `signal runtime cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
334
+ }
335
+ try {
336
+ if (s.workerId)
337
+ markLatestActiveForWorkerCanceled(s.workerId, "signal-exit");
338
+ }
339
+ catch (err) {
340
+ logWarning("engine", `signal dispatch cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
341
+ }
342
+ try {
343
+ resolveAgentEndCancelled(errorContext);
344
+ }
345
+ catch (err) {
346
+ logWarning("engine", `signal resolve cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
347
+ }
348
+ }
267
349
  /** Wrapper: register SIGTERM handler and store reference. */
268
350
  function registerSigtermHandler(currentBasePath) {
269
- s.sigtermHandler = _registerSigtermHandler(currentBasePath, s.sigtermHandler);
351
+ s.sigtermHandler = _registerSigtermHandler(currentBasePath, s.sigtermHandler, () => closeOutSignalInterruptedUnit(currentBasePath));
270
352
  }
271
353
  /** Wrapper: deregister SIGTERM handler and clear reference. */
272
354
  function deregisterSigtermHandler() {
@@ -352,6 +434,20 @@ export function _warnIfWorktreeMissingForTest(worktreePath, milestoneId) {
352
434
  export function isAutoPaused() {
353
435
  return s.paused;
354
436
  }
437
+ export async function refreshResumeResourcesAndDb(basePath, deps = {}) {
438
+ const env = deps.env ?? process.env;
439
+ const importModule = deps.importModule ?? ((specifier) => import(specifier));
440
+ const agentDir = env.GSD_CODING_AGENT_DIR || join(gsdHome(), "agent");
441
+ const pkgRoot = env.GSD_PKG_ROOT;
442
+ const resourceLoaderPath = pkgRoot
443
+ ? pathToFileURL(join(pkgRoot, "dist", "resource-loader.js")).href
444
+ : new URL("../../../resource-loader.js", import.meta.url).href;
445
+ const { initResources } = await importModule(resourceLoaderPath);
446
+ initResources(agentDir);
447
+ const { primeCache } = await importModule("./prompt-loader.js");
448
+ primeCache();
449
+ await (deps.openProjectDb ?? openProjectDbIfPresent)(basePath);
450
+ }
355
451
  export function setActiveEngineId(id) {
356
452
  s.activeEngineId = id;
357
453
  }
@@ -555,7 +651,21 @@ function handleLostSessionLock(ctx, lockStatus) {
555
651
  * the stale unit state, progress widget, status badge, and restores CWD so
556
652
  * the dashboard does not show an orphaned timer and the shell is usable.
557
653
  */
558
- function cleanupAfterLoopExit(ctx) {
654
+ export async function rerootCommandSession(cmdCtx, workspaceRoot) {
655
+ if (!cmdCtx || !workspaceRoot)
656
+ return { status: "skipped" };
657
+ try {
658
+ const result = await cmdCtx.newSession({ workspaceRoot });
659
+ return result.cancelled ? { status: "cancelled" } : { status: "ok" };
660
+ }
661
+ catch (err) {
662
+ return {
663
+ status: "failed",
664
+ error: err instanceof Error ? err.message : String(err),
665
+ };
666
+ }
667
+ }
668
+ export async function cleanupAfterLoopExit(ctx) {
559
669
  s.currentUnit = null;
560
670
  s.active = false;
561
671
  deactivateGSD();
@@ -594,6 +704,26 @@ function cleanupAfterLoopExit(ctx) {
594
704
  logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
595
705
  }
596
706
  }
707
+ if (s.originalBasePath && s.cmdCtx) {
708
+ const result = await rerootCommandSession(s.cmdCtx, s.basePath);
709
+ if (result.status === "cancelled") {
710
+ logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
711
+ }
712
+ else if (result.status === "failed") {
713
+ logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.basePath });
714
+ }
715
+ }
716
+ }
717
+ export function _cleanupAfterLoopExitForTest(ctx) {
718
+ return cleanupAfterLoopExit(ctx);
719
+ }
720
+ export function _resolveAutoWorktreeExitActionForTest(currentMilestoneId, milestoneMergedInPhases, milestoneComplete) {
721
+ const action = _selectStopAutoWorktreeExit({
722
+ currentMilestoneId: currentMilestoneId ?? null,
723
+ milestoneComplete,
724
+ milestoneMergedInPhases,
725
+ });
726
+ return action === "none" ? "skip" : action;
597
727
  }
598
728
  export async function stopAuto(ctx, pi, reason) {
599
729
  if (!s.active && !s.paused)
@@ -658,6 +788,8 @@ export async function stopAuto(ctx, pi, reason) {
658
788
  if (s.workerId) {
659
789
  markWorkerStopping(s.workerId);
660
790
  }
791
+ s.workerId = null;
792
+ s.milestoneLeaseToken = null;
661
793
  }
662
794
  catch (e) {
663
795
  debugLog("stop-cleanup-coordination", { error: e instanceof Error ? e.message : String(e) });
@@ -701,7 +833,7 @@ export async function stopAuto(ctx, pi, reason) {
701
833
  const notifyCtx = ctx
702
834
  ? { notify: ctx.ui.notify.bind(ctx.ui) }
703
835
  : { notify: () => { } };
704
- const resolver = buildResolver();
836
+ const lifecycle = buildLifecycle();
705
837
  // Check if the milestone is complete. DB status is the authoritative
706
838
  // signal — only a successful gsd_complete_milestone call flips it to
707
839
  // "complete" (tools/complete-milestone.ts). SUMMARY file presence is
@@ -732,19 +864,27 @@ export async function stopAuto(ctx, pi, reason) {
732
864
  // Non-fatal — fall through to preserveBranch path
733
865
  logWarning("engine", `milestone summary check failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
734
866
  }
735
- if (milestoneComplete) {
867
+ const exitAction = _selectStopAutoWorktreeExit({
868
+ currentMilestoneId: s.currentMilestoneId,
869
+ milestoneComplete,
870
+ milestoneMergedInPhases: s.milestoneMergedInPhases,
871
+ });
872
+ if (exitAction === "merge") {
736
873
  // Milestone is complete — merge worktree branch back to main
737
- resolver.mergeAndExit(s.currentMilestoneId, notifyCtx);
874
+ const r = lifecycle.exitMilestone(s.currentMilestoneId, { merge: true }, notifyCtx);
875
+ if (!r.ok && r.cause instanceof Error)
876
+ throw r.cause;
738
877
  }
739
- else {
878
+ else if (exitAction === "preserve") {
740
879
  // Milestone still in progress — preserve branch for later resumption
741
- resolver.exitMilestone(s.currentMilestoneId, notifyCtx, {
742
- preserveBranch: true,
743
- });
880
+ const r = lifecycle.exitMilestone(s.currentMilestoneId, { merge: false, preserveBranch: true }, notifyCtx);
881
+ if (!r.ok && r.cause instanceof Error)
882
+ throw r.cause;
744
883
  }
745
884
  }
746
885
  }
747
886
  catch (e) {
887
+ ctx?.ui.notify(`Worktree cleanup failed for ${s.currentMilestoneId ?? "current milestone"}: ${e instanceof Error ? e.message : String(e)}. Resolve the preserved branch/worktree and run /gsd auto to resume.`, "warning");
748
888
  debugLog("stop-cleanup-worktree", { error: e instanceof Error ? e.message : String(e) });
749
889
  }
750
890
  // ── Step 5: Rebuild state while DB is still open (#3599) ──
@@ -790,6 +930,19 @@ export async function stopAuto(ctx, pi, reason) {
790
930
  catch (e) {
791
931
  debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
792
932
  }
933
+ // Re-root the active command session/tool runtime after worktree teardown.
934
+ // mergeAndExit restores process.cwd(), but AgentSession has already captured
935
+ // its own cwd for tools and system prompt; refresh it before returning to the
936
+ // user so follow-up commands do not target a removed milestone worktree.
937
+ if (s.originalBasePath && ctx && s.cmdCtx) {
938
+ const result = await rerootCommandSession(s.cmdCtx, s.basePath);
939
+ if (result.status === "cancelled") {
940
+ logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
941
+ }
942
+ else if (result.status === "failed") {
943
+ logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.basePath });
944
+ }
945
+ }
793
946
  // ── Step 8: Ledger notification ──
794
947
  try {
795
948
  const ledger = getLedger();
@@ -915,6 +1068,11 @@ export async function stopAuto(ctx, pi, reason) {
915
1068
  s.reset();
916
1069
  }
917
1070
  }
1071
+ export function _selectStopAutoWorktreeExit(args) {
1072
+ if (!args.currentMilestoneId || args.milestoneMergedInPhases)
1073
+ return "none";
1074
+ return args.milestoneComplete ? "merge" : "preserve";
1075
+ }
918
1076
  /**
919
1077
  * Pause auto-mode without destroying state. Context is preserved.
920
1078
  * The user can interact with the agent, then `/gsd auto` resumes
@@ -1021,39 +1179,35 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
1021
1179
  ctx?.ui.notify(`${s.stepMode ? "Step" : "Auto"}-mode paused (Escape). Type to interact, or ${resumeCmd} to resume.`, "info");
1022
1180
  }
1023
1181
  /**
1024
- * Build a WorktreeResolverDeps from auto.ts private scope.
1025
- * Shared by buildResolver() and buildLoopDeps().
1182
+ * Build a WorktreeLifecycle Module wrapping the current session.
1183
+ *
1184
+ * Per ADR-016, the Lifecycle Module is the typed-Interface owner of milestone
1185
+ * entry/exit/merge verbs and calls Projection on lifecycle transitions. The
1186
+ * deps bag is intentionally focused — Lifecycle does not see the wider auto-
1187
+ * mode dependency graph.
1026
1188
  */
1027
- function buildResolverDeps() {
1028
- return {
1029
- isInAutoWorktree,
1030
- shouldUseWorktreeIsolation,
1031
- getIsolationMode,
1032
- mergeMilestoneToMain,
1033
- syncWorktreeStateBack,
1034
- teardownAutoWorktree,
1035
- createAutoWorktree,
1189
+ function buildLifecycle() {
1190
+ const lifecycleDeps = {
1036
1191
  enterAutoWorktree,
1192
+ createAutoWorktree,
1037
1193
  enterBranchModeForMilestone,
1038
1194
  getAutoWorktreePath,
1195
+ getIsolationMode,
1196
+ invalidateAllCaches,
1197
+ GitServiceImpl,
1198
+ loadEffectiveGSDPreferences,
1199
+ worktreeProjection: new WorktreeStateProjection(),
1200
+ isInAutoWorktree,
1039
1201
  autoCommitCurrentBranch,
1040
- getCurrentBranch,
1041
1202
  autoWorktreeBranch,
1203
+ teardownAutoWorktree,
1204
+ mergeMilestoneToMain,
1205
+ getCurrentBranch,
1206
+ checkoutBranch: nativeCheckoutBranch,
1042
1207
  resolveMilestoneFile,
1043
1208
  readFileSync: (path, encoding) => readFileSync(path, encoding),
1044
- GitServiceImpl: GitServiceImpl,
1045
- loadEffectiveGSDPreferences: loadEffectiveGSDPreferences,
1046
- invalidateAllCaches,
1047
- captureIntegrationBranch,
1048
1209
  };
1049
- }
1050
- /**
1051
- * Build a WorktreeResolver wrapping the current session.
1052
- * Cheap to construct — it's just a thin wrapper over `s` + deps.
1053
- * Used by stopAuto(), resume path, and buildLoopDeps().
1054
- */
1055
- function buildResolver() {
1056
- return new WorktreeResolver(s, buildResolverDeps());
1210
+ return new WorktreeLifecycle(s, lifecycleDeps);
1057
1211
  }
1058
1212
  /**
1059
1213
  * Thin entry glue for the new Auto Orchestration module.
@@ -1066,9 +1220,26 @@ export function createWiredAutoOrchestrationModule(ctx, _pi, dispatchBasePath, r
1066
1220
  const flowId = `auto-orchestrator-${Date.now()}`;
1067
1221
  let seq = 0;
1068
1222
  const deps = {
1223
+ stateReconciliation: {
1224
+ async reconcileBeforeDispatch() {
1225
+ const result = await reconcileBeforeDispatch(dispatchBasePath);
1226
+ if (!result.ok) {
1227
+ return {
1228
+ ok: false,
1229
+ reason: result.reason,
1230
+ stateSnapshot: result.stateSnapshot,
1231
+ };
1232
+ }
1233
+ return {
1234
+ ok: true,
1235
+ reason: result.repaired.join(", "),
1236
+ stateSnapshot: result.stateSnapshot,
1237
+ };
1238
+ },
1239
+ },
1069
1240
  dispatch: {
1070
- async decideNextUnit() {
1071
- const state = await deriveState(dispatchBasePath);
1241
+ async decideNextUnit(input) {
1242
+ const state = input.stateSnapshot;
1072
1243
  const active = state.activeMilestone;
1073
1244
  if (!active)
1074
1245
  return null;
@@ -1092,12 +1263,48 @@ export function createWiredAutoOrchestrationModule(ctx, _pi, dispatchBasePath, r
1092
1263
  },
1093
1264
  recovery: {
1094
1265
  async classifyAndRecover(input) {
1095
- const reason = input.error instanceof Error ? input.error.message : String(input.error ?? "unknown auto error");
1096
- return { action: "escalate", reason };
1266
+ const recovery = classifyFailure(input);
1267
+ return { action: recovery.action, reason: recovery.reason };
1268
+ },
1269
+ },
1270
+ toolContract: {
1271
+ async compileUnitToolContract(unitType) {
1272
+ const result = compileUnitToolContract(unitType);
1273
+ if (!result.ok)
1274
+ return { ok: false, reason: result.detail };
1275
+ return { ok: true, reason: result.contract.validationRules.join(", ") };
1097
1276
  },
1098
1277
  },
1099
1278
  worktree: {
1100
- async prepareForUnit() { },
1279
+ async prepareForUnit(unitType, unitId) {
1280
+ const manifest = resolveManifest(unitType);
1281
+ if (!manifest) {
1282
+ return {
1283
+ ok: false,
1284
+ reason: `No Unit manifest is registered for ${unitType}`,
1285
+ };
1286
+ }
1287
+ const writeScope = manifest.tools.mode === "all" || manifest.tools.mode === "docs"
1288
+ ? "source-writing"
1289
+ : "planning-only";
1290
+ const safety = createWorktreeSafetyModule();
1291
+ const snapshot = await deriveState(dispatchBasePath);
1292
+ const milestoneId = snapshot.activeMilestone?.id ?? null;
1293
+ const expectedBranch = milestoneId ? autoWorktreeBranch(milestoneId) : null;
1294
+ const result = safety.validateUnitRoot({
1295
+ unitType,
1296
+ unitId,
1297
+ writeScope,
1298
+ projectRoot: runtimeBasePath,
1299
+ unitRoot: dispatchBasePath,
1300
+ milestoneId,
1301
+ expectedBranch,
1302
+ });
1303
+ if (!result.ok) {
1304
+ return { ok: false, reason: `${result.kind}: ${result.reason}` };
1305
+ }
1306
+ return { ok: true, reason: result.kind };
1307
+ },
1101
1308
  async syncAfterUnit() { },
1102
1309
  async cleanupOnStop() { },
1103
1310
  },
@@ -1191,6 +1398,7 @@ function buildLoopDeps(pi) {
1191
1398
  // (resolveDispatch, runPreDispatchHooks, etc.) delegate to the registry.
1192
1399
  initRegistry(convertDispatchRules(DISPATCH_RULES));
1193
1400
  const cmux = makeCmuxEmitters(pi);
1401
+ const worktreeProjection = new WorktreeStateProjection();
1194
1402
  return {
1195
1403
  lockBase,
1196
1404
  buildSnapshotOpts,
@@ -1210,8 +1418,8 @@ function buildLoopDeps(pi) {
1210
1418
  loadEffectiveGSDPreferences,
1211
1419
  // Pre-dispatch health gate
1212
1420
  preDispatchHealthGate,
1213
- // Worktree sync
1214
- syncProjectRootToWorktree,
1421
+ // Worktree state projection (ADR-016 — single Module Interface)
1422
+ worktreeProjection,
1215
1423
  // Resource version guard
1216
1424
  checkResourcesStale,
1217
1425
  // Session lock
@@ -1272,8 +1480,9 @@ function buildLoopDeps(pi) {
1272
1480
  atomicWriteSync,
1273
1481
  // Git
1274
1482
  GitServiceImpl: GitServiceImpl,
1275
- // WorktreeResolver
1276
- resolver: buildResolver(),
1483
+ // Worktree Lifecycle Module (ADR-016 — single Module Interface for the
1484
+ // milestone create/enter/exit/merge verbs)
1485
+ lifecycle: buildLifecycle(),
1277
1486
  // Post-unit processing
1278
1487
  postUnitPreVerification,
1279
1488
  runPostUnitVerification,
@@ -1504,9 +1713,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1504
1713
  if (resumeWorktreePath && !existsSync(resumeWorktreePath)) {
1505
1714
  logWarning("session", `Worktree was expected at ${resumeWorktreePath} but is missing. Continuing in project-root mode. To restart with a fresh worktree, run /gsd-debug or recreate the milestone.`, { file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" });
1506
1715
  }
1507
- if (resumeWorktreePath && existsSync(resumeWorktreePath)) {
1508
- s.basePath = resumeWorktreePath;
1509
- }
1716
+ s.basePath = _resolvePausedResumeBasePathForTest(base, resumeWorktreePath);
1510
1717
  // Rebuild scope now that s.basePath reflects the actual worktree (or project root).
1511
1718
  rebuildScope(s.basePath, s.currentMilestoneId);
1512
1719
  // Ensure the workflow-logger audit log is pinned to the project root
@@ -1532,9 +1739,14 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1532
1739
  !isInAutoWorktree(s.basePath) &&
1533
1740
  !detectWorktreeName(s.basePath) &&
1534
1741
  !detectWorktreeName(s.originalBasePath)) {
1535
- buildResolver().enterMilestone(s.currentMilestoneId, {
1742
+ const enterResult = buildLifecycle().enterMilestone(s.currentMilestoneId, {
1536
1743
  notify: ctx.ui.notify.bind(ctx.ui),
1537
1744
  });
1745
+ if (!enterResult.ok && enterResult.reason === "lease-conflict") {
1746
+ ctx.ui.notify(`Cannot resume milestone ${s.currentMilestoneId}: lease is held by another worker.`, "error");
1747
+ await stopAuto(ctx, pi, "lease-conflict during resume");
1748
+ return;
1749
+ }
1538
1750
  // s.basePath may have been updated to a worktree path by enterMilestone.
1539
1751
  rebuildScope(s.basePath, s.currentMilestoneId);
1540
1752
  }
@@ -1551,16 +1763,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1551
1763
  // tree; deployed extensions live at ~/.gsd/agent/extensions/gsd/ where the
1552
1764
  // relative path resolves to ~/.gsd/agent/resource-loader.js which doesn't exist.
1553
1765
  // Using GSD_PKG_ROOT constructs a correct absolute path in both contexts (#3949).
1554
- const agentDir = process.env.GSD_CODING_AGENT_DIR || join(gsdHome(), "agent");
1555
- const pkgRoot = process.env.GSD_PKG_ROOT;
1556
- const resourceLoaderPath = pkgRoot
1557
- ? pathToFileURL(join(pkgRoot, "dist", "resource-loader.js")).href
1558
- : new URL("../../../resource-loader.js", import.meta.url).href;
1559
- const { initResources } = await import(resourceLoaderPath);
1560
- initResources(agentDir);
1561
- // Open the project DB before rebuild/derive so resume uses DB-backed
1562
- // state instead of falling back to stale markdown parsing (#2940).
1563
- await openProjectDbIfPresent(s.basePath);
1766
+ await refreshResumeResourcesAndDb(s.basePath);
1564
1767
  try {
1565
1768
  await rebuildState(s.basePath);
1566
1769
  pi.events.emit(CMUX_CHANNELS.SIDEBAR, { action: "sync", preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, state: await deriveState(s.basePath) });
@@ -1613,7 +1816,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1613
1816
  runKernelLoop: runUokKernelLoop,
1614
1817
  runLegacyLoop: runLegacyAutoLoop,
1615
1818
  });
1616
- cleanupAfterLoopExit(ctx);
1819
+ await cleanupAfterLoopExit(ctx);
1617
1820
  return;
1618
1821
  }
1619
1822
  // ── Fresh start path — delegated to auto-start.ts ──
@@ -1621,8 +1824,12 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1621
1824
  shouldUseWorktreeIsolation,
1622
1825
  registerSigtermHandler,
1623
1826
  lockBase,
1624
- buildResolver,
1827
+ buildLifecycle,
1625
1828
  };
1829
+ // Register the worker before bootstrap enters a milestone worktree.
1830
+ // This ensures enterMilestone can claim a lease and seed dispatch claims
1831
+ // for crash-recovery fidelity (#5405).
1832
+ registerAutoWorkerForSession(s, base);
1626
1833
  const ready = await bootstrapAutoSession(s, ctx, pi, base, verboseMode, requestedStepMode, bootstrapDeps, freshStartAssessment);
1627
1834
  if (!ready)
1628
1835
  return;
@@ -1656,7 +1863,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1656
1863
  runKernelLoop: runUokKernelLoop,
1657
1864
  runLegacyLoop: runLegacyAutoLoop,
1658
1865
  });
1659
- cleanupAfterLoopExit(ctx);
1866
+ await cleanupAfterLoopExit(ctx);
1660
1867
  }
1661
1868
  // describeNextUnit is imported from auto-dashboard.ts and re-exported
1662
1869
  export { describeNextUnit } from "./auto-dashboard.js";
@@ -1740,28 +1947,7 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
1740
1947
  id: triggerUnitId,
1741
1948
  startedAt: hookStartedAt,
1742
1949
  };
1743
- // Ensure cwd matches basePath BEFORE newSession() captures it (#1389).
1744
- // newSession() snapshots process.cwd() during construction; chdir-ing
1745
- // afterward leaves the session rooted to whatever cwd was when the call
1746
- // was made. Must be synchronous — no awaits between chdir and newSession.
1747
- try {
1748
- if (process.cwd() !== s.basePath)
1749
- process.chdir(s.basePath);
1750
- }
1751
- catch (err) {
1752
- const msg = `Failed to chdir before hook newSession (basePath: ${s.basePath}): ${err instanceof Error ? err.message : String(err)}`;
1753
- logWarning("engine", msg, { file: "auto.ts", basePath: s.basePath, error: err instanceof Error ? err.message : String(err) });
1754
- ctx.ui.notify(`${msg}. Cancelling hook dispatch to avoid running in the wrong directory.`, "error");
1755
- if (wasActive) {
1756
- s.basePath = previousBasePath;
1757
- s.currentUnit = previousCurrentUnit;
1758
- }
1759
- else {
1760
- s.reset();
1761
- }
1762
- return false;
1763
- }
1764
- const result = await s.cmdCtx.newSession();
1950
+ const result = await s.cmdCtx.newSession({ workspaceRoot: s.basePath });
1765
1951
  if (result.cancelled) {
1766
1952
  await stopAuto(ctx, pi);
1767
1953
  return false;