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

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 (604) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/models-resolver.d.ts +3 -13
  8. package/dist/models-resolver.js +3 -22
  9. package/dist/resource-loader.js +2 -14
  10. package/dist/resources/.managed-resources-content-hash +1 -1
  11. package/dist/resources/GSD-WORKFLOW.md +5 -4
  12. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  13. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  14. package/dist/resources/extensions/async-jobs/index.js +65 -0
  15. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  16. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  17. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  18. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  19. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  20. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  21. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  22. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  23. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  24. package/dist/resources/extensions/browser-tools/index.js +69 -12
  25. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  27. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  28. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  29. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  31. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  32. package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
  33. package/dist/resources/extensions/gsd/auto/phases.js +8 -3
  34. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
  35. package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
  36. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  37. package/dist/resources/extensions/gsd/auto-post-unit.js +31 -14
  38. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  39. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  40. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  41. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  42. package/dist/resources/extensions/gsd/auto-verification.js +9 -28
  43. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  44. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  45. package/dist/resources/extensions/gsd/auto.js +15 -20
  46. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  47. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  48. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  49. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  50. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  51. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  52. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  53. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  54. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  55. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  56. package/dist/resources/extensions/gsd/captures.js +5 -15
  57. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  58. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  59. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  60. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  61. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  62. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  63. package/dist/resources/extensions/gsd/constants.js +0 -2
  64. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  65. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  66. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  67. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  68. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  69. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  70. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  71. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  72. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  73. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  74. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  75. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  76. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  77. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  78. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  79. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  80. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  81. package/dist/resources/extensions/gsd/files.js +33 -19
  82. package/dist/resources/extensions/gsd/git-service.js +1 -0
  83. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  84. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  85. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  86. package/dist/resources/extensions/gsd/guidance.js +158 -0
  87. package/dist/resources/extensions/gsd/guided-flow.js +51 -5
  88. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  89. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  90. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  91. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  92. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  93. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  94. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  95. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  96. package/dist/resources/extensions/gsd/model-router.js +3 -0
  97. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  98. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  99. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  100. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  101. package/dist/resources/extensions/gsd/paths.js +37 -24
  102. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  103. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  104. package/dist/resources/extensions/gsd/preferences.js +14 -0
  105. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  106. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  107. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  108. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/run-uat.md +6 -4
  110. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  111. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  112. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  113. package/dist/resources/extensions/gsd/publication.js +87 -0
  114. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  115. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  116. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  117. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  118. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  119. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  120. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  121. package/dist/resources/extensions/gsd/state.js +6 -20
  122. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  123. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  124. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  125. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  126. package/dist/resources/extensions/gsd/tools/complete-slice.js +44 -53
  127. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  128. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  129. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  130. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  131. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  132. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  133. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  134. package/dist/resources/extensions/gsd/undo.js +8 -7
  135. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  136. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  137. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  138. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  139. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  140. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  141. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  142. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  143. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  144. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  145. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  146. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  147. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  148. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  149. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  150. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  151. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  152. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  153. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  154. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  155. package/dist/resources/shared/package-manager-detection.js +1 -1
  156. package/dist/resources/shared/package.json +3 -0
  157. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  158. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  159. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  160. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  161. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  162. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  163. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  164. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  165. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  166. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  167. package/dist/update-check.d.ts +2 -0
  168. package/dist/update-check.js +24 -1
  169. package/dist/update-cmd.js +20 -3
  170. package/dist/web/standalone/.next/BUILD_ID +1 -1
  171. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  172. package/dist/web/standalone/.next/build-manifest.json +3 -3
  173. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  174. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  175. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  176. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  184. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  191. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  207. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  213. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  215. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/index.html +1 -1
  228. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  229. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  230. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  231. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  232. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  233. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  234. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  235. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  236. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  237. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  238. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  241. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  242. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  243. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  244. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  245. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  246. package/dist/web/standalone/package.json +1 -1
  247. package/dist/worktree-cli.js +3 -6
  248. package/dist/worktree-status-banner.js +7 -11
  249. package/package.json +1 -1
  250. package/packages/cloud-mcp-gateway/package.json +2 -2
  251. package/packages/contracts/dist/rpc.d.ts +1 -0
  252. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  253. package/packages/contracts/dist/rpc.js.map +1 -1
  254. package/packages/contracts/dist/workflow.d.ts +4 -0
  255. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  256. package/packages/contracts/dist/workflow.js.map +1 -1
  257. package/packages/contracts/package.json +1 -1
  258. package/packages/daemon/package.json +4 -4
  259. package/packages/gsd-agent-core/package.json +5 -5
  260. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  261. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  262. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
  263. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  264. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  265. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  267. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  268. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  269. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  271. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  273. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  275. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  277. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  278. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  279. package/packages/gsd-agent-modes/package.json +7 -7
  280. package/packages/mcp-server/dist/cli.js +6 -3
  281. package/packages/mcp-server/dist/cli.js.map +1 -1
  282. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  283. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  284. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  285. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  286. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  287. package/packages/mcp-server/dist/server.js +4 -0
  288. package/packages/mcp-server/dist/server.js.map +1 -1
  289. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  290. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  291. package/packages/mcp-server/dist/workflow-tools.js +145 -59
  292. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  293. package/packages/mcp-server/package.json +5 -4
  294. package/packages/native/package.json +1 -1
  295. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  296. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  297. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  298. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  299. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  300. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  301. package/packages/pi-agent-core/dist/index.js +3 -0
  302. package/packages/pi-agent-core/dist/index.js.map +1 -1
  303. package/packages/pi-agent-core/package.json +1 -1
  304. package/packages/pi-ai/README.md +1 -0
  305. package/packages/pi-ai/dist/index.d.ts +2 -0
  306. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  307. package/packages/pi-ai/dist/index.js +2 -0
  308. package/packages/pi-ai/dist/index.js.map +1 -1
  309. package/packages/pi-ai/dist/models.generated.d.ts +192 -0
  310. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/models.generated.js +166 -0
  312. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  313. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  315. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  317. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  319. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  322. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  323. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  324. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  325. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  326. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  327. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  329. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  330. package/packages/pi-ai/package.json +3 -2
  331. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  332. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  334. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  337. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  340. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  342. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  344. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  346. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/index.js +1 -1
  348. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  350. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  352. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  353. package/packages/pi-coding-agent/package.json +7 -7
  354. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  355. package/packages/pi-tui/dist/tui.js +9 -0
  356. package/packages/pi-tui/dist/tui.js.map +1 -1
  357. package/packages/pi-tui/package.json +2 -2
  358. package/packages/rpc-client/package.json +2 -2
  359. package/pkg/package.json +1 -1
  360. package/src/resources/GSD-WORKFLOW.md +5 -4
  361. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  362. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  363. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  364. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  365. package/src/resources/extensions/async-jobs/index.ts +79 -0
  366. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  367. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  368. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  369. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  370. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  371. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  372. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  373. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  374. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  375. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  376. package/src/resources/extensions/browser-tools/index.ts +71 -13
  377. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  378. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  379. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  380. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  381. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  382. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  383. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  384. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  385. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  386. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  387. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  388. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  389. package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
  390. package/src/resources/extensions/gsd/auto/phases.ts +12 -3
  391. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
  392. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
  393. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  394. package/src/resources/extensions/gsd/auto-post-unit.ts +37 -13
  395. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  396. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  397. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  398. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  399. package/src/resources/extensions/gsd/auto-verification.ts +8 -26
  400. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  401. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  402. package/src/resources/extensions/gsd/auto.ts +28 -24
  403. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  404. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  405. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  406. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  407. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  408. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  409. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  410. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  411. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  412. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  413. package/src/resources/extensions/gsd/captures.ts +5 -16
  414. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  415. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  416. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  417. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  418. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  419. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  420. package/src/resources/extensions/gsd/constants.ts +0 -3
  421. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  422. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  423. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  424. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  425. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  426. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  427. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  428. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  429. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  430. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  431. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  432. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  433. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  434. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  435. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  436. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  437. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  438. package/src/resources/extensions/gsd/files.ts +33 -12
  439. package/src/resources/extensions/gsd/git-service.ts +1 -0
  440. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  441. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  442. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  443. package/src/resources/extensions/gsd/guidance.ts +217 -0
  444. package/src/resources/extensions/gsd/guided-flow.ts +50 -5
  445. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  446. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  447. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  448. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  449. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  450. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  451. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  452. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  453. package/src/resources/extensions/gsd/model-router.ts +3 -0
  454. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  455. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  456. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  457. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  458. package/src/resources/extensions/gsd/paths.ts +42 -22
  459. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  460. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  461. package/src/resources/extensions/gsd/preferences.ts +18 -0
  462. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  463. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  464. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  465. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  466. package/src/resources/extensions/gsd/prompts/run-uat.md +6 -4
  467. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  468. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  469. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  470. package/src/resources/extensions/gsd/publication.ts +122 -0
  471. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  472. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  473. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  474. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  475. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  476. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  477. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  478. package/src/resources/extensions/gsd/state.ts +9 -21
  479. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  480. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  481. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  482. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
  483. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  484. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  485. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  486. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  487. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  488. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  489. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  490. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  491. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  492. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  493. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  494. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  495. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  496. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  497. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  498. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  499. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  500. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  501. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  502. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  503. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  504. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  505. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  506. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  507. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  508. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  509. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  510. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  511. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  512. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  513. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  514. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  515. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  516. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  517. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  518. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  519. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  520. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  521. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  522. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  523. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  524. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  525. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  526. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  527. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  528. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  529. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  530. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  531. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  532. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
  533. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  534. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  535. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  536. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  537. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  538. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  539. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  540. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  541. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  542. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  543. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  544. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  545. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  546. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  547. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  548. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  549. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  550. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  551. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  552. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  553. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  554. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  555. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  556. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  557. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  558. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  559. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  560. package/src/resources/extensions/gsd/tools/complete-slice.ts +43 -68
  561. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  562. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  563. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  564. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  565. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  566. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  567. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  568. package/src/resources/extensions/gsd/undo.ts +9 -8
  569. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  570. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  571. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  572. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  573. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  574. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  575. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  576. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  577. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  578. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  579. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  580. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  581. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  582. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  583. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  584. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  585. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  586. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  587. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  588. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  589. package/src/resources/shared/package-manager-detection.ts +1 -1
  590. package/src/resources/shared/package.json +3 -0
  591. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  592. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  593. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  594. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  595. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  596. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  597. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  598. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  599. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  600. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  601. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  602. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  603. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_buildManifest.js +0 -0
  604. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_ssgManifest.js +0 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Terminal presentation helpers for CLI-side notices on stderr — warnings,
3
+ * hints, and names. Pairs with the extension-side glyph set in
4
+ * resources/extensions/shared/ui.ts. Adopt incrementally: banner-shaped CLI
5
+ * surfaces (worktree banners today; update checks et al. as they're touched)
6
+ * should render through these instead of ad-hoc chalk.
7
+ */
8
+ /** Dim "[gsd] " line tag that prefixes CLI banner lines. */
9
+ export declare function gsdTag(): string;
10
+ /** A yellow warning fragment. */
11
+ export declare function warn(text: string): string;
12
+ /** A dim "what to do next" hint fragment. */
13
+ export declare function hint(text: string): string;
14
+ /** A cyan user-supplied name (worktree, branch, file). */
15
+ export declare function name(text: string): string;
16
+ /** One banner line: tagged warning followed by a tagged hint line. */
17
+ export declare function bannerLines(warning: string, hintText: string): string;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Terminal presentation helpers for CLI-side notices on stderr — warnings,
3
+ * hints, and names. Pairs with the extension-side glyph set in
4
+ * resources/extensions/shared/ui.ts. Adopt incrementally: banner-shaped CLI
5
+ * surfaces (worktree banners today; update checks et al. as they're touched)
6
+ * should render through these instead of ad-hoc chalk.
7
+ */
8
+ import chalk from 'chalk';
9
+ /** Dim "[gsd] " line tag that prefixes CLI banner lines. */
10
+ export function gsdTag() {
11
+ return chalk.dim('[gsd] ');
12
+ }
13
+ /** A yellow warning fragment. */
14
+ export function warn(text) {
15
+ return chalk.yellow(text);
16
+ }
17
+ /** A dim "what to do next" hint fragment. */
18
+ export function hint(text) {
19
+ return chalk.dim(text);
20
+ }
21
+ /** A cyan user-supplied name (worktree, branch, file). */
22
+ export function name(text) {
23
+ return chalk.cyan(text);
24
+ }
25
+ /** One banner line: tagged warning followed by a tagged hint line. */
26
+ export function bannerLines(warning, hintText) {
27
+ return gsdTag() + warning + '\n' + gsdTag() + hint(hintText) + '\n\n';
28
+ }
package/dist/cli.js CHANGED
@@ -524,7 +524,7 @@ const authStorage = AuthStorage.create(authFilePath);
524
524
  markStartup('AuthStorage.create');
525
525
  loadStoredEnvKeys(authStorage);
526
526
  migratePiCredentials(authStorage);
527
- // Resolve models.json path with fallback to ~/.pi/agent/models.json
527
+ // Resolve models.json path
528
528
  const { resolveModelsJsonPath } = await import('./models-resolver.js');
529
529
  const modelsJsonPath = resolveModelsJsonPath();
530
530
  const modelRegistry = ModelRegistry.create(authStorage, modelsJsonPath);
@@ -5,6 +5,10 @@
5
5
  * and classifies commands as quick (single-turn) vs long-running.
6
6
  *
7
7
  * Also defines exit code constants and the status→exit-code mapping function.
8
+ *
9
+ * The stop/pause notice vocabulary itself (prefixes + message classifiers)
10
+ * lives in the Stop Notice module — the same module the emitters format with,
11
+ * so wording stays in lockstep with detection.
8
12
  */
9
13
  export declare const EXIT_SUCCESS = 0;
10
14
  export declare const EXIT_ERROR = 1;
@@ -42,8 +46,6 @@ export declare function mapStatusToExitCode(status: string): number;
42
46
  *
43
47
  * Blocked detection is separate — checked via isBlockedNotification.
44
48
  */
45
- export declare const PAUSED_PREFIXES: string[];
46
- export declare const TERMINAL_PREFIXES: string[];
47
49
  export declare const IDLE_TIMEOUT_MS = 15000;
48
50
  export declare const NEW_MILESTONE_IDLE_TIMEOUT_MS = 120000;
49
51
  export declare function canonicalHeadlessToolName(toolName: string | undefined): string;
@@ -5,7 +5,13 @@
5
5
  * and classifies commands as quick (single-turn) vs long-running.
6
6
  *
7
7
  * Also defines exit code constants and the status→exit-code mapping function.
8
+ *
9
+ * The stop/pause notice vocabulary itself (prefixes + message classifiers)
10
+ * lives in the Stop Notice module — the same module the emitters format with,
11
+ * so wording stays in lockstep with detection.
8
12
  */
13
+ import { isBlockedNoticeMessage, isManualResolutionNotice, isPauseNotice, isTerminalNotice, } from './resources/extensions/gsd/stop-notice.js';
14
+ import { canonicalToolName } from './resources/extensions/gsd/engine-hook-contract.js';
9
15
  // ---------------------------------------------------------------------------
10
16
  // Exit Code Constants
11
17
  // ---------------------------------------------------------------------------
@@ -65,40 +71,19 @@ export function mapStatusToExitCode(status) {
65
71
  *
66
72
  * Blocked detection is separate — checked via isBlockedNotification.
67
73
  */
68
- export const PAUSED_PREFIXES = ['auto-mode paused', 'step-mode paused'];
69
- export const TERMINAL_PREFIXES = [
70
- 'auto-mode stopped',
71
- 'step-mode stopped',
72
- 'auto-mode complete',
73
- 'no active milestone',
74
- 'auto-mode idle',
75
- ];
76
74
  export const IDLE_TIMEOUT_MS = 15_000;
77
75
  // new-milestone is a long-running creative task where the LLM may pause
78
76
  // between tool calls (e.g. after mkdir, before writing files). Use a
79
77
  // longer idle timeout to avoid killing the session prematurely (#808).
80
78
  export const NEW_MILESTONE_IDLE_TIMEOUT_MS = 120_000;
81
79
  const INTERACTIVE_HEADLESS_TOOLS = new Set(['ask_user_questions', 'secure_env_collect']);
80
+ // Delegates to the shared normalizer seam (engine-hook-contract.ts) instead of
81
+ // a hand-rolled parser. Behavior differs from the old parser only on malformed
82
+ // MCP names: `mcp____tool` (empty server) and `mcp__server__` (empty tool) are
83
+ // now returned unchanged rather than partially stripped — neither can match a
84
+ // real tool name, so detection behavior is unaffected.
82
85
  export function canonicalHeadlessToolName(toolName) {
83
- const name = String(toolName ?? '');
84
- if (!name.startsWith('mcp__'))
85
- return name;
86
- const toolSeparator = name.indexOf('__', 'mcp__'.length);
87
- return toolSeparator >= 0 ? name.slice(toolSeparator + 2) : name;
88
- }
89
- function isManualResolutionNotification(message) {
90
- return (message.includes('resolve manually and re-run /gsd auto') ||
91
- message.includes('resolve conflicts manually and run /gsd auto to resume') ||
92
- message.includes('resolve and run /gsd auto to resume'));
93
- }
94
- function isNonBlockingPauseNotification(message) {
95
- return message.includes('idempotent advance: unit already active');
96
- }
97
- function isPauseNotification(message) {
98
- return PAUSED_PREFIXES.some((prefix) => message.startsWith(prefix));
99
- }
100
- function isPauseNotificationRequiringIntervention(message) {
101
- return isPauseNotification(message) && !isNonBlockingPauseNotification(message);
86
+ return canonicalToolName(String(toolName ?? ''));
102
87
  }
103
88
  function getCommandBlockContent(event) {
104
89
  if (event.type !== 'message_start' && event.type !== 'message_end')
@@ -122,20 +107,15 @@ export function isTerminalNotification(event) {
122
107
  if (event.type !== 'extension_ui_request' || event.method !== 'notify')
123
108
  return false;
124
109
  const message = String(event.message ?? '').toLowerCase();
125
- return (TERMINAL_PREFIXES.some((prefix) => message.startsWith(prefix)) ||
126
- isPauseNotification(message) ||
127
- isManualResolutionNotification(message));
110
+ return isTerminalNotice(message) || isPauseNotice(message) || isManualResolutionNotice(message);
128
111
  }
129
112
  export function isBlockedNotification(event) {
130
113
  if (isBlockingCommandBlock(event))
131
114
  return true;
132
115
  if (event.type !== 'extension_ui_request' || event.method !== 'notify')
133
116
  return false;
134
- const message = String(event.message ?? '').toLowerCase();
135
117
  // Recoverable pauses need operator intervention in headless mode.
136
- return (message.includes('blocked:') ||
137
- isPauseNotificationRequiringIntervention(message) ||
138
- isManualResolutionNotification(message));
118
+ return isBlockedNoticeMessage(String(event.message ?? '').toLowerCase());
139
119
  }
140
120
  export function isMilestoneReadyNotification(event) {
141
121
  if (event.type !== 'extension_ui_request' || event.method !== 'notify')
@@ -29,6 +29,7 @@ function isPlainObject(value) {
29
29
  // built via a template string so TypeScript's NodeNext resolver treats them as
30
30
  // `any` and skips static checking.
31
31
  const MCP_PKG = '@modelcontextprotocol/sdk';
32
+ import { sanitizeSchemaForMoonshot } from '@gsd/pi-ai';
32
33
  export function mcpSdkSpecifier(subpath) {
33
34
  return `${MCP_PKG}/${subpath}.js`;
34
35
  }
@@ -65,7 +66,7 @@ export async function startMcpServer(options) {
65
66
  tools: tools.map((t) => ({
66
67
  name: t.name,
67
68
  description: t.description,
68
- inputSchema: t.parameters,
69
+ inputSchema: sanitizeSchemaForMoonshot(t.parameters),
69
70
  })),
70
71
  }));
71
72
  // tools/call — execute the requested tool and return content blocks.
@@ -1,20 +1,10 @@
1
1
  /**
2
- * Models.json resolution with fallback to ~/.pi/agent/models.json
2
+ * Models.json resolution for GSD.
3
3
  *
4
- * GSD uses ~/.gsd/agent/models.json, but for a smooth migration/development
5
- * experience, this module provides resolution logic that:
6
- *
7
- * 1. Reads ~/.gsd/agent/models.json if it exists
8
- * 2. Falls back to ~/.pi/agent/models.json if GSD file doesn't exist
9
- * 3. Merges both files if both exist (GSD takes precedence)
4
+ * Uses ~/.gsd/agent/models.json exclusively.
10
5
  */
11
6
  /**
12
- * Resolve the path to models.json with fallback logic.
13
- *
14
- * Priority:
15
- * 1. ~/.gsd/agent/models.json (exists) → return this path
16
- * 2. ~/.pi/agent/models.json (exists) → return this path (fallback)
17
- * 3. Neither exists → return GSD path (will be created)
7
+ * Resolve the path to models.json.
18
8
  *
19
9
  * @returns The path to use for models.json
20
10
  */
@@ -1,35 +1,16 @@
1
1
  /**
2
- * Models.json resolution with fallback to ~/.pi/agent/models.json
2
+ * Models.json resolution for GSD.
3
3
  *
4
- * GSD uses ~/.gsd/agent/models.json, but for a smooth migration/development
5
- * experience, this module provides resolution logic that:
6
- *
7
- * 1. Reads ~/.gsd/agent/models.json if it exists
8
- * 2. Falls back to ~/.pi/agent/models.json if GSD file doesn't exist
9
- * 3. Merges both files if both exist (GSD takes precedence)
4
+ * Uses ~/.gsd/agent/models.json exclusively.
10
5
  */
11
- import { existsSync } from 'node:fs';
12
- import { homedir } from 'node:os';
13
6
  import { join } from 'node:path';
14
7
  import { agentDir } from './app-paths.js';
15
8
  const GSD_MODELS_PATH = join(agentDir, 'models.json');
16
- const PI_MODELS_PATH = join(homedir(), '.pi', 'agent', 'models.json');
17
9
  /**
18
- * Resolve the path to models.json with fallback logic.
19
- *
20
- * Priority:
21
- * 1. ~/.gsd/agent/models.json (exists) → return this path
22
- * 2. ~/.pi/agent/models.json (exists) → return this path (fallback)
23
- * 3. Neither exists → return GSD path (will be created)
10
+ * Resolve the path to models.json.
24
11
  *
25
12
  * @returns The path to use for models.json
26
13
  */
27
14
  export function resolveModelsJsonPath() {
28
- if (existsSync(GSD_MODELS_PATH)) {
29
- return GSD_MODELS_PATH;
30
- }
31
- if (existsSync(PI_MODELS_PATH)) {
32
- return PI_MODELS_PATH;
33
- }
34
15
  return GSD_MODELS_PATH;
35
16
  }
@@ -701,9 +701,8 @@ function collectRelativeFiles(rootDir) {
701
701
  return files;
702
702
  }
703
703
  /**
704
- * Constructs a DefaultResourceLoader that loads extensions from both
705
- * ~/.gsd/agent/extensions/ (GSD's default) and ~/.pi/agent/extensions/ (pi's default).
706
- * This allows users to use extensions from either location.
704
+ * Constructs a DefaultResourceLoader that loads extensions from
705
+ * ~/.gsd/agent/extensions/ (GSD's default) only.
707
706
  */
708
707
  // Cache bundled extension keys at module load — avoids re-scanning the extensions
709
708
  // directory in buildResourceLoader() (already scanned by loader.ts for env var).
@@ -718,19 +717,8 @@ export async function buildResourceLoader(agentDir, options = {}) {
718
717
  const { DefaultResourceLoader } = await loadPiCodingAgentModule();
719
718
  const { sortExtensionPaths } = await import('./extension-sort.js');
720
719
  const registry = loadRegistry();
721
- const piAgentDir = join(homedir(), '.pi', 'agent');
722
- const piExtensionsDir = join(piAgentDir, 'extensions');
723
720
  const bundledKeys = getBundledExtensionKeys();
724
- const piExtensionPaths = discoverExtensionEntryPaths(piExtensionsDir)
725
- .filter((entryPath) => !bundledKeys.has(getExtensionKey(entryPath, piExtensionsDir)))
726
- .filter((entryPath) => {
727
- const manifest = readManifestFromEntryPath(entryPath);
728
- if (!manifest)
729
- return true;
730
- return isExtensionEnabled(registry, manifest.id);
731
- });
732
721
  const additionalExtensionPaths = [
733
- ...piExtensionPaths,
734
722
  ...(options.additionalExtensionPaths ?? []),
735
723
  ];
736
724
  return new DefaultResourceLoader({
@@ -1 +1 @@
1
- 9a23824a70bd2722
1
+ 47400075b94e1392
@@ -470,13 +470,13 @@ key_decisions: []
470
470
 
471
471
  **After a slice completes:**
472
472
  1. Write slice `S##-SUMMARY.md` (compresses all task summaries).
473
- 2. Write slice `S##-UAT.md` — a non-blocking human test script derived from the slice's must-haves and demo sentence. The agent does NOT wait for UAT results.
473
+ 2. Write slice `S##-UAT.md` — a human test script derived from the slice's must-haves and demo sentence.
474
474
  3. Mark the slice checkbox in `M###-ROADMAP.md` as `[x]`.
475
475
  4. Update `STATE.md` with new position.
476
476
  5. Update milestone `M###-SUMMARY.md` with the completed slice's contributions.
477
- 6. Continue to next slice immediately. The user tests the UAT whenever convenient.
478
- 7. If the user reports UAT failures later, create fix tasks in the current or a new slice.
479
- 8. If all slices done → milestone complete.
477
+ 6. Continue to next slice immediately. UAT can run after slice completion; automatic milestone closure requires each slice assessment to record `PASS`.
478
+ 7. If UAT is missing or non-PASS at milestone closeout, run `/gsd dispatch uat`, request a slice-specific UAT rerun when needed, or create remediation work with `/gsd dispatch reassess`.
479
+ 8. If all slices are done and UAT plus milestone validation pass → milestone complete.
480
480
 
481
481
  ---
482
482
 
@@ -605,6 +605,7 @@ Commit types: `feat`, `fix`, `test`, `refactor`, `docs`, `perf`, `chore`
605
605
  |---------|-----|
606
606
  | Bad task | Revert the task commit on the active branch |
607
607
  | Bad milestone squash | Revert the squash commit on the integration branch |
608
+ | UAT missing or non-PASS at closeout | Run `/gsd dispatch uat`, request a slice-specific UAT rerun when needed, or create remediation work with `/gsd dispatch reassess` |
608
609
  | UAT failure after merge | Create follow-up fix tasks in the current or next milestone |
609
610
 
610
611
  ---
@@ -5,9 +5,9 @@
5
5
  * immediately. The LLM can continue working and check results later
6
6
  * with await_job.
7
7
  */
8
- import { getShellConfig, sanitizeCommand, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, } from "@gsd/pi-coding-agent";
8
+ import { getShellConfig, sanitizeCommand, killProcessTree, SIGKILL_GRACE_MS, HARD_DEADLINE_MS, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, } from "@gsd/pi-coding-agent";
9
9
  import { Type } from "@sinclair/typebox";
10
- import { spawn, spawnSync } from "node:child_process";
10
+ import { spawn } from "node:child_process";
11
11
  import { createWriteStream } from "node:fs";
12
12
  import { tmpdir } from "node:os";
13
13
  import { join } from "node:path";
@@ -22,37 +22,6 @@ function getTempFilePath() {
22
22
  const id = randomBytes(8).toString("hex");
23
23
  return join(tmpdir(), `pi-async-bash-${id}.log`);
24
24
  }
25
- /**
26
- * Kill a process and its children (cross-platform).
27
- * Uses process group kill on Unix; taskkill /F /T on Windows.
28
- */
29
- function killTree(pid) {
30
- if (process.platform === "win32") {
31
- try {
32
- spawnSync("taskkill", ["/F", "/T", "/PID", String(pid)], {
33
- timeout: 5_000,
34
- stdio: "ignore",
35
- });
36
- }
37
- catch {
38
- try {
39
- process.kill(pid, "SIGTERM");
40
- }
41
- catch { /* already exited */ }
42
- }
43
- }
44
- else {
45
- try {
46
- process.kill(-pid, "SIGTERM");
47
- }
48
- catch {
49
- try {
50
- process.kill(pid, "SIGTERM");
51
- }
52
- catch { /* already exited */ }
53
- }
54
- }
55
- }
56
25
  export function createAsyncBashTool(getManager, getCwd) {
57
26
  return {
58
27
  name: "async_bash",
@@ -62,7 +31,7 @@ export function createAsyncBashTool(getManager, getCwd) {
62
31
  `Output is truncated to the last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB.`,
63
32
  promptSnippet: "Run a bash command in the background, returning a job ID immediately.",
64
33
  promptGuidelines: [
65
- "Use async_bash for commands that take more than a few seconds (builds, tests, installs, large git operations).",
34
+ "Use async_bash for long-running builds, tests, installs, or operations that should run in the background so you can continue other work (the job ID lets you await_job later). Sync bash is uncapped — use async_bash when you want non-blocking behavior, not because of a timeout concern.",
66
35
  "After starting async jobs, continue with other work and use await_job when you need the results.",
67
36
  "await_job has a configurable timeout (default 120s) to prevent indefinite blocking — if it times out, jobs keep running and you can check again later.",
68
37
  "For long-running processes (SSH, deploys, training) that may take minutes+, prefer async_bash with periodic await_job polling over a single long await.",
@@ -122,36 +91,25 @@ function executeBashInBackground(command, cwd, signal, timeout) {
122
91
  });
123
92
  let timedOut = false;
124
93
  let timeoutHandle;
125
- let sigkillHandle;
126
94
  let hardDeadlineHandle;
127
- /** Grace period (ms) between SIGTERM and SIGKILL. */
128
- const SIGKILL_GRACE_MS = 5_000;
129
- /** Hard deadline (ms) after SIGKILL to force-resolve the promise. */
130
- const HARD_DEADLINE_MS = 3_000;
131
95
  if (timeout !== undefined && timeout > 0) {
132
96
  timeoutHandle = setTimeout(() => {
133
97
  timedOut = true;
98
+ // killProcessTree owns the SIGTERM -> grace -> SIGKILL escalation, so a
99
+ // SIGTERM-immune child is actually force-killed rather than left running.
134
100
  if (child.pid)
135
- killTree(child.pid);
136
- // If the process ignores SIGTERM, escalate to SIGKILL
137
- sigkillHandle = setTimeout(() => {
138
- if (child.pid) {
139
- // killTree already uses taskkill /F /T on Windows
140
- killTree(child.pid);
141
- }
142
- // Hard deadline: if even SIGKILL doesn't trigger 'close',
143
- // force-resolve so the job doesn't hang forever (#2186).
144
- hardDeadlineHandle = setTimeout(() => {
145
- const output = Buffer.concat(chunks).toString("utf-8");
146
- safeResolve(output
147
- ? `${output}\n\nCommand timed out after ${timeout} seconds (force-killed)`
148
- : `Command timed out after ${timeout} seconds (force-killed)`);
149
- }, HARD_DEADLINE_MS);
150
- if (typeof hardDeadlineHandle === "object" && "unref" in hardDeadlineHandle)
151
- hardDeadlineHandle.unref();
152
- }, SIGKILL_GRACE_MS);
153
- if (typeof sigkillHandle === "object" && "unref" in sigkillHandle)
154
- sigkillHandle.unref();
101
+ killProcessTree(child.pid);
102
+ // Hard deadline: a D-state (uninterruptible-I/O) child never emits 'close'
103
+ // even after SIGKILL, so force-resolve the promise rather than hang (#2186).
104
+ // Fires after the full grace window so SIGKILL has had its chance first.
105
+ hardDeadlineHandle = setTimeout(() => {
106
+ const output = Buffer.concat(chunks).toString("utf-8");
107
+ safeResolve(output
108
+ ? `${output}\n\nCommand timed out after ${timeout} seconds (force-killed)`
109
+ : `Command timed out after ${timeout} seconds (force-killed)`);
110
+ }, SIGKILL_GRACE_MS + HARD_DEADLINE_MS);
111
+ if (typeof hardDeadlineHandle === "object" && "unref" in hardDeadlineHandle)
112
+ hardDeadlineHandle.unref();
155
113
  }, timeout * 1000);
156
114
  }
157
115
  const chunks = [];
@@ -182,7 +140,19 @@ function executeBashInBackground(command, cwd, signal, timeout) {
182
140
  child.stderr.on("data", onData);
183
141
  const onAbort = () => {
184
142
  if (child.pid)
185
- killTree(child.pid);
143
+ killProcessTree(child.pid);
144
+ // Arm the same hard-deadline force-resolve the timeout path uses, so a
145
+ // cancelled D-state child (never emits 'close' even after SIGKILL) can't
146
+ // hang the job promise forever. safeResolve is idempotent, so the real
147
+ // 'close' still wins if the child does exit.
148
+ if (!hardDeadlineHandle) {
149
+ hardDeadlineHandle = setTimeout(() => {
150
+ const output = Buffer.concat(chunks).toString("utf-8");
151
+ safeResolve(output ? `${output}\n\nCommand aborted (force-killed)` : "Command aborted (force-killed)");
152
+ }, SIGKILL_GRACE_MS + HARD_DEADLINE_MS);
153
+ if (typeof hardDeadlineHandle === "object" && "unref" in hardDeadlineHandle)
154
+ hardDeadlineHandle.unref();
155
+ }
186
156
  };
187
157
  if (signal.aborted) {
188
158
  onAbort();
@@ -193,8 +163,6 @@ function executeBashInBackground(command, cwd, signal, timeout) {
193
163
  child.on("error", (err) => {
194
164
  if (timeoutHandle)
195
165
  clearTimeout(timeoutHandle);
196
- if (sigkillHandle)
197
- clearTimeout(sigkillHandle);
198
166
  if (hardDeadlineHandle)
199
167
  clearTimeout(hardDeadlineHandle);
200
168
  signal.removeEventListener("abort", onAbort);
@@ -203,8 +171,6 @@ function executeBashInBackground(command, cwd, signal, timeout) {
203
171
  child.on("close", (code) => {
204
172
  if (timeoutHandle)
205
173
  clearTimeout(timeoutHandle);
206
- if (sigkillHandle)
207
- clearTimeout(sigkillHandle);
208
174
  if (hardDeadlineHandle)
209
175
  clearTimeout(hardDeadlineHandle);
210
176
  signal.removeEventListener("abort", onAbort);
@@ -21,7 +21,7 @@ export function createAwaitTool(getManager) {
21
21
  label: "Await Background Job",
22
22
  description: "Wait for background jobs to complete. Provide specific job IDs or omit to wait for the next job that finishes. Returns results of completed jobs.",
23
23
  parameters: schema,
24
- async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
24
+ async execute(_toolCallId, params, signal, _onUpdate, _ctx) {
25
25
  const manager = getManager();
26
26
  const { jobs: jobIds, timeout } = params;
27
27
  const timeoutMs = ((timeout ?? DEFAULT_TIMEOUT_SECONDS) * 1000);
@@ -54,37 +54,75 @@ export function createAwaitTool(getManager) {
54
54
  };
55
55
  }
56
56
  }
57
- // Suppress follow-up notifications for all watched jobs upfront.
57
+ // If all watched jobs are already done, suppress follow-up and return immediately.
58
58
  // suppressFollowUp() cancels the pending delivery timer (if any), which
59
59
  // handles both the within-turn case (job completes while we await) and
60
60
  // the cross-turn case (job already completed before await_job was called).
61
61
  // Previously this only set j.awaited = true, which missed the cross-turn
62
62
  // case because the queueMicrotask had already fired (#3787).
63
- for (const j of watched)
64
- manager.suppressFollowUp(j.id);
65
- // If all watched jobs are already done, return immediately
66
63
  const running = watched.filter((j) => j.status === "running");
67
64
  if (running.length === 0) {
68
- const result = formatResults(watched);
69
- return { content: [{ type: "text", text: result }], details: undefined };
65
+ for (const j of watched)
66
+ manager.suppressFollowUp(j.id);
67
+ return { content: [{ type: "text", text: renderCompleted(watched) }], details: undefined };
70
68
  }
71
- // Wait for at least one to complete, or timeout
69
+ // Wait for at least one to complete, timeout, or abort signal
72
70
  const TIMEOUT_SENTINEL = Symbol("timeout");
71
+ const ABORT_SENTINEL = Symbol("abort");
72
+ // The race timer and abort listener are explicitly torn down once the race
73
+ // settles (below) so a completion- or timeout-won race never leaks a pending
74
+ // timer or a lingering abort listener — the listener holds a closure over the
75
+ // race resolver, so { once: true } alone (which only detaches on fire) is not
76
+ // enough when ESC never happens.
77
+ let raceTimer;
78
+ let abortListener;
73
79
  const timeoutPromise = new Promise((resolve) => {
74
- const timer = setTimeout(() => resolve(TIMEOUT_SENTINEL), timeoutMs);
80
+ raceTimer = setTimeout(() => resolve(TIMEOUT_SENTINEL), timeoutMs);
75
81
  // Allow the process to exit even if the timer is pending
76
- if (typeof timer === "object" && "unref" in timer)
77
- timer.unref();
82
+ if (typeof raceTimer === "object" && "unref" in raceTimer)
83
+ raceTimer.unref();
84
+ });
85
+ const abortPromise = new Promise((resolve) => {
86
+ if (!signal || signal.aborted) {
87
+ resolve(ABORT_SENTINEL);
88
+ }
89
+ else {
90
+ abortListener = () => resolve(ABORT_SENTINEL);
91
+ signal.addEventListener("abort", abortListener, { once: true });
92
+ }
78
93
  });
79
94
  const raceResult = await Promise.race([
80
95
  Promise.race(running.map((j) => j.promise)).then(() => "completed"),
81
96
  timeoutPromise,
97
+ abortPromise,
82
98
  ]);
99
+ // Tear down race resources now that a winner is decided.
100
+ if (raceTimer)
101
+ clearTimeout(raceTimer);
102
+ if (abortListener && signal)
103
+ signal.removeEventListener("abort", abortListener);
104
+ const aborted = raceResult === ABORT_SENTINEL;
83
105
  const timedOut = raceResult === TIMEOUT_SENTINEL;
84
106
  // Collect all completed results (more may have finished while waiting)
85
107
  const completed = watched.filter((j) => j.status !== "running");
86
108
  const stillRunning = watched.filter((j) => j.status === "running");
87
- let result = formatResults(completed);
109
+ // Suppress follow-up ONLY for completed jobs — leave stillRunning unsuppressed
110
+ // so deliverResult/onJobComplete can resurface their results later.
111
+ for (const j of completed)
112
+ manager.suppressFollowUp(j.id);
113
+ if (aborted) {
114
+ // ESC ended the wait, not the jobs: still-running jobs keep going and
115
+ // resurface via onJobComplete (they were deliberately not suppressed above).
116
+ const runningDesc = stillRunning.map((j) => `${j.id} (${j.label})`).join(", ");
117
+ const interrupt = stillRunning.length > 0
118
+ ? `Wait interrupted. Still running: ${runningDesc} — results will surface when complete.`
119
+ : "Wait interrupted.";
120
+ const text = completed.length > 0
121
+ ? `${renderCompleted(completed)}\n\n${interrupt}`
122
+ : interrupt;
123
+ return { content: [{ type: "text", text }], details: undefined };
124
+ }
125
+ let result = renderCompleted(completed);
88
126
  if (stillRunning.length > 0) {
89
127
  result += `\n\n**Still running:** ${stillRunning.map((j) => `${j.id} (${j.label})`).join(", ")}`;
90
128
  }
@@ -97,6 +135,36 @@ export function createAwaitTool(getManager) {
97
135
  },
98
136
  };
99
137
  }
138
+ /**
139
+ * Render completed jobs for the await_job result, de-duplicating against
140
+ * follow-ups that have already been delivered to context.
141
+ *
142
+ * A job's follow-up fires ~immediately (setTimeout(0)) once it settles, so when
143
+ * await_job runs in a LATER turn the result is already in context. Reprinting it
144
+ * inline produces the same output twice. Jobs already `delivered` are therefore
145
+ * acknowledged on a single line instead of having their full output reprinted;
146
+ * not-yet-delivered jobs (the within-turn case, where suppressFollowUp won the
147
+ * race) are rendered in full as before.
148
+ */
149
+ function renderCompleted(jobs) {
150
+ if (jobs.length === 0)
151
+ return "No completed jobs.";
152
+ const fresh = jobs.filter((j) => !j.delivered);
153
+ const alreadyDelivered = jobs.filter((j) => j.delivered);
154
+ const sections = [];
155
+ if (fresh.length > 0)
156
+ sections.push(formatResults(fresh));
157
+ if (alreadyDelivered.length > 0) {
158
+ const names = alreadyDelivered
159
+ .map((j) => `${j.id} (${j.label})`)
160
+ .join(", ");
161
+ const sentence = alreadyDelivered.length === 1
162
+ ? `This job already finished and its result was shown above when it completed, so there is nothing new to report: ${names}.`
163
+ : `These jobs already finished and their results were shown above when they completed, so there is nothing new to report: ${names}.`;
164
+ sections.push(sentence);
165
+ }
166
+ return sections.join("\n\n");
167
+ }
100
168
  function formatResults(jobs) {
101
169
  if (jobs.length === 0)
102
170
  return "No completed jobs.";