@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
@@ -27,24 +27,40 @@ import { homedir } from "node:os";
27
27
  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
+ import {
31
+ attachExternalResultsToToolBlocks,
32
+ buildFinalAssistantContent,
33
+ extractToolResultsFromSdkUserMessage,
34
+ handleClaudeCodePartialStreamEvent,
35
+ } from "./turn-assembler.js";
36
+ import type {
37
+ ExternalToolResultPayload,
38
+ ToolCallWithExternalResult,
39
+ } from "./turn-assembler.js";
30
40
  import {
31
41
  buildWorkflowMcpServers,
32
42
  getRequiredWorkflowToolsForAutoUnit,
33
43
  resolveWorkflowMcpProjectRoot,
34
44
  } from "../gsd/workflow-mcp.js";
45
+ import { resolveWorkflowQuestionToolSurface } from "../gsd/question-transport.js";
35
46
  import { buildProjectGsdMcpServers, ensureProjectWorkflowMcpConfig } from "../gsd/mcp-project-config.js";
36
47
  import { loadProjectGSDPreferences } from "../gsd/preferences.js";
48
+ import { markToolStart, markToolEnd } from "../gsd/auto.js";
49
+ import {
50
+ markInteractiveElicitationStart,
51
+ markInteractiveElicitationEnd,
52
+ } from "../gsd/auto-tool-tracking.js";
37
53
  import {
38
54
  discoverBrowserMcpServerName,
39
55
  discoverMcpServers,
40
56
  discoverMcpServerNames,
57
+ discoverUserMcpServerNames,
41
58
  discoverWorkflowMcpServerName,
42
59
  computeMcpDisallowedTools,
43
60
  } from "../gsd/mcp-filter.js";
44
61
  import { RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES, RUN_UAT_FORBIDDEN_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES, resolveToolPresentationPlan } from "../gsd/tool-presentation-plan.js";
45
62
  import { showInterviewRound, type Question, type RoundResult } from "../shared/tui.js";
46
63
  import type {
47
- BetaRawMessageStreamEvent,
48
64
  SDKAssistantMessage,
49
65
  SDKMessage,
50
66
  SDKPartialAssistantMessage,
@@ -52,25 +68,17 @@ import type {
52
68
  SDKUserMessage,
53
69
  } from "./sdk-types.js";
54
70
 
55
- /** A single content block returned by an external (SDK-executed) tool call. */
56
- export interface ExternalToolResultContentBlock {
57
- type: string;
58
- text?: string;
59
- data?: string;
60
- mimeType?: string;
61
- }
62
-
63
- /** The full result payload returned by an external tool, including content blocks and error status. */
64
- export interface ExternalToolResultPayload {
65
- content: ExternalToolResultContentBlock[];
66
- details?: Record<string, unknown>;
67
- isError: boolean;
68
- }
69
-
70
- /** A `ToolCall` block augmented with the external result attached by the SDK synthetic user message. */
71
- type ToolCallWithExternalResult = ToolCall & {
72
- externalResult?: ExternalToolResultPayload;
73
- };
71
+ export {
72
+ buildFinalAssistantContent,
73
+ extractToolResultsFromSdkUserMessage,
74
+ handleClaudeCodePartialStreamEvent,
75
+ mergePendingToolCalls,
76
+ } from "./turn-assembler.js";
77
+ export type {
78
+ ExternalToolResultContentBlock,
79
+ ExternalToolResultPayload,
80
+ ToolCallWithExternalResult,
81
+ } from "./turn-assembler.js";
74
82
 
75
83
  interface PromptToolContextOptions {
76
84
  workflowMcpServerName?: string | null;
@@ -1358,7 +1366,27 @@ export function createClaudeCodeCanUseToolHandler(
1358
1366
  // Elicitation handler
1359
1367
  // ---------------------------------------------------------------------------
1360
1368
 
1361
- /** Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available. */
1369
+ /**
1370
+ * Create an SDK elicitation handler that routes requests through the extension UI dialogs, or undefined if no UI is available.
1371
+ *
1372
+ * For structured (AskUserQuestion) elicitations, the interview round's result
1373
+ * disambiguates two cases that must not be conflated: an `undefined` result
1374
+ * means the custom UI is unavailable, so we fall back to the simpler `select`
1375
+ * dialogs; an empty-answers result means the user dismissed the question, which
1376
+ * is treated as a clean cancel. Falling back to dialogs on dismissal would
1377
+ * re-ask the same questions (the duplicate-question bug).
1378
+ */
1379
+ /**
1380
+ * Monotonic counter so concurrent/sequential elicitations resolved within the
1381
+ * same millisecond get distinct synthetic in-flight-tool ids (the `cc-elicit-*`
1382
+ * namespace never collides with real MCP toolCallIds).
1383
+ */
1384
+ let _elicitationSeq = 0;
1385
+ function nextElicitationSeq(): number {
1386
+ _elicitationSeq = (_elicitationSeq + 1) % Number.MAX_SAFE_INTEGER;
1387
+ return _elicitationSeq;
1388
+ }
1389
+
1362
1390
  export function createClaudeCodeElicitationHandler(
1363
1391
  ui: ExtensionUIContext | undefined,
1364
1392
  ): ((request: SdkElicitationRequest, options: { signal: AbortSignal }) => Promise<SdkElicitationResult>) | undefined {
@@ -1374,20 +1402,67 @@ export function createClaudeCodeElicitationHandler(
1374
1402
  const headlessAnswer = answerElicitationFromHeadlessAnswers(questions, loadHeadlessAnswers());
1375
1403
  if (headlessAnswer) return headlessAnswer;
1376
1404
 
1377
- const interviewResult = await showInterviewRound(questions, { signal }, { ui } as any).catch(() => undefined);
1378
- if (interviewResult && Object.keys(interviewResult.answers).length > 0) {
1405
+ // The SDK elicitation blocks waiting for human input, but it is not an
1406
+ // MCP tool dispatch, so markToolStart/markToolEnd are never called for
1407
+ // it. Without this the soft/context/idle/hard watchdogs see zero
1408
+ // in-flight tools and re-dispatch (and ultimately abort) the agent
1409
+ // turn hosting this elicitation, tearing the question down (#2676 /
1410
+ // claude-code-cli self-cancel loop). Bracketing the human wait with
1411
+ // the s.active-gated interactive-tool guard makes it visible to
1412
+ // hasInteractiveToolInFlight()/getInFlightToolCount() so those
1413
+ // watchdogs exempt it. No-op outside auto-mode (wrapper self-gates).
1414
+ //
1415
+ // markInteractiveElicitationStart/End is a SEPARATE, ungated signal that
1416
+ // is observable in FOREGROUND (where the s.active-gated markToolStart is a
1417
+ // no-op). The foreground approval-gate pause path (register-hooks
1418
+ // message_update) consults isInteractiveElicitationInFlight() and bails so
1419
+ // it does not tear down the very elicitation that IS the human boundary
1420
+ // (#cc-elicitation-self-cancel). It clears in the finally on every exit.
1421
+ const elicId = "cc-elicit-" + ((request as { id?: string | number }).id ?? `${Date.now()}-${nextElicitationSeq()}`);
1422
+ markInteractiveElicitationStart();
1423
+ markToolStart(elicId, "ask_user_questions");
1424
+ try {
1425
+ const interviewResult = await showInterviewRound(
1426
+ questions,
1427
+ { signal, overlay: true },
1428
+ { ui } as any,
1429
+ ).catch(() => undefined);
1430
+ if (interviewResult === undefined) {
1431
+ // `await` so the dialog human-wait stays inside try/finally and the
1432
+ // in-flight guard is held until the dialog resolves. Without it,
1433
+ // `finally` runs the moment the promise is created and the fallback
1434
+ // wait runs with zero in-flight tools — reintroducing the
1435
+ // self-cancel on this path (Bugbot #1c00624d).
1436
+ return await promptElicitationWithDialogs(request, questions, ui, signal);
1437
+ }
1438
+ if (Object.keys(interviewResult.answers).length === 0) {
1439
+ // A system/host teardown (compaction, session_switch, true
1440
+ // interrupt) that aborted the signal mid-wait sets `interrupted`.
1441
+ // Surface that as a non-affirmative `decline` so it is not
1442
+ // laundered into a clean user-declined `cancel` the model re-asks
1443
+ // against. A genuine user dismissal leaves `interrupted` falsy and
1444
+ // keeps the prior `cancel` semantics.
1445
+ return interviewResult.interrupted ? { action: "decline" } : { action: "cancel" };
1446
+ }
1379
1447
  return {
1380
1448
  action: "accept",
1381
1449
  content: roundResultToElicitationContent(questions, interviewResult),
1382
1450
  };
1451
+ } finally {
1452
+ markToolEnd(elicId);
1453
+ markInteractiveElicitationEnd();
1383
1454
  }
1384
-
1385
- return promptElicitationWithDialogs(request, questions, ui, signal);
1386
1455
  }
1387
1456
 
1388
1457
  const textFields = parseTextInputElicitation(request);
1389
1458
  if (textFields) {
1390
- return promptTextInputElicitation(request, textFields, ui, signal);
1459
+ const elicId = "cc-elicit-" + ((request as { id?: string | number }).id ?? `${Date.now()}-${nextElicitationSeq()}`);
1460
+ markToolStart(elicId, "secure_env_collect");
1461
+ try {
1462
+ return await promptTextInputElicitation(request, textFields, ui, signal);
1463
+ } finally {
1464
+ markToolEnd(elicId);
1465
+ }
1391
1466
  }
1392
1467
 
1393
1468
  return { action: "decline" };
@@ -1658,14 +1733,23 @@ export function buildSdkOptions(
1658
1733
  const workflowServerName = projectWorkflowServerName ?? injectedWorkflowServerName;
1659
1734
  const browserServerName = projectBrowserServerName ?? injectedBrowserServerName;
1660
1735
 
1661
- // If a default GSD MCP server is already declared in the project's .mcp.json
1662
- // or .claude/settings.json, do not inject it again via mcpServers. Passing the
1663
- // same server name from two sources causes a duplicate registration conflict
1664
- // that prevents the MCP server from loading (tools become unavailable).
1736
+ // Non-strict (non-phase) sessions load ~/.claude/settings.json via settingSources
1737
+ // including "user". If the user declared the same server names there, injecting them
1738
+ // again via mcpServers causes duplicate registration and leaves MCP tools unavailable.
1739
+ // Strict (gsdPhase) sessions set settingSources=[] so user settings are not loaded.
1740
+ const userDiscovered = !gsdPhase ? discoverUserMcpServerNames() : [];
1741
+ const allDiscovered = discovered.length > 0 || userDiscovered.length > 0
1742
+ ? [...discovered, ...userDiscovered]
1743
+ : discovered;
1744
+
1745
+ // If a default GSD MCP server is already declared in project config or in the user's
1746
+ // ~/.claude/settings.json (when that file will be loaded), do not inject it again via
1747
+ // mcpServers. Passing the same server name from two sources causes a duplicate
1748
+ // registration conflict that prevents the MCP server from loading (tools become unavailable).
1665
1749
  const workflowAlreadyInProject = projectWorkflowServerName !== undefined
1666
- || (injectedWorkflowServerName !== undefined && discovered.includes(injectedWorkflowServerName));
1750
+ || (injectedWorkflowServerName !== undefined && allDiscovered.includes(injectedWorkflowServerName));
1667
1751
  const browserAlreadyInProject = projectBrowserServerName !== undefined
1668
- || (injectedBrowserServerName !== undefined && discovered.includes(injectedBrowserServerName));
1752
+ || (injectedBrowserServerName !== undefined && allDiscovered.includes(injectedBrowserServerName));
1669
1753
  const mcpServersToInject = { ...defaultMcpServers.servers };
1670
1754
  if (workflowAlreadyInProject && injectedWorkflowServerName) delete mcpServersToInject[injectedWorkflowServerName];
1671
1755
  if (browserAlreadyInProject && injectedBrowserServerName) delete mcpServersToInject[injectedBrowserServerName];
@@ -1725,14 +1809,21 @@ export function buildSdkOptions(
1725
1809
  const sdkMcpServers = inlinePhaseMcpServers ?? filteredMcpServers;
1726
1810
  const strictMcpConfig = !!inlinePhaseMcpServers;
1727
1811
  // Strict phase configs inline the exact MCP servers GSD needs. Loading
1728
- // project/local settings at the same time can duplicate those servers and
1812
+ // Claude Code settings at the same time can duplicate those servers and
1729
1813
  // leave allowed mcp__... tools with no registered backing tool.
1730
- const settingSources = strictMcpConfig ? [] : ["project", "local"];
1814
+ const settingSources = strictMcpConfig ? [] : ["user", "project", "local"];
1731
1815
  const exactWorkflowMcpTools = resolveExactWorkflowMcpToolsForPhase(
1732
1816
  gsdPhase,
1733
1817
  workflowServerName,
1734
1818
  workflowExplicitlyBlocked,
1735
1819
  );
1820
+ const questionToolSurface = resolveWorkflowQuestionToolSurface({
1821
+ workflowServerName,
1822
+ workflowExplicitlyBlocked,
1823
+ workflowMcpTools,
1824
+ exactWorkflowMcpTools,
1825
+ env: process.env,
1826
+ });
1736
1827
  const runUatDisallowedTools = gsdPhase === "run-uat" && workflowServerName
1737
1828
  ? [
1738
1829
  ...RUN_UAT_FORBIDDEN_TOOL_NAMES.filter((toolName) => !toolName.startsWith("mcp__")),
@@ -1746,6 +1837,7 @@ export function buildSdkOptions(
1746
1837
  const disallowedTools: string[] = [...new Set([
1747
1838
  "ToolSearch",
1748
1839
  ...(workflowMcpTools.length > 0 || exactWorkflowMcpTools.length > 0 ? ["AskUserQuestion"] : []),
1840
+ ...questionToolSurface.disallowedTools,
1749
1841
  ...runUatDisallowedTools,
1750
1842
  ...extraDisallowedTools,
1751
1843
  ])];
@@ -1814,261 +1906,6 @@ export function buildSdkOptions(
1814
1906
  };
1815
1907
  }
1816
1908
 
1817
- /** Normalise heterogeneous SDK tool-result content (string, array, or object) into a uniform `ExternalToolResultContentBlock[]`. */
1818
- function normalizeToolResultContent(content: unknown): ExternalToolResultContentBlock[] {
1819
- if (typeof content === "string") {
1820
- return [{ type: "text", text: content }];
1821
- }
1822
-
1823
- if (!Array.isArray(content)) {
1824
- if (content == null) return [{ type: "text", text: "" }];
1825
- return [{ type: "text", text: JSON.stringify(content) }];
1826
- }
1827
-
1828
- const blocks: ExternalToolResultContentBlock[] = [];
1829
-
1830
- for (const item of content) {
1831
- if (typeof item === "string") {
1832
- blocks.push({ type: "text", text: item });
1833
- continue;
1834
- }
1835
- if (!item || typeof item !== "object") {
1836
- blocks.push({ type: "text", text: String(item) });
1837
- continue;
1838
- }
1839
-
1840
- const block = item as Record<string, unknown>;
1841
- if (block.type === "text") {
1842
- blocks.push({ type: "text", text: typeof block.text === "string" ? block.text : "" });
1843
- continue;
1844
- }
1845
- if (
1846
- block.type === "image"
1847
- && typeof block.data === "string"
1848
- && typeof block.mimeType === "string"
1849
- ) {
1850
- blocks.push({ type: "image", data: block.data, mimeType: block.mimeType });
1851
- continue;
1852
- }
1853
-
1854
- blocks.push({ type: "text", text: JSON.stringify(block) });
1855
- }
1856
-
1857
- return blocks.length > 0 ? blocks : [{ type: "text", text: "" }];
1858
- }
1859
-
1860
- /**
1861
- * Extract a `details` payload from an MCP tool-result block.
1862
- *
1863
- * MCP's `CallToolResult` carries structured data in `structuredContent` — the
1864
- * protocol's supported channel for non-text payloads. Claude Code's synthetic
1865
- * user message may surface that field in one of two shapes depending on SDK
1866
- * version: as a sibling on the `mcp_tool_result` block itself, or as a
1867
- * dedicated content sub-block with `type: "structuredContent"`. Snake-case
1868
- * (`structured_content`) is accepted defensively in case a transport hop
1869
- * rewrites casing. All other shapes fall back to an empty object so callers
1870
- * can rely on `details` being present.
1871
- */
1872
- function extractStructuredDetailsFromBlock(block: Record<string, unknown>): Record<string, unknown> | undefined {
1873
- const sibling = block.structuredContent ?? (block as Record<string, unknown>).structured_content;
1874
- if (sibling && typeof sibling === "object" && !Array.isArray(sibling)) {
1875
- return sibling as Record<string, unknown>;
1876
- }
1877
-
1878
- if (Array.isArray(block.content)) {
1879
- for (const item of block.content) {
1880
- if (!item || typeof item !== "object") continue;
1881
- const sub = item as Record<string, unknown>;
1882
- if (sub.type !== "structuredContent" && sub.type !== "structured_content") continue;
1883
- const payload = sub.structuredContent ?? sub.structured_content ?? sub.data ?? sub.value;
1884
- if (payload && typeof payload === "object" && !Array.isArray(payload)) {
1885
- return payload as Record<string, unknown>;
1886
- }
1887
- }
1888
- }
1889
-
1890
- // Return undefined (not {}) when no structured payload is present, matching
1891
- // the pre-#4477 contract where `details` was nullable. An empty-object
1892
- // sentinel is truthy and breaks downstream consumers that gate on
1893
- // `if (details)`. `undefined` matches the type of the field these results
1894
- // flow into (`Record<string, unknown> | undefined`).
1895
- return undefined;
1896
- }
1897
-
1898
- /**
1899
- * True for items that are MCP `structuredContent` pseudo-blocks living inside
1900
- * a tool-result `content[]` array. These blocks carry the structured payload
1901
- * (extracted separately by `extractStructuredDetailsFromBlock`) and must NOT
1902
- * leak into the visible content rendered to the user — otherwise the renderer
1903
- * stringifies the JSON pseudo-block and shows it next to the actual tool
1904
- * output. See PR #4477 review (post-fix-round).
1905
- */
1906
- function isStructuredContentPseudoBlock(item: unknown): boolean {
1907
- if (!item || typeof item !== "object") return false;
1908
- const type = (item as Record<string, unknown>).type;
1909
- return type === "structuredContent" || type === "structured_content";
1910
- }
1911
-
1912
- /**
1913
- * Strip `structuredContent` pseudo-blocks from a tool-result content array
1914
- * before normalization. The structured payload is extracted via the sibling
1915
- * `structuredContent` field (or a dedicated extractor pass on the raw block);
1916
- * the visible content path must not include the pseudo-block itself.
1917
- */
1918
- function stripStructuredContentPseudoBlocks(content: unknown): unknown {
1919
- if (!Array.isArray(content)) return content;
1920
- return content.filter((item) => !isStructuredContentPseudoBlock(item));
1921
- }
1922
-
1923
- /** Extract tool result payloads from an SDK synthetic user message, keyed by tool-use ID. */
1924
- export function extractToolResultsFromSdkUserMessage(message: SDKUserMessage): Array<{
1925
- toolUseId: string;
1926
- result: ExternalToolResultPayload;
1927
- }> {
1928
- const extracted: Array<{ toolUseId: string; result: ExternalToolResultPayload }> = [];
1929
- const seen = new Set<string>();
1930
- const rawMessage = message.message as Record<string, unknown> | null | undefined;
1931
- const content = Array.isArray(rawMessage?.content) ? rawMessage.content : [];
1932
-
1933
- for (const item of content) {
1934
- if (!item || typeof item !== "object") continue;
1935
- const block = item as Record<string, unknown>;
1936
- const type = typeof block.type === "string" ? block.type : "";
1937
- if (type !== "tool_result" && type !== "mcp_tool_result") continue;
1938
-
1939
- const toolUseId = typeof block.tool_use_id === "string" ? block.tool_use_id : "";
1940
- if (!toolUseId || seen.has(toolUseId)) continue;
1941
- seen.add(toolUseId);
1942
-
1943
- extracted.push({
1944
- toolUseId,
1945
- result: {
1946
- content: normalizeToolResultContent(stripStructuredContentPseudoBlocks(block.content)),
1947
- details: extractStructuredDetailsFromBlock(block),
1948
- isError: block.is_error === true,
1949
- },
1950
- });
1951
- }
1952
-
1953
- if (extracted.length === 0) {
1954
- const fallback = message.tool_use_result;
1955
- if (fallback && typeof fallback === "object") {
1956
- const toolResult = fallback as Record<string, unknown>;
1957
- const toolUseId = typeof toolResult.tool_use_id === "string" ? toolResult.tool_use_id : "";
1958
- if (toolUseId) {
1959
- extracted.push({
1960
- toolUseId,
1961
- result: {
1962
- content: normalizeToolResultContent(stripStructuredContentPseudoBlocks(toolResult.content)),
1963
- details: extractStructuredDetailsFromBlock(toolResult),
1964
- isError: toolResult.is_error === true,
1965
- },
1966
- });
1967
- }
1968
- }
1969
- }
1970
-
1971
- return extracted;
1972
- }
1973
-
1974
- /** Attach external tool results from the SDK synthetic user message to their corresponding tool-call blocks by ID. */
1975
- function attachExternalResultsToToolBlocks(
1976
- toolBlocks: AssistantMessage["content"],
1977
- toolResultsById: ReadonlyMap<string, ExternalToolResultPayload>,
1978
- ): void {
1979
- for (const block of toolBlocks) {
1980
- if (block.type !== "toolCall" && block.type !== "serverToolUse") continue;
1981
- const externalResult = toolResultsById.get(block.id);
1982
- if (!externalResult) continue;
1983
- (block as ToolCallWithExternalResult & { id: string }).externalResult = externalResult;
1984
- }
1985
- }
1986
-
1987
- /**
1988
- * Build the final assistant content that Agent Core consumes in
1989
- * `externalToolExecution` mode. This preserves tool-call blocks, attaches any
1990
- * SDK-produced external results by tool-call id, and then appends the final
1991
- * text/thinking blocks for the completed turn.
1992
- */
1993
- export function buildFinalAssistantContent(params: {
1994
- intermediateToolBlocks: AssistantMessage["content"];
1995
- pendingContent?: AssistantMessage["content"];
1996
- toolResultsById: ReadonlyMap<string, ExternalToolResultPayload>;
1997
- lastThinkingContent?: string;
1998
- lastTextContent?: string;
1999
- fallbackResultText?: string;
2000
- }): AssistantMessage["content"] {
2001
- const mergedToolBlocks = [...params.intermediateToolBlocks];
2002
- if (params.pendingContent) {
2003
- mergePendingToolCalls(mergedToolBlocks, params.pendingContent);
2004
- }
2005
- attachExternalResultsToToolBlocks(mergedToolBlocks, params.toolResultsById);
2006
-
2007
- const finalContent: AssistantMessage["content"] = [...mergedToolBlocks];
2008
- if (params.pendingContent && params.pendingContent.length > 0) {
2009
- for (const block of params.pendingContent) {
2010
- if (block.type === "text" || block.type === "thinking") {
2011
- finalContent.push(block);
2012
- }
2013
- }
2014
- } else {
2015
- if (params.lastThinkingContent) {
2016
- finalContent.push({ type: "thinking", thinking: params.lastThinkingContent });
2017
- }
2018
- if (params.lastTextContent) {
2019
- finalContent.push({ type: "text", text: params.lastTextContent });
2020
- }
2021
- }
2022
-
2023
- if (finalContent.length === 0 && params.fallbackResultText) {
2024
- finalContent.push({ type: "text", text: params.fallbackResultText });
2025
- }
2026
-
2027
- return finalContent;
2028
- }
2029
-
2030
- /**
2031
- * Merge tool-call blocks from the active partial-message builder into the
2032
- * running list of intermediate tool calls, preserving order and de-duping
2033
- * by tool-call id. Exposed for testing the F3 fix (final-turn tool calls
2034
- * dropped when `result` arrives without a preceding synthetic `user`).
2035
- */
2036
- export function mergePendingToolCalls(
2037
- intermediate: AssistantMessage["content"],
2038
- pending: AssistantMessage["content"],
2039
- ): AssistantMessage["content"] {
2040
- const alreadyIncluded = new Set<string>();
2041
- for (const block of intermediate) {
2042
- if (block.type === "toolCall") alreadyIncluded.add(block.id);
2043
- }
2044
- for (const block of pending) {
2045
- if (block.type !== "toolCall") continue;
2046
- if (alreadyIncluded.has(block.id)) continue;
2047
- alreadyIncluded.add(block.id);
2048
- intermediate.push(block);
2049
- }
2050
- return intermediate;
2051
- }
2052
-
2053
- export function handleClaudeCodePartialStreamEvent(
2054
- builder: PartialMessageBuilder | null,
2055
- event: BetaRawMessageStreamEvent,
2056
- modelId: string,
2057
- ): { builder: PartialMessageBuilder | null; assistantEvent: AssistantMessageEvent | null } {
2058
- if (event.type === "message_start") {
2059
- // Claude Code can emit repeated SDK message_start events inside one
2060
- // logical assistant response. Keep appending until a synthetic user
2061
- // tool-result boundary explicitly clears the builder.
2062
- return {
2063
- builder: builder ?? new PartialMessageBuilder((event as any).message?.model ?? modelId),
2064
- assistantEvent: null,
2065
- };
2066
- }
2067
-
2068
- if (!builder) return { builder, assistantEvent: null };
2069
- return { builder, assistantEvent: builder.handleEvent(event) };
2070
- }
2071
-
2072
1909
  // ---------------------------------------------------------------------------
2073
1910
  // streamSimple implementation
2074
1911
  // ---------------------------------------------------------------------------