gsd-pi 2.74.0-dev.b741afb → 2.74.0-dev.ffbcc03

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 (403) hide show
  1. package/dist/resources/extensions/gsd/activity-log.js +16 -0
  2. package/dist/resources/extensions/gsd/auto/loop.js +147 -10
  3. package/dist/resources/extensions/gsd/auto/phases.js +113 -3
  4. package/dist/resources/extensions/gsd/auto/session.js +10 -0
  5. package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
  6. package/dist/resources/extensions/gsd/auto-model-selection.js +51 -5
  7. package/dist/resources/extensions/gsd/auto-post-unit.js +215 -8
  8. package/dist/resources/extensions/gsd/auto-recovery.js +24 -10
  9. package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
  10. package/dist/resources/extensions/gsd/auto-verification.js +100 -2
  11. package/dist/resources/extensions/gsd/auto.js +28 -2
  12. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +10 -1
  13. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +61 -9
  14. package/dist/resources/extensions/gsd/cache.js +16 -5
  15. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  16. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  17. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  18. package/dist/resources/extensions/gsd/docs/preferences-reference.md +14 -1
  19. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  20. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  21. package/dist/resources/extensions/gsd/git-service.js +49 -1
  22. package/dist/resources/extensions/gsd/graph-context.js +98 -7
  23. package/dist/resources/extensions/gsd/gsd-db.js +260 -2
  24. package/dist/resources/extensions/gsd/guided-flow.js +24 -1
  25. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  26. package/dist/resources/extensions/gsd/journal.js +27 -0
  27. package/dist/resources/extensions/gsd/metrics.js +19 -0
  28. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  29. package/dist/resources/extensions/gsd/preferences-models.js +20 -3
  30. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  31. package/dist/resources/extensions/gsd/preferences-validation.js +108 -2
  32. package/dist/resources/extensions/gsd/preferences.js +26 -0
  33. package/dist/resources/extensions/gsd/safety/evidence-collector.js +15 -30
  34. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  35. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  36. package/dist/resources/extensions/gsd/tools/complete-slice.js +5 -0
  37. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  38. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  39. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  40. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  41. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  42. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  43. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  44. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  45. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  46. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  47. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  48. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  49. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  50. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  51. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  52. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  53. package/dist/web/standalone/.next/BUILD_ID +1 -1
  54. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  55. package/dist/web/standalone/.next/build-manifest.json +2 -2
  56. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  57. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  58. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  59. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  60. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  62. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  66. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  67. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  74. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/index.html +1 -1
  79. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  86. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  87. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  88. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  89. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  90. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  91. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  92. package/package.json +1 -1
  93. package/packages/mcp-server/dist/readers/graph.d.ts +1 -1
  94. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -1
  95. package/packages/mcp-server/dist/readers/graph.js +107 -0
  96. package/packages/mcp-server/dist/readers/graph.js.map +1 -1
  97. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  98. package/packages/mcp-server/dist/workflow-tools.js +88 -6
  99. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  100. package/packages/mcp-server/src/readers/graph.test.ts +178 -0
  101. package/packages/mcp-server/src/readers/graph.ts +148 -1
  102. package/packages/mcp-server/src/workflow-tools.ts +95 -10
  103. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  104. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  105. package/packages/pi-ai/dist/index.d.ts +1 -9
  106. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  107. package/packages/pi-ai/dist/index.js +1 -9
  108. package/packages/pi-ai/dist/index.js.map +1 -1
  109. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  110. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  111. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  112. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  113. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  114. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  115. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  116. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  117. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  118. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  119. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  120. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  121. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  122. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  123. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  124. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  125. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  126. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  127. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  128. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  129. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  130. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  131. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  132. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  133. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  134. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  135. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  136. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  137. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  138. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  139. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  140. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  141. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  142. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  143. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  144. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  145. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  146. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  147. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  148. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  149. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  150. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  151. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  152. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  153. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  154. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  155. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  156. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  157. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  158. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  159. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  160. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  161. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  162. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  163. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  164. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  165. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  166. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  167. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  168. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  169. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  170. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  171. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  172. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  173. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  174. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  175. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  176. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  177. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  178. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  179. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  180. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  181. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  182. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  183. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  184. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  185. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  186. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  187. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  188. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  189. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  190. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  191. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  192. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  193. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  194. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  195. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  196. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  197. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  198. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  199. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  200. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  201. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  202. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  203. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  204. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  205. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  206. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  207. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  208. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  209. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  210. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  211. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  212. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  213. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  214. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  215. package/packages/pi-ai/dist/models/index.js +80 -0
  216. package/packages/pi-ai/dist/models/index.js.map +1 -0
  217. package/packages/pi-ai/dist/models.d.ts +1 -36
  218. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  219. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  220. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  221. package/packages/pi-ai/dist/models.js +3 -112
  222. package/packages/pi-ai/dist/models.js.map +1 -1
  223. package/packages/pi-ai/dist/models.test.js +6 -5
  224. package/packages/pi-ai/dist/models.test.js.map +1 -1
  225. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  226. package/packages/pi-ai/src/index.ts +1 -9
  227. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  228. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  229. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  230. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  231. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  232. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  233. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  234. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  235. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  236. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  237. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  238. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  239. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  240. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  241. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  242. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  243. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  244. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  245. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  246. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  247. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  248. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  249. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  250. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  251. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  252. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  253. package/packages/pi-ai/src/models/index.ts +106 -0
  254. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  255. package/packages/pi-ai/src/models.test.ts +6 -5
  256. package/packages/pi-ai/src/models.ts +3 -153
  257. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  258. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
  260. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
  262. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  264. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  265. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  266. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  267. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  269. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  273. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +47 -0
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +68 -8
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  288. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
  289. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  291. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  292. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +14 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +70 -6
  297. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  298. package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
  299. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
  300. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  301. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  302. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
  303. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
  304. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +67 -0
  305. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +83 -7
  306. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
  307. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
  308. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  309. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +92 -6
  310. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  311. package/packages/pi-coding-agent/tsconfig.json +2 -2
  312. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  313. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  314. package/src/resources/extensions/gsd/auto/loop-deps.ts +4 -0
  315. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  316. package/src/resources/extensions/gsd/auto/phases.ts +123 -3
  317. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  318. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
  319. package/src/resources/extensions/gsd/auto-model-selection.ts +66 -5
  320. package/src/resources/extensions/gsd/auto-post-unit.ts +226 -9
  321. package/src/resources/extensions/gsd/auto-recovery.ts +29 -9
  322. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  323. package/src/resources/extensions/gsd/auto-verification.ts +129 -2
  324. package/src/resources/extensions/gsd/auto.ts +34 -2
  325. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -1
  326. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +72 -8
  327. package/src/resources/extensions/gsd/cache.ts +16 -5
  328. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  329. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  330. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  331. package/src/resources/extensions/gsd/docs/preferences-reference.md +14 -1
  332. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  333. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  334. package/src/resources/extensions/gsd/git-service.ts +68 -0
  335. package/src/resources/extensions/gsd/graph-context.ts +139 -12
  336. package/src/resources/extensions/gsd/gsd-db.ts +321 -3
  337. package/src/resources/extensions/gsd/guided-flow.ts +33 -1
  338. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  339. package/src/resources/extensions/gsd/journal.ts +30 -0
  340. package/src/resources/extensions/gsd/metrics.ts +26 -0
  341. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  342. package/src/resources/extensions/gsd/preferences-models.ts +20 -3
  343. package/src/resources/extensions/gsd/preferences-types.ts +32 -0
  344. package/src/resources/extensions/gsd/preferences-validation.ts +107 -2
  345. package/src/resources/extensions/gsd/preferences.ts +28 -0
  346. package/src/resources/extensions/gsd/safety/evidence-collector.ts +15 -31
  347. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  348. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  349. package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  350. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +177 -0
  351. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
  352. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  353. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  354. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +272 -0
  355. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  356. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  357. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  358. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  359. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  360. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  361. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  362. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  363. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  364. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  365. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  366. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  367. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  368. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
  369. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  370. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  371. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  372. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  373. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  374. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  375. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  376. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  377. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  378. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  379. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  380. package/src/resources/extensions/gsd/tools/complete-slice.ts +9 -2
  381. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  382. package/src/resources/extensions/gsd/types.ts +14 -1
  383. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  384. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  385. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  386. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  387. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  388. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  389. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  390. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  391. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  392. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  393. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  394. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  395. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  396. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  397. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  398. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  399. package/packages/pi-ai/dist/models.generated.js +0 -14343
  400. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  401. package/packages/pi-ai/src/models.generated.ts +0 -14345
  402. /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → kn6xzWKYnogsxp2b6RpDD}/_buildManifest.js +0 -0
  403. /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → kn6xzWKYnogsxp2b6RpDD}/_ssgManifest.js +0 -0
@@ -16,6 +16,8 @@ import { GSDError, GSD_IO_ERROR } from "./errors.js";
16
16
  const SEQ_PREFIX_RE = /^(\d+)-/;
17
17
  import type { ExtensionContext } from "@gsd/pi-coding-agent";
18
18
  import { gsdRoot } from "./paths.js";
19
+ import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
20
+ import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
19
21
 
20
22
  interface ActivityLogState {
21
23
  nextSeq: number;
@@ -132,6 +134,25 @@ export function saveActivityLog(
132
134
  }
133
135
  state.nextSeq += 1;
134
136
  state.lastSnapshotKeyByUnit.set(unitKey, key);
137
+
138
+ if (isUnifiedAuditEnabled()) {
139
+ emitUokAuditEvent(
140
+ basePath,
141
+ buildAuditEnvelope({
142
+ traceId: `activity:${unitType}:${unitId}`,
143
+ turnId: unitId,
144
+ category: "execution",
145
+ type: "activity-log-saved",
146
+ payload: {
147
+ unitType,
148
+ unitId,
149
+ filePath,
150
+ entryCount: entries.length,
151
+ },
152
+ }),
153
+ );
154
+ }
155
+
135
156
  return filePath;
136
157
  } catch (e) {
137
158
  // Don't let logging failures break auto-mode
@@ -21,6 +21,7 @@ import type { WorktreeResolver } from "../worktree-resolver.js";
21
21
  import type { CmuxLogLevel } from "../../cmux/index.js";
22
22
  import type { JournalEntry } from "../journal.js";
23
23
  import type { MergeReconcileResult } from "../auto-recovery.js";
24
+ import type { UokTurnObserver } from "../uok/contracts.js";
24
25
 
25
26
  /**
26
27
  * Dependencies injected by the caller (auto.ts startAuto) so autoLoop
@@ -274,4 +275,7 @@ export interface LoopDeps {
274
275
 
275
276
  // Journal
276
277
  emitJournalEvent: (entry: JournalEntry) => void;
278
+
279
+ // UOK (optional, flag-gated)
280
+ uokObserver?: UokTurnObserver;
277
281
  }
@@ -31,6 +31,8 @@ import { isInfrastructureError, isTransientCooldownError, getCooldownRetryAfterM
31
31
  import { resolveEngine } from "../engine-resolver.js";
32
32
  import { logWarning } from "../workflow-logger.js";
33
33
  import { gsdRoot } from "../paths.js";
34
+ import { resolveUokFlags } from "../uok/flags.js";
35
+ import { scheduleSidecarQueue } from "../uok/execution-graph.js";
34
36
  import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
35
37
  import { join } from "node:path";
36
38
 
@@ -128,6 +130,43 @@ export async function autoLoop(
128
130
  const flowId = randomUUID();
129
131
  let seqCounter = 0;
130
132
  const nextSeq = () => ++seqCounter;
133
+ const turnId = randomUUID();
134
+ s.currentTraceId = flowId;
135
+ s.currentTurnId = turnId;
136
+ const turnStartedAt = new Date().toISOString();
137
+ let observedUnitType: string | undefined;
138
+ let observedUnitId: string | undefined;
139
+ let turnFinished = false;
140
+ const finishTurn = (
141
+ status: "completed" | "failed" | "paused" | "stopped" | "skipped" | "retry",
142
+ failureClass: "none" | "unknown" | "manual-attention" | "timeout" | "execution" | "closeout" | "git" = "none",
143
+ error?: string,
144
+ ): void => {
145
+ if (turnFinished) return;
146
+ turnFinished = true;
147
+ deps.uokObserver?.onTurnResult({
148
+ traceId: flowId,
149
+ turnId,
150
+ iteration,
151
+ unitType: observedUnitType,
152
+ unitId: observedUnitId,
153
+ status,
154
+ failureClass,
155
+ phaseResults: [],
156
+ error,
157
+ startedAt: turnStartedAt,
158
+ finishedAt: new Date().toISOString(),
159
+ });
160
+ s.currentTraceId = null;
161
+ s.currentTurnId = null;
162
+ };
163
+ deps.uokObserver?.onTurnStart({
164
+ traceId: flowId,
165
+ turnId,
166
+ iteration,
167
+ basePath: s.basePath,
168
+ startedAt: turnStartedAt,
169
+ });
131
170
 
132
171
  if (iteration > MAX_LOOP_ITERATIONS) {
133
172
  debugLog("autoLoop", {
@@ -140,6 +179,7 @@ export async function autoLoop(
140
179
  pi,
141
180
  `Safety: loop exceeded ${MAX_LOOP_ITERATIONS} iterations — possible runaway`,
142
181
  );
182
+ finishTurn("stopped", "manual-attention", "max-iterations");
143
183
  break;
144
184
  }
145
185
 
@@ -157,22 +197,32 @@ export async function autoLoop(
157
197
  `Stopping gracefully to prevent OOM kill after ${iteration} iterations. ` +
158
198
  `Resume with /gsd auto to continue from where you left off.`,
159
199
  );
200
+ finishTurn("stopped", "timeout", "memory-pressure");
160
201
  break;
161
202
  }
162
203
  }
163
204
 
164
205
  if (!s.cmdCtx) {
165
206
  debugLog("autoLoop", { phase: "exit", reason: "no-cmdCtx" });
207
+ finishTurn("stopped", "manual-attention", "missing-command-context");
166
208
  break;
167
209
  }
168
210
 
169
211
  try {
170
212
  // ── Blanket try/catch: one bad iteration must not kill the session
171
213
  const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
214
+ const uokFlags = resolveUokFlags(prefs);
172
215
 
173
216
  // ── Check sidecar queue before deriveState ──
174
217
  let sidecarItem: SidecarItem | undefined;
175
218
  if (s.sidecarQueue.length > 0) {
219
+ if (uokFlags.executionGraph && s.sidecarQueue.length > 1) {
220
+ try {
221
+ s.sidecarQueue = await scheduleSidecarQueue(s.sidecarQueue);
222
+ } catch (err) {
223
+ logWarning("dispatch", `sidecar queue scheduling failed: ${err instanceof Error ? err.message : String(err)}`);
224
+ }
225
+ }
176
226
  sidecarItem = s.sidecarQueue.shift()!;
177
227
  debugLog("autoLoop", {
178
228
  phase: "sidecar-dequeue",
@@ -256,27 +306,53 @@ export async function autoLoop(
256
306
  isRetry: false,
257
307
  previousTier: undefined,
258
308
  };
309
+ observedUnitType = iterData.unitType;
310
+ observedUnitId = iterData.unitId;
259
311
 
260
312
  // ── Progress widget (mirrors dev path in runDispatch) ──
261
313
  deps.updateProgressWidget(ctx, iterData.unitType, iterData.unitId, iterData.state);
262
314
 
263
315
  // ── Guards (shared with dev path) ──
264
316
  const guardsResult = await runGuards(ic, s.currentMilestoneId ?? "workflow");
265
- if (guardsResult.action === "break") break;
317
+ deps.uokObserver?.onPhaseResult("guard", guardsResult.action, {
318
+ unitType: iterData.unitType,
319
+ unitId: iterData.unitId,
320
+ });
321
+ if (guardsResult.action === "break") {
322
+ finishTurn("stopped", "manual-attention", "guard-break");
323
+ break;
324
+ }
266
325
 
267
326
  // ── Unit execution (shared with dev path) ──
268
327
  const unitPhaseResult = await runUnitPhase(ic, iterData, loopState);
269
- if (unitPhaseResult.action === "break") break;
328
+ deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
329
+ unitType: iterData.unitType,
330
+ unitId: iterData.unitId,
331
+ });
332
+ if (unitPhaseResult.action === "break") {
333
+ finishTurn("stopped", "execution", "unit-break");
334
+ break;
335
+ }
270
336
 
271
337
  // ── Verify first, then reconcile (only mark complete on pass) ──
272
338
  debugLog("autoLoop", { phase: "custom-engine-verify", iteration, unitId: iterData.unitId });
273
339
  const verifyResult = await policy.verify(iterData.unitType, iterData.unitId, { basePath: s.basePath });
274
340
  if (verifyResult === "pause") {
275
341
  await deps.pauseAuto(ctx, pi);
342
+ deps.uokObserver?.onPhaseResult("custom-engine", "pause", {
343
+ unitType: iterData.unitType,
344
+ unitId: iterData.unitId,
345
+ });
346
+ finishTurn("paused", "manual-attention", "custom-engine-verify-pause");
276
347
  break;
277
348
  }
278
349
  if (verifyResult === "retry") {
279
350
  debugLog("autoLoop", { phase: "custom-engine-verify-retry", iteration, unitId: iterData.unitId });
351
+ deps.uokObserver?.onPhaseResult("custom-engine", "retry", {
352
+ unitType: iterData.unitType,
353
+ unitId: iterData.unitId,
354
+ });
355
+ finishTurn("retry");
280
356
  continue;
281
357
  }
282
358
 
@@ -299,36 +375,77 @@ export async function autoLoop(
299
375
 
300
376
  if (reconcileResult.outcome === "milestone-complete") {
301
377
  await deps.stopAuto(ctx, pi, "Workflow complete");
378
+ deps.uokObserver?.onPhaseResult("custom-engine", "milestone-complete", {
379
+ unitType: iterData.unitType,
380
+ unitId: iterData.unitId,
381
+ });
382
+ finishTurn("completed");
302
383
  break;
303
384
  }
304
385
  if (reconcileResult.outcome === "pause") {
305
386
  await deps.pauseAuto(ctx, pi);
387
+ deps.uokObserver?.onPhaseResult("custom-engine", "pause", {
388
+ unitType: iterData.unitType,
389
+ unitId: iterData.unitId,
390
+ });
391
+ finishTurn("paused", "manual-attention");
306
392
  break;
307
393
  }
308
394
  if (reconcileResult.outcome === "stop") {
309
395
  await deps.stopAuto(ctx, pi, reconcileResult.reason ?? "Engine stopped");
396
+ deps.uokObserver?.onPhaseResult("custom-engine", "stop", {
397
+ unitType: iterData.unitType,
398
+ unitId: iterData.unitId,
399
+ reason: reconcileResult.reason,
400
+ });
401
+ finishTurn("stopped", "manual-attention", reconcileResult.reason);
310
402
  break;
311
403
  }
404
+ deps.uokObserver?.onPhaseResult("custom-engine", "continue", {
405
+ unitType: iterData.unitType,
406
+ unitId: iterData.unitId,
407
+ });
408
+ finishTurn("completed");
312
409
  continue;
313
410
  }
314
411
 
315
412
  if (!sidecarItem) {
316
413
  // ── Phase 1: Pre-dispatch ─────────────────────────────────────────
317
414
  const preDispatchResult = await runPreDispatch(ic, loopState);
318
- if (preDispatchResult.action === "break") break;
319
- if (preDispatchResult.action === "continue") continue;
415
+ deps.uokObserver?.onPhaseResult("pre-dispatch", preDispatchResult.action);
416
+ if (preDispatchResult.action === "break") {
417
+ finishTurn("stopped", "manual-attention", "pre-dispatch-break");
418
+ break;
419
+ }
420
+ if (preDispatchResult.action === "continue") {
421
+ finishTurn("skipped");
422
+ continue;
423
+ }
320
424
 
321
425
  const preData = preDispatchResult.data;
322
426
 
323
427
  // ── Phase 2: Guards ───────────────────────────────────────────────
324
428
  const guardsResult = await runGuards(ic, preData.mid);
325
- if (guardsResult.action === "break") break;
429
+ deps.uokObserver?.onPhaseResult("guard", guardsResult.action);
430
+ if (guardsResult.action === "break") {
431
+ finishTurn("stopped", "manual-attention", "guard-break");
432
+ break;
433
+ }
326
434
 
327
435
  // ── Phase 3: Dispatch ─────────────────────────────────────────────
328
436
  const dispatchResult = await runDispatch(ic, preData, loopState);
329
- if (dispatchResult.action === "break") break;
330
- if (dispatchResult.action === "continue") continue;
437
+ deps.uokObserver?.onPhaseResult("dispatch", dispatchResult.action);
438
+ if (dispatchResult.action === "break") {
439
+ finishTurn("stopped", "manual-attention", "dispatch-break");
440
+ break;
441
+ }
442
+ if (dispatchResult.action === "continue") {
443
+ finishTurn("skipped");
444
+ continue;
445
+ }
331
446
  iterData = dispatchResult.data;
447
+ observedUnitType = iterData.unitType;
448
+ observedUnitId = iterData.unitId;
332
449
  } else {
333
450
  // ── Sidecar path: use values from the sidecar item directly ──
334
451
  const sidecarState = await deps.deriveState(s.basePath);
@@ -343,22 +460,50 @@ export async function autoLoop(
343
460
  midTitle: sidecarState.activeMilestone?.title,
344
461
  isRetry: false, previousTier: undefined,
345
462
  };
463
+ observedUnitType = iterData.unitType;
464
+ observedUnitId = iterData.unitId;
465
+ deps.uokObserver?.onPhaseResult("dispatch", "sidecar", {
466
+ unitType: iterData.unitType,
467
+ unitId: iterData.unitId,
468
+ sidecarKind: sidecarItem.kind,
469
+ });
346
470
  }
347
471
 
348
472
  const unitPhaseResult = await runUnitPhase(ic, iterData, loopState, sidecarItem);
349
- if (unitPhaseResult.action === "break") break;
473
+ deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
474
+ unitType: iterData.unitType,
475
+ unitId: iterData.unitId,
476
+ });
477
+ if (unitPhaseResult.action === "break") {
478
+ finishTurn("stopped", "execution", "unit-break");
479
+ break;
480
+ }
350
481
 
351
482
  // ── Phase 5: Finalize ───────────────────────────────────────────────
352
483
 
353
484
  const finalizeResult = await runFinalize(ic, iterData, loopState, sidecarItem);
354
- if (finalizeResult.action === "break") break;
355
- if (finalizeResult.action === "continue") continue;
485
+ deps.uokObserver?.onPhaseResult("finalize", finalizeResult.action, {
486
+ unitType: iterData.unitType,
487
+ unitId: iterData.unitId,
488
+ });
489
+ if (finalizeResult.action === "break") {
490
+ const finalizeFailureClass = finalizeResult.reason === "git-closeout-failure"
491
+ ? "git"
492
+ : "closeout";
493
+ finishTurn("stopped", finalizeFailureClass, "finalize-break");
494
+ break;
495
+ }
496
+ if (finalizeResult.action === "continue") {
497
+ finishTurn("retry");
498
+ continue;
499
+ }
356
500
 
357
501
  consecutiveErrors = 0; // Iteration completed successfully
358
502
  consecutiveCooldowns = 0;
359
503
  recentErrorMessages.length = 0;
360
504
  deps.emitJournalEvent({ ts: new Date().toISOString(), flowId, seq: nextSeq(), eventType: "iteration-end", data: { iteration } });
361
505
  debugLog("autoLoop", { phase: "iteration-complete", iteration });
506
+ finishTurn("completed");
362
507
  } catch (loopErr) {
363
508
  // ── Blanket catch: absorb unexpected exceptions, apply graduated recovery ──
364
509
  const msg = loopErr instanceof Error ? loopErr.message : String(loopErr);
@@ -388,6 +533,7 @@ export async function autoLoop(
388
533
  pi,
389
534
  `Infrastructure error (${infraCode}): not recoverable by retry`,
390
535
  );
536
+ finishTurn("failed", "execution", msg);
391
537
  break;
392
538
  }
393
539
 
@@ -429,6 +575,7 @@ export async function autoLoop(
429
575
  "warning",
430
576
  );
431
577
  await new Promise(resolve => setTimeout(resolve, waitMs));
578
+ finishTurn("retry", "timeout", msg);
432
579
  continue; // Retry iteration without incrementing consecutiveErrors
433
580
  }
434
581
 
@@ -455,6 +602,7 @@ export async function autoLoop(
455
602
  pi,
456
603
  `${consecutiveErrors} consecutive iteration failures`,
457
604
  );
605
+ finishTurn("failed", "execution", msg);
458
606
  break;
459
607
  } else if (consecutiveErrors === 2) {
460
608
  // 2nd consecutive: try invalidating caches + re-deriving state
@@ -467,6 +615,7 @@ export async function autoLoop(
467
615
  // 1st error: log and retry — transient failures happen
468
616
  ctx.ui.notify(`Iteration error: ${msg}. Retrying.`, "warning");
469
617
  }
618
+ finishTurn("retry", "execution", msg);
470
619
  }
471
620
  }
472
621
 
@@ -12,6 +12,7 @@ import { importExtensionModule, type ExtensionAPI, type ExtensionContext } from
12
12
  import type { AutoSession, SidecarItem } from "./session.js";
13
13
  import type { LoopDeps } from "./loop-deps.js";
14
14
  import type { PostUnitContext, PreVerificationOpts } from "../auto-post-unit.js";
15
+ import type { Phase } from "../types.js";
15
16
  import {
16
17
  MAX_RECOVERY_CHARS,
17
18
  BUDGET_THRESHOLDS,
@@ -47,6 +48,9 @@ import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "
47
48
  import { getEligibleSlices } from "../slice-parallel-eligibility.js";
48
49
  import { startSliceParallel } from "../slice-parallel-orchestrator.js";
49
50
  import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
51
+ import { ensurePlanV2Graph } from "../uok/plan-v2.js";
52
+ import { resolveUokFlags } from "../uok/flags.js";
53
+ import { UokGateRunner } from "../uok/gate-runner.js";
50
54
  import { resetEvidence } from "../safety/evidence-collector.js";
51
55
  import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
52
56
  import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
@@ -77,6 +81,17 @@ export function _resolveDispatchGuardBasePath(
77
81
  return s.originalBasePath || s.basePath;
78
82
  }
79
83
 
84
+ const PLAN_V2_GATE_PHASES: ReadonlySet<Phase> = new Set([
85
+ "executing",
86
+ "summarizing",
87
+ "validating-milestone",
88
+ "completing-milestone",
89
+ ]);
90
+
91
+ function shouldRunPlanV2Gate(phase: Phase): boolean {
92
+ return PLAN_V2_GATE_PHASES.has(phase);
93
+ }
94
+
80
95
  /**
81
96
  * Generate and write an HTML milestone report snapshot.
82
97
  * Extracted from the milestone-transition block in autoLoop.
@@ -202,14 +217,60 @@ export async function runPreDispatch(
202
217
  loopState: LoopState,
203
218
  ): Promise<PhaseResult<PreDispatchData>> {
204
219
  const { ctx, pi, s, deps, prefs } = ic;
220
+ const uokFlags = resolveUokFlags(prefs);
221
+ const runPreDispatchGate = async (input: {
222
+ gateId: string;
223
+ gateType: string;
224
+ outcome: "pass" | "fail" | "retry" | "manual-attention";
225
+ failureClass: "none" | "policy" | "input" | "execution" | "artifact" | "verification" | "closeout" | "git" | "timeout" | "manual-attention" | "unknown";
226
+ rationale: string;
227
+ findings?: string;
228
+ milestoneId?: string;
229
+ }): Promise<void> => {
230
+ if (!uokFlags.gates) return;
231
+ const gateRunner = new UokGateRunner();
232
+ gateRunner.register({
233
+ id: input.gateId,
234
+ type: input.gateType,
235
+ execute: async () => ({
236
+ outcome: input.outcome,
237
+ failureClass: input.failureClass,
238
+ rationale: input.rationale,
239
+ findings: input.findings ?? "",
240
+ }),
241
+ });
242
+ await gateRunner.run(input.gateId, {
243
+ basePath: s.basePath,
244
+ traceId: `pre-dispatch:${ic.flowId}`,
245
+ turnId: `iter-${ic.iteration}`,
246
+ milestoneId: input.milestoneId ?? s.currentMilestoneId ?? undefined,
247
+ unitType: "pre-dispatch",
248
+ unitId: `iter-${ic.iteration}`,
249
+ });
250
+ };
205
251
 
206
252
  // Resource version guard
207
253
  const staleMsg = deps.checkResourcesStale(s.resourceVersionOnStart);
208
254
  if (staleMsg) {
255
+ await runPreDispatchGate({
256
+ gateId: "resource-version-guard",
257
+ gateType: "policy",
258
+ outcome: "fail",
259
+ failureClass: "policy",
260
+ rationale: "resource version guard blocked dispatch",
261
+ findings: staleMsg,
262
+ });
209
263
  await deps.stopAuto(ctx, pi, staleMsg);
210
264
  debugLog("autoLoop", { phase: "exit", reason: "resources-stale" });
211
265
  return { action: "break", reason: "resources-stale" };
212
266
  }
267
+ await runPreDispatchGate({
268
+ gateId: "resource-version-guard",
269
+ gateType: "policy",
270
+ outcome: "pass",
271
+ failureClass: "none",
272
+ rationale: "resource version guard passed",
273
+ });
213
274
 
214
275
  deps.invalidateAllCaches();
215
276
  s.lastPromptCharCount = undefined;
@@ -225,6 +286,14 @@ export async function runPreDispatch(
225
286
  );
226
287
  }
227
288
  if (!healthGate.proceed) {
289
+ await runPreDispatchGate({
290
+ gateId: "pre-dispatch-health-gate",
291
+ gateType: "execution",
292
+ outcome: "manual-attention",
293
+ failureClass: "manual-attention",
294
+ rationale: "pre-dispatch health gate blocked dispatch",
295
+ findings: healthGate.reason,
296
+ });
228
297
  ctx.ui.notify(
229
298
  healthGate.reason || "Pre-dispatch health check failed — run /gsd doctor for details.",
230
299
  "error",
@@ -233,7 +302,23 @@ export async function runPreDispatch(
233
302
  debugLog("autoLoop", { phase: "exit", reason: "health-gate-failed" });
234
303
  return { action: "break", reason: "health-gate-failed" };
235
304
  }
305
+ await runPreDispatchGate({
306
+ gateId: "pre-dispatch-health-gate",
307
+ gateType: "execution",
308
+ outcome: "pass",
309
+ failureClass: "none",
310
+ rationale: "pre-dispatch health gate passed",
311
+ findings: healthGate.fixesApplied.length > 0 ? healthGate.fixesApplied.join(", ") : "",
312
+ });
236
313
  } catch (e) {
314
+ await runPreDispatchGate({
315
+ gateId: "pre-dispatch-health-gate",
316
+ gateType: "execution",
317
+ outcome: "manual-attention",
318
+ failureClass: "manual-attention",
319
+ rationale: "pre-dispatch health gate threw unexpectedly",
320
+ findings: String(e),
321
+ });
237
322
  logWarning("engine", "Pre-dispatch health gate threw unexpectedly", { error: String(e) });
238
323
  }
239
324
 
@@ -252,6 +337,32 @@ export async function runPreDispatch(
252
337
 
253
338
  // Derive state
254
339
  let state = await deps.deriveState(s.basePath);
340
+ if (prefs?.uok?.plan_v2?.enabled && shouldRunPlanV2Gate(state.phase)) {
341
+ const compiled = ensurePlanV2Graph(s.basePath, state);
342
+ if (!compiled.ok) {
343
+ const reason = compiled.reason ?? "Plan v2 compilation failed";
344
+ await runPreDispatchGate({
345
+ gateId: "plan-v2-gate",
346
+ gateType: "policy",
347
+ outcome: "manual-attention",
348
+ failureClass: "manual-attention",
349
+ rationale: "plan v2 compile gate failed",
350
+ findings: reason,
351
+ milestoneId: state.activeMilestone?.id ?? undefined,
352
+ });
353
+ ctx.ui.notify(`Plan gate failed-closed: ${reason}`, "error");
354
+ await deps.pauseAuto(ctx, pi);
355
+ return { action: "break", reason: "plan-v2-gate-failed" };
356
+ }
357
+ await runPreDispatchGate({
358
+ gateId: "plan-v2-gate",
359
+ gateType: "policy",
360
+ outcome: "pass",
361
+ failureClass: "none",
362
+ rationale: "plan v2 compile gate passed",
363
+ milestoneId: state.activeMilestone?.id ?? undefined,
364
+ });
365
+ }
255
366
  deps.syncCmuxSidebar(prefs, state);
256
367
  let mid = state.activeMilestone?.id;
257
368
  let midTitle = state.activeMilestone?.title;
@@ -297,7 +408,10 @@ export async function runPreDispatch(
297
408
  s.basePath,
298
409
  mid,
299
410
  eligible,
300
- { maxWorkers: prefs.slice_parallel.max_workers ?? 2 },
411
+ {
412
+ maxWorkers: prefs.slice_parallel.max_workers ?? 2,
413
+ useExecutionGraph: uokFlags.executionGraph,
414
+ },
301
415
  );
302
416
  if (result.started.length > 0) {
303
417
  ctx.ui.notify(
@@ -1117,6 +1231,8 @@ export async function runUnitPhase(
1117
1231
  // unit in the same Node process (see workflow-logger.ts module header).
1118
1232
  _resetLogs();
1119
1233
  s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
1234
+ s.lastGitActionFailure = null;
1235
+ s.lastGitActionStatus = null;
1120
1236
  setCurrentPhase(unitType);
1121
1237
  s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
1122
1238
  const unitStartSeq = ic.nextSeq();
@@ -1625,11 +1741,15 @@ export async function runFinalize(
1625
1741
 
1626
1742
  const preResult = preResultGuard.value;
1627
1743
  if (preResult === "dispatched") {
1744
+ const dispatchedReason = s.lastGitActionFailure
1745
+ ? "git-closeout-failure"
1746
+ : "pre-verification-dispatched";
1628
1747
  debugLog("autoLoop", {
1629
1748
  phase: "exit",
1630
- reason: "pre-verification-dispatched",
1749
+ reason: dispatchedReason,
1750
+ gitError: s.lastGitActionFailure ?? undefined,
1631
1751
  });
1632
- return { action: "break", reason: "pre-verification-dispatched" };
1752
+ return { action: "break", reason: dispatchedReason };
1633
1753
  }
1634
1754
  if (preResult === "retry") {
1635
1755
  if (sidecarItem) {
@@ -106,6 +106,8 @@ export class AutoSession {
106
106
 
107
107
  // ── Current unit ─────────────────────────────────────────────────────────
108
108
  currentUnit: CurrentUnit | null = null;
109
+ currentTraceId: string | null = null;
110
+ currentTurnId: string | null = null;
109
111
  currentUnitRouting: UnitRouting | null = null;
110
112
  currentMilestoneId: string | null = null;
111
113
 
@@ -137,6 +139,10 @@ export class AutoSession {
137
139
  /** Set when a GSD tool execution ends with isError due to malformed/truncated
138
140
  * JSON arguments. Checked by postUnitPreVerification to break retry loops. */
139
141
  lastToolInvocationError: string | null = null;
142
+ /** Set when turn-level git action fails during closeout. */
143
+ lastGitActionFailure: string | null = null;
144
+ /** Last turn-level git action status captured during finalize. */
145
+ lastGitActionStatus: "ok" | "failed" | null = null;
140
146
 
141
147
  // ── Isolation degradation ────────────────────────────────────────────
142
148
  /** Set to true when worktree creation fails; prevents merge of nonexistent branch. */
@@ -219,6 +225,8 @@ export class AutoSession {
219
225
 
220
226
  // Unit
221
227
  this.currentUnit = null;
228
+ this.currentTraceId = null;
229
+ this.currentTurnId = null;
222
230
  this.currentUnitRouting = null;
223
231
  this.currentMilestoneId = null;
224
232
 
@@ -250,6 +258,8 @@ export class AutoSession {
250
258
  this.rewriteAttemptCount = 0;
251
259
  this.consecutiveCompleteBootstraps = 0;
252
260
  this.lastToolInvocationError = null;
261
+ this.lastGitActionFailure = null;
262
+ this.lastGitActionStatus = null;
253
263
  this.isolationDegraded = false;
254
264
  this.milestoneMergedInPhases = false;
255
265
  this.checkpointSha = null;
@@ -53,6 +53,8 @@ import {
53
53
  checkNeedsRunUat,
54
54
  } from "./auto-prompts.js";
55
55
  import { resolveModelWithFallbacksForUnit } from "./preferences-models.js";
56
+ import { resolveUokFlags } from "./uok/flags.js";
57
+ import { selectReactiveDispatchBatch } from "./uok/execution-graph.js";
56
58
 
57
59
  // ─── Types ────────────────────────────────────────────────────────────────
58
60
 
@@ -584,12 +586,20 @@ export const DISPATCH_RULES: DispatchRule[] = [
584
586
  // Only activate reactive dispatch when >1 task is ready
585
587
  if (readyIds.length <= 1) return null;
586
588
 
587
- const selected = chooseNonConflictingSubset(
588
- readyIds,
589
- graph,
590
- maxParallel,
591
- new Set(),
592
- );
589
+ const uokFlags = resolveUokFlags(prefs);
590
+ const selected = uokFlags.executionGraph
591
+ ? selectReactiveDispatchBatch({
592
+ graph,
593
+ readyIds,
594
+ maxParallel,
595
+ inFlightOutputs: new Set(),
596
+ }).selected
597
+ : chooseNonConflictingSubset(
598
+ readyIds,
599
+ graph,
600
+ maxParallel,
601
+ new Set(),
602
+ );
593
603
  if (selected.length <= 1) return null;
594
604
 
595
605
  // Log graph metrics for observability