@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.ddc97c10

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 (662) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/models-resolver.d.ts +3 -13
  8. package/dist/models-resolver.js +3 -22
  9. package/dist/resource-loader.js +2 -14
  10. package/dist/resources/.managed-resources-content-hash +1 -1
  11. package/dist/resources/GSD-WORKFLOW.md +5 -4
  12. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  13. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  14. package/dist/resources/extensions/async-jobs/index.js +65 -0
  15. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  16. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  17. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  18. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  19. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  20. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  21. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  22. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  23. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  24. package/dist/resources/extensions/browser-tools/index.js +69 -12
  25. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  27. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  28. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  29. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  31. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  32. package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
  33. package/dist/resources/extensions/gsd/auto/phases.js +54 -6
  34. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
  39. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  40. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  41. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  42. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  43. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  44. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  45. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  46. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  47. package/dist/resources/extensions/gsd/auto.js +45 -21
  48. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  49. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  50. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  51. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  52. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  53. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  54. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  55. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  56. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  57. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  58. package/dist/resources/extensions/gsd/captures.js +5 -15
  59. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  60. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  61. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  62. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  63. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  64. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  65. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  66. package/dist/resources/extensions/gsd/constants.js +0 -2
  67. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  68. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  69. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  70. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  71. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  72. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  73. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  74. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  75. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  76. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  77. package/dist/resources/extensions/gsd/doctor-engine-checks.js +3 -3
  78. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  79. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  80. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  81. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  82. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  83. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  84. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  85. package/dist/resources/extensions/gsd/files.js +33 -19
  86. package/dist/resources/extensions/gsd/git-service.js +1 -0
  87. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  88. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  89. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  90. package/dist/resources/extensions/gsd/guidance.js +158 -0
  91. package/dist/resources/extensions/gsd/guided-flow.js +57 -8
  92. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  93. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  94. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  95. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  96. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  97. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  98. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  99. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  100. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  101. package/dist/resources/extensions/gsd/model-router.js +3 -0
  102. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  103. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  104. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  105. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  106. package/dist/resources/extensions/gsd/paths.js +37 -24
  107. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  108. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  109. package/dist/resources/extensions/gsd/preferences.js +14 -0
  110. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  111. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  112. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  113. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  114. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  115. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  116. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  117. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  118. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  119. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  120. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  121. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  122. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
  123. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  124. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  125. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  126. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  127. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  128. package/dist/resources/extensions/gsd/publication.js +87 -0
  129. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  130. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  131. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  132. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  133. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  134. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  135. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  136. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  137. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  138. package/dist/resources/extensions/gsd/state.js +6 -20
  139. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  140. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  141. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  142. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  143. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  144. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  145. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  146. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  147. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  148. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  149. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  150. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  151. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  152. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  153. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  154. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  155. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  156. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  157. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  158. package/dist/resources/extensions/gsd/undo.js +8 -7
  159. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  160. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  161. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  162. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  163. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  164. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  165. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  166. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  167. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  168. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  169. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  170. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  171. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  172. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  173. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  174. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  175. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  176. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  177. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  178. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  179. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  180. package/dist/resources/shared/package-manager-detection.js +1 -1
  181. package/dist/resources/shared/package.json +3 -0
  182. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  183. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  184. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  185. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  186. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  187. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  188. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  189. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  190. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  191. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  192. package/dist/update-check.d.ts +2 -0
  193. package/dist/update-check.js +24 -1
  194. package/dist/update-cmd.js +20 -3
  195. package/dist/web/standalone/.next/BUILD_ID +1 -1
  196. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  197. package/dist/web/standalone/.next/build-manifest.json +3 -3
  198. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  199. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  200. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  201. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  209. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  211. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  212. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  251. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/index.html +1 -1
  253. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  254. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  255. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  256. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  257. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  258. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  259. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  260. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  261. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  262. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  263. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  264. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  266. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  267. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  268. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  269. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  270. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  271. package/dist/web/standalone/package.json +1 -1
  272. package/dist/worktree-cli.js +3 -6
  273. package/dist/worktree-status-banner.js +7 -11
  274. package/package.json +1 -1
  275. package/packages/cloud-mcp-gateway/package.json +2 -2
  276. package/packages/contracts/dist/rpc.d.ts +1 -0
  277. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  278. package/packages/contracts/dist/rpc.js.map +1 -1
  279. package/packages/contracts/dist/workflow.d.ts +4 -0
  280. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  281. package/packages/contracts/dist/workflow.js.map +1 -1
  282. package/packages/contracts/package.json +1 -1
  283. package/packages/daemon/package.json +4 -4
  284. package/packages/gsd-agent-core/package.json +5 -5
  285. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  286. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
  288. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  291. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  292. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  293. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  294. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  295. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  296. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  297. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  298. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  299. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  300. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  301. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  302. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  303. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  304. package/packages/gsd-agent-modes/package.json +7 -7
  305. package/packages/mcp-server/dist/cli.js +9 -1
  306. package/packages/mcp-server/dist/cli.js.map +1 -1
  307. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  308. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  309. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  310. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  311. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  312. package/packages/mcp-server/dist/server.js +4 -0
  313. package/packages/mcp-server/dist/server.js.map +1 -1
  314. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  315. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  316. package/packages/mcp-server/dist/workflow-tools.js +145 -59
  317. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  318. package/packages/mcp-server/package.json +5 -4
  319. package/packages/native/package.json +1 -1
  320. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  321. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  322. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  323. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  324. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  325. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  326. package/packages/pi-agent-core/dist/index.js +3 -0
  327. package/packages/pi-agent-core/dist/index.js.map +1 -1
  328. package/packages/pi-agent-core/package.json +1 -1
  329. package/packages/pi-ai/README.md +1 -0
  330. package/packages/pi-ai/dist/index.d.ts +2 -0
  331. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  332. package/packages/pi-ai/dist/index.js +2 -0
  333. package/packages/pi-ai/dist/index.js.map +1 -1
  334. package/packages/pi-ai/dist/models.generated.d.ts +192 -0
  335. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  336. package/packages/pi-ai/dist/models.generated.js +166 -0
  337. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  338. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  339. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  340. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  341. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  342. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  343. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  344. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  345. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  346. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  347. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  348. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  349. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  350. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  351. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  352. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  354. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  355. package/packages/pi-ai/package.json +3 -2
  356. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  357. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  359. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  362. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  365. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  367. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  369. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  371. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/index.js +1 -1
  373. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  375. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  377. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  378. package/packages/pi-coding-agent/package.json +7 -7
  379. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  380. package/packages/pi-tui/dist/tui.js +9 -0
  381. package/packages/pi-tui/dist/tui.js.map +1 -1
  382. package/packages/pi-tui/package.json +2 -2
  383. package/packages/rpc-client/package.json +2 -2
  384. package/pkg/package.json +1 -1
  385. package/src/resources/GSD-WORKFLOW.md +5 -4
  386. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  387. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  388. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  389. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  390. package/src/resources/extensions/async-jobs/index.ts +79 -0
  391. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  392. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  393. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  394. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  395. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  396. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  397. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  398. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  399. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  400. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  401. package/src/resources/extensions/browser-tools/index.ts +71 -13
  402. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  403. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  404. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  405. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  406. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  407. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  408. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  409. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  410. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  411. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  412. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  413. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  414. package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
  415. package/src/resources/extensions/gsd/auto/phases.ts +74 -26
  416. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  417. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  418. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  419. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  420. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
  421. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  422. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  423. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  424. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  425. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  426. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  427. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  428. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  429. package/src/resources/extensions/gsd/auto.ts +64 -25
  430. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  431. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  432. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  433. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  434. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  435. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  436. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  437. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  438. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  439. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  440. package/src/resources/extensions/gsd/captures.ts +5 -16
  441. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  442. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  443. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  444. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  445. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  446. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  447. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  448. package/src/resources/extensions/gsd/constants.ts +0 -3
  449. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  450. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  451. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  452. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  453. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  454. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  455. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  456. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  457. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  458. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  459. package/src/resources/extensions/gsd/doctor-engine-checks.ts +3 -3
  460. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  461. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  462. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  463. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  464. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  465. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  466. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  467. package/src/resources/extensions/gsd/files.ts +33 -12
  468. package/src/resources/extensions/gsd/git-service.ts +1 -0
  469. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  470. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  471. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  472. package/src/resources/extensions/gsd/guidance.ts +217 -0
  473. package/src/resources/extensions/gsd/guided-flow.ts +71 -31
  474. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  475. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  476. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  477. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  478. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  479. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  480. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  481. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  482. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  483. package/src/resources/extensions/gsd/model-router.ts +3 -0
  484. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  485. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  486. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  487. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  488. package/src/resources/extensions/gsd/paths.ts +42 -22
  489. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  490. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  491. package/src/resources/extensions/gsd/preferences.ts +18 -0
  492. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  493. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  494. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  495. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  496. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  497. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  498. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  499. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  500. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  501. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  502. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  503. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  504. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
  505. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  506. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  507. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  508. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  509. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  510. package/src/resources/extensions/gsd/publication.ts +122 -0
  511. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  512. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  513. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  514. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  515. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  516. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  517. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  518. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  519. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  520. package/src/resources/extensions/gsd/state.ts +9 -21
  521. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  522. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  523. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  524. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
  525. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  526. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  527. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  528. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  529. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  530. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  531. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  532. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  533. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  534. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  535. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  536. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  537. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  538. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  539. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  540. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  541. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  542. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  543. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  544. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  545. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  546. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  547. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  548. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  549. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  550. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  551. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  552. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  553. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  554. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  555. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  556. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
  557. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  558. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  559. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  560. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  561. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  562. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  563. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  564. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  565. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  566. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  567. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  568. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  569. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  570. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  571. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  572. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  573. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  574. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  575. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  576. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  577. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  578. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  579. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
  580. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  581. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  582. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  583. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  584. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  585. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  586. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  587. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  588. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  589. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  590. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  591. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  592. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  593. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  594. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  595. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  596. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  597. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  598. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  599. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  600. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  601. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  602. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  603. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  604. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  605. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  606. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  607. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  608. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  609. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  610. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  611. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  612. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  613. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
  614. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  615. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  616. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  617. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  618. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  619. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  620. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  621. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  622. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  623. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  624. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  625. package/src/resources/extensions/gsd/undo.ts +9 -8
  626. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  627. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  628. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  629. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  630. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  631. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  632. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  633. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  634. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  635. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  636. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  637. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  638. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  639. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  640. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  641. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  642. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  643. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  644. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  645. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  646. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  647. package/src/resources/shared/package-manager-detection.ts +1 -1
  648. package/src/resources/shared/package.json +3 -0
  649. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  650. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  651. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  652. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  653. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  654. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  655. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  656. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  657. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  658. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  659. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  660. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  661. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_buildManifest.js +0 -0
  662. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_ssgManifest.js +0 -0
@@ -1,218 +0,0 @@
1
- const USER_APPROVAL_UNIT_TYPES = new Set([
2
- "discuss-project",
3
- "discuss-requirements",
4
- "discuss-milestone",
5
- "research-decision",
6
- ]);
7
- const REMOTE_QUESTION_FAILURE_RE = /(?:Remote (?:auth failed|questions failed|channel configured but returned no result|questions timed out|questions timed out or failed)|Failed to send questions via)/i;
8
- const APPROVAL_WAIT_RE = /\bwait(?:ing)?\s+for\s+(?:your\s+)?(?:confirmation|approval|input|response|answer)\b/i;
9
- const APPROVAL_QUESTION_RE = /\b(?:confirm|confirmation|approve|approval|approved|captured|correct|correctly|happy\s+with|ready\s+to\s+(?:write|save|proceed|ship)|(?:want|need)\s+to\s+adjust|should\s+I\s+(?:write|save|proceed)|do\s+you\s+want\s+me\s+to\s+(?:write|save|proceed)|ship\s+it)\b/i;
10
- const APPROVAL_RIGHT_QUESTION_RE = /\b(?:does|do|is|are|was|were|did)\b[^\n?]{0,120}\bright\b/i;
11
- const APPROVAL_CHANGE_QUESTION_RE = /\b(?:anything\s+else|anything|something)\s+to\s+(?:adjust|add|remove|reclassify)\b/i;
12
- const RESEARCH_DECISION_QUESTION_RE = /\b(?:research|skip)\b/i;
13
- function extractVisibleTextFromMessage(msg) {
14
- if (!msg || typeof msg !== "object")
15
- return "";
16
- const content = msg.content;
17
- if (typeof content === "string")
18
- return content;
19
- if (!Array.isArray(content))
20
- return "";
21
- const parts = [];
22
- for (const block of content) {
23
- if (!block || typeof block !== "object")
24
- continue;
25
- const typed = block;
26
- if (typed.type === "text" && typeof typed.text === "string") {
27
- parts.push(typed.text);
28
- }
29
- // thinking blocks intentionally excluded — they are internal reasoning, not user-visible
30
- }
31
- return parts.join("\n");
32
- }
33
- function extractTextFromMessage(msg) {
34
- if (!msg || typeof msg !== "object")
35
- return "";
36
- const content = msg.content;
37
- if (typeof content === "string")
38
- return content;
39
- if (!Array.isArray(content))
40
- return "";
41
- const parts = [];
42
- for (const block of content) {
43
- if (!block || typeof block !== "object")
44
- continue;
45
- const typed = block;
46
- if (typed.type === "text" && typeof typed.text === "string") {
47
- parts.push(typed.text);
48
- }
49
- if (typed.type === "thinking" && typeof typed.thinking === "string") {
50
- parts.push(typed.thinking);
51
- }
52
- }
53
- return parts.join("\n");
54
- }
55
- export function lastAssistantText(messages) {
56
- if (!Array.isArray(messages))
57
- return "";
58
- for (let i = messages.length - 1; i >= 0; i--) {
59
- const msg = messages[i];
60
- if (!msg || typeof msg !== "object")
61
- continue;
62
- if (msg.role !== "assistant")
63
- continue;
64
- const text = extractTextFromMessage(msg).trim();
65
- if (text)
66
- return text;
67
- }
68
- return "";
69
- }
70
- function lastAssistantVisibleText(messages) {
71
- if (!Array.isArray(messages))
72
- return "";
73
- for (let i = messages.length - 1; i >= 0; i--) {
74
- const msg = messages[i];
75
- if (!msg || typeof msg !== "object")
76
- continue;
77
- if (msg.role !== "assistant")
78
- continue;
79
- const text = extractVisibleTextFromMessage(msg).trim();
80
- if (text)
81
- return text;
82
- }
83
- return "";
84
- }
85
- function anyMessageMatches(messages, pattern) {
86
- if (!Array.isArray(messages))
87
- return false;
88
- return messages.some((msg) => {
89
- if (!msg || typeof msg !== "object")
90
- return false;
91
- if (msg.role === "user")
92
- return false;
93
- return pattern.test(extractVisibleTextFromMessage(msg));
94
- });
95
- }
96
- function hasApprovalQuestion(text) {
97
- for (let i = 0; i < text.length; i++) {
98
- if (text[i] !== "?")
99
- continue;
100
- const previousBreak = Math.max(text.lastIndexOf("\n", i), text.lastIndexOf(".", i), text.lastIndexOf("!", i), text.lastIndexOf("?", i - 1));
101
- const fragment = text.slice(previousBreak + 1, i + 1);
102
- if (APPROVAL_QUESTION_RE.test(fragment))
103
- return true;
104
- if (APPROVAL_RIGHT_QUESTION_RE.test(fragment))
105
- return true;
106
- if (APPROVAL_CHANGE_QUESTION_RE.test(fragment))
107
- return true;
108
- }
109
- return false;
110
- }
111
- function hasResearchDecisionQuestion(text) {
112
- for (let i = 0; i < text.length; i++) {
113
- if (text[i] !== "?")
114
- continue;
115
- const previousBreak = Math.max(text.lastIndexOf("\n", i), text.lastIndexOf(".", i), text.lastIndexOf("!", i), text.lastIndexOf("?", i - 1));
116
- const fragment = text.slice(previousBreak + 1, i + 1);
117
- if (RESEARCH_DECISION_QUESTION_RE.test(fragment))
118
- return true;
119
- }
120
- return false;
121
- }
122
- export function approvalGateIdForUnit(unitType, unitId) {
123
- if (!unitType)
124
- return null;
125
- if (unitType === "discuss-project")
126
- return "depth_verification_project_confirm";
127
- if (unitType === "discuss-requirements")
128
- return "depth_verification_requirements_confirm";
129
- if (unitType === "research-decision")
130
- return "depth_verification_research_decision_confirm";
131
- if (unitType === "discuss-milestone") {
132
- const safeUnitId = typeof unitId === "string" && /^[A-Za-z0-9_-]+$/.test(unitId)
133
- ? unitId
134
- : "milestone";
135
- return `depth_verification_${safeUnitId}_confirm`;
136
- }
137
- return null;
138
- }
139
- const CHANGE_REQUEST_RESPONSE_RE = /\b(?:no|nope|nah|not\s+yet|don't|do\s+not|change|add|remove|reclassify|adjust|clarify|missing|instead|but|however|wait|hold)\b/i;
140
- const APPROVAL_RESPONSE_RE = /^(?:y|yes|yeah|yep|approve|approved|confirm|confirmed|correct|right|looks\s+(?:good|right)|sounds\s+good|all\s+good|ok|okay|go\s+ahead|proceed|write\s+it|save\s+it|do\s+it)\b/i;
141
- const RESEARCH_DECISION_RESPONSE_RE = /^(?:research|run\s+research|do\s+research|skip|skip\s+research|no\s+research)\b/i;
142
- export function isExplicitApprovalResponse(input, pendingGateId) {
143
- const text = input?.trim() ?? "";
144
- if (!text)
145
- return false;
146
- if (pendingGateId?.includes("research_decision")) {
147
- return RESEARCH_DECISION_RESPONSE_RE.test(text);
148
- }
149
- if (CHANGE_REQUEST_RESPONSE_RE.test(text))
150
- return false;
151
- return APPROVAL_RESPONSE_RE.test(text);
152
- }
153
- export function isAwaitingUserInput(messages) {
154
- if (anyMessageMatches(messages, /ask_user_questions was cancelled before receiving a response/i))
155
- return true;
156
- if (anyMessageMatches(messages, REMOTE_QUESTION_FAILURE_RE))
157
- return true;
158
- const text = lastAssistantVisibleText(messages);
159
- if (!text)
160
- return false;
161
- if (APPROVAL_WAIT_RE.test(text))
162
- return true;
163
- const lines = text.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
164
- if (lines.some((line) => line.endsWith("?")))
165
- return true;
166
- return hasApprovalQuestion(text);
167
- }
168
- export function isAwaitingApprovalBoundary(messages) {
169
- if (anyMessageMatches(messages, /ask_user_questions was cancelled before receiving a response/i))
170
- return true;
171
- if (anyMessageMatches(messages, REMOTE_QUESTION_FAILURE_RE))
172
- return true;
173
- const text = lastAssistantVisibleText(messages);
174
- if (!text)
175
- return false;
176
- if (APPROVAL_WAIT_RE.test(text))
177
- return true;
178
- return hasApprovalQuestion(text);
179
- }
180
- /** True when an assistant message already has an in-flight ask_user_questions tool call. */
181
- export function messageHasPendingAskUserQuestionsTool(message) {
182
- if (!message || typeof message !== "object")
183
- return false;
184
- const content = message.content;
185
- if (!Array.isArray(content))
186
- return false;
187
- return content.some((block) => {
188
- if (!block || typeof block !== "object")
189
- return false;
190
- // Claude Code marks completion by attaching externalResult, not by setting state.
191
- // Streaming blocks often carry no state; serverToolUse is the claude-code-cli MCP path.
192
- const tool = block;
193
- if (tool.type !== "toolCall" && tool.type !== "serverToolUse")
194
- return false;
195
- const name = String(tool.name ?? "").toLowerCase();
196
- if (!name.includes("ask_user_questions"))
197
- return false;
198
- if (tool.externalResult !== undefined)
199
- return false;
200
- return tool.state !== "completed" && tool.state !== "done";
201
- });
202
- }
203
- export function shouldPauseForUserApprovalQuestion(unitType, messages) {
204
- if (!unitType || !USER_APPROVAL_UNIT_TYPES.has(unitType))
205
- return false;
206
- if (anyMessageMatches(messages, /ask_user_questions was cancelled before receiving a response/i))
207
- return true;
208
- if (anyMessageMatches(messages, REMOTE_QUESTION_FAILURE_RE))
209
- return true;
210
- const text = lastAssistantVisibleText(messages);
211
- if (!text)
212
- return false;
213
- if (APPROVAL_WAIT_RE.test(text))
214
- return true;
215
- if (unitType === "research-decision")
216
- return hasResearchDecisionQuestion(text);
217
- return hasApprovalQuestion(text);
218
- }
@@ -1,173 +0,0 @@
1
- import test from "node:test";
2
- import assert from "node:assert/strict";
3
-
4
- import * as userInputBoundary from "../user-input-boundary.ts";
5
- import {
6
- isAwaitingUserInput,
7
- messageHasPendingAskUserQuestionsTool,
8
- shouldPauseForUserApprovalQuestion,
9
- } from "../user-input-boundary.ts";
10
-
11
- test("lastAssistantText extracts the latest assistant text block content", () => {
12
- const lastAssistantText = (userInputBoundary as {
13
- lastAssistantText?: (messages: unknown[] | null | undefined) => string;
14
- }).lastAssistantText;
15
-
16
- assert.equal(typeof lastAssistantText, "function");
17
- assert.equal(
18
- lastAssistantText?.([
19
- { role: "assistant", content: "Older message" },
20
- {
21
- role: "assistant",
22
- content: [
23
- { type: "text", text: "First line" },
24
- { type: "text", text: "Second line" },
25
- ],
26
- },
27
- ]),
28
- "First line\nSecond line",
29
- );
30
- assert.equal(lastAssistantText?.(null), "");
31
- });
32
-
33
- test("lastAssistantText includes thinking blocks so rate-limit notices are not dropped", () => {
34
- const lastAssistantText = (userInputBoundary as {
35
- lastAssistantText?: (messages: unknown[] | null | undefined) => string;
36
- }).lastAssistantText;
37
-
38
- assert.equal(typeof lastAssistantText, "function");
39
- // Turn with only a thinking block (no text block) — must not return ""
40
- const result = lastAssistantText?.([
41
- {
42
- role: "assistant",
43
- content: [
44
- { type: "thinking", thinking: "You've hit your limit · resets in 2h" },
45
- ],
46
- },
47
- ]);
48
- assert.ok(result?.includes("You've hit your limit"), `expected rate-limit text, got: ${JSON.stringify(result)}`);
49
- });
50
-
51
- test("isAwaitingUserInput does not trigger on thinking-block question marks", () => {
52
- // A thinking block with a question mark must NOT pause auto-mode —
53
- // it's internal reasoning, not a user-visible prompt.
54
- const messages = [
55
- {
56
- role: "assistant",
57
- content: [
58
- { type: "thinking", thinking: "Should I skip research? Let me check the config." },
59
- ],
60
- },
61
- ];
62
- assert.equal(isAwaitingUserInput(messages), false);
63
- assert.equal(shouldPauseForUserApprovalQuestion("discuss-project", messages), false);
64
- });
65
-
66
- test("isAwaitingUserInput does not trigger on thinking-block approval phrases", () => {
67
- // A thinking block with approval phrases must NOT pause auto-mode.
68
- const messages = [
69
- {
70
- role: "assistant",
71
- content: [
72
- { type: "thinking", thinking: "The user confirmed and approved the plan. Should I proceed?" },
73
- ],
74
- },
75
- ];
76
- assert.equal(isAwaitingUserInput(messages), false);
77
- assert.equal(shouldPauseForUserApprovalQuestion("discuss-requirements", messages), false);
78
- });
79
-
80
- test("messageHasPendingAskUserQuestionsTool detects in-flight structured question tools", () => {
81
- // state: "running" with no externalResult → still in-flight
82
- assert.equal(
83
- messageHasPendingAskUserQuestionsTool({
84
- role: "assistant",
85
- content: [
86
- { type: "text", text: "Which direction?" },
87
- { type: "toolCall", name: "mcp__gsd-workflow__ask_user_questions", state: "running" },
88
- ],
89
- }),
90
- true,
91
- );
92
-
93
- // no state, no externalResult — streaming block that hasn't completed yet
94
- assert.equal(
95
- messageHasPendingAskUserQuestionsTool({
96
- role: "assistant",
97
- content: [
98
- { type: "toolCall", name: "ask_user_questions" },
99
- ],
100
- }),
101
- true,
102
- );
103
-
104
- // state: "completed" — legacy state-based completion
105
- assert.equal(
106
- messageHasPendingAskUserQuestionsTool({
107
- role: "assistant",
108
- content: [
109
- { type: "toolCall", name: "ask_user_questions", state: "completed" },
110
- ],
111
- }),
112
- false,
113
- );
114
-
115
- // externalResult present — Claude Code signals completion via externalResult, not state
116
- assert.equal(
117
- messageHasPendingAskUserQuestionsTool({
118
- role: "assistant",
119
- content: [
120
- { type: "toolCall", name: "ask_user_questions", externalResult: { content: [], isError: false } },
121
- ],
122
- }),
123
- false,
124
- );
125
- assert.equal(
126
- messageHasPendingAskUserQuestionsTool({
127
- role: "assistant",
128
- content: [
129
- {
130
- type: "toolCall",
131
- name: "ask_user_questions",
132
- externalResult: { content: [{ type: "text", text: "answer" }], isError: false },
133
- },
134
- ],
135
- }),
136
- false,
137
- );
138
-
139
- // serverToolUse shape (claude-code-cli MCP path) — no externalResult → in-flight
140
- assert.equal(
141
- messageHasPendingAskUserQuestionsTool({
142
- role: "assistant",
143
- content: [
144
- { type: "serverToolUse", name: "mcp__gsd-workflow__ask_user_questions" },
145
- ],
146
- }),
147
- true,
148
- );
149
- // serverToolUse shape — externalResult present → completed
150
- assert.equal(
151
- messageHasPendingAskUserQuestionsTool({
152
- role: "assistant",
153
- content: [
154
- { type: "serverToolUse", name: "ask_user_questions", externalResult: { content: [], isError: false } },
155
- ],
156
- }),
157
- false,
158
- );
159
- });
160
-
161
- test("isAwaitingUserInput still triggers on text-block question marks when thinking is also present", () => {
162
- // When thinking + text are both present and the text asks a question, it should still pause.
163
- const messages = [
164
- {
165
- role: "assistant",
166
- content: [
167
- { type: "thinking", thinking: "Internal reasoning without questions." },
168
- { type: "text", text: "Does this look correct?" },
169
- ],
170
- },
171
- ];
172
- assert.equal(isAwaitingUserInput(messages), true);
173
- });
@@ -1,216 +0,0 @@
1
- const USER_APPROVAL_UNIT_TYPES = new Set([
2
- "discuss-project",
3
- "discuss-requirements",
4
- "discuss-milestone",
5
- "research-decision",
6
- ]);
7
-
8
- const REMOTE_QUESTION_FAILURE_RE =
9
- /(?:Remote (?:auth failed|questions failed|channel configured but returned no result|questions timed out|questions timed out or failed)|Failed to send questions via)/i;
10
-
11
- const APPROVAL_WAIT_RE =
12
- /\bwait(?:ing)?\s+for\s+(?:your\s+)?(?:confirmation|approval|input|response|answer)\b/i;
13
-
14
- const APPROVAL_QUESTION_RE =
15
- /\b(?:confirm|confirmation|approve|approval|approved|captured|correct|correctly|happy\s+with|ready\s+to\s+(?:write|save|proceed|ship)|(?:want|need)\s+to\s+adjust|should\s+I\s+(?:write|save|proceed)|do\s+you\s+want\s+me\s+to\s+(?:write|save|proceed)|ship\s+it)\b/i;
16
-
17
- const APPROVAL_RIGHT_QUESTION_RE =
18
- /\b(?:does|do|is|are|was|were|did)\b[^\n?]{0,120}\bright\b/i;
19
-
20
- const APPROVAL_CHANGE_QUESTION_RE =
21
- /\b(?:anything\s+else|anything|something)\s+to\s+(?:adjust|add|remove|reclassify)\b/i;
22
-
23
- const RESEARCH_DECISION_QUESTION_RE =
24
- /\b(?:research|skip)\b/i;
25
-
26
- function extractVisibleTextFromMessage(msg: unknown): string {
27
- if (!msg || typeof msg !== "object") return "";
28
- const content = (msg as { content?: unknown }).content;
29
- if (typeof content === "string") return content;
30
- if (!Array.isArray(content)) return "";
31
- const parts: string[] = [];
32
- for (const block of content) {
33
- if (!block || typeof block !== "object") continue;
34
- const typed = block as { type?: unknown; text?: unknown };
35
- if (typed.type === "text" && typeof typed.text === "string") {
36
- parts.push(typed.text);
37
- }
38
- // thinking blocks intentionally excluded — they are internal reasoning, not user-visible
39
- }
40
- return parts.join("\n");
41
- }
42
-
43
- function extractTextFromMessage(msg: unknown): string {
44
- if (!msg || typeof msg !== "object") return "";
45
- const content = (msg as { content?: unknown }).content;
46
- if (typeof content === "string") return content;
47
- if (!Array.isArray(content)) return "";
48
- const parts: string[] = [];
49
- for (const block of content) {
50
- if (!block || typeof block !== "object") continue;
51
- const typed = block as { type?: unknown; text?: unknown; thinking?: unknown };
52
- if (typed.type === "text" && typeof typed.text === "string") {
53
- parts.push(typed.text);
54
- }
55
- if (typed.type === "thinking" && typeof typed.thinking === "string") {
56
- parts.push(typed.thinking);
57
- }
58
- }
59
- return parts.join("\n");
60
- }
61
-
62
- export function lastAssistantText(messages: unknown[] | null | undefined): string {
63
- if (!Array.isArray(messages)) return "";
64
- for (let i = messages.length - 1; i >= 0; i--) {
65
- const msg = messages[i];
66
- if (!msg || typeof msg !== "object") continue;
67
- if ((msg as { role?: unknown }).role !== "assistant") continue;
68
- const text = extractTextFromMessage(msg).trim();
69
- if (text) return text;
70
- }
71
- return "";
72
- }
73
-
74
- function lastAssistantVisibleText(messages: unknown[] | null | undefined): string {
75
- if (!Array.isArray(messages)) return "";
76
- for (let i = messages.length - 1; i >= 0; i--) {
77
- const msg = messages[i];
78
- if (!msg || typeof msg !== "object") continue;
79
- if ((msg as { role?: unknown }).role !== "assistant") continue;
80
- const text = extractVisibleTextFromMessage(msg).trim();
81
- if (text) return text;
82
- }
83
- return "";
84
- }
85
-
86
- function anyMessageMatches(messages: unknown[] | undefined, pattern: RegExp): boolean {
87
- if (!Array.isArray(messages)) return false;
88
- return messages.some((msg) => {
89
- if (!msg || typeof msg !== "object") return false;
90
- if ((msg as { role?: unknown }).role === "user") return false;
91
- return pattern.test(extractVisibleTextFromMessage(msg));
92
- });
93
- }
94
-
95
- function hasApprovalQuestion(text: string): boolean {
96
- for (let i = 0; i < text.length; i++) {
97
- if (text[i] !== "?") continue;
98
- const previousBreak = Math.max(
99
- text.lastIndexOf("\n", i),
100
- text.lastIndexOf(".", i),
101
- text.lastIndexOf("!", i),
102
- text.lastIndexOf("?", i - 1),
103
- );
104
- const fragment = text.slice(previousBreak + 1, i + 1);
105
- if (APPROVAL_QUESTION_RE.test(fragment)) return true;
106
- if (APPROVAL_RIGHT_QUESTION_RE.test(fragment)) return true;
107
- if (APPROVAL_CHANGE_QUESTION_RE.test(fragment)) return true;
108
- }
109
- return false;
110
- }
111
-
112
- function hasResearchDecisionQuestion(text: string): boolean {
113
- for (let i = 0; i < text.length; i++) {
114
- if (text[i] !== "?") continue;
115
- const previousBreak = Math.max(
116
- text.lastIndexOf("\n", i),
117
- text.lastIndexOf(".", i),
118
- text.lastIndexOf("!", i),
119
- text.lastIndexOf("?", i - 1),
120
- );
121
- const fragment = text.slice(previousBreak + 1, i + 1);
122
- if (RESEARCH_DECISION_QUESTION_RE.test(fragment)) return true;
123
- }
124
- return false;
125
- }
126
-
127
- export function approvalGateIdForUnit(
128
- unitType: string | undefined,
129
- unitId?: string | null,
130
- ): string | null {
131
- if (!unitType) return null;
132
- if (unitType === "discuss-project") return "depth_verification_project_confirm";
133
- if (unitType === "discuss-requirements") return "depth_verification_requirements_confirm";
134
- if (unitType === "research-decision") return "depth_verification_research_decision_confirm";
135
- if (unitType === "discuss-milestone") {
136
- const safeUnitId = typeof unitId === "string" && /^[A-Za-z0-9_-]+$/.test(unitId)
137
- ? unitId
138
- : "milestone";
139
- return `depth_verification_${safeUnitId}_confirm`;
140
- }
141
- return null;
142
- }
143
-
144
- const CHANGE_REQUEST_RESPONSE_RE =
145
- /\b(?:no|nope|nah|not\s+yet|don't|do\s+not|change|add|remove|reclassify|adjust|clarify|missing|instead|but|however|wait|hold)\b/i;
146
-
147
- const APPROVAL_RESPONSE_RE =
148
- /^(?:y|yes|yeah|yep|approve|approved|confirm|confirmed|correct|right|looks\s+(?:good|right)|sounds\s+good|all\s+good|ok|okay|go\s+ahead|proceed|write\s+it|save\s+it|do\s+it)\b/i;
149
-
150
- const RESEARCH_DECISION_RESPONSE_RE =
151
- /^(?:research|run\s+research|do\s+research|skip|skip\s+research|no\s+research)\b/i;
152
-
153
- export function isExplicitApprovalResponse(
154
- input: string | undefined,
155
- pendingGateId?: string | null,
156
- ): boolean {
157
- const text = input?.trim() ?? "";
158
- if (!text) return false;
159
- if (pendingGateId?.includes("research_decision")) {
160
- return RESEARCH_DECISION_RESPONSE_RE.test(text);
161
- }
162
- if (CHANGE_REQUEST_RESPONSE_RE.test(text)) return false;
163
- return APPROVAL_RESPONSE_RE.test(text);
164
- }
165
-
166
- export function isAwaitingUserInput(messages: unknown[] | undefined): boolean {
167
- if (anyMessageMatches(messages, /ask_user_questions was cancelled before receiving a response/i)) return true;
168
- if (anyMessageMatches(messages, REMOTE_QUESTION_FAILURE_RE)) return true;
169
- const text = lastAssistantVisibleText(messages);
170
- if (!text) return false;
171
- if (APPROVAL_WAIT_RE.test(text)) return true;
172
- const lines = text.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
173
- if (lines.some((line) => line.endsWith("?"))) return true;
174
- return hasApprovalQuestion(text);
175
- }
176
-
177
- export function isAwaitingApprovalBoundary(messages: unknown[] | undefined): boolean {
178
- if (anyMessageMatches(messages, /ask_user_questions was cancelled before receiving a response/i)) return true;
179
- if (anyMessageMatches(messages, REMOTE_QUESTION_FAILURE_RE)) return true;
180
- const text = lastAssistantVisibleText(messages);
181
- if (!text) return false;
182
- if (APPROVAL_WAIT_RE.test(text)) return true;
183
- return hasApprovalQuestion(text);
184
- }
185
-
186
- /** True when an assistant message already has an in-flight ask_user_questions tool call. */
187
- export function messageHasPendingAskUserQuestionsTool(message: unknown): boolean {
188
- if (!message || typeof message !== "object") return false;
189
- const content = (message as { content?: unknown }).content;
190
- if (!Array.isArray(content)) return false;
191
- return content.some((block) => {
192
- if (!block || typeof block !== "object") return false;
193
- // Claude Code marks completion by attaching externalResult, not by setting state.
194
- // Streaming blocks often carry no state; serverToolUse is the claude-code-cli MCP path.
195
- const tool = block as { type?: string; name?: string; state?: string; externalResult?: unknown };
196
- if (tool.type !== "toolCall" && tool.type !== "serverToolUse") return false;
197
- const name = String(tool.name ?? "").toLowerCase();
198
- if (!name.includes("ask_user_questions")) return false;
199
- if (tool.externalResult !== undefined) return false;
200
- return tool.state !== "completed" && tool.state !== "done";
201
- });
202
- }
203
-
204
- export function shouldPauseForUserApprovalQuestion(
205
- unitType: string | undefined,
206
- messages: unknown[] | undefined,
207
- ): boolean {
208
- if (!unitType || !USER_APPROVAL_UNIT_TYPES.has(unitType)) return false;
209
- if (anyMessageMatches(messages, /ask_user_questions was cancelled before receiving a response/i)) return true;
210
- if (anyMessageMatches(messages, REMOTE_QUESTION_FAILURE_RE)) return true;
211
- const text = lastAssistantVisibleText(messages);
212
- if (!text) return false;
213
- if (APPROVAL_WAIT_RE.test(text)) return true;
214
- if (unitType === "research-decision") return hasResearchDecisionQuestion(text);
215
- return hasApprovalQuestion(text);
216
- }