gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.2e8b124f7

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 (580) 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/infra-errors.js +9 -3
  11. package/dist/resources/extensions/gsd/auto/loop.js +110 -37
  12. package/dist/resources/extensions/gsd/auto/orchestrator.js +13 -2
  13. package/dist/resources/extensions/gsd/auto/phases.js +104 -38
  14. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  15. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  16. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  18. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  19. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  20. package/dist/resources/extensions/gsd/auto-dispatch.js +71 -20
  21. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  22. package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
  23. package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
  24. package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
  25. package/dist/resources/extensions/gsd/auto-start.js +90 -14
  26. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  27. package/dist/resources/extensions/gsd/auto-verification.js +102 -34
  28. package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
  29. package/dist/resources/extensions/gsd/auto.js +107 -54
  30. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  32. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +5 -4
  33. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  34. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  35. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  36. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  37. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  38. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  39. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  40. package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
  41. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  42. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
  43. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  44. package/dist/resources/extensions/gsd/crash-recovery.js +52 -7
  45. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  46. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  47. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  48. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  49. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  50. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  51. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  52. package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
  53. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  54. package/dist/resources/extensions/gsd/doctor.js +2 -28
  55. package/dist/resources/extensions/gsd/export-html.js +27 -425
  56. package/dist/resources/extensions/gsd/forensics.js +10 -3
  57. package/dist/resources/extensions/gsd/git-service.js +138 -10
  58. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  59. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  60. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  61. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  62. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  63. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
  64. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  65. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  66. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  67. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  69. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  70. package/dist/resources/extensions/gsd/paths.js +4 -0
  71. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  72. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  73. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  74. package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
  75. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  76. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  77. package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
  78. package/dist/resources/extensions/gsd/preferences.js +2 -0
  79. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  80. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  83. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  84. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  86. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  87. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  88. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  89. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  90. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  91. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  92. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  93. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  94. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  95. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  96. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
  97. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  98. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  99. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  100. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  101. package/dist/resources/extensions/gsd/state.js +14 -4
  102. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  103. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  104. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  105. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  106. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  107. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  108. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  109. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  110. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  111. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  112. package/dist/resources/extensions/gsd/validation.js +23 -1
  113. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  114. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  115. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  116. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  117. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  118. package/dist/resources/extensions/gsd/worktree-lifecycle.js +83 -19
  119. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  120. package/dist/resources/extensions/gsd/worktree-safety.js +33 -1
  121. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  122. package/dist/resources/extensions/shared/html-shell.js +388 -0
  123. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  124. package/dist/resources/extensions/subagent/index.js +448 -78
  125. package/dist/resources/extensions/subagent/launch.js +77 -0
  126. package/dist/resources/extensions/subagent/run-store.js +148 -0
  127. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  128. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  129. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  130. package/dist/resources/extensions/visual-brief/index.js +5 -0
  131. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  132. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  133. package/dist/resources/skills/forensics/SKILL.md +1 -1
  134. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  135. package/dist/web/standalone/.next/BUILD_ID +1 -1
  136. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  137. package/dist/web/standalone/.next/build-manifest.json +3 -3
  138. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  139. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  140. package/dist/web/standalone/.next/required-server-files.json +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  143. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  151. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  154. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  155. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  156. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  158. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  161. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/index.html +1 -1
  164. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  165. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  167. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  169. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  170. package/dist/web/standalone/.next/server/app/page.js +2 -2
  171. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  174. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  175. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  179. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  180. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  181. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  182. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  183. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  184. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  185. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  186. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  187. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  188. package/dist/web/standalone/server.js +1 -1
  189. package/package.json +4 -4
  190. package/packages/contracts/dist/rpc.test.js +7 -0
  191. package/packages/contracts/dist/rpc.test.js.map +1 -1
  192. package/packages/contracts/dist/workflow.d.ts +21 -0
  193. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  194. package/packages/contracts/dist/workflow.js +24 -0
  195. package/packages/contracts/dist/workflow.js.map +1 -1
  196. package/packages/contracts/src/rpc.test.ts +8 -0
  197. package/packages/contracts/src/workflow.ts +24 -0
  198. package/packages/daemon/package.json +2 -2
  199. package/packages/mcp-server/README.md +13 -4
  200. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  201. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  202. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  203. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  204. package/packages/mcp-server/package.json +2 -2
  205. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  206. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  207. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  208. package/packages/native/package.json +1 -1
  209. package/packages/native/tsconfig.json +2 -1
  210. package/packages/native/tsconfig.tsbuildinfo +1 -1
  211. package/packages/pi-agent-core/package.json +1 -1
  212. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  213. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  214. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  215. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  216. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  217. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  218. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  219. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  220. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  221. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  222. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  223. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  224. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  225. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  226. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  227. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  228. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  229. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  230. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  231. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  232. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  233. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  234. package/packages/pi-ai/package.json +1 -1
  235. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  236. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  237. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  238. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  239. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  240. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  241. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  242. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  243. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  244. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  245. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  246. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  247. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  249. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  251. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  253. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  255. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  257. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  259. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  267. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  269. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  271. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  275. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  277. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  278. package/packages/pi-coding-agent/package.json +1 -1
  279. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  280. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  281. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  282. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  283. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  284. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  285. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  286. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  287. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  288. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  289. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  290. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  291. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  292. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  293. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  294. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  295. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  296. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  297. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  298. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  299. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  300. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  301. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  302. package/packages/pi-tui/dist/terminal.js +12 -0
  303. package/packages/pi-tui/dist/terminal.js.map +1 -1
  304. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  305. package/packages/pi-tui/dist/tui.js +106 -27
  306. package/packages/pi-tui/dist/tui.js.map +1 -1
  307. package/packages/pi-tui/package.json +1 -1
  308. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  309. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  310. package/packages/pi-tui/src/terminal.ts +11 -0
  311. package/packages/pi-tui/src/tui.ts +108 -27
  312. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  313. package/packages/rpc-client/package.json +1 -1
  314. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  315. package/pkg/package.json +1 -1
  316. package/src/resources/GSD-WORKFLOW.md +10 -1
  317. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  318. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  319. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  320. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  321. package/src/resources/extensions/cmux/index.ts +6 -0
  322. package/src/resources/extensions/gsd/auto/contracts.ts +17 -6
  323. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  324. package/src/resources/extensions/gsd/auto/loop.ts +111 -38
  325. package/src/resources/extensions/gsd/auto/orchestrator.ts +13 -2
  326. package/src/resources/extensions/gsd/auto/phases.ts +127 -49
  327. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  328. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  329. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  330. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  331. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  332. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  333. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  334. package/src/resources/extensions/gsd/auto-dispatch.ts +74 -20
  335. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  336. package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
  337. package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
  338. package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
  339. package/src/resources/extensions/gsd/auto-start.ts +99 -12
  340. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  341. package/src/resources/extensions/gsd/auto-verification.ts +124 -42
  342. package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
  343. package/src/resources/extensions/gsd/auto.ts +100 -42
  344. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  345. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  346. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +5 -4
  347. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  348. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  349. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  350. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  351. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  352. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  353. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  354. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  355. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  356. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
  357. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  358. package/src/resources/extensions/gsd/crash-recovery.ts +52 -6
  359. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  360. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  361. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  362. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  363. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  364. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  365. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  366. package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
  367. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  368. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  369. package/src/resources/extensions/gsd/doctor.ts +2 -27
  370. package/src/resources/extensions/gsd/export-html.ts +27 -427
  371. package/src/resources/extensions/gsd/forensics.ts +9 -3
  372. package/src/resources/extensions/gsd/git-service.ts +166 -11
  373. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  374. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  375. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  376. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  377. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  378. package/src/resources/extensions/gsd/journal.ts +8 -1
  379. package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
  380. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  381. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  382. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  383. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  384. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  385. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  386. package/src/resources/extensions/gsd/paths.ts +5 -0
  387. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  388. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  389. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  390. package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
  391. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  392. package/src/resources/extensions/gsd/preferences-types.ts +33 -0
  393. package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
  394. package/src/resources/extensions/gsd/preferences.ts +5 -0
  395. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  396. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  397. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  398. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  399. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  400. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  401. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  402. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  403. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  404. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  405. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  406. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  407. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  408. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  409. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  410. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  411. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  412. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
  413. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  414. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  415. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  416. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  417. package/src/resources/extensions/gsd/state.ts +15 -4
  418. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  419. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  420. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  421. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  422. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  423. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  424. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +300 -1
  425. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +197 -11
  426. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  427. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  428. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  429. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +129 -6
  430. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  431. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  432. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  433. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  434. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  435. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  436. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  437. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  438. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  439. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  440. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  441. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  442. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  443. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  444. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  445. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  446. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  447. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  448. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  449. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
  450. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  451. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  452. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  453. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  454. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  455. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  456. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  457. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  458. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  459. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  460. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  461. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  462. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  463. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  464. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  465. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  466. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  467. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  468. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
  469. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  470. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  471. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  472. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  473. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  474. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  475. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  476. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  477. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  478. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  479. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  480. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  481. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  482. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  483. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  484. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  485. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  486. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  487. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  488. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  489. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  490. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  491. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
  492. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  493. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  494. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  495. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +78 -0
  496. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  497. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  498. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  499. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  500. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  501. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  502. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  503. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +21 -1
  504. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
  505. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  506. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +86 -2
  507. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  508. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  509. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  510. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  511. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  512. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  513. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  514. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  515. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  516. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  517. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  518. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
  519. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  520. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  521. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  522. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  523. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  524. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  525. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  526. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +57 -2
  527. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  528. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +46 -0
  529. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  530. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  531. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  532. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  533. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  534. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  535. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  536. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  537. package/src/resources/extensions/gsd/types.ts +1 -1
  538. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  539. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  540. package/src/resources/extensions/gsd/validation.ts +23 -1
  541. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  542. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  543. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  544. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  545. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  546. package/src/resources/extensions/gsd/worktree-lifecycle.ts +93 -20
  547. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  548. package/src/resources/extensions/gsd/worktree-safety.ts +45 -6
  549. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  550. package/src/resources/extensions/shared/html-shell.ts +412 -0
  551. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  552. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  553. package/src/resources/extensions/subagent/index.ts +567 -103
  554. package/src/resources/extensions/subagent/launch.ts +131 -0
  555. package/src/resources/extensions/subagent/run-store.ts +218 -0
  556. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  557. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  558. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  559. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  560. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  561. package/src/resources/extensions/visual-brief/index.ts +8 -0
  562. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  563. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  564. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  565. package/src/resources/skills/forensics/SKILL.md +1 -1
  566. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  567. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  568. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  569. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  570. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  571. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  572. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  573. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  574. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  575. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  576. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  577. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  578. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  579. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → zCegwxH2e6vLp1vEZLLuZ}/_buildManifest.js +0 -0
  580. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → zCegwxH2e6vLp1vEZLLuZ}/_ssgManifest.js +0 -0
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Main auto-mode execution loop.
1
3
  /**
2
4
  * auto/loop.ts — Main auto-mode execution loop.
3
5
  *
@@ -78,7 +80,10 @@ import { createWorkflowTurnReporter } from "./workflow-turn-reporter.js";
78
80
  import { validateWorkflowSessionLock } from "./workflow-session-lock.js";
79
81
  import { dequeueSidecarItem } from "./workflow-sidecar-queue.js";
80
82
  import { maintainWorkerHeartbeat } from "./workflow-worker-heartbeat.js";
81
- import { measureMemoryPressure } from "./workflow-memory-pressure.js";
83
+ import {
84
+ measureMemoryPressure,
85
+ shouldCheckMemoryPressure,
86
+ } from "./workflow-memory-pressure.js";
82
87
  import { buildSidecarIterationData } from "./workflow-sidecar-iteration.js";
83
88
  import {
84
89
  createExecutionGraphUnitDispatchDeps,
@@ -203,9 +208,9 @@ function logCustomVerifyRetrySaveFailure(err: unknown): void {
203
208
  }
204
209
 
205
210
  // ── Memory pressure monitoring (#3331) ──────────────────────────────────
206
- // Check heap usage every N iterations and trigger graceful shutdown before
207
- // the OS OOM killer sends SIGKILL. The threshold is 90% of the V8 heap
208
- // limit (--max-old-space-size or default ~1.5-4GB depending on platform).
211
+ // Check heap usage on session startup, then every N iterations, and trigger
212
+ // graceful shutdown before the OS OOM killer sends SIGKILL. The threshold is
213
+ // 90% of the V8 heap limit (--max-old-space-size or default ~1.5-4GB depending on platform).
209
214
  const MEMORY_CHECK_INTERVAL = 5; // check every 5 iterations
210
215
  const MAX_CUSTOM_ENGINE_VERIFY_RETRIES = 3;
211
216
 
@@ -281,6 +286,9 @@ export async function autoLoop(
281
286
  recentUnits: persisted.recentUnits,
282
287
  stuckRecoveryAttempts: persisted.stuckRecoveryAttempts,
283
288
  consecutiveFinalizeTimeouts: 0,
289
+ consecutiveDispatchCount: new Map<string, number>(),
290
+ lastDispatchedKey: null,
291
+ lastDispatchPhase: null,
284
292
  };
285
293
  let consecutiveErrors = 0;
286
294
  let consecutiveCooldowns = 0;
@@ -372,7 +380,7 @@ export async function autoLoop(
372
380
 
373
381
  // ── Memory pressure check (#3331) ──
374
382
  // Graceful shutdown before OOM killer sends SIGKILL.
375
- if (iteration % MEMORY_CHECK_INTERVAL === 0) {
383
+ if (shouldCheckMemoryPressure(iteration, MEMORY_CHECK_INTERVAL)) {
376
384
  const mem = measureMemoryPressure();
377
385
  debugLog("autoLoop", { phase: "memory-check", ...mem });
378
386
  const memoryDecision = decideMemoryPressure({ ...mem, iteration });
@@ -418,9 +426,11 @@ export async function autoLoop(
418
426
  logIterationComplete: () => debugLog("autoLoop", { phase: "iteration-complete", iteration }),
419
427
  });
420
428
  };
429
+ let stuckStatePersistedThisIteration = false;
421
430
  const finishIncompleteIteration = (details: Record<string, unknown>): void => {
422
431
  emitIterationEnd(details);
423
432
  saveStuckState(s, loopState);
433
+ stuckStatePersistedThisIteration = true;
424
434
  };
425
435
 
426
436
  try {
@@ -726,42 +736,88 @@ export async function autoLoop(
726
736
  }
727
737
 
728
738
  if (!sidecarItem) {
729
- // ── Phase 1: Pre-dispatch ─────────────────────────────────────────
730
- const preDispatchResult = await runPreDispatch(ic, loopState);
731
- phaseReporter.report("pre-dispatch", preDispatchResult.action);
732
- if (preDispatchResult.action === "break") {
733
- finishTurn("stopped", "manual-attention", "pre-dispatch-break");
734
- break;
735
- }
736
- if (preDispatchResult.action === "continue") {
737
- finishTurn("skipped");
738
- continue;
739
- }
739
+ const orchestration = s.orchestration;
740
+ if (orchestration) {
741
+ const orchestrationResult = await orchestration.advance();
740
742
 
741
- const preData = preDispatchResult.data;
743
+ if (orchestrationResult.kind === "blocked") {
744
+ s.pendingOrchestrationDispatch = null;
745
+ if (orchestrationResult.action === "pause") {
746
+ await deps.pauseAuto(ctx, pi, {
747
+ message: orchestrationResult.reason,
748
+ category: "unknown",
749
+ });
750
+ } else {
751
+ await deps.stopAuto(ctx, pi, orchestrationResult.reason);
752
+ }
753
+ finishTurn("stopped", "manual-attention", "orchestration-blocked");
754
+ break;
755
+ }
742
756
 
743
- // ── Phase 2: Guards ───────────────────────────────────────────────
744
- const guardsResult = await runGuards(ic, preData.mid);
745
- phaseReporter.report("guard", guardsResult.action);
746
- if (guardsResult.action === "break") {
747
- finishTurn("stopped", "manual-attention", "guard-break");
748
- break;
749
- }
757
+ if (orchestrationResult.kind === "stopped") {
758
+ s.pendingOrchestrationDispatch = null;
759
+ await deps.stopAuto(ctx, pi, orchestrationResult.reason);
760
+ finishTurn("stopped", "manual-attention", "orchestration-stopped");
761
+ break;
762
+ }
750
763
 
751
- // ── Phase 3: Dispatch ─────────────────────────────────────────────
752
- const dispatchResult = await runDispatch(ic, preData, loopState);
753
- phaseReporter.report("dispatch", dispatchResult.action);
754
- if (dispatchResult.action === "break") {
755
- finishTurn("stopped", "manual-attention", "dispatch-break");
756
- break;
757
- }
758
- if (dispatchResult.action === "continue") {
759
- finishTurn("skipped");
760
- continue;
764
+ if (orchestrationResult.kind !== "advanced") {
765
+ s.pendingOrchestrationDispatch = null;
766
+ finishTurn("skipped");
767
+ continue;
768
+ }
769
+ const pendingDispatch = s.pendingOrchestrationDispatch;
770
+ iterData = {
771
+ unitType: pendingDispatch?.unitType ?? orchestrationResult.unit.unitType,
772
+ unitId: pendingDispatch?.unitId ?? orchestrationResult.unit.unitId,
773
+ prompt: pendingDispatch?.prompt ?? "",
774
+ finalPrompt: pendingDispatch?.prompt ?? "",
775
+ pauseAfterUatDispatch: pendingDispatch?.pauseAfterUatDispatch ?? false,
776
+ state: pendingDispatch?.state ?? orchestrationResult.stateSnapshot,
777
+ mid: pendingDispatch?.mid ?? s.currentMilestoneId ?? "workflow",
778
+ midTitle: pendingDispatch?.midTitle ?? orchestrationResult.stateSnapshot.activeMilestone?.title ?? "Workflow",
779
+ isRetry: false,
780
+ previousTier: undefined,
781
+ };
782
+ s.pendingOrchestrationDispatch = null;
783
+ phaseReporter.report("dispatch", "next", {
784
+ unitType: iterData.unitType,
785
+ unitId: iterData.unitId,
786
+ });
787
+ observedUnitType = iterData.unitType;
788
+ observedUnitId = iterData.unitId;
789
+ } else {
790
+ const preDispatchResult = await runPreDispatch(ic, loopState);
791
+ phaseReporter.report("pre-dispatch", preDispatchResult.action);
792
+ if (preDispatchResult.action === "break") {
793
+ finishTurn("stopped", "manual-attention", "pre-dispatch-break");
794
+ break;
795
+ }
796
+ if (preDispatchResult.action === "continue") {
797
+ finishTurn("skipped");
798
+ continue;
799
+ }
800
+ const preData = preDispatchResult.data;
801
+ const guardsResult = await runGuards(ic, preData.mid);
802
+ phaseReporter.report("guard", guardsResult.action);
803
+ if (guardsResult.action === "break") {
804
+ finishTurn("stopped", "manual-attention", "guard-break");
805
+ break;
806
+ }
807
+ const dispatchResult = await runDispatch(ic, preData, loopState);
808
+ phaseReporter.report("dispatch", dispatchResult.action);
809
+ if (dispatchResult.action === "break") {
810
+ finishTurn("stopped", "manual-attention", "dispatch-break");
811
+ break;
812
+ }
813
+ if (dispatchResult.action === "continue") {
814
+ finishTurn("skipped");
815
+ continue;
816
+ }
817
+ iterData = dispatchResult.data;
818
+ observedUnitType = iterData.unitType;
819
+ observedUnitId = iterData.unitId;
761
820
  }
762
- iterData = dispatchResult.data;
763
- observedUnitType = iterData.unitType;
764
- observedUnitId = iterData.unitId;
765
821
  } else {
766
822
  iterData = await buildSidecarIterationData({
767
823
  sidecarItem,
@@ -942,11 +998,18 @@ export async function autoLoop(
942
998
  unitId: iterData.unitId,
943
999
  });
944
1000
  const finalizeReason = finalizeResult.action === "break" ? finalizeResult.reason : undefined;
1001
+ const finalizeStatus = finalizeReason === "step-wizard"
1002
+ ? "completed"
1003
+ : finalizeResult.action === "next"
1004
+ ? "completed"
1005
+ : finalizeResult.action === "continue"
1006
+ ? "retry"
1007
+ : "stopped";
945
1008
  journalReporter.emit("post-unit-finalize-end", {
946
1009
  iteration,
947
1010
  unitType: iterData.unitType,
948
1011
  unitId: iterData.unitId,
949
- status: finalizeResult.action === "next" ? "completed" : finalizeResult.action === "continue" ? "retry" : "stopped",
1012
+ status: finalizeStatus,
950
1013
  action: finalizeResult.action,
951
1014
  ...(finalizeReason ? { reason: finalizeReason } : {}),
952
1015
  });
@@ -980,6 +1043,7 @@ export async function autoLoop(
980
1043
  finishIncompleteIteration({
981
1044
  status: "retry",
982
1045
  reason: "finalize-retry",
1046
+ retry: true,
983
1047
  unitType: iterData.unitType,
984
1048
  unitId: iterData.unitId,
985
1049
  });
@@ -992,7 +1056,12 @@ export async function autoLoop(
992
1056
  logWriteFailure: logDispatchLedgerWriteFailure,
993
1057
  }) || dispatchSettled;
994
1058
  completeIteration();
1059
+ stuckStatePersistedThisIteration = true;
995
1060
  finishTurn("completed");
1061
+ if (finalizeDecision.action === "complete-and-break") {
1062
+ s.preserveStepSurfaceAfterLoopExit = true;
1063
+ break;
1064
+ }
996
1065
  } catch (loopErr) {
997
1066
  // ── Blanket catch: absorb unexpected exceptions, apply graduated recovery ──
998
1067
  const msg = loopErr instanceof Error ? loopErr.message : String(loopErr);
@@ -1139,6 +1208,10 @@ export async function autoLoop(
1139
1208
  ctx.ui.notify(errorDecision.notifyMessage, "warning");
1140
1209
  }
1141
1210
  finishTurn(errorDecision.turnStatus, "execution", msg);
1211
+ } finally {
1212
+ if (!stuckStatePersistedThisIteration) {
1213
+ saveStuckState(s, loopState);
1214
+ }
1142
1215
  }
1143
1216
  }
1144
1217
 
@@ -54,7 +54,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
54
54
  rationale: "resource version guard blocked dispatch",
55
55
  findings: staleMsg,
56
56
  });
57
- const blocked: AutoAdvanceResult = { kind: "blocked", reason: staleMsg, action: "stop" };
57
+ const blocked: AutoAdvanceResult = { kind: "blocked", reason: staleMsg, action: "pause" };
58
58
  await this.deps.runtime.journalTransition({ name: "advance-blocked", reason: blocked.reason });
59
59
  await this.deps.health.postAdvanceRecord(blocked);
60
60
  return blocked;
@@ -128,6 +128,17 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
128
128
  await this.deps.health.postAdvanceRecord(stopped);
129
129
  return stopped;
130
130
  }
131
+ if (!("unitType" in decision)) {
132
+ const blocked: AutoAdvanceResult = {
133
+ kind: "blocked",
134
+ reason: decision.reason,
135
+ action: decision.action,
136
+ stateSnapshot: reconciliation.stateSnapshot,
137
+ };
138
+ await this.deps.runtime.journalTransition({ name: "advance-blocked", reason: blocked.reason });
139
+ await this.deps.health.postAdvanceRecord(blocked);
140
+ return blocked;
141
+ }
131
142
 
132
143
  const nextKey = `${decision.unitType}:${decision.unitId}`;
133
144
 
@@ -148,7 +159,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
148
159
  // stuck-loop for the saturated-window case.
149
160
  const matchingCount = this.dispatchKeyWindow.filter((k) => k === nextKey).length;
150
161
  if (this.lastAdvanceKey === nextKey && matchingCount < STUCK_WINDOW_SIZE) {
151
- const blocked: AutoAdvanceResult = { kind: "blocked", reason: "idempotent advance: unit already active", action: "stop" };
162
+ const blocked: AutoAdvanceResult = { kind: "blocked", reason: "idempotent advance: unit already active", action: "pause" };
152
163
  await this.deps.runtime.journalTransition({
153
164
  name: "advance-blocked",
154
165
  reason: blocked.reason,
@@ -77,6 +77,8 @@ import { resolveManifest } from "../unit-context-manifest.js";
77
77
  import { createWorktreeSafetyModule, type WorktreeSafetyResult } from "../worktree-safety.js";
78
78
  import { isSuspiciousGhostCompletion } from "../auto-unit-closeout.js";
79
79
  import { decideVerificationRetry, verificationRetryKey } from "./verification-retry-policy.js";
80
+ import { buildPhaseHandoffOutcome, setAutoOutcomeWidget } from "../auto-dashboard.js";
81
+ import { getConsecutiveDispatchBlocker } from "../dispatch-guard.js";
80
82
 
81
83
  // ─── Path Comparison Helper ───────────────────────────────────────────────
82
84
  /** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
@@ -155,6 +157,13 @@ function formatWorktreeSafetyFailure(result: Extract<WorktreeSafetyResult, { ok:
155
157
  return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
156
158
  }
157
159
 
160
+ function formatWorktreeSafetyStopReason(result: Extract<WorktreeSafetyResult, { ok: false }>): string {
161
+ if (result.kind === "empty-worktree-with-project-content") {
162
+ return `Worktree Safety failed (${result.kind}). Run /gsd doctor fix, then /gsd auto.`;
163
+ }
164
+ return `Worktree Safety failed (${result.kind}).`;
165
+ }
166
+
158
167
  function resolveEmptyWorktreeWithProjectContent(
159
168
  unitRoot: string,
160
169
  projectRoot: string,
@@ -237,7 +246,7 @@ async function validateSourceWriteWorktreeSafety(
237
246
  projectRoot,
238
247
  });
239
248
  ctx.ui.notify(msg, "error");
240
- await deps.stopAuto(ctx, pi, msg);
249
+ await deps.stopAuto(ctx, pi, formatWorktreeSafetyStopReason(result));
241
250
  return { action: "break", reason: result.kind };
242
251
  }
243
252
 
@@ -567,6 +576,13 @@ export function _buildCancelledUnitStopReason(
567
576
  };
568
577
  }
569
578
 
579
+ export function _isPauseOriginCancelledResult(
580
+ isPaused: boolean,
581
+ errorContext?: { message: string; category: string },
582
+ ): boolean {
583
+ return isPaused && !errorContext;
584
+ }
585
+
570
586
  async function failClosedOnFinalizeTimeout(
571
587
  ic: IterationContext,
572
588
  iterData: IterationData,
@@ -1327,9 +1343,15 @@ export async function runDispatch(
1327
1343
  }
1328
1344
 
1329
1345
  const guardBasePath = _resolveDispatchGuardBasePath(s);
1346
+ let mainBranch = "main";
1347
+ try {
1348
+ mainBranch = deps.getMainBranch(guardBasePath);
1349
+ } catch (err) {
1350
+ debugLog("autoLoop", { phase: "getMainBranch-failed", error: String(err) });
1351
+ }
1330
1352
  const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
1331
1353
  guardBasePath,
1332
- deps.getMainBranch(guardBasePath),
1354
+ mainBranch,
1333
1355
  unitType,
1334
1356
  unitId,
1335
1357
  );
@@ -1339,6 +1361,18 @@ export async function runDispatch(
1339
1361
  return { action: "break", reason: "prior-slice-blocker" };
1340
1362
  }
1341
1363
 
1364
+ const consecutiveDispatchBlocker = getConsecutiveDispatchBlocker(
1365
+ loopState,
1366
+ state.phase,
1367
+ unitType,
1368
+ unitId,
1369
+ );
1370
+ if (consecutiveDispatchBlocker) {
1371
+ await deps.stopAuto(ctx, pi, consecutiveDispatchBlocker);
1372
+ debugLog("autoLoop", { phase: "exit", reason: "consecutive-dispatch-blocker" });
1373
+ return { action: "break", reason: "consecutive-dispatch-blocker" };
1374
+ }
1375
+
1342
1376
  const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(
1343
1377
  ic,
1344
1378
  unitType,
@@ -1412,7 +1446,6 @@ export async function runDispatch(
1412
1446
  );
1413
1447
  deps.invalidateAllCaches();
1414
1448
  loopState.recentUnits.length = 0;
1415
- loopState.stuckRecoveryAttempts = 0;
1416
1449
  return { action: "continue" };
1417
1450
  }
1418
1451
  ctx.ui.notify(
@@ -1796,42 +1829,8 @@ export async function runUnitPhase(
1796
1829
  s.currentUnit.id === unitId
1797
1830
  );
1798
1831
  const previousTier = s.currentUnitRouting?.tier;
1799
-
1800
- // Scope workflow-logger buffer to this unit so post-finalize drains are
1801
- // per-unit. Without this, the module-level _buffer accumulates across every
1802
- // unit in the same Node process (see workflow-logger.ts module header).
1803
- _resetLogs();
1804
1832
  const dispatchKey = `${unitType}/${unitId}`;
1805
- s.unitDispatchCount.set(dispatchKey, (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1);
1806
- s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
1807
- s.lastGitActionFailure = null;
1808
- s.lastGitActionStatus = null;
1809
- s.lastUnitAgentEndMessages = null;
1810
- setCurrentPhase(unitType, {
1811
- basePath: s.basePath,
1812
- traceId: ic.flowId,
1813
- turnId: `iter-${ic.iteration}`,
1814
- causedBy: "unit-start",
1815
- });
1816
- s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
1817
- const unitStartSeq = ic.nextSeq();
1818
- deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
1819
- deps.captureAvailableSkills();
1820
- writeUnitRuntimeRecord(
1821
- s.basePath,
1822
- unitType,
1823
- unitId,
1824
- s.currentUnit.startedAt,
1825
- {
1826
- phase: "dispatched",
1827
- wrapupWarningSent: false,
1828
- timeoutAt: null,
1829
- lastProgressAt: s.currentUnit.startedAt,
1830
- progressCount: 0,
1831
- lastProgressKind: "dispatch",
1832
- recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
1833
- },
1834
- );
1833
+ const nextDispatchCount = (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1;
1835
1834
 
1836
1835
  // Status bar (widget + preconditions deferred until after model selection — see #2899)
1837
1836
  ctx.ui.setStatus("gsd-auto", "auto");
@@ -1894,7 +1893,7 @@ export async function runUnitPhase(
1894
1893
  : s.pendingCrashRecovery;
1895
1894
  finalPrompt = `${capped}\n\n---\n\n${finalPrompt}`;
1896
1895
  s.pendingCrashRecovery = null;
1897
- } else if ((s.unitDispatchCount.get(dispatchKey) ?? 0) > 1) {
1896
+ } else if (nextDispatchCount > 1) {
1898
1897
  const diagnostic = deps.getDeepDiagnostic(s.basePath);
1899
1898
  if (diagnostic) {
1900
1899
  const cappedDiag =
@@ -1937,6 +1936,11 @@ export async function runUnitPhase(
1937
1936
  }
1938
1937
 
1939
1938
  // Select and apply model (with tier escalation on retry — normal units only)
1939
+ const prevUnitRouting = s.currentUnitRouting;
1940
+ const prevUnitModel = s.currentUnitModel;
1941
+ const prevDispatchedModelId = s.currentDispatchedModelId;
1942
+ const prevSessionModel = ctx.model;
1943
+ const prevSessionThinkingLevel = pi.getThinkingLevel();
1940
1944
  const modelResult = await deps.selectAndApplyModel(
1941
1945
  ctx,
1942
1946
  pi,
@@ -2003,14 +2007,67 @@ export async function runUnitPhase(
2003
2007
  ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
2004
2008
  : undefined,
2005
2009
  baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
2010
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
2006
2011
  },
2007
2012
  );
2008
2013
  if (compatibilityError) {
2014
+ s.currentUnitRouting = prevUnitRouting;
2015
+ s.currentUnitModel = prevUnitModel;
2016
+ s.currentDispatchedModelId = prevDispatchedModelId;
2017
+ if (s.checkpointSha) {
2018
+ cleanupCheckpoint(s.basePath, unitId);
2019
+ s.checkpointSha = null;
2020
+ }
2021
+ if (prevSessionModel) {
2022
+ const ok = await pi.setModel(prevSessionModel, { persist: false });
2023
+ if (!ok) {
2024
+ ctx.ui.notify("Failed to restore previous session model after compatibility check failure.", "warning");
2025
+ }
2026
+ if (prevSessionThinkingLevel) {
2027
+ pi.setThinkingLevel(prevSessionThinkingLevel);
2028
+ }
2029
+ }
2009
2030
  ctx.ui.notify(compatibilityError, "error");
2010
2031
  await deps.stopAuto(ctx, pi, compatibilityError);
2011
2032
  return { action: "break", reason: "workflow-capability" };
2012
2033
  }
2013
2034
 
2035
+ // Scope workflow-logger buffer to this unit so post-finalize drains are
2036
+ // per-unit. Without this, the module-level _buffer accumulates across every
2037
+ // unit in the same Node process (see workflow-logger.ts module header).
2038
+ _resetLogs();
2039
+ const unitStartedAt = Date.now();
2040
+ s.unitDispatchCount.set(dispatchKey, nextDispatchCount);
2041
+ s.currentUnit = { type: unitType, id: unitId, startedAt: unitStartedAt };
2042
+ s.lastGitActionFailure = null;
2043
+ s.lastGitActionStatus = null;
2044
+ s.lastUnitAgentEndMessages = null;
2045
+ setCurrentPhase(unitType, {
2046
+ basePath: s.basePath,
2047
+ traceId: ic.flowId,
2048
+ turnId: `iter-${ic.iteration}`,
2049
+ causedBy: "unit-start",
2050
+ });
2051
+ s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
2052
+ const unitStartSeq = ic.nextSeq();
2053
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
2054
+ deps.captureAvailableSkills();
2055
+ writeUnitRuntimeRecord(
2056
+ s.basePath,
2057
+ unitType,
2058
+ unitId,
2059
+ unitStartedAt,
2060
+ {
2061
+ phase: "dispatched",
2062
+ wrapupWarningSent: false,
2063
+ timeoutAt: null,
2064
+ lastProgressAt: unitStartedAt,
2065
+ progressCount: 0,
2066
+ lastProgressKind: "dispatch",
2067
+ recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
2068
+ },
2069
+ );
2070
+
2014
2071
  // Progress widget + preconditions — deferred to after model selection so the
2015
2072
  // widget's first render tick shows the correct model (#2899).
2016
2073
  deps.updateProgressWidget(ctx, unitType, unitId, state);
@@ -2125,6 +2182,11 @@ export async function runUnitPhase(
2125
2182
  }
2126
2183
 
2127
2184
  if (unitResult.status === "cancelled") {
2185
+ if (_isPauseOriginCancelledResult(s.paused, unitResult.errorContext)) {
2186
+ debugLog("autoLoop", { phase: "cancelled-after-pause", unitType, unitId });
2187
+ return { action: "break", reason: "paused" };
2188
+ }
2189
+
2128
2190
  const errorCategory = unitResult.errorContext?.category;
2129
2191
  // Provider-error pause: agent_end recovery normally pauses before this
2130
2192
  // branch. Provider readiness failures happen before dispatch, so pause here
@@ -2328,18 +2390,17 @@ export async function runUnitPhase(
2328
2390
  }
2329
2391
  }
2330
2392
 
2393
+ const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
2394
+ const artifactVerified =
2395
+ skipArtifactVerification ||
2396
+ verifyExpectedArtifact(unitType, unitId, s.basePath);
2331
2397
  if (s.currentUnitRouting) {
2332
2398
  deps.recordOutcome(
2333
2399
  unitType,
2334
2400
  s.currentUnitRouting.tier as "light" | "standard" | "heavy",
2335
- true, // success assumed; dispatch will re-dispatch if artifact missing
2401
+ artifactVerified,
2336
2402
  );
2337
2403
  }
2338
-
2339
- const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
2340
- const artifactVerified =
2341
- skipArtifactVerification ||
2342
- verifyExpectedArtifact(unitType, unitId, s.basePath);
2343
2404
  if (artifactVerified) {
2344
2405
  s.unitDispatchCount.delete(dispatchKey);
2345
2406
  s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
@@ -2364,7 +2425,11 @@ export async function runUnitPhase(
2364
2425
  }
2365
2426
  }
2366
2427
 
2367
- deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitResult.status, artifactVerified, ...(unitResult.errorContext ? { errorContext: unitResult.errorContext } : {}) }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
2428
+ const unitEndStatus =
2429
+ !artifactVerified && unitResult.status === "completed"
2430
+ ? "no-artifact"
2431
+ : unitResult.status;
2432
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitEndStatus, artifactVerified, ...(unitResult.errorContext ? { errorContext: unitResult.errorContext } : {}) }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
2368
2433
 
2369
2434
  // ── Safety harness: checkpoint cleanup or rollback ──
2370
2435
  if (s.checkpointSha) {
@@ -2439,6 +2504,8 @@ export async function runFinalize(
2439
2504
  const preUnitSnapshot = s.currentUnit
2440
2505
  ? { type: s.currentUnit.type, id: s.currentUnit.id, startedAt: s.currentUnit.startedAt }
2441
2506
  : null;
2507
+ s.currentUnit = null;
2508
+ clearCurrentPhase();
2442
2509
  const preResultGuard = await withTimeout(
2443
2510
  deps.postUnitPreVerification(postUnitCtx, preVerificationOpts),
2444
2511
  FINALIZE_PRE_TIMEOUT_MS,
@@ -2596,10 +2663,21 @@ export async function runFinalize(
2596
2663
  lastProgressAt: Date.now(),
2597
2664
  lastProgressKind: "finalize-success",
2598
2665
  });
2666
+ if (
2667
+ !preUnitSnapshot.type.startsWith("hook/") &&
2668
+ preUnitSnapshot.type !== "custom-step" &&
2669
+ preUnitSnapshot.type !== "complete-milestone"
2670
+ ) {
2671
+ setAutoOutcomeWidget(ctx, {
2672
+ ...buildPhaseHandoffOutcome({
2673
+ unitType: preUnitSnapshot.type,
2674
+ unitId: preUnitSnapshot.id,
2675
+ agentEndMessages: s.lastUnitAgentEndMessages,
2676
+ }),
2677
+ startedAt: s.autoStartTime,
2678
+ });
2679
+ }
2599
2680
  }
2600
- s.currentUnit = null;
2601
- clearCurrentPhase();
2602
-
2603
2681
  // Surface accumulated workflow-logger issues for this unit to the user.
2604
2682
  // Warnings/errors logged during the unit are buffered in the logger and
2605
2683
  // drained here so the user sees a single consolidated post-unit alert.
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Mutable auto-mode session state container.
1
3
  /**
2
4
  * AutoSession — encapsulates all mutable auto-mode state into a single instance.
3
5
  *
@@ -52,6 +54,16 @@ export interface PendingVerificationRetry {
52
54
  attempt: number;
53
55
  }
54
56
 
57
+ export interface PendingOrchestrationDispatch {
58
+ unitType: string;
59
+ unitId: string;
60
+ prompt: string;
61
+ pauseAfterUatDispatch: boolean;
62
+ state: import("../types.js").GSDState;
63
+ mid: string | undefined;
64
+ midTitle: string | undefined;
65
+ }
66
+
55
67
  /**
56
68
  * A typed item enqueued by postUnitPostVerification for the main loop to
57
69
  * drain via the standard runUnit path. Replaces inline dispatch
@@ -89,6 +101,7 @@ export class AutoSession {
89
101
  active = false;
90
102
  paused = false;
91
103
  completionStopInProgress = false;
104
+ preserveStepSurfaceAfterLoopExit = false;
92
105
  stepMode = false;
93
106
  verbose = false;
94
107
  activeEngineId: string | null = null;
@@ -241,6 +254,7 @@ export class AutoSession {
241
254
 
242
255
  // ── Orchestration seam ───────────────────────────────────────────────────
243
256
  orchestration: AutoOrchestrationModule | null = null;
257
+ pendingOrchestrationDispatch: PendingOrchestrationDispatch | null = null;
244
258
 
245
259
  // ── Loop promise state ──────────────────────────────────────────────────
246
260
  // Per-unit resolve function and session-switch guard live at module level
@@ -289,6 +303,7 @@ export class AutoSession {
289
303
  this.active = false;
290
304
  this.paused = false;
291
305
  this.completionStopInProgress = false;
306
+ this.preserveStepSurfaceAfterLoopExit = false;
292
307
  this.stepMode = false;
293
308
  this.verbose = false;
294
309
  this.activeEngineId = null;
@@ -372,6 +387,7 @@ export class AutoSession {
372
387
 
373
388
  // Orchestration seam
374
389
  this.orchestration = null;
390
+ this.pendingOrchestrationDispatch = null;
375
391
 
376
392
  // Loop promise state lives in auto-loop.ts module scope
377
393
  }
@@ -97,6 +97,9 @@ export interface LoopState {
97
97
  stuckRecoveryAttempts: number;
98
98
  /** Consecutive finalize timeout count — stops auto-mode after threshold. */
99
99
  consecutiveFinalizeTimeouts: number;
100
+ consecutiveDispatchCount?: Map<string, number>;
101
+ lastDispatchedKey?: string | null;
102
+ lastDispatchPhase?: string | null;
100
103
  }
101
104
 
102
105
  /** Max consecutive finalize timeouts before hard-stopping auto-mode. */
@@ -9,7 +9,11 @@ export function isInternalSessionTransitionAbortEvent(
9
9
  }
10
10
 
11
11
  export function shouldIgnoreAgentEndForActiveUnit(
12
- event: Pick<AgentEndEvent, "abortOrigin">,
12
+ event: Pick<AgentEndEvent, "abortOrigin" | "messages">,
13
13
  ): boolean {
14
- return isInternalSessionTransitionAbortEvent(event);
14
+ if (!isInternalSessionTransitionAbortEvent(event)) return false;
15
+ const lastMsg = event.messages[event.messages.length - 1];
16
+ if (!lastMsg || typeof lastMsg !== "object") return true;
17
+ const stopReason = (lastMsg as { stopReason?: unknown }).stopReason;
18
+ return stopReason === "aborted" || stopReason === "error";
15
19
  }
@@ -48,7 +48,8 @@ export type FinalizeDecision =
48
48
  action: "retry";
49
49
  ledgerErrorSummary: "finalize-retry";
50
50
  }
51
- | { action: "complete" };
51
+ | { action: "complete" }
52
+ | { action: "complete-and-break" };
52
53
 
53
54
  export type EngineReconcileInput =
54
55
  | { outcome: "milestone-complete" }
@@ -278,6 +279,9 @@ export function decideEngineDispatch(input: EngineDispatchInput): EngineDispatch
278
279
  export function decideFinalizeResult(input: FinalizeInput): FinalizeDecision {
279
280
  if (input.action === "break") {
280
281
  const reason = input.reason ?? "unknown";
282
+ if (reason === "step-wizard") {
283
+ return { action: "complete-and-break" };
284
+ }
281
285
  return {
282
286
  action: "stop",
283
287
  failureClass: reason === "git-closeout-failure" ? "git" : "closeout",