gsd-pi 2.74.0-dev.2b524c3 → 2.74.0-dev.703eabc

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 (484) hide show
  1. package/dist/cli.js +85 -0
  2. package/dist/headless-query.js +4 -1
  3. package/dist/help-text.js +23 -0
  4. package/dist/resources/extensions/gsd/activity-log.js +16 -0
  5. package/dist/resources/extensions/gsd/auto/detect-stuck.js +11 -4
  6. package/dist/resources/extensions/gsd/auto/loop.js +147 -10
  7. package/dist/resources/extensions/gsd/auto/phases.js +158 -4
  8. package/dist/resources/extensions/gsd/auto/session.js +10 -0
  9. package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
  10. package/dist/resources/extensions/gsd/auto-model-selection.js +51 -5
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +220 -17
  12. package/dist/resources/extensions/gsd/auto-prompts.js +12 -0
  13. package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
  14. package/dist/resources/extensions/gsd/auto-verification.js +100 -2
  15. package/dist/resources/extensions/gsd/auto.js +36 -4
  16. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
  17. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +45 -4
  18. package/dist/resources/extensions/gsd/commands/catalog.js +26 -1
  19. package/dist/resources/extensions/gsd/commands/handlers/ops.js +25 -0
  20. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +68 -9
  21. package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
  22. package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
  23. package/dist/resources/extensions/gsd/commands-do.js +79 -0
  24. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  25. package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
  26. package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
  27. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  28. package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
  29. package/dist/resources/extensions/gsd/commands-ship.js +187 -0
  30. package/dist/resources/extensions/gsd/db-writer.js +3 -5
  31. package/dist/resources/extensions/gsd/docs/preferences-reference.md +14 -1
  32. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  33. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  34. package/dist/resources/extensions/gsd/git-service.js +49 -1
  35. package/dist/resources/extensions/gsd/graph-context.js +157 -0
  36. package/dist/resources/extensions/gsd/gsd-db.js +581 -2
  37. package/dist/resources/extensions/gsd/guided-flow.js +23 -0
  38. package/dist/resources/extensions/gsd/index.js +15 -2
  39. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  40. package/dist/resources/extensions/gsd/journal.js +27 -0
  41. package/dist/resources/extensions/gsd/md-importer.js +3 -4
  42. package/dist/resources/extensions/gsd/memory-store.js +19 -51
  43. package/dist/resources/extensions/gsd/metrics.js +19 -0
  44. package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
  45. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -4
  46. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  47. package/dist/resources/extensions/gsd/preferences-models.js +20 -3
  48. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  49. package/dist/resources/extensions/gsd/preferences-validation.js +108 -2
  50. package/dist/resources/extensions/gsd/preferences.js +26 -0
  51. package/dist/resources/extensions/gsd/prompts/add-tests.md +35 -0
  52. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  53. package/dist/resources/extensions/gsd/state.js +5 -1
  54. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  55. package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
  56. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  57. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
  58. package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
  59. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  60. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  61. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  62. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  63. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  64. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  65. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  66. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  67. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  68. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  69. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  70. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  71. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  72. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -69
  73. package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
  74. package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
  75. package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
  76. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  77. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  78. package/dist/web/standalone/.next/BUILD_ID +1 -1
  79. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  80. package/dist/web/standalone/.next/build-manifest.json +2 -2
  81. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  82. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  83. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/index.html +1 -1
  104. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  111. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  112. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  114. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  115. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  116. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  117. package/package.json +3 -2
  118. package/packages/daemon/package.json +2 -2
  119. package/packages/mcp-server/dist/index.d.ts +3 -0
  120. package/packages/mcp-server/dist/index.d.ts.map +1 -1
  121. package/packages/mcp-server/dist/index.js +3 -0
  122. package/packages/mcp-server/dist/index.js.map +1 -1
  123. package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
  124. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
  125. package/packages/mcp-server/dist/readers/graph.js +655 -0
  126. package/packages/mcp-server/dist/readers/graph.js.map +1 -0
  127. package/packages/mcp-server/dist/readers/index.d.ts +2 -0
  128. package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
  129. package/packages/mcp-server/dist/readers/index.js +1 -0
  130. package/packages/mcp-server/dist/readers/index.js.map +1 -1
  131. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  132. package/packages/mcp-server/dist/server.js +65 -0
  133. package/packages/mcp-server/dist/server.js.map +1 -1
  134. package/packages/mcp-server/package.json +2 -2
  135. package/packages/mcp-server/src/index.ts +15 -0
  136. package/packages/mcp-server/src/readers/graph.test.ts +604 -0
  137. package/packages/mcp-server/src/readers/graph.ts +855 -0
  138. package/packages/mcp-server/src/readers/index.ts +12 -0
  139. package/packages/mcp-server/src/server.ts +83 -0
  140. package/packages/mcp-server/tsconfig.json +1 -0
  141. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
  142. package/packages/native/package.json +2 -2
  143. package/packages/native/tsconfig.tsbuildinfo +1 -0
  144. package/packages/pi-agent-core/package.json +1 -1
  145. package/packages/pi-agent-core/tsconfig.json +1 -0
  146. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
  147. package/packages/pi-ai/dist/index.d.ts +1 -9
  148. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  149. package/packages/pi-ai/dist/index.js +1 -9
  150. package/packages/pi-ai/dist/index.js.map +1 -1
  151. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  152. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  153. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  154. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  155. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  156. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  157. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  158. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  159. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  160. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  161. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  162. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  163. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  164. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  165. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  166. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  167. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  168. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  169. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  170. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  171. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  172. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  173. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  174. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  175. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  176. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  177. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  178. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  179. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  180. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  181. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  182. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  183. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  184. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  185. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  186. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  187. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  188. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  189. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  190. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  191. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  192. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  193. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  194. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  195. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  196. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  197. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  198. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  199. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  200. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  201. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  202. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  203. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  204. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  205. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  206. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  207. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  208. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  209. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  210. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  211. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  212. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  213. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  214. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  215. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  216. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  217. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  218. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  219. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  220. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  221. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  222. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  223. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  224. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  225. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  226. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  227. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  228. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  229. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  230. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  231. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  232. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  233. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  234. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  235. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  236. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  237. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  238. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  239. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  240. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  241. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  242. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  243. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  244. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  245. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  246. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  247. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  248. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  249. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  250. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  251. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  252. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  253. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  254. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  255. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  256. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  257. package/packages/pi-ai/dist/models/index.js +80 -0
  258. package/packages/pi-ai/dist/models/index.js.map +1 -0
  259. package/packages/pi-ai/dist/models.d.ts +1 -36
  260. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  261. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  262. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  263. package/packages/pi-ai/dist/models.js +3 -112
  264. package/packages/pi-ai/dist/models.js.map +1 -1
  265. package/packages/pi-ai/dist/models.test.js +6 -5
  266. package/packages/pi-ai/dist/models.test.js.map +1 -1
  267. package/packages/pi-ai/package.json +1 -1
  268. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  269. package/packages/pi-ai/src/index.ts +1 -9
  270. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  271. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  272. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  273. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  274. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  275. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  276. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  277. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  278. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  279. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  280. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  281. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  282. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  283. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  284. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  285. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  286. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  287. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  288. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  289. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  290. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  291. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  292. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  293. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  294. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  295. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  296. package/packages/pi-ai/src/models/index.ts +106 -0
  297. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  298. package/packages/pi-ai/src/models.test.ts +6 -5
  299. package/packages/pi-ai/src/models.ts +3 -153
  300. package/packages/pi-ai/tsconfig.json +1 -0
  301. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
  302. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
  304. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
  306. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  308. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  310. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  313. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
  315. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +47 -0
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
  324. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +51 -8
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
  332. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  334. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  335. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  336. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  337. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +13 -0
  338. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +53 -6
  340. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  341. package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
  342. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
  343. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  344. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  345. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
  346. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
  347. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +67 -0
  348. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +66 -7
  349. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
  350. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
  351. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  352. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +73 -6
  353. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  354. package/packages/pi-coding-agent/tsconfig.json +3 -2
  355. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
  356. package/packages/pi-tui/package.json +1 -1
  357. package/packages/pi-tui/tsconfig.json +1 -0
  358. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
  359. package/packages/rpc-client/package.json +1 -1
  360. package/packages/rpc-client/tsconfig.json +1 -0
  361. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
  362. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  363. package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
  364. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
  365. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  366. package/src/resources/extensions/gsd/auto/phases.ts +191 -4
  367. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  368. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
  369. package/src/resources/extensions/gsd/auto-model-selection.ts +66 -5
  370. package/src/resources/extensions/gsd/auto-post-unit.ts +238 -18
  371. package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
  372. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  373. package/src/resources/extensions/gsd/auto-verification.ts +129 -2
  374. package/src/resources/extensions/gsd/auto.ts +41 -2
  375. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
  376. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +56 -3
  377. package/src/resources/extensions/gsd/commands/catalog.ts +26 -1
  378. package/src/resources/extensions/gsd/commands/handlers/ops.ts +25 -0
  379. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
  380. package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
  381. package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
  382. package/src/resources/extensions/gsd/commands-do.ts +109 -0
  383. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  384. package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
  385. package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
  386. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  387. package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
  388. package/src/resources/extensions/gsd/commands-ship.ts +219 -0
  389. package/src/resources/extensions/gsd/db-writer.ts +3 -5
  390. package/src/resources/extensions/gsd/docs/preferences-reference.md +14 -1
  391. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  392. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  393. package/src/resources/extensions/gsd/git-service.ts +68 -0
  394. package/src/resources/extensions/gsd/graph-context.ts +212 -0
  395. package/src/resources/extensions/gsd/gsd-db.ts +788 -3
  396. package/src/resources/extensions/gsd/guided-flow.ts +32 -0
  397. package/src/resources/extensions/gsd/index.ts +18 -2
  398. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  399. package/src/resources/extensions/gsd/journal.ts +30 -0
  400. package/src/resources/extensions/gsd/md-importer.ts +3 -5
  401. package/src/resources/extensions/gsd/memory-store.ts +31 -62
  402. package/src/resources/extensions/gsd/metrics.ts +26 -0
  403. package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
  404. package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
  405. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  406. package/src/resources/extensions/gsd/preferences-models.ts +20 -3
  407. package/src/resources/extensions/gsd/preferences-types.ts +32 -0
  408. package/src/resources/extensions/gsd/preferences-validation.ts +107 -2
  409. package/src/resources/extensions/gsd/preferences.ts +28 -0
  410. package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
  411. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  412. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  413. package/src/resources/extensions/gsd/state.ts +9 -2
  414. package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  415. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
  416. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  417. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  418. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  419. package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
  420. package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
  421. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  422. package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
  423. package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
  424. package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
  425. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -0
  426. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  427. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  428. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
  429. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  430. package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
  431. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  432. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  433. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +68 -1
  434. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  435. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  436. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
  437. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  438. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  439. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  440. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  441. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
  442. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
  443. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  444. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  445. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  446. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  447. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  448. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  449. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  450. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  451. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  452. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  453. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  454. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +223 -0
  455. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
  456. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  457. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
  458. package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
  459. package/src/resources/extensions/gsd/types.ts +14 -1
  460. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  461. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  462. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  463. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  464. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  465. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  466. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  467. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  468. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  469. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  470. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  471. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  472. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  473. package/src/resources/extensions/gsd/workflow-manifest.ts +9 -104
  474. package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
  475. package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
  476. package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
  477. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  478. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  479. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  480. package/packages/pi-ai/dist/models.generated.js +0 -14343
  481. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  482. package/packages/pi-ai/src/models.generated.ts +0 -14345
  483. /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → 3U-oZ5FT59BM7sm2GInic}/_buildManifest.js +0 -0
  484. /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → 3U-oZ5FT59BM7sm2GInic}/_ssgManifest.js +0 -0
@@ -16,7 +16,7 @@ import { MergeConflictError } from "../git-service.js";
16
16
  import { setCurrentPhase, clearCurrentPhase } from "../../shared/gsd-phase-state.js";
17
17
  import { join, basename, dirname, parse as parsePath } from "node:path";
18
18
  import { existsSync, cpSync, readdirSync } from "node:fs";
19
- import { logWarning, logError } from "../workflow-logger.js";
19
+ import { logWarning, logError, _resetLogs, drainLogs, drainAndSummarize, formatForNotification, hasAnyIssues, } from "../workflow-logger.js";
20
20
  import { gsdRoot } from "../paths.js";
21
21
  import { atomicWriteSync } from "../atomic-write.js";
22
22
  import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationSteps } from "../auto-recovery.js";
@@ -25,6 +25,9 @@ import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "
25
25
  import { getEligibleSlices } from "../slice-parallel-eligibility.js";
26
26
  import { startSliceParallel } from "../slice-parallel-orchestrator.js";
27
27
  import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
28
+ import { ensurePlanV2Graph } from "../uok/plan-v2.js";
29
+ import { resolveUokFlags } from "../uok/flags.js";
30
+ import { UokGateRunner } from "../uok/gate-runner.js";
28
31
  import { resetEvidence } from "../safety/evidence-collector.js";
29
32
  import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
30
33
  import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
@@ -46,6 +49,15 @@ export function _resolveReportBasePath(s) {
46
49
  export function _resolveDispatchGuardBasePath(s) {
47
50
  return s.originalBasePath || s.basePath;
48
51
  }
52
+ const PLAN_V2_GATE_PHASES = new Set([
53
+ "executing",
54
+ "summarizing",
55
+ "validating-milestone",
56
+ "completing-milestone",
57
+ ]);
58
+ function shouldRunPlanV2Gate(phase) {
59
+ return PLAN_V2_GATE_PHASES.has(phase);
60
+ }
49
61
  /**
50
62
  * Generate and write an HTML milestone report snapshot.
51
63
  * Extracted from the milestone-transition block in autoLoop.
@@ -100,6 +112,22 @@ async function closeoutAndStop(ctx, pi, s, deps, reason) {
100
112
  }
101
113
  await deps.stopAuto(ctx, pi, reason);
102
114
  }
115
+ async function emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, errorContext) {
116
+ ic.deps.emitJournalEvent({
117
+ ts: new Date().toISOString(),
118
+ flowId: ic.flowId,
119
+ seq: ic.nextSeq(),
120
+ eventType: "unit-end",
121
+ data: {
122
+ unitType,
123
+ unitId,
124
+ status: "cancelled",
125
+ artifactVerified: false,
126
+ ...(errorContext ? { errorContext } : {}),
127
+ },
128
+ causedBy: { flowId: ic.flowId, seq: unitStartSeq },
129
+ });
130
+ }
103
131
  // ─── runPreDispatch ───────────────────────────────────────────────────────────
104
132
  /**
105
133
  * Phase 1: Pre-dispatch — resource guard, health gate, state derivation,
@@ -108,13 +136,52 @@ async function closeoutAndStop(ctx, pi, s, deps, reason) {
108
136
  */
109
137
  export async function runPreDispatch(ic, loopState) {
110
138
  const { ctx, pi, s, deps, prefs } = ic;
139
+ const uokFlags = resolveUokFlags(prefs);
140
+ const runPreDispatchGate = async (input) => {
141
+ if (!uokFlags.gates)
142
+ return;
143
+ const gateRunner = new UokGateRunner();
144
+ gateRunner.register({
145
+ id: input.gateId,
146
+ type: input.gateType,
147
+ execute: async () => ({
148
+ outcome: input.outcome,
149
+ failureClass: input.failureClass,
150
+ rationale: input.rationale,
151
+ findings: input.findings ?? "",
152
+ }),
153
+ });
154
+ await gateRunner.run(input.gateId, {
155
+ basePath: s.basePath,
156
+ traceId: `pre-dispatch:${ic.flowId}`,
157
+ turnId: `iter-${ic.iteration}`,
158
+ milestoneId: input.milestoneId ?? s.currentMilestoneId ?? undefined,
159
+ unitType: "pre-dispatch",
160
+ unitId: `iter-${ic.iteration}`,
161
+ });
162
+ };
111
163
  // Resource version guard
112
164
  const staleMsg = deps.checkResourcesStale(s.resourceVersionOnStart);
113
165
  if (staleMsg) {
166
+ await runPreDispatchGate({
167
+ gateId: "resource-version-guard",
168
+ gateType: "policy",
169
+ outcome: "fail",
170
+ failureClass: "policy",
171
+ rationale: "resource version guard blocked dispatch",
172
+ findings: staleMsg,
173
+ });
114
174
  await deps.stopAuto(ctx, pi, staleMsg);
115
175
  debugLog("autoLoop", { phase: "exit", reason: "resources-stale" });
116
176
  return { action: "break", reason: "resources-stale" };
117
177
  }
178
+ await runPreDispatchGate({
179
+ gateId: "resource-version-guard",
180
+ gateType: "policy",
181
+ outcome: "pass",
182
+ failureClass: "none",
183
+ rationale: "resource version guard passed",
184
+ });
118
185
  deps.invalidateAllCaches();
119
186
  s.lastPromptCharCount = undefined;
120
187
  s.lastBaselineCharCount = undefined;
@@ -125,13 +192,37 @@ export async function runPreDispatch(ic, loopState) {
125
192
  ctx.ui.notify(`Pre-dispatch: ${healthGate.fixesApplied.join(", ")}`, "info");
126
193
  }
127
194
  if (!healthGate.proceed) {
195
+ await runPreDispatchGate({
196
+ gateId: "pre-dispatch-health-gate",
197
+ gateType: "execution",
198
+ outcome: "manual-attention",
199
+ failureClass: "manual-attention",
200
+ rationale: "pre-dispatch health gate blocked dispatch",
201
+ findings: healthGate.reason,
202
+ });
128
203
  ctx.ui.notify(healthGate.reason || "Pre-dispatch health check failed — run /gsd doctor for details.", "error");
129
204
  await deps.pauseAuto(ctx, pi);
130
205
  debugLog("autoLoop", { phase: "exit", reason: "health-gate-failed" });
131
206
  return { action: "break", reason: "health-gate-failed" };
132
207
  }
208
+ await runPreDispatchGate({
209
+ gateId: "pre-dispatch-health-gate",
210
+ gateType: "execution",
211
+ outcome: "pass",
212
+ failureClass: "none",
213
+ rationale: "pre-dispatch health gate passed",
214
+ findings: healthGate.fixesApplied.length > 0 ? healthGate.fixesApplied.join(", ") : "",
215
+ });
133
216
  }
134
217
  catch (e) {
218
+ await runPreDispatchGate({
219
+ gateId: "pre-dispatch-health-gate",
220
+ gateType: "execution",
221
+ outcome: "manual-attention",
222
+ failureClass: "manual-attention",
223
+ rationale: "pre-dispatch health gate threw unexpectedly",
224
+ findings: String(e),
225
+ });
135
226
  logWarning("engine", "Pre-dispatch health gate threw unexpectedly", { error: String(e) });
136
227
  }
137
228
  // Sync project root artifacts into worktree
@@ -142,6 +233,32 @@ export async function runPreDispatch(ic, loopState) {
142
233
  }
143
234
  // Derive state
144
235
  let state = await deps.deriveState(s.basePath);
236
+ if (prefs?.uok?.plan_v2?.enabled && shouldRunPlanV2Gate(state.phase)) {
237
+ const compiled = ensurePlanV2Graph(s.basePath, state);
238
+ if (!compiled.ok) {
239
+ const reason = compiled.reason ?? "Plan v2 compilation failed";
240
+ await runPreDispatchGate({
241
+ gateId: "plan-v2-gate",
242
+ gateType: "policy",
243
+ outcome: "manual-attention",
244
+ failureClass: "manual-attention",
245
+ rationale: "plan v2 compile gate failed",
246
+ findings: reason,
247
+ milestoneId: state.activeMilestone?.id ?? undefined,
248
+ });
249
+ ctx.ui.notify(`Plan gate failed-closed: ${reason}`, "error");
250
+ await deps.pauseAuto(ctx, pi);
251
+ return { action: "break", reason: "plan-v2-gate-failed" };
252
+ }
253
+ await runPreDispatchGate({
254
+ gateId: "plan-v2-gate",
255
+ gateType: "policy",
256
+ outcome: "pass",
257
+ failureClass: "none",
258
+ rationale: "plan v2 compile gate passed",
259
+ milestoneId: state.activeMilestone?.id ?? undefined,
260
+ });
261
+ }
145
262
  deps.syncCmuxSidebar(prefs, state);
146
263
  let mid = state.activeMilestone?.id;
147
264
  let midTitle = state.activeMilestone?.title;
@@ -177,7 +294,10 @@ export async function runPreDispatch(ic, loopState) {
177
294
  eligibleSlices: eligible.map(e => e.id),
178
295
  });
179
296
  ctx.ui.notify(`Slice-parallel: dispatching ${eligible.length} eligible slices for ${mid}.`, "info");
180
- const result = await startSliceParallel(s.basePath, mid, eligible, { maxWorkers: prefs.slice_parallel.max_workers ?? 2 });
297
+ const result = await startSliceParallel(s.basePath, mid, eligible, {
298
+ maxWorkers: prefs.slice_parallel.max_workers ?? 2,
299
+ useExecutionGraph: uokFlags.executionGraph,
300
+ });
181
301
  if (result.started.length > 0) {
182
302
  ctx.ui.notify(`Slice-parallel: started ${result.started.length} worker(s): ${result.started.join(", ")}.`, "info");
183
303
  await deps.stopAuto(ctx, pi, `Slice-parallel dispatched for ${mid}`);
@@ -776,7 +896,13 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
776
896
  s.currentUnit.type === unitType &&
777
897
  s.currentUnit.id === unitId);
778
898
  const previousTier = s.currentUnitRouting?.tier;
899
+ // Scope workflow-logger buffer to this unit so post-finalize drains are
900
+ // per-unit. Without this, the module-level _buffer accumulates across every
901
+ // unit in the same Node process (see workflow-logger.ts module header).
902
+ _resetLogs();
779
903
  s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
904
+ s.lastGitActionFailure = null;
905
+ s.lastGitActionStatus = null;
780
906
  setCurrentPhase(unitType);
781
907
  s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
782
908
  const unitStartSeq = ic.nextSeq();
@@ -975,6 +1101,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
975
1101
  // Provider-error pause: pauseAuto already handled cleanup and scheduled
976
1102
  // recovery. Don't hard-stop — just break out of the loop (#2762).
977
1103
  if (unitResult.errorContext?.category === "provider") {
1104
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
978
1105
  debugLog("autoLoop", { phase: "exit", reason: "provider-pause", isTransient: unitResult.errorContext.isTransient });
979
1106
  return { action: "break", reason: "provider-pause" };
980
1107
  }
@@ -988,9 +1115,16 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
988
1115
  ctx.ui.notify(`Session creation timed out for ${unitType} ${unitId}. Pausing auto-mode (recoverable).`, "warning");
989
1116
  debugLog("autoLoop", { phase: "session-timeout-pause", unitType, unitId });
990
1117
  await deps.pauseAuto(ctx, pi);
1118
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
1119
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
991
1120
  return { action: "break", reason: "session-timeout" };
992
1121
  }
993
1122
  // All other cancelled states (structural errors, non-transient failures): hard stop
1123
+ if (s.currentUnit) {
1124
+ await deps.closeoutUnit(ctx, s.basePath, unitType, unitId, s.currentUnit.startedAt, deps.buildSnapshotOpts(unitType, unitId));
1125
+ }
1126
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
1127
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
994
1128
  ctx.ui.notify(`Session creation failed for ${unitType} ${unitId}: ${unitResult.errorContext?.message ?? "unknown"}. Stopping auto-mode.`, "warning");
995
1129
  await deps.stopAuto(ctx, pi, `Session creation failed: ${unitResult.errorContext?.message ?? "unknown"}`);
996
1130
  debugLog("autoLoop", { phase: "exit", reason: "session-failed" });
@@ -1124,6 +1258,9 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
1124
1258
  // cannot mutate state for the next unit (#3757).
1125
1259
  s.currentUnit = null;
1126
1260
  clearCurrentPhase();
1261
+ // Drop any logger entries from the timed-out unit so they don't bleed
1262
+ // into the next iteration's drain.
1263
+ drainLogs();
1127
1264
  loopState.consecutiveFinalizeTimeouts++;
1128
1265
  debugLog("autoLoop", {
1129
1266
  phase: "pre-verification-timeout",
@@ -1142,11 +1279,15 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
1142
1279
  }
1143
1280
  const preResult = preResultGuard.value;
1144
1281
  if (preResult === "dispatched") {
1282
+ const dispatchedReason = s.lastGitActionFailure
1283
+ ? "git-closeout-failure"
1284
+ : "pre-verification-dispatched";
1145
1285
  debugLog("autoLoop", {
1146
1286
  phase: "exit",
1147
- reason: "pre-verification-dispatched",
1287
+ reason: dispatchedReason,
1288
+ gitError: s.lastGitActionFailure ?? undefined,
1148
1289
  });
1149
- return { action: "break", reason: "pre-verification-dispatched" };
1290
+ return { action: "break", reason: dispatchedReason };
1150
1291
  }
1151
1292
  if (preResult === "retry") {
1152
1293
  if (sidecarItem) {
@@ -1199,6 +1340,9 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
1199
1340
  // cannot mutate state for the next unit (#3757).
1200
1341
  s.currentUnit = null;
1201
1342
  clearCurrentPhase();
1343
+ // Drop any logger entries from the timed-out unit so they don't bleed
1344
+ // into the next iteration's drain.
1345
+ drainLogs();
1202
1346
  loopState.consecutiveFinalizeTimeouts++;
1203
1347
  debugLog("autoLoop", {
1204
1348
  phase: "post-verification-timeout",
@@ -1230,5 +1374,15 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
1230
1374
  }
1231
1375
  // Both pre and post verification completed without timeout — reset counter
1232
1376
  loopState.consecutiveFinalizeTimeouts = 0;
1377
+ // Surface accumulated workflow-logger issues for this unit to the user.
1378
+ // Warnings/errors logged during the unit are buffered in the logger and
1379
+ // drained here so the user sees a single consolidated post-unit alert.
1380
+ if (hasAnyIssues()) {
1381
+ const { logs } = drainAndSummarize();
1382
+ if (logs.length > 0) {
1383
+ const severity = logs.some((e) => e.severity === "error") ? "error" : "warning";
1384
+ ctx.ui.notify(formatForNotification(logs), severity);
1385
+ }
1386
+ }
1233
1387
  return { action: "next", data: undefined };
1234
1388
  }
@@ -52,6 +52,8 @@ export class AutoSession {
52
52
  continueHereHandle = null;
53
53
  // ── Current unit ─────────────────────────────────────────────────────────
54
54
  currentUnit = null;
55
+ currentTraceId = null;
56
+ currentTurnId = null;
55
57
  currentUnitRouting = null;
56
58
  currentMilestoneId = null;
57
59
  // ── Model state ──────────────────────────────────────────────────────────
@@ -79,6 +81,10 @@ export class AutoSession {
79
81
  /** Set when a GSD tool execution ends with isError due to malformed/truncated
80
82
  * JSON arguments. Checked by postUnitPreVerification to break retry loops. */
81
83
  lastToolInvocationError = null;
84
+ /** Set when turn-level git action fails during closeout. */
85
+ lastGitActionFailure = null;
86
+ /** Last turn-level git action status captured during finalize. */
87
+ lastGitActionStatus = null;
82
88
  // ── Isolation degradation ────────────────────────────────────────────
83
89
  /** Set to true when worktree creation fails; prevents merge of nonexistent branch. */
84
90
  isolationDegraded = false;
@@ -157,6 +163,8 @@ export class AutoSession {
157
163
  this.unitRecoveryCount.clear();
158
164
  // Unit
159
165
  this.currentUnit = null;
166
+ this.currentTraceId = null;
167
+ this.currentTurnId = null;
160
168
  this.currentUnitRouting = null;
161
169
  this.currentMilestoneId = null;
162
170
  // Model
@@ -185,6 +193,8 @@ export class AutoSession {
185
193
  this.rewriteAttemptCount = 0;
186
194
  this.consecutiveCompleteBootstraps = 0;
187
195
  this.lastToolInvocationError = null;
196
+ this.lastGitActionFailure = null;
197
+ this.lastGitActionStatus = null;
188
198
  this.isolationDegraded = false;
189
199
  this.milestoneMergedInPhases = false;
190
200
  this.checkpointSha = null;
@@ -19,6 +19,8 @@ import { join } from "node:path";
19
19
  import { hasImplementationArtifacts } from "./auto-recovery.js";
20
20
  import { buildDiscussMilestonePrompt, buildResearchMilestonePrompt, buildPlanMilestonePrompt, buildResearchSlicePrompt, buildPlanSlicePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildValidateMilestonePrompt, buildReplanSlicePrompt, buildRunUatPrompt, buildReassessRoadmapPrompt, buildRewriteDocsPrompt, buildReactiveExecutePrompt, buildGateEvaluatePrompt, buildParallelResearchSlicesPrompt, checkNeedsReassessment, checkNeedsRunUat, } from "./auto-prompts.js";
21
21
  import { resolveModelWithFallbacksForUnit } from "./preferences-models.js";
22
+ import { resolveUokFlags } from "./uok/flags.js";
23
+ import { selectReactiveDispatchBatch } from "./uok/execution-graph.js";
22
24
  function missingSliceStop(mid, phase) {
23
25
  return {
24
26
  action: "stop",
@@ -461,7 +463,15 @@ export const DISPATCH_RULES = [
461
463
  // Only activate reactive dispatch when >1 task is ready
462
464
  if (readyIds.length <= 1)
463
465
  return null;
464
- const selected = chooseNonConflictingSubset(readyIds, graph, maxParallel, new Set());
466
+ const uokFlags = resolveUokFlags(prefs);
467
+ const selected = uokFlags.executionGraph
468
+ ? selectReactiveDispatchBatch({
469
+ graph,
470
+ readyIds,
471
+ maxParallel,
472
+ inFlightOutputs: new Set(),
473
+ }).selected
474
+ : chooseNonConflictingSubset(readyIds, graph, maxParallel, new Set());
465
475
  if (selected.length <= 1)
466
476
  return null;
467
477
  // Log graph metrics for observability
@@ -4,12 +4,14 @@
4
4
  * and fallback chains.
5
5
  */
6
6
  import { resolveModelWithFallbacksForUnit, resolveDynamicRoutingConfig } from "./preferences.js";
7
- import { classifyUnitComplexity, tierLabel } from "./complexity-classifier.js";
7
+ import { classifyUnitComplexity, extractTaskMetadata, tierLabel } from "./complexity-classifier.js";
8
8
  import { resolveModelForComplexity, escalateTier, getEligibleModels, loadCapabilityOverrides, adjustToolSet } from "./model-router.js";
9
9
  import { getLedger, getProjectTotals } from "./metrics.js";
10
10
  import { unitPhaseLabel } from "./auto-dashboard.js";
11
11
  import { getSessionModelOverride } from "./session-model-override.js";
12
12
  import { logWarning } from "./workflow-logger.js";
13
+ import { resolveUokFlags } from "./uok/flags.js";
14
+ import { applyModelPolicyFilter } from "./uok/model-policy.js";
13
15
  export function resolvePreferredModelConfig(unitType, autoModeStartModel, isAutoMode = true) {
14
16
  const explicitConfig = resolveModelWithFallbacksForUnit(unitType);
15
17
  if (explicitConfig)
@@ -46,6 +48,7 @@ export async function selectAndApplyModel(ctx, pi, unitType, unitId, basePath, p
46
48
  isAutoMode = true,
47
49
  /** Explicit /gsd model pin captured at bootstrap for long-running auto loops. */
48
50
  sessionModelOverride) {
51
+ const uokFlags = resolveUokFlags(prefs);
49
52
  const effectiveSessionModelOverride = sessionModelOverride === undefined
50
53
  ? getSessionModelOverride(ctx.sessionManager.getSessionId())
51
54
  : (sessionModelOverride ?? undefined);
@@ -67,6 +70,9 @@ sessionModelOverride) {
67
70
  let appliedModel = null;
68
71
  if (modelConfig) {
69
72
  const availableModels = ctx.modelRegistry.getAvailable();
73
+ const modelPolicyTraceId = `model:${ctx.sessionManager.getSessionId()}:${Date.now()}`;
74
+ const modelPolicyTurnId = `${unitType}:${unitId}`;
75
+ let policyAllowedModelKeys = null;
70
76
  // ─── Dynamic Model Routing ─────────────────────────────────────────
71
77
  // Dynamic routing (complexity-based downgrading) only applies in auto-mode.
72
78
  // Interactive/guided-flow dispatches use the user's session model directly,
@@ -75,15 +81,40 @@ sessionModelOverride) {
75
81
  if (!isAutoMode) {
76
82
  routingConfig.enabled = false;
77
83
  }
84
+ // burn-max defaults to quality-first dispatch (no downgrade routing).
85
+ if (prefs?.token_profile === "burn-max") {
86
+ routingConfig.enabled = false;
87
+ }
78
88
  let effectiveModelConfig = modelConfig;
79
89
  let routingTierLabel = "";
90
+ let routingEligibleModels = availableModels;
91
+ const taskMetadataForPolicy = unitType === "execute-task"
92
+ ? extractTaskMetadata(unitId, basePath)
93
+ : undefined;
94
+ if (uokFlags.modelPolicy) {
95
+ const policy = applyModelPolicyFilter(availableModels, {
96
+ basePath,
97
+ traceId: modelPolicyTraceId,
98
+ turnId: modelPolicyTurnId,
99
+ unitType,
100
+ taskMetadata: taskMetadataForPolicy,
101
+ currentProvider: ctx.model?.provider,
102
+ allowCrossProvider: routingConfig.cross_provider !== false,
103
+ requiredTools: pi.getActiveTools(),
104
+ });
105
+ routingEligibleModels = policy.eligible;
106
+ policyAllowedModelKeys = new Set(policy.eligible.map((m) => `${m.provider.toLowerCase()}/${m.id.toLowerCase()}`));
107
+ if (routingEligibleModels.length === 0) {
108
+ throw new Error(`Model policy denied all candidate models for ${unitType}/${unitId}`);
109
+ }
110
+ }
80
111
  // Disable routing for flat-rate providers like GitHub Copilot (#3453).
81
112
  // All models cost the same per request, so downgrading to a cheaper
82
113
  // model provides no cost benefit — it only degrades quality.
83
114
  // Fail-closed: if primary model can't be resolved, fall back to
84
115
  // provider-level signals rather than allowing unwanted downgrades.
85
116
  if (routingConfig.enabled) {
86
- const primaryModel = resolveModelId(modelConfig.primary, availableModels, ctx.model?.provider);
117
+ const primaryModel = resolveModelId(modelConfig.primary, routingEligibleModels, ctx.model?.provider);
87
118
  if (primaryModel) {
88
119
  const primaryFlatRateCtx = buildFlatRateContext(primaryModel.provider, ctx, prefs);
89
120
  if (isFlatRateProvider(primaryModel.provider, primaryFlatRateCtx)) {
@@ -110,8 +141,8 @@ sessionModelOverride) {
110
141
  const isHook = unitType.startsWith("hook/");
111
142
  const shouldClassify = !isHook || routingConfig.hooks !== false;
112
143
  if (shouldClassify) {
113
- let classification = classifyUnitComplexity(unitType, unitId, basePath, budgetPct);
114
- const availableModelIds = availableModels.map(m => m.id);
144
+ let classification = classifyUnitComplexity(unitType, unitId, basePath, budgetPct, taskMetadataForPolicy);
145
+ const availableModelIds = routingEligibleModels.map(m => m.id);
115
146
  // Escalate tier on retry when escalate_on_failure is enabled (default: true)
116
147
  if (retryContext?.isRetry &&
117
148
  retryContext.previousTier &&
@@ -191,13 +222,25 @@ sessionModelOverride) {
191
222
  }
192
223
  }
193
224
  const modelsToTry = [effectiveModelConfig.primary, ...effectiveModelConfig.fallbacks];
225
+ let attemptedPolicyEligible = false;
194
226
  for (const modelId of modelsToTry) {
195
- const model = resolveModelId(modelId, availableModels, ctx.model?.provider);
227
+ const resolutionPool = uokFlags.modelPolicy ? routingEligibleModels : availableModels;
228
+ const model = resolveModelId(modelId, resolutionPool, ctx.model?.provider);
196
229
  if (!model) {
197
230
  if (verbose)
198
231
  ctx.ui.notify(`Model ${modelId} not found, trying fallback.`, "info");
199
232
  continue;
200
233
  }
234
+ if (policyAllowedModelKeys) {
235
+ const key = `${model.provider.toLowerCase()}/${model.id.toLowerCase()}`;
236
+ if (!policyAllowedModelKeys.has(key)) {
237
+ if (verbose) {
238
+ ctx.ui.notify(`Model policy denied ${model.provider}/${model.id}; trying fallback.`, "warning");
239
+ }
240
+ continue;
241
+ }
242
+ attemptedPolicyEligible = true;
243
+ }
201
244
  // Warn if the ID is ambiguous across providers
202
245
  if (!modelId.includes("/")) {
203
246
  const providers = availableModels.filter(m => m.id === modelId).map(m => m.provider);
@@ -255,6 +298,9 @@ sessionModelOverride) {
255
298
  }
256
299
  }
257
300
  }
301
+ if (uokFlags.modelPolicy && policyAllowedModelKeys && !attemptedPolicyEligible) {
302
+ throw new Error(`Model policy denied dispatch for ${unitType}/${unitId} before prompt send`);
303
+ }
258
304
  }
259
305
  else if (autoModeStartModel) {
260
306
  // No model preference for this unit type — re-apply the model captured