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
@@ -7,6 +7,7 @@
7
7
  */
8
8
 
9
9
  import type { ExtensionAPI, ExtensionContext, ExtensionCommandContext } from "@gsd/pi-coding-agent";
10
+ import type { GSDState } from "./types.js";
10
11
  import { showNextAction } from "../shared/tui.js";
11
12
  import { loadFile, saveFile } from "./files.js";
12
13
  import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
@@ -36,6 +37,8 @@ import { nativeIsRepo, nativeInit } from "./native-git-bridge.js";
36
37
  import { isInheritedRepo } from "./repo-identity.js";
37
38
  import { ensureGitignore, ensurePreferences, untrackRuntimeFiles } from "./gitignore.js";
38
39
  import { loadEffectiveGSDPreferences } from "./preferences.js";
40
+ import { resolveUokFlags } from "./uok/flags.js";
41
+ import { ensurePlanV2Graph } from "./uok/plan-v2.js";
39
42
  import { detectProjectState } from "./detection.js";
40
43
  import { showProjectInit, offerMigration } from "./init-wizard.js";
41
44
  import { validateDirectory } from "./validate-directory.js";
@@ -83,6 +86,33 @@ function nextMilestoneIdReserved(existingIds: string[], uniqueEnabled: boolean):
83
86
  return id;
84
87
  }
85
88
 
89
+ function needsPlanV2Gate(state: GSDState): boolean {
90
+ return state.phase === "executing"
91
+ || state.phase === "summarizing"
92
+ || state.phase === "validating-milestone"
93
+ || state.phase === "completing-milestone";
94
+ }
95
+
96
+ function runPlanV2Gate(
97
+ ctx: ExtensionContext,
98
+ basePath: string,
99
+ state: GSDState,
100
+ ): boolean {
101
+ const prefs = loadEffectiveGSDPreferences()?.preferences;
102
+ const uokFlags = resolveUokFlags(prefs);
103
+ if (!uokFlags.planV2 || !needsPlanV2Gate(state)) return true;
104
+ const compiled = ensurePlanV2Graph(basePath, state);
105
+ if (!compiled.ok) {
106
+ const reason = compiled.reason ?? "plan-v2 compilation failed";
107
+ ctx.ui.notify(
108
+ `Plan gate failed-closed: ${reason}. Complete plan/discuss artifacts before execution.`,
109
+ "error",
110
+ );
111
+ return false;
112
+ }
113
+ return true;
114
+ }
115
+
86
116
  // ─── Commit Instruction Helpers ──────────────────────────────────────────────
87
117
 
88
118
  /** Build commit instruction for planning prompts. .gsd/ is managed externally and always gitignored. */
@@ -1320,6 +1350,8 @@ export async function showSmartEntry(
1320
1350
  logWarning("guided", `STATE.md rebuild failed: ${(err as Error).message}`);
1321
1351
  }
1322
1352
 
1353
+ if (!runPlanV2Gate(ctx, basePath, state)) return;
1354
+
1323
1355
  if (!state.activeMilestone?.id) {
1324
1356
  // Guard: if a discuss session is already in flight, don't re-inject the prompt.
1325
1357
  // Both /gsd and /gsd auto reach this branch when no milestone exists yet.
@@ -16,6 +16,22 @@ export {
16
16
  } from "./bootstrap/write-gate.js";
17
17
 
18
18
  export default async function registerExtension(pi: ExtensionAPI) {
19
- const { registerGsdExtension } = await import("./bootstrap/register-extension.js");
20
- registerGsdExtension(pi);
19
+ // Always register the core /gsd command first, in isolation.
20
+ // This ensures /gsd is available even if the full bootstrap (shortcuts,
21
+ // tools, hooks) fails — e.g. due to a Windows-specific import error.
22
+ const { registerGSDCommand } = await import("./commands/index.js");
23
+ registerGSDCommand(pi);
24
+
25
+ // Full setup (shortcuts, tools, hooks) in a separate try/catch so that
26
+ // any platform-specific load failure doesn't take out the core command.
27
+ try {
28
+ const { registerGsdExtension } = await import("./bootstrap/register-extension.js");
29
+ registerGsdExtension(pi);
30
+ } catch (err) {
31
+ const { logWarning } = await import("./workflow-logger.js");
32
+ logWarning(
33
+ "bootstrap",
34
+ `Extension setup partially failed — /gsd commands are available but shortcuts/tools may be missing: ${err instanceof Error ? err.message : String(err)}`,
35
+ );
36
+ }
21
37
  }
@@ -33,7 +33,7 @@ interface ProjectPreferences {
33
33
  mainBranch: string;
34
34
  verificationCommands: string[];
35
35
  customInstructions: string[];
36
- tokenProfile: "budget" | "balanced" | "quality";
36
+ tokenProfile: "budget" | "balanced" | "quality" | "burn-max";
37
37
  skipResearch: boolean;
38
38
  autoPush: boolean;
39
39
  }
@@ -413,10 +413,11 @@ async function customizeAdvancedPrefs(
413
413
  { id: "balanced", label: "Balanced", description: "Good trade-off (default)", recommended: true },
414
414
  { id: "budget", label: "Budget", description: "Minimize token usage" },
415
415
  { id: "quality", label: "Quality", description: "Maximize thoroughness" },
416
+ { id: "burn-max", label: "Burn Max", description: "Maximum depth, no phase skips" },
416
417
  ],
417
418
  });
418
419
  if (profileChoice !== "not_yet") {
419
- prefs.tokenProfile = profileChoice as "budget" | "balanced" | "quality";
420
+ prefs.tokenProfile = profileChoice as "budget" | "balanced" | "quality" | "burn-max";
420
421
  }
421
422
 
422
423
  // Skip research
@@ -15,6 +15,8 @@
15
15
  import { appendFileSync, mkdirSync, readdirSync, readFileSync } from "node:fs";
16
16
  import { join } from "node:path";
17
17
  import { gsdRoot } from "./paths.js";
18
+ import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
19
+ import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
18
20
 
19
21
  // ─── Types ────────────────────────────────────────────────────────────────────
20
22
 
@@ -90,6 +92,34 @@ export function emitJournalEvent(basePath: string, entry: JournalEntry): void {
90
92
  } catch {
91
93
  // Silent failure — journal must never break auto-mode
92
94
  }
95
+
96
+ if (!isUnifiedAuditEnabled()) return;
97
+ try {
98
+ const causedBy = entry.causedBy
99
+ ? `${entry.causedBy.flowId}:${entry.causedBy.seq}`
100
+ : undefined;
101
+ const turnId =
102
+ typeof entry.data?.turnId === "string"
103
+ ? entry.data.turnId
104
+ : undefined;
105
+ emitUokAuditEvent(
106
+ basePath,
107
+ buildAuditEnvelope({
108
+ traceId: entry.flowId,
109
+ turnId,
110
+ causedBy,
111
+ category: "orchestration",
112
+ type: `journal-${entry.eventType}`,
113
+ payload: {
114
+ seq: entry.seq,
115
+ rule: entry.rule,
116
+ data: entry.data ?? {},
117
+ },
118
+ }),
119
+ );
120
+ } catch {
121
+ // Best-effort: audit projection must never block journal writes.
122
+ }
93
123
  }
94
124
 
95
125
  // ─── Query ────────────────────────────────────────────────────────────────────
@@ -16,6 +16,7 @@ import {
16
16
  insertTask,
17
17
  openDatabase,
18
18
  transaction,
19
+ updateSliceStatus,
19
20
  _getAdapter,
20
21
  } from './gsd-db.js';
21
22
  import {
@@ -672,11 +673,8 @@ export function migrateHierarchyToDb(basePath: string): {
672
673
  return t.done && existsSync(summaryFile);
673
674
  });
674
675
  if (allTasksDone && hasSliceSummary) {
675
- const adapter = _getAdapter();
676
- if (adapter) {
677
- adapter.prepare(
678
- `UPDATE slices SET status = 'complete' WHERE id = :sid AND milestone_id = :mid`,
679
- ).run({ ':sid': sliceEntry.id, ':mid': milestoneId });
676
+ if (_getAdapter()) {
677
+ updateSliceStatus(milestoneId, sliceEntry.id, 'complete');
680
678
  process.stderr.write(
681
679
  `gsd-migrate: ${milestoneId}/${sliceEntry.id} all tasks + slice summary complete — upgrading slice to complete\n`,
682
680
  );
@@ -3,7 +3,19 @@
3
3
  // Storage layer for auto-learned project memories. Follows context-store.ts patterns.
4
4
  // All functions degrade gracefully: return empty results when DB unavailable, never throw.
5
5
 
6
- import { isDbAvailable, _getAdapter, transaction } from './gsd-db.js';
6
+ import {
7
+ isDbAvailable,
8
+ _getAdapter,
9
+ transaction,
10
+ insertMemoryRow,
11
+ rewriteMemoryId,
12
+ updateMemoryContentRow,
13
+ incrementMemoryHitCount,
14
+ supersedeMemoryRow,
15
+ markMemoryUnitProcessed,
16
+ decayMemoriesBefore,
17
+ supersedeLowestRankedMemories,
18
+ } from './gsd-db.js';
7
19
 
8
20
  // ─── Types ──────────────────────────────────────────────────────────────────
9
21
 
@@ -170,28 +182,22 @@ export function createMemory(fields: {
170
182
  const now = new Date().toISOString();
171
183
  // Insert with a temporary placeholder ID — seq is auto-assigned
172
184
  const placeholder = `_TMP_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
173
- adapter.prepare(
174
- `INSERT INTO memories (id, category, content, confidence, source_unit_type, source_unit_id, created_at, updated_at)
175
- VALUES (:id, :category, :content, :confidence, :source_unit_type, :source_unit_id, :created_at, :updated_at)`,
176
- ).run({
177
- ':id': placeholder,
178
- ':category': fields.category,
179
- ':content': fields.content,
180
- ':confidence': fields.confidence ?? 0.8,
181
- ':source_unit_type': fields.source_unit_type ?? null,
182
- ':source_unit_id': fields.source_unit_id ?? null,
183
- ':created_at': now,
184
- ':updated_at': now,
185
+ insertMemoryRow({
186
+ id: placeholder,
187
+ category: fields.category,
188
+ content: fields.content,
189
+ confidence: fields.confidence ?? 0.8,
190
+ sourceUnitType: fields.source_unit_type ?? null,
191
+ sourceUnitId: fields.source_unit_id ?? null,
192
+ createdAt: now,
193
+ updatedAt: now,
185
194
  });
186
- // Derive the real ID from the assigned seq
195
+ // Derive the real ID from the assigned seq (SELECT is still fine via adapter)
187
196
  const row = adapter.prepare('SELECT seq FROM memories WHERE id = :id').get({ ':id': placeholder });
188
197
  if (!row) return placeholder; // fallback — should not happen
189
198
  const seq = row['seq'] as number;
190
199
  const realId = `MEM${String(seq).padStart(3, '0')}`;
191
- adapter.prepare('UPDATE memories SET id = :real_id WHERE id = :placeholder').run({
192
- ':real_id': realId,
193
- ':placeholder': placeholder,
194
- });
200
+ rewriteMemoryId(placeholder, realId);
195
201
  return realId;
196
202
  } catch {
197
203
  return null;
@@ -203,20 +209,9 @@ export function createMemory(fields: {
203
209
  */
204
210
  export function updateMemoryContent(id: string, content: string, confidence?: number): boolean {
205
211
  if (!isDbAvailable()) return false;
206
- const adapter = _getAdapter();
207
- if (!adapter) return false;
208
212
 
209
213
  try {
210
- const now = new Date().toISOString();
211
- if (confidence != null) {
212
- adapter.prepare(
213
- 'UPDATE memories SET content = :content, confidence = :confidence, updated_at = :updated_at WHERE id = :id',
214
- ).run({ ':content': content, ':confidence': confidence, ':updated_at': now, ':id': id });
215
- } else {
216
- adapter.prepare(
217
- 'UPDATE memories SET content = :content, updated_at = :updated_at WHERE id = :id',
218
- ).run({ ':content': content, ':updated_at': now, ':id': id });
219
- }
214
+ updateMemoryContentRow(id, content, confidence, new Date().toISOString());
220
215
  return true;
221
216
  } catch {
222
217
  return false;
@@ -228,13 +223,9 @@ export function updateMemoryContent(id: string, content: string, confidence?: nu
228
223
  */
229
224
  export function reinforceMemory(id: string): boolean {
230
225
  if (!isDbAvailable()) return false;
231
- const adapter = _getAdapter();
232
- if (!adapter) return false;
233
226
 
234
227
  try {
235
- adapter.prepare(
236
- 'UPDATE memories SET hit_count = hit_count + 1, updated_at = :updated_at WHERE id = :id',
237
- ).run({ ':updated_at': new Date().toISOString(), ':id': id });
228
+ incrementMemoryHitCount(id, new Date().toISOString());
238
229
  return true;
239
230
  } catch {
240
231
  return false;
@@ -246,13 +237,9 @@ export function reinforceMemory(id: string): boolean {
246
237
  */
247
238
  export function supersedeMemory(oldId: string, newId: string): boolean {
248
239
  if (!isDbAvailable()) return false;
249
- const adapter = _getAdapter();
250
- if (!adapter) return false;
251
240
 
252
241
  try {
253
- adapter.prepare(
254
- 'UPDATE memories SET superseded_by = :new_id, updated_at = :updated_at WHERE id = :old_id',
255
- ).run({ ':new_id': newId, ':updated_at': new Date().toISOString(), ':old_id': oldId });
242
+ supersedeMemoryRow(oldId, newId, new Date().toISOString());
256
243
  return true;
257
244
  } catch {
258
245
  return false;
@@ -284,14 +271,9 @@ export function isUnitProcessed(unitKey: string): boolean {
284
271
  */
285
272
  export function markUnitProcessed(unitKey: string, activityFile: string): boolean {
286
273
  if (!isDbAvailable()) return false;
287
- const adapter = _getAdapter();
288
- if (!adapter) return false;
289
274
 
290
275
  try {
291
- adapter.prepare(
292
- `INSERT OR IGNORE INTO memory_processed_units (unit_key, activity_file, processed_at)
293
- VALUES (:key, :file, :at)`,
294
- ).run({ ':key': unitKey, ':file': activityFile, ':at': new Date().toISOString() });
276
+ markMemoryUnitProcessed(unitKey, activityFile, new Date().toISOString());
295
277
  return true;
296
278
  } catch {
297
279
  return false;
@@ -310,7 +292,7 @@ export function decayStaleMemories(thresholdUnits = 20): void {
310
292
  if (!adapter) return;
311
293
 
312
294
  try {
313
- // Find the timestamp of the Nth most recent processed unit
295
+ // Find the timestamp of the Nth most recent processed unit (read-only SELECT)
314
296
  const row = adapter.prepare(
315
297
  `SELECT processed_at FROM memory_processed_units
316
298
  ORDER BY processed_at DESC
@@ -320,11 +302,7 @@ export function decayStaleMemories(thresholdUnits = 20): void {
320
302
  if (!row) return; // not enough processed units yet
321
303
 
322
304
  const cutoff = row['processed_at'] as string;
323
- adapter.prepare(
324
- `UPDATE memories
325
- SET confidence = MAX(0.1, confidence - 0.1), updated_at = :now
326
- WHERE superseded_by IS NULL AND updated_at < :cutoff AND confidence > 0.1`,
327
- ).run({ ':now': new Date().toISOString(), ':cutoff': cutoff });
305
+ decayMemoriesBefore(cutoff, new Date().toISOString());
328
306
  } catch {
329
307
  // non-fatal
330
308
  }
@@ -346,16 +324,7 @@ export function enforceMemoryCap(max = 50): void {
346
324
  if (count <= max) return;
347
325
 
348
326
  const excess = count - max;
349
- // Batch update: supersede lowest-ranked active memories in a single statement
350
- adapter.prepare(
351
- `UPDATE memories SET superseded_by = 'CAP_EXCEEDED', updated_at = :now
352
- WHERE id IN (
353
- SELECT id FROM memories
354
- WHERE superseded_by IS NULL
355
- ORDER BY (confidence * (1.0 + hit_count * 0.1)) ASC
356
- LIMIT :limit
357
- )`,
358
- ).run({ ':now': new Date().toISOString(), ':limit': excess });
327
+ supersedeLowestRankedMemories(excess, new Date().toISOString());
359
328
  } catch {
360
329
  // non-fatal
361
330
  }
@@ -19,6 +19,8 @@ import { gsdRoot } from "./paths.js";
19
19
  import { getAndClearSkills } from "./skill-telemetry.js";
20
20
  import { loadJsonFile, loadJsonFileOrNull, saveJsonFile } from "./json-persistence.js";
21
21
  import { parseUnitId } from "./unit-id.js";
22
+ import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
23
+ import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
22
24
 
23
25
  // Re-export from shared — import directly from format-utils to avoid pulling
24
26
  // in the full barrel (mod.js → ui.js → @gsd/pi-tui) which breaks when loaded
@@ -143,6 +145,9 @@ export function snapshotUnitMetrics(
143
145
  promptCharCount?: number;
144
146
  baselineCharCount?: number;
145
147
  autoSessionKey?: string;
148
+ traceId?: string;
149
+ turnId?: string;
150
+ causedBy?: string;
146
151
  },
147
152
  ): UnitMetrics | null {
148
153
  if (!ledger) return null;
@@ -235,6 +240,27 @@ export function snapshotUnitMetrics(
235
240
  }
236
241
  saveLedger(basePath, ledger);
237
242
 
243
+ if (isUnifiedAuditEnabled()) {
244
+ emitUokAuditEvent(
245
+ basePath,
246
+ buildAuditEnvelope({
247
+ traceId: opts?.traceId ?? `metrics:${unitType}:${unitId}`,
248
+ turnId: opts?.turnId,
249
+ causedBy: opts?.causedBy,
250
+ category: "metrics",
251
+ type: "unit-metrics-snapshot",
252
+ payload: {
253
+ unitType,
254
+ unitId,
255
+ model,
256
+ tokens: unit.tokens,
257
+ cost: unit.cost,
258
+ toolCalls: unit.toolCalls,
259
+ },
260
+ }),
261
+ );
262
+ }
263
+
238
264
  return unit;
239
265
  }
240
266
 
@@ -11,7 +11,7 @@
11
11
  * dispatch rules, and state derivation. See gate-registry.ts.
12
12
  */
13
13
 
14
- import { _getAdapter } from "./gsd-db.js";
14
+ import { isDbAvailable, upsertQualityGate } from "./gsd-db.js";
15
15
  import { getGatesForTurn } from "./gate-registry.js";
16
16
 
17
17
  /**
@@ -31,24 +31,23 @@ export function insertMilestoneValidationGates(
31
31
  verdict: string,
32
32
  evaluatedAt: string,
33
33
  ): void {
34
- const db = _getAdapter();
35
- if (!db) return;
34
+ if (!isDbAvailable()) return;
36
35
 
37
36
  const gateVerdict = verdict === "pass" ? "pass" : "flag";
38
37
  const milestoneGates = getGatesForTurn("validate-milestone");
39
38
 
40
39
  for (const def of milestoneGates) {
41
- db.prepare(
42
- `INSERT OR REPLACE INTO quality_gates
43
- (milestone_id, slice_id, gate_id, scope, task_id, status, verdict, rationale, findings, evaluated_at)
44
- VALUES (:mid, :sid, :gid, 'milestone', '', 'complete', :verdict, :rationale, '', :evaluated_at)`,
45
- ).run({
46
- ":mid": milestoneId,
47
- ":sid": sliceId,
48
- ":gid": def.id,
49
- ":verdict": gateVerdict,
50
- ":rationale": `${def.promptSection} — milestone validation verdict: ${verdict}`,
51
- ":evaluated_at": evaluatedAt,
40
+ upsertQualityGate({
41
+ milestoneId,
42
+ sliceId,
43
+ gateId: def.id,
44
+ scope: "milestone",
45
+ taskId: "",
46
+ status: "complete",
47
+ verdict: gateVerdict,
48
+ rationale: `${def.promptSection} — milestone validation verdict: ${verdict}`,
49
+ findings: "",
50
+ evaluatedAt,
52
51
  });
53
52
  }
54
53
  }
@@ -323,7 +323,7 @@ export function nativeIsRepo(basePath: string): boolean {
323
323
  return native.gitIsRepo(basePath);
324
324
  }
325
325
  try {
326
- execSync("git rev-parse --git-dir", { cwd: basePath, stdio: "pipe" });
326
+ execFileSync("git", ["rev-parse", "--git-dir"], { cwd: basePath, stdio: "pipe" });
327
327
  return true;
328
328
  } catch {
329
329
  return false;
@@ -790,16 +790,15 @@ export function nativeCommit(
790
790
 
791
791
  // Fallback: use git commit with stdin pipe for safe multi-line messages
792
792
  try {
793
- const result = execSync(
794
- `git commit --no-verify -F -${options?.allowEmpty ? " --allow-empty" : ""}`,
795
- {
796
- cwd: basePath,
797
- stdio: ["pipe", "pipe", "pipe"],
798
- encoding: "utf-8",
799
- env: GIT_NO_PROMPT_ENV,
800
- input: message,
801
- },
802
- ).trim();
793
+ const args = ["commit", "--no-verify", "-F", "-"];
794
+ if (options?.allowEmpty) args.push("--allow-empty");
795
+ const result = execFileSync("git", args, {
796
+ cwd: basePath,
797
+ stdio: ["pipe", "pipe", "pipe"],
798
+ encoding: "utf-8",
799
+ env: GIT_NO_PROMPT_ENV,
800
+ input: message,
801
+ }).trim();
803
802
  return result;
804
803
  } catch (err: unknown) {
805
804
  const errObj = err as { stdout?: string; stderr?: string; message?: string };
@@ -940,7 +939,7 @@ export function nativeResetHard(basePath: string): void {
940
939
  native.gitResetHard(basePath);
941
940
  return;
942
941
  }
943
- execSync("git reset --hard HEAD", { cwd: basePath, stdio: "pipe" });
942
+ execFileSync("git", ["reset", "--hard", "HEAD"], { cwd: basePath, stdio: "pipe" });
944
943
  }
945
944
 
946
945
  /**
@@ -42,6 +42,8 @@ import {
42
42
  } from "./parallel-eligibility.js";
43
43
  import { getErrorMessage } from "./error-utils.js";
44
44
  import { logWarning } from "./workflow-logger.js";
45
+ import { resolveUokFlags } from "./uok/flags.js";
46
+ import { selectConflictFreeBatch } from "./uok/execution-graph.js";
45
47
 
46
48
  // ─── Types ─────────────────────────────────────────────────────────────────
47
49
 
@@ -69,6 +71,10 @@ export interface OrchestratorState {
69
71
 
70
72
  let state: OrchestratorState | null = null;
71
73
 
74
+ function overlapKey(a: string, b: string): string {
75
+ return a < b ? `${a}::${b}` : `${b}::${a}`;
76
+ }
77
+
72
78
  // ─── Persistence ──────────────────────────────────────────────────────────
73
79
 
74
80
  const ORCHESTRATOR_STATE_FILE = "orchestrator.json";
@@ -365,6 +371,7 @@ export async function startParallel(
365
371
  }
366
372
 
367
373
  const config = resolveParallelConfig(prefs);
374
+ const uokFlags = resolveUokFlags(prefs);
368
375
 
369
376
  // Release any leftover state from a previous session before reassigning
370
377
  if (state) {
@@ -418,8 +425,40 @@ export async function startParallel(
418
425
  const started: string[] = [];
419
426
  const errors: Array<{ mid: string; error: string }> = [];
420
427
 
428
+ let filteredMilestoneIds = milestoneIds;
429
+ if (uokFlags.executionGraph && milestoneIds.length > 1) {
430
+ try {
431
+ const requestedIds = new Set(milestoneIds);
432
+ const candidates = await analyzeParallelEligibility(basePath);
433
+ const overlapPairs = new Set<string>();
434
+ for (const overlap of candidates.fileOverlaps) {
435
+ if (!requestedIds.has(overlap.mid1) || !requestedIds.has(overlap.mid2)) continue;
436
+ overlapPairs.add(overlapKey(overlap.mid1, overlap.mid2));
437
+ }
438
+ filteredMilestoneIds = selectConflictFreeBatch({
439
+ orderedIds: milestoneIds,
440
+ maxParallel: milestoneIds.length,
441
+ hasConflict: (candidate, existing) =>
442
+ overlapPairs.has(overlapKey(candidate, existing)),
443
+ });
444
+ if (filteredMilestoneIds.length < milestoneIds.length) {
445
+ const skipped = milestoneIds.filter((mid) => !filteredMilestoneIds.includes(mid));
446
+ logWarning(
447
+ "parallel",
448
+ `uok execution graph filtered ${skipped.length} conflicting milestone(s): ${skipped.join(", ")}`,
449
+ );
450
+ }
451
+ } catch (e) {
452
+ logWarning(
453
+ "parallel",
454
+ `uok execution graph overlap analysis failed; using legacy milestone selection: ${(e as Error).message}`,
455
+ );
456
+ filteredMilestoneIds = milestoneIds;
457
+ }
458
+ }
459
+
421
460
  // Cap to max_workers
422
- const toStart = milestoneIds.slice(0, config.max_workers);
461
+ const toStart = filteredMilestoneIds.slice(0, config.max_workers);
423
462
 
424
463
  for (const mid of toStart) {
425
464
  // Check budget ceiling before each spawn
@@ -355,7 +355,7 @@ export function resolveAutoSupervisorConfig(): AutoSupervisorConfig {
355
355
 
356
356
  // ─── Token Profile Resolution ─────────────────────────────────────────────
357
357
 
358
- const VALID_TOKEN_PROFILES = new Set<TokenProfile>(["budget", "balanced", "quality"]);
358
+ const VALID_TOKEN_PROFILES = new Set<TokenProfile>(["budget", "balanced", "quality", "burn-max"]);
359
359
 
360
360
  /**
361
361
  * Resolve profile defaults for a given token profile tier.
@@ -400,6 +400,22 @@ export function resolveProfileDefaults(profile: TokenProfile): Partial<GSDPrefer
400
400
  skip_reassess: true,
401
401
  },
402
402
  };
403
+ case "burn-max":
404
+ return {
405
+ // Quality-first profile: keep user-selected models, disable downgrade routing.
406
+ // Policy constraints still apply at dispatch time.
407
+ dynamic_routing: {
408
+ enabled: false,
409
+ },
410
+ context_selection: "full",
411
+ phases: {
412
+ skip_research: false,
413
+ skip_slice_research: false,
414
+ skip_reassess: false,
415
+ skip_milestone_validation: false,
416
+ reassess_after_slice: true,
417
+ },
418
+ };
403
419
  }
404
420
  }
405
421
 
@@ -416,7 +432,7 @@ export function resolveEffectiveProfile(): TokenProfile {
416
432
 
417
433
  /**
418
434
  * Resolve the inline level from the active token profile.
419
- * budget -> minimal, balanced -> standard, quality -> full.
435
+ * budget -> minimal, balanced -> standard, quality/burn-max -> full.
420
436
  */
421
437
  export function resolveInlineLevel(): InlineLevel {
422
438
  const profile = resolveEffectiveProfile();
@@ -424,12 +440,13 @@ export function resolveInlineLevel(): InlineLevel {
424
440
  case "budget": return "minimal";
425
441
  case "balanced": return "standard";
426
442
  case "quality": return "full";
443
+ case "burn-max": return "full";
427
444
  }
428
445
  }
429
446
 
430
447
  /**
431
448
  * Resolve the context selection mode from the active token profile.
432
- * budget -> "smart", balanced/quality -> "full".
449
+ * budget -> "smart", balanced/quality/burn-max -> "full".
433
450
  * Explicit preference always wins.
434
451
  */
435
452
  export function resolveContextSelection(): import("./types.js").ContextSelectionMode {
@@ -83,6 +83,7 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
83
83
  "post_unit_hooks",
84
84
  "pre_dispatch_hooks",
85
85
  "dynamic_routing",
86
+ "uok",
86
87
  "token_profile",
87
88
  "phases",
88
89
  "auto_visualize",
@@ -208,6 +209,35 @@ export interface CmuxPreferences {
208
209
  browser?: boolean;
209
210
  }
210
211
 
212
+ export type UokTurnActionMode = "commit" | "snapshot" | "status-only";
213
+
214
+ export interface UokPreferences {
215
+ enabled?: boolean;
216
+ legacy_fallback?: {
217
+ enabled?: boolean;
218
+ };
219
+ gates?: {
220
+ enabled?: boolean;
221
+ };
222
+ model_policy?: {
223
+ enabled?: boolean;
224
+ };
225
+ execution_graph?: {
226
+ enabled?: boolean;
227
+ };
228
+ gitops?: {
229
+ enabled?: boolean;
230
+ turn_action?: UokTurnActionMode;
231
+ turn_push?: boolean;
232
+ };
233
+ audit_unified?: {
234
+ enabled?: boolean;
235
+ };
236
+ plan_v2?: {
237
+ enabled?: boolean;
238
+ };
239
+ }
240
+
211
241
  /**
212
242
  * Opt-in experimental features. All features in this block are disabled by
213
243
  * default and must be explicitly enabled. They may change or be removed without
@@ -256,6 +286,8 @@ export interface GSDPreferences {
256
286
  post_unit_hooks?: PostUnitHookConfig[];
257
287
  pre_dispatch_hooks?: PreDispatchHookConfig[];
258
288
  dynamic_routing?: DynamicRoutingConfig;
289
+ /** Unified Orchestration Kernel controls (all flags default off). */
290
+ uok?: UokPreferences;
259
291
  /** Per-model capability overrides. Deep-merged with built-in profiles for capability-aware routing (ADR-004). */
260
292
  modelOverrides?: Record<string, { capabilities?: Partial<ModelCapabilities> }>;
261
293
  context_management?: ContextManagementConfig;