gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.1b44e695b

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 (619) hide show
  1. package/README.md +93 -18
  2. package/dist/cli.js +20 -9
  3. package/dist/headless-ui.js +13 -6
  4. package/dist/headless.js +9 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/GSD-WORKFLOW.md +10 -1
  7. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  8. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  9. package/dist/resources/extensions/cmux/index.js +5 -0
  10. package/dist/resources/extensions/gsd/auto/detect-stuck.js +1 -1
  11. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  12. package/dist/resources/extensions/gsd/auto/loop.js +122 -40
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +15 -4
  14. package/dist/resources/extensions/gsd/auto/phases.js +134 -49
  15. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  16. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  17. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  19. package/dist/resources/extensions/gsd/auto-budget.js +9 -0
  20. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  21. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +144 -30
  23. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  24. package/dist/resources/extensions/gsd/auto-post-unit.js +329 -137
  25. package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
  26. package/dist/resources/extensions/gsd/auto-recovery.js +82 -16
  27. package/dist/resources/extensions/gsd/auto-start.js +99 -16
  28. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +146 -34
  30. package/dist/resources/extensions/gsd/auto-worktree.js +185 -26
  31. package/dist/resources/extensions/gsd/auto.js +135 -74
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +13 -10
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +14 -4
  35. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  36. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  37. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  38. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  40. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  41. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  42. package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
  43. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  44. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
  45. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  46. package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
  47. package/dist/resources/extensions/gsd/db/auto-workers.js +30 -0
  48. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  49. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  50. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  51. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  52. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  53. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  54. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  55. package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
  56. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  57. package/dist/resources/extensions/gsd/doctor.js +2 -28
  58. package/dist/resources/extensions/gsd/export-html.js +27 -425
  59. package/dist/resources/extensions/gsd/forensics.js +10 -3
  60. package/dist/resources/extensions/gsd/git-service.js +152 -15
  61. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  62. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  63. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  64. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  65. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  66. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
  67. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  68. package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
  69. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  70. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  71. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  72. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  73. package/dist/resources/extensions/gsd/paths.js +4 -0
  74. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  75. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  76. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  77. package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
  78. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  79. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  80. package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
  81. package/dist/resources/extensions/gsd/preferences.js +6 -0
  82. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  83. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  84. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  85. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  86. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  87. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  88. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  89. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  90. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  91. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  92. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  93. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  94. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  95. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  96. package/dist/resources/extensions/gsd/repo-identity.js +39 -22
  97. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  98. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  99. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  100. package/dist/resources/extensions/gsd/session-lock.js +15 -2
  101. package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
  102. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
  103. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  104. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  105. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  106. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  107. package/dist/resources/extensions/gsd/state.js +28 -7
  108. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  109. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  110. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  111. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  112. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
  113. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
  114. package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
  115. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  116. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  117. package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
  118. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
  119. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  120. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  121. package/dist/resources/extensions/gsd/validation.js +23 -1
  122. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  123. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  124. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  125. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  126. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  127. package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
  128. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  129. package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
  130. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  131. package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
  132. package/dist/resources/extensions/shared/html-shell.js +388 -0
  133. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  134. package/dist/resources/extensions/shared/next-action-ui.js +13 -5
  135. package/dist/resources/extensions/subagent/index.js +448 -78
  136. package/dist/resources/extensions/subagent/launch.js +77 -0
  137. package/dist/resources/extensions/subagent/run-store.js +148 -0
  138. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  139. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  140. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  141. package/dist/resources/extensions/visual-brief/index.js +5 -0
  142. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  143. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  144. package/dist/resources/skills/forensics/SKILL.md +1 -1
  145. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  146. package/dist/web/standalone/.next/BUILD_ID +1 -1
  147. package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
  148. package/dist/web/standalone/.next/build-manifest.json +3 -3
  149. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  150. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  151. package/dist/web/standalone/.next/required-server-files.json +1 -1
  152. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  154. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  156. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  158. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  162. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  165. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  166. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  167. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  169. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  172. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/index.html +1 -1
  175. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  176. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  178. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  180. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  181. package/dist/web/standalone/.next/server/app/page.js +2 -2
  182. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
  185. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  186. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  190. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  191. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  192. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  193. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  194. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  195. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  196. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  197. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  198. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  199. package/dist/web/standalone/server.js +1 -1
  200. package/package.json +4 -4
  201. package/packages/contracts/dist/rpc.test.js +7 -0
  202. package/packages/contracts/dist/rpc.test.js.map +1 -1
  203. package/packages/contracts/dist/workflow.d.ts +21 -0
  204. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  205. package/packages/contracts/dist/workflow.js +24 -0
  206. package/packages/contracts/dist/workflow.js.map +1 -1
  207. package/packages/contracts/src/rpc.test.ts +8 -0
  208. package/packages/contracts/src/workflow.ts +24 -0
  209. package/packages/daemon/package.json +2 -2
  210. package/packages/mcp-server/README.md +13 -4
  211. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  212. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  213. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  214. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  215. package/packages/mcp-server/package.json +2 -2
  216. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  217. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  218. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  219. package/packages/native/package.json +1 -1
  220. package/packages/native/tsconfig.json +2 -1
  221. package/packages/native/tsconfig.tsbuildinfo +1 -1
  222. package/packages/pi-agent-core/package.json +1 -1
  223. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  224. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  225. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  226. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  227. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  228. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  229. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  230. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  231. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  232. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  233. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  234. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  235. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  236. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  237. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  238. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  239. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  240. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  241. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  242. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  243. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  244. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  245. package/packages/pi-ai/package.json +1 -1
  246. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  247. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  248. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  249. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  250. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  251. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  252. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  253. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  254. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  255. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  256. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  257. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  258. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  260. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  262. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  264. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  266. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  268. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  273. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
  278. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  280. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  286. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  288. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  289. package/packages/pi-coding-agent/package.json +1 -1
  290. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  291. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  292. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  293. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  294. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  295. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  296. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  297. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  298. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  299. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
  300. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  301. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  302. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  303. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  304. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  305. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  306. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  307. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  308. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  309. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  310. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  311. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  312. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  313. package/packages/pi-tui/dist/terminal.js +12 -0
  314. package/packages/pi-tui/dist/terminal.js.map +1 -1
  315. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  316. package/packages/pi-tui/dist/tui.js +106 -27
  317. package/packages/pi-tui/dist/tui.js.map +1 -1
  318. package/packages/pi-tui/package.json +1 -1
  319. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  320. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  321. package/packages/pi-tui/src/terminal.ts +11 -0
  322. package/packages/pi-tui/src/tui.ts +108 -27
  323. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  324. package/packages/rpc-client/package.json +1 -1
  325. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  326. package/pkg/package.json +1 -1
  327. package/src/resources/GSD-WORKFLOW.md +10 -1
  328. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  329. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  330. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  331. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  332. package/src/resources/extensions/cmux/index.ts +6 -0
  333. package/src/resources/extensions/gsd/auto/contracts.ts +19 -6
  334. package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
  335. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  336. package/src/resources/extensions/gsd/auto/loop.ts +123 -40
  337. package/src/resources/extensions/gsd/auto/orchestrator.ts +15 -4
  338. package/src/resources/extensions/gsd/auto/phases.ts +160 -60
  339. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  340. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  341. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  342. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  343. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  344. package/src/resources/extensions/gsd/auto-budget.ts +11 -0
  345. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  346. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  347. package/src/resources/extensions/gsd/auto-dispatch.ts +164 -29
  348. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  349. package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
  350. package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
  351. package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
  352. package/src/resources/extensions/gsd/auto-start.ts +109 -14
  353. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  354. package/src/resources/extensions/gsd/auto-verification.ts +174 -42
  355. package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
  356. package/src/resources/extensions/gsd/auto.ts +172 -81
  357. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
  358. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
  359. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -4
  360. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  361. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  362. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  363. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  364. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  365. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  366. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  367. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  368. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  369. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
  370. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  371. package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
  372. package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
  373. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  374. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  375. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  376. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  377. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  378. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  379. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  380. package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
  381. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  382. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  383. package/src/resources/extensions/gsd/doctor.ts +2 -27
  384. package/src/resources/extensions/gsd/export-html.ts +27 -427
  385. package/src/resources/extensions/gsd/forensics.ts +9 -3
  386. package/src/resources/extensions/gsd/git-service.ts +182 -16
  387. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  388. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  389. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  390. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  391. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  392. package/src/resources/extensions/gsd/journal.ts +8 -1
  393. package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
  394. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  395. package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
  396. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  397. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  398. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  399. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  400. package/src/resources/extensions/gsd/paths.ts +5 -0
  401. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  402. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  403. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  404. package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
  405. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  406. package/src/resources/extensions/gsd/preferences-types.ts +35 -0
  407. package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
  408. package/src/resources/extensions/gsd/preferences.ts +9 -0
  409. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  410. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  411. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  412. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  413. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  414. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  415. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  416. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  417. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  418. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  419. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  420. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  421. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  422. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  423. package/src/resources/extensions/gsd/repo-identity.ts +45 -25
  424. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  425. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  426. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  427. package/src/resources/extensions/gsd/session-lock.ts +15 -2
  428. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
  429. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
  430. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  431. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  432. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  433. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  434. package/src/resources/extensions/gsd/state.ts +33 -7
  435. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  436. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  437. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  438. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  439. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  440. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  441. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  442. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  443. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +775 -34
  444. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +245 -28
  445. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  446. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  447. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  448. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
  449. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
  450. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  451. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  452. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  453. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
  454. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  455. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  456. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  457. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  458. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  459. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  460. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  461. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  462. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
  463. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
  464. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  465. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  466. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  467. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  468. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  469. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  470. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
  471. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  472. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
  473. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  474. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  475. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  476. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
  477. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
  478. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  479. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  480. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  481. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  482. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  483. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  484. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  485. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  486. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  487. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  488. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  489. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  490. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  491. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  492. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
  493. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
  494. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
  495. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  496. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
  497. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  498. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  499. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  500. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  501. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  502. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
  503. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
  504. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  505. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  506. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  507. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  508. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  509. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  510. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  511. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  512. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  513. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  514. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  515. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  516. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  517. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
  518. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  519. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
  520. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  521. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  522. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  523. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
  524. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
  525. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  526. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  527. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  528. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  529. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  530. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
  531. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  532. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  533. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
  534. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
  535. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
  536. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
  537. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  538. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
  539. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  540. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  541. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  542. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  543. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  544. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  545. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  546. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  547. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  548. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  549. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
  550. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  551. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
  552. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  553. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  554. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  555. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  556. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +153 -1
  557. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  558. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  559. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
  560. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  561. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
  562. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  563. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
  564. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  565. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  566. package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
  567. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
  568. package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
  569. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  570. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  571. package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
  572. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
  573. package/src/resources/extensions/gsd/types.ts +1 -1
  574. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  575. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  576. package/src/resources/extensions/gsd/validation.ts +23 -1
  577. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  578. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  579. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  580. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  581. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  582. package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
  583. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  584. package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
  585. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  586. package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
  587. package/src/resources/extensions/shared/html-shell.ts +412 -0
  588. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  589. package/src/resources/extensions/shared/next-action-ui.ts +11 -5
  590. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  591. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
  592. package/src/resources/extensions/subagent/index.ts +567 -103
  593. package/src/resources/extensions/subagent/launch.ts +131 -0
  594. package/src/resources/extensions/subagent/run-store.ts +218 -0
  595. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  596. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  597. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  598. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  599. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  600. package/src/resources/extensions/visual-brief/index.ts +8 -0
  601. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  602. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  603. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  604. package/src/resources/skills/forensics/SKILL.md +1 -1
  605. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  606. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  607. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  608. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  609. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  610. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  611. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  612. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  613. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  614. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  615. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  616. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  617. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  618. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → Z8H5evS-hDo0qdP22XJPA}/_buildManifest.js +0 -0
  619. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → Z8H5evS-hDo0qdP22XJPA}/_ssgManifest.js +0 -0
@@ -58,6 +58,7 @@ import {
58
58
  import {
59
59
  writeLock,
60
60
  clearLock,
61
+ clearStaleWorkerLock,
61
62
  readCrashLock,
62
63
  isLockProcessAlive,
63
64
  formatCrashInfo,
@@ -178,6 +179,7 @@ import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
178
179
  import {
179
180
  buildLoopRemediationSteps,
180
181
  reconcileMergeState,
182
+ verifyExpectedArtifact,
181
183
  } from "./auto-recovery.js";
182
184
  import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
183
185
  import { resolveDispatch, DISPATCH_RULES } from "./auto-dispatch.js";
@@ -240,7 +242,7 @@ import { runAutoLoopWithUok } from "./uok/kernel.js";
240
242
  import { resolveUokFlags } from "./uok/flags.js";
241
243
  import { validateDirectory } from "./validate-directory.js";
242
244
  import { createAutoOrchestrator } from "./auto/orchestrator.js";
243
- import type { AutoOrchestrationModule, AutoOrchestratorDeps, DispatchAdapter } from "./auto/contracts.js";
245
+ import type { AutoAdvanceResult, AutoOrchestrationModule, AutoOrchestratorDeps, DispatchAdapter } from "./auto/contracts.js";
244
246
  import { reconcileBeforeDispatch } from "./state-reconciliation.js";
245
247
  import { compileUnitToolContract } from "./tool-contract.js";
246
248
  import { createWorktreeSafetyModule } from "./worktree-safety.js";
@@ -283,6 +285,7 @@ import type {
283
285
  UnitRouting,
284
286
  StartModel,
285
287
  AutoSession,
288
+ PendingOrchestrationDispatch,
286
289
  } from "./auto/session.js";
287
290
  export {
288
291
  STUB_RECOVERY_THRESHOLD,
@@ -296,7 +299,10 @@ export type {
296
299
  import { autoSession as s } from "./auto-runtime-state.js";
297
300
  import { gsdHome } from "./gsd-home.js";
298
301
  import { createWorkspace, scopeMilestone } from "./workspace.js";
299
- import { registerAutoWorker, markWorkerStopping } from "./db/auto-workers.js";
302
+ import {
303
+ registerAutoWorker,
304
+ markWorkerStopping,
305
+ } from "./db/auto-workers.js";
300
306
  import { releaseMilestoneLease } from "./db/milestone-leases.js";
301
307
  import { normalizeRealPath } from "./paths.js";
302
308
 
@@ -316,6 +322,13 @@ import { normalizeRealPath } from "./paths.js";
316
322
  /** Throttle STATE.md rebuilds — at most once per 30 seconds */
317
323
  const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
318
324
 
325
+ export function formatAutoStopNotification(prefix: string, totals: { cost: number; tokens: { total: number } }, unitCount: number): string {
326
+ return [
327
+ `${prefix}.`,
328
+ `Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${unitCount} units`,
329
+ ].join("\n");
330
+ }
331
+
319
332
  /**
320
333
  * Phase B — register this auto-mode process in the workers table so other
321
334
  * workers and janitors can detect liveness via heartbeat. Best-effort: if
@@ -461,6 +474,60 @@ export function _synthesizePausedSessionRecoveryForTest(
461
474
  return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
462
475
  }
463
476
 
477
+ type PausedResumeRecoverySessionState = {
478
+ pausedSessionFile: string | null;
479
+ currentUnit: { type: string; id: string } | null;
480
+ pausedUnitType: string | null;
481
+ pausedUnitId: string | null;
482
+ pendingCrashRecovery: string | null;
483
+ };
484
+
485
+ function handlePausedSessionResumeRecovery(
486
+ basePath: string,
487
+ state: PausedResumeRecoverySessionState,
488
+ notify: (message: string) => void,
489
+ ): { skippedReplay: boolean } {
490
+ if (!state.pausedSessionFile) return { skippedReplay: false };
491
+
492
+ const pausedRecoveryUnitType = state.currentUnit?.type ?? state.pausedUnitType ?? "unknown";
493
+ const pausedRecoveryUnitId = state.currentUnit?.id ?? state.pausedUnitId ?? "unknown";
494
+ const completedPausedUnit = verifyExpectedArtifact(
495
+ pausedRecoveryUnitType,
496
+ pausedRecoveryUnitId,
497
+ basePath,
498
+ );
499
+
500
+ if (completedPausedUnit) {
501
+ state.pausedSessionFile = null;
502
+ state.pausedUnitType = null;
503
+ state.pausedUnitId = null;
504
+ state.pendingCrashRecovery = null;
505
+ return { skippedReplay: true };
506
+ }
507
+
508
+ const recovery = synthesizePausedSessionRecovery(
509
+ basePath,
510
+ pausedRecoveryUnitType,
511
+ pausedRecoveryUnitId,
512
+ state.pausedSessionFile,
513
+ );
514
+ if (recovery && recovery.trace.toolCallCount > 0) {
515
+ state.pendingCrashRecovery = recovery.prompt;
516
+ notify(`Recovered ${recovery.trace.toolCallCount} tool calls from paused session. Resuming with context.`);
517
+ }
518
+ state.pausedSessionFile = null;
519
+ state.pausedUnitType = null;
520
+ state.pausedUnitId = null;
521
+ return { skippedReplay: false };
522
+ }
523
+
524
+ export function _handlePausedSessionResumeRecoveryForTest(
525
+ basePath: string,
526
+ state: PausedResumeRecoverySessionState,
527
+ ): { skippedReplay: boolean } {
528
+ return handlePausedSessionResumeRecovery(basePath, state, () => {});
529
+ }
530
+
464
531
  // `_resolvePausedResumeBasePathForTest` was retired in ADR-016 phase 2 / B3
465
532
  // (#5621). Production callers go through
466
533
  // `WorktreeLifecycle.resumeFromPausedSession`; the pure helper for tests is
@@ -860,6 +927,7 @@ export function checkRemoteAutoSession(projectRoot: string): {
860
927
 
861
928
  if (!isLockProcessAlive(lock)) {
862
929
  // Stale lock from a dead process — not a live remote session
930
+ clearLock(projectRoot);
863
931
  return { running: false };
864
932
  }
865
933
 
@@ -1021,6 +1089,8 @@ export async function rerootCommandSession(
1021
1089
  }
1022
1090
 
1023
1091
  export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void> {
1092
+ const preserveStepSurface = s.preserveStepSurfaceAfterLoopExit;
1093
+ const preservePausedSurface = s.paused;
1024
1094
  s.currentUnit = null;
1025
1095
  s.active = false;
1026
1096
  deactivateGSD();
@@ -1043,21 +1113,24 @@ export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void>
1043
1113
  // A transient provider-error pause intentionally leaves the paused badge
1044
1114
  // visible so the user still has a resumable auto-mode signal on screen.
1045
1115
  if (!s.paused) {
1046
- ctx.ui.setStatus("gsd-auto", undefined);
1047
- if (s.completionStopInProgress) {
1048
- s.completionStopInProgress = false;
1116
+ if (preserveStepSurface) {
1117
+ s.preserveStepSurfaceAfterLoopExit = false;
1118
+ } else {
1119
+ ctx.ui.setStatus("gsd-auto", undefined);
1120
+ ctx.ui.setWidget("gsd-progress", undefined);
1121
+ if (s.completionStopInProgress) {
1122
+ s.completionStopInProgress = false;
1123
+ }
1124
+ initHealthWidget(ctx);
1049
1125
  }
1050
- initHealthWidget(ctx);
1051
1126
  }
1052
1127
 
1053
- // ADR-016 phase 3 (#5693): the stop-path basePath restore routes through
1054
- // `Lifecycle.restoreToProjectRoot()`, the sole owner of `s.basePath`
1055
- // mutation. The verb assigns `s.basePath` before any throwable work
1056
- // (rebuildGitService, cache invalidation), so a thrown error still leaves
1057
- // basePath restored no fallback assignment needed at the call site.
1058
- // The chdir stays here because `restoreToProjectRoot` is a pure
1059
- // session-state mutation.
1060
- if (s.originalBasePath) {
1128
+ // ADR-016 phase 3 (#5693): the stop-path basePath restore + chdir routes
1129
+ // through `Lifecycle.restoreToProjectRoot()`, the sole owner of both
1130
+ // `s.basePath` mutation and the paired `process.chdir` for auto-loop
1131
+ // transitions. The verb assigns `s.basePath` before any throwable work, so
1132
+ // a thrown error still leaves basePath restored.
1133
+ if (s.originalBasePath && !preserveStepSurface && !preservePausedSurface) {
1061
1134
  try {
1062
1135
  buildLifecycle().restoreToProjectRoot();
1063
1136
  } catch (err) {
@@ -1067,14 +1140,9 @@ export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void>
1067
1140
  { file: "auto.ts" },
1068
1141
  );
1069
1142
  }
1070
- try {
1071
- process.chdir(s.originalBasePath);
1072
- } catch (err) {
1073
- logWarning("engine", `basePath restore/chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1074
- }
1075
1143
  }
1076
1144
 
1077
- if (s.originalBasePath && s.cmdCtx) {
1145
+ if (s.originalBasePath && s.cmdCtx && !preserveStepSurface && !preservePausedSurface) {
1078
1146
  const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
1079
1147
  if (result.status === "cancelled") {
1080
1148
  logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
@@ -1171,32 +1239,16 @@ export async function stopAuto(
1171
1239
  // worktree was active, and whether the current milestone was merged before
1172
1240
  // stopAuto. The unmerged-work warning is only meaningful for real worktrees.
1173
1241
  try {
1174
- const { emitAutoExit } = await import("./worktree-telemetry.js");
1175
- type AutoExitReason =
1176
- | "pause" | "stop" | "blocked" | "merge-conflict" | "merge-failed"
1177
- | "slice-merge-conflict" | "all-complete" | "no-active-milestone" | "other";
1242
+ const { emitAutoExit, normalizeAutoExitReason } = await import("./worktree-telemetry.js");
1178
1243
  // Normalize the free-form reason to a closed set so the telemetry
1179
1244
  // aggregator buckets stably. Raw detail is preserved in the phases.ts
1180
1245
  // notification and the notify'd error string.
1181
1246
  const rawReason = reason ?? "stop";
1182
- const normalizedReason: AutoExitReason = rawReason.startsWith("Blocked:")
1183
- ? "blocked"
1184
- : rawReason.startsWith("Merge conflict")
1185
- ? "merge-conflict"
1186
- : rawReason.startsWith("Merge error") || rawReason.startsWith("Merge failed")
1187
- ? "merge-failed"
1188
- : rawReason.startsWith("slice-merge-conflict")
1189
- ? "slice-merge-conflict"
1190
- : rawReason === "All milestones complete"
1191
- ? "all-complete"
1192
- : rawReason === "No active milestone"
1193
- ? "no-active-milestone"
1194
- : rawReason === "stop" || rawReason === "pause"
1195
- ? rawReason
1196
- : "other";
1247
+ const normalizedReason = normalizeAutoExitReason(rawReason);
1197
1248
  const telemetryBase = s.originalBasePath || s.basePath;
1198
1249
  emitAutoExit(telemetryBase, {
1199
1250
  reason: normalizedReason,
1251
+ rawReason,
1200
1252
  milestoneId: s.currentMilestoneId ?? undefined,
1201
1253
  milestoneMerged: s.milestoneMergedInPhases === true,
1202
1254
  isolationMode: getIsolationMode(telemetryBase),
@@ -1386,20 +1438,14 @@ export async function stopAuto(
1386
1438
  }
1387
1439
 
1388
1440
  // ── Step 7: Restore basePath and chdir (ADR-016 phase 3, #5693) ──
1389
- // `restoreToProjectRoot` assigns s.basePath before any throwable work;
1390
- // no fallback assignment is needed at the call site.
1441
+ // `restoreToProjectRoot` owns both s.basePath restore and process.chdir;
1442
+ // no paired chdir is needed at the call site.
1391
1443
  if (s.originalBasePath) {
1392
1444
  try {
1393
1445
  buildLifecycle().restoreToProjectRoot();
1394
1446
  } catch (e) {
1395
1447
  debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
1396
1448
  }
1397
- try {
1398
- process.chdir(s.basePath);
1399
- } catch (err) {
1400
- /* best-effort */
1401
- logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1402
- }
1403
1449
  }
1404
1450
 
1405
1451
  // Re-root the active command session/tool runtime after worktree teardown.
@@ -1428,7 +1474,7 @@ export async function stopAuto(
1428
1474
  if (ledger && ledger.units.length > 0) {
1429
1475
  const totals = getProjectTotals(ledger.units);
1430
1476
  ctx?.ui.notify(
1431
- `${notificationPrefix}. Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${ledger.units.length} units`,
1477
+ formatAutoStopNotification(notificationPrefix, totals, ledger.units.length),
1432
1478
  "info",
1433
1479
  );
1434
1480
  } else {
@@ -1735,7 +1781,6 @@ export async function pauseAuto(
1735
1781
  restoreProjectRootEnv();
1736
1782
  restoreMilestoneLockEnv();
1737
1783
  s.pendingVerificationRetry = null;
1738
- s.verificationRetryCount.clear();
1739
1784
  ctx?.ui.setStatus("gsd-auto", "paused");
1740
1785
  ctx?.ui.setWidget("gsd-progress", undefined);
1741
1786
  const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
@@ -1805,6 +1850,7 @@ export function createWiredDispatchAdapter(
1805
1850
  ctx: ExtensionContext,
1806
1851
  pi: ExtensionAPI,
1807
1852
  dispatchBasePath: string,
1853
+ session?: AutoSession,
1808
1854
  ): DispatchAdapter {
1809
1855
  return {
1810
1856
  async decideNextUnit(input) {
@@ -1812,7 +1858,9 @@ export function createWiredDispatchAdapter(
1812
1858
  const active = state.activeMilestone;
1813
1859
  if (!active) return null;
1814
1860
 
1815
- const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
1861
+ const activeSession = input.session ?? session;
1862
+ const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
1863
+ const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
1816
1864
 
1817
1865
  // Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
1818
1866
  // (#5789). Prefer caller-supplied values when present so test harnesses and
@@ -1841,18 +1889,42 @@ export function createWiredDispatchAdapter(
1841
1889
  : "false");
1842
1890
 
1843
1891
  const action = await resolveDispatch({
1844
- basePath: dispatchBasePath,
1892
+ basePath: activeDispatchBasePath,
1845
1893
  mid: active.id,
1846
1894
  midTitle: active.title,
1847
1895
  state,
1848
1896
  prefs,
1897
+ session: activeSession,
1849
1898
  structuredQuestionsAvailable,
1850
1899
  sessionContextWindow,
1851
1900
  sessionProvider,
1852
1901
  modelRegistry,
1853
1902
  });
1854
1903
 
1855
- if (action.action !== "dispatch") return null;
1904
+ if (action.action === "stop") {
1905
+ if (session) session.pendingOrchestrationDispatch = null;
1906
+ return {
1907
+ kind: "blocked",
1908
+ reason: action.reason,
1909
+ action: action.level === "warning" ? "pause" : "stop",
1910
+ };
1911
+ }
1912
+ if (action.action !== "dispatch") {
1913
+ if (session) session.pendingOrchestrationDispatch = null;
1914
+ return null;
1915
+ }
1916
+ if (session) {
1917
+ const pending: PendingOrchestrationDispatch = {
1918
+ unitType: action.unitType,
1919
+ unitId: action.unitId,
1920
+ prompt: action.prompt,
1921
+ pauseAfterUatDispatch: action.pauseAfterDispatch ?? false,
1922
+ state,
1923
+ mid: active.id,
1924
+ midTitle: active.title,
1925
+ };
1926
+ session.pendingOrchestrationDispatch = pending;
1927
+ }
1856
1928
  return {
1857
1929
  unitType: action.unitType,
1858
1930
  unitId: action.unitId,
@@ -1901,7 +1973,7 @@ export function createWiredAutoOrchestrationModule(
1901
1973
  };
1902
1974
  },
1903
1975
  },
1904
- dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath),
1976
+ dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath, s),
1905
1977
  recovery: {
1906
1978
  async classifyAndRecover(input) {
1907
1979
  const recovery = classifyFailure(input);
@@ -1924,10 +1996,16 @@ export function createWiredAutoOrchestrationModule(
1924
1996
  reason: `No Unit manifest is registered for ${unitType}`,
1925
1997
  };
1926
1998
  }
1999
+ if (getIsolationMode(runtimeBasePath) !== "worktree") {
2000
+ return { ok: true, reason: "not-required" };
2001
+ }
1927
2002
  const writeScope =
1928
2003
  manifest.tools.mode === "all" || manifest.tools.mode === "docs"
1929
2004
  ? "source-writing"
1930
2005
  : "planning-only";
2006
+ if (getIsolationMode(runtimeBasePath) !== "worktree") {
2007
+ return { ok: true, reason: "isolation-not-worktree" };
2008
+ }
1931
2009
  const safety = createWorktreeSafetyModule();
1932
2010
  const snapshot = await deriveState(dispatchBasePath);
1933
2011
  const milestoneId = snapshot.activeMilestone?.id ?? null;
@@ -1939,6 +2017,7 @@ export function createWiredAutoOrchestrationModule(
1939
2017
  projectRoot: runtimeBasePath,
1940
2018
  unitRoot: dispatchBasePath,
1941
2019
  milestoneId,
2020
+ isolationMode: getIsolationMode(runtimeBasePath),
1942
2021
  expectedBranch,
1943
2022
  });
1944
2023
  if (!result.ok) {
@@ -1997,22 +2076,22 @@ export function createWiredAutoOrchestrationModule(
1997
2076
  },
1998
2077
  async journalTransition(event) {
1999
2078
  const eventType = event.name === "start"
2000
- ? "iteration-start"
2079
+ ? "orchestrator-iteration-start"
2001
2080
  : event.name === "resume"
2002
- ? "iteration-start"
2081
+ ? "orchestrator-iteration-start"
2003
2082
  : event.name === "advance"
2004
- ? "dispatch-match"
2083
+ ? "orchestrator-dispatch-match"
2005
2084
  : event.name === "advance-blocked"
2006
- ? "guard-block"
2085
+ ? "orchestrator-guard-block"
2007
2086
  : event.name === "advance-stopped"
2008
- ? "dispatch-stop"
2087
+ ? "orchestrator-dispatch-stop"
2009
2088
  : event.name === "advance-error"
2010
- ? "iteration-end"
2089
+ ? "orchestrator-iteration-end"
2011
2090
  : event.name === "advance-paused" || event.name === "advance-retry"
2012
- ? "guard-block"
2091
+ ? "orchestrator-guard-block"
2013
2092
  : event.name === "stop"
2014
- ? "terminal"
2015
- : "iteration-end";
2093
+ ? "orchestrator-terminal"
2094
+ : "orchestrator-iteration-end";
2016
2095
 
2017
2096
  _emitJournalEvent(runtimeBasePath, {
2018
2097
  ts: new Date().toISOString(),
@@ -2078,6 +2157,18 @@ export function createWiredAutoOrchestrationModule(
2078
2157
  return createAutoOrchestrator(deps);
2079
2158
  }
2080
2159
 
2160
+ function notifyResumeBlocked(ctx: ExtensionContext, result: Extract<AutoAdvanceResult, { kind: "blocked" }>): void {
2161
+ const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
2162
+ ctx.ui.notify(`Auto-mode blocked: ${result.reason}. Fix and run ${resumeCmd} to resume.`, "warning");
2163
+ setLifecycleOutcome(ctx, {
2164
+ status: "blocked",
2165
+ title: "Auto-mode blocked",
2166
+ detail: result.reason,
2167
+ nextAction: `Fix the blocker, then run ${resumeCmd} to resume.`,
2168
+ commands: ["/gsd status for overview", `${resumeCmd} to resume`, "/gsd doctor to diagnose"],
2169
+ });
2170
+ }
2171
+
2081
2172
  function ensureOrchestrationModule(ctx: ExtensionContext, pi: ExtensionAPI, basePath: string): void {
2082
2173
  s.orchestration = createWiredAutoOrchestrationModule(ctx, pi, basePath, lockBase());
2083
2174
  }
@@ -2415,7 +2506,7 @@ export async function startAuto(
2415
2506
  // This closes the journal gap reported in #3348 where the worker wrote side
2416
2507
  // effects (SUMMARY.md, DB updates) but died before emitting unit-end.
2417
2508
  emitCrashRecoveredUnitEnd(base, freshStartAssessment.lock);
2418
- clearLock(base);
2509
+ clearStaleWorkerLock(base);
2419
2510
  }
2420
2511
 
2421
2512
  if (!s.paused) {
@@ -2486,6 +2577,8 @@ export async function startAuto(
2486
2577
  s.unitLifetimeDispatches.clear();
2487
2578
  if (!getLedger()) initMetrics(base);
2488
2579
  if (s.currentMilestoneId) setActiveMilestoneId(base, s.currentMilestoneId);
2580
+ await openProjectDbIfPresent(base);
2581
+ registerAutoWorkerForSession(s, base);
2489
2582
 
2490
2583
  // Re-register health level notification callback lost across process restart
2491
2584
  setLevelChangeCallback((_from, to, summary) => {
@@ -2558,22 +2651,11 @@ export async function startAuto(
2558
2651
  }
2559
2652
  invalidateAllCaches();
2560
2653
 
2561
- if (s.pausedSessionFile) {
2562
- const recovery = synthesizePausedSessionRecovery(
2563
- s.basePath,
2564
- s.currentUnit?.type ?? s.pausedUnitType ?? "unknown",
2565
- s.currentUnit?.id ?? s.pausedUnitId ?? "unknown",
2566
- s.pausedSessionFile,
2567
- );
2568
- if (recovery && recovery.trace.toolCallCount > 0) {
2569
- s.pendingCrashRecovery = recovery.prompt;
2570
- ctx.ui.notify(
2571
- `Recovered ${recovery.trace.toolCallCount} tool calls from paused session. Resuming with context.`,
2572
- "info",
2573
- );
2574
- }
2575
- s.pausedSessionFile = null;
2576
- }
2654
+ handlePausedSessionResumeRecovery(
2655
+ s.basePath,
2656
+ s,
2657
+ (message) => ctx.ui.notify(message, "info"),
2658
+ );
2577
2659
 
2578
2660
  captureProjectRootEnv(s.originalBasePath || s.basePath);
2579
2661
  registerAutoWorkerForSession(s);
@@ -2588,12 +2670,20 @@ export async function startAuto(
2588
2670
  "resuming",
2589
2671
  s.currentMilestoneId ?? "unknown",
2590
2672
  );
2591
- clearPausedSession("paused-session DB cleanup failed (resume activation)");
2592
2673
  }
2674
+ clearPausedSession("paused-session DB cleanup failed (resume activation)");
2593
2675
  pi.events.emit(CMUX_CHANNELS.LOG, { preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, message: s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", level: "progress" });
2594
2676
 
2595
2677
  try {
2596
- await s.orchestration?.resume();
2678
+ const resumeResult = await s.orchestration?.resume();
2679
+ if (resumeResult?.kind === "blocked" && resumeResult.action === "stop") {
2680
+ notifyResumeBlocked(ctx, resumeResult);
2681
+ await cleanupAfterLoopExit(ctx);
2682
+ return;
2683
+ }
2684
+ if (resumeResult?.kind === "blocked") {
2685
+ notifyResumeBlocked(ctx, resumeResult);
2686
+ }
2597
2687
  } catch (err) {
2598
2688
  debugLog("resume-orchestration-resume", { error: err instanceof Error ? err.message : String(err) });
2599
2689
  }
@@ -2614,6 +2704,7 @@ export async function startAuto(
2614
2704
  const bootstrapDeps: BootstrapDeps = {
2615
2705
  shouldUseWorktreeIsolation,
2616
2706
  registerSigtermHandler,
2707
+ registerAutoWorkerForSession: (projectRoot) => registerAutoWorkerForSession(s, projectRoot),
2617
2708
  lockBase,
2618
2709
  buildLifecycle,
2619
2710
  };
@@ -32,6 +32,7 @@ import { shouldIgnoreAgentEndForActiveUnit } from "../auto/unit-runner-events.js
32
32
  import { resolveModelId } from "../auto-model-selection.js";
33
33
  import { resolveProjectRoot } from "../worktree.js";
34
34
  import { clearDiscussionFlowState } from "./write-gate.js";
35
+ import { clearGuidedUnitContext } from "../guided-unit-context.js";
35
36
  import { resumeAutoAfterProviderDelay } from "./provider-error-resume.js";
36
37
  import {
37
38
  classifyError,
@@ -48,6 +49,19 @@ const MAX_NETWORK_RETRIES = 2;
48
49
  function isObjectRecord(value: unknown): value is Record<string, unknown> {
49
50
  return !!value && typeof value === "object";
50
51
  }
52
+
53
+ export function _hasEmptyAgentEndContent(content: unknown): boolean {
54
+ if (content == null) return true;
55
+ if (!Array.isArray(content)) return false;
56
+ if (content.length === 0) return true;
57
+ return content.every((block) => {
58
+ if (!block || typeof block !== "object") return true;
59
+ const typedBlock = block as { type?: unknown; text?: unknown };
60
+ if (typedBlock.type !== "text") return false;
61
+ return typeof typedBlock.text !== "string" || typedBlock.text.trim() === "";
62
+ });
63
+ }
64
+
51
65
  /**
52
66
  * Cap on auto-resume attempts for sustained transient-provider errors.
53
67
  *
@@ -94,6 +108,14 @@ export function isUserInitiatedAbortMessage(message: string | undefined | null):
94
108
  return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
95
109
  }
96
110
 
111
+ export function shouldDeferTransientErrorToCoreRetry(
112
+ cls: ErrorClass,
113
+ rawErrorMsg: string,
114
+ ): boolean {
115
+ if (!isTransient(cls) || cls.kind === "rate-limit") return false;
116
+ return !/retry failed after \d+ attempts:/i.test(rawErrorMsg);
117
+ }
118
+
97
119
  function isBareClaudeCodeSessionSwitchAbortMarker(message: string | undefined | null): boolean {
98
120
  if (!message) return false;
99
121
  const normalized = message.trim().replace(/\s+/g, " ").toLowerCase();
@@ -196,6 +218,14 @@ export function resolveAgentEndErrorDisplay(
196
218
  return rawErrorMsg;
197
219
  }
198
220
 
221
+ export function isTerminalDeletedWorktreeProviderError(
222
+ message: string | undefined | null,
223
+ ): boolean {
224
+ if (!message) return false;
225
+ if (!/\bdoes not exist\b/i.test(message)) return false;
226
+ return /[/\\]\.gsd[/\\](?:projects[/\\][^/\\]+[/\\])?worktrees[/\\][^/\\\s"']+/i.test(message);
227
+ }
228
+
199
229
  async function pauseTransientWithBackoff(
200
230
  cls: ErrorClass,
201
231
  pi: ExtensionAPI,
@@ -244,9 +274,11 @@ export async function handleAgentEnd(
244
274
  // falsely report files as missing — producing a spurious "ready signal
245
275
  // rejected" loop even though the files are on disk.
246
276
  clearPathCache();
277
+ const basePath = resolveAgentEndBasePath();
278
+ clearGuidedUnitContext(basePath);
247
279
 
248
280
  try {
249
- if (await checkDeepProjectSetupAfterTurn(event, ctx, resolveAgentEndBasePath())) {
281
+ if (await checkDeepProjectSetupAfterTurn(event, ctx, basePath)) {
250
282
  return;
251
283
  }
252
284
  } catch (err) {
@@ -254,8 +286,8 @@ export async function handleAgentEnd(
254
286
  logWarning("bootstrap", `checkDeepProjectSetupAfterTurn failed: ${message}`);
255
287
  }
256
288
 
257
- if (checkAutoStartAfterDiscuss()) {
258
- clearDiscussionFlowState(resolveAgentEndBasePath() ?? process.cwd());
289
+ if (checkAutoStartAfterDiscuss(basePath)) {
290
+ clearDiscussionFlowState(basePath ?? process.cwd());
259
291
  return;
260
292
  }
261
293
 
@@ -263,14 +295,14 @@ export async function handleAgentEnd(
263
295
  // are missing, `checkAutoStartAfterDiscuss` returns false silently. Surface
264
296
  // that and nudge the LLM to complete the writes before the user hits the
265
297
  // downstream "All milestones complete" warning loop.
266
- if (maybeHandleReadyPhraseWithoutFiles(event)) return;
298
+ if (maybeHandleReadyPhraseWithoutFiles(event, basePath)) return;
267
299
 
268
300
  // #4573 — Empty-turn recovery: if the LLM announced intent in prose but
269
301
  // emitted no tool calls, nudge it to execute. Fires only when auto-mode is
270
302
  // active or a discussion autostart is pending (non-auto interactive discuss
271
303
  // is user-driven). Runs before `isAutoActive` early return so pending
272
304
  // discussions (where isAutoActive may be false) still get recovered.
273
- if (maybeHandleEmptyIntentTurn(event, isAutoActive())) return;
305
+ if (maybeHandleEmptyIntentTurn(event, isAutoActive(), basePath)) return;
274
306
 
275
307
  if (!isAutoActive()) return;
276
308
 
@@ -292,9 +324,22 @@ export async function handleAgentEnd(
292
324
  }
293
325
 
294
326
  if (isBareClaudeCodeStreamAbortPlaceholder(lastMsg)) {
295
- // The Claude Code adapter can emit this placeholder after a prior turn has
296
- // already completed and the next unit is active. It has no user/provider
297
- // diagnostic value and must not cancel the newly-dispatched unit.
327
+ if (isSessionSwitchAbortGraceActive()) {
328
+ // Old turn leaking through after a session switch drop it.
329
+ return;
330
+ }
331
+
332
+ // Mid-unit stream abort with no diagnostic. Treat as non-fatal so the loop
333
+ // can continue, but surface it to the user and resolve the in-flight unit.
334
+ ctx.ui.notify("Claude Code stream aborted mid-unit (no diagnostic). Continuing.", "warning");
335
+ try {
336
+ resetRetryState(retryState);
337
+ resolveAgentEnd(event);
338
+ } catch (err) {
339
+ const message = err instanceof Error ? err.message : String(err);
340
+ ctx.ui.notify(`Auto-mode error after stream-abort placeholder: ${message}. Stopping auto-mode.`, "error");
341
+ try { await pauseAuto(ctx, pi); } catch (e) { logWarning("bootstrap", `pauseAuto failed after stream-abort placeholder: ${(e as Error).message}`); }
342
+ }
298
343
  return;
299
344
  }
300
345
 
@@ -310,7 +355,7 @@ export async function handleAgentEnd(
310
355
  // that carry error context — e.g. errorMessage field or non-empty content
311
356
  // indicating a mid-stream failure. (#2695)
312
357
  const content = "content" in lastMsg ? lastMsg.content : undefined;
313
- const hasEmptyContent = Array.isArray(content) && content.length === 0;
358
+ const hasEmptyContent = _hasEmptyAgentEndContent(content);
314
359
  const hasErrorMessage = "errorMessage" in lastMsg && !!lastMsg.errorMessage;
315
360
 
316
361
  if (hasEmptyContent && !hasErrorMessage) {
@@ -355,6 +400,17 @@ export async function handleAgentEnd(
355
400
  rawErrorMsg,
356
401
  "content" in lastMsg ? lastMsg.content : undefined,
357
402
  );
403
+ if (
404
+ isAutoCompletionStopInProgress() &&
405
+ isTerminalDeletedWorktreeProviderError(`${rawErrorMsg}\n${displayMsg}`)
406
+ ) {
407
+ resetRetryState(retryState);
408
+ logWarning(
409
+ "bootstrap",
410
+ `Ignoring stale deleted-worktree provider error during terminal completion reroot: ${displayMsg || rawErrorMsg}`,
411
+ );
412
+ return;
413
+ }
358
414
  const errorDetail = displayMsg ? `: ${displayMsg}` : "";
359
415
  const explicitRetryAfterMs = ("retryAfterMs" in lastMsg && typeof lastMsg.retryAfterMs === "number") ? lastMsg.retryAfterMs : undefined;
360
416
 
@@ -461,7 +517,7 @@ export async function handleAgentEnd(
461
517
  // Core retries transient failures in-session after this handler.
462
518
  // Keep that behavior for non-rate-limit classes to avoid pause/retry races,
463
519
  // but let rate-limit continue into model fallback logic below (#4373).
464
- if (isTransient(cls) && cls.kind !== "rate-limit") {
520
+ if (shouldDeferTransientErrorToCoreRetry(cls, rawErrorMsg)) {
465
521
  return;
466
522
  }
467
523