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
@@ -31,7 +31,7 @@ let providerModule = null;
31
31
  let loadAttempted = false;
32
32
  function suppressSqliteWarning() {
33
33
  const origEmit = process.emit;
34
- // @ts-expect-error overriding process.emit for warning filter
34
+ // Override via loose cast: Node's overloaded emit signature is not directly assignable.
35
35
  process.emit = function (event, ...args) {
36
36
  if (event === "warning" &&
37
37
  args[0] &&
@@ -135,7 +135,7 @@ function openRawDb(path) {
135
135
  const Database = providerModule;
136
136
  return new Database(path);
137
137
  }
138
- const SCHEMA_VERSION = 14;
138
+ const SCHEMA_VERSION = 15;
139
139
  function indexExists(db, name) {
140
140
  return !!db.prepare("SELECT 1 as present FROM sqlite_master WHERE type = 'index' AND name = ?").get(name);
141
141
  }
@@ -383,6 +383,66 @@ function initSchema(db, fileBacked) {
383
383
  FOREIGN KEY (milestone_id, slice_id) REFERENCES slices(milestone_id, id),
384
384
  FOREIGN KEY (milestone_id, depends_on_slice_id) REFERENCES slices(milestone_id, id)
385
385
  )
386
+ `);
387
+ db.exec(`
388
+ CREATE TABLE IF NOT EXISTS gate_runs (
389
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
390
+ trace_id TEXT NOT NULL,
391
+ turn_id TEXT NOT NULL,
392
+ gate_id TEXT NOT NULL,
393
+ gate_type TEXT NOT NULL DEFAULT '',
394
+ unit_type TEXT DEFAULT NULL,
395
+ unit_id TEXT DEFAULT NULL,
396
+ milestone_id TEXT DEFAULT NULL,
397
+ slice_id TEXT DEFAULT NULL,
398
+ task_id TEXT DEFAULT NULL,
399
+ outcome TEXT NOT NULL DEFAULT 'pass',
400
+ failure_class TEXT NOT NULL DEFAULT 'none',
401
+ rationale TEXT NOT NULL DEFAULT '',
402
+ findings TEXT NOT NULL DEFAULT '',
403
+ attempt INTEGER NOT NULL DEFAULT 1,
404
+ max_attempts INTEGER NOT NULL DEFAULT 1,
405
+ retryable INTEGER NOT NULL DEFAULT 0,
406
+ evaluated_at TEXT NOT NULL DEFAULT ''
407
+ )
408
+ `);
409
+ db.exec(`
410
+ CREATE TABLE IF NOT EXISTS turn_git_transactions (
411
+ trace_id TEXT NOT NULL,
412
+ turn_id TEXT NOT NULL,
413
+ unit_type TEXT DEFAULT NULL,
414
+ unit_id TEXT DEFAULT NULL,
415
+ stage TEXT NOT NULL DEFAULT 'turn-start',
416
+ action TEXT NOT NULL DEFAULT 'status-only',
417
+ push INTEGER NOT NULL DEFAULT 0,
418
+ status TEXT NOT NULL DEFAULT 'ok',
419
+ error TEXT DEFAULT NULL,
420
+ metadata_json TEXT NOT NULL DEFAULT '{}',
421
+ updated_at TEXT NOT NULL DEFAULT '',
422
+ PRIMARY KEY (trace_id, turn_id, stage)
423
+ )
424
+ `);
425
+ db.exec(`
426
+ CREATE TABLE IF NOT EXISTS audit_events (
427
+ event_id TEXT PRIMARY KEY,
428
+ trace_id TEXT NOT NULL,
429
+ turn_id TEXT DEFAULT NULL,
430
+ caused_by TEXT DEFAULT NULL,
431
+ category TEXT NOT NULL,
432
+ type TEXT NOT NULL,
433
+ ts TEXT NOT NULL,
434
+ payload_json TEXT NOT NULL DEFAULT '{}'
435
+ )
436
+ `);
437
+ db.exec(`
438
+ CREATE TABLE IF NOT EXISTS audit_turn_index (
439
+ trace_id TEXT NOT NULL,
440
+ turn_id TEXT NOT NULL,
441
+ first_ts TEXT NOT NULL,
442
+ last_ts TEXT NOT NULL,
443
+ event_count INTEGER NOT NULL DEFAULT 0,
444
+ PRIMARY KEY (trace_id, turn_id)
445
+ )
386
446
  `);
387
447
  db.exec("CREATE INDEX IF NOT EXISTS idx_memories_active ON memories(superseded_by)");
388
448
  db.exec("CREATE INDEX IF NOT EXISTS idx_replan_history_milestone ON replan_history(milestone_id, created_at)");
@@ -395,6 +455,11 @@ function initSchema(db, fileBacked) {
395
455
  ensureVerificationEvidenceDedupIndex(db);
396
456
  // v14 index — slice dependency lookups
397
457
  db.exec("CREATE INDEX IF NOT EXISTS idx_slice_deps_target ON slice_dependencies(milestone_id, depends_on_slice_id)");
458
+ db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_turn ON gate_runs(trace_id, turn_id)");
459
+ db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_lookup ON gate_runs(milestone_id, slice_id, task_id, gate_id)");
460
+ db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
461
+ db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
462
+ db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
398
463
  db.exec(`CREATE VIEW IF NOT EXISTS active_decisions AS SELECT * FROM decisions WHERE superseded_by IS NULL`);
399
464
  db.exec(`CREATE VIEW IF NOT EXISTS active_requirements AS SELECT * FROM requirements WHERE superseded_by IS NULL`);
400
465
  db.exec(`CREATE VIEW IF NOT EXISTS active_memories AS SELECT * FROM memories WHERE superseded_by IS NULL`);
@@ -725,6 +790,77 @@ function migrateSchema(db) {
725
790
  ":applied_at": new Date().toISOString(),
726
791
  });
727
792
  }
793
+ if (currentVersion < 15) {
794
+ db.exec(`
795
+ CREATE TABLE IF NOT EXISTS gate_runs (
796
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
797
+ trace_id TEXT NOT NULL,
798
+ turn_id TEXT NOT NULL,
799
+ gate_id TEXT NOT NULL,
800
+ gate_type TEXT NOT NULL DEFAULT '',
801
+ unit_type TEXT DEFAULT NULL,
802
+ unit_id TEXT DEFAULT NULL,
803
+ milestone_id TEXT DEFAULT NULL,
804
+ slice_id TEXT DEFAULT NULL,
805
+ task_id TEXT DEFAULT NULL,
806
+ outcome TEXT NOT NULL DEFAULT 'pass',
807
+ failure_class TEXT NOT NULL DEFAULT 'none',
808
+ rationale TEXT NOT NULL DEFAULT '',
809
+ findings TEXT NOT NULL DEFAULT '',
810
+ attempt INTEGER NOT NULL DEFAULT 1,
811
+ max_attempts INTEGER NOT NULL DEFAULT 1,
812
+ retryable INTEGER NOT NULL DEFAULT 0,
813
+ evaluated_at TEXT NOT NULL DEFAULT ''
814
+ )
815
+ `);
816
+ db.exec(`
817
+ CREATE TABLE IF NOT EXISTS turn_git_transactions (
818
+ trace_id TEXT NOT NULL,
819
+ turn_id TEXT NOT NULL,
820
+ unit_type TEXT DEFAULT NULL,
821
+ unit_id TEXT DEFAULT NULL,
822
+ stage TEXT NOT NULL DEFAULT 'turn-start',
823
+ action TEXT NOT NULL DEFAULT 'status-only',
824
+ push INTEGER NOT NULL DEFAULT 0,
825
+ status TEXT NOT NULL DEFAULT 'ok',
826
+ error TEXT DEFAULT NULL,
827
+ metadata_json TEXT NOT NULL DEFAULT '{}',
828
+ updated_at TEXT NOT NULL DEFAULT '',
829
+ PRIMARY KEY (trace_id, turn_id, stage)
830
+ )
831
+ `);
832
+ db.exec(`
833
+ CREATE TABLE IF NOT EXISTS audit_events (
834
+ event_id TEXT PRIMARY KEY,
835
+ trace_id TEXT NOT NULL,
836
+ turn_id TEXT DEFAULT NULL,
837
+ caused_by TEXT DEFAULT NULL,
838
+ category TEXT NOT NULL,
839
+ type TEXT NOT NULL,
840
+ ts TEXT NOT NULL,
841
+ payload_json TEXT NOT NULL DEFAULT '{}'
842
+ )
843
+ `);
844
+ db.exec(`
845
+ CREATE TABLE IF NOT EXISTS audit_turn_index (
846
+ trace_id TEXT NOT NULL,
847
+ turn_id TEXT NOT NULL,
848
+ first_ts TEXT NOT NULL,
849
+ last_ts TEXT NOT NULL,
850
+ event_count INTEGER NOT NULL DEFAULT 0,
851
+ PRIMARY KEY (trace_id, turn_id)
852
+ )
853
+ `);
854
+ db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_turn ON gate_runs(trace_id, turn_id)");
855
+ db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_lookup ON gate_runs(milestone_id, slice_id, task_id, gate_id)");
856
+ db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
857
+ db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
858
+ db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
859
+ db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
860
+ ":version": 15,
861
+ ":applied_at": new Date().toISOString(),
862
+ });
863
+ }
728
864
  db.exec("COMMIT");
729
865
  }
730
866
  catch (err) {
@@ -1939,6 +2075,7 @@ export function deleteMilestone(milestoneId) {
1939
2075
  transaction(() => {
1940
2076
  currentDb.prepare(`DELETE FROM verification_evidence WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
1941
2077
  currentDb.prepare(`DELETE FROM quality_gates WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
2078
+ currentDb.prepare(`DELETE FROM gate_runs WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
1942
2079
  currentDb.prepare(`DELETE FROM tasks WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
1943
2080
  currentDb.prepare(`DELETE FROM slice_dependencies WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
1944
2081
  currentDb.prepare(`DELETE FROM slices WHERE milestone_id = :mid`).run({ ":mid": milestoneId });
@@ -2024,6 +2161,28 @@ export function saveGateResult(g) {
2024
2161
  ":findings": g.findings,
2025
2162
  ":evaluated_at": new Date().toISOString(),
2026
2163
  });
2164
+ const outcome = g.verdict === "pass"
2165
+ ? "pass"
2166
+ : g.verdict === "omitted"
2167
+ ? "manual-attention"
2168
+ : "fail";
2169
+ insertGateRun({
2170
+ traceId: `quality-gate:${g.milestoneId}:${g.sliceId}`,
2171
+ turnId: `gate:${g.gateId}:${g.taskId ?? "slice"}`,
2172
+ gateId: g.gateId,
2173
+ gateType: "quality-gate",
2174
+ milestoneId: g.milestoneId,
2175
+ sliceId: g.sliceId,
2176
+ taskId: g.taskId ?? undefined,
2177
+ outcome,
2178
+ failureClass: outcome === "fail" ? "verification" : outcome === "manual-attention" ? "manual-attention" : "none",
2179
+ rationale: g.rationale,
2180
+ findings: g.findings,
2181
+ attempt: 1,
2182
+ maxAttempts: 1,
2183
+ retryable: false,
2184
+ evaluatedAt: new Date().toISOString(),
2185
+ });
2027
2186
  }
2028
2187
  export function getPendingGates(milestoneId, sliceId, scope) {
2029
2188
  if (!currentDb)
@@ -2104,6 +2263,105 @@ export function getPendingGatesForTurn(milestoneId, sliceId, turn, taskId) {
2104
2263
  export function getPendingGateCountForTurn(milestoneId, sliceId, turn) {
2105
2264
  return getPendingGatesForTurn(milestoneId, sliceId, turn).length;
2106
2265
  }
2266
+ export function insertGateRun(entry) {
2267
+ if (!currentDb)
2268
+ return;
2269
+ currentDb.prepare(`INSERT INTO gate_runs (
2270
+ trace_id, turn_id, gate_id, gate_type, unit_type, unit_id, milestone_id, slice_id, task_id,
2271
+ outcome, failure_class, rationale, findings, attempt, max_attempts, retryable, evaluated_at
2272
+ ) VALUES (
2273
+ :trace_id, :turn_id, :gate_id, :gate_type, :unit_type, :unit_id, :milestone_id, :slice_id, :task_id,
2274
+ :outcome, :failure_class, :rationale, :findings, :attempt, :max_attempts, :retryable, :evaluated_at
2275
+ )`).run({
2276
+ ":trace_id": entry.traceId,
2277
+ ":turn_id": entry.turnId,
2278
+ ":gate_id": entry.gateId,
2279
+ ":gate_type": entry.gateType,
2280
+ ":unit_type": entry.unitType ?? null,
2281
+ ":unit_id": entry.unitId ?? null,
2282
+ ":milestone_id": entry.milestoneId ?? null,
2283
+ ":slice_id": entry.sliceId ?? null,
2284
+ ":task_id": entry.taskId ?? null,
2285
+ ":outcome": entry.outcome,
2286
+ ":failure_class": entry.failureClass,
2287
+ ":rationale": entry.rationale ?? "",
2288
+ ":findings": entry.findings ?? "",
2289
+ ":attempt": entry.attempt,
2290
+ ":max_attempts": entry.maxAttempts,
2291
+ ":retryable": entry.retryable ? 1 : 0,
2292
+ ":evaluated_at": entry.evaluatedAt,
2293
+ });
2294
+ }
2295
+ export function upsertTurnGitTransaction(entry) {
2296
+ if (!currentDb)
2297
+ return;
2298
+ currentDb.prepare(`INSERT OR REPLACE INTO turn_git_transactions (
2299
+ trace_id, turn_id, unit_type, unit_id, stage, action, push, status, error, metadata_json, updated_at
2300
+ ) VALUES (
2301
+ :trace_id, :turn_id, :unit_type, :unit_id, :stage, :action, :push, :status, :error, :metadata_json, :updated_at
2302
+ )`).run({
2303
+ ":trace_id": entry.traceId,
2304
+ ":turn_id": entry.turnId,
2305
+ ":unit_type": entry.unitType ?? null,
2306
+ ":unit_id": entry.unitId ?? null,
2307
+ ":stage": entry.stage,
2308
+ ":action": entry.action,
2309
+ ":push": entry.push ? 1 : 0,
2310
+ ":status": entry.status,
2311
+ ":error": entry.error ?? null,
2312
+ ":metadata_json": JSON.stringify(entry.metadata ?? {}),
2313
+ ":updated_at": entry.updatedAt,
2314
+ });
2315
+ }
2316
+ export function insertAuditEvent(entry) {
2317
+ if (!currentDb)
2318
+ return;
2319
+ transaction(() => {
2320
+ currentDb.prepare(`INSERT OR IGNORE INTO audit_events (
2321
+ event_id, trace_id, turn_id, caused_by, category, type, ts, payload_json
2322
+ ) VALUES (
2323
+ :event_id, :trace_id, :turn_id, :caused_by, :category, :type, :ts, :payload_json
2324
+ )`).run({
2325
+ ":event_id": entry.eventId,
2326
+ ":trace_id": entry.traceId,
2327
+ ":turn_id": entry.turnId ?? null,
2328
+ ":caused_by": entry.causedBy ?? null,
2329
+ ":category": entry.category,
2330
+ ":type": entry.type,
2331
+ ":ts": entry.ts,
2332
+ ":payload_json": JSON.stringify(entry.payload ?? {}),
2333
+ });
2334
+ if (entry.turnId) {
2335
+ const row = currentDb.prepare(`SELECT event_count, first_ts, last_ts
2336
+ FROM audit_turn_index
2337
+ WHERE trace_id = :trace_id AND turn_id = :turn_id`).get({
2338
+ ":trace_id": entry.traceId,
2339
+ ":turn_id": entry.turnId,
2340
+ });
2341
+ if (row) {
2342
+ currentDb.prepare(`UPDATE audit_turn_index
2343
+ SET first_ts = CASE WHEN :ts < first_ts THEN :ts ELSE first_ts END,
2344
+ last_ts = CASE WHEN :ts > last_ts THEN :ts ELSE last_ts END,
2345
+ event_count = event_count + 1
2346
+ WHERE trace_id = :trace_id AND turn_id = :turn_id`).run({
2347
+ ":trace_id": entry.traceId,
2348
+ ":turn_id": entry.turnId,
2349
+ ":ts": entry.ts,
2350
+ });
2351
+ }
2352
+ else {
2353
+ currentDb.prepare(`INSERT INTO audit_turn_index (trace_id, turn_id, first_ts, last_ts, event_count)
2354
+ VALUES (:trace_id, :turn_id, :first_ts, :last_ts, :event_count)`).run({
2355
+ ":trace_id": entry.traceId,
2356
+ ":turn_id": entry.turnId,
2357
+ ":first_ts": entry.ts,
2358
+ ":last_ts": entry.ts,
2359
+ ":event_count": 1,
2360
+ });
2361
+ }
2362
+ }
2363
+ });
2364
+ }
2107
2365
  // ─── Single-writer bypass wrappers ───────────────────────────────────────
2108
2366
  // These wrappers exist so modules outside this file never need to call
2109
2367
  // `_getAdapter()` for writes. Each one is a byte-equivalent replacement for
@@ -26,6 +26,8 @@ import { nativeIsRepo, nativeInit } from "./native-git-bridge.js";
26
26
  import { isInheritedRepo } from "./repo-identity.js";
27
27
  import { ensureGitignore, ensurePreferences, untrackRuntimeFiles } from "./gitignore.js";
28
28
  import { loadEffectiveGSDPreferences } from "./preferences.js";
29
+ import { resolveUokFlags } from "./uok/flags.js";
30
+ import { ensurePlanV2Graph } from "./uok/plan-v2.js";
29
31
  import { detectProjectState } from "./detection.js";
30
32
  import { showProjectInit, offerMigration } from "./init-wizard.js";
31
33
  import { validateDirectory } from "./validate-directory.js";
@@ -53,6 +55,25 @@ function nextMilestoneIdReserved(existingIds, uniqueEnabled) {
53
55
  reserveMilestoneId(id);
54
56
  return id;
55
57
  }
58
+ function needsPlanV2Gate(state) {
59
+ return state.phase === "executing"
60
+ || state.phase === "summarizing"
61
+ || state.phase === "validating-milestone"
62
+ || state.phase === "completing-milestone";
63
+ }
64
+ function runPlanV2Gate(ctx, basePath, state) {
65
+ const prefs = loadEffectiveGSDPreferences()?.preferences;
66
+ const uokFlags = resolveUokFlags(prefs);
67
+ if (!uokFlags.planV2 || !needsPlanV2Gate(state))
68
+ return true;
69
+ const compiled = ensurePlanV2Graph(basePath, state);
70
+ if (!compiled.ok) {
71
+ const reason = compiled.reason ?? "plan-v2 compilation failed";
72
+ ctx.ui.notify(`Plan gate failed-closed: ${reason}. Complete plan/discuss artifacts before execution.`, "error");
73
+ return false;
74
+ }
75
+ return true;
76
+ }
56
77
  // ─── Commit Instruction Helpers ──────────────────────────────────────────────
57
78
  /** Build commit instruction for planning prompts. .gsd/ is managed externally and always gitignored. */
58
79
  function buildDocsCommitInstruction(_message) {
@@ -198,7 +219,7 @@ export function checkAutoStartAfterDiscuss() {
198
219
  logWarning("guided", `manifest unlink failed: ${e.message}`);
199
220
  }
200
221
  pendingAutoStartMap.delete(basePath);
201
- ctx.ui.notify(`Milestone ${milestoneId} ready.`, "info");
222
+ ctx.ui.notify(`Milestone ${milestoneId} ready.`, "success");
202
223
  startAutoDetached(ctx, pi, basePath, false, { step });
203
224
  return true;
204
225
  }
@@ -1110,6 +1131,8 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1110
1131
  catch (err) {
1111
1132
  logWarning("guided", `STATE.md rebuild failed: ${err.message}`);
1112
1133
  }
1134
+ if (!runPlanV2Gate(ctx, basePath, state))
1135
+ return;
1113
1136
  if (!state.activeMilestone?.id) {
1114
1137
  // Guard: if a discuss session is already in flight, don't re-inject the prompt.
1115
1138
  // Both /gsd and /gsd auto reach this branch when no milestone exists yet.
@@ -336,6 +336,7 @@ async function customizeAdvancedPrefs(ctx, prefs) {
336
336
  { id: "balanced", label: "Balanced", description: "Good trade-off (default)", recommended: true },
337
337
  { id: "budget", label: "Budget", description: "Minimize token usage" },
338
338
  { id: "quality", label: "Quality", description: "Maximize thoroughness" },
339
+ { id: "burn-max", label: "Burn Max", description: "Maximum depth, no phase skips" },
339
340
  ],
340
341
  });
341
342
  if (profileChoice !== "not_yet") {
@@ -14,6 +14,8 @@
14
14
  import { appendFileSync, mkdirSync, readdirSync, readFileSync } from "node:fs";
15
15
  import { join } from "node:path";
16
16
  import { gsdRoot } from "./paths.js";
17
+ import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
18
+ import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
17
19
  // ─── Emit ─────────────────────────────────────────────────────────────────────
18
20
  /**
19
21
  * Append a journal event to the daily JSONL file.
@@ -34,6 +36,31 @@ export function emitJournalEvent(basePath, entry) {
34
36
  catch {
35
37
  // Silent failure — journal must never break auto-mode
36
38
  }
39
+ if (!isUnifiedAuditEnabled())
40
+ return;
41
+ try {
42
+ const causedBy = entry.causedBy
43
+ ? `${entry.causedBy.flowId}:${entry.causedBy.seq}`
44
+ : undefined;
45
+ const turnId = typeof entry.data?.turnId === "string"
46
+ ? entry.data.turnId
47
+ : undefined;
48
+ emitUokAuditEvent(basePath, buildAuditEnvelope({
49
+ traceId: entry.flowId,
50
+ turnId,
51
+ causedBy,
52
+ category: "orchestration",
53
+ type: `journal-${entry.eventType}`,
54
+ payload: {
55
+ seq: entry.seq,
56
+ rule: entry.rule,
57
+ data: entry.data ?? {},
58
+ },
59
+ }));
60
+ }
61
+ catch {
62
+ // Best-effort: audit projection must never block journal writes.
63
+ }
37
64
  }
38
65
  // ─── Query ────────────────────────────────────────────────────────────────────
39
66
  /**
@@ -17,6 +17,8 @@ import { gsdRoot } from "./paths.js";
17
17
  import { getAndClearSkills } from "./skill-telemetry.js";
18
18
  import { loadJsonFile, loadJsonFileOrNull, saveJsonFile } from "./json-persistence.js";
19
19
  import { parseUnitId } from "./unit-id.js";
20
+ import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
21
+ import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
20
22
  // Re-export from shared — import directly from format-utils to avoid pulling
21
23
  // in the full barrel (mod.js → ui.js → @gsd/pi-tui) which breaks when loaded
22
24
  // outside jiti's alias resolution (e.g. dynamic import in auto-loop reports).
@@ -152,6 +154,23 @@ export function snapshotUnitMetrics(ctx, unitType, unitId, startedAt, model, opt
152
154
  ledger.units.push(unit);
153
155
  }
154
156
  saveLedger(basePath, ledger);
157
+ if (isUnifiedAuditEnabled()) {
158
+ emitUokAuditEvent(basePath, buildAuditEnvelope({
159
+ traceId: opts?.traceId ?? `metrics:${unitType}:${unitId}`,
160
+ turnId: opts?.turnId,
161
+ causedBy: opts?.causedBy,
162
+ category: "metrics",
163
+ type: "unit-metrics-snapshot",
164
+ payload: {
165
+ unitType,
166
+ unitId,
167
+ model,
168
+ tokens: unit.tokens,
169
+ cost: unit.cost,
170
+ toolCalls: unit.toolCalls,
171
+ },
172
+ }));
173
+ }
155
174
  return unit;
156
175
  }
157
176
  /**
@@ -20,8 +20,13 @@ import { writeSessionStatus, readAllSessionStatuses, readSessionStatus, removeSe
20
20
  import { analyzeParallelEligibility, } from "./parallel-eligibility.js";
21
21
  import { getErrorMessage } from "./error-utils.js";
22
22
  import { logWarning } from "./workflow-logger.js";
23
+ import { resolveUokFlags } from "./uok/flags.js";
24
+ import { selectConflictFreeBatch } from "./uok/execution-graph.js";
23
25
  // ─── Module State ──────────────────────────────────────────────────────────
24
26
  let state = null;
27
+ function overlapKey(a, b) {
28
+ return a < b ? `${a}::${b}` : `${b}::${a}`;
29
+ }
25
30
  // ─── Persistence ──────────────────────────────────────────────────────────
26
31
  const ORCHESTRATOR_STATE_FILE = "orchestrator.json";
27
32
  const TMP_SUFFIX = ".tmp";
@@ -277,6 +282,7 @@ export async function startParallel(basePath, milestoneIds, prefs) {
277
282
  return { started: [], errors: [{ mid: "all", error: "Cannot start parallel from within a parallel worker" }] };
278
283
  }
279
284
  const config = resolveParallelConfig(prefs);
285
+ const uokFlags = resolveUokFlags(prefs);
280
286
  // Release any leftover state from a previous session before reassigning
281
287
  if (state) {
282
288
  for (const w of state.workers.values()) {
@@ -324,8 +330,34 @@ export async function startParallel(basePath, milestoneIds, prefs) {
324
330
  };
325
331
  const started = [];
326
332
  const errors = [];
333
+ let filteredMilestoneIds = milestoneIds;
334
+ if (uokFlags.executionGraph && milestoneIds.length > 1) {
335
+ try {
336
+ const requestedIds = new Set(milestoneIds);
337
+ const candidates = await analyzeParallelEligibility(basePath);
338
+ const overlapPairs = new Set();
339
+ for (const overlap of candidates.fileOverlaps) {
340
+ if (!requestedIds.has(overlap.mid1) || !requestedIds.has(overlap.mid2))
341
+ continue;
342
+ overlapPairs.add(overlapKey(overlap.mid1, overlap.mid2));
343
+ }
344
+ filteredMilestoneIds = selectConflictFreeBatch({
345
+ orderedIds: milestoneIds,
346
+ maxParallel: milestoneIds.length,
347
+ hasConflict: (candidate, existing) => overlapPairs.has(overlapKey(candidate, existing)),
348
+ });
349
+ if (filteredMilestoneIds.length < milestoneIds.length) {
350
+ const skipped = milestoneIds.filter((mid) => !filteredMilestoneIds.includes(mid));
351
+ logWarning("parallel", `uok execution graph filtered ${skipped.length} conflicting milestone(s): ${skipped.join(", ")}`);
352
+ }
353
+ }
354
+ catch (e) {
355
+ logWarning("parallel", `uok execution graph overlap analysis failed; using legacy milestone selection: ${e.message}`);
356
+ filteredMilestoneIds = milestoneIds;
357
+ }
358
+ }
327
359
  // Cap to max_workers
328
- const toStart = milestoneIds.slice(0, config.max_workers);
360
+ const toStart = filteredMilestoneIds.slice(0, config.max_workers);
329
361
  for (const mid of toStart) {
330
362
  // Check budget ceiling before each spawn
331
363
  if (isBudgetExceeded()) {
@@ -321,7 +321,7 @@ export function resolveAutoSupervisorConfig() {
321
321
  };
322
322
  }
323
323
  // ─── Token Profile Resolution ─────────────────────────────────────────────
324
- const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality"]);
324
+ const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality", "burn-max"]);
325
325
  /**
326
326
  * Resolve profile defaults for a given token profile tier.
327
327
  * Returns a partial GSDPreferences that is used as the base layer --
@@ -365,6 +365,22 @@ export function resolveProfileDefaults(profile) {
365
365
  skip_reassess: true,
366
366
  },
367
367
  };
368
+ case "burn-max":
369
+ return {
370
+ // Quality-first profile: keep user-selected models, disable downgrade routing.
371
+ // Policy constraints still apply at dispatch time.
372
+ dynamic_routing: {
373
+ enabled: false,
374
+ },
375
+ context_selection: "full",
376
+ phases: {
377
+ skip_research: false,
378
+ skip_slice_research: false,
379
+ skip_reassess: false,
380
+ skip_milestone_validation: false,
381
+ reassess_after_slice: true,
382
+ },
383
+ };
368
384
  }
369
385
  }
370
386
  /**
@@ -380,7 +396,7 @@ export function resolveEffectiveProfile() {
380
396
  }
381
397
  /**
382
398
  * Resolve the inline level from the active token profile.
383
- * budget -> minimal, balanced -> standard, quality -> full.
399
+ * budget -> minimal, balanced -> standard, quality/burn-max -> full.
384
400
  */
385
401
  export function resolveInlineLevel() {
386
402
  const profile = resolveEffectiveProfile();
@@ -388,11 +404,12 @@ export function resolveInlineLevel() {
388
404
  case "budget": return "minimal";
389
405
  case "balanced": return "standard";
390
406
  case "quality": return "full";
407
+ case "burn-max": return "full";
391
408
  }
392
409
  }
393
410
  /**
394
411
  * Resolve the context selection mode from the active token profile.
395
- * budget -> "smart", balanced/quality -> "full".
412
+ * budget -> "smart", balanced/quality/burn-max -> "full".
396
413
  * Explicit preference always wins.
397
414
  */
398
415
  export function resolveContextSelection() {
@@ -53,6 +53,7 @@ export const KNOWN_PREFERENCE_KEYS = new Set([
53
53
  "post_unit_hooks",
54
54
  "pre_dispatch_hooks",
55
55
  "dynamic_routing",
56
+ "uok",
56
57
  "token_profile",
57
58
  "phases",
58
59
  "auto_visualize",