gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.04f5ccf82

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 (653) 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 +146 -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 +72 -5
  21. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +185 -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 +267 -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 +16 -4
  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 +74 -3
  56. package/dist/resources/extensions/gsd/doctor-proactive.js +14 -2
  57. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  58. package/dist/resources/extensions/gsd/doctor.js +2 -28
  59. package/dist/resources/extensions/gsd/export-html.js +27 -425
  60. package/dist/resources/extensions/gsd/forensics.js +10 -3
  61. package/dist/resources/extensions/gsd/git-conflict-state.js +21 -0
  62. package/dist/resources/extensions/gsd/git-service.js +152 -15
  63. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  64. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  65. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  66. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  67. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  68. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
  69. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  70. package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  72. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  73. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  74. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  75. package/dist/resources/extensions/gsd/paths.js +4 -0
  76. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  77. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  78. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  79. package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
  80. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  81. package/dist/resources/extensions/gsd/preferences-models.js +6 -4
  82. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  83. package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
  84. package/dist/resources/extensions/gsd/preferences.js +35 -0
  85. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  86. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  89. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  90. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  91. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  92. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  93. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  94. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  95. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  96. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  97. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  98. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  99. package/dist/resources/extensions/gsd/repo-identity.js +39 -22
  100. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  101. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  102. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  103. package/dist/resources/extensions/gsd/session-lock.js +15 -2
  104. package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
  105. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
  106. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  107. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  108. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  109. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  110. package/dist/resources/extensions/gsd/state.js +28 -7
  111. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  112. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  113. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  114. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  115. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
  116. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
  117. package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
  118. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  119. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  120. package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
  121. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
  122. package/dist/resources/extensions/gsd/tui/render-kit.js +33 -0
  123. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  124. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  125. package/dist/resources/extensions/gsd/validation.js +23 -1
  126. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  127. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  128. package/dist/resources/extensions/gsd/watch/header-renderer.js +34 -25
  129. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  130. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  131. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  132. package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
  133. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  134. package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
  135. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  136. package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
  137. package/dist/resources/extensions/shared/html-shell.js +388 -0
  138. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  139. package/dist/resources/extensions/shared/next-action-ui.js +13 -5
  140. package/dist/resources/extensions/subagent/index.js +448 -78
  141. package/dist/resources/extensions/subagent/launch.js +77 -0
  142. package/dist/resources/extensions/subagent/run-store.js +148 -0
  143. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  144. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  145. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  146. package/dist/resources/extensions/visual-brief/index.js +5 -0
  147. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  148. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  149. package/dist/resources/skills/forensics/SKILL.md +1 -1
  150. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  151. package/dist/web/standalone/.next/BUILD_ID +1 -1
  152. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  153. package/dist/web/standalone/.next/build-manifest.json +3 -3
  154. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  155. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  156. package/dist/web/standalone/.next/required-server-files.json +1 -1
  157. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  159. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  167. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  171. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  172. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  177. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/index.html +1 -1
  180. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  181. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  183. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  185. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  186. package/dist/web/standalone/.next/server/app/page.js +2 -2
  187. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  190. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  191. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  195. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  196. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  197. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  198. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  199. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  200. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  201. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  202. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  203. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  204. package/dist/web/standalone/server.js +1 -1
  205. package/dist/welcome-screen.js +7 -8
  206. package/package.json +4 -4
  207. package/packages/contracts/dist/rpc.test.js +7 -0
  208. package/packages/contracts/dist/rpc.test.js.map +1 -1
  209. package/packages/contracts/dist/workflow.d.ts +21 -0
  210. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  211. package/packages/contracts/dist/workflow.js +24 -0
  212. package/packages/contracts/dist/workflow.js.map +1 -1
  213. package/packages/contracts/src/rpc.test.ts +8 -0
  214. package/packages/contracts/src/workflow.ts +24 -0
  215. package/packages/daemon/package.json +2 -2
  216. package/packages/mcp-server/README.md +13 -4
  217. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  218. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  219. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  220. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  221. package/packages/mcp-server/package.json +2 -2
  222. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  223. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  224. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  225. package/packages/native/package.json +1 -1
  226. package/packages/native/src/__tests__/stream-process.test.mjs +32 -12
  227. package/packages/native/tsconfig.json +2 -1
  228. package/packages/native/tsconfig.tsbuildinfo +1 -1
  229. package/packages/pi-agent-core/package.json +1 -1
  230. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  231. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  232. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  233. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  234. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  235. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  236. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  237. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  238. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  239. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  240. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  241. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  242. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  243. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  244. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  245. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  246. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  247. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  248. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  249. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  250. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  251. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  252. package/packages/pi-ai/package.json +1 -1
  253. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  254. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  255. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  256. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  257. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  258. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  259. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  260. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  261. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  262. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  263. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  264. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  265. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  267. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  269. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  271. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  273. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  275. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +3 -0
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +16 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
  290. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  292. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  298. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  300. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  301. package/packages/pi-coding-agent/package.json +1 -1
  302. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  303. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  304. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  305. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  306. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  307. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  308. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  309. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +20 -0
  310. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -0
  311. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  312. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  313. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
  314. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  315. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  316. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  317. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  318. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  319. package/packages/pi-tui/dist/__tests__/loader.test.d.ts +2 -0
  320. package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
  321. package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
  322. package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
  323. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  324. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  325. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  326. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  327. package/packages/pi-tui/dist/__tests__/tui.test.js +72 -4
  328. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  329. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  330. package/packages/pi-tui/dist/components/loader.js +3 -0
  331. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  332. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  333. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  334. package/packages/pi-tui/dist/terminal.js +12 -0
  335. package/packages/pi-tui/dist/terminal.js.map +1 -1
  336. package/packages/pi-tui/dist/tui.d.ts +1 -0
  337. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  338. package/packages/pi-tui/dist/tui.js +117 -33
  339. package/packages/pi-tui/dist/tui.js.map +1 -1
  340. package/packages/pi-tui/package.json +1 -1
  341. package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
  342. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  343. package/packages/pi-tui/src/__tests__/tui.test.ts +90 -4
  344. package/packages/pi-tui/src/components/loader.ts +3 -0
  345. package/packages/pi-tui/src/terminal.ts +11 -0
  346. package/packages/pi-tui/src/tui.ts +116 -33
  347. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  348. package/packages/rpc-client/package.json +1 -1
  349. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  350. package/pkg/package.json +1 -1
  351. package/src/resources/GSD-WORKFLOW.md +10 -1
  352. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  353. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  354. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  355. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  356. package/src/resources/extensions/cmux/index.ts +6 -0
  357. package/src/resources/extensions/gsd/auto/contracts.ts +19 -6
  358. package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
  359. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  360. package/src/resources/extensions/gsd/auto/loop.ts +123 -40
  361. package/src/resources/extensions/gsd/auto/orchestrator.ts +15 -4
  362. package/src/resources/extensions/gsd/auto/phases.ts +172 -60
  363. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  364. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  365. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  366. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  367. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  368. package/src/resources/extensions/gsd/auto-budget.ts +11 -0
  369. package/src/resources/extensions/gsd/auto-dashboard.ts +78 -5
  370. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  371. package/src/resources/extensions/gsd/auto-dispatch.ts +208 -29
  372. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  373. package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
  374. package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
  375. package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
  376. package/src/resources/extensions/gsd/auto-start.ts +109 -14
  377. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  378. package/src/resources/extensions/gsd/auto-verification.ts +174 -42
  379. package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
  380. package/src/resources/extensions/gsd/auto.ts +172 -81
  381. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
  382. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
  383. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -4
  384. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  385. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  386. package/src/resources/extensions/gsd/clean-root-preflight.ts +284 -8
  387. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  388. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  389. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  390. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  391. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  392. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  393. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +17 -4
  394. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  395. package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
  396. package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
  397. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  398. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  399. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  400. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  401. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  402. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  403. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  404. package/src/resources/extensions/gsd/doctor-git-checks.ts +73 -3
  405. package/src/resources/extensions/gsd/doctor-proactive.ts +18 -2
  406. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  407. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  408. package/src/resources/extensions/gsd/doctor.ts +2 -27
  409. package/src/resources/extensions/gsd/export-html.ts +27 -427
  410. package/src/resources/extensions/gsd/forensics.ts +9 -3
  411. package/src/resources/extensions/gsd/git-conflict-state.ts +23 -0
  412. package/src/resources/extensions/gsd/git-service.ts +182 -16
  413. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  414. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  415. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  416. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  417. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  418. package/src/resources/extensions/gsd/journal.ts +8 -1
  419. package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
  420. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  421. package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
  422. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  423. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  424. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  425. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  426. package/src/resources/extensions/gsd/paths.ts +5 -0
  427. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  428. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  429. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  430. package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
  431. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  432. package/src/resources/extensions/gsd/preferences-models.ts +6 -4
  433. package/src/resources/extensions/gsd/preferences-types.ts +35 -0
  434. package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
  435. package/src/resources/extensions/gsd/preferences.ts +39 -0
  436. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  437. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  438. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  440. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  441. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  442. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  443. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  444. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  445. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  446. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  448. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  449. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  450. package/src/resources/extensions/gsd/repo-identity.ts +45 -25
  451. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  452. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  453. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  454. package/src/resources/extensions/gsd/session-lock.ts +15 -2
  455. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
  456. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
  457. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  458. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  459. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  460. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  461. package/src/resources/extensions/gsd/state.ts +33 -7
  462. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  463. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  464. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  465. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  466. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  467. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  468. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  469. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  470. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +775 -34
  471. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +245 -28
  472. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  473. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  474. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  475. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
  476. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
  477. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  478. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  479. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  480. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
  481. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  482. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  483. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  484. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  485. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +170 -3
  486. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  487. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  488. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  489. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
  490. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
  491. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  492. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  493. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  494. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  495. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  496. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  497. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +139 -1
  498. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  499. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
  500. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  501. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  502. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  503. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
  504. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
  505. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  506. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  507. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  508. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  509. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  510. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  511. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  512. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  513. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  514. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  515. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  516. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  517. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  518. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +36 -1
  519. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +33 -1
  520. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  521. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
  522. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
  523. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
  524. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  525. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
  526. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  527. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  528. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  529. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  530. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  531. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
  532. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
  533. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  534. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +60 -0
  535. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  536. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  537. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  538. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  539. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  540. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  541. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  542. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  543. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  544. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  545. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  546. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  547. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
  548. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  549. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
  550. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  551. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  552. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  553. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +148 -0
  554. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
  555. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
  556. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  557. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  558. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  559. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  560. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  561. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
  562. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  563. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  564. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
  565. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
  566. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
  567. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
  568. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  569. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
  570. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  571. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  572. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  573. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  574. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  575. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  576. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +22 -0
  577. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  578. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  579. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  580. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  581. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
  582. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  583. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
  584. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  585. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  586. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  587. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  588. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +153 -1
  589. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  590. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  591. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
  592. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  593. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
  594. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  595. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
  596. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  597. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  598. package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
  599. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
  600. package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
  601. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  602. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  603. package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
  604. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
  605. package/src/resources/extensions/gsd/tui/render-kit.ts +44 -0
  606. package/src/resources/extensions/gsd/types.ts +1 -1
  607. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  608. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  609. package/src/resources/extensions/gsd/validation.ts +23 -1
  610. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  611. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  612. package/src/resources/extensions/gsd/watch/header-renderer.ts +35 -24
  613. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  614. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  615. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  616. package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
  617. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  618. package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
  619. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  620. package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
  621. package/src/resources/extensions/shared/html-shell.ts +412 -0
  622. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  623. package/src/resources/extensions/shared/next-action-ui.ts +11 -5
  624. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  625. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
  626. package/src/resources/extensions/subagent/index.ts +567 -103
  627. package/src/resources/extensions/subagent/launch.ts +131 -0
  628. package/src/resources/extensions/subagent/run-store.ts +218 -0
  629. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  630. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  631. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  632. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  633. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  634. package/src/resources/extensions/visual-brief/index.ts +8 -0
  635. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  636. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  637. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  638. package/src/resources/skills/forensics/SKILL.md +1 -1
  639. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  640. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  641. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  642. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  643. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  644. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  645. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  646. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  647. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  648. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  649. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  650. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  651. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  652. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_buildManifest.js +0 -0
  653. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_ssgManifest.js +0 -0
@@ -28,6 +28,8 @@ import { createRequire } from "node:module";
28
28
  import { dirname, join } from "node:path";
29
29
  import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
30
30
  import { buildWorkflowMcpServers } from "../gsd/workflow-mcp.js";
31
+ import { loadProjectGSDPreferences } from "../gsd/preferences.js";
32
+ import { discoverMcpServerNames, computeMcpDisallowedTools } from "../gsd/mcp-filter.js";
31
33
  import { showInterviewRound, type Question, type RoundResult } from "../shared/tui.js";
32
34
  import type {
33
35
  SDKAssistantMessage,
@@ -249,8 +251,8 @@ export function normalizeClaudePathForSdk(
249
251
  bundledCliPath: string | null = resolveBundledClaudeCliPath(),
250
252
  ): string {
251
253
  if (platform !== "win32") return resolvedPath;
252
- if (/\.exe$/i.test(resolvedPath)) return resolvedPath;
253
- if (bundledCliPath) return bundledCliPath;
254
+ if (/\.exe$/i.test(resolvedPath)) return resolvedPath.replaceAll("\\", "/");
255
+ if (bundledCliPath) return bundledCliPath.replaceAll("\\", "/");
254
256
  return resolvedPath;
255
257
  }
256
258
 
@@ -314,6 +316,21 @@ export function buildPromptFromContext(context: Context): string {
314
316
  "Do not emit <user_message>, <assistant_message>, or <prior_system_context> tags in your response.",
315
317
  ];
316
318
 
319
+ // The prior system context lists pi-native tool names (lowercase: bash, read, gsd_exec, etc.)
320
+ // but this process runs inside Claude Code where tool names differ. Inject a remapping note
321
+ // before the prior context so the model uses correct names regardless of what the prior
322
+ // context describes.
323
+ parts.push(
324
+ "<tool_context>\n" +
325
+ "You are running inside Claude Code. Use these exact tool names — do not use lowercase or pi-native names:\n" +
326
+ "- Shell commands: 'Bash' (not 'bash')\n" +
327
+ "- File operations: 'Read', 'Write', 'Edit', 'Glob', 'Grep' (PascalCase, not lowercase)\n" +
328
+ "- GSD workflow tools (gsd_exec, gsd_slice_complete, gsd_task_complete, gsd_plan_slice, etc.) " +
329
+ "are MCP tools — call them as mcp__gsd-workflow__<tool_name> " +
330
+ "(e.g. mcp__gsd-workflow__gsd_exec, mcp__gsd-workflow__gsd_slice_complete)\n" +
331
+ "</tool_context>",
332
+ );
333
+
317
334
  if (context.systemPrompt) {
318
335
  parts.push(`<prior_system_context>\n${context.systemPrompt}\n</prior_system_context>`);
319
336
  }
@@ -426,7 +443,7 @@ function makeErrorMessage(model: string, errorMsg: string): AssistantMessage {
426
443
 
427
444
  export function isClaudeCodeAbortErrorMessage(message: string | undefined | null): boolean {
428
445
  if (!message) return false;
429
- return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
446
+ return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user|aborterror)\b/i.test(message);
430
447
  }
431
448
 
432
449
  function isBareClaudeCodeAbortErrorMessage(message: string | undefined | null): boolean {
@@ -1317,13 +1334,42 @@ export function buildSdkOptions(
1317
1334
  const sdkCwd = typeof cwd === "string" && cwd.trim().length > 0 ? cwd : process.cwd();
1318
1335
  const mcpServers = buildWorkflowMcpServers(sdkCwd);
1319
1336
  const permissionMode = overrides?.permissionMode ?? "bypassPermissions";
1337
+
1338
+ const preferences = loadProjectGSDPreferences(sdkCwd);
1339
+ const mcpConfig = preferences?.preferences.claude_code_mcp;
1340
+ const workflowServerName = mcpServers ? Object.keys(mcpServers)[0] : undefined;
1341
+
1342
+ // Always discover project MCPs — needed for both duplicate detection and filtering.
1343
+ const discovered = discoverMcpServerNames(sdkCwd);
1344
+
1345
+ // If the workflow MCP is already declared in the project's .mcp.json or
1346
+ // .claude/settings.json, do not inject it again via mcpServers. Passing the
1347
+ // same server name from two sources causes a duplicate registration conflict
1348
+ // that prevents the MCP server from loading (tools become unavailable).
1349
+ const workflowAlreadyInProject = workflowServerName !== undefined && discovered.includes(workflowServerName);
1350
+ let filteredMcpServers = workflowAlreadyInProject ? undefined : mcpServers;
1351
+ let extraDisallowedTools: string[] = [];
1352
+ let workflowExplicitlyBlocked = false;
1353
+
1354
+ if (mcpConfig) {
1355
+ extraDisallowedTools = computeMcpDisallowedTools(modelId, mcpConfig, discovered, workflowServerName);
1356
+ if (workflowServerName && extraDisallowedTools.includes(`mcp__${workflowServerName}__*`)) {
1357
+ filteredMcpServers = undefined;
1358
+ workflowExplicitlyBlocked = true;
1359
+ }
1360
+ }
1361
+
1320
1362
  // Globally unblock the tools GSD expects Claude Code to run. When the
1321
1363
  // workflow MCP server is available, prefer its `ask_user_questions` tool over
1322
1364
  // Claude Code's native `AskUserQuestion`; the MCP path carries stable IDs and
1323
1365
  // routes responses through the GSD elicitation bridge.
1324
1366
  // Opt back into gated mode with GSD_CLAUDE_CODE_PERMISSION_MODE=acceptEdits.
1325
- const workflowMcpTools = mcpServers ? Object.keys(mcpServers).map((serverName) => `mcp__${serverName}__*`) : [];
1326
- const disallowedTools: string[] = workflowMcpTools.length > 0 ? ["AskUserQuestion"] : [];
1367
+ // Include the workflow pattern in allowedTools whether the server is GSD-injected
1368
+ // or declared in the project config but not if explicitly blocked by user prefs.
1369
+ const workflowMcpTools = filteredMcpServers
1370
+ ? Object.keys(filteredMcpServers).map((serverName) => `mcp__${serverName}__*`)
1371
+ : (!workflowExplicitlyBlocked && workflowServerName ? [`mcp__${workflowServerName}__*`] : []);
1372
+ const disallowedTools: string[] = [...(workflowMcpTools.length > 0 ? ["AskUserQuestion"] : []), ...extraDisallowedTools];
1327
1373
  const allowedTools = [
1328
1374
  "Read",
1329
1375
  "Write",
@@ -1363,7 +1409,7 @@ export function buildSdkOptions(
1363
1409
  systemPrompt: { type: "preset", preset: "claude_code" },
1364
1410
  disallowedTools,
1365
1411
  ...(allowedTools.length > 0 ? { allowedTools } : {}),
1366
- ...(mcpServers ? { mcpServers } : {}),
1412
+ ...(filteredMcpServers ? { mcpServers: filteredMcpServers } : {}),
1367
1413
  betas: (modelId.includes("sonnet") || modelId.includes("opus-4-7") || modelId.includes("opus-4.7")) ? ["context-1m-2025-08-07"] : [],
1368
1414
  ...(thinkingConfig ?? {}),
1369
1415
  ...(effort ? { effort } : {}),
@@ -1,7 +1,24 @@
1
1
  import { describe, test } from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { mapContentBlock, parseMcpToolName, PartialMessageBuilder } from "../partial-builder.ts";
4
- import type { BetaContentBlock, BetaRawMessageStreamEvent } from "../sdk-types.ts";
3
+ import { mapContentBlock, mapUsage, parseMcpToolName, PartialMessageBuilder } from "../partial-builder.ts";
4
+ import type { BetaContentBlock, BetaRawMessageStreamEvent, NonNullableUsage } from "../sdk-types.ts";
5
+
6
+ describe("mapUsage", () => {
7
+ test("excludes cumulative cache reads from context-sized totalTokens (#5243)", () => {
8
+ const usage: NonNullableUsage = {
9
+ input_tokens: 150_000,
10
+ output_tokens: 2_000,
11
+ cache_read_input_tokens: 900_000,
12
+ cache_creation_input_tokens: 3_000,
13
+ };
14
+
15
+ const mapped = mapUsage(usage, 1.23);
16
+
17
+ assert.equal(mapped.cacheRead, 900_000);
18
+ assert.equal(mapped.totalTokens, 155_000);
19
+ assert.equal(mapped.cost.total, 1.23);
20
+ });
21
+ });
5
22
 
6
23
  describe("PartialMessageBuilder — malformed tool arguments (#2574)", () => {
7
24
  /**
@@ -54,6 +54,8 @@ const WORKFLOW_MCP_ENV_KEYS = [
54
54
  "GSD_WORKFLOW_MCP_ARGS",
55
55
  "GSD_WORKFLOW_MCP_ENV",
56
56
  "GSD_WORKFLOW_MCP_CWD",
57
+ "GSD_PROJECT_ROOT",
58
+ "GSD_WORKFLOW_PROJECT_ROOT",
57
59
  ] as const;
58
60
 
59
61
  type WorkflowMcpEnvKey = (typeof WORKFLOW_MCP_ENV_KEYS)[number];
@@ -64,6 +66,9 @@ function setWorkflowMcpEnv(
64
66
  const prev: Partial<Record<WorkflowMcpEnvKey, string | undefined>> = {};
65
67
  for (const key of WORKFLOW_MCP_ENV_KEYS) {
66
68
  prev[key] = process.env[key];
69
+ // Clear all managed keys so tests run in a clean env state.
70
+ // Keys present in `values` are set to the desired test value below.
71
+ delete process.env[key];
67
72
  }
68
73
  for (const [key, value] of Object.entries(values)) {
69
74
  process.env[key] = value;
@@ -978,6 +983,39 @@ describe("stream-adapter — session persistence (#2859)", () => {
978
983
  }
979
984
  });
980
985
 
986
+ test("buildSdkOptions does not inject workflow MCP when already declared in project .mcp.json (avoids duplicate registration)", () => {
987
+ const restore = setWorkflowMcpEnv({
988
+ GSD_WORKFLOW_MCP_COMMAND: "node",
989
+ GSD_WORKFLOW_MCP_NAME: "gsd-workflow",
990
+ GSD_WORKFLOW_MCP_ARGS: JSON.stringify(["packages/mcp-server/dist/cli.js"]),
991
+ GSD_WORKFLOW_MCP_ENV: JSON.stringify({ GSD_CLI_PATH: "/tmp/gsd" }),
992
+ GSD_WORKFLOW_MCP_CWD: "/tmp/project",
993
+ });
994
+ const originalCwd = process.cwd();
995
+ const projectDir = mkdtempSync(join(tmpdir(), "claude-mcp-dup-"));
996
+ try {
997
+ // Simulate a project that already has gsd-workflow in its .mcp.json
998
+ writeFileSync(
999
+ join(projectDir, ".mcp.json"),
1000
+ JSON.stringify({ mcpServers: { "gsd-workflow": { command: "node", args: ["old-cli.js"] }, "other-mcp": { command: "npx", args: ["other"] } } }),
1001
+ );
1002
+ process.chdir(projectDir);
1003
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "test");
1004
+ // Should NOT inject gsd-workflow via mcpServers (project already has it)
1005
+ assert.equal(options.mcpServers, undefined, "mcpServers should be omitted when workflow already in .mcp.json");
1006
+ // But allowedTools should still include the workflow pattern
1007
+ const allowedTools = options.allowedTools as string[];
1008
+ assert.ok(allowedTools.includes("mcp__gsd-workflow__*"), "allowedTools must include workflow pattern even when not injected");
1009
+ // AskUserQuestion should be disallowed (workflow is available via project config)
1010
+ const disallowedTools = options.disallowedTools as string[];
1011
+ assert.ok(disallowedTools.includes("AskUserQuestion"), "AskUserQuestion should be suppressed when workflow is available");
1012
+ } finally {
1013
+ process.chdir(originalCwd);
1014
+ rmSync(projectDir, { recursive: true, force: true });
1015
+ restore();
1016
+ }
1017
+ });
1018
+
981
1019
  test("buildSdkOptions preserves runtime callbacks such as onElicitation", () => {
982
1020
  const restore = setWorkflowMcpEnv({});
983
1021
  const onElicitation = async () => ({ action: "decline" as const });
@@ -1258,9 +1296,18 @@ describe("stream-adapter — abort classification (F2)", () => {
1258
1296
  test("recognizes Claude Code SDK abort exceptions", () => {
1259
1297
  assert.equal(isClaudeCodeAbortErrorMessage("Claude Code process aborted by user"), true);
1260
1298
  assert.equal(isClaudeCodeAbortErrorMessage("Request aborted by user"), true);
1299
+ assert.equal(isClaudeCodeAbortErrorMessage("AbortError: The operation was aborted"), true);
1261
1300
  assert.equal(isClaudeCodeAbortErrorMessage("rate limit exceeded"), false);
1262
1301
  });
1263
1302
 
1303
+ test("does not misclassify non-user abort contexts", () => {
1304
+ assert.equal(isClaudeCodeAbortErrorMessage("Job aborted due to timeout"), false);
1305
+ assert.equal(isClaudeCodeAbortErrorMessage("Operation aborted: disk full"), false);
1306
+ assert.equal(isClaudeCodeAbortErrorMessage("aborted by system cleanup"), false);
1307
+ assert.equal(isClaudeCodeAbortErrorMessage("Database transaction aborted due to constraint violation"), false);
1308
+ assert.equal(isClaudeCodeAbortErrorMessage("Connection aborted unexpectedly"), false);
1309
+ });
1310
+
1264
1311
  test("makeAbortedMessage sets stopReason to 'aborted', not 'error'", () => {
1265
1312
  const message = makeAbortedMessage("claude-sonnet-4-6", "");
1266
1313
  assert.equal(message.stopReason, "aborted");
@@ -1459,8 +1506,8 @@ describe("stream-adapter — Windows Claude path lookup (#3770)", () => {
1459
1506
  test("normalizeClaudePathForSdk swaps Windows shim paths to bundled cli.js", () => {
1460
1507
  const shimPath = "C:\\Users\\djeff\\AppData\\Roaming\\npm\\claude";
1461
1508
  const bundled = "C:\\repo\\node_modules\\@anthropic-ai\\claude-agent-sdk\\cli.js";
1462
- assert.equal(normalizeClaudePathForSdk(shimPath, "win32", bundled), bundled);
1463
- assert.equal(normalizeClaudePathForSdk("C:\\Program Files\\Claude\\claude.exe", "win32", bundled), "C:\\Program Files\\Claude\\claude.exe");
1509
+ assert.equal(normalizeClaudePathForSdk(shimPath, "win32", bundled), "C:/repo/node_modules/@anthropic-ai/claude-agent-sdk/cli.js");
1510
+ assert.equal(normalizeClaudePathForSdk("C:\\Program Files\\Claude\\claude.exe", "win32", bundled), "C:/Program Files/Claude/claude.exe");
1464
1511
  });
1465
1512
 
1466
1513
  test("resolveBundledClaudeCliPath returns a .js path when SDK package is present", () => {
@@ -374,6 +374,12 @@ export class CmuxClient {
374
374
  const stdout = await this.runAsync(["send-surface", "--surface", surfaceId, payload]);
375
375
  return stdout !== null;
376
376
  }
377
+
378
+ // Send Ctrl-C (ETX) to a surface to interrupt the running command.
379
+ async sendInterrupt(surfaceId: string): Promise<boolean> {
380
+ const stdout = await this.runAsync(["send-surface", "--surface", surfaceId, "\x03"]);
381
+ return stdout !== null;
382
+ }
377
383
  }
378
384
 
379
385
  export function syncCmuxSidebar(preferences: CmuxPreferences | undefined, state: CmuxState): void {
@@ -3,6 +3,7 @@
3
3
 
4
4
  import type { GSDState } from "../types.js";
5
5
  import type { MinimalModelRegistry } from "../context-budget.js";
6
+ import type { AutoSession } from "./session.js";
6
7
 
7
8
  export interface AutoSessionContext {
8
9
  basePath: string;
@@ -22,6 +23,8 @@ export interface AutoStatus {
22
23
  }
23
24
 
24
25
  export type AutoAdvanceResult =
26
+ | { kind: "started" }
27
+ | { kind: "resumed" }
25
28
  | { kind: "advanced"; unit: UnitRef; stateSnapshot: GSDState }
26
29
  | { kind: "blocked"; reason: string; action: "pause" | "stop"; stateSnapshot?: GSDState }
27
30
  | { kind: "stopped"; reason: string; stateSnapshot?: GSDState }
@@ -39,6 +42,8 @@ export interface AutoOrchestrationModule {
39
42
  export interface DispatchAdapter {
40
43
  decideNextUnit(input: {
41
44
  stateSnapshot: GSDState;
45
+ /** Optional live session context, forwarded to dispatch rules that need session-derived state. */
46
+ session?: AutoSession;
42
47
  /** Mirrors `DispatchContext.structuredQuestionsAvailable` — "true"/"false" string per the dispatch contract. */
43
48
  structuredQuestionsAvailable?: "true" | "false";
44
49
  /** Session model context window in tokens, forwarded to the budget engine. */
@@ -47,12 +52,20 @@ export interface DispatchAdapter {
47
52
  sessionProvider?: string;
48
53
  /** Model registry for executor-model lookups inside the budget engine. */
49
54
  modelRegistry?: MinimalModelRegistry;
50
- }): Promise<{
51
- unitType: string;
52
- unitId: string;
53
- reason: string;
54
- preconditions: string[];
55
- } | null>;
55
+ }): Promise<
56
+ | {
57
+ kind: "blocked";
58
+ reason: string;
59
+ action: "pause" | "stop";
60
+ }
61
+ | {
62
+ unitType: string;
63
+ unitId: string;
64
+ reason: string;
65
+ preconditions: string[];
66
+ }
67
+ | null
68
+ >;
56
69
  }
57
70
 
58
71
  export interface RecoveryAdapter {
@@ -57,6 +57,7 @@ function retryBudgetSuppresses(unitKey: string): boolean {
57
57
  */
58
58
  export function detectStuck(
59
59
  window: readonly WindowEntry[],
60
+ _retryContext?: { pendingRetry?: boolean; retryAttempt?: number },
60
61
  ): { stuck: true; reason: string } | null {
61
62
  if (window.length < 2) return null;
62
63
 
@@ -7,9 +7,14 @@
7
7
  */
8
8
 
9
9
  /**
10
- * Error codes indicating infrastructure failures that cannot be recovered by
11
- * retrying. Each retry re-dispatches the unit at full LLM cost, so we bail
12
- * immediately rather than burning budget on guaranteed failures.
10
+ * Error codes indicating infrastructure-level failures from the OS,
11
+ * filesystem, or network. This set includes permanent resource failures
12
+ * (ENOSPC, ENOMEM, EROFS), transient resource exhaustion (EAGAIN, ENOBUFS),
13
+ * and network/offline errors (ECONNREFUSED, ENOTFOUND, ENETUNREACH).
14
+ *
15
+ * Transient git failures are retried separately through
16
+ * TRANSIENT_GIT_RETRY_CODES in native-git-bridge.ts before escalating to the
17
+ * auto-loop.
13
18
  */
14
19
  export const INFRA_ERROR_CODES: ReadonlySet<string> = new Set([
15
20
  "ENOSPC", // disk full
@@ -19,6 +24,7 @@ export const INFRA_ERROR_CODES: ReadonlySet<string> = new Set([
19
24
  "EMFILE", // too many open files (process)
20
25
  "ENFILE", // too many open files (system)
21
26
  "EAGAIN", // resource temporarily unavailable (resource exhaustion)
27
+ "ENOBUFS", // no buffer space available (transient pipe exhaustion)
22
28
  "ECONNREFUSED", // connection refused (offline / local server down)
23
29
  "ENOTFOUND", // DNS lookup failed (offline / no network)
24
30
  "ENETUNREACH", // network unreachable (offline / no route)
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Main auto-mode execution loop.
1
3
  /**
2
4
  * auto/loop.ts — Main auto-mode execution loop.
3
5
  *
@@ -24,6 +26,7 @@ import {
24
26
  runDispatch,
25
27
  runGuards,
26
28
  runFinalize,
29
+ STUCK_WINDOW_SIZE,
27
30
  } from "./phases.js";
28
31
  import { debugLog } from "../debug-logger.js";
29
32
  import { isInfrastructureError, isTransientCooldownError, getCooldownRetryAfterMs, COOLDOWN_FALLBACK_WAIT_MS, MAX_COOLDOWN_RETRIES } from "./infra-errors.js";
@@ -78,7 +81,10 @@ import { createWorkflowTurnReporter } from "./workflow-turn-reporter.js";
78
81
  import { validateWorkflowSessionLock } from "./workflow-session-lock.js";
79
82
  import { dequeueSidecarItem } from "./workflow-sidecar-queue.js";
80
83
  import { maintainWorkerHeartbeat } from "./workflow-worker-heartbeat.js";
81
- import { measureMemoryPressure } from "./workflow-memory-pressure.js";
84
+ import {
85
+ measureMemoryPressure,
86
+ shouldCheckMemoryPressure,
87
+ } from "./workflow-memory-pressure.js";
82
88
  import { buildSidecarIterationData } from "./workflow-sidecar-iteration.js";
83
89
  import {
84
90
  createExecutionGraphUnitDispatchDeps,
@@ -106,7 +112,6 @@ import { handleCustomEngineReconcileOutcome } from "./workflow-custom-engine-rec
106
112
  // helpers degrade to the empty-state fallback that #3704 already
107
113
  // tolerates — same behavior as a fresh session.
108
114
  const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
109
- const RECENT_UNIT_KEYS_LIMIT = 20;
110
115
 
111
116
  function stableStuckStateScopeId(s: AutoSession): string {
112
117
  return normalizeRealPath(s.scope?.workspace.projectRoot ?? (s.originalBasePath || s.basePath));
@@ -116,7 +121,7 @@ function loadStuckState(s: AutoSession): { recentUnits: Array<{ key: string }>;
116
121
  const scopeId = stableStuckStateScopeId(s);
117
122
  if (!scopeId) return { recentUnits: [], stuckRecoveryAttempts: 0 };
118
123
  try {
119
- const recentUnits = getRecentUnitKeysForProjectRoot(scopeId, RECENT_UNIT_KEYS_LIMIT);
124
+ const recentUnits = getRecentUnitKeysForProjectRoot(scopeId, STUCK_WINDOW_SIZE);
120
125
  const stuckRecoveryAttempts =
121
126
  getRuntimeKv<number>("global", scopeId, STUCK_RECOVERY_ATTEMPTS_KEY) ?? 0;
122
127
  return { recentUnits, stuckRecoveryAttempts };
@@ -203,9 +208,9 @@ function logCustomVerifyRetrySaveFailure(err: unknown): void {
203
208
  }
204
209
 
205
210
  // ── Memory pressure monitoring (#3331) ──────────────────────────────────
206
- // Check heap usage every N iterations and trigger graceful shutdown before
207
- // the OS OOM killer sends SIGKILL. The threshold is 90% of the V8 heap
208
- // limit (--max-old-space-size or default ~1.5-4GB depending on platform).
211
+ // Check heap usage on session startup, then every N iterations, and trigger
212
+ // graceful shutdown before the OS OOM killer sends SIGKILL. The threshold is
213
+ // 90% of the V8 heap limit (--max-old-space-size or default ~1.5-4GB depending on platform).
209
214
  const MEMORY_CHECK_INTERVAL = 5; // check every 5 iterations
210
215
  const MAX_CUSTOM_ENGINE_VERIFY_RETRIES = 3;
211
216
 
@@ -281,6 +286,9 @@ export async function autoLoop(
281
286
  recentUnits: persisted.recentUnits,
282
287
  stuckRecoveryAttempts: persisted.stuckRecoveryAttempts,
283
288
  consecutiveFinalizeTimeouts: 0,
289
+ consecutiveDispatchCount: new Map<string, number>(),
290
+ lastDispatchedKey: null,
291
+ lastDispatchPhase: null,
284
292
  };
285
293
  let consecutiveErrors = 0;
286
294
  let consecutiveCooldowns = 0;
@@ -372,7 +380,7 @@ export async function autoLoop(
372
380
 
373
381
  // ── Memory pressure check (#3331) ──
374
382
  // Graceful shutdown before OOM killer sends SIGKILL.
375
- if (iteration % MEMORY_CHECK_INTERVAL === 0) {
383
+ if (shouldCheckMemoryPressure(iteration, MEMORY_CHECK_INTERVAL)) {
376
384
  const mem = measureMemoryPressure();
377
385
  debugLog("autoLoop", { phase: "memory-check", ...mem });
378
386
  const memoryDecision = decideMemoryPressure({ ...mem, iteration });
@@ -418,9 +426,11 @@ export async function autoLoop(
418
426
  logIterationComplete: () => debugLog("autoLoop", { phase: "iteration-complete", iteration }),
419
427
  });
420
428
  };
429
+ let stuckStatePersistedThisIteration = false;
421
430
  const finishIncompleteIteration = (details: Record<string, unknown>): void => {
422
431
  emitIterationEnd(details);
423
432
  saveStuckState(s, loopState);
433
+ stuckStatePersistedThisIteration = true;
424
434
  };
425
435
 
426
436
  try {
@@ -726,42 +736,98 @@ export async function autoLoop(
726
736
  }
727
737
 
728
738
  if (!sidecarItem) {
729
- // ── Phase 1: Pre-dispatch ─────────────────────────────────────────
730
- const preDispatchResult = await runPreDispatch(ic, loopState);
731
- phaseReporter.report("pre-dispatch", preDispatchResult.action);
732
- if (preDispatchResult.action === "break") {
733
- finishTurn("stopped", "manual-attention", "pre-dispatch-break");
734
- break;
735
- }
736
- if (preDispatchResult.action === "continue") {
737
- finishTurn("skipped");
738
- continue;
739
- }
739
+ const orchestration = s.orchestration;
740
+ if (orchestration) {
741
+ const existingPendingDispatch = s.pendingOrchestrationDispatch;
742
+ const orchestrationResult = existingPendingDispatch
743
+ ? {
744
+ kind: "advanced" as const,
745
+ unit: {
746
+ unitType: existingPendingDispatch.unitType,
747
+ unitId: existingPendingDispatch.unitId,
748
+ },
749
+ stateSnapshot: existingPendingDispatch.state,
750
+ }
751
+ : await orchestration.advance();
740
752
 
741
- const preData = preDispatchResult.data;
753
+ if (orchestrationResult.kind === "blocked") {
754
+ s.pendingOrchestrationDispatch = null;
755
+ if (orchestrationResult.action === "pause") {
756
+ await deps.pauseAuto(ctx, pi, {
757
+ message: orchestrationResult.reason,
758
+ category: "unknown",
759
+ });
760
+ } else {
761
+ await deps.stopAuto(ctx, pi, orchestrationResult.reason);
762
+ }
763
+ finishTurn("stopped", "manual-attention", "orchestration-blocked");
764
+ break;
765
+ }
742
766
 
743
- // ── Phase 2: Guards ───────────────────────────────────────────────
744
- const guardsResult = await runGuards(ic, preData.mid);
745
- phaseReporter.report("guard", guardsResult.action);
746
- if (guardsResult.action === "break") {
747
- finishTurn("stopped", "manual-attention", "guard-break");
748
- break;
749
- }
767
+ if (orchestrationResult.kind === "stopped") {
768
+ s.pendingOrchestrationDispatch = null;
769
+ await deps.stopAuto(ctx, pi, orchestrationResult.reason);
770
+ finishTurn("stopped", "manual-attention", "orchestration-stopped");
771
+ break;
772
+ }
750
773
 
751
- // ── Phase 3: Dispatch ─────────────────────────────────────────────
752
- const dispatchResult = await runDispatch(ic, preData, loopState);
753
- phaseReporter.report("dispatch", dispatchResult.action);
754
- if (dispatchResult.action === "break") {
755
- finishTurn("stopped", "manual-attention", "dispatch-break");
756
- break;
757
- }
758
- if (dispatchResult.action === "continue") {
759
- finishTurn("skipped");
760
- continue;
774
+ if (orchestrationResult.kind !== "advanced") {
775
+ s.pendingOrchestrationDispatch = null;
776
+ finishTurn("skipped");
777
+ continue;
778
+ }
779
+ const pendingDispatch = s.pendingOrchestrationDispatch;
780
+ iterData = {
781
+ unitType: pendingDispatch?.unitType ?? orchestrationResult.unit.unitType,
782
+ unitId: pendingDispatch?.unitId ?? orchestrationResult.unit.unitId,
783
+ prompt: pendingDispatch?.prompt ?? "",
784
+ finalPrompt: pendingDispatch?.prompt ?? "",
785
+ pauseAfterUatDispatch: pendingDispatch?.pauseAfterUatDispatch ?? false,
786
+ state: pendingDispatch?.state ?? orchestrationResult.stateSnapshot,
787
+ mid: pendingDispatch?.mid ?? s.currentMilestoneId ?? "workflow",
788
+ midTitle: pendingDispatch?.midTitle ?? orchestrationResult.stateSnapshot.activeMilestone?.title ?? "Workflow",
789
+ isRetry: false,
790
+ previousTier: undefined,
791
+ };
792
+ s.pendingOrchestrationDispatch = null;
793
+ phaseReporter.report("dispatch", "next", {
794
+ unitType: iterData.unitType,
795
+ unitId: iterData.unitId,
796
+ });
797
+ observedUnitType = iterData.unitType;
798
+ observedUnitId = iterData.unitId;
799
+ } else {
800
+ const preDispatchResult = await runPreDispatch(ic, loopState);
801
+ phaseReporter.report("pre-dispatch", preDispatchResult.action);
802
+ if (preDispatchResult.action === "break") {
803
+ finishTurn("stopped", "manual-attention", "pre-dispatch-break");
804
+ break;
805
+ }
806
+ if (preDispatchResult.action === "continue") {
807
+ finishTurn("skipped");
808
+ continue;
809
+ }
810
+ const preData = preDispatchResult.data;
811
+ const guardsResult = await runGuards(ic, preData.mid);
812
+ phaseReporter.report("guard", guardsResult.action);
813
+ if (guardsResult.action === "break") {
814
+ finishTurn("stopped", "manual-attention", "guard-break");
815
+ break;
816
+ }
817
+ const dispatchResult = await runDispatch(ic, preData, loopState);
818
+ phaseReporter.report("dispatch", dispatchResult.action);
819
+ if (dispatchResult.action === "break") {
820
+ finishTurn("stopped", "manual-attention", "dispatch-break");
821
+ break;
822
+ }
823
+ if (dispatchResult.action === "continue") {
824
+ finishTurn("skipped");
825
+ continue;
826
+ }
827
+ iterData = dispatchResult.data;
828
+ observedUnitType = iterData.unitType;
829
+ observedUnitId = iterData.unitId;
761
830
  }
762
- iterData = dispatchResult.data;
763
- observedUnitType = iterData.unitType;
764
- observedUnitId = iterData.unitId;
765
831
  } else {
766
832
  iterData = await buildSidecarIterationData({
767
833
  sidecarItem,
@@ -942,11 +1008,18 @@ export async function autoLoop(
942
1008
  unitId: iterData.unitId,
943
1009
  });
944
1010
  const finalizeReason = finalizeResult.action === "break" ? finalizeResult.reason : undefined;
1011
+ const finalizeStatus = finalizeReason === "step-wizard"
1012
+ ? "completed"
1013
+ : finalizeResult.action === "next"
1014
+ ? "completed"
1015
+ : finalizeResult.action === "continue"
1016
+ ? "retry"
1017
+ : "stopped";
945
1018
  journalReporter.emit("post-unit-finalize-end", {
946
1019
  iteration,
947
1020
  unitType: iterData.unitType,
948
1021
  unitId: iterData.unitId,
949
- status: finalizeResult.action === "next" ? "completed" : finalizeResult.action === "continue" ? "retry" : "stopped",
1022
+ status: finalizeStatus,
950
1023
  action: finalizeResult.action,
951
1024
  ...(finalizeReason ? { reason: finalizeReason } : {}),
952
1025
  });
@@ -980,6 +1053,7 @@ export async function autoLoop(
980
1053
  finishIncompleteIteration({
981
1054
  status: "retry",
982
1055
  reason: "finalize-retry",
1056
+ retry: true,
983
1057
  unitType: iterData.unitType,
984
1058
  unitId: iterData.unitId,
985
1059
  });
@@ -992,7 +1066,12 @@ export async function autoLoop(
992
1066
  logWriteFailure: logDispatchLedgerWriteFailure,
993
1067
  }) || dispatchSettled;
994
1068
  completeIteration();
1069
+ stuckStatePersistedThisIteration = true;
995
1070
  finishTurn("completed");
1071
+ if (finalizeDecision.action === "complete-and-break") {
1072
+ s.preserveStepSurfaceAfterLoopExit = true;
1073
+ break;
1074
+ }
996
1075
  } catch (loopErr) {
997
1076
  // ── Blanket catch: absorb unexpected exceptions, apply graduated recovery ──
998
1077
  const msg = loopErr instanceof Error ? loopErr.message : String(loopErr);
@@ -1139,6 +1218,10 @@ export async function autoLoop(
1139
1218
  ctx.ui.notify(errorDecision.notifyMessage, "warning");
1140
1219
  }
1141
1220
  finishTurn(errorDecision.turnStatus, "execution", msg);
1221
+ } finally {
1222
+ if (!stuckStatePersistedThisIteration) {
1223
+ saveStuckState(s, loopState);
1224
+ }
1142
1225
  }
1143
1226
  }
1144
1227
 
@@ -37,7 +37,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
37
37
  this.bumpTransition();
38
38
  await this.deps.runtime.journalTransition({ name: "start" });
39
39
  await this.deps.notifications.notifyLifecycle({ name: "start" });
40
- return this.advance();
40
+ return { kind: "started" };
41
41
  }
42
42
 
43
43
  public async advance(): Promise<AutoAdvanceResult> {
@@ -54,7 +54,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
54
54
  rationale: "resource version guard blocked dispatch",
55
55
  findings: staleMsg,
56
56
  });
57
- const blocked: AutoAdvanceResult = { kind: "blocked", reason: staleMsg, action: "stop" };
57
+ const blocked: AutoAdvanceResult = { kind: "blocked", reason: staleMsg, action: "pause" };
58
58
  await this.deps.runtime.journalTransition({ name: "advance-blocked", reason: blocked.reason });
59
59
  await this.deps.health.postAdvanceRecord(blocked);
60
60
  return blocked;
@@ -128,6 +128,17 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
128
128
  await this.deps.health.postAdvanceRecord(stopped);
129
129
  return stopped;
130
130
  }
131
+ if (!("unitType" in decision)) {
132
+ const blocked: AutoAdvanceResult = {
133
+ kind: "blocked",
134
+ reason: decision.reason,
135
+ action: decision.action,
136
+ stateSnapshot: reconciliation.stateSnapshot,
137
+ };
138
+ await this.deps.runtime.journalTransition({ name: "advance-blocked", reason: blocked.reason });
139
+ await this.deps.health.postAdvanceRecord(blocked);
140
+ return blocked;
141
+ }
131
142
 
132
143
  const nextKey = `${decision.unitType}:${decision.unitId}`;
133
144
 
@@ -148,7 +159,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
148
159
  // stuck-loop for the saturated-window case.
149
160
  const matchingCount = this.dispatchKeyWindow.filter((k) => k === nextKey).length;
150
161
  if (this.lastAdvanceKey === nextKey && matchingCount < STUCK_WINDOW_SIZE) {
151
- const blocked: AutoAdvanceResult = { kind: "blocked", reason: "idempotent advance: unit already active", action: "stop" };
162
+ const blocked: AutoAdvanceResult = { kind: "blocked", reason: "idempotent advance: unit already active", action: "pause" };
152
163
  await this.deps.runtime.journalTransition({
153
164
  name: "advance-blocked",
154
165
  reason: blocked.reason,
@@ -288,7 +299,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
288
299
  this.bumpTransition();
289
300
  await this.deps.runtime.journalTransition({ name: "resume" });
290
301
  await this.deps.notifications.notifyLifecycle({ name: "resume" });
291
- return this.advance();
302
+ return { kind: "resumed" };
292
303
  }
293
304
 
294
305
  public async stop(reason: string): Promise<AutoAdvanceResult> {