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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. package/dist/cli.js +85 -0
  2. package/dist/headless-query.js +4 -1
  3. package/dist/help-text.js +23 -0
  4. package/dist/resources/extensions/gsd/activity-log.js +16 -0
  5. package/dist/resources/extensions/gsd/auto/detect-stuck.js +11 -4
  6. package/dist/resources/extensions/gsd/auto/loop.js +147 -10
  7. package/dist/resources/extensions/gsd/auto/phases.js +158 -4
  8. package/dist/resources/extensions/gsd/auto/session.js +10 -0
  9. package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
  10. package/dist/resources/extensions/gsd/auto-model-selection.js +51 -5
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +220 -17
  12. package/dist/resources/extensions/gsd/auto-prompts.js +12 -0
  13. package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
  14. package/dist/resources/extensions/gsd/auto-verification.js +100 -2
  15. package/dist/resources/extensions/gsd/auto.js +36 -4
  16. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
  17. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +45 -4
  18. package/dist/resources/extensions/gsd/commands/catalog.js +26 -1
  19. package/dist/resources/extensions/gsd/commands/handlers/ops.js +25 -0
  20. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +68 -9
  21. package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
  22. package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
  23. package/dist/resources/extensions/gsd/commands-do.js +79 -0
  24. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  25. package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
  26. package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
  27. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  28. package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
  29. package/dist/resources/extensions/gsd/commands-ship.js +187 -0
  30. package/dist/resources/extensions/gsd/db-writer.js +3 -5
  31. package/dist/resources/extensions/gsd/docs/preferences-reference.md +14 -1
  32. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  33. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  34. package/dist/resources/extensions/gsd/git-service.js +49 -1
  35. package/dist/resources/extensions/gsd/graph-context.js +157 -0
  36. package/dist/resources/extensions/gsd/gsd-db.js +581 -2
  37. package/dist/resources/extensions/gsd/guided-flow.js +23 -0
  38. package/dist/resources/extensions/gsd/index.js +15 -2
  39. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  40. package/dist/resources/extensions/gsd/journal.js +27 -0
  41. package/dist/resources/extensions/gsd/md-importer.js +3 -4
  42. package/dist/resources/extensions/gsd/memory-store.js +19 -51
  43. package/dist/resources/extensions/gsd/metrics.js +19 -0
  44. package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
  45. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -4
  46. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  47. package/dist/resources/extensions/gsd/preferences-models.js +20 -3
  48. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  49. package/dist/resources/extensions/gsd/preferences-validation.js +108 -2
  50. package/dist/resources/extensions/gsd/preferences.js +26 -0
  51. package/dist/resources/extensions/gsd/prompts/add-tests.md +35 -0
  52. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  53. package/dist/resources/extensions/gsd/state.js +5 -1
  54. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  55. package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
  56. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  57. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
  58. package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
  59. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  60. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  61. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  62. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  63. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  64. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  65. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  66. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  67. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  68. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  69. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  70. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  71. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  72. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -69
  73. package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
  74. package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
  75. package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
  76. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  77. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  78. package/dist/web/standalone/.next/BUILD_ID +1 -1
  79. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  80. package/dist/web/standalone/.next/build-manifest.json +2 -2
  81. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  82. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  83. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/index.html +1 -1
  104. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  111. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  112. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  114. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  115. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  116. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  117. package/package.json +3 -2
  118. package/packages/daemon/package.json +2 -2
  119. package/packages/mcp-server/dist/index.d.ts +3 -0
  120. package/packages/mcp-server/dist/index.d.ts.map +1 -1
  121. package/packages/mcp-server/dist/index.js +3 -0
  122. package/packages/mcp-server/dist/index.js.map +1 -1
  123. package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
  124. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
  125. package/packages/mcp-server/dist/readers/graph.js +655 -0
  126. package/packages/mcp-server/dist/readers/graph.js.map +1 -0
  127. package/packages/mcp-server/dist/readers/index.d.ts +2 -0
  128. package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
  129. package/packages/mcp-server/dist/readers/index.js +1 -0
  130. package/packages/mcp-server/dist/readers/index.js.map +1 -1
  131. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  132. package/packages/mcp-server/dist/server.js +65 -0
  133. package/packages/mcp-server/dist/server.js.map +1 -1
  134. package/packages/mcp-server/package.json +2 -2
  135. package/packages/mcp-server/src/index.ts +15 -0
  136. package/packages/mcp-server/src/readers/graph.test.ts +604 -0
  137. package/packages/mcp-server/src/readers/graph.ts +855 -0
  138. package/packages/mcp-server/src/readers/index.ts +12 -0
  139. package/packages/mcp-server/src/server.ts +83 -0
  140. package/packages/mcp-server/tsconfig.json +1 -0
  141. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
  142. package/packages/native/package.json +2 -2
  143. package/packages/native/tsconfig.tsbuildinfo +1 -0
  144. package/packages/pi-agent-core/package.json +1 -1
  145. package/packages/pi-agent-core/tsconfig.json +1 -0
  146. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
  147. package/packages/pi-ai/dist/index.d.ts +1 -9
  148. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  149. package/packages/pi-ai/dist/index.js +1 -9
  150. package/packages/pi-ai/dist/index.js.map +1 -1
  151. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  152. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  153. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  154. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  155. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  156. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  157. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  158. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  159. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  160. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  161. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  162. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  163. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  164. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  165. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  166. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  167. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  168. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  169. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  170. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  171. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  172. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  173. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  174. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  175. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  176. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  177. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  178. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  179. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  180. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  181. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  182. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  183. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  184. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  185. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  186. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  187. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  188. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  189. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  190. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  191. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  192. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  193. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  194. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  195. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  196. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  197. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  198. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  199. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  200. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  201. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  202. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  203. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  204. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  205. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  206. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  207. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  208. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  209. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  210. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  211. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  212. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  213. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  214. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  215. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  216. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  217. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  218. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  219. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  220. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  221. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  222. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  223. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  224. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  225. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  226. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  227. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  228. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  229. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  230. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  231. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  232. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  233. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  234. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  235. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  236. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  237. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  238. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  239. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  240. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  241. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  242. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  243. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  244. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  245. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  246. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  247. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  248. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  249. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  250. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  251. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  252. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  253. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  254. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  255. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  256. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  257. package/packages/pi-ai/dist/models/index.js +80 -0
  258. package/packages/pi-ai/dist/models/index.js.map +1 -0
  259. package/packages/pi-ai/dist/models.d.ts +1 -36
  260. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  261. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  262. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  263. package/packages/pi-ai/dist/models.js +3 -112
  264. package/packages/pi-ai/dist/models.js.map +1 -1
  265. package/packages/pi-ai/dist/models.test.js +6 -5
  266. package/packages/pi-ai/dist/models.test.js.map +1 -1
  267. package/packages/pi-ai/package.json +1 -1
  268. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  269. package/packages/pi-ai/src/index.ts +1 -9
  270. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  271. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  272. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  273. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  274. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  275. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  276. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  277. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  278. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  279. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  280. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  281. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  282. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  283. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  284. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  285. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  286. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  287. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  288. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  289. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  290. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  291. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  292. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  293. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  294. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  295. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  296. package/packages/pi-ai/src/models/index.ts +106 -0
  297. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  298. package/packages/pi-ai/src/models.test.ts +6 -5
  299. package/packages/pi-ai/src/models.ts +3 -153
  300. package/packages/pi-ai/tsconfig.json +1 -0
  301. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
  302. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
  304. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
  306. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  308. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  310. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  313. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
  315. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +47 -0
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
  324. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +51 -8
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
  332. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  334. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  335. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  336. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  337. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +13 -0
  338. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +53 -6
  340. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  341. package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
  342. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
  343. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  344. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  345. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
  346. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
  347. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +67 -0
  348. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +66 -7
  349. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
  350. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
  351. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  352. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +73 -6
  353. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  354. package/packages/pi-coding-agent/tsconfig.json +3 -2
  355. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
  356. package/packages/pi-tui/package.json +1 -1
  357. package/packages/pi-tui/tsconfig.json +1 -0
  358. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
  359. package/packages/rpc-client/package.json +1 -1
  360. package/packages/rpc-client/tsconfig.json +1 -0
  361. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
  362. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  363. package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
  364. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
  365. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  366. package/src/resources/extensions/gsd/auto/phases.ts +191 -4
  367. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  368. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
  369. package/src/resources/extensions/gsd/auto-model-selection.ts +66 -5
  370. package/src/resources/extensions/gsd/auto-post-unit.ts +238 -18
  371. package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
  372. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  373. package/src/resources/extensions/gsd/auto-verification.ts +129 -2
  374. package/src/resources/extensions/gsd/auto.ts +41 -2
  375. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
  376. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +56 -3
  377. package/src/resources/extensions/gsd/commands/catalog.ts +26 -1
  378. package/src/resources/extensions/gsd/commands/handlers/ops.ts +25 -0
  379. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
  380. package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
  381. package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
  382. package/src/resources/extensions/gsd/commands-do.ts +109 -0
  383. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  384. package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
  385. package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
  386. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  387. package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
  388. package/src/resources/extensions/gsd/commands-ship.ts +219 -0
  389. package/src/resources/extensions/gsd/db-writer.ts +3 -5
  390. package/src/resources/extensions/gsd/docs/preferences-reference.md +14 -1
  391. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  392. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  393. package/src/resources/extensions/gsd/git-service.ts +68 -0
  394. package/src/resources/extensions/gsd/graph-context.ts +212 -0
  395. package/src/resources/extensions/gsd/gsd-db.ts +788 -3
  396. package/src/resources/extensions/gsd/guided-flow.ts +32 -0
  397. package/src/resources/extensions/gsd/index.ts +18 -2
  398. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  399. package/src/resources/extensions/gsd/journal.ts +30 -0
  400. package/src/resources/extensions/gsd/md-importer.ts +3 -5
  401. package/src/resources/extensions/gsd/memory-store.ts +31 -62
  402. package/src/resources/extensions/gsd/metrics.ts +26 -0
  403. package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
  404. package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
  405. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  406. package/src/resources/extensions/gsd/preferences-models.ts +20 -3
  407. package/src/resources/extensions/gsd/preferences-types.ts +32 -0
  408. package/src/resources/extensions/gsd/preferences-validation.ts +107 -2
  409. package/src/resources/extensions/gsd/preferences.ts +28 -0
  410. package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
  411. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  412. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  413. package/src/resources/extensions/gsd/state.ts +9 -2
  414. package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  415. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
  416. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  417. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  418. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  419. package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
  420. package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
  421. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  422. package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
  423. package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
  424. package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
  425. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -0
  426. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  427. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  428. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
  429. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  430. package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
  431. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  432. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  433. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +68 -1
  434. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  435. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  436. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
  437. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  438. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  439. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  440. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  441. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
  442. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
  443. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  444. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  445. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  446. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  447. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  448. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  449. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  450. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  451. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  452. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  453. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  454. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +223 -0
  455. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
  456. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  457. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
  458. package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
  459. package/src/resources/extensions/gsd/types.ts +14 -1
  460. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  461. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  462. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  463. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  464. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  465. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  466. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  467. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  468. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  469. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  470. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  471. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  472. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  473. package/src/resources/extensions/gsd/workflow-manifest.ts +9 -104
  474. package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
  475. package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
  476. package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
  477. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  478. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  479. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  480. package/packages/pi-ai/dist/models.generated.js +0 -14343
  481. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  482. package/packages/pi-ai/src/models.generated.ts +0 -14345
  483. /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → 3U-oZ5FT59BM7sm2GInic}/_buildManifest.js +0 -0
  484. /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → 3U-oZ5FT59BM7sm2GInic}/_ssgManifest.js +0 -0
@@ -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,
@@ -30,7 +31,15 @@ import { MergeConflictError } from "../git-service.js";
30
31
  import { setCurrentPhase, clearCurrentPhase } from "../../shared/gsd-phase-state.js";
31
32
  import { join, basename, dirname, parse as parsePath } from "node:path";
32
33
  import { existsSync, cpSync, readdirSync } from "node:fs";
33
- import { logWarning, logError } from "../workflow-logger.js";
34
+ import {
35
+ logWarning,
36
+ logError,
37
+ _resetLogs,
38
+ drainLogs,
39
+ drainAndSummarize,
40
+ formatForNotification,
41
+ hasAnyIssues,
42
+ } from "../workflow-logger.js";
34
43
  import { gsdRoot } from "../paths.js";
35
44
  import { atomicWriteSync } from "../atomic-write.js";
36
45
  import { verifyExpectedArtifact, diagnoseExpectedArtifact, buildLoopRemediationSteps } from "../auto-recovery.js";
@@ -39,6 +48,9 @@ import { withTimeout, FINALIZE_PRE_TIMEOUT_MS, FINALIZE_POST_TIMEOUT_MS } from "
39
48
  import { getEligibleSlices } from "../slice-parallel-eligibility.js";
40
49
  import { startSliceParallel } from "../slice-parallel-orchestrator.js";
41
50
  import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
51
+ import { ensurePlanV2Graph } from "../uok/plan-v2.js";
52
+ import { resolveUokFlags } from "../uok/flags.js";
53
+ import { UokGateRunner } from "../uok/gate-runner.js";
42
54
  import { resetEvidence } from "../safety/evidence-collector.js";
43
55
  import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
44
56
  import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
@@ -69,6 +81,17 @@ export function _resolveDispatchGuardBasePath(
69
81
  return s.originalBasePath || s.basePath;
70
82
  }
71
83
 
84
+ const PLAN_V2_GATE_PHASES: ReadonlySet<Phase> = new Set([
85
+ "executing",
86
+ "summarizing",
87
+ "validating-milestone",
88
+ "completing-milestone",
89
+ ]);
90
+
91
+ function shouldRunPlanV2Gate(phase: Phase): boolean {
92
+ return PLAN_V2_GATE_PHASES.has(phase);
93
+ }
94
+
72
95
  /**
73
96
  * Generate and write an HTML milestone report snapshot.
74
97
  * Extracted from the milestone-transition block in autoLoop.
@@ -159,6 +182,29 @@ async function closeoutAndStop(
159
182
  await deps.stopAuto(ctx, pi, reason);
160
183
  }
161
184
 
185
+ async function emitCancelledUnitEnd(
186
+ ic: IterationContext,
187
+ unitType: string,
188
+ unitId: string,
189
+ unitStartSeq: number,
190
+ errorContext?: { message: string; category: string; stopReason?: string; isTransient?: boolean; retryAfterMs?: number },
191
+ ): Promise<void> {
192
+ ic.deps.emitJournalEvent({
193
+ ts: new Date().toISOString(),
194
+ flowId: ic.flowId,
195
+ seq: ic.nextSeq(),
196
+ eventType: "unit-end",
197
+ data: {
198
+ unitType,
199
+ unitId,
200
+ status: "cancelled",
201
+ artifactVerified: false,
202
+ ...(errorContext ? { errorContext } : {}),
203
+ },
204
+ causedBy: { flowId: ic.flowId, seq: unitStartSeq },
205
+ });
206
+ }
207
+
162
208
  // ─── runPreDispatch ───────────────────────────────────────────────────────────
163
209
 
164
210
  /**
@@ -171,14 +217,60 @@ export async function runPreDispatch(
171
217
  loopState: LoopState,
172
218
  ): Promise<PhaseResult<PreDispatchData>> {
173
219
  const { ctx, pi, s, deps, prefs } = ic;
220
+ const uokFlags = resolveUokFlags(prefs);
221
+ const runPreDispatchGate = async (input: {
222
+ gateId: string;
223
+ gateType: string;
224
+ outcome: "pass" | "fail" | "retry" | "manual-attention";
225
+ failureClass: "none" | "policy" | "input" | "execution" | "artifact" | "verification" | "closeout" | "git" | "timeout" | "manual-attention" | "unknown";
226
+ rationale: string;
227
+ findings?: string;
228
+ milestoneId?: string;
229
+ }): Promise<void> => {
230
+ if (!uokFlags.gates) return;
231
+ const gateRunner = new UokGateRunner();
232
+ gateRunner.register({
233
+ id: input.gateId,
234
+ type: input.gateType,
235
+ execute: async () => ({
236
+ outcome: input.outcome,
237
+ failureClass: input.failureClass,
238
+ rationale: input.rationale,
239
+ findings: input.findings ?? "",
240
+ }),
241
+ });
242
+ await gateRunner.run(input.gateId, {
243
+ basePath: s.basePath,
244
+ traceId: `pre-dispatch:${ic.flowId}`,
245
+ turnId: `iter-${ic.iteration}`,
246
+ milestoneId: input.milestoneId ?? s.currentMilestoneId ?? undefined,
247
+ unitType: "pre-dispatch",
248
+ unitId: `iter-${ic.iteration}`,
249
+ });
250
+ };
174
251
 
175
252
  // Resource version guard
176
253
  const staleMsg = deps.checkResourcesStale(s.resourceVersionOnStart);
177
254
  if (staleMsg) {
255
+ await runPreDispatchGate({
256
+ gateId: "resource-version-guard",
257
+ gateType: "policy",
258
+ outcome: "fail",
259
+ failureClass: "policy",
260
+ rationale: "resource version guard blocked dispatch",
261
+ findings: staleMsg,
262
+ });
178
263
  await deps.stopAuto(ctx, pi, staleMsg);
179
264
  debugLog("autoLoop", { phase: "exit", reason: "resources-stale" });
180
265
  return { action: "break", reason: "resources-stale" };
181
266
  }
267
+ await runPreDispatchGate({
268
+ gateId: "resource-version-guard",
269
+ gateType: "policy",
270
+ outcome: "pass",
271
+ failureClass: "none",
272
+ rationale: "resource version guard passed",
273
+ });
182
274
 
183
275
  deps.invalidateAllCaches();
184
276
  s.lastPromptCharCount = undefined;
@@ -194,6 +286,14 @@ export async function runPreDispatch(
194
286
  );
195
287
  }
196
288
  if (!healthGate.proceed) {
289
+ await runPreDispatchGate({
290
+ gateId: "pre-dispatch-health-gate",
291
+ gateType: "execution",
292
+ outcome: "manual-attention",
293
+ failureClass: "manual-attention",
294
+ rationale: "pre-dispatch health gate blocked dispatch",
295
+ findings: healthGate.reason,
296
+ });
197
297
  ctx.ui.notify(
198
298
  healthGate.reason || "Pre-dispatch health check failed — run /gsd doctor for details.",
199
299
  "error",
@@ -202,7 +302,23 @@ export async function runPreDispatch(
202
302
  debugLog("autoLoop", { phase: "exit", reason: "health-gate-failed" });
203
303
  return { action: "break", reason: "health-gate-failed" };
204
304
  }
305
+ await runPreDispatchGate({
306
+ gateId: "pre-dispatch-health-gate",
307
+ gateType: "execution",
308
+ outcome: "pass",
309
+ failureClass: "none",
310
+ rationale: "pre-dispatch health gate passed",
311
+ findings: healthGate.fixesApplied.length > 0 ? healthGate.fixesApplied.join(", ") : "",
312
+ });
205
313
  } catch (e) {
314
+ await runPreDispatchGate({
315
+ gateId: "pre-dispatch-health-gate",
316
+ gateType: "execution",
317
+ outcome: "manual-attention",
318
+ failureClass: "manual-attention",
319
+ rationale: "pre-dispatch health gate threw unexpectedly",
320
+ findings: String(e),
321
+ });
206
322
  logWarning("engine", "Pre-dispatch health gate threw unexpectedly", { error: String(e) });
207
323
  }
208
324
 
@@ -221,6 +337,32 @@ export async function runPreDispatch(
221
337
 
222
338
  // Derive state
223
339
  let state = await deps.deriveState(s.basePath);
340
+ if (prefs?.uok?.plan_v2?.enabled && shouldRunPlanV2Gate(state.phase)) {
341
+ const compiled = ensurePlanV2Graph(s.basePath, state);
342
+ if (!compiled.ok) {
343
+ const reason = compiled.reason ?? "Plan v2 compilation failed";
344
+ await runPreDispatchGate({
345
+ gateId: "plan-v2-gate",
346
+ gateType: "policy",
347
+ outcome: "manual-attention",
348
+ failureClass: "manual-attention",
349
+ rationale: "plan v2 compile gate failed",
350
+ findings: reason,
351
+ milestoneId: state.activeMilestone?.id ?? undefined,
352
+ });
353
+ ctx.ui.notify(`Plan gate failed-closed: ${reason}`, "error");
354
+ await deps.pauseAuto(ctx, pi);
355
+ return { action: "break", reason: "plan-v2-gate-failed" };
356
+ }
357
+ await runPreDispatchGate({
358
+ gateId: "plan-v2-gate",
359
+ gateType: "policy",
360
+ outcome: "pass",
361
+ failureClass: "none",
362
+ rationale: "plan v2 compile gate passed",
363
+ milestoneId: state.activeMilestone?.id ?? undefined,
364
+ });
365
+ }
224
366
  deps.syncCmuxSidebar(prefs, state);
225
367
  let mid = state.activeMilestone?.id;
226
368
  let midTitle = state.activeMilestone?.title;
@@ -266,7 +408,10 @@ export async function runPreDispatch(
266
408
  s.basePath,
267
409
  mid,
268
410
  eligible,
269
- { maxWorkers: prefs.slice_parallel.max_workers ?? 2 },
411
+ {
412
+ maxWorkers: prefs.slice_parallel.max_workers ?? 2,
413
+ useExecutionGraph: uokFlags.executionGraph,
414
+ },
270
415
  );
271
416
  if (result.started.length > 0) {
272
417
  ctx.ui.notify(
@@ -1081,7 +1226,13 @@ export async function runUnitPhase(
1081
1226
  );
1082
1227
  const previousTier = s.currentUnitRouting?.tier;
1083
1228
 
1229
+ // Scope workflow-logger buffer to this unit so post-finalize drains are
1230
+ // per-unit. Without this, the module-level _buffer accumulates across every
1231
+ // unit in the same Node process (see workflow-logger.ts module header).
1232
+ _resetLogs();
1084
1233
  s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
1234
+ s.lastGitActionFailure = null;
1235
+ s.lastGitActionStatus = null;
1085
1236
  setCurrentPhase(unitType);
1086
1237
  s.lastToolInvocationError = null; // #2883: clear stale error from previous unit
1087
1238
  const unitStartSeq = ic.nextSeq();
@@ -1347,6 +1498,7 @@ export async function runUnitPhase(
1347
1498
  // Provider-error pause: pauseAuto already handled cleanup and scheduled
1348
1499
  // recovery. Don't hard-stop — just break out of the loop (#2762).
1349
1500
  if (unitResult.errorContext?.category === "provider") {
1501
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1350
1502
  debugLog("autoLoop", { phase: "exit", reason: "provider-pause", isTransient: unitResult.errorContext.isTransient });
1351
1503
  return { action: "break", reason: "provider-pause" };
1352
1504
  }
@@ -1365,9 +1517,23 @@ export async function runUnitPhase(
1365
1517
  );
1366
1518
  debugLog("autoLoop", { phase: "session-timeout-pause", unitType, unitId });
1367
1519
  await deps.pauseAuto(ctx, pi);
1520
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
1521
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1368
1522
  return { action: "break", reason: "session-timeout" };
1369
1523
  }
1370
1524
  // All other cancelled states (structural errors, non-transient failures): hard stop
1525
+ if (s.currentUnit) {
1526
+ await deps.closeoutUnit(
1527
+ ctx,
1528
+ s.basePath,
1529
+ unitType,
1530
+ unitId,
1531
+ s.currentUnit.startedAt,
1532
+ deps.buildSnapshotOpts(unitType, unitId),
1533
+ );
1534
+ }
1535
+ await deps.autoCommitUnit?.(s.basePath, unitType, unitId, ctx);
1536
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, unitResult.errorContext);
1371
1537
  ctx.ui.notify(
1372
1538
  `Session creation failed for ${unitType} ${unitId}: ${unitResult.errorContext?.message ?? "unknown"}. Stopping auto-mode.`,
1373
1539
  "warning",
@@ -1545,6 +1711,9 @@ export async function runFinalize(
1545
1711
  // cannot mutate state for the next unit (#3757).
1546
1712
  s.currentUnit = null;
1547
1713
  clearCurrentPhase();
1714
+ // Drop any logger entries from the timed-out unit so they don't bleed
1715
+ // into the next iteration's drain.
1716
+ drainLogs();
1548
1717
  loopState.consecutiveFinalizeTimeouts++;
1549
1718
  debugLog("autoLoop", {
1550
1719
  phase: "pre-verification-timeout",
@@ -1572,11 +1741,15 @@ export async function runFinalize(
1572
1741
 
1573
1742
  const preResult = preResultGuard.value;
1574
1743
  if (preResult === "dispatched") {
1744
+ const dispatchedReason = s.lastGitActionFailure
1745
+ ? "git-closeout-failure"
1746
+ : "pre-verification-dispatched";
1575
1747
  debugLog("autoLoop", {
1576
1748
  phase: "exit",
1577
- reason: "pre-verification-dispatched",
1749
+ reason: dispatchedReason,
1750
+ gitError: s.lastGitActionFailure ?? undefined,
1578
1751
  });
1579
- return { action: "break", reason: "pre-verification-dispatched" };
1752
+ return { action: "break", reason: dispatchedReason };
1580
1753
  }
1581
1754
  if (preResult === "retry") {
1582
1755
  if (sidecarItem) {
@@ -1643,6 +1816,9 @@ export async function runFinalize(
1643
1816
  // cannot mutate state for the next unit (#3757).
1644
1817
  s.currentUnit = null;
1645
1818
  clearCurrentPhase();
1819
+ // Drop any logger entries from the timed-out unit so they don't bleed
1820
+ // into the next iteration's drain.
1821
+ drainLogs();
1646
1822
  loopState.consecutiveFinalizeTimeouts++;
1647
1823
  debugLog("autoLoop", {
1648
1824
  phase: "post-verification-timeout",
@@ -1687,5 +1863,16 @@ export async function runFinalize(
1687
1863
  // Both pre and post verification completed without timeout — reset counter
1688
1864
  loopState.consecutiveFinalizeTimeouts = 0;
1689
1865
 
1866
+ // Surface accumulated workflow-logger issues for this unit to the user.
1867
+ // Warnings/errors logged during the unit are buffered in the logger and
1868
+ // drained here so the user sees a single consolidated post-unit alert.
1869
+ if (hasAnyIssues()) {
1870
+ const { logs } = drainAndSummarize();
1871
+ if (logs.length > 0) {
1872
+ const severity = logs.some((e) => e.severity === "error") ? "error" : "warning";
1873
+ ctx.ui.notify(formatForNotification(logs), severity);
1874
+ }
1875
+ }
1876
+
1690
1877
  return { action: "next", data: undefined as void };
1691
1878
  }
@@ -106,6 +106,8 @@ export class AutoSession {
106
106
 
107
107
  // ── Current unit ─────────────────────────────────────────────────────────
108
108
  currentUnit: CurrentUnit | null = null;
109
+ currentTraceId: string | null = null;
110
+ currentTurnId: string | null = null;
109
111
  currentUnitRouting: UnitRouting | null = null;
110
112
  currentMilestoneId: string | null = null;
111
113
 
@@ -137,6 +139,10 @@ export class AutoSession {
137
139
  /** Set when a GSD tool execution ends with isError due to malformed/truncated
138
140
  * JSON arguments. Checked by postUnitPreVerification to break retry loops. */
139
141
  lastToolInvocationError: string | null = null;
142
+ /** Set when turn-level git action fails during closeout. */
143
+ lastGitActionFailure: string | null = null;
144
+ /** Last turn-level git action status captured during finalize. */
145
+ lastGitActionStatus: "ok" | "failed" | null = null;
140
146
 
141
147
  // ── Isolation degradation ────────────────────────────────────────────
142
148
  /** Set to true when worktree creation fails; prevents merge of nonexistent branch. */
@@ -219,6 +225,8 @@ export class AutoSession {
219
225
 
220
226
  // Unit
221
227
  this.currentUnit = null;
228
+ this.currentTraceId = null;
229
+ this.currentTurnId = null;
222
230
  this.currentUnitRouting = null;
223
231
  this.currentMilestoneId = null;
224
232
 
@@ -250,6 +258,8 @@ export class AutoSession {
250
258
  this.rewriteAttemptCount = 0;
251
259
  this.consecutiveCompleteBootstraps = 0;
252
260
  this.lastToolInvocationError = null;
261
+ this.lastGitActionFailure = null;
262
+ this.lastGitActionStatus = null;
253
263
  this.isolationDegraded = false;
254
264
  this.milestoneMergedInPhases = false;
255
265
  this.checkpointSha = null;