@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.6ccd27b3

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 (837) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli-style.d.ts +17 -0
  4. package/dist/cli-style.js +28 -0
  5. package/dist/cli.js +2 -19
  6. package/dist/headless-events.d.ts +4 -2
  7. package/dist/headless-events.js +14 -34
  8. package/dist/loader.js +6 -4
  9. package/dist/mcp-server.js +2 -1
  10. package/dist/models-resolver.d.ts +3 -13
  11. package/dist/models-resolver.js +3 -22
  12. package/dist/register-agent-bundles.d.ts +11 -2
  13. package/dist/register-agent-bundles.js +18 -4
  14. package/dist/resource-loader.d.ts +10 -5
  15. package/dist/resource-loader.js +123 -20
  16. package/dist/resources/.managed-resources-content-hash +1 -1
  17. package/dist/resources/GSD-WORKFLOW.md +5 -4
  18. package/dist/resources/extensions/ask-user-questions.js +3 -2
  19. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  20. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  21. package/dist/resources/extensions/async-jobs/index.js +65 -0
  22. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  23. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  24. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  25. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  26. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  27. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  28. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  29. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  30. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  31. package/dist/resources/extensions/browser-tools/index.js +69 -12
  32. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  33. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +464 -200
  34. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  35. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  36. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  37. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  38. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  39. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  40. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  41. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  42. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  43. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  44. package/dist/resources/extensions/gsd/auto/orchestrator.js +207 -73
  45. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  46. package/dist/resources/extensions/gsd/auto/phases.js +17 -2324
  47. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  48. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  49. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  50. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  51. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  52. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  53. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  54. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  55. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
  56. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  57. package/dist/resources/extensions/gsd/auto-start.js +47 -29
  58. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  59. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  60. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  61. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  62. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  63. package/dist/resources/extensions/gsd/auto-worktree.js +50 -354
  64. package/dist/resources/extensions/gsd/auto.js +49 -22
  65. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  66. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  67. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +69 -19
  68. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  69. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  70. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  71. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  72. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  73. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  74. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  75. package/dist/resources/extensions/gsd/captures.js +5 -15
  76. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  77. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  78. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  79. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  80. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  81. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  82. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  83. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  84. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  85. package/dist/resources/extensions/gsd/constants.js +0 -2
  86. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  87. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  88. package/dist/resources/extensions/gsd/db/queries.js +428 -0
  89. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  90. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  91. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  92. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  93. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  94. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  95. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  96. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  97. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  98. package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
  99. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  100. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  101. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  102. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  103. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  104. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  105. package/dist/resources/extensions/gsd/files.js +33 -19
  106. package/dist/resources/extensions/gsd/git-service.js +1 -0
  107. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  108. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  109. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  110. package/dist/resources/extensions/gsd/guidance.js +158 -0
  111. package/dist/resources/extensions/gsd/guided-flow.js +144 -9
  112. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  113. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  114. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  115. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  116. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  117. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  118. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  119. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  120. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  121. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  122. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  123. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  124. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  125. package/dist/resources/extensions/gsd/model-router.js +3 -0
  126. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  127. package/dist/resources/extensions/gsd/notifications.js +12 -7
  128. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  129. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  130. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  131. package/dist/resources/extensions/gsd/paths.js +37 -24
  132. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  133. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  134. package/dist/resources/extensions/gsd/preferences.js +14 -0
  135. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  136. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  137. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  138. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  139. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  140. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  141. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  142. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  143. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  144. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  145. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  146. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  147. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  148. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  149. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  150. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  151. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  152. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  153. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  154. package/dist/resources/extensions/gsd/publication.js +87 -0
  155. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  156. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  157. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  158. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  159. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  160. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  161. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  162. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  163. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  164. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  165. package/dist/resources/extensions/gsd/state.js +12 -22
  166. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  167. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  168. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  169. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  170. package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
  171. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  172. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  173. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  174. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  175. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  176. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  177. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  178. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  179. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  180. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  181. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  182. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  183. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  184. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  185. package/dist/resources/extensions/gsd/undo.js +8 -7
  186. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  187. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  188. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  189. package/dist/resources/extensions/gsd/unit-registry.js +367 -0
  190. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  191. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  192. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  193. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  194. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  195. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  196. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  197. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  198. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  199. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  200. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  201. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  202. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  203. package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
  204. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  205. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  206. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  207. package/dist/resources/extensions/gsd/worktree-safety.js +36 -31
  208. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  209. package/dist/resources/extensions/gsd/worktree.js +8 -1
  210. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  211. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  212. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  213. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  214. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  215. package/dist/resources/shared/package-manager-detection.js +1 -1
  216. package/dist/resources/shared/package.json +3 -0
  217. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  218. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  219. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  220. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  221. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  222. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  223. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  224. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  225. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  226. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  227. package/dist/runtime-checks.d.ts +10 -0
  228. package/dist/runtime-checks.js +27 -0
  229. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  230. package/dist/update-check.d.ts +2 -0
  231. package/dist/update-check.js +24 -1
  232. package/dist/update-cmd.js +20 -3
  233. package/dist/web/standalone/.next/BUILD_ID +1 -1
  234. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  235. package/dist/web/standalone/.next/build-manifest.json +3 -3
  236. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  237. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  238. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  239. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  240. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  241. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  242. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  243. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  244. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  245. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  246. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  247. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  248. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  249. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  250. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  251. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  252. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  253. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  254. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  256. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  257. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  258. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  259. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  261. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  262. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  263. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  264. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  265. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  266. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  267. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  268. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  269. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  270. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  271. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  272. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  273. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  274. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  275. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  276. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  277. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  278. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  279. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  280. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  281. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  282. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  283. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  284. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  285. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  286. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  287. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  288. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  289. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  290. package/dist/web/standalone/.next/server/app/index.html +1 -1
  291. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  292. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  293. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  294. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  295. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  296. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  297. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  298. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  299. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  300. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  301. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  302. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  303. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  304. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  305. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  306. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  307. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  308. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  309. package/dist/web/standalone/package.json +1 -1
  310. package/dist/worktree-cli.js +3 -6
  311. package/dist/worktree-status-banner.js +7 -11
  312. package/package.json +3 -3
  313. package/packages/cloud-mcp-gateway/package.json +2 -2
  314. package/packages/contracts/dist/rpc.d.ts +1 -0
  315. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  316. package/packages/contracts/dist/rpc.js.map +1 -1
  317. package/packages/contracts/dist/workflow.d.ts +4 -0
  318. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  319. package/packages/contracts/dist/workflow.js.map +1 -1
  320. package/packages/contracts/package.json +1 -1
  321. package/packages/daemon/package.json +4 -4
  322. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  323. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  324. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  325. package/packages/gsd-agent-core/package.json +5 -5
  326. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  327. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  328. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  329. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  330. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  331. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  332. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  333. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  334. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  335. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  336. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  337. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  338. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  339. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  340. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  341. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  342. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  343. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  344. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  345. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  346. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  347. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  348. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  349. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  350. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  351. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  352. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  353. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  354. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  355. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  356. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  357. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  358. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  359. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  360. package/packages/gsd-agent-modes/package.json +7 -7
  361. package/packages/mcp-server/README.md +12 -3
  362. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  363. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  364. package/packages/mcp-server/dist/cli-runner.js +137 -0
  365. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  366. package/packages/mcp-server/dist/cli.js +2 -50
  367. package/packages/mcp-server/dist/cli.js.map +1 -1
  368. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  369. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  370. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  371. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  372. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  373. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  374. package/packages/mcp-server/dist/pid-registry.js +452 -0
  375. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  376. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  377. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  378. package/packages/mcp-server/dist/probe-mode.js +10 -0
  379. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  380. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  381. package/packages/mcp-server/dist/server.js +4 -0
  382. package/packages/mcp-server/dist/server.js.map +1 -1
  383. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  384. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  385. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  386. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  387. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  388. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  389. package/packages/mcp-server/dist/workflow-tools.js +207 -102
  390. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  391. package/packages/mcp-server/package.json +5 -4
  392. package/packages/native/package.json +1 -1
  393. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  394. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  395. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  396. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  397. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  398. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  399. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  400. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  401. package/packages/pi-agent-core/dist/index.js +3 -0
  402. package/packages/pi-agent-core/dist/index.js.map +1 -1
  403. package/packages/pi-agent-core/package.json +1 -1
  404. package/packages/pi-ai/README.md +1 -0
  405. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  406. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  407. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  408. package/packages/pi-ai/dist/index.d.ts +2 -0
  409. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  410. package/packages/pi-ai/dist/index.js +2 -0
  411. package/packages/pi-ai/dist/index.js.map +1 -1
  412. package/packages/pi-ai/dist/models.generated.d.ts +158 -17
  413. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  414. package/packages/pi-ai/dist/models.generated.js +132 -17
  415. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  416. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  417. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  418. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  419. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  420. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  421. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  422. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  423. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  424. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  425. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  426. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  427. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  428. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  429. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  430. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  431. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  432. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  433. package/packages/pi-ai/package.json +3 -2
  434. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  435. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  436. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  437. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  438. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  439. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  440. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  441. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  442. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  443. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  444. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  445. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  446. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  447. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  448. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  449. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  450. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  451. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  452. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  453. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  454. package/packages/pi-coding-agent/dist/index.js +1 -1
  455. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  456. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  457. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  458. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  459. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  460. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  461. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  462. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  463. package/packages/pi-coding-agent/package.json +7 -7
  464. package/packages/pi-tui/dist/index.d.ts +1 -1
  465. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  466. package/packages/pi-tui/dist/index.js +1 -1
  467. package/packages/pi-tui/dist/index.js.map +1 -1
  468. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  469. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  470. package/packages/pi-tui/dist/terminal-image.js +54 -2
  471. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  472. package/packages/pi-tui/dist/tui.d.ts +8 -0
  473. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  474. package/packages/pi-tui/dist/tui.js +72 -18
  475. package/packages/pi-tui/dist/tui.js.map +1 -1
  476. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  477. package/packages/pi-tui/dist/utils.js +110 -36
  478. package/packages/pi-tui/dist/utils.js.map +1 -1
  479. package/packages/pi-tui/package.json +2 -2
  480. package/packages/rpc-client/package.json +2 -2
  481. package/pkg/dist/theme/theme.d.ts.map +1 -1
  482. package/pkg/dist/theme/theme.js +45 -17
  483. package/pkg/dist/theme/theme.js.map +1 -1
  484. package/pkg/package.json +1 -1
  485. package/src/resources/GSD-WORKFLOW.md +5 -4
  486. package/src/resources/extensions/ask-user-questions.ts +7 -2
  487. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  488. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  489. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  490. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  491. package/src/resources/extensions/async-jobs/index.ts +79 -0
  492. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  493. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  494. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  495. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  496. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  497. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  498. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  499. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  500. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  501. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  502. package/src/resources/extensions/browser-tools/index.ts +71 -13
  503. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  504. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  505. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  506. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  507. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +543 -202
  508. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +700 -7
  509. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  510. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  511. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  512. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  513. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  514. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  515. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  516. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  517. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  518. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  519. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  520. package/src/resources/extensions/gsd/auto/orchestrator.ts +232 -76
  521. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  522. package/src/resources/extensions/gsd/auto/phases.ts +58 -3013
  523. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  524. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  525. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  526. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  527. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  528. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  529. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  530. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  531. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
  532. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  533. package/src/resources/extensions/gsd/auto-start.ts +48 -33
  534. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  535. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  536. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  537. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  538. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  539. package/src/resources/extensions/gsd/auto-worktree.ts +56 -366
  540. package/src/resources/extensions/gsd/auto.ts +69 -26
  541. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  542. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  543. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +89 -18
  544. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  545. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  546. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  547. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  548. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  549. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  550. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  551. package/src/resources/extensions/gsd/captures.ts +5 -16
  552. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  553. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  554. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  555. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  556. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  557. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  558. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  559. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  560. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  561. package/src/resources/extensions/gsd/constants.ts +0 -3
  562. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  563. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  564. package/src/resources/extensions/gsd/db/queries.ts +519 -0
  565. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  566. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  567. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  568. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  569. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  570. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  571. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  572. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  573. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  574. package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
  575. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  576. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  577. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  578. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  579. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  580. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  581. package/src/resources/extensions/gsd/files.ts +33 -12
  582. package/src/resources/extensions/gsd/git-service.ts +1 -0
  583. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  584. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  585. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  586. package/src/resources/extensions/gsd/guidance.ts +217 -0
  587. package/src/resources/extensions/gsd/guided-flow.ts +195 -29
  588. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  589. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  590. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  591. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  592. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  593. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  594. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  595. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  596. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  597. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  598. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  599. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  600. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  601. package/src/resources/extensions/gsd/model-router.ts +3 -0
  602. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  603. package/src/resources/extensions/gsd/notifications.ts +13 -6
  604. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  605. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  606. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  607. package/src/resources/extensions/gsd/paths.ts +42 -22
  608. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  609. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  610. package/src/resources/extensions/gsd/preferences.ts +18 -0
  611. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  612. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  613. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  614. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  615. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  616. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  617. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  618. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  619. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  620. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  621. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  622. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  623. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  624. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  625. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  626. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  627. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  628. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  629. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  630. package/src/resources/extensions/gsd/publication.ts +122 -0
  631. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  632. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  633. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  634. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  635. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  636. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  637. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  638. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  639. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  640. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  641. package/src/resources/extensions/gsd/state.ts +16 -22
  642. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  643. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  644. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  645. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  646. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +329 -22
  647. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  648. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  649. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  650. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +54 -1
  651. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  652. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  653. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  654. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  655. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  656. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  657. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  658. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  659. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  660. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  661. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  662. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  663. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  664. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  665. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  666. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  667. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  668. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  669. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  670. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  671. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  672. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  673. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  674. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  675. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  676. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  677. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  678. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  679. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  680. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  681. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  682. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  683. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  684. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  685. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  686. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  687. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  688. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  689. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  690. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  691. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  692. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
  693. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  694. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  695. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  696. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  697. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  698. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  699. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  700. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  701. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  702. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  703. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  704. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  705. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  706. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  707. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  708. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  709. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  710. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  711. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  712. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  713. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  714. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  715. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  716. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  717. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  718. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  719. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  720. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  721. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  722. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  723. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  724. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  725. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  726. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  727. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  728. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
  729. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  730. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  731. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  732. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  733. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  734. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  735. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  736. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  737. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  738. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  739. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  740. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  741. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
  742. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  743. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  744. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  745. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  746. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  747. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  748. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  749. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  750. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  751. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  752. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  753. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  754. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
  755. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  756. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  757. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  758. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  759. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  760. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  761. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  762. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  763. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  764. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  765. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  766. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +75 -1
  767. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  768. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
  769. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  770. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  771. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  772. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  773. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  774. package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
  775. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  776. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  777. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  778. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  779. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  780. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  781. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  782. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  783. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  784. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  785. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  786. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  787. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  788. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  789. package/src/resources/extensions/gsd/undo.ts +9 -8
  790. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  791. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  792. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  793. package/src/resources/extensions/gsd/unit-registry.ts +442 -0
  794. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  795. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  796. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  797. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  798. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  799. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  800. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  801. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  802. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  803. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  804. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  805. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  806. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  807. package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
  808. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  809. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  810. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  811. package/src/resources/extensions/gsd/worktree-safety.ts +49 -44
  812. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  813. package/src/resources/extensions/gsd/worktree.ts +7 -1
  814. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  815. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  816. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  817. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  818. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  819. package/src/resources/shared/package-manager-detection.ts +1 -1
  820. package/src/resources/shared/package.json +3 -0
  821. package/src/resources/skills/create-skill/SKILL.md +3 -0
  822. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  823. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  824. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  825. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  826. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  827. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  828. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  829. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  830. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  831. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  832. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  833. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  834. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  835. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  836. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
  837. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_ssgManifest.js +0 -0
@@ -6,7 +6,7 @@ import { spawn, spawnSync } from "node:child_process";
6
6
  import { randomUUID } from "node:crypto";
7
7
  import { writeFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
8
8
  import { join } from "node:path";
9
- import { getShellConfig, sanitizeCommand } from "@gsd/pi-coding-agent";
9
+ import { getShellConfig, sanitizeCommand, killProcessTree } from "@gsd/pi-coding-agent";
10
10
  import { rewriteCommandWithRtk } from "../shared/rtk.js";
11
11
  import { MAX_BUFFER_LINES, MAX_EVENTS, DEAD_PROCESS_TTL, } from "./types.js";
12
12
  import { restoreWindowsVTInput, formatUptime } from "./utilities.js";
@@ -221,6 +221,38 @@ export function startProcess(opts) {
221
221
  return bg;
222
222
  }
223
223
  // ── Process Kill ───────────────────────────────────────────────────────────
224
+ /**
225
+ * Gracefully terminate a process and its tree using the shared killProcessTree
226
+ * ladder (SIGTERM → grace window → SIGKILL), the same path bash/async_bash/exec
227
+ * use. This is the "I want it dead, cleanly" intent — use it for the `kill`
228
+ * action, `restart`, and session cleanup. For sending a SPECIFIC signal the
229
+ * agent chose on purpose (SIGINT, SIGHUP, …) use killProcess(), which delivers
230
+ * that exact signal once and does not escalate.
231
+ *
232
+ * `graceMs` overrides the SIGTERM→SIGKILL window (default: killProcessTree's 5s);
233
+ * session cleanup passes a shorter grace so it stays snappy between units.
234
+ *
235
+ * Returns false only when the process is unknown/already dead; the actual
236
+ * SIGKILL escalation fires asynchronously after the grace window, so callers
237
+ * should not assume the process is dead the instant this returns.
238
+ */
239
+ export function terminateProcess(id, graceMs) {
240
+ const bg = processes.get(id);
241
+ if (!bg)
242
+ return false;
243
+ if (!bg.alive)
244
+ return true;
245
+ if (!bg.proc.pid) {
246
+ // No pid to target a tree; fall back to a direct graceful signal.
247
+ try {
248
+ bg.proc.kill("SIGTERM");
249
+ }
250
+ catch { /* already gone */ }
251
+ return true;
252
+ }
253
+ killProcessTree(bg.proc.pid, graceMs !== undefined ? { graceMs } : undefined);
254
+ return true;
255
+ }
224
256
  export function killProcess(id, sig = "SIGTERM") {
225
257
  const bg = processes.get(id);
226
258
  if (!bg)
@@ -272,13 +304,14 @@ export async function restartProcess(id) {
272
304
  return null;
273
305
  const config = old.startConfig;
274
306
  const restartCount = old.restartCount + 1;
275
- // Kill old process
307
+ // Kill old process via the graceful ladder, then wait for it to actually die.
308
+ // killProcessTree escalates SIGTERM → grace → SIGKILL asynchronously, so poll
309
+ // for death rather than assuming a fixed sleep is enough.
276
310
  if (old.alive) {
277
- killProcess(id, "SIGTERM");
278
- await new Promise(r => setTimeout(r, 300));
279
- if (old.alive) {
280
- killProcess(id, "SIGKILL");
281
- await new Promise(r => setTimeout(r, 200));
311
+ terminateProcess(id);
312
+ const deadline = Date.now() + 6_000; // grace (5s) + slack
313
+ while (old.alive && Date.now() < deadline) {
314
+ await new Promise(r => setTimeout(r, 100));
282
315
  }
283
316
  }
284
317
  processes.delete(id);
@@ -328,24 +361,16 @@ export function pruneDeadProcesses() {
328
361
  }
329
362
  }
330
363
  export function cleanupAll() {
364
+ // Deliberately a bare, synchronous SIGKILL — not the graceful ladder. This runs
365
+ // from process 'exit'/signal handlers where timers no longer fire, so a deferred
366
+ // SIGKILL would never be delivered and children would be orphaned when we vanish.
367
+ // Immediate force-kill is the correct teardown semantics here.
331
368
  for (const [id, bg] of processes) {
332
369
  if (bg.alive)
333
370
  killProcess(id, "SIGKILL");
334
371
  }
335
372
  processes.clear();
336
373
  }
337
- /**
338
- * Kill all alive, non-persistent bg processes.
339
- * Called between auto-mode units to prevent orphaned servers from
340
- * keeping ports bound across task boundaries (#1209).
341
- */
342
- export function killSessionProcesses() {
343
- for (const [id, bg] of processes) {
344
- if (bg.alive && !bg.persistAcrossSessions) {
345
- killProcess(id, "SIGTERM");
346
- }
347
- }
348
- }
349
374
  async function waitForProcessExit(bg, timeoutMs) {
350
375
  if (!bg.alive)
351
376
  return true;
@@ -359,20 +384,24 @@ async function waitForProcessExit(bg, timeoutMs) {
359
384
  });
360
385
  return !bg.alive;
361
386
  }
387
+ /**
388
+ * Terminate the alive, non-persistent processes owned by a session, gracefully.
389
+ * Routes through the shared killProcessTree ladder (SIGTERM → grace → SIGKILL)
390
+ * via terminateProcess, with a short grace (default 300ms) so cleanup between
391
+ * units stays snappy; killProcessTree handles the SIGKILL escalation itself, so
392
+ * there is no separate force-kill pass here.
393
+ */
362
394
  export async function cleanupSessionProcesses(sessionFile, options) {
363
395
  const graceMs = Math.max(0, options?.graceMs ?? 300);
364
396
  const matches = Array.from(processes.values()).filter((bg) => bg.alive && !bg.persistAcrossSessions && bg.ownerSessionFile === sessionFile);
365
397
  if (matches.length === 0)
366
398
  return [];
367
399
  for (const bg of matches) {
368
- killProcess(bg.id, "SIGTERM");
400
+ terminateProcess(bg.id, graceMs);
369
401
  }
370
402
  if (graceMs > 0) {
371
- await Promise.all(matches.map((bg) => waitForProcessExit(bg, graceMs)));
372
- }
373
- for (const bg of matches) {
374
- if (bg.alive)
375
- killProcess(bg.id, "SIGKILL");
403
+ // Wait past the grace so the SIGKILL escalation has fired and exits are observed.
404
+ await Promise.all(matches.map((bg) => waitForProcessExit(bg, graceMs + 200)));
376
405
  }
377
406
  return matches.map((bg) => bg.id);
378
407
  }
@@ -72,6 +72,17 @@ export async function waitForReady(bg, timeout, signal) {
72
72
  return { ready: false, detail: "Cancelled" };
73
73
  }
74
74
  if (!bg.alive) {
75
+ // A clean exit-0 means the command ran to completion — it was a batch
76
+ // command (e.g. terraform apply, a migration, a build), not a long-lived
77
+ // server. That is success, not a readiness failure; say so plainly and
78
+ // point at the right tool so the agent stops using wait_for_ready here.
79
+ if (bg.exitCode === 0) {
80
+ return {
81
+ ready: false,
82
+ detail: "Process completed (exit 0) before signaling readiness — it ran to completion rather than staying alive. " +
83
+ "wait_for_ready is for long-lived servers/watchers; for a run-to-completion command use async_bash (or bg_shell 'run').",
84
+ };
85
+ }
75
86
  const stderrLines = bg.output.filter(l => l.stream === "stderr").slice(-5).map(l => l.line);
76
87
  const stderrContext = stderrLines.length > 0 ? `\nstderr:\n${stderrLines.join("\n").slice(0, 500)}` : "";
77
88
  return {
@@ -37,10 +37,13 @@ export const formatUptime = formatDuration;
37
37
  export function formatTimeAgo(timestamp) {
38
38
  return formatDuration(Date.now() - timestamp) + " ago";
39
39
  }
40
+ // NOTE: these worktree-layout regexes mirror findWorktreeSegment in
41
+ // src/resources/extensions/gsd/worktree-root.ts (bg-shell does not import the
42
+ // gsd extension). Keep them synchronized when a layout changes.
40
43
  function deriveProjectRootFromAutoWorktree(cachedCwd) {
41
44
  if (!cachedCwd)
42
45
  return undefined;
43
- const match = cachedCwd.match(/^(.*?)[\\/]\.gsd[\\/]worktrees[\\/][^\\/]+(?:[\\/].*)?$/);
46
+ const match = cachedCwd.match(/^(.*?)[\\/]\.gsd(?:-worktrees|[\\/]worktrees)[\\/][^\\/]+(?:[\\/].*)?$/);
44
47
  return match?.[1];
45
48
  }
46
49
  export function getBgShellLiveCwd(cachedCwd, pathExists = existsSync, getCwd = () => process.cwd(), chdir = (path) => process.chdir(path)) {
@@ -67,7 +70,7 @@ export function getBgShellLiveCwd(cachedCwd, pathExists = existsSync, getCwd = (
67
70
  }
68
71
  export function resolveBgShellPersistenceCwd(cachedCwd, liveCwd = undefined, pathExists = existsSync) {
69
72
  const resolvedLiveCwd = liveCwd ?? getBgShellLiveCwd(cachedCwd, pathExists);
70
- const cachedIsAutoWorktree = /(?:^|[\\/])\.gsd[\\/]worktrees[\\/]/.test(cachedCwd);
73
+ const cachedIsAutoWorktree = /(?:^|[\\/])\.gsd(?:-worktrees|[\\/]worktrees)[\\/]/.test(cachedCwd);
71
74
  if (!cachedIsAutoWorktree)
72
75
  return cachedCwd;
73
76
  if (cachedCwd === resolvedLiveCwd && pathExists(cachedCwd))
@@ -1,12 +1,14 @@
1
1
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
2
  import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
3
3
  import { Type } from "@sinclair/typebox";
4
+ import { BROWSER_CONTRACT_TOOL_NAMES } from "../../shared/browser-contract.js";
4
5
  import { resolveGsdBrowserMcpLaunchConfig } from "../../shared/gsd-browser-cli.js";
5
6
  import { buildMcpChildEnv } from "../../mcp-client/manager.js";
6
7
  const connections = new Map();
7
8
  const pendingConnections = new Map();
8
9
  const DEFAULT_MAX_LINES = 2_000;
9
10
  const DEFAULT_MAX_BYTES = 50 * 1024;
11
+ const MCP_CALL_TIMEOUT_MS = 60_000;
10
12
  const AssertionCheck = Type.Object({
11
13
  kind: Type.String({ description: "Assertion kind, e.g. url_contains, text_visible, selector_visible, no_console_errors, no_failed_requests." }),
12
14
  selector: Type.Optional(Type.String()),
@@ -30,29 +32,15 @@ const BatchStep = Type.Object({
30
32
  ref: Type.Optional(Type.String()),
31
33
  checks: Type.Optional(Type.Array(AssertionCheck)),
32
34
  }, { additionalProperties: true });
33
- export const MANAGED_GSD_BROWSER_TOOL_NAMES = [
34
- "browser_navigate",
35
- "browser_click",
36
- "browser_type",
37
- "browser_fill_form",
38
- "browser_click_ref",
39
- "browser_fill_ref",
40
- "browser_wait_for",
41
- "browser_assert",
42
- "browser_verify",
43
- "browser_screenshot",
44
- "browser_snapshot_refs",
45
- "browser_find",
46
- "browser_get_console_logs",
47
- "browser_get_network_logs",
48
- "browser_evaluate",
49
- "browser_reload",
50
- "browser_batch",
51
- "browser_act",
52
- ];
53
- const MANAGED_BROWSER_TOOLS = [
54
- {
55
- name: "browser_navigate",
35
+ /**
36
+ * The managed adapter serves exactly the Browser Automation Contract
37
+ * vocabulary. The spec table below is keyed by contract name, so adding a
38
+ * contract capability fails typecheck here until the adapter declares how the
39
+ * gsd-browser server satisfies it.
40
+ */
41
+ export const MANAGED_GSD_BROWSER_TOOL_NAMES = BROWSER_CONTRACT_TOOL_NAMES;
42
+ export const MANAGED_BROWSER_TOOL_SPECS = {
43
+ browser_navigate: {
56
44
  label: "Browser Navigate",
57
45
  description: "Navigate the managed gsd-browser session to a URL and return page state. Use for local web app verification and UAT evidence.",
58
46
  parameters: Type.Object({
@@ -60,8 +48,14 @@ const MANAGED_BROWSER_TOOLS = [
60
48
  screenshot: Type.Optional(Type.Boolean({ description: "Capture screenshot evidence when supported." })),
61
49
  }, { additionalProperties: true }),
62
50
  },
63
- {
64
- name: "browser_click",
51
+ browser_click: {
52
+ translate: {
53
+ requires: ["browser_batch"],
54
+ build: (args) => [{
55
+ mcpTool: "browser_batch",
56
+ args: { steps: [{ action: "click", ...args }] },
57
+ }],
58
+ },
65
59
  label: "Browser Click",
66
60
  description: "Click an element in the managed gsd-browser session by selector or coordinates.",
67
61
  parameters: Type.Object({
@@ -70,8 +64,14 @@ const MANAGED_BROWSER_TOOLS = [
70
64
  y: Type.Optional(Type.Number({ description: "Y coordinate to click." })),
71
65
  }, { additionalProperties: true }),
72
66
  },
73
- {
74
- name: "browser_type",
67
+ browser_type: {
68
+ translate: {
69
+ requires: ["browser_batch"],
70
+ build: (args) => [{
71
+ mcpTool: "browser_batch",
72
+ args: { steps: [{ action: "type", ...args }] },
73
+ }],
74
+ },
75
75
  label: "Browser Type",
76
76
  description: "Type or fill text into an input in the managed gsd-browser session.",
77
77
  parameters: Type.Object({
@@ -82,8 +82,7 @@ const MANAGED_BROWSER_TOOLS = [
82
82
  slowly: Type.Optional(Type.Boolean({ description: "Type character by character." })),
83
83
  }, { additionalProperties: true }),
84
84
  },
85
- {
86
- name: "browser_fill_form",
85
+ browser_fill_form: {
87
86
  label: "Browser Fill Form",
88
87
  description: "Fill a form in the managed gsd-browser session using field labels, names, placeholders, or aria labels.",
89
88
  parameters: Type.Object({
@@ -92,16 +91,14 @@ const MANAGED_BROWSER_TOOLS = [
92
91
  submit: Type.Optional(Type.Boolean({ description: "Submit the form after filling." })),
93
92
  }, { additionalProperties: true }),
94
93
  },
95
- {
96
- name: "browser_click_ref",
94
+ browser_click_ref: {
97
95
  label: "Browser Click Ref",
98
96
  description: "Click a versioned ref from the latest gsd-browser snapshot.",
99
97
  parameters: Type.Object({
100
98
  ref: Type.String({ description: "Versioned ref, e.g. @v3:e2." }),
101
99
  }, { additionalProperties: true }),
102
100
  },
103
- {
104
- name: "browser_fill_ref",
101
+ browser_fill_ref: {
105
102
  label: "Browser Fill Ref",
106
103
  description: "Fill text into an input-like versioned ref from the latest gsd-browser snapshot.",
107
104
  parameters: Type.Object({
@@ -112,8 +109,7 @@ const MANAGED_BROWSER_TOOLS = [
112
109
  slowly: Type.Optional(Type.Boolean({ description: "Type character by character." })),
113
110
  }, { additionalProperties: true }),
114
111
  },
115
- {
116
- name: "browser_wait_for",
112
+ browser_wait_for: {
117
113
  label: "Browser Wait For",
118
114
  description: "Wait for a browser condition such as network idle, selector visibility, text visibility, or URL change.",
119
115
  parameters: Type.Object({
@@ -123,8 +119,7 @@ const MANAGED_BROWSER_TOOLS = [
123
119
  timeout: Type.Optional(Type.Number({ description: "Maximum milliseconds to wait." })),
124
120
  }, { additionalProperties: true }),
125
121
  },
126
- {
127
- name: "browser_assert",
122
+ browser_assert: {
128
123
  label: "Browser Assert",
129
124
  description: "Run explicit browser assertions and return structured PASS/FAIL evidence.",
130
125
  promptGuidelines: [
@@ -135,8 +130,40 @@ const MANAGED_BROWSER_TOOLS = [
135
130
  checks: Type.Array(AssertionCheck),
136
131
  }, { additionalProperties: true }),
137
132
  },
138
- {
139
- name: "browser_verify",
133
+ browser_verify: {
134
+ translate: {
135
+ requires: ["browser_navigate", "browser_assert", "browser_screenshot"],
136
+ build: (args) => {
137
+ const calls = [
138
+ {
139
+ mcpTool: "browser_navigate",
140
+ args: { url: args.url, ...(args.timeout === undefined ? {} : { timeout: args.timeout }) },
141
+ },
142
+ ];
143
+ const verifyChecks = Array.isArray(args.checks) ? args.checks : [];
144
+ const assertChecks = [];
145
+ for (const check of verifyChecks) {
146
+ if (typeof check.expectedText === "string") {
147
+ assertChecks.push({ kind: "text_visible", text: check.expectedText });
148
+ }
149
+ if (typeof check.selector === "string") {
150
+ if (check.expectedVisible === false) {
151
+ assertChecks.push({ kind: "selector_hidden", selector: check.selector });
152
+ }
153
+ else if (check.expectedVisible === true || check.expectedText === undefined) {
154
+ assertChecks.push({ kind: "selector_visible", selector: check.selector });
155
+ }
156
+ }
157
+ }
158
+ if (assertChecks.length > 0) {
159
+ calls.push({ mcpTool: "browser_assert", args: { checks: assertChecks } });
160
+ }
161
+ if (verifyChecks.some((check) => check.screenshot === true)) {
162
+ calls.push({ mcpTool: "browser_screenshot", args: {}, optional: true });
163
+ }
164
+ return calls;
165
+ },
166
+ },
140
167
  label: "Browser Verify",
141
168
  description: "Run a structured browser verification flow and return evidence from the managed gsd-browser session.",
142
169
  parameters: Type.Object({
@@ -151,8 +178,7 @@ const MANAGED_BROWSER_TOOLS = [
151
178
  timeout: Type.Optional(Type.Number({ description: "Navigation timeout in milliseconds." })),
152
179
  }, { additionalProperties: true }),
153
180
  },
154
- {
155
- name: "browser_screenshot",
181
+ browser_screenshot: {
156
182
  label: "Browser Screenshot",
157
183
  description: "Capture browser screenshot evidence from the managed gsd-browser session.",
158
184
  compatibility: { producesImages: true },
@@ -162,8 +188,7 @@ const MANAGED_BROWSER_TOOLS = [
162
188
  quality: Type.Optional(Type.Number({ description: "JPEG quality when supported." })),
163
189
  }, { additionalProperties: true }),
164
190
  },
165
- {
166
- name: "browser_snapshot_refs",
191
+ browser_snapshot_refs: {
167
192
  mcpTools: ["browser_snapshot", "browser_snapshot_refs"],
168
193
  label: "Browser Snapshot Refs",
169
194
  description: "Capture a compact gsd-browser snapshot with versioned refs for reliable interaction.",
@@ -174,8 +199,7 @@ const MANAGED_BROWSER_TOOLS = [
174
199
  mode: Type.Optional(Type.String({ description: "Snapshot mode: interactive, form, dialog, navigation, errors, headings, visible_only." })),
175
200
  }, { additionalProperties: true }),
176
201
  },
177
- {
178
- name: "browser_find",
202
+ browser_find: {
179
203
  mcpTools: ["browser_find_element", "browser_find"],
180
204
  label: "Browser Find",
181
205
  description: "Find elements by text, role, or selector in the managed gsd-browser session.",
@@ -186,8 +210,7 @@ const MANAGED_BROWSER_TOOLS = [
186
210
  limit: Type.Optional(Type.Number({ description: "Maximum results to return." })),
187
211
  }, { additionalProperties: true }),
188
212
  },
189
- {
190
- name: "browser_get_console_logs",
213
+ browser_get_console_logs: {
191
214
  mcpTools: ["browser_console", "browser_get_console_logs"],
192
215
  label: "Browser Console Logs",
193
216
  description: "Return buffered console logs and JavaScript errors from the managed gsd-browser session.",
@@ -195,8 +218,7 @@ const MANAGED_BROWSER_TOOLS = [
195
218
  clear: Type.Optional(Type.Boolean({ description: "Clear the buffer after reading logs." })),
196
219
  }, { additionalProperties: true }),
197
220
  },
198
- {
199
- name: "browser_get_network_logs",
221
+ browser_get_network_logs: {
200
222
  mcpTools: ["browser_network", "browser_get_network_logs"],
201
223
  label: "Browser Network Logs",
202
224
  description: "Return buffered network requests and responses from the managed gsd-browser session.",
@@ -205,8 +227,7 @@ const MANAGED_BROWSER_TOOLS = [
205
227
  filter: Type.Optional(Type.String({ description: "Filter, e.g. all, errors, fetch-xhr." })),
206
228
  }, { additionalProperties: true }),
207
229
  },
208
- {
209
- name: "browser_evaluate",
230
+ browser_evaluate: {
210
231
  mcpTools: ["browser_eval", "browser_evaluate"],
211
232
  label: "Browser Evaluate",
212
233
  description: "Evaluate a JavaScript expression in the managed gsd-browser page context.",
@@ -214,14 +235,22 @@ const MANAGED_BROWSER_TOOLS = [
214
235
  expression: Type.String({ description: "JavaScript expression to evaluate." }),
215
236
  }, { additionalProperties: true }),
216
237
  },
217
- {
218
- name: "browser_reload",
238
+ browser_reload: {
239
+ // gsd-browser's daemon has a reload command but does not expose it over
240
+ // MCP, so reload rides browser_evaluate. The network-idle settle is
241
+ // best-effort: pages with persistent connections never go idle.
242
+ translate: {
243
+ requires: ["browser_evaluate", "browser_wait_for"],
244
+ build: () => [
245
+ { mcpTool: "browser_evaluate", args: { expression: "location.reload()" } },
246
+ { mcpTool: "browser_wait_for", args: { condition: "network_idle", timeout: 3_000 }, optional: true },
247
+ ],
248
+ },
219
249
  label: "Browser Reload",
220
250
  description: "Reload the current page in the managed gsd-browser session.",
221
251
  parameters: Type.Object({}, { additionalProperties: true }),
222
252
  },
223
- {
224
- name: "browser_batch",
253
+ browser_batch: {
225
254
  label: "Browser Batch",
226
255
  description: "Execute multiple explicit browser steps through the managed gsd-browser session in one call.",
227
256
  promptGuidelines: [
@@ -234,8 +263,7 @@ const MANAGED_BROWSER_TOOLS = [
234
263
  finalSummaryOnly: Type.Optional(Type.Boolean({ description: "Return only the compact final summary." })),
235
264
  }, { additionalProperties: true }),
236
265
  },
237
- {
238
- name: "browser_act",
266
+ browser_act: {
239
267
  label: "Browser Act",
240
268
  description: "Execute a semantic browser action through gsd-browser, such as primary_cta, submit_form, or close_dialog.",
241
269
  parameters: Type.Object({
@@ -243,7 +271,7 @@ const MANAGED_BROWSER_TOOLS = [
243
271
  scope: Type.Optional(Type.String({ description: "CSS selector to narrow the search area." })),
244
272
  }, { additionalProperties: true }),
245
273
  },
246
- ];
274
+ };
247
275
  function resolveProjectRoot(ctx) {
248
276
  return ctx?.cwd || process.cwd();
249
277
  }
@@ -324,11 +352,27 @@ function isUnknownMcpToolError(error) {
324
352
  const message = error instanceof Error ? error.message : String(error);
325
353
  return /unknown tool|tool .*not found|tool not found|not registered|does not exist/i.test(message);
326
354
  }
327
- function normalizeManagedArgs(piToolName, args) {
355
+ function normalizeBatchStep(step) {
356
+ if (!step || typeof step !== "object")
357
+ return step;
358
+ const { clearFirst, ...rest } = step;
359
+ return clearFirst === undefined ? step : { ...rest, clear_first: clearFirst };
360
+ }
361
+ export function normalizeManagedArgs(piToolName, args) {
328
362
  if (piToolName === "browser_snapshot_refs") {
329
363
  const { interactiveOnly: _interactiveOnly, ...snapshotArgs } = args;
330
364
  return snapshotArgs;
331
365
  }
366
+ if (piToolName === "browser_batch") {
367
+ // gsd-browser's MCP batch tool reads snake_case option and step keys.
368
+ const { stopOnFailure, finalSummaryOnly, steps, ...rest } = args;
369
+ return {
370
+ ...rest,
371
+ ...(Array.isArray(steps) ? { steps: steps.map(normalizeBatchStep) } : {}),
372
+ ...(stopOnFailure === undefined ? {} : { stop_on_failure: stopOnFailure }),
373
+ ...(finalSummaryOnly === undefined ? {} : { summary_only: finalSummaryOnly }),
374
+ };
375
+ }
332
376
  return args;
333
377
  }
334
378
  function serializeMcpContent(contentItems) {
@@ -395,32 +439,70 @@ function truncateHeadText(text, options) {
395
439
  totalBytes,
396
440
  };
397
441
  }
398
- async function callManagedGsdBrowserTool(piToolName, mcpTools, args, options) {
442
+ function callGsdBrowserMcp(connection, mcpTool, args, signal) {
443
+ return connection.client.callTool({ name: mcpTool, arguments: args }, undefined, { signal, timeout: MCP_CALL_TIMEOUT_MS });
444
+ }
445
+ function buildManagedToolResult(connection, piToolName, mcpToolsUsed, contentItems, lastResult) {
446
+ const serialized = serializeMcpContent(contentItems);
447
+ return {
448
+ content: serialized.content,
449
+ details: {
450
+ engine: "gsd-browser",
451
+ server: connection.launch.serverName,
452
+ tool: piToolName,
453
+ mcpTool: mcpToolsUsed[mcpToolsUsed.length - 1] ?? piToolName,
454
+ ...(mcpToolsUsed.length > 1 ? { mcpTools: mcpToolsUsed } : {}),
455
+ sessionName: connection.launch.sessionName,
456
+ projectRoot: connection.launch.projectRoot,
457
+ truncated: serialized.truncated,
458
+ outputLines: serialized.outputLines,
459
+ outputBytes: serialized.outputBytes,
460
+ structuredContent: lastResult.structuredContent,
461
+ mcpIsError: Boolean(lastResult.isError),
462
+ },
463
+ isError: Boolean(lastResult.isError),
464
+ };
465
+ }
466
+ async function callTranslatedGsdBrowserTool(connection, piToolName, translation, args, options) {
467
+ const calls = translation.build(args);
468
+ const contentItems = [];
469
+ const toolsUsed = [];
470
+ let lastResult = {};
471
+ for (const call of calls) {
472
+ let result;
473
+ try {
474
+ result = await callGsdBrowserMcp(connection, call.mcpTool, normalizeManagedArgs(call.mcpTool, call.args), options.signal);
475
+ }
476
+ catch (error) {
477
+ if (call.optional)
478
+ continue;
479
+ throw error;
480
+ }
481
+ if (call.optional && result.isError)
482
+ continue;
483
+ toolsUsed.push(call.mcpTool);
484
+ if (Array.isArray(result.content))
485
+ contentItems.push(...result.content);
486
+ lastResult = result;
487
+ // Later calls assume the earlier ones took effect (e.g. assert after a
488
+ // failed navigation would report misleading evidence), so stop here.
489
+ if (lastResult.isError)
490
+ break;
491
+ }
492
+ return buildManagedToolResult(connection, piToolName, toolsUsed, contentItems, lastResult);
493
+ }
494
+ async function callManagedGsdBrowserTool(piToolName, spec, args, options) {
399
495
  const connection = await getOrConnectManagedGsdBrowser(options.ctx, options.signal);
400
496
  const normalizedArgs = normalizeManagedArgs(piToolName, args);
497
+ if (spec.translate) {
498
+ return callTranslatedGsdBrowserTool(connection, piToolName, spec.translate, normalizedArgs, options);
499
+ }
401
500
  let lastError;
402
- for (const mcpTool of mcpTools) {
501
+ for (const mcpTool of spec.mcpTools ?? [piToolName]) {
403
502
  try {
404
- const result = await connection.client.callTool({ name: mcpTool, arguments: normalizedArgs }, undefined, { signal: options.signal, timeout: 60000 });
503
+ const result = await callGsdBrowserMcp(connection, mcpTool, normalizedArgs, options.signal);
405
504
  const contentItems = Array.isArray(result.content) ? result.content : [];
406
- const serialized = serializeMcpContent(contentItems);
407
- return {
408
- content: serialized.content,
409
- details: {
410
- engine: "gsd-browser",
411
- server: connection.launch.serverName,
412
- tool: piToolName,
413
- mcpTool,
414
- sessionName: connection.launch.sessionName,
415
- projectRoot: connection.launch.projectRoot,
416
- truncated: serialized.truncated,
417
- outputLines: serialized.outputLines,
418
- outputBytes: serialized.outputBytes,
419
- structuredContent: result.structuredContent,
420
- mcpIsError: Boolean(result.isError),
421
- },
422
- isError: Boolean(result.isError),
423
- };
505
+ return buildManagedToolResult(connection, piToolName, [mcpTool], contentItems, result);
424
506
  }
425
507
  catch (error) {
426
508
  lastError = error;
@@ -440,6 +522,43 @@ function formatManagedBrowserError(toolName, error) {
440
522
  "Unset GSD_BROWSER_ENGINE or set GSD_BROWSER_ENGINE=playwright to use the default Playwright engine.",
441
523
  ].join("\n");
442
524
  }
525
+ /**
526
+ * Contract tools the server's advertised tool list cannot satisfy through any
527
+ * of their declared MCP candidates or translations.
528
+ */
529
+ export function findMissingContractCoverage(servedToolNames) {
530
+ const served = new Set(servedToolNames);
531
+ return BROWSER_CONTRACT_TOOL_NAMES.filter((name) => {
532
+ const spec = MANAGED_BROWSER_TOOL_SPECS[name];
533
+ if (spec.translate) {
534
+ return !spec.translate.requires.every((required) => served.has(required));
535
+ }
536
+ const candidates = spec.mcpTools ?? [name];
537
+ return !candidates.some((candidate) => served.has(candidate));
538
+ });
539
+ }
540
+ /**
541
+ * Compare the server's advertised tool list against the Browser Automation
542
+ * Contract so a server that stops serving a contract tool surfaces at warm-up
543
+ * instead of as a first-use error. Best-effort: a failed or empty listing
544
+ * returns no warning (call-time alias fallback still applies).
545
+ */
546
+ async function verifyContractCoverage(connection, signal) {
547
+ let served;
548
+ try {
549
+ const result = await connection.client.listTools(undefined, { signal, timeout: 10000 });
550
+ served = (result.tools ?? []).map((tool) => tool.name);
551
+ }
552
+ catch {
553
+ return undefined;
554
+ }
555
+ if (served.length === 0)
556
+ return undefined;
557
+ const missing = findMissingContractCoverage(served);
558
+ if (missing.length === 0)
559
+ return undefined;
560
+ return `gsd-browser does not serve ${missing.length} Browser Automation Contract tool(s): ${missing.join(", ")}. These will error on first use; update gsd-browser or check GSD_BROWSER_* overrides.`;
561
+ }
443
562
  /**
444
563
  * Eagerly establish the managed gsd-browser connection so browser tools are
445
564
  * ready before first use. Best-effort: returns the error instead of throwing so
@@ -449,17 +568,19 @@ function formatManagedBrowserError(toolName, error) {
449
568
  */
450
569
  export async function warmUpManagedGsdBrowser(ctx, signal) {
451
570
  try {
452
- await getOrConnectManagedGsdBrowser(ctx, signal);
453
- return { ok: true };
571
+ const connection = await getOrConnectManagedGsdBrowser(ctx, signal);
572
+ const coverageWarning = await verifyContractCoverage(connection, signal);
573
+ return coverageWarning ? { ok: true, coverageWarning } : { ok: true };
454
574
  }
455
575
  catch (error) {
456
576
  return { ok: false, error: error instanceof Error ? error.message : String(error) };
457
577
  }
458
578
  }
459
579
  export function registerManagedGsdBrowserTools(pi) {
460
- for (const tool of MANAGED_BROWSER_TOOLS) {
580
+ for (const name of BROWSER_CONTRACT_TOOL_NAMES) {
581
+ const tool = MANAGED_BROWSER_TOOL_SPECS[name];
461
582
  pi.registerTool({
462
- name: tool.name,
583
+ name,
463
584
  label: tool.label,
464
585
  description: tool.description,
465
586
  ...(tool.promptGuidelines ? { promptGuidelines: tool.promptGuidelines } : {}),
@@ -467,17 +588,17 @@ export function registerManagedGsdBrowserTools(pi) {
467
588
  parameters: tool.parameters,
468
589
  async execute(_toolCallId, params, signal, _onUpdate, ctx) {
469
590
  try {
470
- return await callManagedGsdBrowserTool(tool.name, tool.mcpTools ?? [tool.name], params, { signal, ctx });
591
+ return await callManagedGsdBrowserTool(name, tool, params, { signal, ctx });
471
592
  }
472
593
  catch (error) {
473
- const message = formatManagedBrowserError(tool.name, error);
594
+ const message = formatManagedBrowserError(name, error);
474
595
  return {
475
596
  content: [{ type: "text", text: message }],
476
597
  details: {
477
598
  engine: "gsd-browser",
478
599
  server: "gsd-browser",
479
- tool: tool.name,
480
- mcpTool: tool.mcpTools?.[0] ?? tool.name,
600
+ tool: name,
601
+ mcpTool: tool.translate?.requires[0] ?? tool.mcpTools?.[0] ?? name,
481
602
  error: error instanceof Error ? error.message : String(error),
482
603
  },
483
604
  isError: true,