gsd-pi 2.74.0 → 2.75.0-dev.063e5a3

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 (627) 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 +209 -10
  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 +54 -8
  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-recovery.js +24 -10
  14. package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
  15. package/dist/resources/extensions/gsd/auto-verification.js +100 -2
  16. package/dist/resources/extensions/gsd/auto-worktree.js +2 -0
  17. package/dist/resources/extensions/gsd/auto.js +36 -4
  18. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -3
  19. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
  20. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +61 -9
  21. package/dist/resources/extensions/gsd/cache.js +16 -5
  22. package/dist/resources/extensions/gsd/commands/catalog.js +31 -1
  23. package/dist/resources/extensions/gsd/commands/handlers/core.js +5 -1
  24. package/dist/resources/extensions/gsd/commands/handlers/ops.js +25 -0
  25. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +68 -9
  26. package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
  27. package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
  28. package/dist/resources/extensions/gsd/commands-do.js +79 -0
  29. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  30. package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
  31. package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
  32. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +51 -4
  33. package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
  34. package/dist/resources/extensions/gsd/commands-ship.js +187 -0
  35. package/dist/resources/extensions/gsd/db-writer.js +3 -5
  36. package/dist/resources/extensions/gsd/docs/preferences-reference.md +16 -1
  37. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  38. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  39. package/dist/resources/extensions/gsd/git-service.js +49 -1
  40. package/dist/resources/extensions/gsd/graph-context.js +157 -0
  41. package/dist/resources/extensions/gsd/gsd-db.js +581 -2
  42. package/dist/resources/extensions/gsd/guided-flow.js +31 -6
  43. package/dist/resources/extensions/gsd/index.js +15 -2
  44. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  45. package/dist/resources/extensions/gsd/journal.js +27 -0
  46. package/dist/resources/extensions/gsd/md-importer.js +3 -4
  47. package/dist/resources/extensions/gsd/memory-store.js +19 -51
  48. package/dist/resources/extensions/gsd/metrics.js +19 -0
  49. package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
  50. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -4
  51. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  52. package/dist/resources/extensions/gsd/preferences-models.js +20 -3
  53. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  54. package/dist/resources/extensions/gsd/preferences-validation.js +118 -2
  55. package/dist/resources/extensions/gsd/preferences.js +31 -0
  56. package/dist/resources/extensions/gsd/prompts/add-tests.md +35 -0
  57. package/dist/resources/extensions/gsd/safety/evidence-collector.js +15 -30
  58. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  59. package/dist/resources/extensions/gsd/state.js +5 -1
  60. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
  61. package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
  62. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  63. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
  64. package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
  65. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  66. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  67. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  68. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  69. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  70. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  71. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  72. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  73. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  74. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  75. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  76. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  77. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  78. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -69
  79. package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
  80. package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
  81. package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
  82. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  83. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  84. package/dist/web/standalone/.next/BUILD_ID +1 -1
  85. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  86. package/dist/web/standalone/.next/build-manifest.json +3 -3
  87. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  88. package/dist/web/standalone/.next/required-server-files.json +3 -3
  89. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  90. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  100. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  116. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  128. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  148. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  158. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  164. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  178. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  184. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/index.html +1 -1
  194. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  195. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  196. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  197. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  199. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/page.js +2 -2
  201. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  203. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  204. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  205. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  207. package/dist/web/standalone/.next/server/middleware.js +2 -2
  208. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  210. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  211. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  212. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  213. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  214. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  215. package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
  216. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  217. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  218. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  219. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  220. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  221. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  222. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  223. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  224. package/dist/web/standalone/server.js +1 -1
  225. package/package.json +3 -2
  226. package/packages/daemon/package.json +2 -2
  227. package/packages/mcp-server/dist/index.d.ts +3 -0
  228. package/packages/mcp-server/dist/index.d.ts.map +1 -1
  229. package/packages/mcp-server/dist/index.js +3 -0
  230. package/packages/mcp-server/dist/index.js.map +1 -1
  231. package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
  232. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
  233. package/packages/mcp-server/dist/readers/graph.js +655 -0
  234. package/packages/mcp-server/dist/readers/graph.js.map +1 -0
  235. package/packages/mcp-server/dist/readers/index.d.ts +2 -0
  236. package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
  237. package/packages/mcp-server/dist/readers/index.js +1 -0
  238. package/packages/mcp-server/dist/readers/index.js.map +1 -1
  239. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  240. package/packages/mcp-server/dist/server.js +65 -0
  241. package/packages/mcp-server/dist/server.js.map +1 -1
  242. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  243. package/packages/mcp-server/dist/workflow-tools.js +88 -6
  244. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  245. package/packages/mcp-server/package.json +2 -2
  246. package/packages/mcp-server/src/index.ts +15 -0
  247. package/packages/mcp-server/src/readers/graph.test.ts +604 -0
  248. package/packages/mcp-server/src/readers/graph.ts +855 -0
  249. package/packages/mcp-server/src/readers/index.ts +12 -0
  250. package/packages/mcp-server/src/server.ts +83 -0
  251. package/packages/mcp-server/src/workflow-tools.ts +95 -10
  252. package/packages/mcp-server/tsconfig.json +1 -0
  253. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
  254. package/packages/native/package.json +2 -2
  255. package/packages/native/tsconfig.tsbuildinfo +1 -0
  256. package/packages/pi-agent-core/package.json +1 -1
  257. package/packages/pi-agent-core/tsconfig.json +1 -0
  258. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
  259. package/packages/pi-ai/dist/index.d.ts +1 -9
  260. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  261. package/packages/pi-ai/dist/index.js +1 -9
  262. package/packages/pi-ai/dist/index.js.map +1 -1
  263. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  264. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  265. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  266. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  267. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  268. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  269. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  270. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  271. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  272. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  273. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  274. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  275. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  276. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  277. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  278. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  279. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  280. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  281. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  282. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  283. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  284. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  285. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  286. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  287. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  288. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  289. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  290. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  291. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  292. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  293. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  294. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  295. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  296. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  297. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  298. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  299. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  300. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  301. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  302. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  303. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  304. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  305. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  306. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  307. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  308. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  309. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  310. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  311. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  312. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  313. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  314. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  315. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  316. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  317. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  318. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  319. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  320. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  321. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  322. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  323. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  324. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  325. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  326. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  327. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  328. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  329. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  330. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  331. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  332. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  333. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  334. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  335. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  336. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  337. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  338. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  339. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  340. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  341. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  342. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  343. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  344. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  345. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  346. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  347. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  348. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  349. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  350. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  351. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  352. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  353. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  354. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  355. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  356. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  357. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  358. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  359. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  360. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  361. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  362. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  363. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  364. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  365. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  366. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  367. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  368. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  369. package/packages/pi-ai/dist/models/index.js +80 -0
  370. package/packages/pi-ai/dist/models/index.js.map +1 -0
  371. package/packages/pi-ai/dist/models.d.ts +1 -36
  372. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  373. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  374. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  375. package/packages/pi-ai/dist/models.js +3 -112
  376. package/packages/pi-ai/dist/models.js.map +1 -1
  377. package/packages/pi-ai/dist/models.test.js +6 -5
  378. package/packages/pi-ai/dist/models.test.js.map +1 -1
  379. package/packages/pi-ai/package.json +1 -1
  380. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  381. package/packages/pi-ai/src/index.ts +1 -9
  382. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  383. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  384. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  385. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  386. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  387. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  388. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  389. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  390. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  391. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  392. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  393. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  394. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  395. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  396. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  397. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  398. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  399. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  400. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  401. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  402. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  403. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  404. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  405. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  406. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  407. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  408. package/packages/pi-ai/src/models/index.ts +106 -0
  409. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  410. package/packages/pi-ai/src/models.test.ts +6 -5
  411. package/packages/pi-ai/src/models.ts +3 -153
  412. package/packages/pi-ai/tsconfig.json +1 -0
  413. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
  414. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
  416. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  417. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
  418. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  419. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  420. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  421. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  422. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  423. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  424. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  425. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  426. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts +2 -0
  427. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts.map +1 -0
  428. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +61 -0
  429. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -0
  430. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
  431. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  432. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  433. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
  435. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  436. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
  437. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
  438. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +53 -0
  439. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
  440. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts +8 -5
  441. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  442. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +27 -13
  443. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  444. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  445. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  446. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +68 -8
  447. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  448. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  449. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
  450. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  451. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  452. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
  453. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  454. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  455. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  456. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  457. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  458. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +14 -0
  459. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  460. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +70 -6
  461. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  462. package/packages/pi-coding-agent/package.json +1 -1
  463. package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
  464. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
  465. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  466. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  467. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +92 -0
  468. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
  469. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
  470. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +75 -0
  471. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +36 -15
  472. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +83 -7
  473. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
  474. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
  475. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  476. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +92 -6
  477. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  478. package/packages/pi-coding-agent/tsconfig.json +3 -2
  479. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
  480. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  481. package/packages/pi-tui/dist/tui.js +9 -2
  482. package/packages/pi-tui/dist/tui.js.map +1 -1
  483. package/packages/pi-tui/package.json +1 -1
  484. package/packages/pi-tui/src/tui.ts +9 -1
  485. package/packages/pi-tui/tsconfig.json +1 -0
  486. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
  487. package/packages/rpc-client/package.json +1 -1
  488. package/packages/rpc-client/tsconfig.json +1 -0
  489. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
  490. package/pkg/package.json +1 -1
  491. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  492. package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
  493. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
  494. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  495. package/src/resources/extensions/gsd/auto/phases.ts +261 -10
  496. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  497. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
  498. package/src/resources/extensions/gsd/auto-model-selection.ts +69 -8
  499. package/src/resources/extensions/gsd/auto-post-unit.ts +238 -18
  500. package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
  501. package/src/resources/extensions/gsd/auto-recovery.ts +29 -9
  502. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  503. package/src/resources/extensions/gsd/auto-verification.ts +129 -2
  504. package/src/resources/extensions/gsd/auto-worktree.ts +1 -0
  505. package/src/resources/extensions/gsd/auto.ts +41 -2
  506. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +5 -3
  507. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
  508. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +72 -8
  509. package/src/resources/extensions/gsd/cache.ts +16 -5
  510. package/src/resources/extensions/gsd/commands/catalog.ts +31 -1
  511. package/src/resources/extensions/gsd/commands/handlers/core.ts +5 -1
  512. package/src/resources/extensions/gsd/commands/handlers/ops.ts +25 -0
  513. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
  514. package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
  515. package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
  516. package/src/resources/extensions/gsd/commands-do.ts +109 -0
  517. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  518. package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
  519. package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
  520. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +58 -4
  521. package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
  522. package/src/resources/extensions/gsd/commands-ship.ts +219 -0
  523. package/src/resources/extensions/gsd/db-writer.ts +3 -5
  524. package/src/resources/extensions/gsd/docs/preferences-reference.md +16 -1
  525. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  526. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  527. package/src/resources/extensions/gsd/git-service.ts +68 -0
  528. package/src/resources/extensions/gsd/graph-context.ts +212 -0
  529. package/src/resources/extensions/gsd/gsd-db.ts +788 -3
  530. package/src/resources/extensions/gsd/guided-flow.ts +36 -2
  531. package/src/resources/extensions/gsd/index.ts +18 -2
  532. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  533. package/src/resources/extensions/gsd/journal.ts +30 -0
  534. package/src/resources/extensions/gsd/md-importer.ts +3 -5
  535. package/src/resources/extensions/gsd/memory-store.ts +31 -62
  536. package/src/resources/extensions/gsd/metrics.ts +26 -0
  537. package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
  538. package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
  539. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  540. package/src/resources/extensions/gsd/preferences-models.ts +20 -3
  541. package/src/resources/extensions/gsd/preferences-types.ts +38 -0
  542. package/src/resources/extensions/gsd/preferences-validation.ts +117 -2
  543. package/src/resources/extensions/gsd/preferences.ts +34 -0
  544. package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
  545. package/src/resources/extensions/gsd/safety/evidence-collector.ts +15 -31
  546. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  547. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  548. package/src/resources/extensions/gsd/state.ts +9 -2
  549. package/src/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
  550. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +177 -0
  551. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
  552. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  553. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  554. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +272 -0
  555. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +117 -0
  556. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  557. package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
  558. package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
  559. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  560. package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
  561. package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
  562. package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
  563. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -0
  564. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  565. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  566. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
  567. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  568. package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
  569. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  570. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  571. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +71 -4
  572. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  573. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  574. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
  575. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  576. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  577. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  578. package/src/resources/extensions/gsd/tests/preferences.test.ts +145 -0
  579. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +57 -2
  580. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  581. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
  582. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
  583. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  584. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  585. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  586. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  587. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  588. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  589. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  590. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  591. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  592. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  593. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  594. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +223 -0
  595. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
  596. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  597. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
  598. package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
  599. package/src/resources/extensions/gsd/types.ts +14 -1
  600. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  601. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  602. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  603. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  604. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  605. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  606. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  607. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  608. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  609. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  610. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  611. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  612. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  613. package/src/resources/extensions/gsd/workflow-manifest.ts +9 -104
  614. package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
  615. package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
  616. package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
  617. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  618. package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
  619. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  620. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  621. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  622. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  623. package/packages/pi-ai/dist/models.generated.js +0 -14343
  624. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  625. package/packages/pi-ai/src/models.generated.ts +0 -14345
  626. /package/dist/web/standalone/.next/static/{JpjdI2QtmIkQr4xz6gbhM → j7IBD35UgrL2b298GLK3V}/_buildManifest.js +0 -0
  627. /package/dist/web/standalone/.next/static/{JpjdI2QtmIkQr4xz6gbhM → j7IBD35UgrL2b298GLK3V}/_ssgManifest.js +0 -0
@@ -14,9 +14,11 @@ import { debugLog } from "../debug-logger.js";
14
14
  import { PROJECT_FILES } from "../detection.js";
15
15
  import { MergeConflictError } from "../git-service.js";
16
16
  import { setCurrentPhase, clearCurrentPhase } from "../../shared/gsd-phase-state.js";
17
+ import { pauseAutoForProviderError } from "../provider-error-pause.js";
18
+ import { resumeAutoAfterProviderDelay } from "../bootstrap/provider-error-resume.js";
17
19
  import { join, basename, dirname, parse as parsePath } from "node:path";
18
20
  import { existsSync, cpSync, readdirSync } from "node:fs";
19
- import { logWarning, logError } from "../workflow-logger.js";
21
+ import { logWarning, logError, _resetLogs, drainLogs, drainAndSummarize, formatForNotification, hasAnyIssues, } from "../workflow-logger.js";
20
22
  import { gsdRoot } from "../paths.js";
21
23
  import { atomicWriteSync } from "../atomic-write.js";
22
24
  import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationSteps } from "../auto-recovery.js";
@@ -25,10 +27,19 @@ import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "
25
27
  import { getEligibleSlices } from "../slice-parallel-eligibility.js";
26
28
  import { startSliceParallel } from "../slice-parallel-orchestrator.js";
27
29
  import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
30
+ import { ensurePlanV2Graph } from "../uok/plan-v2.js";
31
+ import { resolveUokFlags } from "../uok/flags.js";
32
+ import { UokGateRunner } from "../uok/gate-runner.js";
28
33
  import { resetEvidence } from "../safety/evidence-collector.js";
29
34
  import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
30
35
  import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
31
36
  import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForAutoUnit, } from "../workflow-mcp.js";
37
+ // ─── Session timeout auto-resume state ────────────────────────────────────────
38
+ let consecutiveSessionTimeouts = 0;
39
+ const MAX_SESSION_TIMEOUT_AUTO_RESUMES = 3;
40
+ export function resetSessionTimeoutState() {
41
+ consecutiveSessionTimeouts = 0;
42
+ }
32
43
  // ─── generateMilestoneReport ──────────────────────────────────────────────────
33
44
  /**
34
45
  * Resolve the base path for milestone reports.
@@ -46,6 +57,15 @@ export function _resolveReportBasePath(s) {
46
57
  export function _resolveDispatchGuardBasePath(s) {
47
58
  return s.originalBasePath || s.basePath;
48
59
  }
60
+ const PLAN_V2_GATE_PHASES = new Set([
61
+ "executing",
62
+ "summarizing",
63
+ "validating-milestone",
64
+ "completing-milestone",
65
+ ]);
66
+ function shouldRunPlanV2Gate(phase) {
67
+ return PLAN_V2_GATE_PHASES.has(phase);
68
+ }
49
69
  /**
50
70
  * Generate and write an HTML milestone report snapshot.
51
71
  * Extracted from the milestone-transition block in autoLoop.
@@ -100,6 +120,22 @@ async function closeoutAndStop(ctx, pi, s, deps, reason) {
100
120
  }
101
121
  await deps.stopAuto(ctx, pi, reason);
102
122
  }
123
+ async function emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, errorContext) {
124
+ ic.deps.emitJournalEvent({
125
+ ts: new Date().toISOString(),
126
+ flowId: ic.flowId,
127
+ seq: ic.nextSeq(),
128
+ eventType: "unit-end",
129
+ data: {
130
+ unitType,
131
+ unitId,
132
+ status: "cancelled",
133
+ artifactVerified: false,
134
+ ...(errorContext ? { errorContext } : {}),
135
+ },
136
+ causedBy: { flowId: ic.flowId, seq: unitStartSeq },
137
+ });
138
+ }
103
139
  // ─── runPreDispatch ───────────────────────────────────────────────────────────
104
140
  /**
105
141
  * Phase 1: Pre-dispatch — resource guard, health gate, state derivation,
@@ -108,13 +144,52 @@ async function closeoutAndStop(ctx, pi, s, deps, reason) {
108
144
  */
109
145
  export async function runPreDispatch(ic, loopState) {
110
146
  const { ctx, pi, s, deps, prefs } = ic;
147
+ const uokFlags = resolveUokFlags(prefs);
148
+ const runPreDispatchGate = async (input) => {
149
+ if (!uokFlags.gates)
150
+ return;
151
+ const gateRunner = new UokGateRunner();
152
+ gateRunner.register({
153
+ id: input.gateId,
154
+ type: input.gateType,
155
+ execute: async () => ({
156
+ outcome: input.outcome,
157
+ failureClass: input.failureClass,
158
+ rationale: input.rationale,
159
+ findings: input.findings ?? "",
160
+ }),
161
+ });
162
+ await gateRunner.run(input.gateId, {
163
+ basePath: s.basePath,
164
+ traceId: `pre-dispatch:${ic.flowId}`,
165
+ turnId: `iter-${ic.iteration}`,
166
+ milestoneId: input.milestoneId ?? s.currentMilestoneId ?? undefined,
167
+ unitType: "pre-dispatch",
168
+ unitId: `iter-${ic.iteration}`,
169
+ });
170
+ };
111
171
  // Resource version guard
112
172
  const staleMsg = deps.checkResourcesStale(s.resourceVersionOnStart);
113
173
  if (staleMsg) {
174
+ await runPreDispatchGate({
175
+ gateId: "resource-version-guard",
176
+ gateType: "policy",
177
+ outcome: "fail",
178
+ failureClass: "policy",
179
+ rationale: "resource version guard blocked dispatch",
180
+ findings: staleMsg,
181
+ });
114
182
  await deps.stopAuto(ctx, pi, staleMsg);
115
183
  debugLog("autoLoop", { phase: "exit", reason: "resources-stale" });
116
184
  return { action: "break", reason: "resources-stale" };
117
185
  }
186
+ await runPreDispatchGate({
187
+ gateId: "resource-version-guard",
188
+ gateType: "policy",
189
+ outcome: "pass",
190
+ failureClass: "none",
191
+ rationale: "resource version guard passed",
192
+ });
118
193
  deps.invalidateAllCaches();
119
194
  s.lastPromptCharCount = undefined;
120
195
  s.lastBaselineCharCount = undefined;
@@ -125,13 +200,37 @@ export async function runPreDispatch(ic, loopState) {
125
200
  ctx.ui.notify(`Pre-dispatch: ${healthGate.fixesApplied.join(", ")}`, "info");
126
201
  }
127
202
  if (!healthGate.proceed) {
203
+ await runPreDispatchGate({
204
+ gateId: "pre-dispatch-health-gate",
205
+ gateType: "execution",
206
+ outcome: "manual-attention",
207
+ failureClass: "manual-attention",
208
+ rationale: "pre-dispatch health gate blocked dispatch",
209
+ findings: healthGate.reason,
210
+ });
128
211
  ctx.ui.notify(healthGate.reason || "Pre-dispatch health check failed — run /gsd doctor for details.", "error");
129
212
  await deps.pauseAuto(ctx, pi);
130
213
  debugLog("autoLoop", { phase: "exit", reason: "health-gate-failed" });
131
214
  return { action: "break", reason: "health-gate-failed" };
132
215
  }
216
+ await runPreDispatchGate({
217
+ gateId: "pre-dispatch-health-gate",
218
+ gateType: "execution",
219
+ outcome: "pass",
220
+ failureClass: "none",
221
+ rationale: "pre-dispatch health gate passed",
222
+ findings: healthGate.fixesApplied.length > 0 ? healthGate.fixesApplied.join(", ") : "",
223
+ });
133
224
  }
134
225
  catch (e) {
226
+ await runPreDispatchGate({
227
+ gateId: "pre-dispatch-health-gate",
228
+ gateType: "execution",
229
+ outcome: "manual-attention",
230
+ failureClass: "manual-attention",
231
+ rationale: "pre-dispatch health gate threw unexpectedly",
232
+ findings: String(e),
233
+ });
135
234
  logWarning("engine", "Pre-dispatch health gate threw unexpectedly", { error: String(e) });
136
235
  }
137
236
  // Sync project root artifacts into worktree
@@ -142,6 +241,32 @@ export async function runPreDispatch(ic, loopState) {
142
241
  }
143
242
  // Derive state
144
243
  let state = await deps.deriveState(s.basePath);
244
+ if (prefs?.uok?.plan_v2?.enabled && shouldRunPlanV2Gate(state.phase)) {
245
+ const compiled = ensurePlanV2Graph(s.basePath, state);
246
+ if (!compiled.ok) {
247
+ const reason = compiled.reason ?? "Plan v2 compilation failed";
248
+ await runPreDispatchGate({
249
+ gateId: "plan-v2-gate",
250
+ gateType: "policy",
251
+ outcome: "manual-attention",
252
+ failureClass: "manual-attention",
253
+ rationale: "plan v2 compile gate failed",
254
+ findings: reason,
255
+ milestoneId: state.activeMilestone?.id ?? undefined,
256
+ });
257
+ ctx.ui.notify(`Plan gate failed-closed: ${reason}`, "error");
258
+ await deps.pauseAuto(ctx, pi);
259
+ return { action: "break", reason: "plan-v2-gate-failed" };
260
+ }
261
+ await runPreDispatchGate({
262
+ gateId: "plan-v2-gate",
263
+ gateType: "policy",
264
+ outcome: "pass",
265
+ failureClass: "none",
266
+ rationale: "plan v2 compile gate passed",
267
+ milestoneId: state.activeMilestone?.id ?? undefined,
268
+ });
269
+ }
145
270
  deps.syncCmuxSidebar(prefs, state);
146
271
  let mid = state.activeMilestone?.id;
147
272
  let midTitle = state.activeMilestone?.title;
@@ -177,7 +302,10 @@ export async function runPreDispatch(ic, loopState) {
177
302
  eligibleSlices: eligible.map(e => e.id),
178
303
  });
179
304
  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 });
305
+ const result = await startSliceParallel(s.basePath, mid, eligible, {
306
+ maxWorkers: prefs.slice_parallel.max_workers ?? 2,
307
+ useExecutionGraph: uokFlags.executionGraph,
308
+ });
181
309
  if (result.started.length > 0) {
182
310
  ctx.ui.notify(`Slice-parallel: started ${result.started.length} worker(s): ${result.started.join(", ")}.`, "info");
183
311
  await deps.stopAuto(ctx, pi, `Slice-parallel dispatched for ${mid}`);
@@ -776,7 +904,13 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
776
904
  s.currentUnit.type === unitType &&
777
905
  s.currentUnit.id === unitId);
778
906
  const previousTier = s.currentUnitRouting?.tier;
907
+ // Scope workflow-logger buffer to this unit so post-finalize drains are
908
+ // per-unit. Without this, the module-level _buffer accumulates across every
909
+ // unit in the same Node process (see workflow-logger.ts module header).
910
+ _resetLogs();
779
911
  s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
912
+ s.lastGitActionFailure = null;
913
+ s.lastGitActionStatus = null;
780
914
  setCurrentPhase(unitType);
781
915
  s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
782
916
  const unitStartSeq = ic.nextSeq();
@@ -975,22 +1109,65 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
975
1109
  // Provider-error pause: pauseAuto already handled cleanup and scheduled
976
1110
  // recovery. Don't hard-stop — just break out of the loop (#2762).
977
1111
  if (unitResult.errorContext?.category === "provider") {
1112
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
978
1113
  debugLog("autoLoop", { phase: "exit", reason: "provider-pause", isTransient: unitResult.errorContext.isTransient });
979
1114
  return { action: "break", reason: "provider-pause" };
980
1115
  }
981
- // Session creation timeout (not a structural error): pause auto-mode
982
- // and let the provider-error-resume timer handle recovery (#3767). This
983
- // matches the provider-pause pathbreak out cleanly, don't hard-stop.
1116
+ // Timeout category covers two distinct scenarios:
1117
+ // 1. Session creation timeout (120s) transient, auto-resume with backoff
1118
+ // 2. Unit hard timeout (30min+)stuck agent, pause for manual review
984
1119
  // Structural errors (TypeError, is not a function) are NOT transient
985
1120
  // and must hard-stop to avoid infinite retry loops.
986
1121
  if (unitResult.errorContext?.isTransient &&
987
1122
  unitResult.errorContext?.category === "timeout") {
988
- ctx.ui.notify(`Session creation timed out for ${unitType} ${unitId}. Pausing auto-mode (recoverable).`, "warning");
989
- debugLog("autoLoop", { phase: "session-timeout-pause", unitType, unitId });
1123
+ const isSessionCreationTimeout = unitResult.errorContext.message?.includes("Session creation timed out");
1124
+ if (isSessionCreationTimeout) {
1125
+ consecutiveSessionTimeouts += 1;
1126
+ const baseRetryAfterMs = 30_000;
1127
+ const retryAfterMs = baseRetryAfterMs * 2 ** Math.max(0, consecutiveSessionTimeouts - 1);
1128
+ const allowAutoResume = consecutiveSessionTimeouts <= MAX_SESSION_TIMEOUT_AUTO_RESUMES;
1129
+ if (!allowAutoResume) {
1130
+ ctx.ui.notify(`Session creation timed out ${consecutiveSessionTimeouts} consecutive times for ${unitType} ${unitId}. Pausing for manual review.`, "warning");
1131
+ }
1132
+ debugLog("autoLoop", {
1133
+ phase: "session-timeout-pause",
1134
+ unitType, unitId,
1135
+ consecutiveSessionTimeouts,
1136
+ retryAfterMs,
1137
+ allowAutoResume,
1138
+ });
1139
+ const errorDetail = ` for ${unitType} ${unitId}`;
1140
+ await pauseAutoForProviderError(ctx.ui, errorDetail, () => deps.pauseAuto(ctx, pi), {
1141
+ isRateLimit: false,
1142
+ isTransient: allowAutoResume,
1143
+ retryAfterMs,
1144
+ resume: allowAutoResume
1145
+ ? () => {
1146
+ void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
1147
+ const message = err instanceof Error ? err.message : String(err);
1148
+ ctx.ui.notify(`Session timeout recovery failed: ${message}`, "error");
1149
+ });
1150
+ }
1151
+ : undefined,
1152
+ });
1153
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
1154
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1155
+ return { action: "break", reason: "session-timeout" };
1156
+ }
1157
+ // Unit hard timeout (30min+): pause without auto-resume — stuck agent
1158
+ ctx.ui.notify(`Unit timed out for ${unitType} ${unitId} (supervision may have failed). Pausing auto-mode.`, "warning");
1159
+ debugLog("autoLoop", { phase: "unit-hard-timeout-pause", unitType, unitId });
990
1160
  await deps.pauseAuto(ctx, pi);
991
- return { action: "break", reason: "session-timeout" };
1161
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
1162
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1163
+ return { action: "break", reason: "unit-hard-timeout" };
992
1164
  }
993
1165
  // All other cancelled states (structural errors, non-transient failures): hard stop
1166
+ if (s.currentUnit) {
1167
+ await deps.closeoutUnit(ctx, s.basePath, unitType, unitId, s.currentUnit.startedAt, deps.buildSnapshotOpts(unitType, unitId));
1168
+ }
1169
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
1170
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
994
1171
  ctx.ui.notify(`Session creation failed for ${unitType} ${unitId}: ${unitResult.errorContext?.message ?? "unknown"}. Stopping auto-mode.`, "warning");
995
1172
  await deps.stopAuto(ctx, pi, `Session creation failed: ${unitResult.errorContext?.message ?? "unknown"}`);
996
1173
  debugLog("autoLoop", { phase: "exit", reason: "session-failed" });
@@ -1002,6 +1179,8 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
1002
1179
  // Guard: stopAuto() may have nulled s.currentUnit via s.reset() while
1003
1180
  // this coroutine was suspended at `await runUnit(...)` (#2939).
1004
1181
  if (s.currentUnit) {
1182
+ // Reset session timeout counter — any successful unit clears the slate
1183
+ consecutiveSessionTimeouts = 0;
1005
1184
  await deps.closeoutUnit(ctx, s.basePath, unitType, unitId, s.currentUnit.startedAt, deps.buildSnapshotOpts(unitType, unitId));
1006
1185
  }
1007
1186
  // ── Zero tool-call guard (#1833, #2653) ──────────────────────────
@@ -1124,6 +1303,9 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
1124
1303
  // cannot mutate state for the next unit (#3757).
1125
1304
  s.currentUnit = null;
1126
1305
  clearCurrentPhase();
1306
+ // Drop any logger entries from the timed-out unit so they don't bleed
1307
+ // into the next iteration's drain.
1308
+ drainLogs();
1127
1309
  loopState.consecutiveFinalizeTimeouts++;
1128
1310
  debugLog("autoLoop", {
1129
1311
  phase: "pre-verification-timeout",
@@ -1142,11 +1324,15 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
1142
1324
  }
1143
1325
  const preResult = preResultGuard.value;
1144
1326
  if (preResult === "dispatched") {
1327
+ const dispatchedReason = s.lastGitActionFailure
1328
+ ? "git-closeout-failure"
1329
+ : "pre-verification-dispatched";
1145
1330
  debugLog("autoLoop", {
1146
1331
  phase: "exit",
1147
- reason: "pre-verification-dispatched",
1332
+ reason: dispatchedReason,
1333
+ gitError: s.lastGitActionFailure ?? undefined,
1148
1334
  });
1149
- return { action: "break", reason: "pre-verification-dispatched" };
1335
+ return { action: "break", reason: dispatchedReason };
1150
1336
  }
1151
1337
  if (preResult === "retry") {
1152
1338
  if (sidecarItem) {
@@ -1199,6 +1385,9 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
1199
1385
  // cannot mutate state for the next unit (#3757).
1200
1386
  s.currentUnit = null;
1201
1387
  clearCurrentPhase();
1388
+ // Drop any logger entries from the timed-out unit so they don't bleed
1389
+ // into the next iteration's drain.
1390
+ drainLogs();
1202
1391
  loopState.consecutiveFinalizeTimeouts++;
1203
1392
  debugLog("autoLoop", {
1204
1393
  phase: "post-verification-timeout",
@@ -1230,5 +1419,15 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
1230
1419
  }
1231
1420
  // Both pre and post verification completed without timeout — reset counter
1232
1421
  loopState.consecutiveFinalizeTimeouts = 0;
1422
+ // Surface accumulated workflow-logger issues for this unit to the user.
1423
+ // Warnings/errors logged during the unit are buffered in the logger and
1424
+ // drained here so the user sees a single consolidated post-unit alert.
1425
+ if (hasAnyIssues()) {
1426
+ const { logs } = drainAndSummarize();
1427
+ if (logs.length > 0) {
1428
+ const severity = logs.some((e) => e.severity === "error") ? "error" : "warning";
1429
+ ctx.ui.notify(formatForNotification(logs), severity);
1430
+ }
1431
+ }
1233
1432
  return { action: "next", data: undefined };
1234
1433
  }
@@ -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
@@ -359,10 +405,10 @@ export function isFlatRateProvider(provider, opts) {
359
405
  */
360
406
  export function buildFlatRateContext(provider, ctx, prefs) {
361
407
  let authMode;
362
- const getAuthMode = ctx?.modelRegistry?.getProviderAuthMode;
363
- if (typeof getAuthMode === "function") {
408
+ const registry = ctx?.modelRegistry;
409
+ if (registry && typeof registry.getProviderAuthMode === "function") {
364
410
  try {
365
- const mode = getAuthMode(provider);
411
+ const mode = registry.getProviderAuthMode(provider);
366
412
  if (mode === "apiKey" || mode === "oauth" || mode === "externalCli" || mode === "none") {
367
413
  authMode = mode;
368
414
  }