@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.4813ead6

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 (500) hide show
  1. package/dist/cli-web-branch.d.ts +2 -0
  2. package/dist/cli-web-branch.js +9 -2
  3. package/dist/help-text.js +5 -0
  4. package/dist/project-sessions.js +4 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/extensions/ask-user-questions.js +78 -23
  7. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +101 -237
  8. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  9. package/dist/resources/extensions/github-sync/templates.js +3 -3
  10. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  11. package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
  12. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +763 -63
  14. package/dist/resources/extensions/gsd/auto/phases.js +28 -3
  15. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  16. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  17. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  19. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  20. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
  21. package/dist/resources/extensions/gsd/auto-prompts.js +191 -9
  22. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  23. package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
  24. package/dist/resources/extensions/gsd/auto-start.js +12 -23
  25. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  26. package/dist/resources/extensions/gsd/auto-tool-tracking.js +37 -0
  27. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -29
  28. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  29. package/dist/resources/extensions/gsd/auto-worktree.js +45 -36
  30. package/dist/resources/extensions/gsd/auto.js +73 -471
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  32. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
  33. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +103 -138
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
  36. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  37. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  38. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  39. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  40. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  41. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  42. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  43. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  44. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  45. package/dist/resources/extensions/gsd/debug-logger.js +10 -0
  46. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  47. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  48. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  49. package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
  50. package/dist/resources/extensions/gsd/doctor.js +16 -9
  51. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  52. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  53. package/dist/resources/extensions/gsd/gsd-db.js +12 -0
  54. package/dist/resources/extensions/gsd/guided-flow.js +36 -470
  55. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  56. package/dist/resources/extensions/gsd/markdown-renderer.js +33 -33
  57. package/dist/resources/extensions/gsd/mcp-filter.js +8 -1
  58. package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
  59. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  60. package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
  61. package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
  62. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  63. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  64. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  65. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  66. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  67. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  68. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  69. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  70. package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
  71. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  72. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  73. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  74. package/dist/resources/extensions/gsd/preferences.js +147 -29
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  76. package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  78. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  79. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
  80. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  82. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  84. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  85. package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  86. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  88. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  89. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  90. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  91. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  92. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  93. package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
  94. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  95. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
  96. package/dist/resources/extensions/gsd/state.js +13 -5
  97. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  98. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  99. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  100. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  101. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  102. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  103. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  104. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  105. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  106. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  107. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
  108. package/dist/resources/extensions/gsd/uat-policy.js +16 -10
  109. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  110. package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
  111. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  112. package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
  113. package/dist/resources/extensions/gsd/user-input-boundary.js +65 -4
  114. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  115. package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
  116. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  117. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  118. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  119. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  120. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  121. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  122. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  123. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  124. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  125. package/dist/update-cmd.js +20 -0
  126. package/dist/web/standalone/.next/BUILD_ID +1 -1
  127. package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
  128. package/dist/web/standalone/.next/build-manifest.json +3 -3
  129. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  130. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  131. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/index.html +1 -1
  183. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
  190. package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
  191. package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
  192. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  193. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +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/2659.b7b129ee6a769448.js +1 -0
  199. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  200. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  201. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  202. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  203. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  204. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  206. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  207. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  208. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  209. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  210. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  211. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  212. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  213. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  214. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  215. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  216. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  217. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  218. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  219. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  220. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  221. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  222. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  223. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  224. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  225. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  226. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  227. package/dist/web-mode.d.ts +2 -0
  228. package/dist/web-mode.js +20 -8
  229. package/package.json +17 -11
  230. package/packages/cloud-mcp-gateway/package.json +2 -2
  231. package/packages/contracts/package.json +1 -1
  232. package/packages/daemon/package.json +4 -4
  233. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  234. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  235. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  236. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  237. package/packages/gsd-agent-core/package.json +5 -5
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  246. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  249. package/packages/gsd-agent-modes/package.json +7 -7
  250. package/packages/mcp-server/dist/server.d.ts +10 -0
  251. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  252. package/packages/mcp-server/dist/server.js +8 -0
  253. package/packages/mcp-server/dist/server.js.map +1 -1
  254. package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
  255. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  256. package/packages/mcp-server/dist/workflow-tools.js +2 -1
  257. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  258. package/packages/mcp-server/package.json +3 -3
  259. package/packages/native/package.json +1 -1
  260. package/packages/pi-agent-core/package.json +1 -1
  261. package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
  262. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  263. package/packages/pi-ai/dist/image-models.generated.js +30 -0
  264. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  265. package/packages/pi-ai/dist/models.generated.d.ts +8 -127
  266. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  267. package/packages/pi-ai/dist/models.generated.js +47 -166
  268. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  269. package/packages/pi-ai/package.json +1 -1
  270. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
  272. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  273. package/packages/pi-coding-agent/package.json +7 -7
  274. package/packages/pi-tui/dist/components/input.js +1 -1
  275. package/packages/pi-tui/dist/components/input.js.map +1 -1
  276. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  277. package/packages/pi-tui/dist/keys.js +39 -30
  278. package/packages/pi-tui/dist/keys.js.map +1 -1
  279. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  280. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  281. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  282. package/packages/pi-tui/package.json +2 -2
  283. package/packages/rpc-client/package.json +2 -2
  284. package/pkg/package.json +1 -1
  285. package/scripts/install/deps.js +10 -0
  286. package/scripts/link-workspace-packages.cjs +7 -40
  287. package/src/resources/extensions/ask-user-questions.ts +87 -24
  288. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +126 -289
  289. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +242 -2
  290. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  291. package/src/resources/extensions/github-sync/templates.ts +3 -3
  292. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  293. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  294. package/src/resources/extensions/gsd/auto/contracts.ts +40 -121
  295. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  296. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  297. package/src/resources/extensions/gsd/auto/orchestrator.ts +913 -64
  298. package/src/resources/extensions/gsd/auto/phases.ts +35 -3
  299. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  300. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  301. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  302. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  303. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  304. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
  305. package/src/resources/extensions/gsd/auto-prompts.ts +220 -9
  306. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  307. package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
  308. package/src/resources/extensions/gsd/auto-start.ts +17 -20
  309. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  310. package/src/resources/extensions/gsd/auto-tool-tracking.ts +40 -0
  311. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +42 -30
  312. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  313. package/src/resources/extensions/gsd/auto-worktree.ts +57 -42
  314. package/src/resources/extensions/gsd/auto.ts +96 -508
  315. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  316. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
  317. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  318. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +120 -151
  319. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
  320. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  321. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  322. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  323. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  324. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  325. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  326. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  327. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  328. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  329. package/src/resources/extensions/gsd/debug-logger.ts +11 -0
  330. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  331. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  332. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  333. package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
  334. package/src/resources/extensions/gsd/doctor.ts +15 -5
  335. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  336. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  337. package/src/resources/extensions/gsd/gsd-db.ts +12 -0
  338. package/src/resources/extensions/gsd/guided-flow.ts +49 -560
  339. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  340. package/src/resources/extensions/gsd/markdown-renderer.ts +40 -20
  341. package/src/resources/extensions/gsd/mcp-filter.ts +9 -1
  342. package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
  343. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  344. package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
  345. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  346. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  347. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  348. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  349. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  350. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  351. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  352. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  353. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  354. package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
  355. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  356. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  357. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  358. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  359. package/src/resources/extensions/gsd/preferences.ts +173 -28
  360. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  361. package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
  362. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  363. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  364. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
  365. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  366. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  367. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  368. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  369. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  370. package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  371. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  372. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  373. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  374. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  375. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  376. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  377. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  378. package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
  379. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  380. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
  381. package/src/resources/extensions/gsd/state.ts +15 -5
  382. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  383. package/src/resources/extensions/gsd/templates/project.md +1 -0
  384. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  385. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  386. package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
  387. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  388. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  389. package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
  390. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
  391. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  392. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  393. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +709 -845
  394. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
  395. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  396. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  397. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  398. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  399. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
  400. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
  401. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  402. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
  403. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  404. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
  405. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  406. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  407. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  408. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  409. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
  410. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
  411. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  412. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
  413. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  414. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  415. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  416. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  417. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  418. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  419. package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
  420. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
  421. package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
  422. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  423. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
  424. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  425. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  426. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  427. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +75 -2
  428. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  429. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  430. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  431. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
  432. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
  433. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  434. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
  435. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  436. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
  437. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  438. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
  439. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
  440. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  441. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  442. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
  443. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
  444. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +147 -0
  445. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  446. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
  447. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
  448. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  449. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
  450. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  451. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
  452. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  453. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
  454. package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
  455. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  456. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  457. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  458. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  459. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  460. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  461. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
  462. package/src/resources/extensions/gsd/uat-policy.ts +19 -10
  463. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  464. package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
  465. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  466. package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
  467. package/src/resources/extensions/gsd/user-input-boundary.ts +55 -5
  468. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  469. package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
  470. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  471. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  472. package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
  473. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  474. package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
  475. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  476. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  477. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  478. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  479. package/dist/web/standalone/.next/server/chunks/678.js +0 -2
  480. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  481. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  482. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  483. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  484. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  485. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  486. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
  487. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
  488. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
  489. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
  490. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
  491. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
  492. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
  493. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
  494. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
  495. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
  496. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
  497. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
  498. package/scripts/ensure-workspace-builds.cjs +0 -129
  499. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_buildManifest.js +0 -0
  500. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_ssgManifest.js +0 -0
@@ -0,0 +1,224 @@
1
+ // gsd-pi - Claude Code logical turn assembly
2
+ import { PartialMessageBuilder } from "./partial-builder.js";
3
+ /** Normalise heterogeneous SDK tool-result content (string, array, or object) into a uniform `ExternalToolResultContentBlock[]`. */
4
+ function normalizeToolResultContent(content) {
5
+ if (typeof content === "string") {
6
+ return [{ type: "text", text: content }];
7
+ }
8
+ if (!Array.isArray(content)) {
9
+ if (content == null)
10
+ return [{ type: "text", text: "" }];
11
+ return [{ type: "text", text: JSON.stringify(content) }];
12
+ }
13
+ const blocks = [];
14
+ for (const item of content) {
15
+ if (typeof item === "string") {
16
+ blocks.push({ type: "text", text: item });
17
+ continue;
18
+ }
19
+ if (!item || typeof item !== "object") {
20
+ blocks.push({ type: "text", text: String(item) });
21
+ continue;
22
+ }
23
+ const block = item;
24
+ if (block.type === "text") {
25
+ blocks.push({ type: "text", text: typeof block.text === "string" ? block.text : "" });
26
+ continue;
27
+ }
28
+ if (block.type === "image"
29
+ && typeof block.data === "string"
30
+ && typeof block.mimeType === "string") {
31
+ blocks.push({ type: "image", data: block.data, mimeType: block.mimeType });
32
+ continue;
33
+ }
34
+ blocks.push({ type: "text", text: JSON.stringify(block) });
35
+ }
36
+ return blocks.length > 0 ? blocks : [{ type: "text", text: "" }];
37
+ }
38
+ /**
39
+ * Extract a `details` payload from an MCP tool-result block.
40
+ *
41
+ * MCP's `CallToolResult` carries structured data in `structuredContent` — the
42
+ * protocol's supported channel for non-text payloads. Claude Code's synthetic
43
+ * user message may surface that field in one of two shapes depending on SDK
44
+ * version: as a sibling on the `mcp_tool_result` block itself, or as a
45
+ * dedicated content sub-block with `type: "structuredContent"`. Snake-case
46
+ * (`structured_content`) is accepted defensively in case a transport hop
47
+ * rewrites casing. All other shapes return undefined, matching the nullable
48
+ * `details` contract consumed by tool result renderers.
49
+ */
50
+ function extractStructuredDetailsFromBlock(block) {
51
+ const sibling = block.structuredContent ?? block.structured_content;
52
+ if (sibling && typeof sibling === "object" && !Array.isArray(sibling)) {
53
+ return sibling;
54
+ }
55
+ if (Array.isArray(block.content)) {
56
+ for (const item of block.content) {
57
+ if (!item || typeof item !== "object")
58
+ continue;
59
+ const sub = item;
60
+ if (sub.type !== "structuredContent" && sub.type !== "structured_content")
61
+ continue;
62
+ const payload = sub.structuredContent ?? sub.structured_content ?? sub.data ?? sub.value;
63
+ if (payload && typeof payload === "object" && !Array.isArray(payload)) {
64
+ return payload;
65
+ }
66
+ }
67
+ }
68
+ // Return undefined (not {}) when no structured payload is present, matching
69
+ // the pre-#4477 contract where `details` was nullable. An empty-object
70
+ // sentinel is truthy and breaks downstream consumers that gate on
71
+ // `if (details)`. `undefined` matches the type of the field these results
72
+ // flow into (`Record<string, unknown> | undefined`).
73
+ return undefined;
74
+ }
75
+ /**
76
+ * True for items that are MCP `structuredContent` pseudo-blocks living inside
77
+ * a tool-result `content[]` array. These blocks carry the structured payload
78
+ * (extracted separately by `extractStructuredDetailsFromBlock`) and must NOT
79
+ * leak into the visible content rendered to the user — otherwise the renderer
80
+ * stringifies the JSON pseudo-block and shows it next to the actual tool
81
+ * output. See PR #4477 review (post-fix-round).
82
+ */
83
+ function isStructuredContentPseudoBlock(item) {
84
+ if (!item || typeof item !== "object")
85
+ return false;
86
+ const type = item.type;
87
+ return type === "structuredContent" || type === "structured_content";
88
+ }
89
+ /**
90
+ * Strip `structuredContent` pseudo-blocks from a tool-result content array
91
+ * before normalization. The structured payload is extracted via the sibling
92
+ * `structuredContent` field (or a dedicated extractor pass on the raw block);
93
+ * the visible content path must not include the pseudo-block itself.
94
+ */
95
+ function stripStructuredContentPseudoBlocks(content) {
96
+ if (!Array.isArray(content))
97
+ return content;
98
+ return content.filter((item) => !isStructuredContentPseudoBlock(item));
99
+ }
100
+ /** Extract tool result payloads from an SDK synthetic user message, keyed by tool-use ID. */
101
+ export function extractToolResultsFromSdkUserMessage(message) {
102
+ const extracted = [];
103
+ const seen = new Set();
104
+ const rawMessage = message.message;
105
+ const content = Array.isArray(rawMessage?.content) ? rawMessage.content : [];
106
+ for (const item of content) {
107
+ if (!item || typeof item !== "object")
108
+ continue;
109
+ const block = item;
110
+ const type = typeof block.type === "string" ? block.type : "";
111
+ if (type !== "tool_result" && type !== "mcp_tool_result")
112
+ continue;
113
+ const toolUseId = typeof block.tool_use_id === "string" ? block.tool_use_id : "";
114
+ if (!toolUseId || seen.has(toolUseId))
115
+ continue;
116
+ seen.add(toolUseId);
117
+ extracted.push({
118
+ toolUseId,
119
+ result: {
120
+ content: normalizeToolResultContent(stripStructuredContentPseudoBlocks(block.content)),
121
+ details: extractStructuredDetailsFromBlock(block),
122
+ isError: block.is_error === true,
123
+ },
124
+ });
125
+ }
126
+ if (extracted.length === 0) {
127
+ const fallback = message.tool_use_result;
128
+ if (fallback && typeof fallback === "object") {
129
+ const toolResult = fallback;
130
+ const toolUseId = typeof toolResult.tool_use_id === "string" ? toolResult.tool_use_id : "";
131
+ if (toolUseId) {
132
+ extracted.push({
133
+ toolUseId,
134
+ result: {
135
+ content: normalizeToolResultContent(stripStructuredContentPseudoBlocks(toolResult.content)),
136
+ details: extractStructuredDetailsFromBlock(toolResult),
137
+ isError: toolResult.is_error === true,
138
+ },
139
+ });
140
+ }
141
+ }
142
+ }
143
+ return extracted;
144
+ }
145
+ /** Attach external tool results from the SDK synthetic user message to their corresponding tool-call blocks by ID. */
146
+ export function attachExternalResultsToToolBlocks(toolBlocks, toolResultsById) {
147
+ for (const block of toolBlocks) {
148
+ if (block.type !== "toolCall" && block.type !== "serverToolUse")
149
+ continue;
150
+ const externalResult = toolResultsById.get(block.id);
151
+ if (!externalResult)
152
+ continue;
153
+ block.externalResult = externalResult;
154
+ }
155
+ }
156
+ /**
157
+ * Build the final assistant content that Agent Core consumes in
158
+ * `externalToolExecution` mode. This preserves tool-call blocks, attaches any
159
+ * SDK-produced external results by tool-call id, and then appends the final
160
+ * text/thinking blocks for the completed turn.
161
+ */
162
+ export function buildFinalAssistantContent(params) {
163
+ const mergedToolBlocks = [...params.intermediateToolBlocks];
164
+ if (params.pendingContent) {
165
+ mergePendingToolCalls(mergedToolBlocks, params.pendingContent);
166
+ }
167
+ attachExternalResultsToToolBlocks(mergedToolBlocks, params.toolResultsById);
168
+ const finalContent = [...mergedToolBlocks];
169
+ if (params.pendingContent && params.pendingContent.length > 0) {
170
+ for (const block of params.pendingContent) {
171
+ if (block.type === "text" || block.type === "thinking") {
172
+ finalContent.push(block);
173
+ }
174
+ }
175
+ }
176
+ else {
177
+ if (params.lastThinkingContent) {
178
+ finalContent.push({ type: "thinking", thinking: params.lastThinkingContent });
179
+ }
180
+ if (params.lastTextContent) {
181
+ finalContent.push({ type: "text", text: params.lastTextContent });
182
+ }
183
+ }
184
+ if (finalContent.length === 0 && params.fallbackResultText) {
185
+ finalContent.push({ type: "text", text: params.fallbackResultText });
186
+ }
187
+ return finalContent;
188
+ }
189
+ /**
190
+ * Merge tool-call blocks from the active partial-message builder into the
191
+ * running list of intermediate tool calls, preserving order and de-duping
192
+ * by tool-call id. Exposed for testing the F3 fix (final-turn tool calls
193
+ * dropped when `result` arrives without a preceding synthetic `user`).
194
+ */
195
+ export function mergePendingToolCalls(intermediate, pending) {
196
+ const alreadyIncluded = new Set();
197
+ for (const block of intermediate) {
198
+ if (block.type === "toolCall")
199
+ alreadyIncluded.add(block.id);
200
+ }
201
+ for (const block of pending) {
202
+ if (block.type !== "toolCall")
203
+ continue;
204
+ if (alreadyIncluded.has(block.id))
205
+ continue;
206
+ alreadyIncluded.add(block.id);
207
+ intermediate.push(block);
208
+ }
209
+ return intermediate;
210
+ }
211
+ export function handleClaudeCodePartialStreamEvent(builder, event, modelId) {
212
+ if (event.type === "message_start") {
213
+ // Claude Code can emit repeated SDK message_start events inside one
214
+ // logical assistant response. Keep appending until a synthetic user
215
+ // tool-result boundary explicitly clears the builder.
216
+ return {
217
+ builder: builder ?? new PartialMessageBuilder(event.message?.model ?? modelId),
218
+ assistantEvent: null,
219
+ };
220
+ }
221
+ if (!builder)
222
+ return { builder, assistantEvent: null };
223
+ return { builder, assistantEvent: builder.handleEvent(event) };
224
+ }
@@ -7,7 +7,7 @@
7
7
  * All functions produce GitHub-flavored markdown strings ready
8
8
  * for the `gh` CLI body parameters.
9
9
  */
10
- import { buildPrEvidence } from "../gsd/pr-evidence.js";
10
+ import { buildPullRequestEvidence } from "../gsd/pull-request-process.js";
11
11
  // ─── Helpers ────────────────────────────────────────────────────────────────
12
12
  /**
13
13
  * Wrap a string in a CommonMark inline-code span, escaping any embedded
@@ -85,7 +85,7 @@ export function formatSlicePRBody(data) {
85
85
  .map((task) => task.issueNumber)
86
86
  .filter((issueNumber) => typeof issueNumber === "number")
87
87
  .map((issueNumber) => `#${issueNumber}`);
88
- return buildPrEvidence({
88
+ return buildPullRequestEvidence({
89
89
  milestoneId: data.id,
90
90
  subjectId: data.id,
91
91
  subjectKind: "slice",
@@ -172,7 +172,7 @@ export function formatSwarmLanePRBody(data) {
172
172
  `### Changed contracts\n${checkedList(data.lane.changedContracts, "No shared contracts changed").join("\n")}`,
173
173
  `### Transition risks\n${checkedList(data.transitionRisks, "No transition risks identified").join("\n")}`,
174
174
  ].filter(Boolean);
175
- return buildPrEvidence({
175
+ return buildPullRequestEvidence({
176
176
  milestoneId: laneLabel,
177
177
  subjectId: laneLabel,
178
178
  subjectKind: "workflow",
@@ -0,0 +1,14 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Resolves closeout artifact projection roots across project and milestone worktrees.
3
+ import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
4
+ import { resolveWorktreeProjectRoot } from "./worktree-root.js";
5
+ export function resolveCloseoutArtifactProjection(input) {
6
+ const projectRoot = resolveWorktreeProjectRoot(input.basePath, input.originalBasePath);
7
+ const canonicalMilestoneRoot = resolveCanonicalMilestoneRoot(projectRoot, input.milestoneId);
8
+ return {
9
+ projectRoot,
10
+ canonicalMilestoneRoot,
11
+ summaryArtifactBasePath: canonicalMilestoneRoot,
12
+ gateEvidenceBasePath: canonicalMilestoneRoot,
13
+ };
14
+ }
@@ -1,3 +1,10 @@
1
1
  // Project/App: gsd-pi
2
- // File Purpose: Auto Orchestration module interfaces and ADR-015 invariant adapter contracts.
2
+ // File Purpose: Auto Orchestration module public contract types.
3
+ //
4
+ // Phase 2 of #442 collapsed the nine single-implementation adapter interfaces
5
+ // (DispatchAdapter, RecoveryAdapter, StateReconciliationAdapter,
6
+ // ToolContractAdapter, WorktreeAdapter, HealthAdapter, UokGateAdapter,
7
+ // RuntimePersistenceAdapter, NotificationAdapter) and AutoOrchestratorDeps
8
+ // into AutoOrchestrator itself (auto/orchestrator.ts). Only the public result
9
+ // and lifecycle-interface types remain here.
3
10
  export {};
@@ -3,7 +3,7 @@
3
3
  /**
4
4
  * auto/loop.ts — Main auto-mode execution loop.
5
5
  *
6
- * Iterates: derivedispatch → guards → runUnit → finalize → repeat.
6
+ * Iterates: orchestration.advance → guards → runUnit → finalize → repeat.
7
7
  * Exits when s.active becomes false or a terminal condition is reached.
8
8
  *
9
9
  * Imports from: auto/types, auto/resolve, auto/phases
@@ -13,7 +13,7 @@ import { mkdirSync, writeFileSync } from "node:fs";
13
13
  import { join } from "node:path";
14
14
  import { MAX_LOOP_ITERATIONS, } from "./types.js";
15
15
  import { _clearCurrentResolve } from "./resolve.js";
16
- import { runPreDispatch, runDispatch, runGuards, runFinalize, STUCK_WINDOW_SIZE, } from "./phases.js";
16
+ import { runGuards, runFinalize, STUCK_WINDOW_SIZE } from "./phases.js";
17
17
  import { debugLog } from "../debug-logger.js";
18
18
  import { isInfrastructureError, isTransientCooldownError, getCooldownRetryAfterMs, COOLDOWN_FALLBACK_WAIT_MS, MAX_COOLDOWN_RETRIES } from "./infra-errors.js";
19
19
  import { ModelPolicyDispatchBlockedError } from "../auto-model-selection.js";
@@ -92,6 +92,22 @@ function resolveCompletionStopFromState(stateSnapshot) {
92
92
  },
93
93
  };
94
94
  }
95
+ function resolveCompletionStopFromOutcome(outcome, stateSnapshot) {
96
+ if (outcome?.code !== "all-complete")
97
+ return null;
98
+ const completedMilestone = stateSnapshot?.lastCompletedMilestone ?? stateSnapshot?.activeMilestone;
99
+ return {
100
+ reason: outcome.displayReason,
101
+ options: {
102
+ completionWidget: {
103
+ milestoneId: completedMilestone?.id ?? null,
104
+ milestoneTitle: completedMilestone?.title ?? null,
105
+ allMilestonesComplete: true,
106
+ },
107
+ terminalOutcome: outcome,
108
+ },
109
+ };
110
+ }
95
111
  // ── Stuck detection persistence (#3704) ──────────────────────────────────
96
112
  // Phase C migration: stuck-state.json deleted in favor of DB-backed
97
113
  // equivalents. recentUnits is rebuilt from unit_dispatches (Phase B
@@ -104,6 +120,7 @@ function resolveCompletionStopFromState(stateSnapshot) {
104
120
  // tolerates — same behavior as a fresh session.
105
121
  const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
106
122
  const MAX_CONSECUTIVE_ALREADY_ACTIVE_SKIPS = 3;
123
+ const ORCHESTRATION_MISSING_REASON = "Auto Orchestration Module is not wired; cannot dispatch built-in GSD Unit.";
107
124
  function stableStuckStateScopeId(s) {
108
125
  return normalizeRealPath(s.scope?.workspace.projectRoot ?? (s.originalBasePath || s.basePath));
109
126
  }
@@ -247,9 +264,9 @@ function closeOutCrashedUnit(s, iterData, err) {
247
264
  }
248
265
  }
249
266
  /**
250
- * Main auto-mode execution loop. Iterates: derivedispatch → guards →
251
- * runUnit → finalize → repeat. Exits when s.active becomes false or a
252
- * terminal condition is reached.
267
+ * Main auto-mode execution loop. Iterates: orchestration.advance → guards →
268
+ * runUnit → finalize → repeat. Exits when s.active becomes false or a terminal
269
+ * condition is reached.
253
270
  *
254
271
  * This is the linear replacement for the recursive
255
272
  * dispatchNextUnit → resolveAgentEnd → dispatchNextUnit chain.
@@ -441,10 +458,9 @@ export async function autoLoop(ctx, pi, s, deps, options) {
441
458
  journalReporter.emit("iteration-start", { iteration });
442
459
  let iterData;
443
460
  // ── Custom engine path ──────────────────────────────────────────────
444
- // When activeEngineId is a non-dev value, bypass runPreDispatch and
445
- // runDispatch entirely the custom engine drives its own state via
446
- // GRAPH.yaml. Shares runGuards and runUnitPhase with the dev path.
447
- // After unit execution, verifies then reconciles via the engine layer.
461
+ // When activeEngineId is a non-dev value, the custom engine drives its own
462
+ // state via GRAPH.yaml. It shares guards and Unit execution with the dev
463
+ // path, then verifies and reconciles via the engine layer.
448
464
  //
449
465
  // GSD_ENGINE_BYPASS=1 skips the engine layer entirely — falls through
450
466
  // to the dev path below.
@@ -520,7 +536,7 @@ export async function autoLoop(ctx, pi, s, deps, options) {
520
536
  });
521
537
  observedUnitType = iterData.unitType;
522
538
  observedUnitId = iterData.unitId;
523
- // ── Progress widget (mirrors dev path in runDispatch) ──
539
+ // ── Progress widget (mirrors the dev path) ──
524
540
  deps.updateProgressWidget(ctx, iterData.unitType, iterData.unitId, iterData.state);
525
541
  // ── Guards (shared with dev path) ──
526
542
  const guardsResult = await runGuards(ic, s.currentMilestoneId ?? "workflow");
@@ -727,15 +743,23 @@ export async function autoLoop(ctx, pi, s, deps, options) {
727
743
  : await orchestration.advance();
728
744
  if (orchestrationResult.kind === "blocked") {
729
745
  s.pendingOrchestrationDispatch = null;
746
+ const blockMessage = orchestrationResult.terminalOutcome?.code === "settlement-blocked"
747
+ ? [
748
+ orchestrationResult.terminalOutcome.displayReason,
749
+ `Next: ${orchestrationResult.terminalOutcome.nextAction}`,
750
+ ].join("\n")
751
+ : orchestrationResult.reason;
730
752
  if (orchestrationResult.action === "pause") {
731
753
  await deps.pauseAuto(ctx, pi, {
732
- message: orchestrationResult.reason,
754
+ message: blockMessage,
733
755
  category: "unknown",
756
+ }, {
757
+ expectedCurrentUnit: null,
734
758
  });
735
759
  finishTurn("paused", "manual-attention", "orchestration-blocked");
736
760
  }
737
761
  else {
738
- await deps.stopAuto(ctx, pi, orchestrationResult.reason);
762
+ await deps.stopAuto(ctx, pi, blockMessage);
739
763
  finishTurn("stopped", "manual-attention", "orchestration-blocked");
740
764
  }
741
765
  finishIncompleteIteration({
@@ -745,8 +769,19 @@ export async function autoLoop(ctx, pi, s, deps, options) {
745
769
  });
746
770
  break;
747
771
  }
772
+ if (orchestrationResult.kind === "skipped") {
773
+ s.pendingOrchestrationDispatch = null;
774
+ emitIterationEnd({ skipped: true });
775
+ completeIteration();
776
+ finishTurn("skipped");
777
+ continue;
778
+ }
748
779
  if (orchestrationResult.kind === "paused") {
749
780
  s.pendingOrchestrationDispatch = null;
781
+ finishIncompleteIteration({
782
+ status: "paused",
783
+ reason: orchestrationResult.reason,
784
+ });
750
785
  finishTurn("skipped");
751
786
  continue;
752
787
  }
@@ -766,7 +801,8 @@ export async function autoLoop(ctx, pi, s, deps, options) {
766
801
  }
767
802
  if (orchestrationResult.kind === "stopped") {
768
803
  s.pendingOrchestrationDispatch = null;
769
- const completionStop = resolveCompletionStopFromState(orchestrationResult.stateSnapshot);
804
+ let completionStop = resolveCompletionStopFromOutcome(orchestrationResult.terminalOutcome, orchestrationResult.stateSnapshot);
805
+ completionStop ??= resolveCompletionStopFromState(orchestrationResult.stateSnapshot);
770
806
  if (completionStop) {
771
807
  await deps.stopAuto(ctx, pi, completionStop.reason, completionStop.options);
772
808
  }
@@ -837,55 +873,37 @@ export async function autoLoop(ctx, pi, s, deps, options) {
837
873
  });
838
874
  observedUnitType = iterData.unitType;
839
875
  observedUnitId = iterData.unitId;
840
- }
841
- else {
842
- const preDispatchResult = await runPreDispatch(ic, loopState);
843
- phaseReporter.report("pre-dispatch", preDispatchResult.action);
844
- if (preDispatchResult.action === "break") {
845
- finishTurn("stopped", "manual-attention", "pre-dispatch-break");
876
+ const guardMilestoneId = iterData.mid ?? s.currentMilestoneId ?? "workflow";
877
+ const guardsResult = await runGuards(ic, guardMilestoneId);
878
+ phaseReporter.report("guard", guardsResult.action, {
879
+ unitType: iterData.unitType,
880
+ unitId: iterData.unitId,
881
+ });
882
+ if (guardsResult.action === "break") {
883
+ finishTurn("stopped", "manual-attention", "guard-break");
846
884
  finishIncompleteIteration({
847
885
  status: "stopped",
848
- reason: "pre-dispatch-break",
886
+ reason: "guard-break",
887
+ unitType: iterData.unitType,
888
+ unitId: iterData.unitId,
849
889
  failureClass: "manual-attention",
850
890
  });
851
891
  break;
852
892
  }
853
- if (preDispatchResult.action === "continue") {
854
- emitIterationEnd({ skipped: true });
855
- completeIteration();
856
- finishTurn("skipped");
857
- continue;
858
- }
859
- if (preDispatchResult.action === "retry") {
860
- finishTurn("retry", "execution", preDispatchResult.reason);
861
- continue;
862
- }
863
- const preData = preDispatchResult.data;
864
- const guardsResult = await runGuards(ic, preData.mid);
865
- phaseReporter.report("guard", guardsResult.action);
866
- if (guardsResult.action === "break") {
867
- finishTurn("stopped", "manual-attention", "guard-break");
868
- break;
869
- }
870
- const dispatchResult = await runDispatch(ic, preData, loopState);
871
- phaseReporter.report("dispatch", dispatchResult.action);
872
- if (dispatchResult.action === "break") {
873
- finishTurn("stopped", "manual-attention", "dispatch-break");
874
- break;
875
- }
876
- if (dispatchResult.action === "continue") {
877
- emitIterationEnd({ skipped: true });
878
- completeIteration();
879
- finishTurn("skipped");
880
- continue;
881
- }
882
- if (dispatchResult.action === "retry") {
883
- finishTurn("retry", "execution", dispatchResult.reason);
884
- continue;
885
- }
886
- iterData = dispatchResult.data;
887
- observedUnitType = iterData.unitType;
888
- observedUnitId = iterData.unitId;
893
+ }
894
+ else {
895
+ s.pendingOrchestrationDispatch = null;
896
+ await deps.pauseAuto(ctx, pi, {
897
+ message: ORCHESTRATION_MISSING_REASON,
898
+ category: "unknown",
899
+ });
900
+ finishTurn("paused", "manual-attention", "orchestration-missing");
901
+ finishIncompleteIteration({
902
+ status: "paused",
903
+ reason: ORCHESTRATION_MISSING_REASON,
904
+ failureClass: "manual-attention",
905
+ });
906
+ break;
889
907
  }
890
908
  }
891
909
  else {