gsd-pi 2.82.0 → 3.0.0-dev.6c9a50fd0

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 (775) hide show
  1. package/README.md +125 -32
  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/browser-tools/tools/screenshot.js +1 -0
  8. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  9. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  10. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  11. package/dist/resources/extensions/cmux/index.js +5 -0
  12. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  13. package/dist/resources/extensions/gsd/auto/loop.js +112 -40
  14. package/dist/resources/extensions/gsd/auto/orchestrator.js +126 -8
  15. package/dist/resources/extensions/gsd/auto/phases.js +125 -42
  16. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  17. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  18. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -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 +105 -24
  23. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  24. package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
  25. package/dist/resources/extensions/gsd/auto-prompts.js +47 -13
  26. package/dist/resources/extensions/gsd/auto-recovery.js +80 -14
  27. package/dist/resources/extensions/gsd/auto-start.js +90 -14
  28. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +102 -34
  30. package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
  31. package/dist/resources/extensions/gsd/auto.js +251 -91
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +10 -4
  35. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  36. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  37. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  38. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  39. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  40. package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
  41. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  42. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  43. package/dist/resources/extensions/gsd/commands-handlers.js +17 -2
  44. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  45. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
  46. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  47. package/dist/resources/extensions/gsd/context-store.js +112 -0
  48. package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
  49. package/dist/resources/extensions/gsd/db/auto-workers.js +21 -0
  50. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  51. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  52. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  53. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  54. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  55. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  56. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  57. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -1
  58. package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
  59. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  60. package/dist/resources/extensions/gsd/doctor.js +2 -28
  61. package/dist/resources/extensions/gsd/export-html.js +27 -425
  62. package/dist/resources/extensions/gsd/forensics.js +10 -3
  63. package/dist/resources/extensions/gsd/git-service.js +138 -10
  64. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  65. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  66. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  67. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  68. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  69. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  70. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  71. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  72. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  73. package/dist/resources/extensions/gsd/markdown-renderer.js +20 -12
  74. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  75. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  76. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  77. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  78. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  79. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  80. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  81. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  82. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  83. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  84. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  85. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  86. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  87. package/dist/resources/extensions/gsd/paths.js +4 -0
  88. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  89. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  90. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  91. package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
  92. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  93. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  94. package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
  95. package/dist/resources/extensions/gsd/preferences.js +6 -0
  96. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  97. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  99. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  100. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  101. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  102. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  103. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  104. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  105. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  106. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  107. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  108. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  110. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  111. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  112. package/dist/resources/extensions/gsd/repo-identity.js +39 -22
  113. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  114. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  115. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  116. package/dist/resources/extensions/gsd/session-lock.js +15 -2
  117. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
  118. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  119. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  120. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  121. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  122. package/dist/resources/extensions/gsd/state.js +14 -4
  123. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  124. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  125. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  126. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  127. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
  128. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
  129. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  130. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  131. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
  132. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  133. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  134. package/dist/resources/extensions/gsd/validation.js +23 -1
  135. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  136. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  137. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  138. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  139. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  140. package/dist/resources/extensions/gsd/worktree-lifecycle.js +83 -19
  141. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  142. package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
  143. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  144. package/dist/resources/extensions/shared/html-shell.js +388 -0
  145. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  146. package/dist/resources/extensions/shared/next-action-ui.js +13 -5
  147. package/dist/resources/extensions/subagent/index.js +448 -78
  148. package/dist/resources/extensions/subagent/launch.js +77 -0
  149. package/dist/resources/extensions/subagent/run-store.js +148 -0
  150. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  151. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  152. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  153. package/dist/resources/extensions/visual-brief/index.js +5 -0
  154. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  155. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  156. package/dist/resources/skills/forensics/SKILL.md +1 -1
  157. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  158. package/dist/web/standalone/.next/BUILD_ID +1 -1
  159. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  160. package/dist/web/standalone/.next/build-manifest.json +4 -4
  161. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  162. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  163. package/dist/web/standalone/.next/required-server-files.json +4 -4
  164. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  165. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  174. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  175. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  178. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  179. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  180. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  182. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  185. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  192. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  204. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  224. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  234. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  240. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  252. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  256. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  260. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  266. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  267. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  269. package/dist/web/standalone/.next/server/app/index.html +1 -1
  270. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  271. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  272. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  273. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  274. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  275. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  276. package/dist/web/standalone/.next/server/app/page.js +2 -2
  277. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  278. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  279. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  280. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  281. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  282. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  283. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  284. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  285. package/dist/web/standalone/.next/server/middleware.js +2 -2
  286. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  287. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  288. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  289. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  290. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  291. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  292. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  293. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  294. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  295. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  296. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  297. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  298. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  299. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  300. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  301. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  302. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  303. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  304. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  305. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  306. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  307. package/dist/web/standalone/server.js +1 -1
  308. package/package.json +6 -5
  309. package/packages/contracts/dist/rpc.test.js +7 -0
  310. package/packages/contracts/dist/rpc.test.js.map +1 -1
  311. package/packages/contracts/dist/workflow.d.ts +21 -0
  312. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  313. package/packages/contracts/dist/workflow.js +24 -0
  314. package/packages/contracts/dist/workflow.js.map +1 -1
  315. package/packages/contracts/src/rpc.test.ts +8 -0
  316. package/packages/contracts/src/workflow.ts +24 -0
  317. package/packages/daemon/package.json +2 -2
  318. package/packages/mcp-server/README.md +14 -3
  319. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  320. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  321. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  322. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  323. package/packages/mcp-server/package.json +2 -2
  324. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  325. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  326. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  327. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  328. package/packages/native/package.json +1 -1
  329. package/packages/native/tsconfig.json +2 -1
  330. package/packages/native/tsconfig.tsbuildinfo +1 -1
  331. package/packages/pi-agent-core/package.json +1 -1
  332. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  333. package/packages/pi-ai/dist/index.d.ts +2 -2
  334. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  335. package/packages/pi-ai/dist/index.js +1 -1
  336. package/packages/pi-ai/dist/index.js.map +1 -1
  337. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  338. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  339. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  340. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  341. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  342. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  343. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  344. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  345. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  346. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  347. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  348. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  349. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  350. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  351. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  352. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  354. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  355. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  356. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  357. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  358. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  359. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  360. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  361. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  362. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  363. package/packages/pi-ai/package.json +1 -1
  364. package/packages/pi-ai/src/index.ts +7 -2
  365. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  366. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  367. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  368. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  369. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  370. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  371. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  372. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  373. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  374. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  375. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  376. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  377. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  378. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  380. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  382. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  384. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  386. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  388. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  390. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  392. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  394. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  395. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  396. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  397. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  398. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  399. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  400. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  402. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  403. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  404. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  405. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  406. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  408. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  409. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  410. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  411. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  412. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  413. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  414. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  415. package/packages/pi-coding-agent/package.json +1 -1
  416. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  417. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  418. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  419. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  420. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  421. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  422. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  423. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  424. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  425. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  426. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  427. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  428. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  429. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  430. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  431. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  432. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  433. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  434. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  435. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  436. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  437. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  438. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  439. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  440. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  441. package/packages/pi-tui/dist/terminal.js +12 -0
  442. package/packages/pi-tui/dist/terminal.js.map +1 -1
  443. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  444. package/packages/pi-tui/dist/tui.js +108 -24
  445. package/packages/pi-tui/dist/tui.js.map +1 -1
  446. package/packages/pi-tui/package.json +1 -1
  447. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  448. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  449. package/packages/pi-tui/src/terminal.ts +11 -0
  450. package/packages/pi-tui/src/tui.ts +111 -24
  451. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  452. package/packages/rpc-client/package.json +1 -1
  453. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  454. package/pkg/package.json +1 -1
  455. package/src/resources/GSD-WORKFLOW.md +10 -1
  456. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  457. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  458. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  459. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  460. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  461. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  462. package/src/resources/extensions/cmux/index.ts +6 -0
  463. package/src/resources/extensions/gsd/auto/contracts.ts +64 -16
  464. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  465. package/src/resources/extensions/gsd/auto/loop.ts +113 -40
  466. package/src/resources/extensions/gsd/auto/orchestrator.ts +131 -8
  467. package/src/resources/extensions/gsd/auto/phases.ts +155 -53
  468. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  469. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  470. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  471. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  472. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  473. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  474. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  475. package/src/resources/extensions/gsd/auto-dispatch.ts +126 -23
  476. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  477. package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
  478. package/src/resources/extensions/gsd/auto-prompts.ts +47 -16
  479. package/src/resources/extensions/gsd/auto-recovery.ts +84 -11
  480. package/src/resources/extensions/gsd/auto-start.ts +99 -12
  481. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  482. package/src/resources/extensions/gsd/auto-verification.ts +124 -42
  483. package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
  484. package/src/resources/extensions/gsd/auto.ts +288 -87
  485. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
  486. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  487. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +11 -4
  488. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  489. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  490. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  491. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  492. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  493. package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
  494. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  495. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  496. package/src/resources/extensions/gsd/commands-handlers.ts +21 -2
  497. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  498. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
  499. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  500. package/src/resources/extensions/gsd/context-store.ts +120 -1
  501. package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
  502. package/src/resources/extensions/gsd/db/auto-workers.ts +25 -0
  503. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  504. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  505. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  506. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  507. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  508. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  509. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  510. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -1
  511. package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
  512. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  513. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  514. package/src/resources/extensions/gsd/doctor.ts +2 -27
  515. package/src/resources/extensions/gsd/export-html.ts +27 -427
  516. package/src/resources/extensions/gsd/forensics.ts +9 -3
  517. package/src/resources/extensions/gsd/git-service.ts +166 -11
  518. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  519. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  520. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  521. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  522. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  523. package/src/resources/extensions/gsd/journal.ts +8 -1
  524. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  525. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  526. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  527. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  528. package/src/resources/extensions/gsd/markdown-renderer.ts +20 -12
  529. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  530. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  531. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  532. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  533. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  534. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  535. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  536. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  537. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  538. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  539. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  540. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  541. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  542. package/src/resources/extensions/gsd/paths.ts +5 -0
  543. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  544. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  545. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  546. package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
  547. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  548. package/src/resources/extensions/gsd/preferences-types.ts +33 -0
  549. package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
  550. package/src/resources/extensions/gsd/preferences.ts +9 -0
  551. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  552. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  553. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  554. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  555. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  556. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  557. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  558. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  559. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  560. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  561. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  562. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  563. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  564. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  565. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  566. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  567. package/src/resources/extensions/gsd/repo-identity.ts +45 -25
  568. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  569. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  570. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  571. package/src/resources/extensions/gsd/session-lock.ts +15 -2
  572. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
  573. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  574. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  575. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  576. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  577. package/src/resources/extensions/gsd/state.ts +15 -4
  578. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  579. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  580. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  581. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  582. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  583. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  584. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  585. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +510 -1
  586. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +635 -16
  587. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  588. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  589. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  590. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +134 -9
  591. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  592. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
  593. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  594. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  595. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +13 -0
  596. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  597. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  598. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  599. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  600. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  601. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  602. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  603. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  604. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  605. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
  606. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
  607. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  608. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  609. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  610. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  611. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  612. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  613. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  614. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  615. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  616. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  617. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
  618. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  619. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +111 -1
  620. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  621. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  622. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  623. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  624. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  625. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  626. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  627. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  628. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  629. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  630. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  631. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  632. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  633. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  634. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  635. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  636. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  637. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  638. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  639. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  640. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
  641. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  642. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  643. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
  644. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  645. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +38 -0
  646. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  647. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  648. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  649. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  650. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  651. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  652. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  653. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  654. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  655. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  656. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  657. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  658. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  659. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  660. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  661. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  662. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  663. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  664. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  665. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  666. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  667. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  668. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  669. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  670. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  671. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  672. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  673. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  674. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  675. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
  676. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  677. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  678. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  679. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +78 -0
  680. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
  681. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  682. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  683. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  684. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  685. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  686. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  687. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
  688. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  689. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  690. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
  691. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  692. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
  693. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
  694. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  695. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +86 -2
  696. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  697. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  698. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  699. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  700. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  701. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  702. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  703. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  704. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  705. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  706. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  707. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
  708. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  709. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  710. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  711. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  712. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +121 -1
  713. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  714. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  715. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +57 -2
  716. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  717. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
  718. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  719. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  720. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  721. package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
  722. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
  723. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  724. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  725. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
  726. package/src/resources/extensions/gsd/types.ts +1 -1
  727. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  728. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  729. package/src/resources/extensions/gsd/validation.ts +23 -1
  730. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  731. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  732. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  733. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  734. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  735. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  736. package/src/resources/extensions/gsd/worktree-lifecycle.ts +93 -20
  737. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  738. package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
  739. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  740. package/src/resources/extensions/shared/html-shell.ts +412 -0
  741. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  742. package/src/resources/extensions/shared/next-action-ui.ts +11 -5
  743. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  744. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
  745. package/src/resources/extensions/subagent/index.ts +567 -103
  746. package/src/resources/extensions/subagent/launch.ts +131 -0
  747. package/src/resources/extensions/subagent/run-store.ts +218 -0
  748. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  749. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  750. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  751. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  752. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  753. package/src/resources/extensions/visual-brief/index.ts +8 -0
  754. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  755. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  756. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  757. package/src/resources/skills/forensics/SKILL.md +1 -1
  758. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  759. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  760. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  761. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  762. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  763. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  764. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  765. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  766. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  767. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  768. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  769. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  770. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  771. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  772. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  773. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  774. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → 8wipfz6TDZ6YWoaQjgqYD}/_buildManifest.js +0 -0
  775. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → 8wipfz6TDZ6YWoaQjgqYD}/_ssgManifest.js +0 -0
@@ -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,
@@ -1232,7 +1257,6 @@ export async function runDispatch(
1232
1257
  ): Promise<PhaseResult<IterationData>> {
1233
1258
  const { ctx, pi, s, deps, prefs } = ic;
1234
1259
  const { state, mid, midTitle } = preData;
1235
- const STUCK_WINDOW_SIZE = 6;
1236
1260
  const provider = ctx.model?.provider;
1237
1261
  const authMode = provider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
1238
1262
  ? ctx.modelRegistry.getProviderAuthMode(provider)
@@ -1327,9 +1351,15 @@ export async function runDispatch(
1327
1351
  }
1328
1352
 
1329
1353
  const guardBasePath = _resolveDispatchGuardBasePath(s);
1354
+ let mainBranch = "main";
1355
+ try {
1356
+ mainBranch = deps.getMainBranch(guardBasePath);
1357
+ } catch (err) {
1358
+ debugLog("autoLoop", { phase: "getMainBranch-failed", error: String(err) });
1359
+ }
1330
1360
  const priorSliceBlocker = deps.getPriorSliceCompletionBlocker(
1331
1361
  guardBasePath,
1332
- deps.getMainBranch(guardBasePath),
1362
+ mainBranch,
1333
1363
  unitType,
1334
1364
  unitId,
1335
1365
  );
@@ -1339,6 +1369,18 @@ export async function runDispatch(
1339
1369
  return { action: "break", reason: "prior-slice-blocker" };
1340
1370
  }
1341
1371
 
1372
+ const consecutiveDispatchBlocker = getConsecutiveDispatchBlocker(
1373
+ loopState,
1374
+ state.phase,
1375
+ unitType,
1376
+ unitId,
1377
+ );
1378
+ if (consecutiveDispatchBlocker) {
1379
+ await deps.stopAuto(ctx, pi, consecutiveDispatchBlocker);
1380
+ debugLog("autoLoop", { phase: "exit", reason: "consecutive-dispatch-blocker" });
1381
+ return { action: "break", reason: "consecutive-dispatch-blocker" };
1382
+ }
1383
+
1342
1384
  const worktreeSafetyBlock = await validateSourceWriteWorktreeSafety(
1343
1385
  ic,
1344
1386
  unitType,
@@ -1355,7 +1397,9 @@ export async function runDispatch(
1355
1397
  // Rules 1/3/4 can catch retry loops with repeated failure content (#5719).
1356
1398
  // Rules 2/2b suppress legitimate retry backoff through the dispatch ledger.
1357
1399
  loopState.recentUnits.push({ key: derivedKey });
1358
- if (loopState.recentUnits.length > STUCK_WINDOW_SIZE) loopState.recentUnits.shift();
1400
+ while (loopState.recentUnits.length > STUCK_WINDOW_SIZE) {
1401
+ loopState.recentUnits.shift();
1402
+ }
1359
1403
 
1360
1404
  const stuckSignal = detectStuck(loopState.recentUnits);
1361
1405
  if (stuckSignal) {
@@ -1412,7 +1456,6 @@ export async function runDispatch(
1412
1456
  );
1413
1457
  deps.invalidateAllCaches();
1414
1458
  loopState.recentUnits.length = 0;
1415
- loopState.stuckRecoveryAttempts = 0;
1416
1459
  return { action: "continue" };
1417
1460
  }
1418
1461
  ctx.ui.notify(
@@ -1796,42 +1839,8 @@ export async function runUnitPhase(
1796
1839
  s.currentUnit.id === unitId
1797
1840
  );
1798
1841
  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
1842
  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
- );
1843
+ const nextDispatchCount = (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1;
1835
1844
 
1836
1845
  // Status bar (widget + preconditions deferred until after model selection — see #2899)
1837
1846
  ctx.ui.setStatus("gsd-auto", "auto");
@@ -1894,7 +1903,7 @@ export async function runUnitPhase(
1894
1903
  : s.pendingCrashRecovery;
1895
1904
  finalPrompt = `${capped}\n\n---\n\n${finalPrompt}`;
1896
1905
  s.pendingCrashRecovery = null;
1897
- } else if ((s.unitDispatchCount.get(dispatchKey) ?? 0) > 1) {
1906
+ } else if (nextDispatchCount > 1) {
1898
1907
  const diagnostic = deps.getDeepDiagnostic(s.basePath);
1899
1908
  if (diagnostic) {
1900
1909
  const cappedDiag =
@@ -1937,6 +1946,11 @@ export async function runUnitPhase(
1937
1946
  }
1938
1947
 
1939
1948
  // Select and apply model (with tier escalation on retry — normal units only)
1949
+ const prevUnitRouting = s.currentUnitRouting;
1950
+ const prevUnitModel = s.currentUnitModel;
1951
+ const prevDispatchedModelId = s.currentDispatchedModelId;
1952
+ const prevSessionModel = ctx.model;
1953
+ const prevSessionThinkingLevel = pi.getThinkingLevel();
1940
1954
  const modelResult = await deps.selectAndApplyModel(
1941
1955
  ctx,
1942
1956
  pi,
@@ -2003,14 +2017,67 @@ export async function runUnitPhase(
2003
2017
  ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
2004
2018
  : undefined,
2005
2019
  baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
2020
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
2006
2021
  },
2007
2022
  );
2008
2023
  if (compatibilityError) {
2024
+ s.currentUnitRouting = prevUnitRouting;
2025
+ s.currentUnitModel = prevUnitModel;
2026
+ s.currentDispatchedModelId = prevDispatchedModelId;
2027
+ if (s.checkpointSha) {
2028
+ cleanupCheckpoint(s.basePath, unitId);
2029
+ s.checkpointSha = null;
2030
+ }
2031
+ if (prevSessionModel) {
2032
+ const ok = await pi.setModel(prevSessionModel, { persist: false });
2033
+ if (!ok) {
2034
+ ctx.ui.notify("Failed to restore previous session model after compatibility check failure.", "warning");
2035
+ }
2036
+ if (prevSessionThinkingLevel) {
2037
+ pi.setThinkingLevel(prevSessionThinkingLevel);
2038
+ }
2039
+ }
2009
2040
  ctx.ui.notify(compatibilityError, "error");
2010
2041
  await deps.stopAuto(ctx, pi, compatibilityError);
2011
2042
  return { action: "break", reason: "workflow-capability" };
2012
2043
  }
2013
2044
 
2045
+ // Scope workflow-logger buffer to this unit so post-finalize drains are
2046
+ // per-unit. Without this, the module-level _buffer accumulates across every
2047
+ // unit in the same Node process (see workflow-logger.ts module header).
2048
+ _resetLogs();
2049
+ const unitStartedAt = Date.now();
2050
+ s.unitDispatchCount.set(dispatchKey, nextDispatchCount);
2051
+ s.currentUnit = { type: unitType, id: unitId, startedAt: unitStartedAt };
2052
+ s.lastGitActionFailure = null;
2053
+ s.lastGitActionStatus = null;
2054
+ s.lastUnitAgentEndMessages = null;
2055
+ setCurrentPhase(unitType, {
2056
+ basePath: s.basePath,
2057
+ traceId: ic.flowId,
2058
+ turnId: `iter-${ic.iteration}`,
2059
+ causedBy: "unit-start",
2060
+ });
2061
+ s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
2062
+ const unitStartSeq = ic.nextSeq();
2063
+ deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: unitStartSeq, eventType: "unit-start", data: { unitType, unitId } });
2064
+ deps.captureAvailableSkills();
2065
+ writeUnitRuntimeRecord(
2066
+ s.basePath,
2067
+ unitType,
2068
+ unitId,
2069
+ unitStartedAt,
2070
+ {
2071
+ phase: "dispatched",
2072
+ wrapupWarningSent: false,
2073
+ timeoutAt: null,
2074
+ lastProgressAt: unitStartedAt,
2075
+ progressCount: 0,
2076
+ lastProgressKind: "dispatch",
2077
+ recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
2078
+ },
2079
+ );
2080
+
2014
2081
  // Progress widget + preconditions — deferred to after model selection so the
2015
2082
  // widget's first render tick shows the correct model (#2899).
2016
2083
  deps.updateProgressWidget(ctx, unitType, unitId, state);
@@ -2125,6 +2192,11 @@ export async function runUnitPhase(
2125
2192
  }
2126
2193
 
2127
2194
  if (unitResult.status === "cancelled") {
2195
+ if (_isPauseOriginCancelledResult(s.paused, unitResult.errorContext)) {
2196
+ debugLog("autoLoop", { phase: "cancelled-after-pause", unitType, unitId });
2197
+ return { action: "break", reason: "paused" };
2198
+ }
2199
+
2128
2200
  const errorCategory = unitResult.errorContext?.category;
2129
2201
  // Provider-error pause: agent_end recovery normally pauses before this
2130
2202
  // branch. Provider readiness failures happen before dispatch, so pause here
@@ -2233,6 +2305,20 @@ export async function runUnitPhase(
2233
2305
  await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
2234
2306
  return { action: "break", reason: "session-timeout" };
2235
2307
  }
2308
+ if (
2309
+ unitResult.errorContext?.isTransient &&
2310
+ errorCategory === "aborted"
2311
+ ) {
2312
+ ctx.ui.notify(
2313
+ `Unit ${unitType} ${unitId} was aborted by the user. Pausing auto-mode (recoverable).`,
2314
+ "warning",
2315
+ );
2316
+ debugLog("autoLoop", { phase: "unit-aborted-transient-pause", unitType, unitId, category: errorCategory });
2317
+ await deps.pauseAuto(ctx, pi);
2318
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
2319
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
2320
+ return { action: "break", reason: "unit-aborted-pause" };
2321
+ }
2236
2322
  // All other cancelled states (structural errors, non-transient failures): hard stop
2237
2323
  if (s.currentUnit) {
2238
2324
  await deps.closeoutUnit(
@@ -2314,18 +2400,17 @@ export async function runUnitPhase(
2314
2400
  }
2315
2401
  }
2316
2402
 
2403
+ const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
2404
+ const artifactVerified =
2405
+ skipArtifactVerification ||
2406
+ verifyExpectedArtifact(unitType, unitId, s.basePath);
2317
2407
  if (s.currentUnitRouting) {
2318
2408
  deps.recordOutcome(
2319
2409
  unitType,
2320
2410
  s.currentUnitRouting.tier as "light" | "standard" | "heavy",
2321
- true, // success assumed; dispatch will re-dispatch if artifact missing
2411
+ artifactVerified,
2322
2412
  );
2323
2413
  }
2324
-
2325
- const skipArtifactVerification = unitType.startsWith("hook/") || unitType === "custom-step";
2326
- const artifactVerified =
2327
- skipArtifactVerification ||
2328
- verifyExpectedArtifact(unitType, unitId, s.basePath);
2329
2414
  if (artifactVerified) {
2330
2415
  s.unitDispatchCount.delete(dispatchKey);
2331
2416
  s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
@@ -2350,7 +2435,11 @@ export async function runUnitPhase(
2350
2435
  }
2351
2436
  }
2352
2437
 
2353
- 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 } });
2438
+ const unitEndStatus =
2439
+ !artifactVerified && unitResult.status === "completed"
2440
+ ? "no-artifact"
2441
+ : unitResult.status;
2442
+ 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 } });
2354
2443
 
2355
2444
  // ── Safety harness: checkpoint cleanup or rollback ──
2356
2445
  if (s.checkpointSha) {
@@ -2425,6 +2514,8 @@ export async function runFinalize(
2425
2514
  const preUnitSnapshot = s.currentUnit
2426
2515
  ? { type: s.currentUnit.type, id: s.currentUnit.id, startedAt: s.currentUnit.startedAt }
2427
2516
  : null;
2517
+ s.currentUnit = null;
2518
+ clearCurrentPhase();
2428
2519
  const preResultGuard = await withTimeout(
2429
2520
  deps.postUnitPreVerification(postUnitCtx, preVerificationOpts),
2430
2521
  FINALIZE_PRE_TIMEOUT_MS,
@@ -2582,10 +2673,21 @@ export async function runFinalize(
2582
2673
  lastProgressAt: Date.now(),
2583
2674
  lastProgressKind: "finalize-success",
2584
2675
  });
2676
+ if (
2677
+ !preUnitSnapshot.type.startsWith("hook/") &&
2678
+ preUnitSnapshot.type !== "custom-step" &&
2679
+ preUnitSnapshot.type !== "complete-milestone"
2680
+ ) {
2681
+ setAutoOutcomeWidget(ctx, {
2682
+ ...buildPhaseHandoffOutcome({
2683
+ unitType: preUnitSnapshot.type,
2684
+ unitId: preUnitSnapshot.id,
2685
+ agentEndMessages: s.lastUnitAgentEndMessages,
2686
+ }),
2687
+ startedAt: s.autoStartTime,
2688
+ });
2689
+ }
2585
2690
  }
2586
- s.currentUnit = null;
2587
- clearCurrentPhase();
2588
-
2589
2691
  // Surface accumulated workflow-logger issues for this unit to the user.
2590
2692
  // Warnings/errors logged during the unit are buffered in the logger and
2591
2693
  // 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 };
@@ -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) {