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
@@ -22,7 +22,7 @@ import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveDir, milest
22
22
  import { invalidateAllCaches } from "./cache.js";
23
23
  import { clearActivityLogState } from "./activity-log.js";
24
24
  import { synthesizeCrashRecovery, getDeepDiagnostic, readActiveMilestoneId, } from "./session-forensics.js";
25
- import { writeLock, clearLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, emitOpenUnitEndForUnit, } from "./crash-recovery.js";
25
+ import { writeLock, clearLock, clearStaleWorkerLock, readCrashLock, isLockProcessAlive, formatCrashInfo, emitCrashRecoveredUnitEnd, emitOpenUnitEndForUnit, } from "./crash-recovery.js";
26
26
  import { acquireSessionLock, getSessionLockStatus, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
27
27
  import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, getIsolationMode, } from "./preferences.js";
28
28
  import { sendDesktopNotification } from "./notifications.js";
@@ -52,7 +52,7 @@ import { createAutoWorktree, teardownAutoWorktree, isInAutoWorktree, getAutoWork
52
52
  import { pruneQueueOrder } from "./queue-order.js";
53
53
  import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
54
54
  import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
55
- import { reconcileMergeState, } from "./auto-recovery.js";
55
+ import { reconcileMergeState, verifyExpectedArtifact, } from "./auto-recovery.js";
56
56
  import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
57
57
  import { resolveDispatch, DISPATCH_RULES } from "./auto-dispatch.js";
58
58
  import { getErrorMessage } from "./error-utils.js";
@@ -110,7 +110,7 @@ export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session
110
110
  import { autoSession as s } from "./auto-runtime-state.js";
111
111
  import { gsdHome } from "./gsd-home.js";
112
112
  import { createWorkspace, scopeMilestone } from "./workspace.js";
113
- import { registerAutoWorker, markWorkerStopping } from "./db/auto-workers.js";
113
+ import { registerAutoWorker, markWorkerStopping, } from "./db/auto-workers.js";
114
114
  import { releaseMilestoneLease } from "./db/milestone-leases.js";
115
115
  import { normalizeRealPath } from "./paths.js";
116
116
  // ── ENCAPSULATION INVARIANT ─────────────────────────────────────────────────
@@ -127,6 +127,12 @@ import { normalizeRealPath } from "./paths.js";
127
127
  // ─────────────────────────────────────────────────────────────────────────────
128
128
  /** Throttle STATE.md rebuilds — at most once per 30 seconds */
129
129
  const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
130
+ export function formatAutoStopNotification(prefix, totals, unitCount) {
131
+ return [
132
+ `${prefix}.`,
133
+ `Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${unitCount} units`,
134
+ ].join("\n");
135
+ }
130
136
  /**
131
137
  * Phase B — register this auto-mode process in the workers table so other
132
138
  * workers and janitors can detect liveness via heartbeat. Best-effort: if
@@ -253,6 +259,32 @@ function synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile
253
259
  export function _synthesizePausedSessionRecoveryForTest(basePath, unitType, unitId, sessionFile) {
254
260
  return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
255
261
  }
262
+ function handlePausedSessionResumeRecovery(basePath, state, notify) {
263
+ if (!state.pausedSessionFile)
264
+ return { skippedReplay: false };
265
+ const pausedRecoveryUnitType = state.currentUnit?.type ?? state.pausedUnitType ?? "unknown";
266
+ const pausedRecoveryUnitId = state.currentUnit?.id ?? state.pausedUnitId ?? "unknown";
267
+ const completedPausedUnit = verifyExpectedArtifact(pausedRecoveryUnitType, pausedRecoveryUnitId, basePath);
268
+ if (completedPausedUnit) {
269
+ state.pausedSessionFile = null;
270
+ state.pausedUnitType = null;
271
+ state.pausedUnitId = null;
272
+ state.pendingCrashRecovery = null;
273
+ return { skippedReplay: true };
274
+ }
275
+ const recovery = synthesizePausedSessionRecovery(basePath, pausedRecoveryUnitType, pausedRecoveryUnitId, state.pausedSessionFile);
276
+ if (recovery && recovery.trace.toolCallCount > 0) {
277
+ state.pendingCrashRecovery = recovery.prompt;
278
+ notify(`Recovered ${recovery.trace.toolCallCount} tool calls from paused session. Resuming with context.`);
279
+ }
280
+ state.pausedSessionFile = null;
281
+ state.pausedUnitType = null;
282
+ state.pausedUnitId = null;
283
+ return { skippedReplay: false };
284
+ }
285
+ export function _handlePausedSessionResumeRecoveryForTest(basePath, state) {
286
+ return handlePausedSessionResumeRecovery(basePath, state, () => { });
287
+ }
256
288
  // `_resolvePausedResumeBasePathForTest` was retired in ADR-016 phase 2 / B3
257
289
  // (#5621). Production callers go through
258
290
  // `WorktreeLifecycle.resumeFromPausedSession`; the pure helper for tests is
@@ -560,6 +592,7 @@ export function checkRemoteAutoSession(projectRoot) {
560
592
  return { running: false };
561
593
  if (!isLockProcessAlive(lock)) {
562
594
  // Stale lock from a dead process — not a live remote session
595
+ clearLock(projectRoot);
563
596
  return { running: false };
564
597
  }
565
598
  return {
@@ -683,6 +716,8 @@ export async function rerootCommandSession(cmdCtx, workspaceRoot) {
683
716
  }
684
717
  }
685
718
  export async function cleanupAfterLoopExit(ctx) {
719
+ const preserveStepSurface = s.preserveStepSurfaceAfterLoopExit;
720
+ const preservePausedSurface = s.paused;
686
721
  s.currentUnit = null;
687
722
  s.active = false;
688
723
  deactivateGSD();
@@ -706,34 +741,32 @@ export async function cleanupAfterLoopExit(ctx) {
706
741
  // A transient provider-error pause intentionally leaves the paused badge
707
742
  // visible so the user still has a resumable auto-mode signal on screen.
708
743
  if (!s.paused) {
709
- ctx.ui.setStatus("gsd-auto", undefined);
710
- if (s.completionStopInProgress) {
711
- s.completionStopInProgress = false;
744
+ if (preserveStepSurface) {
745
+ s.preserveStepSurfaceAfterLoopExit = false;
746
+ }
747
+ else {
748
+ ctx.ui.setStatus("gsd-auto", undefined);
749
+ ctx.ui.setWidget("gsd-progress", undefined);
750
+ if (s.completionStopInProgress) {
751
+ s.completionStopInProgress = false;
752
+ }
753
+ initHealthWidget(ctx);
712
754
  }
713
- initHealthWidget(ctx);
714
755
  }
715
- // ADR-016 phase 3 (#5693): the stop-path basePath restore routes through
716
- // `Lifecycle.restoreToProjectRoot()`, the sole owner of `s.basePath`
717
- // mutation. The verb assigns `s.basePath` before any throwable work
718
- // (rebuildGitService, cache invalidation), so a thrown error still leaves
719
- // basePath restored no fallback assignment needed at the call site.
720
- // The chdir stays here because `restoreToProjectRoot` is a pure
721
- // session-state mutation.
722
- if (s.originalBasePath) {
756
+ // ADR-016 phase 3 (#5693): the stop-path basePath restore + chdir routes
757
+ // through `Lifecycle.restoreToProjectRoot()`, the sole owner of both
758
+ // `s.basePath` mutation and the paired `process.chdir` for auto-loop
759
+ // transitions. The verb assigns `s.basePath` before any throwable work, so
760
+ // a thrown error still leaves basePath restored.
761
+ if (s.originalBasePath && !preserveStepSurface && !preservePausedSurface) {
723
762
  try {
724
763
  buildLifecycle().restoreToProjectRoot();
725
764
  }
726
765
  catch (err) {
727
766
  logWarning("engine", `restore project root failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
728
767
  }
729
- try {
730
- process.chdir(s.originalBasePath);
731
- }
732
- catch (err) {
733
- logWarning("engine", `basePath restore/chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
734
- }
735
768
  }
736
- if (s.originalBasePath && s.cmdCtx) {
769
+ if (s.originalBasePath && s.cmdCtx && !preserveStepSurface && !preservePausedSurface) {
737
770
  const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
738
771
  if (result.status === "cancelled") {
739
772
  logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
@@ -804,29 +837,16 @@ export async function stopAuto(ctx, pi, reason, options = {}) {
804
837
  // worktree was active, and whether the current milestone was merged before
805
838
  // stopAuto. The unmerged-work warning is only meaningful for real worktrees.
806
839
  try {
807
- const { emitAutoExit } = await import("./worktree-telemetry.js");
840
+ const { emitAutoExit, normalizeAutoExitReason } = await import("./worktree-telemetry.js");
808
841
  // Normalize the free-form reason to a closed set so the telemetry
809
842
  // aggregator buckets stably. Raw detail is preserved in the phases.ts
810
843
  // notification and the notify'd error string.
811
844
  const rawReason = reason ?? "stop";
812
- const normalizedReason = rawReason.startsWith("Blocked:")
813
- ? "blocked"
814
- : rawReason.startsWith("Merge conflict")
815
- ? "merge-conflict"
816
- : rawReason.startsWith("Merge error") || rawReason.startsWith("Merge failed")
817
- ? "merge-failed"
818
- : rawReason.startsWith("slice-merge-conflict")
819
- ? "slice-merge-conflict"
820
- : rawReason === "All milestones complete"
821
- ? "all-complete"
822
- : rawReason === "No active milestone"
823
- ? "no-active-milestone"
824
- : rawReason === "stop" || rawReason === "pause"
825
- ? rawReason
826
- : "other";
845
+ const normalizedReason = normalizeAutoExitReason(rawReason);
827
846
  const telemetryBase = s.originalBasePath || s.basePath;
828
847
  emitAutoExit(telemetryBase, {
829
848
  reason: normalizedReason,
849
+ rawReason,
830
850
  milestoneId: s.currentMilestoneId ?? undefined,
831
851
  milestoneMerged: s.milestoneMergedInPhases === true,
832
852
  isolationMode: getIsolationMode(telemetryBase),
@@ -1002,8 +1022,8 @@ export async function stopAuto(ctx, pi, reason, options = {}) {
1002
1022
  }
1003
1023
  }
1004
1024
  // ── Step 7: Restore basePath and chdir (ADR-016 phase 3, #5693) ──
1005
- // `restoreToProjectRoot` assigns s.basePath before any throwable work;
1006
- // no fallback assignment is needed at the call site.
1025
+ // `restoreToProjectRoot` owns both s.basePath restore and process.chdir;
1026
+ // no paired chdir is needed at the call site.
1007
1027
  if (s.originalBasePath) {
1008
1028
  try {
1009
1029
  buildLifecycle().restoreToProjectRoot();
@@ -1011,13 +1031,6 @@ export async function stopAuto(ctx, pi, reason, options = {}) {
1011
1031
  catch (e) {
1012
1032
  debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
1013
1033
  }
1014
- try {
1015
- process.chdir(s.basePath);
1016
- }
1017
- catch (err) {
1018
- /* best-effort */
1019
- logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1020
- }
1021
1034
  }
1022
1035
  // Re-root the active command session/tool runtime after worktree teardown.
1023
1036
  // mergeAndExit restores process.cwd(), but AgentSession has already captured
@@ -1044,7 +1057,7 @@ export async function stopAuto(ctx, pi, reason, options = {}) {
1044
1057
  : `Auto-mode stopped${reasonSuffix}`;
1045
1058
  if (ledger && ledger.units.length > 0) {
1046
1059
  const totals = getProjectTotals(ledger.units);
1047
- ctx?.ui.notify(`${notificationPrefix}. Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${ledger.units.length} units`, "info");
1060
+ ctx?.ui.notify(formatAutoStopNotification(notificationPrefix, totals, ledger.units.length), "info");
1048
1061
  }
1049
1062
  else {
1050
1063
  ctx?.ui.notify(`${notificationPrefix}.`, "info");
@@ -1333,7 +1346,6 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
1333
1346
  restoreProjectRootEnv();
1334
1347
  restoreMilestoneLockEnv();
1335
1348
  s.pendingVerificationRetry = null;
1336
- s.verificationRetryCount.clear();
1337
1349
  ctx?.ui.setStatus("gsd-auto", "paused");
1338
1350
  ctx?.ui.setWidget("gsd-progress", undefined);
1339
1351
  const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
@@ -1393,14 +1405,16 @@ function buildLifecycle() {
1393
1405
  * the wired adapter must derive `structuredQuestionsAvailable`, `sessionContextWindow`,
1394
1406
  * `sessionProvider`, and `modelRegistry` the same way phases.ts:runDispatch does.
1395
1407
  */
1396
- export function createWiredDispatchAdapter(ctx, pi, dispatchBasePath) {
1408
+ export function createWiredDispatchAdapter(ctx, pi, dispatchBasePath, session) {
1397
1409
  return {
1398
1410
  async decideNextUnit(input) {
1399
1411
  const state = input.stateSnapshot;
1400
1412
  const active = state.activeMilestone;
1401
1413
  if (!active)
1402
1414
  return null;
1403
- const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
1415
+ const activeSession = input.session ?? session;
1416
+ const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
1417
+ const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
1404
1418
  // Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
1405
1419
  // (#5789). Prefer caller-supplied values when present so test harnesses and
1406
1420
  // alternative wirings can inject deterministic snapshots; otherwise pull from
@@ -1425,18 +1439,43 @@ export function createWiredDispatchAdapter(ctx, pi, dispatchBasePath) {
1425
1439
  ? "true"
1426
1440
  : "false");
1427
1441
  const action = await resolveDispatch({
1428
- basePath: dispatchBasePath,
1442
+ basePath: activeDispatchBasePath,
1429
1443
  mid: active.id,
1430
1444
  midTitle: active.title,
1431
1445
  state,
1432
1446
  prefs,
1447
+ session: activeSession,
1433
1448
  structuredQuestionsAvailable,
1434
1449
  sessionContextWindow,
1435
1450
  sessionProvider,
1436
1451
  modelRegistry,
1437
1452
  });
1438
- if (action.action !== "dispatch")
1453
+ if (action.action === "stop") {
1454
+ if (session)
1455
+ session.pendingOrchestrationDispatch = null;
1456
+ return {
1457
+ kind: "blocked",
1458
+ reason: action.reason,
1459
+ action: action.level === "warning" ? "pause" : "stop",
1460
+ };
1461
+ }
1462
+ if (action.action !== "dispatch") {
1463
+ if (session)
1464
+ session.pendingOrchestrationDispatch = null;
1439
1465
  return null;
1466
+ }
1467
+ if (session) {
1468
+ const pending = {
1469
+ unitType: action.unitType,
1470
+ unitId: action.unitId,
1471
+ prompt: action.prompt,
1472
+ pauseAfterUatDispatch: action.pauseAfterDispatch ?? false,
1473
+ state,
1474
+ mid: active.id,
1475
+ midTitle: active.title,
1476
+ };
1477
+ session.pendingOrchestrationDispatch = pending;
1478
+ }
1440
1479
  return {
1441
1480
  unitType: action.unitType,
1442
1481
  unitId: action.unitId,
@@ -1477,7 +1516,7 @@ export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, ru
1477
1516
  };
1478
1517
  },
1479
1518
  },
1480
- dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath),
1519
+ dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath, s),
1481
1520
  recovery: {
1482
1521
  async classifyAndRecover(input) {
1483
1522
  const recovery = classifyFailure(input);
@@ -1501,9 +1540,15 @@ export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, ru
1501
1540
  reason: `No Unit manifest is registered for ${unitType}`,
1502
1541
  };
1503
1542
  }
1543
+ if (getIsolationMode(runtimeBasePath) !== "worktree") {
1544
+ return { ok: true, reason: "not-required" };
1545
+ }
1504
1546
  const writeScope = manifest.tools.mode === "all" || manifest.tools.mode === "docs"
1505
1547
  ? "source-writing"
1506
1548
  : "planning-only";
1549
+ if (getIsolationMode(runtimeBasePath) !== "worktree") {
1550
+ return { ok: true, reason: "isolation-not-worktree" };
1551
+ }
1507
1552
  const safety = createWorktreeSafetyModule();
1508
1553
  const snapshot = await deriveState(dispatchBasePath);
1509
1554
  const milestoneId = snapshot.activeMilestone?.id ?? null;
@@ -1515,6 +1560,7 @@ export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, ru
1515
1560
  projectRoot: runtimeBasePath,
1516
1561
  unitRoot: dispatchBasePath,
1517
1562
  milestoneId,
1563
+ isolationMode: getIsolationMode(runtimeBasePath),
1518
1564
  expectedBranch,
1519
1565
  });
1520
1566
  if (!result.ok) {
@@ -1575,22 +1621,22 @@ export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, ru
1575
1621
  },
1576
1622
  async journalTransition(event) {
1577
1623
  const eventType = event.name === "start"
1578
- ? "iteration-start"
1624
+ ? "orchestrator-iteration-start"
1579
1625
  : event.name === "resume"
1580
- ? "iteration-start"
1626
+ ? "orchestrator-iteration-start"
1581
1627
  : event.name === "advance"
1582
- ? "dispatch-match"
1628
+ ? "orchestrator-dispatch-match"
1583
1629
  : event.name === "advance-blocked"
1584
- ? "guard-block"
1630
+ ? "orchestrator-guard-block"
1585
1631
  : event.name === "advance-stopped"
1586
- ? "dispatch-stop"
1632
+ ? "orchestrator-dispatch-stop"
1587
1633
  : event.name === "advance-error"
1588
- ? "iteration-end"
1634
+ ? "orchestrator-iteration-end"
1589
1635
  : event.name === "advance-paused" || event.name === "advance-retry"
1590
- ? "guard-block"
1636
+ ? "orchestrator-guard-block"
1591
1637
  : event.name === "stop"
1592
- ? "terminal"
1593
- : "iteration-end";
1638
+ ? "orchestrator-terminal"
1639
+ : "orchestrator-iteration-end";
1594
1640
  _emitJournalEvent(runtimeBasePath, {
1595
1641
  ts: new Date().toISOString(),
1596
1642
  flowId,
@@ -1655,6 +1701,17 @@ export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, ru
1655
1701
  };
1656
1702
  return createAutoOrchestrator(deps);
1657
1703
  }
1704
+ function notifyResumeBlocked(ctx, result) {
1705
+ const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
1706
+ ctx.ui.notify(`Auto-mode blocked: ${result.reason}. Fix and run ${resumeCmd} to resume.`, "warning");
1707
+ setLifecycleOutcome(ctx, {
1708
+ status: "blocked",
1709
+ title: "Auto-mode blocked",
1710
+ detail: result.reason,
1711
+ nextAction: `Fix the blocker, then run ${resumeCmd} to resume.`,
1712
+ commands: ["/gsd status for overview", `${resumeCmd} to resume`, "/gsd doctor to diagnose"],
1713
+ });
1714
+ }
1658
1715
  function ensureOrchestrationModule(ctx, pi, basePath) {
1659
1716
  s.orchestration = createWiredAutoOrchestrationModule(ctx, pi, basePath, lockBase());
1660
1717
  }
@@ -1939,7 +1996,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1939
1996
  // This closes the journal gap reported in #3348 where the worker wrote side
1940
1997
  // effects (SUMMARY.md, DB updates) but died before emitting unit-end.
1941
1998
  emitCrashRecoveredUnitEnd(base, freshStartAssessment.lock);
1942
- clearLock(base);
1999
+ clearStaleWorkerLock(base);
1943
2000
  }
1944
2001
  if (!s.paused) {
1945
2002
  s.pendingCrashRecovery =
@@ -2002,6 +2059,8 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
2002
2059
  initMetrics(base);
2003
2060
  if (s.currentMilestoneId)
2004
2061
  setActiveMilestoneId(base, s.currentMilestoneId);
2062
+ await openProjectDbIfPresent(base);
2063
+ registerAutoWorkerForSession(s, base);
2005
2064
  // Re-register health level notification callback lost across process restart
2006
2065
  setLevelChangeCallback((_from, to, summary) => {
2007
2066
  const level = to === "red" ? "error" : to === "yellow" ? "warning" : "info";
@@ -2060,24 +2119,25 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
2060
2119
  });
2061
2120
  }
2062
2121
  invalidateAllCaches();
2063
- if (s.pausedSessionFile) {
2064
- const recovery = synthesizePausedSessionRecovery(s.basePath, s.currentUnit?.type ?? s.pausedUnitType ?? "unknown", s.currentUnit?.id ?? s.pausedUnitId ?? "unknown", s.pausedSessionFile);
2065
- if (recovery && recovery.trace.toolCallCount > 0) {
2066
- s.pendingCrashRecovery = recovery.prompt;
2067
- ctx.ui.notify(`Recovered ${recovery.trace.toolCallCount} tool calls from paused session. Resuming with context.`, "info");
2068
- }
2069
- s.pausedSessionFile = null;
2070
- }
2122
+ handlePausedSessionResumeRecovery(s.basePath, s, (message) => ctx.ui.notify(message, "info"));
2071
2123
  captureProjectRootEnv(s.originalBasePath || s.basePath);
2072
2124
  registerAutoWorkerForSession(s);
2073
2125
  updateSessionLock(lockBase(), "resuming", s.currentMilestoneId ?? "unknown");
2074
2126
  if (s.workerId) {
2075
2127
  writeLock(lockBase(), "resuming", s.currentMilestoneId ?? "unknown");
2076
- clearPausedSession("paused-session DB cleanup failed (resume activation)");
2077
2128
  }
2129
+ clearPausedSession("paused-session DB cleanup failed (resume activation)");
2078
2130
  pi.events.emit(CMUX_CHANNELS.LOG, { preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, message: s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", level: "progress" });
2079
2131
  try {
2080
- await s.orchestration?.resume();
2132
+ const resumeResult = await s.orchestration?.resume();
2133
+ if (resumeResult?.kind === "blocked" && resumeResult.action === "stop") {
2134
+ notifyResumeBlocked(ctx, resumeResult);
2135
+ await cleanupAfterLoopExit(ctx);
2136
+ return;
2137
+ }
2138
+ if (resumeResult?.kind === "blocked") {
2139
+ notifyResumeBlocked(ctx, resumeResult);
2140
+ }
2081
2141
  }
2082
2142
  catch (err) {
2083
2143
  debugLog("resume-orchestration-resume", { error: err instanceof Error ? err.message : String(err) });
@@ -2098,6 +2158,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
2098
2158
  const bootstrapDeps = {
2099
2159
  shouldUseWorktreeIsolation,
2100
2160
  registerSigtermHandler,
2161
+ registerAutoWorkerForSession: (projectRoot) => registerAutoWorkerForSession(s, projectRoot),
2101
2162
  lockBase,
2102
2163
  buildLifecycle,
2103
2164
  };
@@ -10,6 +10,7 @@ import { shouldIgnoreAgentEndForActiveUnit } from "../auto/unit-runner-events.js
10
10
  import { resolveModelId } from "../auto-model-selection.js";
11
11
  import { resolveProjectRoot } from "../worktree.js";
12
12
  import { clearDiscussionFlowState } from "./write-gate.js";
13
+ import { clearGuidedUnitContext } from "../guided-unit-context.js";
13
14
  import { resumeAutoAfterProviderDelay } from "./provider-error-resume.js";
14
15
  import { classifyError, createRetryState, resetRetryState, isTransient, } from "../error-classifier.js";
15
16
  import { blockModel, isModelBlocked } from "../blocked-models.js";
@@ -18,6 +19,22 @@ const MAX_NETWORK_RETRIES = 2;
18
19
  function isObjectRecord(value) {
19
20
  return !!value && typeof value === "object";
20
21
  }
22
+ export function _hasEmptyAgentEndContent(content) {
23
+ if (content == null)
24
+ return true;
25
+ if (!Array.isArray(content))
26
+ return false;
27
+ if (content.length === 0)
28
+ return true;
29
+ return content.every((block) => {
30
+ if (!block || typeof block !== "object")
31
+ return true;
32
+ const typedBlock = block;
33
+ if (typedBlock.type !== "text")
34
+ return false;
35
+ return typeof typedBlock.text !== "string" || typedBlock.text.trim() === "";
36
+ });
37
+ }
21
38
  /**
22
39
  * Cap on auto-resume attempts for sustained transient-provider errors.
23
40
  *
@@ -57,6 +74,11 @@ export function isUserInitiatedAbortMessage(message) {
57
74
  return false;
58
75
  return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
59
76
  }
77
+ export function shouldDeferTransientErrorToCoreRetry(cls, rawErrorMsg) {
78
+ if (!isTransient(cls) || cls.kind === "rate-limit")
79
+ return false;
80
+ return !/retry failed after \d+ attempts:/i.test(rawErrorMsg);
81
+ }
60
82
  function isBareClaudeCodeSessionSwitchAbortMarker(message) {
61
83
  if (!message)
62
84
  return false;
@@ -150,6 +172,13 @@ export function resolveAgentEndErrorDisplay(rawErrorMsg, content) {
150
172
  }
151
173
  return rawErrorMsg;
152
174
  }
175
+ export function isTerminalDeletedWorktreeProviderError(message) {
176
+ if (!message)
177
+ return false;
178
+ if (!/\bdoes not exist\b/i.test(message))
179
+ return false;
180
+ return /[/\\]\.gsd[/\\](?:projects[/\\][^/\\]+[/\\])?worktrees[/\\][^/\\\s"']+/i.test(message);
181
+ }
153
182
  async function pauseTransientWithBackoff(cls, pi, ctx, errorDetail, isRateLimit) {
154
183
  retryState.consecutiveTransientCount += 1;
155
184
  const baseRetryAfterMs = "retryAfterMs" in cls ? cls.retryAfterMs : 15_000;
@@ -187,8 +216,10 @@ export async function handleAgentEnd(pi, event, ctx) {
187
216
  // falsely report files as missing — producing a spurious "ready signal
188
217
  // rejected" loop even though the files are on disk.
189
218
  clearPathCache();
219
+ const basePath = resolveAgentEndBasePath();
220
+ clearGuidedUnitContext(basePath);
190
221
  try {
191
- if (await checkDeepProjectSetupAfterTurn(event, ctx, resolveAgentEndBasePath())) {
222
+ if (await checkDeepProjectSetupAfterTurn(event, ctx, basePath)) {
192
223
  return;
193
224
  }
194
225
  }
@@ -196,22 +227,22 @@ export async function handleAgentEnd(pi, event, ctx) {
196
227
  const message = err instanceof Error ? err.message : String(err);
197
228
  logWarning("bootstrap", `checkDeepProjectSetupAfterTurn failed: ${message}`);
198
229
  }
199
- if (checkAutoStartAfterDiscuss()) {
200
- clearDiscussionFlowState(resolveAgentEndBasePath() ?? process.cwd());
230
+ if (checkAutoStartAfterDiscuss(basePath)) {
231
+ clearDiscussionFlowState(basePath ?? process.cwd());
201
232
  return;
202
233
  }
203
234
  // #4573 — When the LLM emits "Milestone X ready." but the required files
204
235
  // are missing, `checkAutoStartAfterDiscuss` returns false silently. Surface
205
236
  // that and nudge the LLM to complete the writes before the user hits the
206
237
  // downstream "All milestones complete" warning loop.
207
- if (maybeHandleReadyPhraseWithoutFiles(event))
238
+ if (maybeHandleReadyPhraseWithoutFiles(event, basePath))
208
239
  return;
209
240
  // #4573 — Empty-turn recovery: if the LLM announced intent in prose but
210
241
  // emitted no tool calls, nudge it to execute. Fires only when auto-mode is
211
242
  // active or a discussion autostart is pending (non-auto interactive discuss
212
243
  // is user-driven). Runs before `isAutoActive` early return so pending
213
244
  // discussions (where isAutoActive may be false) still get recovered.
214
- if (maybeHandleEmptyIntentTurn(event, isAutoActive()))
245
+ if (maybeHandleEmptyIntentTurn(event, isAutoActive(), basePath))
215
246
  return;
216
247
  if (!isAutoActive())
217
248
  return;
@@ -230,9 +261,27 @@ export async function handleAgentEnd(pi, event, ctx) {
230
261
  return;
231
262
  }
232
263
  if (isBareClaudeCodeStreamAbortPlaceholder(lastMsg)) {
233
- // The Claude Code adapter can emit this placeholder after a prior turn has
234
- // already completed and the next unit is active. It has no user/provider
235
- // diagnostic value and must not cancel the newly-dispatched unit.
264
+ if (isSessionSwitchAbortGraceActive()) {
265
+ // Old turn leaking through after a session switch drop it.
266
+ return;
267
+ }
268
+ // Mid-unit stream abort with no diagnostic. Treat as non-fatal so the loop
269
+ // can continue, but surface it to the user and resolve the in-flight unit.
270
+ ctx.ui.notify("Claude Code stream aborted mid-unit (no diagnostic). Continuing.", "warning");
271
+ try {
272
+ resetRetryState(retryState);
273
+ resolveAgentEnd(event);
274
+ }
275
+ catch (err) {
276
+ const message = err instanceof Error ? err.message : String(err);
277
+ ctx.ui.notify(`Auto-mode error after stream-abort placeholder: ${message}. Stopping auto-mode.`, "error");
278
+ try {
279
+ await pauseAuto(ctx, pi);
280
+ }
281
+ catch (e) {
282
+ logWarning("bootstrap", `pauseAuto failed after stream-abort placeholder: ${e.message}`);
283
+ }
284
+ }
236
285
  return;
237
286
  }
238
287
  if (isObjectRecord(lastMsg) && "stopReason" in lastMsg && lastMsg.stopReason === "aborted") {
@@ -246,7 +295,7 @@ export async function handleAgentEnd(pi, event, ctx) {
246
295
  // that carry error context — e.g. errorMessage field or non-empty content
247
296
  // indicating a mid-stream failure. (#2695)
248
297
  const content = "content" in lastMsg ? lastMsg.content : undefined;
249
- const hasEmptyContent = Array.isArray(content) && content.length === 0;
298
+ const hasEmptyContent = _hasEmptyAgentEndContent(content);
250
299
  const hasErrorMessage = "errorMessage" in lastMsg && !!lastMsg.errorMessage;
251
300
  if (hasEmptyContent && !hasErrorMessage) {
252
301
  // Non-fatal: treat as a normal agent end so the loop can continue
@@ -292,6 +341,12 @@ export async function handleAgentEnd(pi, event, ctx) {
292
341
  // the assistant message text content for display purposes only.
293
342
  // Classification still uses rawErrorMsg to avoid false positives from prose.
294
343
  const displayMsg = resolveAgentEndErrorDisplay(rawErrorMsg, "content" in lastMsg ? lastMsg.content : undefined);
344
+ if (isAutoCompletionStopInProgress() &&
345
+ isTerminalDeletedWorktreeProviderError(`${rawErrorMsg}\n${displayMsg}`)) {
346
+ resetRetryState(retryState);
347
+ logWarning("bootstrap", `Ignoring stale deleted-worktree provider error during terminal completion reroot: ${displayMsg || rawErrorMsg}`);
348
+ return;
349
+ }
295
350
  const errorDetail = displayMsg ? `: ${displayMsg}` : "";
296
351
  const explicitRetryAfterMs = ("retryAfterMs" in lastMsg && typeof lastMsg.retryAfterMs === "number") ? lastMsg.retryAfterMs : undefined;
297
352
  // ── 1. Classify using rawErrorMsg to avoid prose false-positives ────
@@ -375,7 +430,7 @@ export async function handleAgentEnd(pi, event, ctx) {
375
430
  // Core retries transient failures in-session after this handler.
376
431
  // Keep that behavior for non-rate-limit classes to avoid pause/retry races,
377
432
  // but let rate-limit continue into model fallback logic below (#4373).
378
- if (isTransient(cls) && cls.kind !== "rate-limit") {
433
+ if (shouldDeferTransientErrorToCoreRetry(cls, rawErrorMsg)) {
379
434
  return;
380
435
  }
381
436
  // Cap rate-limit backoff for CLI-style providers (openai-codex, google-gemini-cli)