gsd-pi 2.73.1-dev.d987996 → 2.74.0-dev.0306a2e

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 (535) hide show
  1. package/dist/cli-web-branch.d.ts +4 -3
  2. package/dist/cli-web-branch.js +10 -7
  3. package/dist/cli.js +184 -206
  4. package/dist/headless-query.js +4 -1
  5. package/dist/help-text.js +23 -0
  6. package/dist/logo.d.ts +1 -1
  7. package/dist/logo.js +1 -1
  8. package/dist/onboarding.js +59 -53
  9. package/dist/resource-loader.js +2 -2
  10. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +68 -4
  11. package/dist/resources/extensions/gsd/activity-log.js +16 -0
  12. package/dist/resources/extensions/gsd/auto/detect-stuck.js +11 -4
  13. package/dist/resources/extensions/gsd/auto/loop.js +147 -10
  14. package/dist/resources/extensions/gsd/auto/phases.js +173 -13
  15. package/dist/resources/extensions/gsd/auto/session.js +10 -0
  16. package/dist/resources/extensions/gsd/auto-dispatch.js +22 -4
  17. package/dist/resources/extensions/gsd/auto-model-selection.js +105 -16
  18. package/dist/resources/extensions/gsd/auto-post-unit.js +254 -15
  19. package/dist/resources/extensions/gsd/auto-prompts.js +12 -0
  20. package/dist/resources/extensions/gsd/auto-start.js +23 -6
  21. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +13 -0
  22. package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
  23. package/dist/resources/extensions/gsd/auto-verification.js +186 -3
  24. package/dist/resources/extensions/gsd/auto.js +65 -12
  25. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
  26. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +41 -2
  27. package/dist/resources/extensions/gsd/commands/catalog.js +26 -1
  28. package/dist/resources/extensions/gsd/commands/handlers/ops.js +25 -0
  29. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +68 -9
  30. package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
  31. package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
  32. package/dist/resources/extensions/gsd/commands-do.js +79 -0
  33. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  34. package/dist/resources/extensions/gsd/commands-handlers.js +8 -2
  35. package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
  36. package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
  37. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  38. package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
  39. package/dist/resources/extensions/gsd/commands-ship.js +187 -0
  40. package/dist/resources/extensions/gsd/db-writer.js +3 -5
  41. package/dist/resources/extensions/gsd/docs/preferences-reference.md +15 -2
  42. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  43. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  44. package/dist/resources/extensions/gsd/git-service.js +49 -1
  45. package/dist/resources/extensions/gsd/graph-context.js +157 -0
  46. package/dist/resources/extensions/gsd/gsd-db.js +581 -2
  47. package/dist/resources/extensions/gsd/guided-flow.js +23 -0
  48. package/dist/resources/extensions/gsd/index.js +15 -2
  49. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  50. package/dist/resources/extensions/gsd/journal.js +27 -0
  51. package/dist/resources/extensions/gsd/md-importer.js +3 -4
  52. package/dist/resources/extensions/gsd/memory-store.js +19 -51
  53. package/dist/resources/extensions/gsd/metrics.js +19 -0
  54. package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
  55. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -4
  56. package/dist/resources/extensions/gsd/notification-widget.js +2 -2
  57. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  58. package/dist/resources/extensions/gsd/preferences-models.js +63 -3
  59. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  60. package/dist/resources/extensions/gsd/preferences-validation.js +130 -2
  61. package/dist/resources/extensions/gsd/preferences.js +26 -0
  62. package/dist/resources/extensions/gsd/prompts/add-tests.md +35 -0
  63. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  64. package/dist/resources/extensions/gsd/state.js +66 -15
  65. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  66. package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
  67. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  68. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
  69. package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
  70. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  71. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  72. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  73. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  74. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  75. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  76. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  77. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  78. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  79. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  80. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  81. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  82. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  83. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -69
  84. package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
  85. package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
  86. package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
  87. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  88. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  89. package/dist/update-check.d.ts +1 -0
  90. package/dist/update-check.js +13 -5
  91. package/dist/update-cmd.js +4 -3
  92. package/dist/web/standalone/.next/BUILD_ID +1 -1
  93. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  94. package/dist/web/standalone/.next/build-manifest.json +2 -2
  95. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  96. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/index.html +1 -1
  118. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  125. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  126. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  128. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  129. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  130. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  131. package/package.json +3 -3
  132. package/packages/daemon/package.json +2 -2
  133. package/packages/mcp-server/dist/index.d.ts +3 -0
  134. package/packages/mcp-server/dist/index.d.ts.map +1 -1
  135. package/packages/mcp-server/dist/index.js +3 -0
  136. package/packages/mcp-server/dist/index.js.map +1 -1
  137. package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
  138. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
  139. package/packages/mcp-server/dist/readers/graph.js +655 -0
  140. package/packages/mcp-server/dist/readers/graph.js.map +1 -0
  141. package/packages/mcp-server/dist/readers/index.d.ts +2 -0
  142. package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
  143. package/packages/mcp-server/dist/readers/index.js +1 -0
  144. package/packages/mcp-server/dist/readers/index.js.map +1 -1
  145. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  146. package/packages/mcp-server/dist/server.js +65 -0
  147. package/packages/mcp-server/dist/server.js.map +1 -1
  148. package/packages/mcp-server/package.json +2 -2
  149. package/packages/mcp-server/src/index.ts +15 -0
  150. package/packages/mcp-server/src/readers/graph.test.ts +604 -0
  151. package/packages/mcp-server/src/readers/graph.ts +855 -0
  152. package/packages/mcp-server/src/readers/index.ts +12 -0
  153. package/packages/mcp-server/src/server.ts +83 -0
  154. package/packages/mcp-server/tsconfig.json +1 -0
  155. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
  156. package/packages/native/package.json +2 -2
  157. package/packages/native/tsconfig.tsbuildinfo +1 -0
  158. package/packages/pi-agent-core/package.json +1 -1
  159. package/packages/pi-agent-core/tsconfig.json +1 -0
  160. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
  161. package/packages/pi-ai/dist/index.d.ts +2 -9
  162. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  163. package/packages/pi-ai/dist/index.js +2 -9
  164. package/packages/pi-ai/dist/index.js.map +1 -1
  165. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  166. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  167. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  168. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  169. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  170. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  171. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  172. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  173. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  174. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  175. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  176. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  177. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  178. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  179. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  180. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  181. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  182. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  183. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  184. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  185. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  186. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  187. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  188. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  189. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  190. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  191. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  192. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  193. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  194. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  195. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  196. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  197. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  198. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  199. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  200. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  201. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  202. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  203. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  204. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  205. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  206. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  207. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  208. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  209. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  210. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  211. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  212. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  213. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  214. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  215. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  216. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  217. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  218. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  219. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  220. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  221. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  222. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  223. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  224. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  225. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  226. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  227. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  228. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  229. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  230. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  231. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  232. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  233. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  234. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  235. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  236. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  237. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  238. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  239. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  240. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  241. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  242. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  243. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  244. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  245. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  246. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  247. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  248. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  249. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  250. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  251. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  252. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  253. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  254. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  255. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  256. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  257. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  258. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  259. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  260. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  261. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  262. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  263. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  264. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  265. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  266. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  267. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  268. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  269. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  270. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  271. package/packages/pi-ai/dist/models/index.js +80 -0
  272. package/packages/pi-ai/dist/models/index.js.map +1 -0
  273. package/packages/pi-ai/dist/models.d.ts +1 -36
  274. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  275. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  276. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  277. package/packages/pi-ai/dist/models.js +3 -112
  278. package/packages/pi-ai/dist/models.js.map +1 -1
  279. package/packages/pi-ai/dist/models.test.js +6 -5
  280. package/packages/pi-ai/dist/models.test.js.map +1 -1
  281. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  282. package/packages/pi-ai/dist/utils/overflow.js +12 -0
  283. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  284. package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts +2 -0
  285. package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts.map +1 -0
  286. package/packages/pi-ai/dist/utils/tests/overflow.test.js +50 -0
  287. package/packages/pi-ai/dist/utils/tests/overflow.test.js.map +1 -0
  288. package/packages/pi-ai/package.json +1 -1
  289. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  290. package/packages/pi-ai/src/index.ts +5 -9
  291. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  292. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  293. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  294. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  295. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  296. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  297. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  298. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  299. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  300. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  301. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  302. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  303. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  304. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  305. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  306. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  307. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  308. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  309. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  310. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  311. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  312. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  313. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  314. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  315. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  316. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  317. package/packages/pi-ai/src/models/index.ts +106 -0
  318. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  319. package/packages/pi-ai/src/models.test.ts +6 -5
  320. package/packages/pi-ai/src/models.ts +3 -153
  321. package/packages/pi-ai/src/utils/overflow.ts +14 -1
  322. package/packages/pi-ai/src/utils/tests/overflow.test.ts +58 -0
  323. package/packages/pi-ai/tsconfig.json +1 -0
  324. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
  325. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +721 -8
  326. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/compaction/utils.js +5 -5
  328. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts +2 -0
  330. package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts.map +1 -0
  331. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +45 -0
  332. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -0
  333. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  334. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  335. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  336. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  337. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  339. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +12 -2
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +65 -28
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts +2 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +9 -3
  347. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts +2 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts.map +1 -0
  350. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +52 -0
  351. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -0
  352. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +305 -20
  354. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  356. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  358. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  359. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +13 -0
  360. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +59 -6
  362. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  363. package/packages/pi-coding-agent/package.json +1 -1
  364. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +884 -8
  365. package/packages/pi-coding-agent/src/core/compaction/utils.ts +5 -5
  366. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +50 -0
  367. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  368. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  369. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +78 -32
  370. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +73 -0
  371. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +9 -3
  372. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +381 -39
  373. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  374. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +79 -6
  375. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  376. package/packages/pi-coding-agent/tsconfig.json +3 -2
  377. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
  378. package/packages/pi-tui/dist/__tests__/tui.test.js +60 -1
  379. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  380. package/packages/pi-tui/dist/tui.d.ts +8 -0
  381. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  382. package/packages/pi-tui/dist/tui.js +32 -3
  383. package/packages/pi-tui/dist/tui.js.map +1 -1
  384. package/packages/pi-tui/package.json +1 -1
  385. package/packages/pi-tui/src/__tests__/tui.test.ts +76 -1
  386. package/packages/pi-tui/src/tui.ts +31 -3
  387. package/packages/pi-tui/tsconfig.json +1 -0
  388. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
  389. package/packages/rpc-client/package.json +1 -1
  390. package/packages/rpc-client/tsconfig.json +1 -0
  391. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
  392. package/pkg/package.json +1 -1
  393. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +107 -5
  394. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +111 -2
  395. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  396. package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
  397. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
  398. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  399. package/src/resources/extensions/gsd/auto/phases.ts +213 -13
  400. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  401. package/src/resources/extensions/gsd/auto-dispatch.ts +26 -10
  402. package/src/resources/extensions/gsd/auto-model-selection.ts +151 -16
  403. package/src/resources/extensions/gsd/auto-post-unit.ts +278 -16
  404. package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
  405. package/src/resources/extensions/gsd/auto-start.ts +30 -6
  406. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +17 -0
  407. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  408. package/src/resources/extensions/gsd/auto-verification.ts +225 -3
  409. package/src/resources/extensions/gsd/auto.ts +72 -16
  410. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
  411. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +52 -2
  412. package/src/resources/extensions/gsd/commands/catalog.ts +26 -1
  413. package/src/resources/extensions/gsd/commands/handlers/ops.ts +25 -0
  414. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
  415. package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
  416. package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
  417. package/src/resources/extensions/gsd/commands-do.ts +109 -0
  418. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  419. package/src/resources/extensions/gsd/commands-handlers.ts +8 -2
  420. package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
  421. package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
  422. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  423. package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
  424. package/src/resources/extensions/gsd/commands-ship.ts +219 -0
  425. package/src/resources/extensions/gsd/db-writer.ts +3 -5
  426. package/src/resources/extensions/gsd/docs/preferences-reference.md +15 -2
  427. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  428. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  429. package/src/resources/extensions/gsd/git-service.ts +68 -0
  430. package/src/resources/extensions/gsd/graph-context.ts +212 -0
  431. package/src/resources/extensions/gsd/gsd-db.ts +788 -3
  432. package/src/resources/extensions/gsd/guided-flow.ts +32 -0
  433. package/src/resources/extensions/gsd/index.ts +18 -2
  434. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  435. package/src/resources/extensions/gsd/journal.ts +30 -0
  436. package/src/resources/extensions/gsd/md-importer.ts +3 -5
  437. package/src/resources/extensions/gsd/memory-store.ts +31 -62
  438. package/src/resources/extensions/gsd/metrics.ts +26 -0
  439. package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
  440. package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
  441. package/src/resources/extensions/gsd/notification-widget.ts +2 -2
  442. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  443. package/src/resources/extensions/gsd/preferences-models.ts +61 -3
  444. package/src/resources/extensions/gsd/preferences-types.ts +44 -0
  445. package/src/resources/extensions/gsd/preferences-validation.ts +130 -2
  446. package/src/resources/extensions/gsd/preferences.ts +28 -0
  447. package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
  448. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  449. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  450. package/src/resources/extensions/gsd/state.ts +80 -17
  451. package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  452. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +9 -5
  453. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  454. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +53 -0
  455. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  456. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +51 -2
  457. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  458. package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
  459. package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
  460. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  461. package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
  462. package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
  463. package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
  464. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -0
  465. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +142 -0
  466. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  467. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  468. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +42 -0
  469. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -2
  470. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -2
  471. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +68 -8
  472. package/src/resources/extensions/gsd/tests/derive-state.test.ts +3 -3
  473. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
  474. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  475. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +137 -1
  476. package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
  477. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  478. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  479. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  480. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +68 -1
  481. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  482. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  483. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +91 -2
  484. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
  485. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  486. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  487. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  488. package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -0
  489. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  490. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
  491. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +5 -7
  492. package/src/resources/extensions/gsd/tests/token-profile.test.ts +9 -6
  493. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  494. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  495. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  496. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  497. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  498. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  499. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  500. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  501. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  502. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  503. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +179 -0
  504. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  505. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +223 -0
  506. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
  507. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  508. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
  509. package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
  510. package/src/resources/extensions/gsd/types.ts +14 -1
  511. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  512. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  513. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  514. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  515. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  516. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  517. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  518. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  519. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  520. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  521. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  522. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  523. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  524. package/src/resources/extensions/gsd/workflow-manifest.ts +9 -104
  525. package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
  526. package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
  527. package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
  528. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  529. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  530. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  531. package/packages/pi-ai/dist/models.generated.js +0 -14343
  532. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  533. package/packages/pi-ai/src/models.generated.ts +0 -14345
  534. /package/dist/web/standalone/.next/static/{cGmbVq2su4f9tMpgIkG8u → tqdo0yKKYz6fJXQnIgbdx}/_buildManifest.js +0 -0
  535. /package/dist/web/standalone/.next/static/{cGmbVq2su4f9tMpgIkG8u → tqdo0yKKYz6fJXQnIgbdx}/_ssgManifest.js +0 -0
@@ -12,6 +12,7 @@ import { importExtensionModule, type ExtensionAPI, type ExtensionContext } from
12
12
  import type { AutoSession, SidecarItem } from "./session.js";
13
13
  import type { LoopDeps } from "./loop-deps.js";
14
14
  import type { PostUnitContext, PreVerificationOpts } from "../auto-post-unit.js";
15
+ import type { Phase } from "../types.js";
15
16
  import {
16
17
  MAX_RECOVERY_CHARS,
17
18
  BUDGET_THRESHOLDS,
@@ -30,7 +31,15 @@ import { MergeConflictError } from "../git-service.js";
30
31
  import { setCurrentPhase, clearCurrentPhase } from "../../shared/gsd-phase-state.js";
31
32
  import { join, basename, dirname, parse as parsePath } from "node:path";
32
33
  import { existsSync, cpSync, readdirSync } from "node:fs";
33
- import { logWarning, logError } from "../workflow-logger.js";
34
+ import {
35
+ logWarning,
36
+ logError,
37
+ _resetLogs,
38
+ drainLogs,
39
+ drainAndSummarize,
40
+ formatForNotification,
41
+ hasAnyIssues,
42
+ } from "../workflow-logger.js";
34
43
  import { gsdRoot } from "../paths.js";
35
44
  import { atomicWriteSync } from "../atomic-write.js";
36
45
  import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationSteps } from "../auto-recovery.js";
@@ -39,6 +48,9 @@ import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "
39
48
  import { getEligibleSlices } from "../slice-parallel-eligibility.js";
40
49
  import { startSliceParallel } from "../slice-parallel-orchestrator.js";
41
50
  import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
51
+ import { ensurePlanV2Graph } from "../uok/plan-v2.js";
52
+ import { resolveUokFlags } from "../uok/flags.js";
53
+ import { UokGateRunner } from "../uok/gate-runner.js";
42
54
  import { resetEvidence } from "../safety/evidence-collector.js";
43
55
  import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
44
56
  import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
@@ -69,6 +81,17 @@ export function _resolveDispatchGuardBasePath(
69
81
  return s.originalBasePath || s.basePath;
70
82
  }
71
83
 
84
+ const PLAN_V2_GATE_PHASES: ReadonlySet<Phase> = new Set([
85
+ "executing",
86
+ "summarizing",
87
+ "validating-milestone",
88
+ "completing-milestone",
89
+ ]);
90
+
91
+ function shouldRunPlanV2Gate(phase: Phase): boolean {
92
+ return PLAN_V2_GATE_PHASES.has(phase);
93
+ }
94
+
72
95
  /**
73
96
  * Generate and write an HTML milestone report snapshot.
74
97
  * Extracted from the milestone-transition block in autoLoop.
@@ -159,6 +182,29 @@ async function closeoutAndStop(
159
182
  await deps.stopAuto(ctx, pi, reason);
160
183
  }
161
184
 
185
+ async function emitCancelledUnitEnd(
186
+ ic: IterationContext,
187
+ unitType: string,
188
+ unitId: string,
189
+ unitStartSeq: number,
190
+ errorContext?: { message: string; category: string; stopReason?: string; isTransient?: boolean; retryAfterMs?: number },
191
+ ): Promise<void> {
192
+ ic.deps.emitJournalEvent({
193
+ ts: new Date().toISOString(),
194
+ flowId: ic.flowId,
195
+ seq: ic.nextSeq(),
196
+ eventType: "unit-end",
197
+ data: {
198
+ unitType,
199
+ unitId,
200
+ status: "cancelled",
201
+ artifactVerified: false,
202
+ ...(errorContext ? { errorContext } : {}),
203
+ },
204
+ causedBy: { flowId: ic.flowId, seq: unitStartSeq },
205
+ });
206
+ }
207
+
162
208
  // ─── runPreDispatch ───────────────────────────────────────────────────────────
163
209
 
164
210
  /**
@@ -171,14 +217,60 @@ export async function runPreDispatch(
171
217
  loopState: LoopState,
172
218
  ): Promise<PhaseResult<PreDispatchData>> {
173
219
  const { ctx, pi, s, deps, prefs } = ic;
220
+ const uokFlags = resolveUokFlags(prefs);
221
+ const runPreDispatchGate = async (input: {
222
+ gateId: string;
223
+ gateType: string;
224
+ outcome: "pass" | "fail" | "retry" | "manual-attention";
225
+ failureClass: "none" | "policy" | "input" | "execution" | "artifact" | "verification" | "closeout" | "git" | "timeout" | "manual-attention" | "unknown";
226
+ rationale: string;
227
+ findings?: string;
228
+ milestoneId?: string;
229
+ }): Promise<void> => {
230
+ if (!uokFlags.gates) return;
231
+ const gateRunner = new UokGateRunner();
232
+ gateRunner.register({
233
+ id: input.gateId,
234
+ type: input.gateType,
235
+ execute: async () => ({
236
+ outcome: input.outcome,
237
+ failureClass: input.failureClass,
238
+ rationale: input.rationale,
239
+ findings: input.findings ?? "",
240
+ }),
241
+ });
242
+ await gateRunner.run(input.gateId, {
243
+ basePath: s.basePath,
244
+ traceId: `pre-dispatch:${ic.flowId}`,
245
+ turnId: `iter-${ic.iteration}`,
246
+ milestoneId: input.milestoneId ?? s.currentMilestoneId ?? undefined,
247
+ unitType: "pre-dispatch",
248
+ unitId: `iter-${ic.iteration}`,
249
+ });
250
+ };
174
251
 
175
252
  // Resource version guard
176
253
  const staleMsg = deps.checkResourcesStale(s.resourceVersionOnStart);
177
254
  if (staleMsg) {
255
+ await runPreDispatchGate({
256
+ gateId: "resource-version-guard",
257
+ gateType: "policy",
258
+ outcome: "fail",
259
+ failureClass: "policy",
260
+ rationale: "resource version guard blocked dispatch",
261
+ findings: staleMsg,
262
+ });
178
263
  await deps.stopAuto(ctx, pi, staleMsg);
179
264
  debugLog("autoLoop", { phase: "exit", reason: "resources-stale" });
180
265
  return { action: "break", reason: "resources-stale" };
181
266
  }
267
+ await runPreDispatchGate({
268
+ gateId: "resource-version-guard",
269
+ gateType: "policy",
270
+ outcome: "pass",
271
+ failureClass: "none",
272
+ rationale: "resource version guard passed",
273
+ });
182
274
 
183
275
  deps.invalidateAllCaches();
184
276
  s.lastPromptCharCount = undefined;
@@ -194,6 +286,14 @@ export async function runPreDispatch(
194
286
  );
195
287
  }
196
288
  if (!healthGate.proceed) {
289
+ await runPreDispatchGate({
290
+ gateId: "pre-dispatch-health-gate",
291
+ gateType: "execution",
292
+ outcome: "manual-attention",
293
+ failureClass: "manual-attention",
294
+ rationale: "pre-dispatch health gate blocked dispatch",
295
+ findings: healthGate.reason,
296
+ });
197
297
  ctx.ui.notify(
198
298
  healthGate.reason || "Pre-dispatch health check failed — run /gsd doctor for details.",
199
299
  "error",
@@ -202,7 +302,23 @@ export async function runPreDispatch(
202
302
  debugLog("autoLoop", { phase: "exit", reason: "health-gate-failed" });
203
303
  return { action: "break", reason: "health-gate-failed" };
204
304
  }
305
+ await runPreDispatchGate({
306
+ gateId: "pre-dispatch-health-gate",
307
+ gateType: "execution",
308
+ outcome: "pass",
309
+ failureClass: "none",
310
+ rationale: "pre-dispatch health gate passed",
311
+ findings: healthGate.fixesApplied.length > 0 ? healthGate.fixesApplied.join(", ") : "",
312
+ });
205
313
  } catch (e) {
314
+ await runPreDispatchGate({
315
+ gateId: "pre-dispatch-health-gate",
316
+ gateType: "execution",
317
+ outcome: "manual-attention",
318
+ failureClass: "manual-attention",
319
+ rationale: "pre-dispatch health gate threw unexpectedly",
320
+ findings: String(e),
321
+ });
206
322
  logWarning("engine", "Pre-dispatch health gate threw unexpectedly", { error: String(e) });
207
323
  }
208
324
 
@@ -221,6 +337,32 @@ export async function runPreDispatch(
221
337
 
222
338
  // Derive state
223
339
  let state = await deps.deriveState(s.basePath);
340
+ if (prefs?.uok?.plan_v2?.enabled && shouldRunPlanV2Gate(state.phase)) {
341
+ const compiled = ensurePlanV2Graph(s.basePath, state);
342
+ if (!compiled.ok) {
343
+ const reason = compiled.reason ?? "Plan v2 compilation failed";
344
+ await runPreDispatchGate({
345
+ gateId: "plan-v2-gate",
346
+ gateType: "policy",
347
+ outcome: "manual-attention",
348
+ failureClass: "manual-attention",
349
+ rationale: "plan v2 compile gate failed",
350
+ findings: reason,
351
+ milestoneId: state.activeMilestone?.id ?? undefined,
352
+ });
353
+ ctx.ui.notify(`Plan gate failed-closed: ${reason}`, "error");
354
+ await deps.pauseAuto(ctx, pi);
355
+ return { action: "break", reason: "plan-v2-gate-failed" };
356
+ }
357
+ await runPreDispatchGate({
358
+ gateId: "plan-v2-gate",
359
+ gateType: "policy",
360
+ outcome: "pass",
361
+ failureClass: "none",
362
+ rationale: "plan v2 compile gate passed",
363
+ milestoneId: state.activeMilestone?.id ?? undefined,
364
+ });
365
+ }
224
366
  deps.syncCmuxSidebar(prefs, state);
225
367
  let mid = state.activeMilestone?.id;
226
368
  let midTitle = state.activeMilestone?.title;
@@ -266,7 +408,10 @@ export async function runPreDispatch(
266
408
  s.basePath,
267
409
  mid,
268
410
  eligible,
269
- { maxWorkers: prefs.slice_parallel.max_workers ?? 2 },
411
+ {
412
+ maxWorkers: prefs.slice_parallel.max_workers ?? 2,
413
+ useExecutionGraph: uokFlags.executionGraph,
414
+ },
270
415
  );
271
416
  if (result.started.length > 0) {
272
417
  ctx.ui.notify(
@@ -481,10 +626,13 @@ export async function runPreDispatch(
481
626
  );
482
627
  } else if (state.phase === "blocked") {
483
628
  const blockerMsg = `Blocked: ${state.blockers.join(", ")}`;
484
- await deps.stopAuto(ctx, pi, blockerMsg);
485
- ctx.ui.notify(`${blockerMsg}. Fix and run /gsd auto.`, "warning");
486
- deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention", basename(s.originalBasePath || s.basePath));
487
- deps.logCmuxEvent(prefs, blockerMsg, "error");
629
+ // Pause instead of hard-stop so the session is resumable with `/gsd auto`.
630
+ // Hard-stop here was causing premature termination when slice dependencies
631
+ // were temporarily unresolvable (e.g. after reassessment added new slices).
632
+ await deps.pauseAuto(ctx, pi);
633
+ ctx.ui.notify(`${blockerMsg}. Fix and run /gsd auto to resume.`, "warning");
634
+ deps.sendDesktopNotification("GSD", blockerMsg, "warning", "attention", basename(s.originalBasePath || s.basePath));
635
+ deps.logCmuxEvent(prefs, blockerMsg, "warning");
488
636
  } else {
489
637
  const ids = incomplete.map((m: { id: string }) => m.id).join(", ");
490
638
  const diag = `basePath=${s.basePath}, milestones=[${state.registry.map((m: { id: string; status: string }) => `${m.id}:${m.status}`).join(", ")}], phase=${state.phase}`;
@@ -583,13 +731,23 @@ export async function runPreDispatch(
583
731
  return { action: "break", reason: "milestone-complete" };
584
732
  }
585
733
 
586
- // Terminal: blocked
734
+ // Terminal: blocked — pause instead of hard-stop so the session is resumable.
587
735
  if (state.phase === "blocked") {
588
736
  const blockerMsg = `Blocked: ${state.blockers.join(", ")}`;
589
- await closeoutAndStop(ctx, pi, s, deps, blockerMsg);
590
- ctx.ui.notify(`${blockerMsg}. Fix and run /gsd auto.`, "warning");
591
- deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention", basename(s.originalBasePath || s.basePath));
592
- deps.logCmuxEvent(prefs, blockerMsg, "error");
737
+ if (s.currentUnit) {
738
+ await deps.closeoutUnit(
739
+ ctx,
740
+ s.basePath,
741
+ s.currentUnit.type,
742
+ s.currentUnit.id,
743
+ s.currentUnit.startedAt,
744
+ deps.buildSnapshotOpts(s.currentUnit.type, s.currentUnit.id),
745
+ );
746
+ }
747
+ await deps.pauseAuto(ctx, pi);
748
+ ctx.ui.notify(`${blockerMsg}. Fix and run /gsd auto to resume.`, "warning");
749
+ deps.sendDesktopNotification("GSD", blockerMsg, "warning", "attention", basename(s.originalBasePath || s.basePath));
750
+ deps.logCmuxEvent(prefs, blockerMsg, "warning");
593
751
  debugLog("autoLoop", { phase: "exit", reason: "blocked" });
594
752
  deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "terminal", data: { reason: "blocked", blockers: state.blockers } });
595
753
  return { action: "break", reason: "blocked" };
@@ -1068,7 +1226,13 @@ export async function runUnitPhase(
1068
1226
  );
1069
1227
  const previousTier = s.currentUnitRouting?.tier;
1070
1228
 
1229
+ // Scope workflow-logger buffer to this unit so post-finalize drains are
1230
+ // per-unit. Without this, the module-level _buffer accumulates across every
1231
+ // unit in the same Node process (see workflow-logger.ts module header).
1232
+ _resetLogs();
1071
1233
  s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
1234
+ s.lastGitActionFailure = null;
1235
+ s.lastGitActionStatus = null;
1072
1236
  setCurrentPhase(unitType);
1073
1237
  s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
1074
1238
  const unitStartSeq = ic.nextSeq();
@@ -1334,6 +1498,7 @@ export async function runUnitPhase(
1334
1498
  // Provider-error pause: pauseAuto already handled cleanup and scheduled
1335
1499
  // recovery. Don't hard-stop — just break out of the loop (#2762).
1336
1500
  if (unitResult.errorContext?.category === "provider") {
1501
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1337
1502
  debugLog("autoLoop", { phase: "exit", reason: "provider-pause", isTransient: unitResult.errorContext.isTransient });
1338
1503
  return { action: "break", reason: "provider-pause" };
1339
1504
  }
@@ -1352,9 +1517,23 @@ export async function runUnitPhase(
1352
1517
  );
1353
1518
  debugLog("autoLoop", { phase: "session-timeout-pause", unitType, unitId });
1354
1519
  await deps.pauseAuto(ctx, pi);
1520
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
1521
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1355
1522
  return { action: "break", reason: "session-timeout" };
1356
1523
  }
1357
1524
  // All other cancelled states (structural errors, non-transient failures): hard stop
1525
+ if (s.currentUnit) {
1526
+ await deps.closeoutUnit(
1527
+ ctx,
1528
+ s.basePath,
1529
+ unitType,
1530
+ unitId,
1531
+ s.currentUnit.startedAt,
1532
+ deps.buildSnapshotOpts(unitType, unitId),
1533
+ );
1534
+ }
1535
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
1536
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1358
1537
  ctx.ui.notify(
1359
1538
  `Session creation failed for ${unitType} ${unitId}: ${unitResult.errorContext?.message ?? "unknown"}. Stopping auto-mode.`,
1360
1539
  "warning",
@@ -1532,6 +1711,9 @@ export async function runFinalize(
1532
1711
  // cannot mutate state for the next unit (#3757).
1533
1712
  s.currentUnit = null;
1534
1713
  clearCurrentPhase();
1714
+ // Drop any logger entries from the timed-out unit so they don't bleed
1715
+ // into the next iteration's drain.
1716
+ drainLogs();
1535
1717
  loopState.consecutiveFinalizeTimeouts++;
1536
1718
  debugLog("autoLoop", {
1537
1719
  phase: "pre-verification-timeout",
@@ -1559,11 +1741,15 @@ export async function runFinalize(
1559
1741
 
1560
1742
  const preResult = preResultGuard.value;
1561
1743
  if (preResult === "dispatched") {
1744
+ const dispatchedReason = s.lastGitActionFailure
1745
+ ? "git-closeout-failure"
1746
+ : "pre-verification-dispatched";
1562
1747
  debugLog("autoLoop", {
1563
1748
  phase: "exit",
1564
- reason: "pre-verification-dispatched",
1749
+ reason: dispatchedReason,
1750
+ gitError: s.lastGitActionFailure ?? undefined,
1565
1751
  });
1566
- return { action: "break", reason: "pre-verification-dispatched" };
1752
+ return { action: "break", reason: dispatchedReason };
1567
1753
  }
1568
1754
  if (preResult === "retry") {
1569
1755
  if (sidecarItem) {
@@ -1630,6 +1816,9 @@ export async function runFinalize(
1630
1816
  // cannot mutate state for the next unit (#3757).
1631
1817
  s.currentUnit = null;
1632
1818
  clearCurrentPhase();
1819
+ // Drop any logger entries from the timed-out unit so they don't bleed
1820
+ // into the next iteration's drain.
1821
+ drainLogs();
1633
1822
  loopState.consecutiveFinalizeTimeouts++;
1634
1823
  debugLog("autoLoop", {
1635
1824
  phase: "post-verification-timeout",
@@ -1674,5 +1863,16 @@ export async function runFinalize(
1674
1863
  // Both pre and post verification completed without timeout — reset counter
1675
1864
  loopState.consecutiveFinalizeTimeouts = 0;
1676
1865
 
1866
+ // Surface accumulated workflow-logger issues for this unit to the user.
1867
+ // Warnings/errors logged during the unit are buffered in the logger and
1868
+ // drained here so the user sees a single consolidated post-unit alert.
1869
+ if (hasAnyIssues()) {
1870
+ const { logs } = drainAndSummarize();
1871
+ if (logs.length > 0) {
1872
+ const severity = logs.some((e) => e.severity === "error") ? "error" : "warning";
1873
+ ctx.ui.notify(formatForNotification(logs), severity);
1874
+ }
1875
+ }
1876
+
1677
1877
  return { action: "next", data: undefined as void };
1678
1878
  }
@@ -106,6 +106,8 @@ export class AutoSession {
106
106
 
107
107
  // ── Current unit ─────────────────────────────────────────────────────────
108
108
  currentUnit: CurrentUnit | null = null;
109
+ currentTraceId: string | null = null;
110
+ currentTurnId: string | null = null;
109
111
  currentUnitRouting: UnitRouting | null = null;
110
112
  currentMilestoneId: string | null = null;
111
113
 
@@ -137,6 +139,10 @@ export class AutoSession {
137
139
  /** Set when a GSD tool execution ends with isError due to malformed/truncated
138
140
  * JSON arguments. Checked by postUnitPreVerification to break retry loops. */
139
141
  lastToolInvocationError: string | null = null;
142
+ /** Set when turn-level git action fails during closeout. */
143
+ lastGitActionFailure: string | null = null;
144
+ /** Last turn-level git action status captured during finalize. */
145
+ lastGitActionStatus: "ok" | "failed" | null = null;
140
146
 
141
147
  // ── Isolation degradation ────────────────────────────────────────────
142
148
  /** Set to true when worktree creation fails; prevents merge of nonexistent branch. */
@@ -219,6 +225,8 @@ export class AutoSession {
219
225
 
220
226
  // Unit
221
227
  this.currentUnit = null;
228
+ this.currentTraceId = null;
229
+ this.currentTurnId = null;
222
230
  this.currentUnitRouting = null;
223
231
  this.currentMilestoneId = null;
224
232
 
@@ -250,6 +258,8 @@ export class AutoSession {
250
258
  this.rewriteAttemptCount = 0;
251
259
  this.consecutiveCompleteBootstraps = 0;
252
260
  this.lastToolInvocationError = null;
261
+ this.lastGitActionFailure = null;
262
+ this.lastGitActionStatus = null;
253
263
  this.isolationDegraded = false;
254
264
  this.milestoneMergedInPhases = false;
255
265
  this.checkpointSha = null;
@@ -53,6 +53,8 @@ import {
53
53
  checkNeedsRunUat,
54
54
  } from "./auto-prompts.js";
55
55
  import { resolveModelWithFallbacksForUnit } from "./preferences-models.js";
56
+ import { resolveUokFlags } from "./uok/flags.js";
57
+ import { selectReactiveDispatchBatch } from "./uok/execution-graph.js";
56
58
 
57
59
  // ─── Types ────────────────────────────────────────────────────────────────
58
60
 
@@ -307,8 +309,11 @@ export const DISPATCH_RULES: DispatchRule[] = [
307
309
  {
308
310
  name: "reassess-roadmap (post-completion)",
309
311
  match: async ({ state, mid, midTitle, basePath, prefs }) => {
310
- if (prefs?.phases?.skip_reassess || !prefs?.phases?.reassess_after_slice)
311
- return null;
312
+ if (prefs?.phases?.skip_reassess) return null;
313
+ // Default reassess_after_slice to true — reassessment after slice completion
314
+ // is essential for roadmap integrity. Opt-out via explicit `false`.
315
+ const reassessEnabled = prefs?.phases?.reassess_after_slice ?? true;
316
+ if (!reassessEnabled) return null;
312
317
  const needsReassess = await checkNeedsReassessment(basePath, mid, state);
313
318
  if (!needsReassess) return null;
314
319
  return {
@@ -581,12 +586,20 @@ export const DISPATCH_RULES: DispatchRule[] = [
581
586
  // Only activate reactive dispatch when >1 task is ready
582
587
  if (readyIds.length <= 1) return null;
583
588
 
584
- const selected = chooseNonConflictingSubset(
585
- readyIds,
586
- graph,
587
- maxParallel,
588
- new Set(),
589
- );
589
+ const uokFlags = resolveUokFlags(prefs);
590
+ const selected = uokFlags.executionGraph
591
+ ? selectReactiveDispatchBatch({
592
+ graph,
593
+ readyIds,
594
+ maxParallel,
595
+ inFlightOutputs: new Set(),
596
+ }).selected
597
+ : chooseNonConflictingSubset(
598
+ readyIds,
599
+ graph,
600
+ maxParallel,
601
+ new Set(),
602
+ );
590
603
  if (selected.length <= 1) return null;
591
604
 
592
605
  // Log graph metrics for observability
@@ -877,11 +890,14 @@ export async function resolveDispatch(
877
890
  }
878
891
  }
879
892
 
880
- // No rule matched — unhandled phase
893
+ // No rule matched — unhandled phase.
894
+ // Use level "warning" so the loop pauses (resumable) instead of hard-stopping.
895
+ // Hard-stop here was causing premature termination for transient phase gaps
896
+ // (e.g. after reassessment modifies the roadmap and state needs re-derivation).
881
897
  return {
882
898
  action: "stop",
883
899
  reason: `Unhandled phase "${ctx.state.phase}" — run /gsd doctor to diagnose.`,
884
- level: "info",
900
+ level: "warning",
885
901
  matchedRule: "<no-match>",
886
902
  };
887
903
  }