gsd-pi 2.77.0-dev.eaa4973bc → 2.78.0-dev.aeeb2ca00

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 (545) hide show
  1. package/README.md +53 -17
  2. package/dist/claude-cli-check.js +46 -10
  3. package/dist/headless.js +49 -4
  4. package/dist/resource-loader.d.ts +40 -0
  5. package/dist/resource-loader.js +32 -13
  6. package/dist/resources/extensions/browser-tools/capture.js +9 -0
  7. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  8. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  9. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  10. package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
  11. package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
  12. package/dist/resources/extensions/claude-code-cli/readiness.js +72 -16
  13. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +481 -17
  14. package/dist/resources/extensions/github-sync/templates.js +103 -0
  15. package/dist/resources/extensions/google-search/index.js +3 -2
  16. package/dist/resources/extensions/gsd/auto/loop.js +124 -2
  17. package/dist/resources/extensions/gsd/auto/phases.js +57 -39
  18. package/dist/resources/extensions/gsd/auto/session.js +6 -2
  19. package/dist/resources/extensions/gsd/auto-dispatch.js +142 -29
  20. package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
  21. package/dist/resources/extensions/gsd/auto-post-unit.js +150 -64
  22. package/dist/resources/extensions/gsd/auto-prompts.js +372 -104
  23. package/dist/resources/extensions/gsd/auto-recovery.js +197 -48
  24. package/dist/resources/extensions/gsd/auto-start.js +107 -29
  25. package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
  26. package/dist/resources/extensions/gsd/auto-worktree.js +122 -26
  27. package/dist/resources/extensions/gsd/auto.js +76 -21
  28. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +19 -1
  29. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
  30. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +3 -6
  31. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
  32. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
  33. package/dist/resources/extensions/gsd/component-loader.js +447 -0
  34. package/dist/resources/extensions/gsd/component-types.js +69 -0
  35. package/dist/resources/extensions/gsd/context-store.js +23 -7
  36. package/dist/resources/extensions/gsd/detection.js +49 -1
  37. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -17
  38. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  39. package/dist/resources/extensions/gsd/forensics.js +106 -0
  40. package/dist/resources/extensions/gsd/gate-registry.js +2 -2
  41. package/dist/resources/extensions/gsd/git-constants.js +28 -1
  42. package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
  43. package/dist/resources/extensions/gsd/git-service.js +126 -2
  44. package/dist/resources/extensions/gsd/gsd-db.js +6 -3
  45. package/dist/resources/extensions/gsd/guided-flow.js +39 -13
  46. package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
  47. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
  48. package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
  49. package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
  50. package/dist/resources/extensions/gsd/model-router.js +6 -0
  51. package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
  52. package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
  53. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
  54. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  55. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  56. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  57. package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  58. package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
  59. package/dist/resources/extensions/gsd/service-tier.js +5 -2
  60. package/dist/resources/extensions/gsd/session-lock.js +19 -10
  61. package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
  62. package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
  63. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
  64. package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
  65. package/dist/resources/extensions/gsd/state.js +69 -58
  66. package/dist/resources/extensions/gsd/sync-lock.js +98 -42
  67. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
  68. package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
  69. package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
  70. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
  71. package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
  72. package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
  73. package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
  74. package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
  75. package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
  76. package/dist/resources/extensions/gsd/uok/plan-v2.js +10 -4
  77. package/dist/resources/extensions/gsd/uok/writer.js +82 -0
  78. package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
  79. package/dist/resources/extensions/gsd/worktree-manager.js +85 -8
  80. package/dist/resources/extensions/gsd/worktree-resolver.js +86 -7
  81. package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
  82. package/dist/resources/extensions/mcp-client/index.js +3 -1
  83. package/dist/resources/extensions/ollama/index.js +5 -1
  84. package/dist/resources/extensions/remote-questions/manager.js +11 -5
  85. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  86. package/dist/web/standalone/.next/BUILD_ID +1 -1
  87. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  88. package/dist/web/standalone/.next/build-manifest.json +2 -2
  89. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  90. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/index.html +1 -1
  108. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  115. package/dist/web/standalone/.next/server/chunks/1926.js +1 -1
  116. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  117. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  119. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  120. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  121. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  122. package/package.json +2 -3
  123. package/packages/daemon/package.json +2 -2
  124. package/packages/daemon/src/logger.ts +4 -3
  125. package/packages/mcp-server/dist/server.d.ts +24 -0
  126. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  127. package/packages/mcp-server/dist/server.js +88 -87
  128. package/packages/mcp-server/dist/server.js.map +1 -1
  129. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  130. package/packages/mcp-server/dist/workflow-tools.js +15 -6
  131. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  132. package/packages/mcp-server/package.json +2 -2
  133. package/packages/mcp-server/src/mcp-server.test.ts +25 -3
  134. package/packages/mcp-server/src/readers/graph.test.ts +87 -15
  135. package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
  136. package/packages/mcp-server/src/server.ts +131 -105
  137. package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
  138. package/packages/mcp-server/src/workflow-tools.ts +19 -6
  139. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  140. package/packages/native/package.json +2 -2
  141. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  142. package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
  143. package/packages/native/src/__tests__/ps.test.mjs +14 -8
  144. package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
  145. package/packages/native/src/__tests__/truncate.test.mjs +17 -2
  146. package/packages/pi-agent-core/package.json +1 -1
  147. package/packages/pi-agent-core/src/agent-loop.test.ts +5 -15
  148. package/packages/pi-agent-core/src/agent.test.ts +96 -102
  149. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  150. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  151. package/packages/pi-ai/dist/models/capability-patches.js +9 -2
  152. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  153. package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
  154. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  155. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  156. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  157. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  158. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  159. package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
  160. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
  161. package/packages/pi-ai/dist/models/generated/openai.js +17 -0
  162. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
  163. package/packages/pi-ai/dist/models.generated.test.js +43 -70
  164. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  165. package/packages/pi-ai/dist/models.test.js +36 -11
  166. package/packages/pi-ai/dist/models.test.js.map +1 -1
  167. package/packages/pi-ai/package.json +1 -1
  168. package/packages/pi-ai/scripts/generate-models.ts +44 -0
  169. package/packages/pi-ai/src/models/capability-patches.ts +10 -2
  170. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  171. package/packages/pi-ai/src/models/generated/openai.ts +17 -0
  172. package/packages/pi-ai/src/models.generated.test.ts +46 -73
  173. package/packages/pi-ai/src/models.test.ts +48 -11
  174. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  175. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
  176. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  177. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
  178. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
  180. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  181. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  182. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/extensions/loader.js +61 -0
  184. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +30 -4
  186. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  187. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +17 -0
  188. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
  190. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
  191. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  192. package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
  193. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  194. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
  195. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  196. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
  197. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
  198. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
  199. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
  200. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
  201. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  202. package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -2
  203. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  204. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  205. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  206. package/packages/pi-coding-agent/dist/index.js +1 -0
  207. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  208. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
  209. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  210. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +20 -13
  211. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  212. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  213. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
  214. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  216. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
  217. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  218. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +125 -0
  219. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
  221. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  223. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
  224. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  225. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +105 -13
  226. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  227. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
  228. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
  229. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
  230. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
  231. package/packages/pi-coding-agent/package.json +1 -1
  232. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
  233. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
  234. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
  235. package/packages/pi-coding-agent/src/core/extensions/loader.ts +58 -0
  236. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +35 -4
  237. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +20 -0
  238. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
  239. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
  240. package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
  241. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  242. package/packages/pi-coding-agent/src/core/system-prompt.ts +35 -1
  243. package/packages/pi-coding-agent/src/index.ts +1 -0
  244. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
  245. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
  246. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
  247. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +146 -1
  248. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
  249. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
  250. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
  251. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  252. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  253. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +18 -8
  254. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  255. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
  256. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  257. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +37 -11
  258. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  259. package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
  260. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  261. package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
  262. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  263. package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
  264. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
  265. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
  266. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
  267. package/packages/pi-tui/dist/components/editor.d.ts +14 -0
  268. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  269. package/packages/pi-tui/dist/components/editor.js +19 -0
  270. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  271. package/packages/pi-tui/dist/components/image.test.js +6 -5
  272. package/packages/pi-tui/dist/components/image.test.js.map +1 -1
  273. package/packages/pi-tui/dist/editor-component.d.ts +2 -0
  274. package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
  275. package/packages/pi-tui/dist/editor-component.js.map +1 -1
  276. package/packages/pi-tui/package.json +1 -1
  277. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +24 -8
  278. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
  279. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +42 -11
  280. package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
  281. package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
  282. package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
  283. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
  284. package/packages/pi-tui/src/components/editor.ts +22 -0
  285. package/packages/pi-tui/src/components/image.test.ts +10 -5
  286. package/packages/pi-tui/src/editor-component.ts +3 -0
  287. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  288. package/packages/rpc-client/dist/rpc-client.test.js +101 -51
  289. package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
  290. package/packages/rpc-client/package.json +1 -1
  291. package/packages/rpc-client/src/rpc-client.test.ts +109 -52
  292. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  293. package/pkg/package.json +1 -1
  294. package/scripts/install.js +15 -1
  295. package/src/resources/extensions/browser-tools/capture.ts +12 -0
  296. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  297. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  298. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  299. package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
  300. package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
  301. package/src/resources/extensions/claude-code-cli/readiness.ts +75 -16
  302. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +518 -19
  303. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +919 -75
  304. package/src/resources/extensions/github-sync/templates.ts +151 -0
  305. package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
  306. package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
  307. package/src/resources/extensions/google-search/index.ts +3 -2
  308. package/src/resources/extensions/gsd/auto/loop.ts +142 -2
  309. package/src/resources/extensions/gsd/auto/phases.ts +62 -38
  310. package/src/resources/extensions/gsd/auto/session.ts +7 -2
  311. package/src/resources/extensions/gsd/auto-dispatch.ts +156 -29
  312. package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
  313. package/src/resources/extensions/gsd/auto-post-unit.ts +163 -73
  314. package/src/resources/extensions/gsd/auto-prompts.ts +385 -93
  315. package/src/resources/extensions/gsd/auto-recovery.ts +230 -51
  316. package/src/resources/extensions/gsd/auto-start.ts +127 -9
  317. package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
  318. package/src/resources/extensions/gsd/auto-worktree.ts +130 -26
  319. package/src/resources/extensions/gsd/auto.ts +90 -23
  320. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +20 -1
  321. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
  322. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +3 -7
  323. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
  324. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
  325. package/src/resources/extensions/gsd/component-loader.ts +598 -0
  326. package/src/resources/extensions/gsd/component-types.ts +362 -0
  327. package/src/resources/extensions/gsd/context-store.ts +25 -8
  328. package/src/resources/extensions/gsd/detection.ts +58 -1
  329. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -20
  330. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  331. package/src/resources/extensions/gsd/forensics.ts +118 -1
  332. package/src/resources/extensions/gsd/gate-registry.ts +2 -2
  333. package/src/resources/extensions/gsd/git-constants.ts +30 -1
  334. package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
  335. package/src/resources/extensions/gsd/git-service.ts +149 -2
  336. package/src/resources/extensions/gsd/gsd-db.ts +6 -3
  337. package/src/resources/extensions/gsd/guided-flow.ts +57 -14
  338. package/src/resources/extensions/gsd/journal.ts +11 -1
  339. package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
  340. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
  341. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  342. package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
  343. package/src/resources/extensions/gsd/model-router.ts +6 -0
  344. package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
  345. package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
  346. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
  347. package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
  348. package/src/resources/extensions/gsd/prompts/discuss-headless.md +23 -4
  349. package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  350. package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  351. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
  352. package/src/resources/extensions/gsd/service-tier.ts +5 -2
  353. package/src/resources/extensions/gsd/session-lock.ts +20 -10
  354. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  355. package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
  356. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
  357. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  358. package/src/resources/extensions/gsd/state.ts +76 -66
  359. package/src/resources/extensions/gsd/sync-lock.ts +97 -39
  360. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
  361. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
  362. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
  363. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
  364. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +133 -292
  365. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
  366. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
  367. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
  368. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +93 -0
  369. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
  370. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
  371. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +3 -2
  372. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
  373. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
  374. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
  375. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
  376. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
  377. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
  378. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
  379. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  380. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
  381. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
  382. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
  383. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
  384. package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
  385. package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
  386. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  387. package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
  388. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
  389. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
  390. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +159 -0
  391. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
  392. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
  393. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
  394. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
  395. package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
  396. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
  397. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
  398. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +5 -0
  399. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
  400. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
  401. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
  402. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
  403. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
  404. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
  405. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
  406. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
  407. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
  408. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
  409. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +14 -4
  410. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
  411. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
  412. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
  413. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
  414. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
  415. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
  416. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
  417. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
  418. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
  419. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
  420. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
  421. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +64 -0
  422. package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
  423. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +8 -37
  424. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
  425. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
  426. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
  427. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  428. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  429. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  430. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
  431. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
  432. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
  433. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -130
  434. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
  435. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
  436. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
  437. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
  438. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
  439. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +23 -24
  440. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +32 -0
  441. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
  442. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
  443. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
  444. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
  445. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
  446. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
  447. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
  448. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +6 -3
  449. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
  450. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  451. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
  452. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
  453. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
  454. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
  455. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
  456. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  457. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
  458. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
  459. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
  460. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
  461. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
  462. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
  463. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  464. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
  465. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
  466. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
  467. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
  468. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
  469. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
  470. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
  471. package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
  472. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  473. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
  474. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
  475. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
  476. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
  477. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
  478. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
  479. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
  480. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
  481. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
  482. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  483. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +19 -2
  484. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  485. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +12 -0
  486. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
  487. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
  488. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
  489. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
  490. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
  491. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
  492. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
  493. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
  494. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
  495. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
  496. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
  497. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
  498. package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
  499. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
  500. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
  501. package/src/resources/extensions/gsd/types.ts +3 -3
  502. package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
  503. package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
  504. package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
  505. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
  506. package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
  507. package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
  508. package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
  509. package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
  510. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  511. package/src/resources/extensions/gsd/uok/plan-v2.ts +13 -5
  512. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  513. package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
  514. package/src/resources/extensions/gsd/worktree-manager.ts +108 -7
  515. package/src/resources/extensions/gsd/worktree-resolver.ts +96 -9
  516. package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
  517. package/src/resources/extensions/mcp-client/index.ts +3 -1
  518. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
  519. package/src/resources/extensions/ollama/index.ts +5 -1
  520. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
  521. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
  522. package/src/resources/extensions/remote-questions/manager.ts +36 -4
  523. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
  524. package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
  525. package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
  526. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
  527. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
  528. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
  529. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
  530. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
  531. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -143
  532. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -157
  533. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
  534. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
  535. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
  536. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  537. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
  538. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
  539. package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
  540. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
  541. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
  542. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
  543. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
  544. /package/dist/web/standalone/.next/static/{5wbu35_C2_MQ3Jj1lEVDx → cAJH99yNS1UPbeSEiNRrV}/_buildManifest.js +0 -0
  545. /package/dist/web/standalone/.next/static/{5wbu35_C2_MQ3Jj1lEVDx → cAJH99yNS1UPbeSEiNRrV}/_ssgManifest.js +0 -0
@@ -0,0 +1,56 @@
1
+ import type {
2
+ DispatchExplanation,
3
+ DispatchReasonCode,
4
+ GateResult,
5
+ UokDispatchEnvelope,
6
+ UokGraphNode,
7
+ } from "./contracts.js";
8
+
9
+ export interface BuildDispatchEnvelopeInput {
10
+ action: UokDispatchEnvelope["action"];
11
+ node?: Pick<UokGraphNode, "kind" | "reads" | "writes" | "dependsOn">;
12
+ unitType?: string;
13
+ unitId?: string;
14
+ prompt?: string;
15
+ reasonCode: DispatchReasonCode;
16
+ summary: string;
17
+ evidence?: Record<string, unknown>;
18
+ blockedBy?: DispatchExplanation["blockedBy"];
19
+ gateVerdict?: GateResult;
20
+ trace?: UokDispatchEnvelope["trace"];
21
+ }
22
+
23
+ export function buildDispatchEnvelope(input: BuildDispatchEnvelopeInput): UokDispatchEnvelope {
24
+ return {
25
+ action: input.action,
26
+ nodeKind: input.node?.kind,
27
+ unitType: input.unitType,
28
+ unitId: input.unitId,
29
+ prompt: input.prompt,
30
+ reason: {
31
+ reasonCode: input.reasonCode,
32
+ summary: input.summary,
33
+ evidence: input.evidence,
34
+ blockedBy: input.blockedBy,
35
+ },
36
+ gateVerdict: input.gateVerdict,
37
+ constraints: input.node
38
+ ? {
39
+ reads: input.node.reads,
40
+ writes: input.node.writes,
41
+ dependsOn: input.node.dependsOn,
42
+ }
43
+ : undefined,
44
+ trace: input.trace,
45
+ };
46
+ }
47
+
48
+ export function explainDispatch(envelope: UokDispatchEnvelope): string {
49
+ const subject = envelope.unitType && envelope.unitId
50
+ ? `${envelope.unitType} ${envelope.unitId}`
51
+ : envelope.nodeKind ?? envelope.action;
52
+ const blocked = envelope.reason.blockedBy && envelope.reason.blockedBy.length > 0
53
+ ? ` Blocked by: ${envelope.reason.blockedBy.map((b) => `${b.kind}:${b.id}`).join(", ")}.`
54
+ : "";
55
+ return `[${envelope.reason.reasonCode}] ${subject}: ${envelope.reason.summary}.${blocked}`;
56
+ }
@@ -12,6 +12,14 @@ export interface ExecutionGraphResult {
12
12
  conflicts: Array<{ nodeA: string; nodeB: string; file: string }>;
13
13
  }
14
14
 
15
+ export interface ExecutionGraphSnapshot {
16
+ capturedAt: string;
17
+ phase: "before-unit" | "after-unit";
18
+ nodes: UokGraphNode[];
19
+ order: string[];
20
+ conflicts: Array<{ nodeA: string; nodeB: string; file: string }>;
21
+ }
22
+
15
23
  export type ExecutionNodeHandler = (node: UokGraphNode) => Promise<void>;
16
24
 
17
25
  export interface ConflictFreeBatchInput {
@@ -113,6 +121,20 @@ export function buildSidecarQueueNodes(queue: SidecarItem[]): UokGraphNode[] {
113
121
  }));
114
122
  }
115
123
 
124
+ export function buildExecutionGraphSnapshot(
125
+ nodes: UokGraphNode[],
126
+ phase: ExecutionGraphSnapshot["phase"],
127
+ ): ExecutionGraphSnapshot {
128
+ const sorted = topologicalSort(nodes);
129
+ return {
130
+ capturedAt: new Date().toISOString(),
131
+ phase,
132
+ nodes: sorted,
133
+ order: sorted.map((node) => node.id),
134
+ conflicts: detectFileConflicts(nodes),
135
+ };
136
+ }
137
+
116
138
  export async function scheduleSidecarQueue(queue: SidecarItem[]): Promise<SidecarItem[]> {
117
139
  if (queue.length <= 1) return [...queue];
118
140
  const nodes = buildSidecarQueueNodes(queue);
@@ -52,7 +52,8 @@ export class UokGateRunner {
52
52
  async run(id: string, ctx: GateRunnerContext): Promise<GateResult> {
53
53
  const gate = this.registry.get(id);
54
54
  if (!gate) {
55
- return {
55
+ const now = new Date().toISOString();
56
+ const unknownResult: GateResult = {
56
57
  gateId: id,
57
58
  gateType: "unknown",
58
59
  outcome: "manual-attention",
@@ -61,18 +62,77 @@ export class UokGateRunner {
61
62
  attempt: 1,
62
63
  maxAttempts: 1,
63
64
  retryable: false,
64
- evaluatedAt: new Date().toISOString(),
65
+ evaluatedAt: now,
65
66
  };
67
+
68
+ insertGateRun({
69
+ traceId: ctx.traceId,
70
+ turnId: ctx.turnId,
71
+ gateId: unknownResult.gateId,
72
+ gateType: unknownResult.gateType,
73
+ unitType: ctx.unitType,
74
+ unitId: ctx.unitId,
75
+ milestoneId: ctx.milestoneId,
76
+ sliceId: ctx.sliceId,
77
+ taskId: ctx.taskId,
78
+ outcome: unknownResult.outcome,
79
+ failureClass: unknownResult.failureClass,
80
+ rationale: unknownResult.rationale,
81
+ findings: unknownResult.findings,
82
+ attempt: unknownResult.attempt,
83
+ maxAttempts: unknownResult.maxAttempts,
84
+ retryable: unknownResult.retryable,
85
+ evaluatedAt: unknownResult.evaluatedAt,
86
+ });
87
+
88
+ emitUokAuditEvent(
89
+ ctx.basePath,
90
+ buildAuditEnvelope({
91
+ traceId: ctx.traceId,
92
+ turnId: ctx.turnId,
93
+ category: "gate",
94
+ type: "gate-run",
95
+ payload: {
96
+ gateId: unknownResult.gateId,
97
+ gateType: unknownResult.gateType,
98
+ outcome: unknownResult.outcome,
99
+ failureClass: unknownResult.failureClass,
100
+ attempt: unknownResult.attempt,
101
+ maxAttempts: unknownResult.maxAttempts,
102
+ retryable: unknownResult.retryable,
103
+ },
104
+ }),
105
+ );
106
+
107
+ return unknownResult;
66
108
  }
67
109
 
68
110
  let attempt = 0;
69
111
  let final: GateResult | null = null;
70
112
  const maxAttemptsByFailureClass = RETRY_MATRIX;
113
+ const maxAttemptsCeiling = Math.max(...Object.values(RETRY_MATRIX)) + 1;
71
114
 
72
- while (attempt < 3) {
115
+ while (attempt < maxAttemptsCeiling) {
73
116
  attempt += 1;
74
117
  const now = new Date().toISOString();
75
- const result = await gate.execute(ctx, attempt);
118
+
119
+ let result: {
120
+ outcome: "pass" | "fail" | "retry" | "manual-attention";
121
+ rationale?: string;
122
+ findings?: string;
123
+ failureClass?: FailureClass;
124
+ };
125
+
126
+ try {
127
+ result = await gate.execute(ctx, attempt);
128
+ } catch (err) {
129
+ const message = err instanceof Error ? err.message : String(err);
130
+ result = {
131
+ outcome: "fail",
132
+ failureClass: "unknown",
133
+ rationale: message,
134
+ };
135
+ }
76
136
  const failureClass = result.failureClass ?? (result.outcome === "pass" ? "none" : "unknown");
77
137
  const retryBudget = maxAttemptsByFailureClass[failureClass] ?? 0;
78
138
  const retryable = result.outcome !== "pass" && attempt <= retryBudget;
@@ -85,7 +145,7 @@ export class UokGateRunner {
85
145
  rationale: result.rationale,
86
146
  findings: result.findings,
87
147
  attempt,
88
- maxAttempts: Math.max(1, retryBudget),
148
+ maxAttempts: retryBudget + 1,
89
149
  retryable,
90
150
  evaluatedAt: now,
91
151
  };
@@ -54,7 +54,11 @@ export function writeTurnGitTransaction(args: GitTxArgs): void {
54
54
  );
55
55
  }
56
56
 
57
- export function writeTurnCloseoutGitRecord(basePath: string, record: TurnCloseoutRecord): void {
57
+ export function writeTurnCloseoutGitRecord(
58
+ basePath: string,
59
+ record: TurnCloseoutRecord,
60
+ metadata?: Record<string, unknown>,
61
+ ): void {
58
62
  writeTurnGitTransaction({
59
63
  basePath,
60
64
  traceId: record.traceId,
@@ -67,6 +71,7 @@ export function writeTurnCloseoutGitRecord(basePath: string, record: TurnCloseou
67
71
  status: record.failureClass === "git" ? "failed" : "ok",
68
72
  error: record.failureClass === "git" ? "git closeout failure" : undefined,
69
73
  metadata: {
74
+ ...(metadata ?? {}),
70
75
  turnStatus: record.status,
71
76
  finishedAt: record.finishedAt,
72
77
  activityFile: record.activityFile,
@@ -6,6 +6,7 @@ import type {
6
6
  } from "./contracts.js";
7
7
  import { buildAuditEnvelope, emitUokAuditEvent } from "./audit.js";
8
8
  import { writeTurnCloseoutGitRecord, writeTurnGitTransaction } from "./gitops.js";
9
+ import { acquireWriterToken, nextWriteRecord, releaseWriterToken } from "./writer.js";
9
10
 
10
11
  export interface CreateTurnObserverOptions {
11
12
  basePath: string;
@@ -17,12 +18,38 @@ export interface CreateTurnObserverOptions {
17
18
 
18
19
  export function createTurnObserver(options: CreateTurnObserverOptions): UokTurnObserver {
19
20
  let current: TurnContract | null = null;
21
+ let writerToken: ReturnType<typeof acquireWriterToken> | null = null;
20
22
  const phaseResults: TurnResult["phaseResults"] = [];
21
23
 
24
+ function nextSequenceMetadata(
25
+ category: "audit" | "gitops",
26
+ operation: "append" | "insert" | "update",
27
+ metadata?: Record<string, unknown>,
28
+ ): Record<string, unknown> {
29
+ if (!writerToken) return metadata ?? {};
30
+ const record = nextWriteRecord({
31
+ basePath: options.basePath,
32
+ token: writerToken,
33
+ category,
34
+ operation,
35
+ metadata,
36
+ });
37
+ return {
38
+ ...(metadata ?? {}),
39
+ writeSequence: record.sequence.sequence,
40
+ writerTokenId: record.writerToken.tokenId,
41
+ };
42
+ }
43
+
22
44
  return {
23
45
  onTurnStart(contract): void {
24
46
  current = contract;
25
47
  phaseResults.length = 0;
48
+ writerToken = acquireWriterToken({
49
+ basePath: options.basePath,
50
+ traceId: contract.traceId,
51
+ turnId: contract.turnId,
52
+ });
26
53
 
27
54
  if (options.enableGitops) {
28
55
  writeTurnGitTransaction({
@@ -35,10 +62,10 @@ export function createTurnObserver(options: CreateTurnObserverOptions): UokTurnO
35
62
  action: options.gitAction,
36
63
  push: options.gitPush,
37
64
  status: "ok",
38
- metadata: {
65
+ metadata: nextSequenceMetadata("gitops", "insert", {
39
66
  iteration: contract.iteration,
40
67
  sidecarKind: contract.sidecarKind,
41
- },
68
+ }),
42
69
  });
43
70
  }
44
71
 
@@ -50,12 +77,12 @@ export function createTurnObserver(options: CreateTurnObserverOptions): UokTurnO
50
77
  turnId: contract.turnId,
51
78
  category: "orchestration",
52
79
  type: "turn-start",
53
- payload: {
80
+ payload: nextSequenceMetadata("audit", "append", {
54
81
  iteration: contract.iteration,
55
82
  unitType: contract.unitType,
56
83
  unitId: contract.unitId,
57
84
  sidecarKind: contract.sidecarKind,
58
- },
85
+ }),
59
86
  }),
60
87
  );
61
88
  }
@@ -81,7 +108,7 @@ export function createTurnObserver(options: CreateTurnObserverOptions): UokTurnO
81
108
  action: options.gitAction,
82
109
  push: options.gitPush,
83
110
  status: "ok",
84
- metadata: { action },
111
+ metadata: nextSequenceMetadata("gitops", "update", { action }),
85
112
  });
86
113
  }
87
114
  if (phase === "unit") {
@@ -95,7 +122,7 @@ export function createTurnObserver(options: CreateTurnObserverOptions): UokTurnO
95
122
  action: options.gitAction,
96
123
  push: options.gitPush,
97
124
  status: "ok",
98
- metadata: { action },
125
+ metadata: nextSequenceMetadata("gitops", "update", { action }),
99
126
  });
100
127
  }
101
128
  if (phase === "finalize") {
@@ -109,7 +136,7 @@ export function createTurnObserver(options: CreateTurnObserverOptions): UokTurnO
109
136
  action: options.gitAction,
110
137
  push: options.gitPush,
111
138
  status: "ok",
112
- metadata: { action },
139
+ metadata: nextSequenceMetadata("gitops", "update", { action }),
113
140
  });
114
141
  }
115
142
  },
@@ -128,14 +155,14 @@ export function createTurnObserver(options: CreateTurnObserverOptions): UokTurnO
128
155
  turnId: merged.turnId,
129
156
  category: "orchestration",
130
157
  type: "turn-result",
131
- payload: {
158
+ payload: nextSequenceMetadata("audit", "append", {
132
159
  unitType: merged.unitType,
133
160
  unitId: merged.unitId,
134
161
  status: merged.status,
135
162
  failureClass: merged.failureClass,
136
163
  error: merged.error,
137
164
  phaseCount: merged.phaseResults.length,
138
- },
165
+ }),
139
166
  }),
140
167
  );
141
168
  }
@@ -152,9 +179,17 @@ export function createTurnObserver(options: CreateTurnObserverOptions): UokTurnO
152
179
  gitPushed: options.gitPush,
153
180
  finishedAt: merged.finishedAt,
154
181
  };
155
- writeTurnCloseoutGitRecord(options.basePath, closeout);
182
+ writeTurnCloseoutGitRecord(
183
+ options.basePath,
184
+ closeout,
185
+ nextSequenceMetadata("gitops", "update", { action: "record" }),
186
+ );
156
187
  }
157
188
 
189
+ if (writerToken) {
190
+ releaseWriterToken(options.basePath, writerToken);
191
+ }
192
+ writerToken = null;
158
193
  current = null;
159
194
  phaseResults.length = 0;
160
195
  },
@@ -0,0 +1,84 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ import { gsdRoot } from "../paths.js";
5
+
6
+ export interface UokParityEvent {
7
+ ts?: string;
8
+ path?: string;
9
+ phase?: string;
10
+ status?: string;
11
+ error?: string;
12
+ flags?: Record<string, unknown>;
13
+ }
14
+
15
+ export interface UokParityReport {
16
+ generatedAt: string;
17
+ sourcePath: string;
18
+ totalEvents: number;
19
+ paths: Record<string, number>;
20
+ statuses: Record<string, number>;
21
+ criticalMismatches: string[];
22
+ fallbackInvocations: number;
23
+ }
24
+
25
+ function parityLogPath(basePath: string): string {
26
+ return join(gsdRoot(basePath), "runtime", "uok-parity.jsonl");
27
+ }
28
+
29
+ function reportPath(basePath: string): string {
30
+ return join(gsdRoot(basePath), "runtime", "uok-parity-report.json");
31
+ }
32
+
33
+ function increment(bucket: Record<string, number>, key: string | undefined): void {
34
+ const normalized = key && key.trim().length > 0 ? key : "unknown";
35
+ bucket[normalized] = (bucket[normalized] ?? 0) + 1;
36
+ }
37
+
38
+ export function parseParityEvents(raw: string): UokParityEvent[] {
39
+ return raw
40
+ .split("\n")
41
+ .filter(Boolean)
42
+ .map((line) => {
43
+ try {
44
+ return JSON.parse(line) as UokParityEvent;
45
+ } catch {
46
+ return { status: "error", error: "invalid parity json line" };
47
+ }
48
+ });
49
+ }
50
+
51
+ export function buildParityReport(events: readonly UokParityEvent[], sourcePath: string): UokParityReport {
52
+ const paths: Record<string, number> = {};
53
+ const statuses: Record<string, number> = {};
54
+ const criticalMismatches: string[] = [];
55
+ let fallbackInvocations = 0;
56
+
57
+ for (const event of events) {
58
+ increment(paths, event.path);
59
+ increment(statuses, event.status);
60
+ if (event.path === "legacy-fallback") fallbackInvocations += 1;
61
+ if (event.status === "error") {
62
+ criticalMismatches.push(event.error ?? "parity event reported error");
63
+ }
64
+ }
65
+
66
+ return {
67
+ generatedAt: new Date().toISOString(),
68
+ sourcePath,
69
+ totalEvents: events.length,
70
+ paths,
71
+ statuses,
72
+ criticalMismatches,
73
+ fallbackInvocations,
74
+ };
75
+ }
76
+
77
+ export function writeParityReport(basePath: string): UokParityReport {
78
+ const sourcePath = parityLogPath(basePath);
79
+ const raw = existsSync(sourcePath) ? readFileSync(sourcePath, "utf-8") : "";
80
+ const report = buildParityReport(parseParityEvents(raw), sourcePath);
81
+ mkdirSync(join(gsdRoot(basePath), "runtime"), { recursive: true });
82
+ writeFileSync(reportPath(basePath), JSON.stringify(report, null, 2) + "\n", "utf-8");
83
+ return report;
84
+ }
@@ -7,13 +7,17 @@ import { isDbAvailable, getMilestoneSlices, getSliceTasks, type SliceRow } from
7
7
  import type { UokGraphNode } from "./contracts.js";
8
8
 
9
9
  const PLAN_V2_CLARIFY_ROUND_LIMIT = 3;
10
- const EXECUTION_ENTRY_PHASES: ReadonlySet<Phase> = new Set([
10
+ export const EXECUTION_ENTRY_PHASES: ReadonlySet<Phase> = new Set([
11
11
  "executing",
12
12
  "summarizing",
13
13
  "validating-milestone",
14
14
  "completing-milestone",
15
15
  ]);
16
16
 
17
+ export function isExecutionEntryPhase(phase: Phase): boolean {
18
+ return EXECUTION_ENTRY_PHASES.has(phase);
19
+ }
20
+
17
21
  export interface PlanV2CompileResult {
18
22
  ok: boolean;
19
23
  reason?: string;
@@ -61,6 +65,14 @@ function hasMilestoneFileContent(
61
65
  return false;
62
66
  }
63
67
 
68
+ export function hasFinalizedMilestoneContext(basePath: string, milestoneId: string): boolean {
69
+ return hasMilestoneFileContent(basePath, milestoneId, "CONTEXT");
70
+ }
71
+
72
+ export function isMissingFinalizedContextResult(result: PlanV2CompileResult): boolean {
73
+ return !result.ok && result.finalizedContextIncluded === false;
74
+ }
75
+
64
76
  function countSliceResearchArtifacts(basePath: string, milestoneId: string, slices: SliceRow[]): number {
65
77
  let count = 0;
66
78
  for (const slice of slices) {
@@ -71,10 +83,6 @@ function countSliceResearchArtifacts(basePath: string, milestoneId: string, slic
71
83
  return count;
72
84
  }
73
85
 
74
- function isExecutionEntryPhase(phase: Phase): boolean {
75
- return EXECUTION_ENTRY_PHASES.has(phase);
76
- }
77
-
78
86
  export function compileUnitGraphFromState(basePath: string, state: GSDState): PlanV2CompileResult {
79
87
  const mid = state.activeMilestone?.id;
80
88
  if (!mid) return { ok: false, reason: "no active milestone" };
@@ -0,0 +1,113 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+
5
+ import { atomicWriteSync } from "../atomic-write.js";
6
+ import { gsdRoot } from "../paths.js";
7
+ import type { WriteRecord, WriterToken } from "./contracts.js";
8
+
9
+ interface SequenceState {
10
+ lastSequence: number;
11
+ updatedAt: string;
12
+ }
13
+
14
+ const activeTokens = new Map<string, WriterToken>();
15
+
16
+ function tokenKey(basePath: string, turnId: string): string {
17
+ return `${basePath}:${turnId}`;
18
+ }
19
+
20
+ function sequencePath(basePath: string): string {
21
+ return join(gsdRoot(basePath), "runtime", "uok-writer-sequence.json");
22
+ }
23
+
24
+ function readSequenceState(basePath: string): SequenceState {
25
+ const path = sequencePath(basePath);
26
+ if (!existsSync(path)) {
27
+ return { lastSequence: 0, updatedAt: new Date(0).toISOString() };
28
+ }
29
+ try {
30
+ const parsed = JSON.parse(readFileSync(path, "utf-8")) as Partial<SequenceState>;
31
+ return {
32
+ lastSequence: Number.isInteger(parsed.lastSequence) ? Number(parsed.lastSequence) : 0,
33
+ updatedAt: typeof parsed.updatedAt === "string" ? parsed.updatedAt : new Date(0).toISOString(),
34
+ };
35
+ } catch {
36
+ return { lastSequence: 0, updatedAt: new Date(0).toISOString() };
37
+ }
38
+ }
39
+
40
+ function writeSequenceState(basePath: string, state: SequenceState): void {
41
+ atomicWriteSync(sequencePath(basePath), JSON.stringify(state, null, 2) + "\n", "utf-8");
42
+ }
43
+
44
+ export function acquireWriterToken(args: {
45
+ basePath: string;
46
+ traceId: string;
47
+ turnId: string;
48
+ owner?: WriterToken["owner"];
49
+ }): WriterToken {
50
+ const key = tokenKey(args.basePath, args.turnId);
51
+ const existing = activeTokens.get(key);
52
+ if (existing) {
53
+ throw new Error(`Writer token already active for turn ${args.turnId}`);
54
+ }
55
+
56
+ const token: WriterToken = {
57
+ tokenId: randomUUID(),
58
+ traceId: args.traceId,
59
+ turnId: args.turnId,
60
+ acquiredAt: new Date().toISOString(),
61
+ owner: args.owner ?? "uok",
62
+ };
63
+ activeTokens.set(key, token);
64
+ return token;
65
+ }
66
+
67
+ export function releaseWriterToken(basePath: string, token: WriterToken): void {
68
+ const key = tokenKey(basePath, token.turnId);
69
+ const current = activeTokens.get(key);
70
+ if (current?.tokenId === token.tokenId) {
71
+ activeTokens.delete(key);
72
+ }
73
+ }
74
+
75
+ export function hasActiveWriterToken(basePath: string, turnId: string): boolean {
76
+ return activeTokens.has(tokenKey(basePath, turnId));
77
+ }
78
+
79
+ export function nextWriteRecord(args: {
80
+ basePath: string;
81
+ token: WriterToken;
82
+ category: WriteRecord["category"];
83
+ operation: WriteRecord["operation"];
84
+ path?: string;
85
+ metadata?: Record<string, unknown>;
86
+ }): WriteRecord {
87
+ if (!hasActiveWriterToken(args.basePath, args.token.turnId)) {
88
+ throw new Error(`Writer token is not active for turn ${args.token.turnId}`);
89
+ }
90
+
91
+ const state = readSequenceState(args.basePath);
92
+ const sequence = state.lastSequence + 1;
93
+ const updatedAt = new Date().toISOString();
94
+ writeSequenceState(args.basePath, { lastSequence: sequence, updatedAt });
95
+
96
+ return {
97
+ writerToken: args.token,
98
+ sequence: {
99
+ traceId: args.token.traceId,
100
+ turnId: args.token.turnId,
101
+ sequence,
102
+ },
103
+ category: args.category,
104
+ operation: args.operation,
105
+ path: args.path,
106
+ ts: updatedAt,
107
+ metadata: args.metadata,
108
+ };
109
+ }
110
+
111
+ export function resetWriterTokensForTests(): void {
112
+ activeTokens.clear();
113
+ }
@@ -33,6 +33,7 @@ const MCP_WORKFLOW_TOOL_SURFACE = new Set([
33
33
  "gsd_journal_query",
34
34
  "gsd_milestone_complete",
35
35
  "gsd_milestone_generate_id",
36
+ "gsd_milestone_reopen",
36
37
  "gsd_checkpoint_db",
37
38
  "gsd_milestone_status",
38
39
  "gsd_milestone_validate",
@@ -41,6 +42,9 @@ const MCP_WORKFLOW_TOOL_SURFACE = new Set([
41
42
  "gsd_plan_slice",
42
43
  "gsd_replan_slice",
43
44
  "gsd_reassess_roadmap",
45
+ "gsd_reopen_milestone",
46
+ "gsd_reopen_slice",
47
+ "gsd_reopen_task",
44
48
  "gsd_requirement_save",
45
49
  "gsd_requirement_update",
46
50
  "gsd_roadmap_reassess",
@@ -50,9 +54,11 @@ const MCP_WORKFLOW_TOOL_SURFACE = new Set([
50
54
  "gsd_skip_slice",
51
55
  "gsd_slice_replan",
52
56
  "gsd_slice_complete",
57
+ "gsd_slice_reopen",
53
58
  "gsd_summary_save",
54
59
  "gsd_task_plan",
55
60
  "gsd_task_complete",
61
+ "gsd_task_reopen",
56
62
  "gsd_update_requirement",
57
63
  "gsd_validate_milestone",
58
64
  ]);