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
@@ -56,7 +56,7 @@ import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationS
56
56
  import { writeUnitRuntimeRecord } from "../unit-runtime.js";
57
57
  import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "./finalize-timeout.js";
58
58
  import { getEligibleSlices } from "../slice-parallel-eligibility.js";
59
- import { startSliceParallel } from "../slice-parallel-orchestrator.js";
59
+ import { isSliceParallelActive, startSliceParallel } from "../slice-parallel-orchestrator.js";
60
60
  import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
61
61
  import { reconcileBeforeSpawn } from "../state-reconciliation.js";
62
62
  import type { MinimalModelRegistry } from "../context-budget.js";
@@ -77,6 +77,10 @@ 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";
82
+
83
+ export const STUCK_WINDOW_SIZE = 6;
80
84
 
81
85
  // ─── Path Comparison Helper ───────────────────────────────────────────────
82
86
  /** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
@@ -146,7 +150,12 @@ export function shouldDegradeEmptyWorktreeToProjectRoot(
146
150
  }
147
151
 
148
152
  function unitWritesSource(unitType: string): boolean | null {
149
- const manifest = resolveManifest(unitType);
153
+ // Backward compatibility: sidecar queues from older builds may persist
154
+ // prefixed unit types (e.g. "sidecar/quick-task").
155
+ const normalizedUnitType = unitType.startsWith("sidecar/")
156
+ ? unitType.slice("sidecar/".length)
157
+ : unitType;
158
+ const manifest = resolveManifest(normalizedUnitType);
150
159
  if (!manifest) return null;
151
160
  return manifest.tools.mode === "all" || manifest.tools.mode === "docs";
152
161
  }
@@ -155,6 +164,13 @@ function formatWorktreeSafetyFailure(result: Extract<WorktreeSafetyResult, { ok:
155
164
  return `Worktree Safety failed (${result.kind}): ${result.reason} ${result.remediation}`;
156
165
  }
157
166
 
167
+ function formatWorktreeSafetyStopReason(result: Extract<WorktreeSafetyResult, { ok: false }>): string {
168
+ if (result.kind === "empty-worktree-with-project-content") {
169
+ return `Worktree Safety failed (${result.kind}). Run /gsd doctor fix, then /gsd auto.`;
170
+ }
171
+ return `Worktree Safety failed (${result.kind}).`;
172
+ }
173
+
158
174
  function resolveEmptyWorktreeWithProjectContent(
159
175
  unitRoot: string,
160
176
  projectRoot: string,
@@ -203,7 +219,8 @@ async function validateSourceWriteWorktreeSafety(
203
219
  if (!writesSource) return null;
204
220
 
205
221
  const projectRoot = s.canonicalProjectRoot ?? resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
206
- if (deps.getIsolationMode(projectRoot) !== "worktree") return null;
222
+ const isolationMode = deps.getIsolationMode(projectRoot);
223
+ if (isolationMode !== "worktree") return null;
207
224
 
208
225
  const safety = createWorktreeSafetyModule();
209
226
  const result = safety.validateUnitRoot({
@@ -213,6 +230,7 @@ async function validateSourceWriteWorktreeSafety(
213
230
  projectRoot,
214
231
  unitRoot: s.basePath,
215
232
  milestoneId,
233
+ isolationMode,
216
234
  expectedBranch: milestoneId ? deps.autoWorktreeBranch(milestoneId) : null,
217
235
  emptyWorktreeWithProjectContent: resolveEmptyWorktreeWithProjectContent(s.basePath, projectRoot),
218
236
  lease: s.workerId
@@ -237,7 +255,7 @@ async function validateSourceWriteWorktreeSafety(
237
255
  projectRoot,
238
256
  });
239
257
  ctx.ui.notify(msg, "error");
240
- await deps.stopAuto(ctx, pi, msg);
258
+ await deps.stopAuto(ctx, pi, formatWorktreeSafetyStopReason(result));
241
259
  return { action: "break", reason: result.kind };
242
260
  }
243
261
 
@@ -567,6 +585,13 @@ export function _buildCancelledUnitStopReason(
567
585
  };
568
586
  }
569
587
 
588
+ export function _isPauseOriginCancelledResult(
589
+ isPaused: boolean,
590
+ errorContext?: { message: string; category: string },
591
+ ): boolean {
592
+ return isPaused && !errorContext;
593
+ }
594
+
570
595
  async function failClosedOnFinalizeTimeout(
571
596
  ic: IterationContext,
572
597
  iterData: IterationData,
@@ -859,6 +884,12 @@ export async function runPreDispatch(
859
884
  isDbAvailable()
860
885
  ) {
861
886
  try {
887
+ const projectRoot = _resolveDispatchGuardBasePath(s);
888
+ if (isSliceParallelActive(projectRoot)) {
889
+ ctx.ui.notify("Slice-parallel: workers are still running; waiting for completion before next dispatch.", "info");
890
+ await new Promise<void>((resolve) => setTimeout(resolve, 1000));
891
+ return { action: "continue" };
892
+ }
862
893
  const dbSlices = getMilestoneSlices(mid);
863
894
  if (dbSlices.length > 0) {
864
895
  const doneIds = new Set(dbSlices.filter(sl => sl.status === "complete" || sl.status === "done").map(sl => sl.id));
@@ -881,7 +912,7 @@ export async function runPreDispatch(
881
912
  );
882
913
  // ADR-017 #5707: reconcile before spawning so each worker doesn't
883
914
  // independently race on the same drift. Failure aborts the spawn.
884
- const spawnGate = await reconcileBeforeSpawn(s.basePath);
915
+ const spawnGate = await reconcileBeforeSpawn(projectRoot);
885
916
  if (!spawnGate.ok) {
886
917
  ctx.ui.notify(
887
918
  `Slice-parallel: aborting spawn — ${spawnGate.reason}`,
@@ -890,7 +921,7 @@ export async function runPreDispatch(
890
921
  return { action: "break", reason: `slice-parallel-reconciliation-failed: ${spawnGate.reason}` };
891
922
  }
892
923
  const result = await startSliceParallel(
893
- s.basePath,
924
+ projectRoot,
894
925
  mid,
895
926
  eligible,
896
927
  {
@@ -903,8 +934,7 @@ export async function runPreDispatch(
903
934
  `Slice-parallel: started ${result.started.length} worker(s): ${result.started.join(", ")}.`,
904
935
  "info",
905
936
  );
906
- await deps.stopAuto(ctx, pi, `Slice-parallel dispatched for ${mid}`);
907
- return { action: "break", reason: "slice-parallel-dispatched" };
937
+ return { action: "continue" };
908
938
  }
909
939
  // Fall through to sequential if no workers started
910
940
  }
@@ -1232,7 +1262,6 @@ export async function runDispatch(
1232
1262
  ): Promise<PhaseResult<IterationData>> {
1233
1263
  const { ctx, pi, s, deps, prefs } = ic;
1234
1264
  const { state, mid, midTitle } = preData;
1235
- const STUCK_WINDOW_SIZE = 6;
1236
1265
  const provider = ctx.model?.provider;
1237
1266
  const authMode = provider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
1238
1267
  ? ctx.modelRegistry.getProviderAuthMode(provider)
@@ -1327,9 +1356,15 @@ export async function runDispatch(
1327
1356
  }
1328
1357
 
1329
1358
  const guardBasePath = _resolveDispatchGuardBasePath(s);
1359
+ let mainBranch = "main";
1360
+ try {
1361
+ mainBranch = deps.getMainBranch(guardBasePath);
1362
+ } catch (err) {
1363
+ debugLog("autoLoop", { phase: "getMainBranch-failed", error: String(err) });
1364
+ }
1330
1365
  const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
1331
1366
  guardBasePath,
1332
- deps.getMainBranch(guardBasePath),
1367
+ mainBranch,
1333
1368
  unitType,
1334
1369
  unitId,
1335
1370
  );
@@ -1339,6 +1374,18 @@ export async function runDispatch(
1339
1374
  return { action: "break", reason: "prior-slice-blocker" };
1340
1375
  }
1341
1376
 
1377
+ const consecutiveDispatchBlocker = getConsecutiveDispatchBlocker(
1378
+ loopState,
1379
+ state.phase,
1380
+ unitType,
1381
+ unitId,
1382
+ );
1383
+ if (consecutiveDispatchBlocker) {
1384
+ await deps.stopAuto(ctx, pi, consecutiveDispatchBlocker);
1385
+ debugLog("autoLoop", { phase: "exit", reason: "consecutive-dispatch-blocker" });
1386
+ return { action: "break", reason: "consecutive-dispatch-blocker" };
1387
+ }
1388
+
1342
1389
  const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(
1343
1390
  ic,
1344
1391
  unitType,
@@ -1355,9 +1402,14 @@ export async function runDispatch(
1355
1402
  // Rules 1/3/4 can catch retry loops with repeated failure content (#5719).
1356
1403
  // Rules 2/2b suppress legitimate retry backoff through the dispatch ledger.
1357
1404
  loopState.recentUnits.push({ key: derivedKey });
1358
- if (loopState.recentUnits.length > STUCK_WINDOW_SIZE) loopState.recentUnits.shift();
1405
+ while (loopState.recentUnits.length > STUCK_WINDOW_SIZE) {
1406
+ loopState.recentUnits.shift();
1407
+ }
1359
1408
 
1360
- const stuckSignal = detectStuck(loopState.recentUnits);
1409
+ const stuckSignal = detectStuck(loopState.recentUnits, {
1410
+ pendingRetry: !!s.pendingVerificationRetry,
1411
+ retryAttempt: s.pendingVerificationRetry?.attempt,
1412
+ });
1361
1413
  if (stuckSignal) {
1362
1414
  debugLog("autoLoop", {
1363
1415
  phase: "stuck-check",
@@ -1412,7 +1464,6 @@ export async function runDispatch(
1412
1464
  );
1413
1465
  deps.invalidateAllCaches();
1414
1466
  loopState.recentUnits.length = 0;
1415
- loopState.stuckRecoveryAttempts = 0;
1416
1467
  return { action: "continue" };
1417
1468
  }
1418
1469
  ctx.ui.notify(
@@ -1796,42 +1847,8 @@ export async function runUnitPhase(
1796
1847
  s.currentUnit.id === unitId
1797
1848
  );
1798
1849
  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
1850
  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
- );
1851
+ const nextDispatchCount = (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1;
1835
1852
 
1836
1853
  // Status bar (widget + preconditions deferred until after model selection — see #2899)
1837
1854
  ctx.ui.setStatus("gsd-auto", "auto");
@@ -1894,7 +1911,7 @@ export async function runUnitPhase(
1894
1911
  : s.pendingCrashRecovery;
1895
1912
  finalPrompt = `${capped}\n\n---\n\n${finalPrompt}`;
1896
1913
  s.pendingCrashRecovery = null;
1897
- } else if ((s.unitDispatchCount.get(dispatchKey) ?? 0) > 1) {
1914
+ } else if (nextDispatchCount > 1) {
1898
1915
  const diagnostic = deps.getDeepDiagnostic(s.basePath);
1899
1916
  if (diagnostic) {
1900
1917
  const cappedDiag =
@@ -1902,7 +1919,11 @@ export async function runUnitPhase(
1902
1919
  ? diagnostic.slice(0, MAX_RECOVERY_CHARS) +
1903
1920
  "\n\n[...diagnostic truncated to prevent memory exhaustion]"
1904
1921
  : diagnostic;
1905
- finalPrompt = `**RETRY — your previous attempt did not produce the required artifact.**\n\nDiagnostic from previous attempt:\n${cappedDiag}\n\nFix whatever went wrong and make sure you write the required file this time.\n\n---\n\n${finalPrompt}`;
1922
+ const retryInstruction =
1923
+ unitType === "execute-task"
1924
+ ? "The required artifact is `T##-SUMMARY.md`. Do NOT manually write this file. Call `gsd_task_complete` with `milestoneId`, `sliceId`, `taskId`, and the required completion fields. Do not re-run implementation work — call the tool."
1925
+ : "Fix whatever went wrong and make sure you write the required file this time.";
1926
+ finalPrompt = `**RETRY — your previous attempt did not produce the required artifact.**\n\nDiagnostic from previous attempt:\n${cappedDiag}\n\n${retryInstruction}\n\n---\n\n${finalPrompt}`;
1906
1927
  }
1907
1928
  }
1908
1929
 
@@ -1937,6 +1958,11 @@ export async function runUnitPhase(
1937
1958
  }
1938
1959
 
1939
1960
  // Select and apply model (with tier escalation on retry — normal units only)
1961
+ const prevUnitRouting = s.currentUnitRouting;
1962
+ const prevUnitModel = s.currentUnitModel;
1963
+ const prevDispatchedModelId = s.currentDispatchedModelId;
1964
+ const prevSessionModel = ctx.model;
1965
+ const prevSessionThinkingLevel = pi.getThinkingLevel();
1940
1966
  const modelResult = await deps.selectAndApplyModel(
1941
1967
  ctx,
1942
1968
  pi,
@@ -2003,14 +2029,67 @@ export async function runUnitPhase(
2003
2029
  ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
2004
2030
  : undefined,
2005
2031
  baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
2032
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
2006
2033
  },
2007
2034
  );
2008
2035
  if (compatibilityError) {
2036
+ s.currentUnitRouting = prevUnitRouting;
2037
+ s.currentUnitModel = prevUnitModel;
2038
+ s.currentDispatchedModelId = prevDispatchedModelId;
2039
+ if (s.checkpointSha) {
2040
+ cleanupCheckpoint(s.basePath, unitId);
2041
+ s.checkpointSha = null;
2042
+ }
2043
+ if (prevSessionModel) {
2044
+ const ok = await pi.setModel(prevSessionModel, { persist: false });
2045
+ if (!ok) {
2046
+ ctx.ui.notify("Failed to restore previous session model after compatibility check failure.", "warning");
2047
+ }
2048
+ if (prevSessionThinkingLevel) {
2049
+ pi.setThinkingLevel(prevSessionThinkingLevel);
2050
+ }
2051
+ }
2009
2052
  ctx.ui.notify(compatibilityError, "error");
2010
2053
  await deps.stopAuto(ctx, pi, compatibilityError);
2011
2054
  return { action: "break", reason: "workflow-capability" };
2012
2055
  }
2013
2056
 
2057
+ // Scope workflow-logger buffer to this unit so post-finalize drains are
2058
+ // per-unit. Without this, the module-level _buffer accumulates across every
2059
+ // unit in the same Node process (see workflow-logger.ts module header).
2060
+ _resetLogs();
2061
+ const unitStartedAt = Date.now();
2062
+ s.unitDispatchCount.set(dispatchKey, nextDispatchCount);
2063
+ s.currentUnit = { type: unitType, id: unitId, startedAt: unitStartedAt };
2064
+ s.lastGitActionFailure = null;
2065
+ s.lastGitActionStatus = null;
2066
+ s.lastUnitAgentEndMessages = null;
2067
+ setCurrentPhase(unitType, {
2068
+ basePath: s.basePath,
2069
+ traceId: ic.flowId,
2070
+ turnId: `iter-${ic.iteration}`,
2071
+ causedBy: "unit-start",
2072
+ });
2073
+ s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
2074
+ const unitStartSeq = ic.nextSeq();
2075
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
2076
+ deps.captureAvailableSkills();
2077
+ writeUnitRuntimeRecord(
2078
+ s.basePath,
2079
+ unitType,
2080
+ unitId,
2081
+ unitStartedAt,
2082
+ {
2083
+ phase: "dispatched",
2084
+ wrapupWarningSent: false,
2085
+ timeoutAt: null,
2086
+ lastProgressAt: unitStartedAt,
2087
+ progressCount: 0,
2088
+ lastProgressKind: "dispatch",
2089
+ recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
2090
+ },
2091
+ );
2092
+
2014
2093
  // Progress widget + preconditions — deferred to after model selection so the
2015
2094
  // widget's first render tick shows the correct model (#2899).
2016
2095
  deps.updateProgressWidget(ctx, unitType, unitId, state);
@@ -2125,6 +2204,11 @@ export async function runUnitPhase(
2125
2204
  }
2126
2205
 
2127
2206
  if (unitResult.status === "cancelled") {
2207
+ if (_isPauseOriginCancelledResult(s.paused, unitResult.errorContext)) {
2208
+ debugLog("autoLoop", { phase: "cancelled-after-pause", unitType, unitId });
2209
+ return { action: "break", reason: "paused" };
2210
+ }
2211
+
2128
2212
  const errorCategory = unitResult.errorContext?.category;
2129
2213
  // Provider-error pause: agent_end recovery normally pauses before this
2130
2214
  // branch. Provider readiness failures happen before dispatch, so pause here
@@ -2328,18 +2412,17 @@ export async function runUnitPhase(
2328
2412
  }
2329
2413
  }
2330
2414
 
2415
+ const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
2416
+ const artifactVerified =
2417
+ skipArtifactVerification ||
2418
+ verifyExpectedArtifact(unitType, unitId, s.basePath);
2331
2419
  if (s.currentUnitRouting) {
2332
2420
  deps.recordOutcome(
2333
2421
  unitType,
2334
2422
  s.currentUnitRouting.tier as "light" | "standard" | "heavy",
2335
- true, // success assumed; dispatch will re-dispatch if artifact missing
2423
+ artifactVerified,
2336
2424
  );
2337
2425
  }
2338
-
2339
- const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
2340
- const artifactVerified =
2341
- skipArtifactVerification ||
2342
- verifyExpectedArtifact(unitType, unitId, s.basePath);
2343
2426
  if (artifactVerified) {
2344
2427
  s.unitDispatchCount.delete(dispatchKey);
2345
2428
  s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
@@ -2364,7 +2447,11 @@ export async function runUnitPhase(
2364
2447
  }
2365
2448
  }
2366
2449
 
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 } });
2450
+ const unitEndStatus =
2451
+ !artifactVerified && unitResult.status === "completed"
2452
+ ? "no-artifact"
2453
+ : unitResult.status;
2454
+ 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
2455
 
2369
2456
  // ── Safety harness: checkpoint cleanup or rollback ──
2370
2457
  if (s.checkpointSha) {
@@ -2439,6 +2526,8 @@ export async function runFinalize(
2439
2526
  const preUnitSnapshot = s.currentUnit
2440
2527
  ? { type: s.currentUnit.type, id: s.currentUnit.id, startedAt: s.currentUnit.startedAt }
2441
2528
  : null;
2529
+ s.currentUnit = null;
2530
+ clearCurrentPhase();
2442
2531
  const preResultGuard = await withTimeout(
2443
2532
  deps.postUnitPreVerification(postUnitCtx, preVerificationOpts),
2444
2533
  FINALIZE_PRE_TIMEOUT_MS,
@@ -2596,10 +2685,21 @@ export async function runFinalize(
2596
2685
  lastProgressAt: Date.now(),
2597
2686
  lastProgressKind: "finalize-success",
2598
2687
  });
2688
+ if (
2689
+ !preUnitSnapshot.type.startsWith("hook/") &&
2690
+ preUnitSnapshot.type !== "custom-step" &&
2691
+ preUnitSnapshot.type !== "complete-milestone"
2692
+ ) {
2693
+ setAutoOutcomeWidget(ctx, {
2694
+ ...buildPhaseHandoffOutcome({
2695
+ unitType: preUnitSnapshot.type,
2696
+ unitId: preUnitSnapshot.id,
2697
+ agentEndMessages: s.lastUnitAgentEndMessages,
2698
+ }),
2699
+ startedAt: s.autoStartTime,
2700
+ });
2701
+ }
2599
2702
  }
2600
- s.currentUnit = null;
2601
- clearCurrentPhase();
2602
-
2603
2703
  // Surface accumulated workflow-logger issues for this unit to the user.
2604
2704
  // Warnings/errors logged during the unit are buffered in the logger and
2605
2705
  // 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",
@@ -19,6 +19,19 @@ export interface MeasureMemoryPressureDeps {
19
19
  heapLimitBytes: () => number;
20
20
  }
21
21
 
22
+ /**
23
+ * Returns true on auto-mode startup, then every configured interval.
24
+ *
25
+ * Iteration 1 is checked explicitly so early session memory pressure cannot
26
+ * bypass the periodic interval guard.
27
+ */
28
+ export function shouldCheckMemoryPressure(iteration: number, interval: number): boolean {
29
+ if (!Number.isInteger(interval) || interval <= 0) {
30
+ throw new Error("Memory pressure check interval must be a positive integer");
31
+ }
32
+ return iteration === 1 || iteration % interval === 0;
33
+ }
34
+
22
35
  function defaultHeapLimitBytes(): number {
23
36
  const v8 = require("node:v8") as {
24
37
  getHeapStatistics?: () => { heap_size_limit?: number };
@@ -30,3 +30,14 @@ export function getBudgetEnforcementAction(
30
30
  if (enforcement === "pause") return "pause";
31
31
  return "warn";
32
32
  }
33
+
34
+ export function getUnitCostSpikeAction(
35
+ unitCostUsd: number,
36
+ rollingAvgUsd: number,
37
+ multiplier = 3.0,
38
+ ): "none" | "pause" {
39
+ if (!Number.isFinite(unitCostUsd) || unitCostUsd < 0) return "none";
40
+ if (!Number.isFinite(rollingAvgUsd) || rollingAvgUsd <= 0) return "none";
41
+ if (!Number.isFinite(multiplier) || multiplier <= 0) return "none";
42
+ return unitCostUsd >= (rollingAvgUsd * multiplier) ? "pause" : "none";
43
+ }
@@ -120,6 +120,26 @@ export interface AutoOutcomeSurfaceSnapshot {
120
120
  startedAt?: number;
121
121
  }
122
122
 
123
+ export function buildPhaseHandoffOutcome(input: {
124
+ unitType: string;
125
+ unitId: string;
126
+ agentEndMessages?: unknown[] | null;
127
+ }): AutoOutcomeSurfaceSnapshot {
128
+ const phase = unitPhaseLabel(input.unitType);
129
+ const detail =
130
+ extractLastAssistantSummary(input.agentEndMessages) ??
131
+ `Completed ${unitVerb(input.unitType)} ${input.unitId}.`;
132
+
133
+ return {
134
+ status: "complete",
135
+ title: `${phase} complete`,
136
+ detail,
137
+ unitLabel: `${unitVerb(input.unitType)} ${input.unitId}`,
138
+ nextAction: "Preparing the next phase. Review this handoff while the next session starts.",
139
+ commands: ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history"],
140
+ };
141
+ }
142
+
123
143
  // ─── Unit Description Helpers ─────────────────────────────────────────────────
124
144
 
125
145
  export function unitVerb(unitType: string): string {
@@ -631,7 +651,6 @@ export function updateProgressWidget(
631
651
  tierBadge?: string,
632
652
  ): void {
633
653
  if (!ctx.hasUI) return;
634
- ctx.ui.setWidget("gsd-outcome", undefined);
635
654
 
636
655
  // Welcome header is a startup-only banner — permanently suppress it once
637
656
  // auto-mode activates. The dashboard widget owns all status from here.
@@ -1145,3 +1164,55 @@ function normalizeRollupText(value: string | null | undefined): string | null {
1145
1164
  if (!clean || clean === "(none)" || clean === "None." || clean === "Not provided.") return null;
1146
1165
  return clean;
1147
1166
  }
1167
+
1168
+ function isAssistantMessage(value: unknown): boolean {
1169
+ if (!value || typeof value !== "object") return false;
1170
+ const record = value as Record<string, unknown>;
1171
+ if (record.role === "assistant") return true;
1172
+
1173
+ const message = record.message;
1174
+ if (message && typeof message === "object") {
1175
+ return (message as Record<string, unknown>).role === "assistant";
1176
+ }
1177
+
1178
+ return false;
1179
+ }
1180
+
1181
+ function extractLastAssistantSummary(messages: unknown[] | null | undefined): string | null {
1182
+ if (!messages || messages.length === 0) return null;
1183
+ for (let i = messages.length - 1; i >= 0; i--) {
1184
+ if (!isAssistantMessage(messages[i])) continue;
1185
+ const text = extractMessageText(messages[i]);
1186
+ const clean = normalizeRollupText(text);
1187
+ if (clean) return truncateToWidth(clean, 220, "…");
1188
+ }
1189
+ return null;
1190
+ }
1191
+
1192
+ function extractMessageText(value: unknown): string | null {
1193
+ if (typeof value === "string") return value;
1194
+ if (!value || typeof value !== "object") return null;
1195
+
1196
+ const record = value as Record<string, unknown>;
1197
+ if (typeof record.content === "string") return record.content;
1198
+
1199
+ const message = record.message;
1200
+ if (message && typeof message === "object") {
1201
+ return extractMessageText(message);
1202
+ }
1203
+
1204
+ const content = record.content;
1205
+ if (Array.isArray(content)) {
1206
+ const parts = content
1207
+ .map((part) => {
1208
+ if (typeof part === "string") return part;
1209
+ if (!part || typeof part !== "object") return "";
1210
+ const partRecord = part as Record<string, unknown>;
1211
+ return typeof partRecord.text === "string" ? partRecord.text : "";
1212
+ })
1213
+ .filter(Boolean);
1214
+ return parts.length > 0 ? parts.join(" ") : null;
1215
+ }
1216
+
1217
+ return null;
1218
+ }
@@ -280,6 +280,7 @@ export async function dispatchDirectPhase(
280
280
  unitType,
281
281
  authMode: ctx.model?.provider ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider) : undefined,
282
282
  baseUrl: ctx.model?.baseUrl,
283
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
283
284
  },
284
285
  );
285
286
  if (compatibilityError) {