@opengsd/gsd-pi 1.2.0-dev.0b870afa → 1.2.0-dev.23d85b63

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 (579) 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.js +14 -19
  4. package/dist/headless-events.d.ts +16 -1
  5. package/dist/headless-events.js +19 -2
  6. package/dist/headless.js +8 -1
  7. package/dist/loader.js +6 -4
  8. package/dist/onboarding.js +9 -4
  9. package/dist/provider-migrations.d.ts +23 -0
  10. package/dist/provider-migrations.js +41 -0
  11. package/dist/register-agent-bundles.d.ts +11 -2
  12. package/dist/register-agent-bundles.js +18 -4
  13. package/dist/resource-loader.d.ts +10 -5
  14. package/dist/resource-loader.js +121 -6
  15. package/dist/resources/.managed-resources-content-hash +1 -1
  16. package/dist/resources/extensions/ask-user-questions.js +3 -2
  17. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  18. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  19. package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
  20. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  21. package/dist/resources/extensions/gsd/auto/dispatch-history.js +21 -6
  22. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  23. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  24. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  25. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  26. package/dist/resources/extensions/gsd/auto/orchestrator.js +119 -18
  27. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  28. package/dist/resources/extensions/gsd/auto/phases.js +17 -2372
  29. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +542 -0
  30. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  31. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  33. package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
  34. package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +19 -1
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +9 -6
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +12 -8
  39. package/dist/resources/extensions/gsd/auto-prompts.js +5 -1
  40. package/dist/resources/extensions/gsd/auto-recovery.js +52 -6
  41. package/dist/resources/extensions/gsd/auto-start.js +28 -7
  42. package/dist/resources/extensions/gsd/auto-worktree.js +48 -3
  43. package/dist/resources/extensions/gsd/auto.js +83 -19
  44. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +4 -2
  45. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
  46. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -1
  47. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +32 -3
  48. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +56 -16
  49. package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
  50. package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -8
  51. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  52. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  53. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +8 -0
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  55. package/dist/resources/extensions/gsd/config-overlay.js +11 -8
  56. package/dist/resources/extensions/gsd/db/engine.js +24 -6
  57. package/dist/resources/extensions/gsd/db/queries.js +30 -0
  58. package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
  59. package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
  60. package/dist/resources/extensions/gsd/db-transaction.js +27 -23
  61. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  62. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  63. package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
  64. package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
  65. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +11 -9
  66. package/dist/resources/extensions/gsd/gsd-db.js +15 -20
  67. package/dist/resources/extensions/gsd/guided-flow.js +88 -2
  68. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  69. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  70. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  71. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  72. package/dist/resources/extensions/gsd/notifications.js +12 -7
  73. package/dist/resources/extensions/gsd/preferences-models.js +17 -9
  74. package/dist/resources/extensions/gsd/preferences.js +91 -5
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +6 -2
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +7 -2
  78. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -1
  81. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  83. package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
  84. package/dist/resources/extensions/gsd/session-lock.js +4 -3
  85. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  86. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +13 -6
  87. package/dist/resources/extensions/gsd/state.js +6 -2
  88. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  89. package/dist/resources/extensions/gsd/tools/complete-task.js +62 -0
  90. package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
  91. package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
  92. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  93. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  94. package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
  95. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  96. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  97. package/dist/resources/extensions/gsd/worktree-manager.js +101 -2
  98. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  99. package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
  100. package/dist/resources/extensions/gsd/worktree.js +8 -1
  101. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  102. package/dist/resources/extensions/search-the-web/index.js +41 -9
  103. package/dist/resources/extensions/search-the-web/native-search.js +18 -4
  104. package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
  105. package/dist/resources/extensions/subagent/index.js +20 -15
  106. package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
  107. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  108. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  109. package/dist/runtime-checks.d.ts +10 -0
  110. package/dist/runtime-checks.js +27 -0
  111. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  112. package/dist/web/standalone/.next/BUILD_ID +1 -1
  113. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  114. package/dist/web/standalone/.next/build-manifest.json +2 -2
  115. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  116. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/index.html +1 -1
  167. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  174. package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
  175. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  176. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  178. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  179. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  180. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  181. package/package.json +4 -4
  182. package/packages/cloud-mcp-gateway/package.json +2 -2
  183. package/packages/contracts/package.json +1 -1
  184. package/packages/daemon/package.json +4 -4
  185. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  186. package/packages/gsd-agent-core/dist/sdk.js +12 -6
  187. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  188. package/packages/gsd-agent-core/package.json +5 -5
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
  192. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
  194. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
  196. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  197. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
  198. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
  200. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
  202. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
  204. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  205. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
  206. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  207. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
  208. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  209. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
  211. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
  212. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
  213. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
  214. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
  215. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
  216. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
  217. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
  218. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
  219. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
  220. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
  221. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
  222. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
  223. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
  224. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  225. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
  226. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  227. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  228. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  229. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +11 -0
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +85 -19
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +71 -3
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +257 -37
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
  244. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
  246. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -10
  250. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
  252. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +5 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  261. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
  262. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  263. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
  264. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  265. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  267. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
  268. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  269. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
  271. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
  273. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
  275. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
  277. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  278. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  279. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +10 -2
  280. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  281. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +48 -6
  282. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  283. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  284. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  285. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  286. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
  288. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -0
  291. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  292. package/packages/gsd-agent-modes/package.json +7 -7
  293. package/packages/mcp-server/README.md +12 -3
  294. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  295. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  296. package/packages/mcp-server/dist/cli-runner.js +137 -0
  297. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  298. package/packages/mcp-server/dist/cli.js +2 -58
  299. package/packages/mcp-server/dist/cli.js.map +1 -1
  300. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  301. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  302. package/packages/mcp-server/dist/pid-registry.js +459 -0
  303. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  304. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  305. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  306. package/packages/mcp-server/dist/probe-mode.js +10 -0
  307. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  308. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  309. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  310. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  311. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  312. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  313. package/packages/mcp-server/dist/workflow-tools.js +62 -43
  314. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  315. package/packages/mcp-server/package.json +5 -5
  316. package/packages/native/package.json +1 -1
  317. package/packages/pi-agent-core/dist/agent-loop.js +52 -2
  318. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  319. package/packages/pi-agent-core/package.json +1 -1
  320. package/packages/pi-ai/package.json +1 -1
  321. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
  322. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  325. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
  328. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
  330. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  332. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  334. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  336. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  337. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  340. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  341. package/packages/pi-coding-agent/package.json +8 -8
  342. package/packages/pi-tui/README.md +15 -0
  343. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  344. package/packages/pi-tui/dist/autocomplete.js +6 -1
  345. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  346. package/packages/pi-tui/dist/components/input.js +1 -1
  347. package/packages/pi-tui/dist/components/input.js.map +1 -1
  348. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  349. package/packages/pi-tui/dist/components/loader.js +1 -0
  350. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  351. package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/components/select-list.js +8 -2
  353. package/packages/pi-tui/dist/components/select-list.js.map +1 -1
  354. package/packages/pi-tui/dist/index.d.ts +2 -2
  355. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  356. package/packages/pi-tui/dist/index.js +2 -2
  357. package/packages/pi-tui/dist/index.js.map +1 -1
  358. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  359. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  360. package/packages/pi-tui/dist/terminal-image.js +54 -2
  361. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  362. package/packages/pi-tui/dist/terminal.d.ts +12 -0
  363. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  364. package/packages/pi-tui/dist/terminal.js +70 -25
  365. package/packages/pi-tui/dist/terminal.js.map +1 -1
  366. package/packages/pi-tui/dist/tui.d.ts +15 -0
  367. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  368. package/packages/pi-tui/dist/tui.js +106 -21
  369. package/packages/pi-tui/dist/tui.js.map +1 -1
  370. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/utils.js +110 -36
  372. package/packages/pi-tui/dist/utils.js.map +1 -1
  373. package/packages/pi-tui/package.json +2 -2
  374. package/packages/rpc-client/package.json +2 -2
  375. package/pkg/dist/theme/theme.d.ts.map +1 -1
  376. package/pkg/dist/theme/theme.js +45 -17
  377. package/pkg/dist/theme/theme.js.map +1 -1
  378. package/pkg/package.json +1 -1
  379. package/src/resources/extensions/ask-user-questions.ts +7 -2
  380. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
  381. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  382. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  383. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  384. package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
  385. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  386. package/src/resources/extensions/gsd/auto/dispatch-history.ts +22 -6
  387. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  388. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  389. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  390. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  391. package/src/resources/extensions/gsd/auto/orchestrator.ts +140 -18
  392. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  393. package/src/resources/extensions/gsd/auto/phases.ts +58 -3061
  394. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +716 -0
  395. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  396. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  397. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  398. package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
  399. package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
  400. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  401. package/src/resources/extensions/gsd/auto-dispatch.ts +24 -2
  402. package/src/resources/extensions/gsd/auto-model-selection.ts +20 -5
  403. package/src/resources/extensions/gsd/auto-post-unit.ts +16 -9
  404. package/src/resources/extensions/gsd/auto-prompts.ts +5 -1
  405. package/src/resources/extensions/gsd/auto-recovery.ts +62 -8
  406. package/src/resources/extensions/gsd/auto-start.ts +44 -7
  407. package/src/resources/extensions/gsd/auto-worktree.ts +51 -3
  408. package/src/resources/extensions/gsd/auto.ts +118 -18
  409. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +6 -2
  410. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
  411. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -1
  412. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +36 -3
  413. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +69 -16
  414. package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
  415. package/src/resources/extensions/gsd/commands/handlers/core.ts +27 -8
  416. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -2
  417. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  418. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +7 -0
  419. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  420. package/src/resources/extensions/gsd/config-overlay.ts +22 -9
  421. package/src/resources/extensions/gsd/db/engine.ts +26 -6
  422. package/src/resources/extensions/gsd/db/queries.ts +29 -0
  423. package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
  424. package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
  425. package/src/resources/extensions/gsd/db-transaction.ts +37 -20
  426. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  427. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  428. package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -1
  429. package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
  430. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -10
  431. package/src/resources/extensions/gsd/gsd-db.ts +15 -19
  432. package/src/resources/extensions/gsd/guided-flow.ts +128 -2
  433. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  434. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  435. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  436. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  437. package/src/resources/extensions/gsd/notifications.ts +13 -6
  438. package/src/resources/extensions/gsd/preferences-models.ts +26 -8
  439. package/src/resources/extensions/gsd/preferences.ts +111 -5
  440. package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  441. package/src/resources/extensions/gsd/prompts/complete-slice.md +6 -2
  442. package/src/resources/extensions/gsd/prompts/execute-task.md +7 -2
  443. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  444. package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  445. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -1
  446. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  448. package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
  449. package/src/resources/extensions/gsd/session-lock.ts +8 -7
  450. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  451. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +23 -10
  452. package/src/resources/extensions/gsd/state.ts +7 -1
  453. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  454. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
  456. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
  457. package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
  458. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  459. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
  460. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +16 -1
  461. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +89 -22
  462. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +97 -4
  464. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  465. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  466. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  467. package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
  468. package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
  469. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
  470. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  471. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
  472. package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
  473. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
  474. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
  475. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  476. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
  477. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
  478. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  479. package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
  480. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
  481. package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
  482. package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
  483. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  484. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
  485. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  486. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  487. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
  488. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
  489. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +19 -0
  490. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +16 -0
  491. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
  492. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  493. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  494. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
  495. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
  496. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  497. package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
  498. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  499. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  500. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  501. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  503. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  504. package/src/resources/extensions/gsd/tests/model-router.test.ts +139 -0
  505. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  506. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
  507. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
  508. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +335 -0
  509. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  510. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -0
  511. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  512. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +1 -1
  513. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  514. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
  515. package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
  516. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
  517. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -2
  518. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
  519. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  520. package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
  521. package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
  522. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
  523. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
  524. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  525. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
  526. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -1
  527. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
  528. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
  529. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  530. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  531. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  532. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +17 -1
  533. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  534. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  535. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
  536. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
  537. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  538. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
  539. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
  540. package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
  541. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  542. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  543. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  544. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  545. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  546. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  547. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +36 -0
  548. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  549. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  550. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  551. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  552. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
  553. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  554. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  555. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  556. package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
  557. package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
  558. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  559. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  560. package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
  561. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  562. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  563. package/src/resources/extensions/gsd/worktree-manager.ts +97 -2
  564. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  565. package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
  566. package/src/resources/extensions/gsd/worktree.ts +7 -1
  567. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  568. package/src/resources/extensions/search-the-web/index.ts +45 -9
  569. package/src/resources/extensions/search-the-web/native-search.ts +16 -4
  570. package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
  571. package/src/resources/extensions/subagent/index.ts +20 -15
  572. package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
  573. package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
  574. package/src/resources/skills/create-skill/SKILL.md +3 -0
  575. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  576. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  577. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  578. /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_buildManifest.js +0 -0
  579. /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_ssgManifest.js +0 -0
@@ -0,0 +1,207 @@
1
+ // gsd-pi — DB engine failure-branch log coverage.
2
+ //
3
+ // `checkpointDatabase` / `closeDatabase` / `vacuumDatabase` in db/engine.ts are
4
+ // the highest-frequency runtime paths (called every turn and at closeout).
5
+ // Each wraps its destructive PRAGMA in a try/catch that emits a `db` warning so
6
+ // a failed checkpoint/vacuum/close never breaks orchestration but is still
7
+ // observable. The existing gsd-db tests only assert the *happy* path (WAL gets
8
+ // truncated); no test exercises any of these catch branches, so a regression
9
+ // that drops or misroutes the warning would pass silently.
10
+ //
11
+ // This file pins the log output for the three checkpoint/vacuum/close failure
12
+ // branches by stubbing the live adapter's `exec`/`close` to throw on demand.
13
+
14
+ import { test } from "node:test";
15
+ import assert from "node:assert/strict";
16
+ import { chmodSync as fsChmodSync, mkdtempSync, mkdirSync, rmSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { tmpdir } from "node:os";
19
+
20
+ import { checkpointDatabase, closeDatabase, openDatabase, vacuumDatabase, _getAdapter } from "../gsd-db.ts";
21
+ import { backupDatabaseSnapshot, readTransaction } from "../db/engine.ts";
22
+ import {
23
+ drainLogs,
24
+ peekLogs,
25
+ setStderrLoggingEnabled,
26
+ _resetLogs,
27
+ type LogEntry,
28
+ } from "../workflow-logger.ts";
29
+ import type { DbAdapter } from "../db-adapter.ts";
30
+
31
+ function makeBase(): string {
32
+ const dir = mkdtempSync(join(tmpdir(), "gsd-db-engine-logs-"));
33
+ mkdirSync(join(dir, ".gsd"), { recursive: true });
34
+ return dir;
35
+ }
36
+
37
+ /** Capture log entries emitted while running fn. Stderr is suppressed. */
38
+ function captureLogs<T>(fn: () => T): { result: T; logs: LogEntry[] } {
39
+ const previous = setStderrLoggingEnabled(false);
40
+ _resetLogs();
41
+ try {
42
+ const result = fn();
43
+ return { result, logs: drainLogs() };
44
+ } finally {
45
+ _resetLogs();
46
+ setStderrLoggingEnabled(previous);
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Wrap the live adapter's `exec` so it throws for SQL matching `needle`,
52
+ * delegating everything else to the original. Returns a restore function.
53
+ */
54
+ function breakExecOn(adapter: DbAdapter, needle: string): () => void {
55
+ const origExec = adapter.exec.bind(adapter);
56
+ adapter.exec = (sql: string): void => {
57
+ if (sql.includes(needle)) throw new Error(`forced failure for: ${needle}`);
58
+ return origExec(sql);
59
+ };
60
+ return () => {
61
+ adapter.exec = origExec;
62
+ };
63
+ }
64
+
65
+ test("checkpointDatabase logs a `db` warning when the WAL checkpoint throws", () => {
66
+ const base = makeBase();
67
+ assert.equal(openDatabase(join(base, ".gsd", "gsd.db")), true);
68
+ try {
69
+ const adapter = _getAdapter();
70
+ assert.ok(adapter, "an adapter must be open");
71
+ const restore = breakExecOn(adapter!, "wal_checkpoint");
72
+
73
+ const { logs } = captureLogs(() => checkpointDatabase());
74
+ restore();
75
+
76
+ const dbWarn = logs.find((e) => e.component === "db" && e.severity === "warn");
77
+ assert.ok(dbWarn, "a db warning must be logged on checkpoint failure");
78
+ assert.match(dbWarn!.message, /WAL checkpoint failed/u);
79
+ assert.match(dbWarn!.message, /forced failure for: wal_checkpoint/u);
80
+ // checkpointDatabase must not rethrow — orchestration continues.
81
+ } finally {
82
+ closeDatabase();
83
+ rmSync(base, { recursive: true, force: true });
84
+ }
85
+ });
86
+
87
+ test("vacuumDatabase logs a `db` warning when VACUUM throws", () => {
88
+ const base = makeBase();
89
+ assert.equal(openDatabase(join(base, ".gsd", "gsd.db")), true);
90
+ try {
91
+ const adapter = _getAdapter();
92
+ assert.ok(adapter);
93
+ const restore = breakExecOn(adapter!, "VACUUM");
94
+
95
+ const { logs } = captureLogs(() => vacuumDatabase());
96
+ restore();
97
+
98
+ const dbWarn = logs.find((e) => e.component === "db" && e.severity === "warn");
99
+ assert.ok(dbWarn, "a db warning must be logged on VACUUM failure");
100
+ assert.match(dbWarn!.message, /VACUUM failed/u);
101
+ } finally {
102
+ closeDatabase();
103
+ rmSync(base, { recursive: true, force: true });
104
+ }
105
+ });
106
+
107
+ test("closeDatabase logs `db` warnings when WAL checkpoint and close throw on teardown", () => {
108
+ const base = makeBase();
109
+ assert.equal(openDatabase(join(base, ".gsd", "gsd.db")), true);
110
+ const adapter = _getAdapter();
111
+ assert.ok(adapter);
112
+ // Break both the WAL checkpoint and the final close. The incremental_vacuum
113
+ // pragma is left intact so we can assert the checkpoint/close warnings land
114
+ // without the teardown itself exploding mid-way.
115
+ const restoreExec = breakExecOn(adapter!, "wal_checkpoint");
116
+ const origClose = adapter!.close.bind(adapter!);
117
+ adapter!.close = (): void => {
118
+ throw new Error("forced close failure");
119
+ };
120
+
121
+ const { logs } = captureLogs(() => closeDatabase());
122
+ restoreExec();
123
+ adapter!.close = origClose;
124
+
125
+ try {
126
+ const messages = logs.filter((e) => e.component === "db").map((e) => e.message);
127
+ assert.ok(
128
+ messages.some((m) => /WAL checkpoint failed/u.test(m)),
129
+ "WAL checkpoint failure must be logged during close",
130
+ );
131
+ assert.ok(
132
+ messages.some((m) => /database close failed/u.test(m)),
133
+ "close failure must be logged during close",
134
+ );
135
+ // closeDatabase must fully reset engine state even when teardown steps throw.
136
+ assert.equal(_getAdapter(), null, "engine must release the adapter after a broken close");
137
+ } finally {
138
+ closeDatabase();
139
+ rmSync(base, { recursive: true, force: true });
140
+ }
141
+ });
142
+
143
+ test("checkpointDatabase and vacuumDatabase are no-ops (and log nothing) when no DB is open", () => {
144
+ _resetLogs();
145
+ const previous = setStderrLoggingEnabled(false);
146
+ try {
147
+ checkpointDatabase();
148
+ vacuumDatabase();
149
+ assert.equal(peekLogs().length, 0, "no-db paths must not emit any logs");
150
+ } finally {
151
+ setStderrLoggingEnabled(previous);
152
+ _resetLogs();
153
+ }
154
+ });
155
+
156
+ test("readTransaction logs a db error when ROLLBACK fails after a read error (split-brain signal)", () => {
157
+ const base = makeBase();
158
+ assert.equal(openDatabase(join(base, ".gsd", "gsd.db")), true);
159
+ const adapter = _getAdapter();
160
+ assert.ok(adapter);
161
+ // Make ROLLBACK throw so the read-failure path invokes the rollback-error
162
+ // callback (engine.ts:768-775), which logs the split-brain error.
163
+ const restore = breakExecOn(adapter!, "ROLLBACK");
164
+
165
+ const { logs } = captureLogs(() => {
166
+ assert.throws(
167
+ () => readTransaction(() => {
168
+ throw new Error("read body failed");
169
+ }),
170
+ /read body failed/u,
171
+ "the original read error must still propagate",
172
+ );
173
+ });
174
+ restore();
175
+ closeDatabase();
176
+ try {
177
+ const err = logs.find((e) => e.component === "db" && e.severity === "error");
178
+ assert.ok(err, "a db error must be logged when ROLLBACK fails");
179
+ assert.equal(err!.message, "snapshotState ROLLBACK failed");
180
+ assert.match(err!.context?.error ?? "", /forced failure for: ROLLBACK/u);
181
+ } finally {
182
+ rmSync(base, { recursive: true, force: true });
183
+ }
184
+ });
185
+
186
+ test("backupDatabaseSnapshot logs a db warning when the snapshot copy fails", () => {
187
+ const base = makeBase();
188
+ const dbPath = join(base, ".gsd", "gsd.db");
189
+ assert.equal(openDatabase(dbPath), true);
190
+ // Make the snapshot destination's parent dir read-only so the copy step
191
+ // inside backupDatabaseSnapshot (mkdirSync(backups) + copyFileSync) fails —
192
+ // exercising the outer catch (engine.ts:726-728). The DB handle stays open,
193
+ // so currentPath is set and the read-only parent only blocks the new copy.
194
+ fsChmodSync(join(base, ".gsd"), 0o555);
195
+
196
+ const { result, logs } = captureLogs(() => backupDatabaseSnapshot("test-label"));
197
+ closeDatabase();
198
+ try {
199
+ assert.equal(result, null, "a failed snapshot must return null");
200
+ const warn = logs.find((e) => e.component === "db" && e.severity === "warn");
201
+ assert.ok(warn, "a db warning must be logged on snapshot failure");
202
+ assert.match(warn!.message, /database snapshot failed/u);
203
+ } finally {
204
+ fsChmodSync(join(base, ".gsd"), 0o755);
205
+ rmSync(base, { recursive: true, force: true });
206
+ }
207
+ });
@@ -3,16 +3,22 @@
3
3
 
4
4
  import { describe, test } from "node:test";
5
5
  import assert from "node:assert/strict";
6
- import { backupDatabaseBeforeMigration } from "../db-migration-backup.ts";
6
+ import { MigrationBackupError, backupDatabaseBeforeMigration } from "../db-migration-backup.ts";
7
7
  import type { DbAdapter, DbStatement } from "../db-adapter.ts";
8
8
 
9
9
  class FakeStatement implements DbStatement {
10
+ private readonly row: Record<string, unknown> | undefined;
11
+
12
+ constructor(row: Record<string, unknown> | undefined = undefined) {
13
+ this.row = row;
14
+ }
15
+
10
16
  run(): unknown {
11
17
  return undefined;
12
18
  }
13
19
 
14
20
  get(): Record<string, unknown> | undefined {
15
- return undefined;
21
+ return this.row;
16
22
  }
17
23
 
18
24
  all(): Record<string, unknown>[] {
@@ -22,15 +28,19 @@ class FakeStatement implements DbStatement {
22
28
 
23
29
  class FakeAdapter implements DbAdapter {
24
30
  readonly execCalls: string[] = [];
31
+ readonly prepareCalls: string[] = [];
25
32
  failCheckpoint = false;
33
+ checkpointRow: Record<string, unknown> = { busy: 0, log: 0, checkpointed: 0 };
26
34
 
27
35
  exec(sql: string): void {
28
36
  this.execCalls.push(sql);
29
37
  if (this.failCheckpoint) throw new Error("checkpoint failed");
30
38
  }
31
39
 
32
- prepare(): DbStatement {
33
- return new FakeStatement();
40
+ prepare(sql: string): DbStatement {
41
+ this.prepareCalls.push(sql);
42
+ if (this.failCheckpoint) throw new Error("checkpoint failed");
43
+ return new FakeStatement(this.checkpointRow);
34
44
  }
35
45
 
36
46
  close(): void {}
@@ -73,32 +83,71 @@ describe("db-migration-backup", () => {
73
83
  logWarning: () => assert.fail("should not warn"),
74
84
  });
75
85
 
76
- assert.deepEqual(db.execCalls, ["PRAGMA wal_checkpoint(TRUNCATE)"]);
86
+ assert.deepEqual(db.prepareCalls, ["PRAGMA wal_checkpoint(TRUNCATE)"]);
77
87
  assert.deepEqual(copies, [["/tmp/gsd.db", "/tmp/gsd.db.backup-v12"]]);
78
88
  });
79
89
 
80
- test("continues copying when checkpoint fails and warns when copy fails", () => {
90
+ test("throws and skips copying when checkpoint fails", () => {
81
91
  const db = new FakeAdapter();
82
92
  db.failCheckpoint = true;
83
93
  const copies: Array<[string, string]> = [];
84
94
  const warnings: string[] = [];
85
95
 
86
- backupDatabaseBeforeMigration(db, "/tmp/gsd.db", 12, {
87
- existsSync: (path) => path === "/tmp/gsd.db",
88
- copyFileSync: (src, dest) => copies.push([src, dest]),
89
- logWarning: (_scope, message) => warnings.push(message),
90
- });
96
+ assert.throws(
97
+ () =>
98
+ backupDatabaseBeforeMigration(db, "/tmp/gsd.db", 12, {
99
+ existsSync: (path) => path === "/tmp/gsd.db",
100
+ copyFileSync: (src, dest) => copies.push([src, dest]),
101
+ logWarning: (_scope, message) => warnings.push(message),
102
+ }),
103
+ /checkpoint failed/,
104
+ );
105
+
106
+ assert.deepEqual(db.prepareCalls, ["PRAGMA wal_checkpoint(TRUNCATE)"]);
107
+ assert.deepEqual(copies, []);
108
+ assert.equal(warnings.length, 1);
109
+ assert.match(warnings[0], /Pre-migration backup failed: checkpoint failed/);
110
+ });
91
111
 
92
- assert.deepEqual(copies, [["/tmp/gsd.db", "/tmp/gsd.db.backup-v12"]]);
112
+ test("throws and skips copying when checkpoint result is incomplete", () => {
113
+ const db = new FakeAdapter();
114
+ db.checkpointRow = { busy: 1, log: 4, checkpointed: 3 };
115
+ const copies: Array<[string, string]> = [];
116
+ const warnings: string[] = [];
93
117
 
94
- backupDatabaseBeforeMigration(db, "/tmp/fail.db", 13, {
95
- existsSync: (path) => path === "/tmp/fail.db",
96
- copyFileSync: () => {
97
- throw new Error("read only");
98
- },
99
- logWarning: (_scope, message) => warnings.push(message),
100
- });
118
+ assert.throws(
119
+ () =>
120
+ backupDatabaseBeforeMigration(db, "/tmp/gsd.db", 12, {
121
+ existsSync: (path) => path === "/tmp/gsd.db",
122
+ copyFileSync: (src, dest) => copies.push([src, dest]),
123
+ logWarning: (_scope, message) => warnings.push(message),
124
+ }),
125
+ MigrationBackupError,
126
+ );
127
+
128
+ assert.deepEqual(db.prepareCalls, ["PRAGMA wal_checkpoint(TRUNCATE)"]);
129
+ assert.deepEqual(copies, []);
130
+ assert.equal(warnings.length, 1);
131
+ assert.match(warnings[0], /Pre-migration backup failed: WAL checkpoint incomplete/);
132
+ });
133
+
134
+ test("throws and warns when copy fails", () => {
135
+ const db = new FakeAdapter();
136
+ const warnings: string[] = [];
101
137
 
138
+ assert.throws(
139
+ () =>
140
+ backupDatabaseBeforeMigration(db, "/tmp/fail.db", 13, {
141
+ existsSync: (path) => path === "/tmp/fail.db",
142
+ copyFileSync: () => {
143
+ throw new Error("read only");
144
+ },
145
+ logWarning: (_scope, message) => warnings.push(message),
146
+ }),
147
+ /read only/,
148
+ );
149
+
150
+ assert.deepEqual(db.prepareCalls, ["PRAGMA wal_checkpoint(TRUNCATE)"]);
102
151
  assert.equal(warnings.length, 1);
103
152
  assert.match(warnings[0], /Pre-migration backup failed: read only/);
104
153
  });
@@ -17,6 +17,10 @@ class FakeTransactionControls implements DbTransactionControls {
17
17
  this.record("BEGIN DEFERRED");
18
18
  }
19
19
 
20
+ beginImmediate(): void {
21
+ this.record("BEGIN IMMEDIATE");
22
+ }
23
+
20
24
  commit(): void {
21
25
  this.record("COMMIT");
22
26
  }
@@ -107,4 +111,59 @@ describe("db-transaction", () => {
107
111
  assert.equal(rollbackErrors.length, 1);
108
112
  assert.match(rollbackErrors[0].message, /failed ROLLBACK/);
109
113
  });
114
+
115
+ test("commits successful immediate transactions", () => {
116
+ const runner = createDbTransactionRunner();
117
+ const controls = new FakeTransactionControls();
118
+
119
+ const result = runner.immediateTransaction(controls, () => {
120
+ assert.equal(runner.isInTransaction(), true);
121
+ return "ok";
122
+ });
123
+
124
+ assert.equal(result, "ok");
125
+ assert.equal(runner.isInTransaction(), false);
126
+ assert.deepEqual(controls.calls, ["BEGIN IMMEDIATE", "COMMIT"]);
127
+ });
128
+
129
+ test("rolls back failed immediate transactions and clears depth", () => {
130
+ const runner = createDbTransactionRunner();
131
+ const controls = new FakeTransactionControls();
132
+
133
+ assert.throws(
134
+ () => runner.immediateTransaction(controls, () => {
135
+ throw new Error("boom");
136
+ }),
137
+ /boom/,
138
+ );
139
+
140
+ assert.equal(runner.isInTransaction(), false);
141
+ assert.deepEqual(controls.calls, ["BEGIN IMMEDIATE", "ROLLBACK"]);
142
+ });
143
+
144
+ test("nested immediate transactions inside write transactions do not issue nested BEGIN", () => {
145
+ const runner = createDbTransactionRunner();
146
+ const controls = new FakeTransactionControls();
147
+
148
+ runner.transaction(controls, () => {
149
+ runner.immediateTransaction(controls, () => {
150
+ assert.equal(runner.isInTransaction(), true);
151
+ });
152
+ });
153
+
154
+ assert.deepEqual(controls.calls, ["BEGIN", "COMMIT"]);
155
+ });
156
+
157
+ test("nested write transactions inside immediate transactions do not issue nested BEGIN", () => {
158
+ const runner = createDbTransactionRunner();
159
+ const controls = new FakeTransactionControls();
160
+
161
+ runner.immediateTransaction(controls, () => {
162
+ runner.transaction(controls, () => {
163
+ assert.equal(runner.isInTransaction(), true);
164
+ });
165
+ });
166
+
167
+ assert.deepEqual(controls.calls, ["BEGIN IMMEDIATE", "COMMIT"]);
168
+ });
110
169
  });
@@ -920,9 +920,9 @@ describe('db-writer', () => {
920
920
  decision,
921
921
  });
922
922
 
923
- test('detects deferral in scope with M###/S## pattern in choice', () => {
923
+ test('detects deferral in scope when the scope names the slice', () => {
924
924
  const result = extractDeferredSliceRef(
925
- fields('deferral of low-priority work', 'Move M001/S03 to backlog', ''),
925
+ fields('deferral of slice M001/S03', 'Move low-priority work to backlog', ''),
926
926
  );
927
927
  assert.deepStrictEqual(result, { milestoneId: 'M001', sliceId: 'S03' });
928
928
  });
@@ -950,14 +950,14 @@ describe('db-writer', () => {
950
950
 
951
951
  test('recognises "deferring" variant', () => {
952
952
  const result = extractDeferredSliceRef(
953
- fields('deferring this slice', 'M005/S02 can wait', ''),
953
+ fields('slice prioritization', 'deferring M005/S02 until later', ''),
954
954
  );
955
955
  assert.deepStrictEqual(result, { milestoneId: 'M005', sliceId: 'S02' });
956
956
  });
957
957
 
958
958
  test('recognises "defers" variant', () => {
959
959
  const result = extractDeferredSliceRef(
960
- fields('team defers slice', 'M100/S10 not urgent', ''),
960
+ fields('slice prioritization', 'team defers slice M100/S10', ''),
961
961
  );
962
962
  assert.deepStrictEqual(result, { milestoneId: 'M100', sliceId: 'S10' });
963
963
  });
@@ -969,6 +969,17 @@ describe('db-writer', () => {
969
969
  assert.deepStrictEqual(result, { milestoneId: 'M003', sliceId: 'S01' });
970
970
  });
971
971
 
972
+ test('does not treat a planning scope reference as a deferred slice', () => {
973
+ const result = extractDeferredSliceRef(
974
+ fields(
975
+ 'planning',
976
+ 'Plan S01 as the happy-path money loop only; Defer full duplicate/replay idempotency + polling reconciliation backstop (R006).',
977
+ 'M003/S01 scope boundary for the BTC money loop (which requirements land in the first slice vs deferred follow-on slices).',
978
+ ),
979
+ );
980
+ assert.strictEqual(result, null);
981
+ });
982
+
972
983
  test('returns null when no deferral keyword is present', () => {
973
984
  const result = extractDeferredSliceRef(
974
985
  fields('approved work', 'M001/S01 is ready', 'proceed with M001/S01'),
@@ -6,7 +6,8 @@ import { tmpdir } from "node:os";
6
6
  import { join } from "node:path";
7
7
  import { randomUUID } from "node:crypto";
8
8
 
9
- import { runDispatch, runPreDispatch } from "../auto/phases.ts";
9
+ import { runDispatch } from "../auto/dispatch.ts";
10
+ import { runPreDispatch } from "../auto/pre-dispatch.ts";
10
11
  import { AutoSession } from "../auto/session.ts";
11
12
  import { resolveUnitSupervisionTimeouts } from "../auto-timers.ts";
12
13
  import { bootstrapAutoSession } from "../auto-start.ts";
@@ -21,6 +21,7 @@ import {
21
21
  insertSlice,
22
22
  insertTask,
23
23
  setMilestoneQueueOrder,
24
+ transaction,
24
25
  updateTaskStatus,
25
26
  } from '../gsd-db.ts';
26
27
 
@@ -473,6 +474,31 @@ describe('derive-state-helpers', () => {
473
474
  }
474
475
  });
475
476
 
477
+ test('setMilestoneQueueOrder can be composed inside a transaction', async () => {
478
+ const base = createFixtureBase();
479
+ try {
480
+ writeFile(base, 'milestones/M001/M001-CONTEXT.md', '# M001\n\nContext.');
481
+ writeFile(base, 'milestones/M002/M002-CONTEXT.md', '# M002\n\nContext.');
482
+
483
+ openDatabase(':memory:');
484
+ insertMilestone({ id: 'M001', title: 'First', status: 'active' });
485
+ insertMilestone({ id: 'M002', title: 'Second', status: 'active' });
486
+
487
+ transaction(() => {
488
+ setMilestoneQueueOrder(['M002', 'M001']);
489
+ });
490
+
491
+ invalidateStateCache();
492
+ const state = await deriveStateFromDb(base);
493
+
494
+ assert.equal(state.activeMilestone?.id, 'M002', 'queue-order: nested transaction chooses M002');
495
+ assert.deepEqual(state.registry.map(entry => entry.id), ['M002', 'M001']);
496
+ } finally {
497
+ closeDatabase();
498
+ cleanup(base);
499
+ }
500
+ });
501
+
476
502
  test('getActiveMilestoneId: DB lock path ignores PARKED flag projection', async () => {
477
503
  const base = createFixtureBase();
478
504
  const previousLock = process.env.GSD_MILESTONE_LOCK;
@@ -569,6 +595,42 @@ describe('derive-state-helpers', () => {
569
595
  }
570
596
  });
571
597
 
598
+ // ─── Batch slice query: multi-milestone slices loaded in one query ─────
599
+ test('buildRegistryAndFindActive: batched slice query preserves ordering across milestones', async () => {
600
+ const base = createFixtureBase();
601
+ try {
602
+ // M001 is complete so the loop advances past it.
603
+ writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_CONTENT);
604
+ writeFile(base, 'milestones/M001/M001-SUMMARY.md', '# M001 Summary\n\nDone.');
605
+ // M002 is a queued shell milestone with no context and no slices — should be deferred.
606
+ mkdirSync(join(base, '.gsd', 'milestones', 'M002'), { recursive: true });
607
+ // M003 is the real active milestone with slices in non-trivial sequence order.
608
+ writeFile(base, 'milestones/M003/M003-CONTEXT.md', '# M003: Real\n\nReal milestone.');
609
+
610
+ openDatabase(':memory:');
611
+ insertMilestone({ id: 'M001', title: 'Complete', status: 'complete' });
612
+ insertMilestone({ id: 'M002', title: 'Shell', status: 'queued' });
613
+ insertMilestone({ id: 'M003', title: 'Real', status: 'active' });
614
+ // Slices intentionally inserted with out-of-order sequences to prove ordering.
615
+ insertSlice({ id: 'S01', milestoneId: 'M001', title: 'M1 Second', status: 'complete', risk: 'low', depends: [], sequence: 2 });
616
+ insertSlice({ id: 'S02', milestoneId: 'M001', title: 'M1 First', status: 'complete', risk: 'low', depends: [], sequence: 1 });
617
+ insertSlice({ id: 'S03', milestoneId: 'M003', title: 'M3 Second', status: 'active', risk: 'low', depends: [], sequence: 5 });
618
+ insertSlice({ id: 'S04', milestoneId: 'M003', title: 'M3 First', status: 'active', risk: 'low', depends: [], sequence: 3 });
619
+
620
+ invalidateStateCache();
621
+ const state = await deriveStateFromDb(base);
622
+
623
+ assert.equal(state.activeMilestone?.id, 'M003', 'batched: M003 is active after complete M001 and shell M002');
624
+ assert.equal(state.activeSlice?.id, 'S04', 'batched: first slice by sequence is active');
625
+ assert.equal(state.registry.find(e => e.id === 'M001')?.status, 'complete', 'batched: M001 complete');
626
+ assert.equal(state.registry.find(e => e.id === 'M002')?.status, 'pending', 'batched: shell M002 deferred to pending');
627
+ assert.equal(state.registry.find(e => e.id === 'M003')?.status, 'active', 'batched: M003 active');
628
+ } finally {
629
+ closeDatabase();
630
+ cleanup(base);
631
+ }
632
+ });
633
+
572
634
  // ─── Deferred queued shell: shell milestone deferred, real one promoted ──
573
635
  test('buildRegistryAndFindActive: queued shell deferred, later real milestone becomes active (#3470)', async () => {
574
636
  const base = createFixtureBase();
@@ -39,7 +39,11 @@ function makeDiscussPi() {
39
39
  tmp,
40
40
  pi: {
41
41
  getActiveTools: () => ["gsd_summary_save", "bash"],
42
+ emitAdjustToolSet: async () => undefined,
43
+ emitBeforeModelSelect: async () => undefined,
44
+ setModel: async () => true,
42
45
  setActiveTools: () => {},
46
+ setThinkingLevel: () => {},
43
47
  sendMessage: (message: { content?: unknown }) => {
44
48
  sent.push(message);
45
49
  },
@@ -53,6 +57,7 @@ function makeDiscussPi() {
53
57
  }
54
58
 
55
59
  function makeDiscussCtx(notifications: Array<{ message: string; level?: string }> = []) {
60
+ const model = { provider: "anthropic", id: "claude-sonnet-4-6", api: "anthropic-messages" };
56
61
  return {
57
62
  hasUI: true,
58
63
  sessionManager: {
@@ -65,8 +70,13 @@ function makeDiscussCtx(notifications: Array<{ message: string; level?: string }
65
70
  setStatus: () => {},
66
71
  },
67
72
  waitForIdle: async () => {},
68
- model: undefined,
69
- modelRegistry: { getProviderAuthMode: () => undefined },
73
+ model,
74
+ modelRegistry: {
75
+ getAvailable: () => [model],
76
+ getAll: () => [model],
77
+ getProviderAuthMode: () => "apiKey",
78
+ isProviderRequestReady: () => true,
79
+ },
70
80
  };
71
81
  }
72
82