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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/dist/resources/extensions/gsd/activity-log.js +16 -0
  2. package/dist/resources/extensions/gsd/auto/loop.js +147 -10
  3. package/dist/resources/extensions/gsd/auto/phases.js +113 -3
  4. package/dist/resources/extensions/gsd/auto/session.js +10 -0
  5. package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
  6. package/dist/resources/extensions/gsd/auto-model-selection.js +51 -5
  7. package/dist/resources/extensions/gsd/auto-post-unit.js +215 -8
  8. package/dist/resources/extensions/gsd/auto-recovery.js +24 -10
  9. package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
  10. package/dist/resources/extensions/gsd/auto-verification.js +100 -2
  11. package/dist/resources/extensions/gsd/auto.js +28 -2
  12. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +10 -1
  13. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +61 -9
  14. package/dist/resources/extensions/gsd/cache.js +16 -5
  15. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  16. package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
  17. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  18. package/dist/resources/extensions/gsd/docs/preferences-reference.md +14 -1
  19. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
  20. package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
  21. package/dist/resources/extensions/gsd/git-service.js +49 -1
  22. package/dist/resources/extensions/gsd/graph-context.js +98 -7
  23. package/dist/resources/extensions/gsd/gsd-db.js +260 -2
  24. package/dist/resources/extensions/gsd/guided-flow.js +24 -1
  25. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  26. package/dist/resources/extensions/gsd/journal.js +27 -0
  27. package/dist/resources/extensions/gsd/metrics.js +19 -0
  28. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  29. package/dist/resources/extensions/gsd/preferences-models.js +20 -3
  30. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  31. package/dist/resources/extensions/gsd/preferences-validation.js +108 -2
  32. package/dist/resources/extensions/gsd/preferences.js +26 -0
  33. package/dist/resources/extensions/gsd/safety/evidence-collector.js +15 -30
  34. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  35. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  36. package/dist/resources/extensions/gsd/tools/complete-slice.js +5 -0
  37. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  38. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  39. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  40. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  41. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  42. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  43. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  44. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  45. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  46. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  47. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  48. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  49. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  50. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  51. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  52. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  53. package/dist/web/standalone/.next/BUILD_ID +1 -1
  54. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  55. package/dist/web/standalone/.next/build-manifest.json +2 -2
  56. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  57. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  58. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  59. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  60. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  62. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  66. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  67. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  74. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/index.html +1 -1
  79. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  86. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  87. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  88. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  89. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  90. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  91. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  92. package/package.json +1 -1
  93. package/packages/mcp-server/dist/readers/graph.d.ts +1 -1
  94. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -1
  95. package/packages/mcp-server/dist/readers/graph.js +107 -0
  96. package/packages/mcp-server/dist/readers/graph.js.map +1 -1
  97. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  98. package/packages/mcp-server/dist/workflow-tools.js +88 -6
  99. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  100. package/packages/mcp-server/src/readers/graph.test.ts +178 -0
  101. package/packages/mcp-server/src/readers/graph.ts +148 -1
  102. package/packages/mcp-server/src/workflow-tools.ts +95 -10
  103. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  104. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  105. package/packages/pi-ai/dist/index.d.ts +1 -9
  106. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  107. package/packages/pi-ai/dist/index.js +1 -9
  108. package/packages/pi-ai/dist/index.js.map +1 -1
  109. package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
  110. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
  111. package/packages/pi-ai/dist/models/capability-patches.js +36 -0
  112. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
  113. package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
  114. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
  115. package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
  116. package/packages/pi-ai/dist/models/custom.js.map +1 -0
  117. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
  118. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
  119. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
  120. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
  121. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
  122. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
  123. package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
  124. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
  125. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
  126. package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
  127. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
  128. package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
  129. package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
  130. package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
  131. package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
  132. package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
  133. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
  134. package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
  135. package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
  136. package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
  137. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
  138. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
  139. package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
  140. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
  141. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
  142. package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
  143. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
  144. package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
  145. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
  146. package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
  147. package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
  148. package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
  149. package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
  150. package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
  151. package/packages/pi-ai/dist/models/generated/google.js +464 -0
  152. package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
  153. package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
  154. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
  155. package/packages/pi-ai/dist/models/generated/groq.js +311 -0
  156. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
  157. package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
  158. package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
  159. package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
  160. package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
  161. package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
  162. package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
  163. package/packages/pi-ai/dist/models/generated/index.js +51 -0
  164. package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
  165. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
  166. package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
  167. package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
  168. package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
  169. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
  170. package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
  171. package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
  172. package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
  173. package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
  174. package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
  175. package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
  176. package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
  177. package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
  178. package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
  179. package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
  180. package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
  181. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
  182. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
  183. package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
  184. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
  185. package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
  186. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
  187. package/packages/pi-ai/dist/models/generated/openai.js +702 -0
  188. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
  189. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
  190. package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
  191. package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
  192. package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
  193. package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
  194. package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
  195. package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
  196. package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
  197. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
  198. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
  199. package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
  200. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
  201. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
  202. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
  203. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
  204. package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
  205. package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
  206. package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
  207. package/packages/pi-ai/dist/models/generated/xai.js +413 -0
  208. package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
  209. package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
  210. package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
  211. package/packages/pi-ai/dist/models/generated/zai.js +239 -0
  212. package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
  213. package/packages/pi-ai/dist/models/index.d.ts +27 -0
  214. package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
  215. package/packages/pi-ai/dist/models/index.js +80 -0
  216. package/packages/pi-ai/dist/models/index.js.map +1 -0
  217. package/packages/pi-ai/dist/models.d.ts +1 -36
  218. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  219. package/packages/pi-ai/dist/models.generated.test.js +1 -2
  220. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  221. package/packages/pi-ai/dist/models.js +3 -112
  222. package/packages/pi-ai/dist/models.js.map +1 -1
  223. package/packages/pi-ai/dist/models.test.js +6 -5
  224. package/packages/pi-ai/dist/models.test.js.map +1 -1
  225. package/packages/pi-ai/scripts/generate-models.ts +74 -40
  226. package/packages/pi-ai/src/index.ts +1 -9
  227. package/packages/pi-ai/src/models/capability-patches.ts +40 -0
  228. package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
  229. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
  230. package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
  231. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  232. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  233. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  234. package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
  235. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  236. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  237. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  238. package/packages/pi-ai/src/models/generated/groq.ts +313 -0
  239. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  240. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  241. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  242. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  243. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  244. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  245. package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
  246. package/packages/pi-ai/src/models/generated/openai.ts +704 -0
  247. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  248. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  249. package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
  250. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  251. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  252. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  253. package/packages/pi-ai/src/models/index.ts +106 -0
  254. package/packages/pi-ai/src/models.generated.test.ts +1 -2
  255. package/packages/pi-ai/src/models.test.ts +6 -5
  256. package/packages/pi-ai/src/models.ts +3 -153
  257. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  258. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
  260. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
  262. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  264. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  265. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  266. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  267. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  269. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  273. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +47 -0
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +68 -8
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  288. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
  289. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
  291. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
  292. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +14 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +70 -6
  297. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  298. package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
  299. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
  300. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  301. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  302. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
  303. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
  304. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +67 -0
  305. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +83 -7
  306. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
  307. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
  308. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
  309. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +92 -6
  310. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  311. package/packages/pi-coding-agent/tsconfig.json +2 -2
  312. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  313. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  314. package/src/resources/extensions/gsd/auto/loop-deps.ts +4 -0
  315. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  316. package/src/resources/extensions/gsd/auto/phases.ts +123 -3
  317. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  318. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
  319. package/src/resources/extensions/gsd/auto-model-selection.ts +66 -5
  320. package/src/resources/extensions/gsd/auto-post-unit.ts +226 -9
  321. package/src/resources/extensions/gsd/auto-recovery.ts +29 -9
  322. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  323. package/src/resources/extensions/gsd/auto-verification.ts +129 -2
  324. package/src/resources/extensions/gsd/auto.ts +34 -2
  325. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -1
  326. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +72 -8
  327. package/src/resources/extensions/gsd/cache.ts +16 -5
  328. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  329. package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
  330. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  331. package/src/resources/extensions/gsd/docs/preferences-reference.md +14 -1
  332. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
  333. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  334. package/src/resources/extensions/gsd/git-service.ts +68 -0
  335. package/src/resources/extensions/gsd/graph-context.ts +139 -12
  336. package/src/resources/extensions/gsd/gsd-db.ts +321 -3
  337. package/src/resources/extensions/gsd/guided-flow.ts +33 -1
  338. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  339. package/src/resources/extensions/gsd/journal.ts +30 -0
  340. package/src/resources/extensions/gsd/metrics.ts +26 -0
  341. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  342. package/src/resources/extensions/gsd/preferences-models.ts +20 -3
  343. package/src/resources/extensions/gsd/preferences-types.ts +32 -0
  344. package/src/resources/extensions/gsd/preferences-validation.ts +107 -2
  345. package/src/resources/extensions/gsd/preferences.ts +28 -0
  346. package/src/resources/extensions/gsd/safety/evidence-collector.ts +15 -31
  347. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  348. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  349. package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  350. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +177 -0
  351. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
  352. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  353. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  354. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +272 -0
  355. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  356. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
  357. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  358. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  359. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  360. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  361. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  362. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  363. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  364. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  365. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  366. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  367. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
  368. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
  369. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  370. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  371. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  372. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  373. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  374. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  375. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  376. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  377. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  378. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  379. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  380. package/src/resources/extensions/gsd/tools/complete-slice.ts +9 -2
  381. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  382. package/src/resources/extensions/gsd/types.ts +14 -1
  383. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  384. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  385. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  386. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  387. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  388. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  389. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  390. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  391. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  392. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  393. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  394. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  395. package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
  396. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  397. package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
  398. package/packages/pi-ai/dist/models.custom.js.map +0 -1
  399. package/packages/pi-ai/dist/models.generated.js +0 -14343
  400. package/packages/pi-ai/dist/models.generated.js.map +0 -1
  401. package/packages/pi-ai/src/models.generated.ts +0 -14345
  402. /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → kn6xzWKYnogsxp2b6RpDD}/_buildManifest.js +0 -0
  403. /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → kn6xzWKYnogsxp2b6RpDD}/_ssgManifest.js +0 -0
@@ -0,0 +1,75 @@
1
+ import { isDbAvailable, upsertTurnGitTransaction } from "../gsd-db.js";
2
+ import type { TurnCloseoutRecord } from "./contracts.js";
3
+ import { buildAuditEnvelope, emitUokAuditEvent } from "./audit.js";
4
+
5
+ export type TurnGitStage = "turn-start" | "stage" | "checkpoint" | "publish" | "record";
6
+
7
+ interface GitTxArgs {
8
+ basePath: string;
9
+ traceId: string;
10
+ turnId: string;
11
+ unitType?: string;
12
+ unitId?: string;
13
+ stage: TurnGitStage;
14
+ action: "commit" | "snapshot" | "status-only";
15
+ push: boolean;
16
+ status: "ok" | "failed";
17
+ error?: string;
18
+ metadata?: Record<string, unknown>;
19
+ }
20
+
21
+ export function writeTurnGitTransaction(args: GitTxArgs): void {
22
+ if (!isDbAvailable()) return;
23
+ upsertTurnGitTransaction({
24
+ traceId: args.traceId,
25
+ turnId: args.turnId,
26
+ unitType: args.unitType,
27
+ unitId: args.unitId,
28
+ stage: args.stage,
29
+ action: args.action,
30
+ push: args.push,
31
+ status: args.status,
32
+ error: args.error,
33
+ metadata: args.metadata,
34
+ updatedAt: new Date().toISOString(),
35
+ });
36
+
37
+ emitUokAuditEvent(
38
+ args.basePath,
39
+ buildAuditEnvelope({
40
+ traceId: args.traceId,
41
+ turnId: args.turnId,
42
+ category: "gitops",
43
+ type: `turn-git-${args.stage}`,
44
+ payload: {
45
+ unitType: args.unitType,
46
+ unitId: args.unitId,
47
+ action: args.action,
48
+ push: args.push,
49
+ status: args.status,
50
+ error: args.error,
51
+ ...(args.metadata ?? {}),
52
+ },
53
+ }),
54
+ );
55
+ }
56
+
57
+ export function writeTurnCloseoutGitRecord(basePath: string, record: TurnCloseoutRecord): void {
58
+ writeTurnGitTransaction({
59
+ basePath,
60
+ traceId: record.traceId,
61
+ turnId: record.turnId,
62
+ unitType: record.unitType,
63
+ unitId: record.unitId,
64
+ stage: "record",
65
+ action: record.gitAction,
66
+ push: record.gitPushed,
67
+ status: record.failureClass === "git" ? "failed" : "ok",
68
+ error: record.failureClass === "git" ? "git closeout failure" : undefined,
69
+ metadata: {
70
+ turnStatus: record.status,
71
+ finishedAt: record.finishedAt,
72
+ activityFile: record.activityFile,
73
+ },
74
+ });
75
+ }
@@ -0,0 +1,105 @@
1
+ import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
2
+ import { appendFileSync, mkdirSync } from "node:fs";
3
+ import { join } from "node:path";
4
+
5
+ import type { AutoSession } from "../auto/session.js";
6
+ import type { LoopDeps } from "../auto/loop-deps.js";
7
+ import { gsdRoot } from "../paths.js";
8
+ import { buildAuditEnvelope, emitUokAuditEvent } from "./audit.js";
9
+ import { setUnifiedAuditEnabled } from "./audit-toggle.js";
10
+ import { resolveUokFlags } from "./flags.js";
11
+ import { createTurnObserver } from "./loop-adapter.js";
12
+
13
+ interface RunAutoLoopWithUokArgs {
14
+ ctx: ExtensionContext;
15
+ pi: ExtensionAPI;
16
+ s: AutoSession;
17
+ deps: LoopDeps;
18
+ runLegacyLoop: (
19
+ ctx: ExtensionContext,
20
+ pi: ExtensionAPI,
21
+ s: AutoSession,
22
+ deps: LoopDeps,
23
+ ) => Promise<void>;
24
+ }
25
+
26
+ function parityLogPath(basePath: string): string {
27
+ return join(gsdRoot(basePath), "runtime", "uok-parity.jsonl");
28
+ }
29
+
30
+ function writeParityEvent(basePath: string, event: Record<string, unknown>): void {
31
+ try {
32
+ mkdirSync(join(gsdRoot(basePath), "runtime"), { recursive: true });
33
+ appendFileSync(parityLogPath(basePath), `${JSON.stringify(event)}\n`, "utf-8");
34
+ } catch {
35
+ // parity telemetry must never block orchestration
36
+ }
37
+ }
38
+
39
+ function resolveKernelPathLabel(flags: ReturnType<typeof resolveUokFlags>): "uok-wrapper" | "legacy-wrapper" | "legacy-fallback" {
40
+ if (flags.legacyFallback) return "legacy-fallback";
41
+ return flags.enabled ? "uok-wrapper" : "legacy-wrapper";
42
+ }
43
+
44
+ export async function runAutoLoopWithUok(args: RunAutoLoopWithUokArgs): Promise<void> {
45
+ const { ctx, pi, s, deps, runLegacyLoop } = args;
46
+ const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
47
+ const flags = resolveUokFlags(prefs);
48
+ setUnifiedAuditEnabled(flags.auditUnified);
49
+
50
+ writeParityEvent(s.basePath, {
51
+ ts: new Date().toISOString(),
52
+ path: resolveKernelPathLabel(flags),
53
+ flags,
54
+ phase: "enter",
55
+ });
56
+
57
+ if (flags.auditUnified) {
58
+ emitUokAuditEvent(
59
+ s.basePath,
60
+ buildAuditEnvelope({
61
+ traceId: `session:${String(s.autoStartTime || Date.now())}`,
62
+ category: "orchestration",
63
+ type: "uok-kernel-enter",
64
+ payload: {
65
+ flags,
66
+ sessionId: ctx.sessionManager?.getSessionId?.(),
67
+ },
68
+ }),
69
+ );
70
+ }
71
+
72
+ const decoratedDeps: LoopDeps = flags.enabled
73
+ ? {
74
+ ...deps,
75
+ uokObserver: createTurnObserver({
76
+ basePath: s.basePath,
77
+ gitAction: flags.gitopsTurnAction,
78
+ gitPush: flags.gitopsTurnPush,
79
+ enableAudit: flags.auditUnified,
80
+ enableGitops: flags.gitops,
81
+ }),
82
+ }
83
+ : deps;
84
+
85
+ try {
86
+ await runLegacyLoop(ctx, pi, s, decoratedDeps);
87
+ writeParityEvent(s.basePath, {
88
+ ts: new Date().toISOString(),
89
+ path: resolveKernelPathLabel(flags),
90
+ flags,
91
+ phase: "exit",
92
+ status: "ok",
93
+ });
94
+ } catch (err) {
95
+ writeParityEvent(s.basePath, {
96
+ ts: new Date().toISOString(),
97
+ path: resolveKernelPathLabel(flags),
98
+ flags,
99
+ phase: "exit",
100
+ status: "error",
101
+ error: err instanceof Error ? err.message : String(err),
102
+ });
103
+ throw err;
104
+ }
105
+ }
@@ -0,0 +1,162 @@
1
+ import type {
2
+ TurnCloseoutRecord,
3
+ TurnContract,
4
+ TurnResult,
5
+ UokTurnObserver,
6
+ } from "./contracts.js";
7
+ import { buildAuditEnvelope, emitUokAuditEvent } from "./audit.js";
8
+ import { writeTurnCloseoutGitRecord, writeTurnGitTransaction } from "./gitops.js";
9
+
10
+ export interface CreateTurnObserverOptions {
11
+ basePath: string;
12
+ gitAction: "commit" | "snapshot" | "status-only";
13
+ gitPush: boolean;
14
+ enableAudit: boolean;
15
+ enableGitops: boolean;
16
+ }
17
+
18
+ export function createTurnObserver(options: CreateTurnObserverOptions): UokTurnObserver {
19
+ let current: TurnContract | null = null;
20
+ const phaseResults: TurnResult["phaseResults"] = [];
21
+
22
+ return {
23
+ onTurnStart(contract): void {
24
+ current = contract;
25
+ phaseResults.length = 0;
26
+
27
+ if (options.enableGitops) {
28
+ writeTurnGitTransaction({
29
+ basePath: options.basePath,
30
+ traceId: contract.traceId,
31
+ turnId: contract.turnId,
32
+ unitType: contract.unitType,
33
+ unitId: contract.unitId,
34
+ stage: "turn-start",
35
+ action: options.gitAction,
36
+ push: options.gitPush,
37
+ status: "ok",
38
+ metadata: {
39
+ iteration: contract.iteration,
40
+ sidecarKind: contract.sidecarKind,
41
+ },
42
+ });
43
+ }
44
+
45
+ if (options.enableAudit) {
46
+ emitUokAuditEvent(
47
+ options.basePath,
48
+ buildAuditEnvelope({
49
+ traceId: contract.traceId,
50
+ turnId: contract.turnId,
51
+ category: "orchestration",
52
+ type: "turn-start",
53
+ payload: {
54
+ iteration: contract.iteration,
55
+ unitType: contract.unitType,
56
+ unitId: contract.unitId,
57
+ sidecarKind: contract.sidecarKind,
58
+ },
59
+ }),
60
+ );
61
+ }
62
+ },
63
+
64
+ onPhaseResult(phase, action, data): void {
65
+ phaseResults.push({
66
+ phase,
67
+ action,
68
+ ts: new Date().toISOString(),
69
+ data,
70
+ });
71
+
72
+ if (!current || !options.enableGitops) return;
73
+ if (phase === "dispatch") {
74
+ writeTurnGitTransaction({
75
+ basePath: options.basePath,
76
+ traceId: current.traceId,
77
+ turnId: current.turnId,
78
+ unitType: data?.unitType as string | undefined,
79
+ unitId: data?.unitId as string | undefined,
80
+ stage: "stage",
81
+ action: options.gitAction,
82
+ push: options.gitPush,
83
+ status: "ok",
84
+ metadata: { action },
85
+ });
86
+ }
87
+ if (phase === "unit") {
88
+ writeTurnGitTransaction({
89
+ basePath: options.basePath,
90
+ traceId: current.traceId,
91
+ turnId: current.turnId,
92
+ unitType: data?.unitType as string | undefined,
93
+ unitId: data?.unitId as string | undefined,
94
+ stage: "checkpoint",
95
+ action: options.gitAction,
96
+ push: options.gitPush,
97
+ status: "ok",
98
+ metadata: { action },
99
+ });
100
+ }
101
+ if (phase === "finalize") {
102
+ writeTurnGitTransaction({
103
+ basePath: options.basePath,
104
+ traceId: current.traceId,
105
+ turnId: current.turnId,
106
+ unitType: data?.unitType as string | undefined,
107
+ unitId: data?.unitId as string | undefined,
108
+ stage: "publish",
109
+ action: options.gitAction,
110
+ push: options.gitPush,
111
+ status: "ok",
112
+ metadata: { action },
113
+ });
114
+ }
115
+ },
116
+
117
+ onTurnResult(result): void {
118
+ const merged: TurnResult = {
119
+ ...result,
120
+ phaseResults: result.phaseResults.length > 0 ? result.phaseResults : [...phaseResults],
121
+ };
122
+
123
+ if (options.enableAudit) {
124
+ emitUokAuditEvent(
125
+ options.basePath,
126
+ buildAuditEnvelope({
127
+ traceId: merged.traceId,
128
+ turnId: merged.turnId,
129
+ category: "orchestration",
130
+ type: "turn-result",
131
+ payload: {
132
+ unitType: merged.unitType,
133
+ unitId: merged.unitId,
134
+ status: merged.status,
135
+ failureClass: merged.failureClass,
136
+ error: merged.error,
137
+ phaseCount: merged.phaseResults.length,
138
+ },
139
+ }),
140
+ );
141
+ }
142
+
143
+ if (options.enableGitops) {
144
+ const closeout: TurnCloseoutRecord = merged.closeout ?? {
145
+ traceId: merged.traceId,
146
+ turnId: merged.turnId,
147
+ unitType: merged.unitType,
148
+ unitId: merged.unitId,
149
+ status: merged.status,
150
+ failureClass: merged.failureClass,
151
+ gitAction: options.gitAction,
152
+ gitPushed: options.gitPush,
153
+ finishedAt: merged.finishedAt,
154
+ };
155
+ writeTurnCloseoutGitRecord(options.basePath, closeout);
156
+ }
157
+
158
+ current = null;
159
+ phaseResults.length = 0;
160
+ },
161
+ };
162
+ }
@@ -0,0 +1,112 @@
1
+ import type { TaskMetadata } from "../complexity-classifier.js";
2
+ import { computeTaskRequirements, filterToolsForProvider } from "../model-router.js";
3
+ import { buildAuditEnvelope, emitUokAuditEvent } from "./audit.js";
4
+
5
+ export interface ModelCandidate {
6
+ id: string;
7
+ provider: string;
8
+ api: string;
9
+ }
10
+
11
+ export interface ModelPolicyDecision {
12
+ modelId: string;
13
+ provider: string;
14
+ allowed: boolean;
15
+ reason: string;
16
+ }
17
+
18
+ export interface ModelPolicyOptions {
19
+ basePath: string;
20
+ traceId: string;
21
+ turnId?: string;
22
+ unitType?: string;
23
+ taskMetadata?: TaskMetadata;
24
+ currentProvider?: string;
25
+ allowCrossProvider?: boolean;
26
+ requiredTools?: string[];
27
+ deniedProviders?: string[];
28
+ allowedApis?: string[];
29
+ }
30
+
31
+ export function buildRequirementVector(unitType?: string, taskMetadata?: TaskMetadata): Partial<Record<string, number>> {
32
+ if (!unitType) return {};
33
+ return computeTaskRequirements(unitType, taskMetadata) as unknown as Partial<Record<string, number>>;
34
+ }
35
+
36
+ export function applyModelPolicyFilter<T extends ModelCandidate>(
37
+ candidates: T[],
38
+ options: ModelPolicyOptions,
39
+ ): {
40
+ eligible: T[];
41
+ decisions: ModelPolicyDecision[];
42
+ requirements: Partial<Record<string, number>>;
43
+ } {
44
+ const requiredTools = options.requiredTools ?? [];
45
+ const deniedProviders = new Set((options.deniedProviders ?? []).map((p) => p.toLowerCase()));
46
+ const allowedApis = options.allowedApis ? new Set(options.allowedApis) : null;
47
+ const requirements = buildRequirementVector(options.unitType, options.taskMetadata);
48
+ const decisions: ModelPolicyDecision[] = [];
49
+ const eligible: T[] = [];
50
+
51
+ for (const model of candidates) {
52
+ let allowed = true;
53
+ let reason = "allowed";
54
+
55
+ if (options.allowCrossProvider === false && options.currentProvider && model.provider !== options.currentProvider) {
56
+ allowed = false;
57
+ reason = `cross-provider routing disabled (${model.provider} != ${options.currentProvider})`;
58
+ }
59
+
60
+ if (allowed && deniedProviders.has(model.provider.toLowerCase())) {
61
+ allowed = false;
62
+ reason = `provider denied by policy: ${model.provider}`;
63
+ }
64
+
65
+ if (allowed && allowedApis && !allowedApis.has(model.api)) {
66
+ allowed = false;
67
+ reason = `transport/api denied by policy: ${model.api}`;
68
+ }
69
+
70
+ if (allowed && requiredTools.length > 0) {
71
+ const compatibility = filterToolsForProvider(requiredTools, model.api);
72
+ if (compatibility.filtered.length > 0) {
73
+ allowed = false;
74
+ reason = `tool policy denied (${compatibility.filtered.join(", ")}) for ${model.api}`;
75
+ }
76
+ }
77
+
78
+ const decision: ModelPolicyDecision = {
79
+ modelId: model.id,
80
+ provider: model.provider,
81
+ allowed,
82
+ reason,
83
+ };
84
+ decisions.push(decision);
85
+
86
+ emitUokAuditEvent(
87
+ options.basePath,
88
+ buildAuditEnvelope({
89
+ traceId: options.traceId,
90
+ turnId: options.turnId,
91
+ category: "model-policy",
92
+ type: allowed ? "model-policy-allow" : "model-policy-deny",
93
+ payload: {
94
+ modelId: model.id,
95
+ provider: model.provider,
96
+ api: model.api,
97
+ reason,
98
+ unitType: options.unitType,
99
+ requirements,
100
+ },
101
+ }),
102
+ );
103
+
104
+ if (allowed) eligible.push(model);
105
+ }
106
+
107
+ return {
108
+ eligible,
109
+ decisions,
110
+ requirements,
111
+ };
112
+ }
@@ -0,0 +1,156 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ import type { GSDState, Phase } from "../types.js";
5
+ import { gsdRoot, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
6
+ import { isDbAvailable, getMilestoneSlices, getSliceTasks, type SliceRow } from "../gsd-db.js";
7
+ import type { UokGraphNode } from "./contracts.js";
8
+
9
+ const PLAN_V2_CLARIFY_ROUND_LIMIT = 3;
10
+ const EXECUTION_ENTRY_PHASES: ReadonlySet<Phase> = new Set([
11
+ "executing",
12
+ "summarizing",
13
+ "validating-milestone",
14
+ "completing-milestone",
15
+ ]);
16
+
17
+ export interface PlanV2CompileResult {
18
+ ok: boolean;
19
+ reason?: string;
20
+ graphPath?: string;
21
+ nodeCount?: number;
22
+ clarifyRoundLimit?: number;
23
+ researchSynthesized?: boolean;
24
+ draftContextIncluded?: boolean;
25
+ finalizedContextIncluded?: boolean;
26
+ }
27
+
28
+ function graphOutputPath(basePath: string): string {
29
+ return join(gsdRoot(basePath), "runtime", "uok-plan-v2-graph.json");
30
+ }
31
+
32
+ function hasFileContent(path: string | null): boolean {
33
+ if (!path || !existsSync(path)) return false;
34
+ try {
35
+ return readFileSync(path, "utf-8").trim().length > 0;
36
+ } catch {
37
+ return false;
38
+ }
39
+ }
40
+
41
+ function countSliceResearchArtifacts(basePath: string, milestoneId: string, slices: SliceRow[]): number {
42
+ let count = 0;
43
+ for (const slice of slices) {
44
+ if (hasFileContent(resolveSliceFile(basePath, milestoneId, slice.id, "RESEARCH"))) {
45
+ count += 1;
46
+ }
47
+ }
48
+ return count;
49
+ }
50
+
51
+ function isExecutionEntryPhase(phase: Phase): boolean {
52
+ return EXECUTION_ENTRY_PHASES.has(phase);
53
+ }
54
+
55
+ export function compileUnitGraphFromState(basePath: string, state: GSDState): PlanV2CompileResult {
56
+ const mid = state.activeMilestone?.id;
57
+ if (!mid) return { ok: false, reason: "no active milestone" };
58
+ if (!isDbAvailable()) return { ok: false, reason: "database not available" };
59
+
60
+ const slices = getMilestoneSlices(mid).sort((a, b) => Number(a.sequence ?? 0) - Number(b.sequence ?? 0));
61
+ const nodes: UokGraphNode[] = [];
62
+ const clarifyRoundLimit = PLAN_V2_CLARIFY_ROUND_LIMIT;
63
+ const draftContextIncluded = hasFileContent(resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT"));
64
+ const finalizedContextIncluded = hasFileContent(resolveMilestoneFile(basePath, mid, "CONTEXT"));
65
+ const researchSynthesized = hasFileContent(resolveMilestoneFile(basePath, mid, "RESEARCH"))
66
+ || countSliceResearchArtifacts(basePath, mid, slices) > 0;
67
+
68
+ if (isExecutionEntryPhase(state.phase) && !finalizedContextIncluded) {
69
+ const reason = draftContextIncluded
70
+ ? "milestone context draft exists but finalized CONTEXT.md is missing"
71
+ : "missing milestone CONTEXT.md";
72
+ return {
73
+ ok: false,
74
+ reason,
75
+ clarifyRoundLimit,
76
+ researchSynthesized,
77
+ draftContextIncluded,
78
+ finalizedContextIncluded,
79
+ };
80
+ }
81
+
82
+ for (const slice of slices) {
83
+ const sid = slice.id;
84
+ const tasks = getSliceTasks(mid, sid)
85
+ .sort((a, b) => Number(a.sequence ?? 0) - Number(b.sequence ?? 0));
86
+
87
+ let previousTaskNodeId: string | null = null;
88
+ for (const task of tasks) {
89
+ const nodeId = `execute-task:${mid}:${sid}:${task.id}`;
90
+ const dependsOn = previousTaskNodeId ? [previousTaskNodeId] : [];
91
+ nodes.push({
92
+ id: nodeId,
93
+ kind: "unit",
94
+ dependsOn,
95
+ writes: task.key_files,
96
+ metadata: {
97
+ unitType: "execute-task",
98
+ unitId: `${mid}.${sid}.${task.id}`,
99
+ title: task.title,
100
+ status: task.status,
101
+ },
102
+ });
103
+ previousTaskNodeId = nodeId;
104
+ }
105
+
106
+ if (previousTaskNodeId) {
107
+ nodes.push({
108
+ id: `complete-slice:${mid}:${sid}`,
109
+ kind: "verification",
110
+ dependsOn: [previousTaskNodeId],
111
+ metadata: {
112
+ unitType: "complete-slice",
113
+ unitId: `${mid}.${sid}`,
114
+ title: slice.title,
115
+ status: slice.status,
116
+ },
117
+ });
118
+ }
119
+ }
120
+
121
+ const output = {
122
+ compiledAt: new Date().toISOString(),
123
+ milestoneId: mid,
124
+ pipeline: {
125
+ clarifyRoundLimit,
126
+ researchSynthesized,
127
+ draftContextIncluded,
128
+ finalizedContextIncluded,
129
+ sourcePhase: state.phase,
130
+ },
131
+ nodes,
132
+ };
133
+
134
+ const outPath = graphOutputPath(basePath);
135
+ mkdirSync(join(gsdRoot(basePath), "runtime"), { recursive: true });
136
+ writeFileSync(outPath, JSON.stringify(output, null, 2) + "\n", "utf-8");
137
+
138
+ return {
139
+ ok: true,
140
+ graphPath: outPath,
141
+ nodeCount: nodes.length,
142
+ clarifyRoundLimit,
143
+ researchSynthesized: output.pipeline.researchSynthesized,
144
+ draftContextIncluded: output.pipeline.draftContextIncluded,
145
+ finalizedContextIncluded: output.pipeline.finalizedContextIncluded,
146
+ };
147
+ }
148
+
149
+ export function ensurePlanV2Graph(basePath: string, state: GSDState): PlanV2CompileResult {
150
+ const compiled = compileUnitGraphFromState(basePath, state);
151
+ if (!compiled.ok) return compiled;
152
+ if ((compiled.nodeCount ?? 0) <= 0) {
153
+ return { ok: false, reason: "compiled graph is empty" };
154
+ }
155
+ return compiled;
156
+ }
@@ -20,6 +20,8 @@ import { appendFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
20
20
  import { join } from "node:path";
21
21
 
22
22
  import { appendNotification } from "./notification-store.js";
23
+ import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
24
+ import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
23
25
 
24
26
  // ─── Types ──────────────────────────────────────────────────────────────
25
27
 
@@ -51,7 +53,8 @@ export type LogComponent =
51
53
  | "guided" // Guided flow (discuss, plan wizards)
52
54
  | "registry" // Rule registry hook state
53
55
  | "renderer" // Markdown renderer and projections
54
- | "safety"; // LLM safety harness
56
+ | "safety" // LLM safety harness
57
+ | "ecosystem"; // GSD ecosystem extension loader and dispatch
55
58
 
56
59
  export interface LogEntry {
57
60
  ts: string;
@@ -275,6 +278,29 @@ function _push(
275
278
  _buffer.shift();
276
279
  }
277
280
 
281
+ if (_auditBasePath && isUnifiedAuditEnabled()) {
282
+ try {
283
+ emitUokAuditEvent(
284
+ _auditBasePath,
285
+ buildAuditEnvelope({
286
+ traceId: `workflow-log:${component}`,
287
+ turnId: context?.id,
288
+ causedBy: context?.fn ?? context?.tool,
289
+ category: "orchestration",
290
+ type: severity === "error" ? "workflow-log-error" : "workflow-log-warn",
291
+ payload: {
292
+ component,
293
+ message,
294
+ context: context ?? {},
295
+ },
296
+ }),
297
+ );
298
+ } catch (auditEmitErr) {
299
+ // Best-effort: unified audit projection must never block workflow logger.
300
+ _writeStderr(`[gsd:workflow-logger] unified-audit emit failed: ${(auditEmitErr as Error).message}\n`);
301
+ }
302
+ }
303
+
278
304
  // Persist errors to .gsd/audit-log.jsonl so they survive context resets.
279
305
  // Only error-severity entries are persisted — warnings are ephemeral (stderr + buffer)
280
306
  // to avoid log amplification from expected-control-flow catch paths.