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

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 (430) 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 +164 -9
  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 +54 -8
  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-worktree.js +2 -0
  12. package/dist/resources/extensions/gsd/auto.js +28 -2
  13. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -3
  14. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +10 -1
  15. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +61 -9
  16. package/dist/resources/extensions/gsd/cache.js +16 -5
  17. package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
  18. package/dist/resources/extensions/gsd/commands/handlers/core.js +5 -1
  19. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  20. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  21. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +51 -4
  22. package/dist/resources/extensions/gsd/docs/preferences-reference.md +16 -1
  23. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  24. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  25. package/dist/resources/extensions/gsd/git-service.js +49 -1
  26. package/dist/resources/extensions/gsd/graph-context.js +98 -7
  27. package/dist/resources/extensions/gsd/gsd-db.js +260 -2
  28. package/dist/resources/extensions/gsd/guided-flow.js +31 -6
  29. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  30. package/dist/resources/extensions/gsd/journal.js +27 -0
  31. package/dist/resources/extensions/gsd/metrics.js +19 -0
  32. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  33. package/dist/resources/extensions/gsd/preferences-models.js +20 -3
  34. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  35. package/dist/resources/extensions/gsd/preferences-validation.js +118 -2
  36. package/dist/resources/extensions/gsd/preferences.js +31 -0
  37. package/dist/resources/extensions/gsd/safety/evidence-collector.js +15 -30
  38. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  39. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
  40. package/dist/resources/extensions/gsd/tools/complete-slice.js +5 -0
  41. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  42. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  43. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  44. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  45. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  46. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  47. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  48. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  49. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  50. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  51. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  52. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  53. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  54. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  55. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  56. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  57. package/dist/web/standalone/.next/BUILD_ID +1 -1
  58. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  59. package/dist/web/standalone/.next/build-manifest.json +2 -2
  60. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  61. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  62. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  66. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  67. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  70. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/index.html +1 -1
  83. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  90. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  91. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  93. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  94. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  95. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  96. package/package.json +1 -1
  97. package/packages/mcp-server/dist/readers/graph.d.ts +1 -1
  98. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -1
  99. package/packages/mcp-server/dist/readers/graph.js +107 -0
  100. package/packages/mcp-server/dist/readers/graph.js.map +1 -1
  101. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  102. package/packages/mcp-server/dist/workflow-tools.js +88 -6
  103. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  104. package/packages/mcp-server/src/readers/graph.test.ts +178 -0
  105. package/packages/mcp-server/src/readers/graph.ts +148 -1
  106. package/packages/mcp-server/src/workflow-tools.ts +95 -10
  107. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  108. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  109. package/packages/pi-ai/dist/index.d.ts +1 -9
  110. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  111. package/packages/pi-ai/dist/index.js +1 -9
  112. package/packages/pi-ai/dist/index.js.map +1 -1
  113. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  114. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  115. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  116. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  117. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  118. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  119. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  120. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  121. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  122. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  123. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  124. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  125. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  126. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  127. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  128. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  129. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  130. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  131. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  132. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  133. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  134. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  135. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  136. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  137. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  138. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  139. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  140. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  141. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  142. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  143. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  144. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  145. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  146. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  147. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  148. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  149. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  150. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  151. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  152. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  153. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  154. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  155. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  156. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  157. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  158. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  159. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  160. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  161. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  162. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  163. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  164. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  165. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  166. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  167. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  168. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  169. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  170. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  171. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  172. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  173. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  174. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  175. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  176. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  177. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  178. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  179. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  180. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  181. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  182. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  183. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  184. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  185. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  186. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  187. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  188. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  189. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  190. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  191. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  192. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  193. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  194. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  195. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  196. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  197. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  198. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  199. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  200. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  201. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  202. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  203. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  204. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  205. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  206. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  207. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  208. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  209. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  210. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  211. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  212. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  213. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  214. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  215. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  216. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  217. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  218. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  219. package/packages/pi-ai/dist/models/index.js +80 -0
  220. package/packages/pi-ai/dist/models/index.js.map +1 -0
  221. package/packages/pi-ai/dist/models.d.ts +1 -36
  222. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  223. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  224. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  225. package/packages/pi-ai/dist/models.js +3 -112
  226. package/packages/pi-ai/dist/models.js.map +1 -1
  227. package/packages/pi-ai/dist/models.test.js +6 -5
  228. package/packages/pi-ai/dist/models.test.js.map +1 -1
  229. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  230. package/packages/pi-ai/src/index.ts +1 -9
  231. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  232. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  233. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  234. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  235. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  236. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  237. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  238. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  239. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  240. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  241. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  242. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  243. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  244. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  245. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  246. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  247. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  248. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  249. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  250. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  251. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  252. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  253. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  254. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  255. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  256. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  257. package/packages/pi-ai/src/models/index.ts +106 -0
  258. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  259. package/packages/pi-ai/src/models.test.ts +6 -5
  260. package/packages/pi-ai/src/models.ts +3 -153
  261. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  262. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
  264. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
  266. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  268. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  269. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  270. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  271. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  273. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts +2 -0
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.d.ts.map +1 -0
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +61 -0
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -0
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +53 -0
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts +8 -5
  289. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +27 -13
  291. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +68 -8
  295. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
  298. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
  301. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  303. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  304. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  305. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  306. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +14 -0
  307. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  308. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +70 -6
  309. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  310. package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
  311. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
  312. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  313. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  314. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +92 -0
  315. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
  316. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
  317. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +75 -0
  318. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +36 -15
  319. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +83 -7
  320. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
  321. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
  322. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  323. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +92 -6
  324. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  325. package/packages/pi-coding-agent/tsconfig.json +2 -2
  326. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  327. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  328. package/packages/pi-tui/dist/tui.js +9 -2
  329. package/packages/pi-tui/dist/tui.js.map +1 -1
  330. package/packages/pi-tui/src/tui.ts +9 -1
  331. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  332. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  333. package/src/resources/extensions/gsd/auto/loop-deps.ts +4 -0
  334. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  335. package/src/resources/extensions/gsd/auto/phases.ts +193 -9
  336. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  337. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
  338. package/src/resources/extensions/gsd/auto-model-selection.ts +69 -8
  339. package/src/resources/extensions/gsd/auto-post-unit.ts +226 -9
  340. package/src/resources/extensions/gsd/auto-recovery.ts +29 -9
  341. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  342. package/src/resources/extensions/gsd/auto-verification.ts +129 -2
  343. package/src/resources/extensions/gsd/auto-worktree.ts +1 -0
  344. package/src/resources/extensions/gsd/auto.ts +34 -2
  345. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +5 -3
  346. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -1
  347. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +72 -8
  348. package/src/resources/extensions/gsd/cache.ts +16 -5
  349. package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
  350. package/src/resources/extensions/gsd/commands/handlers/core.ts +5 -1
  351. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  352. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  353. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +58 -4
  354. package/src/resources/extensions/gsd/docs/preferences-reference.md +16 -1
  355. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  356. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  357. package/src/resources/extensions/gsd/git-service.ts +68 -0
  358. package/src/resources/extensions/gsd/graph-context.ts +139 -12
  359. package/src/resources/extensions/gsd/gsd-db.ts +321 -3
  360. package/src/resources/extensions/gsd/guided-flow.ts +36 -2
  361. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  362. package/src/resources/extensions/gsd/journal.ts +30 -0
  363. package/src/resources/extensions/gsd/metrics.ts +26 -0
  364. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  365. package/src/resources/extensions/gsd/preferences-models.ts +20 -3
  366. package/src/resources/extensions/gsd/preferences-types.ts +38 -0
  367. package/src/resources/extensions/gsd/preferences-validation.ts +117 -2
  368. package/src/resources/extensions/gsd/preferences.ts +34 -0
  369. package/src/resources/extensions/gsd/safety/evidence-collector.ts +15 -31
  370. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  371. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  372. package/src/resources/extensions/gsd/templates/PREFERENCES.md +19 -0
  373. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +177 -0
  374. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
  375. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  376. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  377. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +272 -0
  378. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +117 -0
  379. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  380. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  381. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  382. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  383. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  384. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  385. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  386. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +3 -3
  387. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  388. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  389. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  390. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  391. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  392. package/src/resources/extensions/gsd/tests/preferences.test.ts +145 -0
  393. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +57 -2
  394. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  395. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
  396. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  397. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  398. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  399. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  400. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  401. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  402. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  403. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  404. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  405. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  406. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  407. package/src/resources/extensions/gsd/tools/complete-slice.ts +9 -2
  408. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  409. package/src/resources/extensions/gsd/types.ts +14 -1
  410. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  411. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  412. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  413. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  414. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  415. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  416. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  417. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  418. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  419. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  420. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  421. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  422. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  423. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  424. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  425. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  426. package/packages/pi-ai/dist/models.generated.js +0 -14343
  427. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  428. package/packages/pi-ai/src/models.generated.ts +0 -14345
  429. /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → k1VZ0h-SB6uWSZgPhgNwi}/_buildManifest.js +0 -0
  430. /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → k1VZ0h-SB6uWSZgPhgNwi}/_ssgManifest.js +0 -0
@@ -7,13 +7,144 @@
7
7
  */
8
8
 
9
9
  import { logWarning } from "./workflow-logger.js";
10
- import type { GraphQueryResult, GraphStatusResult } from "@gsd-build/mcp-server";
10
+ import { readFileSync } from "node:fs";
11
+ import { join } from "node:path";
12
+
13
+ interface GraphNode {
14
+ id: string;
15
+ label: string;
16
+ type: string;
17
+ confidence: string;
18
+ description?: string;
19
+ }
20
+
21
+ interface GraphEdge {
22
+ from: string;
23
+ to: string;
24
+ type: string;
25
+ }
26
+
27
+ interface GraphQueryResult {
28
+ nodes: GraphNode[];
29
+ edges: GraphEdge[];
30
+ }
31
+
32
+ interface GraphStatusResult {
33
+ exists: boolean;
34
+ stale: boolean;
35
+ ageHours?: number;
36
+ }
37
+
38
+ interface GraphApi {
39
+ graphQuery: (projectDir: string, term: string, budget?: number) => Promise<GraphQueryResult>;
40
+ graphStatus: (projectDir: string) => Promise<GraphStatusResult>;
41
+ }
42
+
43
+ interface GraphFileShape {
44
+ nodes: GraphNode[];
45
+ edges: GraphEdge[];
46
+ builtAt?: string;
47
+ }
48
+
49
+ let cachedGraphApi: GraphApi | null = null;
50
+ let resolvedGraphApi = false;
11
51
 
12
52
  export interface GraphSubgraphOptions {
13
53
  /** Budget in tokens passed to graphQuery (1 node ≈ 20 tokens, 1 edge ≈ 10 tokens) */
14
54
  budget: number;
15
55
  }
16
56
 
57
+ function readGraphFile(projectDir: string): GraphFileShape | null {
58
+ try {
59
+ const graphPath = join(projectDir, ".gsd", "graphs", "graph.json");
60
+ const raw = readFileSync(graphPath, "utf-8");
61
+ const parsed = JSON.parse(raw) as Partial<GraphFileShape>;
62
+ const nodes = Array.isArray(parsed.nodes) ? parsed.nodes : [];
63
+ const edges = Array.isArray(parsed.edges) ? parsed.edges : [];
64
+ return { nodes, edges, builtAt: typeof parsed.builtAt === "string" ? parsed.builtAt : undefined };
65
+ } catch {
66
+ return null;
67
+ }
68
+ }
69
+
70
+ async function fallbackGraphQuery(projectDir: string, term: string, budget = 3000): Promise<GraphQueryResult> {
71
+ const graph = readGraphFile(projectDir);
72
+ if (!graph) return { nodes: [], edges: [] };
73
+
74
+ const needle = term.trim().toLowerCase();
75
+ const matches = graph.nodes.filter((node) => {
76
+ const hay = [node.id, node.label, node.description].filter(Boolean).join(" ").toLowerCase();
77
+ return hay.includes(needle);
78
+ });
79
+
80
+ const maxNodes = Math.max(1, Math.floor(Math.max(1, budget) / 20));
81
+ const selectedIds = new Set(matches.slice(0, maxNodes).map((node) => node.id));
82
+ const nodeById = new Map(graph.nodes.map((node) => [node.id, node] as const));
83
+
84
+ // Pull one-hop neighbors so relation context survives even when the term
85
+ // matches only one side of an edge.
86
+ for (const edge of graph.edges) {
87
+ if (selectedIds.size >= maxNodes) break;
88
+ const touchesSelection = selectedIds.has(edge.from) || selectedIds.has(edge.to);
89
+ if (!touchesSelection) continue;
90
+ if (selectedIds.has(edge.from) && !selectedIds.has(edge.to) && nodeById.has(edge.to)) {
91
+ selectedIds.add(edge.to);
92
+ } else if (selectedIds.has(edge.to) && !selectedIds.has(edge.from) && nodeById.has(edge.from)) {
93
+ selectedIds.add(edge.from);
94
+ }
95
+ }
96
+
97
+ const nodes = graph.nodes.filter((node) => selectedIds.has(node.id));
98
+
99
+ const remainingBudget = Math.max(0, budget - nodes.length * 20);
100
+ const maxEdges = Math.floor(remainingBudget / 10);
101
+ const edges = graph.edges
102
+ .filter((edge) => selectedIds.has(edge.from) && selectedIds.has(edge.to))
103
+ .slice(0, maxEdges);
104
+
105
+ return { nodes, edges };
106
+ }
107
+
108
+ async function fallbackGraphStatus(projectDir: string): Promise<GraphStatusResult> {
109
+ const graph = readGraphFile(projectDir);
110
+ if (!graph) return { exists: false, stale: false };
111
+ if (!graph.builtAt) return { exists: true, stale: false };
112
+
113
+ const builtAtMs = Date.parse(graph.builtAt);
114
+ if (!Number.isFinite(builtAtMs)) return { exists: true, stale: false };
115
+
116
+ const ageHours = (Date.now() - builtAtMs) / (1000 * 60 * 60);
117
+ return { exists: true, stale: ageHours > 24, ageHours };
118
+ }
119
+
120
+ function isGraphApi(mod: unknown): mod is GraphApi {
121
+ if (!mod || typeof mod !== "object") return false;
122
+ const candidate = mod as Record<string, unknown>;
123
+ return typeof candidate.graphQuery === "function" && typeof candidate.graphStatus === "function";
124
+ }
125
+
126
+ async function resolveGraphApi(): Promise<GraphApi> {
127
+ if (resolvedGraphApi && cachedGraphApi) return cachedGraphApi;
128
+
129
+ resolvedGraphApi = true;
130
+ try {
131
+ const imported = await import("@gsd-build/mcp-server");
132
+ if (isGraphApi(imported)) {
133
+ cachedGraphApi = imported;
134
+ return cachedGraphApi;
135
+ }
136
+ logWarning("prompt", "@gsd-build/mcp-server graph exports unavailable; using local graph fallback");
137
+ } catch {
138
+ // Fall back to local reader implementation.
139
+ }
140
+
141
+ cachedGraphApi = {
142
+ graphQuery: fallbackGraphQuery,
143
+ graphStatus: fallbackGraphStatus,
144
+ };
145
+ return cachedGraphApi;
146
+ }
147
+
17
148
  /**
18
149
  * Query the knowledge graph for nodes related to the given term and format
19
150
  * the result as an inlined context block.
@@ -33,18 +164,14 @@ export async function inlineGraphSubgraph(
33
164
  if (!term || !term.trim()) return null;
34
165
 
35
166
  try {
36
- const { graphQuery, graphStatus } = await import("@gsd-build/mcp-server") as {
37
- graphQuery: (projectDir: string, term: string, budget?: number) => Promise<GraphQueryResult>;
38
- graphStatus: (projectDir: string) => Promise<GraphStatusResult>;
39
- };
40
-
41
- const result = await graphQuery(projectDir, term, opts.budget);
167
+ const graphApi = await resolveGraphApi();
168
+ const result = await graphApi.graphQuery(projectDir, term, opts.budget);
42
169
  if (result.nodes.length === 0) return null;
43
170
 
44
171
  // Check staleness for annotation
45
172
  let staleAnnotation = "";
46
173
  try {
47
- const status = await graphStatus(projectDir);
174
+ const status = await graphApi.graphStatus(projectDir);
48
175
  if (status.exists && status.stale && status.ageHours !== undefined) {
49
176
  const hours = Math.round(status.ageHours);
50
177
  staleAnnotation = `\n> ⚠ Graph last built ${hours}h ago — context may be outdated`;
@@ -54,14 +181,14 @@ export async function inlineGraphSubgraph(
54
181
  }
55
182
 
56
183
  // Format nodes as a compact list
57
- const nodeLines = result.nodes.map((n) => {
58
- const desc = n.description ? ` — ${n.description}` : "";
59
- return `- **${n.label}** (\`${n.type}\`, ${n.confidence})${desc}`;
184
+ const nodeLines = result.nodes.map((node) => {
185
+ const desc = node.description ? ` — ${node.description}` : "";
186
+ return `- **${node.label}** (\`${node.type}\`, ${node.confidence})${desc}`;
60
187
  });
61
188
 
62
189
  // Format edges as relations (only if present)
63
190
  const edgeLines = result.edges.length > 0
64
- ? result.edges.map((e) => `- \`${e.from}\` →[${e.type}]→ \`${e.to}\``)
191
+ ? result.edges.map((edge) => `- \`${edge.from}\` →[${edge.type}]→ \`${edge.to}\``)
65
192
  : [];
66
193
 
67
194
  const sections: string[] = [
@@ -54,8 +54,8 @@ let loadAttempted = false;
54
54
 
55
55
  function suppressSqliteWarning(): void {
56
56
  const origEmit = process.emit;
57
- // @ts-expect-error overriding process.emit for warning filter
58
- process.emit = function (event: string, ...args: unknown[]): boolean {
57
+ // Override via loose cast: Node's overloaded emit signature is not directly assignable.
58
+ (process as any).emit = function (event: string, ...args: unknown[]): boolean {
59
59
  if (
60
60
  event === "warning" &&
61
61
  args[0] &&
@@ -180,7 +180,7 @@ function openRawDb(path: string): unknown {
180
180
  return new Database(path);
181
181
  }
182
182
 
183
- const SCHEMA_VERSION = 14;
183
+ const SCHEMA_VERSION = 15;
184
184
 
185
185
  function indexExists(db: DbAdapter, name: string): boolean {
186
186
  return !!db.prepare(
@@ -443,6 +443,70 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
443
443
  )
444
444
  `);
445
445
 
446
+ db.exec(`
447
+ CREATE TABLE IF NOT EXISTS gate_runs (
448
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
449
+ trace_id TEXT NOT NULL,
450
+ turn_id TEXT NOT NULL,
451
+ gate_id TEXT NOT NULL,
452
+ gate_type TEXT NOT NULL DEFAULT '',
453
+ unit_type TEXT DEFAULT NULL,
454
+ unit_id TEXT DEFAULT NULL,
455
+ milestone_id TEXT DEFAULT NULL,
456
+ slice_id TEXT DEFAULT NULL,
457
+ task_id TEXT DEFAULT NULL,
458
+ outcome TEXT NOT NULL DEFAULT 'pass',
459
+ failure_class TEXT NOT NULL DEFAULT 'none',
460
+ rationale TEXT NOT NULL DEFAULT '',
461
+ findings TEXT NOT NULL DEFAULT '',
462
+ attempt INTEGER NOT NULL DEFAULT 1,
463
+ max_attempts INTEGER NOT NULL DEFAULT 1,
464
+ retryable INTEGER NOT NULL DEFAULT 0,
465
+ evaluated_at TEXT NOT NULL DEFAULT ''
466
+ )
467
+ `);
468
+
469
+ db.exec(`
470
+ CREATE TABLE IF NOT EXISTS turn_git_transactions (
471
+ trace_id TEXT NOT NULL,
472
+ turn_id TEXT NOT NULL,
473
+ unit_type TEXT DEFAULT NULL,
474
+ unit_id TEXT DEFAULT NULL,
475
+ stage TEXT NOT NULL DEFAULT 'turn-start',
476
+ action TEXT NOT NULL DEFAULT 'status-only',
477
+ push INTEGER NOT NULL DEFAULT 0,
478
+ status TEXT NOT NULL DEFAULT 'ok',
479
+ error TEXT DEFAULT NULL,
480
+ metadata_json TEXT NOT NULL DEFAULT '{}',
481
+ updated_at TEXT NOT NULL DEFAULT '',
482
+ PRIMARY KEY (trace_id, turn_id, stage)
483
+ )
484
+ `);
485
+
486
+ db.exec(`
487
+ CREATE TABLE IF NOT EXISTS audit_events (
488
+ event_id TEXT PRIMARY KEY,
489
+ trace_id TEXT NOT NULL,
490
+ turn_id TEXT DEFAULT NULL,
491
+ caused_by TEXT DEFAULT NULL,
492
+ category TEXT NOT NULL,
493
+ type TEXT NOT NULL,
494
+ ts TEXT NOT NULL,
495
+ payload_json TEXT NOT NULL DEFAULT '{}'
496
+ )
497
+ `);
498
+
499
+ db.exec(`
500
+ CREATE TABLE IF NOT EXISTS audit_turn_index (
501
+ trace_id TEXT NOT NULL,
502
+ turn_id TEXT NOT NULL,
503
+ first_ts TEXT NOT NULL,
504
+ last_ts TEXT NOT NULL,
505
+ event_count INTEGER NOT NULL DEFAULT 0,
506
+ PRIMARY KEY (trace_id, turn_id)
507
+ )
508
+ `);
509
+
446
510
  db.exec("CREATE INDEX IF NOT EXISTS idx_memories_active ON memories(superseded_by)");
447
511
  db.exec("CREATE INDEX IF NOT EXISTS idx_replan_history_milestone ON replan_history(milestone_id, created_at)");
448
512
 
@@ -456,6 +520,11 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
456
520
 
457
521
  // v14 index — slice dependency lookups
458
522
  db.exec("CREATE INDEX IF NOT EXISTS idx_slice_deps_target ON slice_dependencies(milestone_id, depends_on_slice_id)");
523
+ db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_turn ON gate_runs(trace_id, turn_id)");
524
+ db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_lookup ON gate_runs(milestone_id, slice_id, task_id, gate_id)");
525
+ db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
526
+ db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
527
+ db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
459
528
 
460
529
  db.exec(`CREATE VIEW IF NOT EXISTS active_decisions AS SELECT * FROM decisions WHERE superseded_by IS NULL`);
461
530
  db.exec(`CREATE VIEW IF NOT EXISTS active_requirements AS SELECT * FROM requirements WHERE superseded_by IS NULL`);
@@ -810,6 +879,78 @@ function migrateSchema(db: DbAdapter): void {
810
879
  });
811
880
  }
812
881
 
882
+ if (currentVersion < 15) {
883
+ db.exec(`
884
+ CREATE TABLE IF NOT EXISTS gate_runs (
885
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
886
+ trace_id TEXT NOT NULL,
887
+ turn_id TEXT NOT NULL,
888
+ gate_id TEXT NOT NULL,
889
+ gate_type TEXT NOT NULL DEFAULT '',
890
+ unit_type TEXT DEFAULT NULL,
891
+ unit_id TEXT DEFAULT NULL,
892
+ milestone_id TEXT DEFAULT NULL,
893
+ slice_id TEXT DEFAULT NULL,
894
+ task_id TEXT DEFAULT NULL,
895
+ outcome TEXT NOT NULL DEFAULT 'pass',
896
+ failure_class TEXT NOT NULL DEFAULT 'none',
897
+ rationale TEXT NOT NULL DEFAULT '',
898
+ findings TEXT NOT NULL DEFAULT '',
899
+ attempt INTEGER NOT NULL DEFAULT 1,
900
+ max_attempts INTEGER NOT NULL DEFAULT 1,
901
+ retryable INTEGER NOT NULL DEFAULT 0,
902
+ evaluated_at TEXT NOT NULL DEFAULT ''
903
+ )
904
+ `);
905
+ db.exec(`
906
+ CREATE TABLE IF NOT EXISTS turn_git_transactions (
907
+ trace_id TEXT NOT NULL,
908
+ turn_id TEXT NOT NULL,
909
+ unit_type TEXT DEFAULT NULL,
910
+ unit_id TEXT DEFAULT NULL,
911
+ stage TEXT NOT NULL DEFAULT 'turn-start',
912
+ action TEXT NOT NULL DEFAULT 'status-only',
913
+ push INTEGER NOT NULL DEFAULT 0,
914
+ status TEXT NOT NULL DEFAULT 'ok',
915
+ error TEXT DEFAULT NULL,
916
+ metadata_json TEXT NOT NULL DEFAULT '{}',
917
+ updated_at TEXT NOT NULL DEFAULT '',
918
+ PRIMARY KEY (trace_id, turn_id, stage)
919
+ )
920
+ `);
921
+ db.exec(`
922
+ CREATE TABLE IF NOT EXISTS audit_events (
923
+ event_id TEXT PRIMARY KEY,
924
+ trace_id TEXT NOT NULL,
925
+ turn_id TEXT DEFAULT NULL,
926
+ caused_by TEXT DEFAULT NULL,
927
+ category TEXT NOT NULL,
928
+ type TEXT NOT NULL,
929
+ ts TEXT NOT NULL,
930
+ payload_json TEXT NOT NULL DEFAULT '{}'
931
+ )
932
+ `);
933
+ db.exec(`
934
+ CREATE TABLE IF NOT EXISTS audit_turn_index (
935
+ trace_id TEXT NOT NULL,
936
+ turn_id TEXT NOT NULL,
937
+ first_ts TEXT NOT NULL,
938
+ last_ts TEXT NOT NULL,
939
+ event_count INTEGER NOT NULL DEFAULT 0,
940
+ PRIMARY KEY (trace_id, turn_id)
941
+ )
942
+ `);
943
+ db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_turn ON gate_runs(trace_id, turn_id)");
944
+ db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_lookup ON gate_runs(milestone_id, slice_id, task_id, gate_id)");
945
+ db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
946
+ db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
947
+ db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
948
+ db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
949
+ ":version": 15,
950
+ ":applied_at": new Date().toISOString(),
951
+ });
952
+ }
953
+
813
954
  db.exec("COMMIT");
814
955
  } catch (err) {
815
956
  db.exec("ROLLBACK");
@@ -2287,6 +2428,9 @@ export function deleteMilestone(milestoneId: string): void {
2287
2428
  currentDb!.prepare(
2288
2429
  `DELETE FROM quality_gates WHERE milestone_id = :mid`,
2289
2430
  ).run({ ":mid": milestoneId });
2431
+ currentDb!.prepare(
2432
+ `DELETE FROM gate_runs WHERE milestone_id = :mid`,
2433
+ ).run({ ":mid": milestoneId });
2290
2434
  currentDb!.prepare(
2291
2435
  `DELETE FROM tasks WHERE milestone_id = :mid`,
2292
2436
  ).run({ ":mid": milestoneId });
@@ -2420,6 +2564,30 @@ export function saveGateResult(g: {
2420
2564
  ":findings": g.findings,
2421
2565
  ":evaluated_at": new Date().toISOString(),
2422
2566
  });
2567
+
2568
+ const outcome =
2569
+ g.verdict === "pass"
2570
+ ? "pass"
2571
+ : g.verdict === "omitted"
2572
+ ? "manual-attention"
2573
+ : "fail";
2574
+ insertGateRun({
2575
+ traceId: `quality-gate:${g.milestoneId}:${g.sliceId}`,
2576
+ turnId: `gate:${g.gateId}:${g.taskId ?? "slice"}`,
2577
+ gateId: g.gateId,
2578
+ gateType: "quality-gate",
2579
+ milestoneId: g.milestoneId,
2580
+ sliceId: g.sliceId,
2581
+ taskId: g.taskId ?? undefined,
2582
+ outcome,
2583
+ failureClass: outcome === "fail" ? "verification" : outcome === "manual-attention" ? "manual-attention" : "none",
2584
+ rationale: g.rationale,
2585
+ findings: g.findings,
2586
+ attempt: 1,
2587
+ maxAttempts: 1,
2588
+ retryable: false,
2589
+ evaluatedAt: new Date().toISOString(),
2590
+ });
2423
2591
  }
2424
2592
 
2425
2593
  export function getPendingGates(milestoneId: string, sliceId: string, scope?: GateScope): GateRow[] {
@@ -2513,6 +2681,156 @@ export function getPendingGateCountForTurn(
2513
2681
  return getPendingGatesForTurn(milestoneId, sliceId, turn).length;
2514
2682
  }
2515
2683
 
2684
+ export function insertGateRun(entry: {
2685
+ traceId: string;
2686
+ turnId: string;
2687
+ gateId: string;
2688
+ gateType: string;
2689
+ unitType?: string;
2690
+ unitId?: string;
2691
+ milestoneId?: string;
2692
+ sliceId?: string;
2693
+ taskId?: string;
2694
+ outcome: "pass" | "fail" | "retry" | "manual-attention";
2695
+ failureClass: "none" | "policy" | "input" | "execution" | "artifact" | "verification" | "closeout" | "git" | "timeout" | "manual-attention" | "unknown";
2696
+ rationale?: string;
2697
+ findings?: string;
2698
+ attempt: number;
2699
+ maxAttempts: number;
2700
+ retryable: boolean;
2701
+ evaluatedAt: string;
2702
+ }): void {
2703
+ if (!currentDb) return;
2704
+ currentDb.prepare(
2705
+ `INSERT INTO gate_runs (
2706
+ trace_id, turn_id, gate_id, gate_type, unit_type, unit_id, milestone_id, slice_id, task_id,
2707
+ outcome, failure_class, rationale, findings, attempt, max_attempts, retryable, evaluated_at
2708
+ ) VALUES (
2709
+ :trace_id, :turn_id, :gate_id, :gate_type, :unit_type, :unit_id, :milestone_id, :slice_id, :task_id,
2710
+ :outcome, :failure_class, :rationale, :findings, :attempt, :max_attempts, :retryable, :evaluated_at
2711
+ )`,
2712
+ ).run({
2713
+ ":trace_id": entry.traceId,
2714
+ ":turn_id": entry.turnId,
2715
+ ":gate_id": entry.gateId,
2716
+ ":gate_type": entry.gateType,
2717
+ ":unit_type": entry.unitType ?? null,
2718
+ ":unit_id": entry.unitId ?? null,
2719
+ ":milestone_id": entry.milestoneId ?? null,
2720
+ ":slice_id": entry.sliceId ?? null,
2721
+ ":task_id": entry.taskId ?? null,
2722
+ ":outcome": entry.outcome,
2723
+ ":failure_class": entry.failureClass,
2724
+ ":rationale": entry.rationale ?? "",
2725
+ ":findings": entry.findings ?? "",
2726
+ ":attempt": entry.attempt,
2727
+ ":max_attempts": entry.maxAttempts,
2728
+ ":retryable": entry.retryable ? 1 : 0,
2729
+ ":evaluated_at": entry.evaluatedAt,
2730
+ });
2731
+ }
2732
+
2733
+ export function upsertTurnGitTransaction(entry: {
2734
+ traceId: string;
2735
+ turnId: string;
2736
+ unitType?: string;
2737
+ unitId?: string;
2738
+ stage: string;
2739
+ action: "commit" | "snapshot" | "status-only";
2740
+ push: boolean;
2741
+ status: "ok" | "failed";
2742
+ error?: string;
2743
+ metadata?: Record<string, unknown>;
2744
+ updatedAt: string;
2745
+ }): void {
2746
+ if (!currentDb) return;
2747
+ currentDb.prepare(
2748
+ `INSERT OR REPLACE INTO turn_git_transactions (
2749
+ trace_id, turn_id, unit_type, unit_id, stage, action, push, status, error, metadata_json, updated_at
2750
+ ) VALUES (
2751
+ :trace_id, :turn_id, :unit_type, :unit_id, :stage, :action, :push, :status, :error, :metadata_json, :updated_at
2752
+ )`,
2753
+ ).run({
2754
+ ":trace_id": entry.traceId,
2755
+ ":turn_id": entry.turnId,
2756
+ ":unit_type": entry.unitType ?? null,
2757
+ ":unit_id": entry.unitId ?? null,
2758
+ ":stage": entry.stage,
2759
+ ":action": entry.action,
2760
+ ":push": entry.push ? 1 : 0,
2761
+ ":status": entry.status,
2762
+ ":error": entry.error ?? null,
2763
+ ":metadata_json": JSON.stringify(entry.metadata ?? {}),
2764
+ ":updated_at": entry.updatedAt,
2765
+ });
2766
+ }
2767
+
2768
+ export function insertAuditEvent(entry: {
2769
+ eventId: string;
2770
+ traceId: string;
2771
+ turnId?: string;
2772
+ causedBy?: string;
2773
+ category: string;
2774
+ type: string;
2775
+ ts: string;
2776
+ payload: Record<string, unknown>;
2777
+ }): void {
2778
+ if (!currentDb) return;
2779
+ transaction(() => {
2780
+ currentDb!.prepare(
2781
+ `INSERT OR IGNORE INTO audit_events (
2782
+ event_id, trace_id, turn_id, caused_by, category, type, ts, payload_json
2783
+ ) VALUES (
2784
+ :event_id, :trace_id, :turn_id, :caused_by, :category, :type, :ts, :payload_json
2785
+ )`,
2786
+ ).run({
2787
+ ":event_id": entry.eventId,
2788
+ ":trace_id": entry.traceId,
2789
+ ":turn_id": entry.turnId ?? null,
2790
+ ":caused_by": entry.causedBy ?? null,
2791
+ ":category": entry.category,
2792
+ ":type": entry.type,
2793
+ ":ts": entry.ts,
2794
+ ":payload_json": JSON.stringify(entry.payload ?? {}),
2795
+ });
2796
+
2797
+ if (entry.turnId) {
2798
+ const row = currentDb!.prepare(
2799
+ `SELECT event_count, first_ts, last_ts
2800
+ FROM audit_turn_index
2801
+ WHERE trace_id = :trace_id AND turn_id = :turn_id`,
2802
+ ).get({
2803
+ ":trace_id": entry.traceId,
2804
+ ":turn_id": entry.turnId,
2805
+ });
2806
+ if (row) {
2807
+ currentDb!.prepare(
2808
+ `UPDATE audit_turn_index
2809
+ SET first_ts = CASE WHEN :ts < first_ts THEN :ts ELSE first_ts END,
2810
+ last_ts = CASE WHEN :ts > last_ts THEN :ts ELSE last_ts END,
2811
+ event_count = event_count + 1
2812
+ WHERE trace_id = :trace_id AND turn_id = :turn_id`,
2813
+ ).run({
2814
+ ":trace_id": entry.traceId,
2815
+ ":turn_id": entry.turnId,
2816
+ ":ts": entry.ts,
2817
+ });
2818
+ } else {
2819
+ currentDb!.prepare(
2820
+ `INSERT INTO audit_turn_index (trace_id, turn_id, first_ts, last_ts, event_count)
2821
+ VALUES (:trace_id, :turn_id, :first_ts, :last_ts, :event_count)`,
2822
+ ).run({
2823
+ ":trace_id": entry.traceId,
2824
+ ":turn_id": entry.turnId,
2825
+ ":first_ts": entry.ts,
2826
+ ":last_ts": entry.ts,
2827
+ ":event_count": 1,
2828
+ });
2829
+ }
2830
+ }
2831
+ });
2832
+ }
2833
+
2516
2834
  // ─── Single-writer bypass wrappers ───────────────────────────────────────
2517
2835
  // These wrappers exist so modules outside this file never need to call
2518
2836
  // `_getAdapter()` for writes. Each one is a byte-equivalent replacement for
@@ -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. */
@@ -239,10 +269,12 @@ export function checkAutoStartAfterDiscuss(): boolean {
239
269
  } catch (e) { logWarning("guided", `CONTEXT-DRAFT.md unlink failed: ${(e as Error).message}`); }
240
270
 
241
271
  // Cleanup: remove discussion manifest after auto-start (only needed during discussion)
242
- try { unlinkSync(manifestPath); } catch (e) { logWarning("guided", `manifest unlink failed: ${(e as Error).message}`); }
272
+ if (existsSync(manifestPath)) {
273
+ try { unlinkSync(manifestPath); } catch (e) { logWarning("guided", `manifest unlink failed: ${(e as Error).message}`); }
274
+ }
243
275
 
244
276
  pendingAutoStartMap.delete(basePath);
245
- ctx.ui.notify(`Milestone ${milestoneId} ready.`, "info");
277
+ ctx.ui.notify(`Milestone ${milestoneId} ready.`, "success");
246
278
  startAutoDetached(ctx, pi, basePath, false, { step });
247
279
  return true;
248
280
  }
@@ -1320,6 +1352,8 @@ export async function showSmartEntry(
1320
1352
  logWarning("guided", `STATE.md rebuild failed: ${(err as Error).message}`);
1321
1353
  }
1322
1354
 
1355
+ if (!runPlanV2Gate(ctx, basePath, state)) return;
1356
+
1323
1357
  if (!state.activeMilestone?.id) {
1324
1358
  // Guard: if a discuss session is already in flight, don't re-inject the prompt.
1325
1359
  // Both /gsd and /gsd auto reach this branch when no milestone exists yet.
@@ -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