okengine 0.2.6 → 0.2.8

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 (584) hide show
  1. package/AGENTS.md +24 -23
  2. package/README.md +52 -346
  3. package/docs/spec/console.md +165 -142
  4. package/docs/spec/example.md +490 -312
  5. package/docs/spec/four-applications.md +495 -314
  6. package/docs/spec/unified-theory.md +184 -175
  7. package/package.json +45 -37
  8. package/spec/manifest.v1.schema.json +40 -9
  9. package/src/auth/api-keys.ts +2 -5
  10. package/src/auth/attenuation.ts +2 -6
  11. package/src/auth/auth.test.ts +53 -31
  12. package/src/auth/invoke-as.ts +1 -3
  13. package/src/auth/operator.ts +8 -26
  14. package/src/auth/planes.ts +2 -7
  15. package/src/auth/plugin.ts +4 -7
  16. package/src/auth/roles.ts +1 -5
  17. package/src/auth/sessions.ts +10 -39
  18. package/src/cli/args.ts +1 -5
  19. package/src/cli/ask-dev-mode.ts +40 -0
  20. package/src/cli/build.ts +1 -2
  21. package/src/cli/client-add.test.ts +8 -15
  22. package/src/cli/client-add.ts +5 -14
  23. package/src/cli/completion.test.ts +1 -5
  24. package/src/cli/completion.ts +4 -17
  25. package/src/cli/db-auto-push.test.ts +64 -0
  26. package/src/cli/db-auto-push.ts +72 -0
  27. package/src/cli/db.test.ts +189 -0
  28. package/src/cli/db.ts +386 -0
  29. package/src/cli/dev-app-runner.ts +2 -8
  30. package/src/cli/dev-db-push.test.ts +163 -0
  31. package/src/cli/dev-mode.test.ts +45 -0
  32. package/src/cli/dev-mode.ts +78 -0
  33. package/src/cli/dev.test.ts +148 -21
  34. package/src/cli/dev.ts +208 -134
  35. package/src/cli/doc-drift.test.ts +3 -2
  36. package/src/cli/doc-drift.ts +21 -50
  37. package/src/cli/doc-staleness.test.ts +69 -0
  38. package/src/cli/docker-cli.test.ts +7 -8
  39. package/src/cli/docker.ts +1 -3
  40. package/src/cli/doctor-diff-examples.ts +1 -3
  41. package/src/cli/doctor-diff.test.ts +1 -5
  42. package/src/cli/doctor-diff.ts +17 -46
  43. package/src/cli/doctor-pii.ts +2 -7
  44. package/src/cli/doctor.test.ts +26 -4
  45. package/src/cli/doctor.ts +35 -11
  46. package/src/cli/eval.ts +4 -14
  47. package/src/cli/gates-list.ts +1 -4
  48. package/src/cli/hero-meta.test.ts +17 -19
  49. package/src/cli/hero-meta.ts +20 -30
  50. package/src/cli/images.ts +3 -8
  51. package/src/cli/index.ts +11 -2
  52. package/src/cli/load-config.images.test.ts +14 -14
  53. package/src/cli/load-config.ts +41 -47
  54. package/src/cli/mcp-from-console.ts +1 -4
  55. package/src/cli/mode.ts +45 -0
  56. package/src/cli/ports.test.ts +4 -13
  57. package/src/cli/ports.ts +1 -3
  58. package/src/cli/privacy-erase.ts +1 -3
  59. package/src/cli/registry.ts +75 -25
  60. package/src/cli/schema.ts +3 -10
  61. package/src/cli/stack.ts +2 -7
  62. package/src/cli/start.ts +4 -15
  63. package/src/cli/upgrade.ts +1 -4
  64. package/src/client/budget-entry.ts +1 -6
  65. package/src/client/create.test.ts +6 -12
  66. package/src/client/create.ts +2 -8
  67. package/src/client/errors.ts +1 -4
  68. package/src/client/index.ts +1 -6
  69. package/src/client/notes-contract.test.ts +4 -13
  70. package/src/client/transport.ts +9 -30
  71. package/src/client/types.ts +8 -29
  72. package/src/compiler/aot.test.ts +2 -9
  73. package/src/compiler/aot.ts +1 -4
  74. package/src/compiler/differential.test.ts +3 -11
  75. package/src/compiler/dynamic.ts +1 -4
  76. package/src/compiler/effects-infer.ts +8 -34
  77. package/src/compiler/emit.ts +1 -3
  78. package/src/compiler/extract.test.ts +96 -30
  79. package/src/compiler/extract.ts +362 -156
  80. package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
  81. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  82. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  83. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  84. package/src/compiler/fixtures/skyport.expected.json +24 -83
  85. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  86. package/src/compiler/http-parse.ts +2 -9
  87. package/src/compiler/index.ts +1 -5
  88. package/src/compiler/response.ts +4 -7
  89. package/src/compiler/sucrose.ts +11 -31
  90. package/src/config/define-config.test.ts +57 -34
  91. package/src/config/index.ts +181 -37
  92. package/src/config/resolve-driver.test.ts +28 -17
  93. package/src/console/budget.test.ts +1 -4
  94. package/src/console/index.ts +1 -4
  95. package/src/console/server/access.test.ts +15 -43
  96. package/src/console/server/access.ts +19 -49
  97. package/src/console/server/ai.test.ts +3 -11
  98. package/src/console/server/ai.ts +23 -46
  99. package/src/console/server/app.ts +14 -45
  100. package/src/console/server/auth-rate.test.ts +4 -12
  101. package/src/console/server/bind.ts +1 -5
  102. package/src/console/server/channels.test.ts +2 -6
  103. package/src/console/server/channels.ts +10 -35
  104. package/src/console/server/claim.ts +2 -8
  105. package/src/console/server/clock.test.ts +2 -6
  106. package/src/console/server/clock.ts +8 -26
  107. package/src/console/server/console.test.ts +1 -3
  108. package/src/console/server/diff.test.ts +5 -17
  109. package/src/console/server/diff.ts +10 -31
  110. package/src/console/server/dry-run.audit.test.ts +2 -8
  111. package/src/console/server/flows.ts +64 -233
  112. package/src/console/server/gates.test.ts +14 -50
  113. package/src/console/server/gates.ts +13 -48
  114. package/src/console/server/index.ts +2 -9
  115. package/src/console/server/live.ts +3 -12
  116. package/src/console/server/operator-db.test.ts +4 -15
  117. package/src/console/server/operator-db.ts +13 -32
  118. package/src/console/server/plugin.ts +50 -53
  119. package/src/console/server/plugins.test.ts +2 -6
  120. package/src/console/server/plugins.ts +17 -56
  121. package/src/console/server/runs-pii.ts +2 -7
  122. package/src/console/server/security.gate.test.ts +18 -40
  123. package/src/console/server/serve.ts +10 -25
  124. package/src/console/server/signals.test.ts +1 -3
  125. package/src/console/server/signals.ts +17 -40
  126. package/src/console/server/state.ts +21 -59
  127. package/src/console/server/store.test.ts +20 -22
  128. package/src/console/server/store.ts +31 -76
  129. package/src/console/server/vault.test.ts +12 -29
  130. package/src/console/server/vault.ts +23 -60
  131. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  132. package/src/console/ui/access/a11y.test.tsx +3 -12
  133. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  134. package/src/console/ui/access/acknowledgement.ts +1 -3
  135. package/src/console/ui/access/blast-radius.ts +1 -3
  136. package/src/console/ui/access/confirmation.test.ts +1 -5
  137. package/src/console/ui/access/confirmation.ts +1 -4
  138. package/src/console/ui/access/fixture.ts +1 -5
  139. package/src/console/ui/access/grantable.test.ts +1 -3
  140. package/src/console/ui/access/grantable.ts +2 -7
  141. package/src/console/ui/access/index.ts +2 -9
  142. package/src/console/ui/access/provenance.test.ts +1 -3
  143. package/src/console/ui/access/provenance.ts +2 -6
  144. package/src/console/ui/access/search.test.ts +1 -5
  145. package/src/console/ui/access/search.ts +2 -6
  146. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  147. package/src/console/ui/ai/a11y.test.tsx +2 -5
  148. package/src/console/ui/ai/fixture.ts +2 -7
  149. package/src/console/ui/ai/format.ts +1 -3
  150. package/src/console/ui/ai/group.test.ts +1 -3
  151. package/src/console/ui/ai/group.ts +4 -12
  152. package/src/console/ui/ai/index.ts +2 -9
  153. package/src/console/ui/ai/promotion.test.ts +2 -7
  154. package/src/console/ui/ai/promotion.ts +4 -13
  155. package/src/console/ui/ai/search.test.ts +2 -11
  156. package/src/console/ui/ai/search.ts +3 -13
  157. package/src/console/ui/ai/types.ts +1 -8
  158. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  159. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  160. package/src/console/ui/architecture/declared.ts +1 -5
  161. package/src/console/ui/architecture/index.ts +7 -35
  162. package/src/console/ui/architecture/layout.ts +1 -3
  163. package/src/console/ui/architecture/pathologies.ts +10 -19
  164. package/src/console/ui/architecture/search.ts +6 -15
  165. package/src/console/ui/architecture/traffic.ts +4 -14
  166. package/src/console/ui/architecture/types.ts +2 -10
  167. package/src/console/ui/architecture/view.test.ts +7 -19
  168. package/src/console/ui/architecture/view.ts +9 -36
  169. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  170. package/src/console/ui/channels/a11y.test.tsx +1 -2
  171. package/src/console/ui/channels/confirmation.test.ts +1 -4
  172. package/src/console/ui/channels/confirmation.ts +1 -4
  173. package/src/console/ui/channels/findings.ts +1 -5
  174. package/src/console/ui/channels/index.ts +2 -8
  175. package/src/console/ui/channels/locale.test.ts +1 -3
  176. package/src/console/ui/channels/locale.ts +2 -8
  177. package/src/console/ui/channels/search.ts +4 -13
  178. package/src/console/ui/channels/taxonomy.ts +1 -3
  179. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  180. package/src/console/ui/clock/a11y.test.tsx +2 -5
  181. package/src/console/ui/clock/confirmation.test.ts +1 -3
  182. package/src/console/ui/clock/confirmation.ts +1 -4
  183. package/src/console/ui/clock/findings.ts +1 -4
  184. package/src/console/ui/clock/health.ts +2 -7
  185. package/src/console/ui/clock/index.ts +2 -10
  186. package/src/console/ui/clock/search.test.ts +1 -3
  187. package/src/console/ui/clock/search.ts +2 -6
  188. package/src/console/ui/clock/timeline.test.ts +1 -3
  189. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  190. package/src/console/ui/clock/waiting-on.ts +2 -7
  191. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  192. package/src/console/ui/diff/a11y.test.tsx +2 -5
  193. package/src/console/ui/diff/group.test.ts +3 -13
  194. package/src/console/ui/diff/group.ts +2 -8
  195. package/src/console/ui/diff/index.ts +2 -8
  196. package/src/console/ui/diff/search.test.ts +1 -5
  197. package/src/console/ui/diff/search.ts +4 -16
  198. package/src/console/ui/diff/summary.ts +1 -2
  199. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  200. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  201. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  202. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  203. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  204. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  205. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  206. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  207. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  208. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  209. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  210. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  211. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  212. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  213. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  214. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  215. package/src/console/ui/dist/index.html +1 -1
  216. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  217. package/src/console/ui/flows/a11y.test.tsx +2 -8
  218. package/src/console/ui/flows/buffer.test.ts +3 -11
  219. package/src/console/ui/flows/buffer.ts +4 -11
  220. package/src/console/ui/flows/confirmation.ts +1 -3
  221. package/src/console/ui/flows/contract.test.ts +3 -7
  222. package/src/console/ui/flows/contract.ts +12 -36
  223. package/src/console/ui/flows/graph.test.ts +3 -11
  224. package/src/console/ui/flows/graph.ts +5 -15
  225. package/src/console/ui/flows/index.ts +1 -6
  226. package/src/console/ui/flows/save-as-test.ts +1 -3
  227. package/src/console/ui/flows/search.ts +8 -25
  228. package/src/console/ui/flows/tiers.ts +2 -9
  229. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  230. package/src/console/ui/gates/a11y.test.tsx +2 -5
  231. package/src/console/ui/gates/audit.ts +1 -3
  232. package/src/console/ui/gates/denial.test.ts +1 -3
  233. package/src/console/ui/gates/denial.ts +4 -12
  234. package/src/console/ui/gates/findings.ts +1 -3
  235. package/src/console/ui/gates/group.test.ts +3 -3
  236. package/src/console/ui/gates/group.ts +3 -11
  237. package/src/console/ui/gates/index.ts +2 -10
  238. package/src/console/ui/gates/search.ts +3 -10
  239. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  240. package/src/console/ui/overview/a11y.test.tsx +1 -2
  241. package/src/console/ui/overview/busiest.ts +1 -3
  242. package/src/console/ui/overview/compose.ts +1 -13
  243. package/src/console/ui/overview/cost.ts +34 -38
  244. package/src/console/ui/overview/fixture.ts +21 -26
  245. package/src/console/ui/overview/golden.ts +4 -14
  246. package/src/console/ui/overview/index.ts +2 -9
  247. package/src/console/ui/overview/rank.test.ts +3 -10
  248. package/src/console/ui/overview/rank.ts +2 -7
  249. package/src/console/ui/overview/slo.test.ts +5 -9
  250. package/src/console/ui/overview/slo.ts +6 -23
  251. package/src/console/ui/overview/verdict.ts +3 -10
  252. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  253. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  254. package/src/console/ui/plugins/fixture.ts +2 -4
  255. package/src/console/ui/plugins/group.test.ts +1 -3
  256. package/src/console/ui/plugins/group.ts +1 -6
  257. package/src/console/ui/plugins/index.ts +3 -13
  258. package/src/console/ui/plugins/search.ts +7 -19
  259. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  260. package/src/console/ui/runs/a11y.test.tsx +2 -5
  261. package/src/console/ui/runs/explain.ts +2 -6
  262. package/src/console/ui/runs/group.ts +3 -12
  263. package/src/console/ui/runs/histogram.test.ts +2 -11
  264. package/src/console/ui/runs/histogram.ts +1 -4
  265. package/src/console/ui/runs/index.ts +4 -18
  266. package/src/console/ui/runs/project.ts +2 -6
  267. package/src/console/ui/runs/query.test.ts +1 -3
  268. package/src/console/ui/runs/query.ts +12 -35
  269. package/src/console/ui/runs/search.ts +5 -19
  270. package/src/console/ui/runs/trace-link.test.ts +2 -6
  271. package/src/console/ui/runs/trace-link.ts +4 -16
  272. package/src/console/ui/runs/types.ts +1 -3
  273. package/src/console/ui/shell/App.tsx +2 -10
  274. package/src/console/ui/shell/client.ts +22 -115
  275. package/src/console/ui/shell/components/ui.tsx +1 -4
  276. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  277. package/src/console/ui/shell/main.tsx +31 -96
  278. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  279. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  280. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  281. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  282. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  283. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  284. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  285. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  286. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  287. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  288. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  289. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  290. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  291. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  292. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  293. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  294. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  295. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  296. package/src/console/ui/shell/styles.css +1 -2
  297. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  298. package/src/console/ui/signals/a11y.test.tsx +2 -5
  299. package/src/console/ui/signals/confirmation.test.ts +1 -5
  300. package/src/console/ui/signals/confirmation.ts +2 -6
  301. package/src/console/ui/signals/dry-run.ts +1 -3
  302. package/src/console/ui/signals/durable.ts +1 -3
  303. package/src/console/ui/signals/findings.ts +1 -3
  304. package/src/console/ui/signals/group.test.ts +2 -8
  305. package/src/console/ui/signals/group.ts +2 -10
  306. package/src/console/ui/signals/index.ts +1 -4
  307. package/src/console/ui/signals/monitor.ts +2 -7
  308. package/src/console/ui/signals/schema-form.test.ts +3 -14
  309. package/src/console/ui/signals/schema-form.ts +1 -4
  310. package/src/console/ui/signals/search.ts +4 -13
  311. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  312. package/src/console/ui/store/a11y.test.tsx +2 -5
  313. package/src/console/ui/store/confirmation.test.ts +1 -3
  314. package/src/console/ui/store/confirmation.ts +1 -4
  315. package/src/console/ui/store/dry-run.ts +2 -5
  316. package/src/console/ui/store/fixture.ts +1 -2
  317. package/src/console/ui/store/group.test.ts +1 -6
  318. package/src/console/ui/store/group.ts +1 -4
  319. package/src/console/ui/store/index.ts +1 -5
  320. package/src/console/ui/store/search.ts +2 -6
  321. package/src/console/ui/store/will-not-fire.ts +1 -2
  322. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  323. package/src/console/ui/traces/a11y.test.tsx +1 -2
  324. package/src/console/ui/traces/chain.test.ts +5 -19
  325. package/src/console/ui/traces/chain.ts +1 -3
  326. package/src/console/ui/traces/critical-path.test.ts +1 -3
  327. package/src/console/ui/traces/critical-path.ts +2 -6
  328. package/src/console/ui/traces/filter.test.ts +2 -6
  329. package/src/console/ui/traces/filter.ts +5 -13
  330. package/src/console/ui/traces/fold.test.ts +4 -12
  331. package/src/console/ui/traces/fold.ts +1 -3
  332. package/src/console/ui/traces/mini.ts +1 -3
  333. package/src/console/ui/traces/replay.test.ts +1 -3
  334. package/src/console/ui/traces/replay.ts +1 -3
  335. package/src/console/ui/traces/sampling.ts +1 -4
  336. package/src/console/ui/traces/search.ts +4 -17
  337. package/src/console/ui/traces/tier.ts +1 -3
  338. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  339. package/src/console/ui/vault/a11y.test.tsx +1 -2
  340. package/src/console/ui/vault/blast-radius.ts +1 -3
  341. package/src/console/ui/vault/confirmation.test.ts +1 -5
  342. package/src/console/ui/vault/confirmation.ts +1 -4
  343. package/src/console/ui/vault/dormant.test.ts +1 -4
  344. package/src/console/ui/vault/export-safe.test.ts +1 -5
  345. package/src/console/ui/vault/export-safe.ts +1 -4
  346. package/src/console/ui/vault/fixture.ts +3 -3
  347. package/src/console/ui/vault/group.ts +1 -2
  348. package/src/console/ui/vault/index.ts +2 -10
  349. package/src/console/ui/vault/search.ts +2 -6
  350. package/src/console/ui/vault/types.ts +1 -1
  351. package/src/console/xss.gate.test.ts +1 -3
  352. package/src/docker/compose.ts +112 -20
  353. package/src/docker/derive.ts +5 -19
  354. package/src/docker/docker.test.ts +15 -15
  355. package/src/docker/dockerfile.integration.test.ts +12 -21
  356. package/src/docker/helpers.ts +5 -4
  357. package/src/docker/index.ts +4 -11
  358. package/src/docker/pin.ts +1 -9
  359. package/src/docker/recipes/index.ts +5 -6
  360. package/src/docker/recipes/mailpit.ts +22 -0
  361. package/src/docker/recipes/postgres.ts +17 -6
  362. package/src/docker/recipes/redis.ts +6 -1
  363. package/src/docker/recipes/rustfs.ts +33 -0
  364. package/src/docker/stack-id.test.ts +33 -0
  365. package/src/docker/stack-id.ts +25 -13
  366. package/src/docker/stack.integration.test.ts +6 -21
  367. package/src/docker/types.ts +13 -4
  368. package/src/drivers/ai-anthropic.ts +5 -14
  369. package/src/drivers/ai-mock.ts +2 -5
  370. package/src/drivers/ai-openai-compatible.ts +4 -10
  371. package/src/drivers/ai-providers.test.ts +6 -13
  372. package/src/drivers/bun-native-completeness.test.ts +6 -15
  373. package/src/drivers/channel-console.ts +6 -7
  374. package/src/drivers/channel-fcm.ts +20 -30
  375. package/src/drivers/channel-resend.ts +1 -3
  376. package/src/drivers/channel-smtp.ts +2 -6
  377. package/src/drivers/channel-types.ts +2 -12
  378. package/src/drivers/channel-unifonic.ts +2 -6
  379. package/src/drivers/channel-wa-cloud.ts +2 -6
  380. package/src/drivers/channel-webpush.ts +21 -60
  381. package/src/drivers/conformance.test.ts +2 -10
  382. package/src/drivers/conformance.ts +8 -21
  383. package/src/drivers/fs.ts +2 -8
  384. package/src/drivers/index.ts +12 -56
  385. package/src/drivers/memory.ts +14 -41
  386. package/src/drivers/pgvector.ts +7 -11
  387. package/src/drivers/postgres.ts +7 -13
  388. package/src/drivers/redis.ts +13 -37
  389. package/src/drivers/s3.ts +5 -17
  390. package/src/drivers/signal-engine.ts +12 -49
  391. package/src/drivers/signal-memory.ts +2 -8
  392. package/src/drivers/signal-nats.ts +4 -9
  393. package/src/drivers/signal-postgres.ts +62 -129
  394. package/src/drivers/signal-redis.ts +7 -21
  395. package/src/drivers/signal-types.ts +1 -4
  396. package/src/drivers/sqlite.ts +3 -12
  397. package/src/drivers/types.ts +4 -23
  398. package/src/drivers/vault-env.ts +2 -6
  399. package/src/drivers/vault-infisical.ts +1 -5
  400. package/src/drivers/vault-managed.ts +1 -5
  401. package/src/drivers/vault-memory.ts +1 -5
  402. package/src/drivers/vault-openbao.ts +1 -5
  403. package/src/drivers/vault-sops.ts +10 -35
  404. package/src/drivers/vault-types.ts +1 -7
  405. package/src/elements/ai/declare.ts +4 -14
  406. package/src/elements/ai/eval.ts +2 -6
  407. package/src/elements/ai/pii.ts +1 -3
  408. package/src/elements/ai/runtime.ts +12 -50
  409. package/src/elements/ai/schema.ts +4 -15
  410. package/src/elements/ai.test.ts +13 -24
  411. package/src/elements/ai.ts +1 -5
  412. package/src/elements/channel/consent.ts +3 -12
  413. package/src/elements/channel/costs.ts +4 -15
  414. package/src/elements/channel/declare.ts +1 -4
  415. package/src/elements/channel/email-auth.ts +1 -4
  416. package/src/elements/channel/locale.ts +2 -10
  417. package/src/elements/channel/mask.ts +1 -3
  418. package/src/elements/channel/mime.ts +2 -12
  419. package/src/elements/channel/outcomes.test.ts +1 -5
  420. package/src/elements/channel/outcomes.ts +5 -15
  421. package/src/elements/channel/receipts.ts +2 -7
  422. package/src/elements/channel/runtime.ts +28 -74
  423. package/src/elements/channel/suppression.ts +8 -14
  424. package/src/elements/channel.test.ts +8 -31
  425. package/src/elements/channel.ts +3 -14
  426. package/src/elements/clock/actions.ts +6 -18
  427. package/src/elements/clock/declare.ts +1 -3
  428. package/src/elements/clock/dst.ts +1 -5
  429. package/src/elements/clock/durable.ts +4 -16
  430. package/src/elements/clock/health.ts +2 -7
  431. package/src/elements/clock/leader.ts +2 -9
  432. package/src/elements/clock/reconcile.ts +4 -15
  433. package/src/elements/clock/runtime.ts +2 -5
  434. package/src/elements/clock/schedule.ts +4 -20
  435. package/src/elements/clock.test.ts +2 -7
  436. package/src/elements/clock.ts +5 -23
  437. package/src/elements/gate/permissions.ts +1 -4
  438. package/src/elements/gate/runtime.ts +7 -28
  439. package/src/elements/gate.ts +1 -5
  440. package/src/elements/index.ts +9 -7
  441. package/src/elements/signal/declare.ts +2 -7
  442. package/src/elements/signal/reconcile.test.ts +1 -4
  443. package/src/elements/signal/runtime.ts +1 -3
  444. package/src/elements/signal.test.ts +3 -15
  445. package/src/elements/signal.ts +2 -8
  446. package/src/elements/store/cache.test.ts +46 -0
  447. package/src/elements/store/cache.ts +3 -11
  448. package/src/elements/store/classify.ts +5 -22
  449. package/src/elements/store/declare.ts +8 -17
  450. package/src/elements/store/domain-ddl.test.ts +86 -0
  451. package/src/elements/store/emit-drizzle.ts +363 -0
  452. package/src/elements/store/files-policy.test.ts +1 -5
  453. package/src/elements/store/files-policy.ts +4 -12
  454. package/src/elements/store/load-plugin-tables.ts +103 -0
  455. package/src/elements/store/missing-relation.test.ts +83 -0
  456. package/src/elements/store/missing-relation.ts +38 -0
  457. package/src/elements/store/replica.ts +1 -4
  458. package/src/elements/store/runtime.ts +25 -28
  459. package/src/elements/store/schema-decl.test.ts +227 -0
  460. package/src/elements/store/schema-decl.ts +516 -0
  461. package/src/elements/store/sql-condition.ts +11 -21
  462. package/src/elements/store/sql-session.test.ts +50 -0
  463. package/src/elements/store/sql-session.ts +60 -63
  464. package/src/elements/store/table.ts +35 -19
  465. package/src/elements/store.test.ts +17 -39
  466. package/src/elements/store.ts +37 -31
  467. package/src/elements/vault/chain.ts +34 -0
  468. package/src/elements/vault/declare.ts +22 -32
  469. package/src/elements/vault/fingerprint.ts +2 -7
  470. package/src/elements/vault/redact.ts +2 -6
  471. package/src/elements/vault/runtime.ts +18 -32
  472. package/src/elements/vault.test.ts +12 -28
  473. package/src/elements/vault.ts +8 -12
  474. package/src/index.ts +5 -2
  475. package/src/kernel/adopt-routes.ts +15 -29
  476. package/src/kernel/app.ts +34 -94
  477. package/src/kernel/auth-resolve.ts +2 -9
  478. package/src/kernel/boot-bind/ai.ts +1 -4
  479. package/src/kernel/boot-bind/channel.ts +2 -8
  480. package/src/kernel/boot-bind/clock.ts +2 -6
  481. package/src/kernel/boot-bind/gate.ts +2 -8
  482. package/src/kernel/boot-bind/runs.ts +1 -3
  483. package/src/kernel/boot-bind/signal.ts +3 -10
  484. package/src/kernel/boot-bind/store.test.ts +17 -17
  485. package/src/kernel/boot-bind/store.ts +44 -50
  486. package/src/kernel/boot-bind/vault.ts +2 -8
  487. package/src/kernel/boot.test.ts +4 -9
  488. package/src/kernel/boot.ts +29 -76
  489. package/src/kernel/budget.test.ts +1 -3
  490. package/src/kernel/capability.ts +3 -10
  491. package/src/kernel/dry-run.test.ts +1 -4
  492. package/src/kernel/dry-run.ts +3 -11
  493. package/src/kernel/effects.test.ts +1 -5
  494. package/src/kernel/effects.ts +4 -11
  495. package/src/kernel/errors.registry.test.ts +2 -8
  496. package/src/kernel/errors.ts +23 -32
  497. package/src/kernel/flow.test.ts +12 -25
  498. package/src/kernel/flow.ts +5 -25
  499. package/src/kernel/fx.test.ts +15 -44
  500. package/src/kernel/fx.ts +27 -79
  501. package/src/kernel/hook-timing.test.ts +3 -6
  502. package/src/kernel/hook-timing.ts +5 -14
  503. package/src/kernel/hooks.test.ts +10 -10
  504. package/src/kernel/hooks.ts +3 -12
  505. package/src/kernel/index.ts +4 -17
  506. package/src/kernel/journal.ts +7 -31
  507. package/src/kernel/on.ts +1 -6
  508. package/src/kernel/pipeline.test.ts +10 -19
  509. package/src/kernel/pipeline.ts +5 -17
  510. package/src/kernel/plug.ts +4 -11
  511. package/src/kernel/plugin/conflicts.test.ts +13 -25
  512. package/src/kernel/plugin/decorate.test.ts +8 -13
  513. package/src/kernel/plugin/scoping.test.ts +4 -11
  514. package/src/kernel/plugin.ts +48 -24
  515. package/src/kernel/registry.ts +80 -29
  516. package/src/kernel/router.test.ts +15 -13
  517. package/src/kernel/router.ts +9 -29
  518. package/src/kernel/routing-budget.test.ts +1 -3
  519. package/src/kernel/run-telemetry.ts +1 -3
  520. package/src/kernel/triggers.ts +4 -21
  521. package/src/manifest/diff.test.ts +26 -91
  522. package/src/manifest/diff.ts +95 -225
  523. package/src/manifest/index.ts +2 -9
  524. package/src/manifest/types.ts +29 -5
  525. package/src/manifest/undeclared.test.ts +4 -12
  526. package/src/manifest/undeclared.ts +1 -2
  527. package/src/manifest/validate.test.ts +2 -6
  528. package/src/manifest/validate.ts +4 -14
  529. package/src/mcp/authorization.ts +8 -27
  530. package/src/mcp/confirmation.ts +3 -10
  531. package/src/mcp/data.ts +2 -6
  532. package/src/mcp/docs-index.ts +4 -7
  533. package/src/mcp/docs-mcp.test.ts +3 -12
  534. package/src/mcp/docs-server.ts +7 -27
  535. package/src/mcp/docs-tools.ts +2 -6
  536. package/src/mcp/index.ts +1 -6
  537. package/src/mcp/injection.gate.test.ts +4 -18
  538. package/src/mcp/mcp.test.ts +18 -49
  539. package/src/mcp/protocol.ts +3 -10
  540. package/src/mcp/server.ts +11 -52
  541. package/src/mcp/session.ts +4 -14
  542. package/src/mcp/tools.ts +14 -50
  543. package/src/plugins/catalogue.test.ts +3 -7
  544. package/src/plugins/catalogue.ts +1 -3
  545. package/src/plugins/node-import-scan.ts +2 -5
  546. package/src/plugins/supply-chain.ts +5 -17
  547. package/src/release/exports.ts +3 -8
  548. package/src/release/measure.exports.test.ts +1 -3
  549. package/src/release/measure.ts +15 -43
  550. package/src/runs/bench.test.ts +1 -3
  551. package/src/runs/collect.ts +8 -25
  552. package/src/runs/drivers/clickhouse.ts +2 -9
  553. package/src/runs/drivers/files.ts +9 -31
  554. package/src/runs/drivers/memory.ts +5 -22
  555. package/src/runs/drivers/postgres.ts +8 -20
  556. package/src/runs/duckdb.ts +2 -8
  557. package/src/runs/index.ts +3 -14
  558. package/src/runs/outlier.ts +3 -10
  559. package/src/runs/parquet.ts +8 -26
  560. package/src/runs/privacy.ts +2 -8
  561. package/src/runs/runs.test.ts +3 -9
  562. package/src/runs/runtime.ts +7 -32
  563. package/src/runs/shred.ts +10 -29
  564. package/src/runs/types.ts +1 -4
  565. package/src/runtime/bun.ts +4 -15
  566. package/src/runtime/cold-start.bench.ts +1 -3
  567. package/src/runtime/dev-request-log.test.ts +1 -4
  568. package/src/runtime/dev-request-log.ts +1 -4
  569. package/src/runtime/index.ts +1 -6
  570. package/src/runtime/primitives.ts +5 -4
  571. package/src/runtime/security.ts +3 -13
  572. package/src/runtime/serve.test.ts +4 -7
  573. package/src/runtime/types.ts +1 -4
  574. package/src/runtime/web-standard.ts +3 -15
  575. package/src/term.test.ts +4 -6
  576. package/src/term.ts +49 -98
  577. package/src/test/create-test-app.test.ts +4 -14
  578. package/src/test/create-test-app.ts +13 -31
  579. package/src/test/provisions.integration.test.ts +3 -11
  580. package/src/upgrade/codemods.test.ts +25 -6
  581. package/src/upgrade/codemods.ts +116 -3
  582. package/src/validation/standard-schema.test.ts +2 -5
  583. package/src/validation/standard-schema.ts +13 -33
  584. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
package/src/mcp/server.ts CHANGED
@@ -8,10 +8,7 @@
8
8
  * adapters receive structured operator ids.
9
9
  */
10
10
 
11
- import {
12
- logDevRequest,
13
- shouldLogDevRequests,
14
- } from "../runtime/dev-request-log.ts";
11
+ import { logDevRequest, shouldLogDevRequests } from "../runtime/dev-request-log.ts";
15
12
  import {
16
13
  checkRequestSecurity,
17
14
  forbiddenResponse,
@@ -30,11 +27,7 @@ import {
30
27
  type JsonRpcId,
31
28
  type McpInitializeResult,
32
29
  } from "./protocol.ts";
33
- import {
34
- authenticateMcpRequest,
35
- extractBearer,
36
- newMcpTransportSessionId,
37
- } from "./session.ts";
30
+ import { authenticateMcpRequest, extractBearer, newMcpTransportSessionId } from "./session.ts";
38
31
  import { createToolRuntime, type McpContext } from "./tools.ts";
39
32
 
40
33
  /** Options for {@link createMcpServer} / {@link serveMcp}. */
@@ -118,15 +111,9 @@ export function createMcpServer(options: CreateMcpServerOptions): McpServer {
118
111
 
119
112
  let requester;
120
113
  try {
121
- requester = await authenticateMcpRequest(
122
- options.sessions,
123
- options.secret,
124
- bearer,
125
- now,
126
- );
114
+ requester = await authenticateMcpRequest(options.sessions, options.secret, bearer, now);
127
115
  } catch (err) {
128
- const message =
129
- err instanceof SessionError ? err.message : "authentication failed";
116
+ const message = err instanceof SessionError ? err.message : "authentication failed";
130
117
  return respond(
131
118
  jsonRpcHttp(
132
119
  rpcError(
@@ -148,22 +135,12 @@ export function createMcpServer(options: CreateMcpServerOptions): McpServer {
148
135
  try {
149
136
  body = await request.json();
150
137
  } catch {
151
- return respond(
152
- jsonRpcHttp(
153
- rpcError(null, RpcErrorCode.parse, "invalid JSON body"),
154
- 400,
155
- ),
156
- );
138
+ return respond(jsonRpcHttp(rpcError(null, RpcErrorCode.parse, "invalid JSON body"), 400));
157
139
  }
158
140
 
159
141
  const parsed = parseJsonRpcRequest(body);
160
142
  if (!parsed.ok) {
161
- return respond(
162
- jsonRpcHttp(
163
- rpcError(null, RpcErrorCode.invalidRequest, parsed.message),
164
- 400,
165
- ),
166
- );
143
+ return respond(jsonRpcHttp(rpcError(null, RpcErrorCode.invalidRequest, parsed.message), 400));
167
144
  }
168
145
 
169
146
  const { request: rpc } = parsed;
@@ -207,19 +184,10 @@ export function createMcpServer(options: CreateMcpServerOptions): McpServer {
207
184
  case "tools/call": {
208
185
  const call = parseToolsCallParams(rpc.params);
209
186
  if (!call.ok) {
210
- return respond(
211
- jsonRpcHttp(
212
- rpcError(id, RpcErrorCode.invalidParams, call.message),
213
- 400,
214
- ),
215
- );
187
+ return respond(jsonRpcHttp(rpcError(id, RpcErrorCode.invalidParams, call.message), 400));
216
188
  }
217
189
  flowLabel = call.name;
218
- const result = await tools.callTool(
219
- requester,
220
- call.name,
221
- call.arguments,
222
- );
190
+ const result = await tools.callTool(requester, call.name, call.arguments);
223
191
  if (!result.ok) {
224
192
  const code =
225
193
  result.code === "unauthorized"
@@ -256,11 +224,7 @@ export function createMcpServer(options: CreateMcpServerOptions): McpServer {
256
224
  default:
257
225
  return respond(
258
226
  jsonRpcHttp(
259
- rpcError(
260
- id,
261
- RpcErrorCode.methodNotFound,
262
- `method not found: ${rpc.method}`,
263
- ),
227
+ rpcError(id, RpcErrorCode.methodNotFound, `method not found: ${rpc.method}`),
264
228
  404,
265
229
  ),
266
230
  );
@@ -285,9 +249,7 @@ export interface McpServerHandle extends ServerHandle {
285
249
  *
286
250
  * @param options - Server options
287
251
  */
288
- export async function serveMcp(
289
- options: ServeMcpOptions,
290
- ): Promise<McpServerHandle> {
252
+ export async function serveMcp(options: ServeMcpOptions): Promise<McpServerHandle> {
291
253
  const hostname = options.hostname ?? "127.0.0.1";
292
254
  const port = options.port ?? MCP_PORT;
293
255
  const mcp = createMcpServer({ ...options, hostname });
@@ -311,10 +273,7 @@ export async function serveMcp(
311
273
  };
312
274
  }
313
275
 
314
- function jsonRpcHttp(
315
- body: unknown,
316
- status = 200,
317
- ): Response {
276
+ function jsonRpcHttp(body: unknown, status = 200): Response {
318
277
  return new Response(JSON.stringify(body), {
319
278
  status,
320
279
  headers: {
@@ -21,10 +21,7 @@ import type { AuthPlane } from "../auth/planes.ts";
21
21
  export const MCP_AUDIENCE = "oke-mcp" as const;
22
22
 
23
23
  /** Other known audiences — rejected by MCP. */
24
- export const FOREIGN_AUDIENCES = [
25
- "oke-console",
26
- "oke-app",
27
- ] as const;
24
+ export const FOREIGN_AUDIENCES = ["oke-console", "oke-app"] as const;
28
25
 
29
26
  /** Verified MCP requester context for one request. */
30
27
  export interface McpRequester {
@@ -49,9 +46,7 @@ export interface MintMcpSessionOptions {
49
46
  *
50
47
  * @param options - Store, secret, principal
51
48
  */
52
- export async function mintMcpSession(
53
- options: MintMcpSessionOptions,
54
- ): Promise<IssuedSession> {
49
+ export async function mintMcpSession(options: MintMcpSessionOptions): Promise<IssuedSession> {
55
50
  return issueSessionWithScopes(
56
51
  options.store,
57
52
  {
@@ -99,13 +94,8 @@ export async function authenticateMcpRequest(
99
94
 
100
95
  // Defence in depth: reject known foreign audiences even if verifyAccess
101
96
  // somehow ran without the audience option (should be unreachable).
102
- if (
103
- claims.aud !== undefined &&
104
- (FOREIGN_AUDIENCES as readonly string[]).includes(claims.aud)
105
- ) {
106
- throw new SessionError(
107
- `access token audience mismatch: expected ${MCP_AUDIENCE}`,
108
- );
97
+ if (claims.aud !== undefined && (FOREIGN_AUDIENCES as readonly string[]).includes(claims.aud)) {
98
+ throw new SessionError(`access token audience mismatch: expected ${MCP_AUDIENCE}`);
109
99
  }
110
100
 
111
101
  return {
package/src/mcp/tools.ts CHANGED
@@ -7,11 +7,7 @@
7
7
 
8
8
  import type { Manifest } from "../manifest/types.ts";
9
9
  import type { WideEvent } from "../runs/types.ts";
10
- import {
11
- authorizeToolCall,
12
- MCP_TOOL_POLICIES,
13
- type McpToolPolicy,
14
- } from "./authorization.ts";
10
+ import { authorizeToolCall, MCP_TOOL_POLICIES, type McpToolPolicy } from "./authorization.ts";
15
11
  import {
16
12
  createConfirmationGate,
17
13
  MCP_CONFIRM_PHRASE,
@@ -89,14 +85,10 @@ export function createToolRuntime(
89
85
  const preflight = authorizeToolCall(name, args, requester.scopes, {
90
86
  confirmed: policy?.mutability !== "write",
91
87
  });
92
- if (
93
- !preflight.ok &&
94
- preflight.reason !== "confirmation-required"
95
- ) {
88
+ if (!preflight.ok && preflight.reason !== "confirmation-required") {
96
89
  return {
97
90
  ok: false,
98
- code:
99
- preflight.reason === "unknown-tool" ? "not-found" : "forbidden",
91
+ code: preflight.reason === "unknown-tool" ? "not-found" : "forbidden",
100
92
  message: preflight.detail ?? preflight.reason,
101
93
  data: asData(
102
94
  {
@@ -111,10 +103,8 @@ export function createToolRuntime(
111
103
 
112
104
  // Write path: consume a fresh per-call confirmation (no session cache).
113
105
  if (policy?.mutability === "write") {
114
- const token =
115
- typeof args.confirmToken === "string" ? args.confirmToken : "";
116
- const phrase =
117
- typeof args.confirmation === "string" ? args.confirmation : "";
106
+ const token = typeof args.confirmToken === "string" ? args.confirmToken : "";
107
+ const phrase = typeof args.confirmation === "string" ? args.confirmation : "";
118
108
  const reason = typeof args.reason === "string" ? args.reason : "";
119
109
  const boundArgs = stripConfirmFields(args);
120
110
  const consumed = confirm.consume({
@@ -145,10 +135,7 @@ export function createToolRuntime(
145
135
 
146
136
  switch (name) {
147
137
  case "oke.manifest.get":
148
- return okData(
149
- freezeData({ manifest: ctx.getManifest() }),
150
- "manifest",
151
- );
138
+ return okData(freezeData({ manifest: ctx.getManifest() }), "manifest");
152
139
  case "oke.schema.get":
153
140
  return schemaGet(ctx, args);
154
141
  case "oke.effects.get":
@@ -175,16 +162,11 @@ export function createToolRuntime(
175
162
  };
176
163
  }
177
164
 
178
- function okData<T>(
179
- content: T,
180
- provenance: Parameters<typeof asData>[1],
181
- ): ToolCallResult {
165
+ function okData<T>(content: T, provenance: Parameters<typeof asData>[1]): ToolCallResult {
182
166
  return { ok: true, data: asData(content, provenance) };
183
167
  }
184
168
 
185
- function stripConfirmFields(
186
- args: Record<string, unknown>,
187
- ): Record<string, unknown> {
169
+ function stripConfirmFields(args: Record<string, unknown>): Record<string, unknown> {
188
170
  const out: Record<string, unknown> = {};
189
171
  for (const [k, v] of Object.entries(args)) {
190
172
  if (k === "confirmation" || k === "confirmToken" || k === "reason") {
@@ -195,10 +177,7 @@ function stripConfirmFields(
195
177
  return out;
196
178
  }
197
179
 
198
- function schemaGet(
199
- ctx: McpContext,
200
- args: Record<string, unknown>,
201
- ): ToolCallResult {
180
+ function schemaGet(ctx: McpContext, args: Record<string, unknown>): ToolCallResult {
202
181
  const flowId = String(args.flowId ?? "");
203
182
  const manifest = ctx.getManifest();
204
183
  const flow = manifest?.flows?.[flowId];
@@ -221,10 +200,7 @@ function schemaGet(
221
200
  );
222
201
  }
223
202
 
224
- function effectsGet(
225
- ctx: McpContext,
226
- args: Record<string, unknown>,
227
- ): ToolCallResult {
203
+ function effectsGet(ctx: McpContext, args: Record<string, unknown>): ToolCallResult {
228
204
  const flowId = String(args.flowId ?? "");
229
205
  const manifest = ctx.getManifest();
230
206
  const flow = manifest?.flows?.[flowId];
@@ -236,34 +212,22 @@ function effectsGet(
236
212
  data: asData({ flowId }, "error"),
237
213
  };
238
214
  }
239
- return okData(
240
- freezeData({ flowId, effects: flow.effects ?? {} }),
241
- "effects",
242
- );
215
+ return okData(freezeData({ flowId, effects: flow.effects ?? {} }), "effects");
243
216
  }
244
217
 
245
- async function tracesList(
246
- ctx: McpContext,
247
- args: Record<string, unknown>,
248
- ): Promise<ToolCallResult> {
218
+ async function tracesList(ctx: McpContext, args: Record<string, unknown>): Promise<ToolCallResult> {
249
219
  const limit =
250
220
  typeof args.limit === "number" && Number.isFinite(args.limit)
251
221
  ? Math.min(200, Math.max(1, Math.floor(args.limit)))
252
222
  : 50;
253
- const flowId =
254
- typeof args.flowId === "string" && args.flowId.length > 0
255
- ? args.flowId
256
- : null;
223
+ const flowId = typeof args.flowId === "string" && args.flowId.length > 0 ? args.flowId : null;
257
224
  const all = await ctx.listRuns();
258
225
  const filtered = flowId ? all.filter((r) => r.flow === flowId) : all;
259
226
  const runs = filtered.slice(0, limit).map(projectRun);
260
227
  return okData(freezeData({ runs }), "trace");
261
228
  }
262
229
 
263
- async function tracesGet(
264
- ctx: McpContext,
265
- args: Record<string, unknown>,
266
- ): Promise<ToolCallResult> {
230
+ async function tracesGet(ctx: McpContext, args: Record<string, unknown>): Promise<ToolCallResult> {
267
231
  const runId = String(args.runId ?? "");
268
232
  const all = await ctx.listRuns();
269
233
  const run = all.find((r) => r.id === runId);
@@ -29,20 +29,16 @@ describe("CORE catalogue", () => {
29
29
  });
30
30
 
31
31
  test("tenancy from config or Manifest", () => {
32
- expect(isTenancyConfigured(null, { tenancy: { isolation: "row" } })).toBe(
32
+ expect(isTenancyConfigured(null, { tenancy: { isolation: "row" } })).toBe(true);
33
+ expect(isTenancyConfigured({ oke: "1.0", app: "x", tenancy: { isolation: "row" } }, null)).toBe(
33
34
  true,
34
35
  );
35
- expect(
36
- isTenancyConfigured({ oke: "1.0", app: "x", tenancy: { isolation: "row" } }, null),
37
- ).toBe(true);
38
36
  expect(isTenancyConfigured(null, null)).toBe(false);
39
37
  });
40
38
 
41
39
  test("privacy from privacy block or runs.redact", () => {
42
40
  expect(isPrivacyConfigured({ privacy: {} })).toBe(true);
43
- expect(isPrivacyConfigured({ runs: { redact: { email: "7y" } } })).toBe(
44
- true,
45
- );
41
+ expect(isPrivacyConfigured({ runs: { redact: { email: "7y" } } })).toBe(true);
46
42
  expect(isPrivacyConfigured({})).toBe(false);
47
43
  });
48
44
  });
@@ -104,9 +104,7 @@ export function isTenancyConfigured(
104
104
  *
105
105
  * @param config - Config probe
106
106
  */
107
- export function isPrivacyConfigured(
108
- config: PluginConfigProbe | null | undefined,
109
- ): boolean {
107
+ export function isPrivacyConfigured(config: PluginConfigProbe | null | undefined): boolean {
110
108
  if (config?.privacy != null) return true;
111
109
  if (config?.runs?.redact != null) return true;
112
110
  return false;
@@ -49,9 +49,7 @@ export function scanNodeImportsBypassingFx(
49
49
  out.push({
50
50
  source: file.path,
51
51
  specifier,
52
- line: typeof node.start === "number"
53
- ? lineAt(file.source, node.start)
54
- : null,
52
+ line: typeof node.start === "number" ? lineAt(file.source, node.start) : null,
55
53
  });
56
54
  });
57
55
  }
@@ -77,8 +75,7 @@ function importSpecifier(node: AstNode): string | null {
77
75
  };
78
76
  const callee = call.callee;
79
77
  const isRequire =
80
- callee?.type === "Identifier" &&
81
- (callee as { name?: string }).name === "require";
78
+ callee?.type === "Identifier" && (callee as { name?: string }).name === "require";
82
79
  if (!isRequire) return null;
83
80
  const arg0 = call.arguments?.[0];
84
81
  if (arg0 && (arg0.type === "Literal" || arg0.type === "StringLiteral")) {
@@ -248,9 +248,7 @@ export function projectSupplyChainSync(
248
248
  };
249
249
  }
250
250
 
251
- function projectLifecycle(
252
- pkg: PackageJsonProbe | null,
253
- ): LifecycleScriptsSignal {
251
+ function projectLifecycle(pkg: PackageJsonProbe | null): LifecycleScriptsSignal {
254
252
  if (!pkg) {
255
253
  return {
256
254
  state: "unknown",
@@ -335,9 +333,7 @@ function projectNodeScan(
335
333
  };
336
334
  }
337
335
 
338
- async function projectProvenance(
339
- options: ProjectSupplyChainOptions,
340
- ): Promise<NpmProvenanceSignal> {
336
+ async function projectProvenance(options: ProjectSupplyChainOptions): Promise<NpmProvenanceSignal> {
341
337
  if (options.provenance === "attested") {
342
338
  return { state: "pass", detail: "npm provenance attestation present" };
343
339
  }
@@ -385,10 +381,7 @@ function projectBootConflicts(
385
381
  };
386
382
  }
387
383
 
388
- async function readPackageJson(
389
- cwd: string,
390
- packageName: string,
391
- ): Promise<PackageJsonProbe | null> {
384
+ async function readPackageJson(cwd: string, packageName: string): Promise<PackageJsonProbe | null> {
392
385
  const path = resolve(cwd, "node_modules", ...packageName.split("/"), "package.json");
393
386
  try {
394
387
  const file = Bun.file(path);
@@ -422,9 +415,7 @@ async function fetchPublishedAt(
422
415
  }
423
416
  }
424
417
 
425
- async function fetchNpmProvenance(
426
- packageName: string,
427
- ): Promise<NpmProvenanceSignal> {
418
+ async function fetchNpmProvenance(packageName: string): Promise<NpmProvenanceSignal> {
428
419
  try {
429
420
  const res = await fetch(`https://registry.npmjs.org/${packageName}`, {
430
421
  headers: { Accept: "application/json" },
@@ -437,10 +428,7 @@ async function fetchNpmProvenance(
437
428
  }
438
429
  const body = (await res.json()) as {
439
430
  "dist-tags"?: { latest?: string };
440
- versions?: Record<
441
- string,
442
- { dist?: { attestations?: unknown; signatures?: unknown } }
443
- >;
431
+ versions?: Record<string, { dist?: { attestations?: unknown; signatures?: unknown } }>;
444
432
  };
445
433
  const latest = body["dist-tags"]?.latest;
446
434
  const dist = latest ? body.versions?.[latest]?.dist : undefined;
@@ -77,9 +77,7 @@ export function isMeasurableDriverFile(name: string): boolean {
77
77
  *
78
78
  * @param driversDir - Absolute drivers directory
79
79
  */
80
- export async function listDriverModules(
81
- driversDir = DRIVERS_DIR,
82
- ): Promise<readonly string[]> {
80
+ export async function listDriverModules(driversDir = DRIVERS_DIR): Promise<readonly string[]> {
83
81
  const entries = await readdir(driversDir);
84
82
  return entries.filter(isMeasurableDriverFile).sort((a, b) => a.localeCompare(b));
85
83
  }
@@ -96,8 +94,7 @@ export async function resolveExportBudgetTargets(options?: {
96
94
  }): Promise<readonly ExportBudgetTarget[]> {
97
95
  const root = options?.root ?? ROOT;
98
96
  const pkg =
99
- options?.pkg ??
100
- ((await Bun.file(join(root, "package.json")).json()) as PackageExports);
97
+ options?.pkg ?? ((await Bun.file(join(root, "package.json")).json()) as PackageExports);
101
98
  const exportsMap = pkg.exports ?? {};
102
99
  const driversDir = options?.driversDir ?? join(root, "src/drivers");
103
100
 
@@ -106,9 +103,7 @@ export async function resolveExportBudgetTargets(options?: {
106
103
  for (const [subpath, entryRel] of Object.entries(exportsMap)) {
107
104
  if (subpath.endsWith("/*")) {
108
105
  if (subpath !== "./drivers/*") {
109
- throw new Error(
110
- `unsupported export glob ${subpath}: only ./drivers/* is expanded`,
111
- );
106
+ throw new Error(`unsupported export glob ${subpath}: only ./drivers/* is expanded`);
112
107
  }
113
108
  const modules = await listDriverModules(driversDir);
114
109
  for (const file of modules) {
@@ -24,9 +24,7 @@ describe("export gzip budgets", () => {
24
24
  });
25
25
 
26
26
  test("exportRegressionLimitBytes uses max(floor, 2% of previous)", () => {
27
- expect(exportRegressionLimitBytes(1000)).toBe(
28
- 1000 + EXPORT_REGRESSION_TOLERANCE_FLOOR_BYTES,
29
- );
27
+ expect(exportRegressionLimitBytes(1000)).toBe(1000 + EXPORT_REGRESSION_TOLERANCE_FLOOR_BYTES);
30
28
  const large = 100_000;
31
29
  expect(exportRegressionLimitBytes(large)).toBe(
32
30
  large + Math.ceil(large * EXPORT_REGRESSION_TOLERANCE_RATIO),
@@ -6,10 +6,7 @@ import { mkdtemp, readdir, rm } from "node:fs/promises";
6
6
  import { tmpdir } from "node:os";
7
7
  import { join, resolve } from "node:path";
8
8
  import { createRouter } from "../kernel/router.ts";
9
- import {
10
- type BudgetGroup,
11
- resolveExportBudgetTargets,
12
- } from "./exports.ts";
9
+ import { type BudgetGroup, resolveExportBudgetTargets } from "./exports.ts";
13
10
  import {
14
11
  CLIENT_BUDGET_BYTES,
15
12
  COLD_START_BUDGET_MS,
@@ -93,9 +90,7 @@ async function gzipBuildOutputs(
93
90
  label: string,
94
91
  ): Promise<number> {
95
92
  if (!result.success) {
96
- throw new Error(
97
- `${label} build failed:\n${result.logs.map(String).join("\n")}`,
98
- );
93
+ throw new Error(`${label} build failed:\n${result.logs.map(String).join("\n")}`);
99
94
  }
100
95
  let total = 0;
101
96
  for (const artifact of result.outputs) {
@@ -147,9 +142,7 @@ export async function measureKernelEdgeGzipBytes(): Promise<number> {
147
142
  external: [...BUILD_EXTERNALS],
148
143
  });
149
144
  if (!result.success) {
150
- throw new Error(
151
- `kernel edge build failed:\n${result.logs.map(String).join("\n")}`,
152
- );
145
+ throw new Error(`kernel edge build failed:\n${result.logs.map(String).join("\n")}`);
153
146
  }
154
147
  const artifact = result.outputs[0];
155
148
  if (!artifact) throw new Error("kernel edge build produced no output");
@@ -169,9 +162,7 @@ export async function measureClientGzipBytes(): Promise<number> {
169
162
  format: "esm",
170
163
  });
171
164
  if (!result.success) {
172
- throw new Error(
173
- `client build failed:\n${result.logs.map(String).join("\n")}`,
174
- );
165
+ throw new Error(`client build failed:\n${result.logs.map(String).join("\n")}`);
175
166
  }
176
167
  const artifact = result.outputs[0];
177
168
  if (!artifact) throw new Error("client build produced no output");
@@ -196,11 +187,7 @@ export async function measureExportGzipBytes(entry: string): Promise<number> {
196
187
  `export function __okeExportBudgetAnchor(){return mod;}\n`,
197
188
  );
198
189
  try {
199
- return await measureEntryGzipBytes(
200
- anchor,
201
- `export ${entry}`,
202
- EXPORT_BUILD_EXTERNALS,
203
- );
190
+ return await measureEntryGzipBytes(anchor, `export ${entry}`, EXPORT_BUILD_EXTERNALS);
204
191
  } finally {
205
192
  await rm(dir, { recursive: true, force: true });
206
193
  }
@@ -418,12 +405,11 @@ export async function measureAllBudgets(): Promise<BudgetsSnapshot> {
418
405
  // Cold start alone first — parallel gzip work contends for CPU on CI and
419
406
  // falsely inflates the wall-clock probe.
420
407
  const coldStartMedianMs = await measureColdStartMedianMs();
421
- const [kernelEdgeGzipBytes, clientGzipBytes, consoleInitialGzipBytes] =
422
- await Promise.all([
423
- measureKernelEdgeGzipBytes(),
424
- measureClientGzipBytes(),
425
- measureConsoleInitialGzipBytes(),
426
- ]);
408
+ const [kernelEdgeGzipBytes, clientGzipBytes, consoleInitialGzipBytes] = await Promise.all([
409
+ measureKernelEdgeGzipBytes(),
410
+ measureClientGzipBytes(),
411
+ measureConsoleInitialGzipBytes(),
412
+ ]);
427
413
  const routingP99Ms = measureRoutingP99Ms();
428
414
 
429
415
  const budgets: BudgetSample[] = [
@@ -482,15 +468,7 @@ export async function measureAllBudgets(): Promise<BudgetsSnapshot> {
482
468
  })),
483
469
  );
484
470
  for (const { target, bytes } of exportSizes) {
485
- budgets.push(
486
- regressionSample(
487
- target.id,
488
- target.label,
489
- target.group,
490
- bytes,
491
- previous,
492
- ),
493
- );
471
+ budgets.push(regressionSample(target.id, target.label, target.group, bytes, previous));
494
472
  }
495
473
 
496
474
  return {
@@ -506,9 +484,7 @@ export async function measureAllBudgets(): Promise<BudgetsSnapshot> {
506
484
  * @param snapshot - Measured budgets
507
485
  */
508
486
  export function formatBudgetsReport(snapshot: BudgetsSnapshot): string {
509
- const lines = [
510
- `okengine budgets v${snapshot.version} @ ${snapshot.measuredAt}`,
511
- ];
487
+ const lines = [`okengine budgets v${snapshot.version} @ ${snapshot.measuredAt}`];
512
488
  const order: readonly BudgetGroup[] = ["core", "exports", "drivers"];
513
489
  for (const group of order) {
514
490
  const rows = snapshot.budgets.filter((b) => b.group === group);
@@ -579,8 +555,7 @@ function sample(
579
555
  gate: BudgetGate,
580
556
  group: BudgetGroup,
581
557
  ): BudgetSample {
582
- const rounded =
583
- unit === "bytes" ? Math.round(value) : Math.round(value * 1000) / 1000;
558
+ const rounded = unit === "bytes" ? Math.round(value) : Math.round(value * 1000) / 1000;
584
559
  return {
585
560
  id,
586
561
  label,
@@ -652,8 +627,7 @@ function formatValue(value: number, unit: BudgetSample["unit"]): string {
652
627
  */
653
628
  function initialAssetHrefs(html: string): string[] {
654
629
  const hrefs: string[] = [];
655
- const re =
656
- /(?:src|href)=["'](\/?assets\/[^"']+\.(?:js|css))["']/g;
630
+ const re = /(?:src|href)=["'](\/?assets\/[^"']+\.(?:js|css))["']/g;
657
631
  for (const match of html.matchAll(re)) {
658
632
  const href = match[1];
659
633
  if (href) hrefs.push(href.replace(/^\//, ""));
@@ -671,9 +645,7 @@ async function gzipFile(path: string): Promise<number> {
671
645
  *
672
646
  * @param dir - Vite outDir
673
647
  */
674
- export async function consoleBundleBreakdown(
675
- dir: string,
676
- ): Promise<ConsoleBundleBreakdown> {
648
+ export async function consoleBundleBreakdown(dir: string): Promise<ConsoleBundleBreakdown> {
677
649
  const assetsDir = join(dir, "assets");
678
650
  const indexPath = join(dir, "index.html");
679
651
  const indexFile = Bun.file(indexPath);
@@ -38,9 +38,7 @@ describe("runs 1M-row query benchmark", () => {
38
38
  ) TO '${duckPath(parquetPath)}' (FORMAT PARQUET, COMPRESSION ZSTD)
39
39
  `);
40
40
  const genMs = performance.now() - t0;
41
- console.log(
42
- `runs-bench generate rows=${ROW_COUNT} parquet_ms=${genMs.toFixed(1)}`,
43
- );
41
+ console.log(`runs-bench generate rows=${ROW_COUNT} parquet_ms=${genMs.toFixed(1)}`);
44
42
  expect(await Bun.file(parquetPath).exists()).toBe(true);
45
43
  } finally {
46
44
  session.close();
@@ -11,10 +11,7 @@ import type { AnyFlowDef } from "../kernel/flow.ts";
11
11
  import type { Fx } from "../kernel/fx.ts";
12
12
  import type { Trigger } from "../kernel/triggers.ts";
13
13
  import type { FlowPlane } from "../manifest/types.ts";
14
- import {
15
- cacheDimensionOf,
16
- type RunTelemetry,
17
- } from "../kernel/run-telemetry.ts";
14
+ import { cacheDimensionOf, type RunTelemetry } from "../kernel/run-telemetry.ts";
18
15
  import type { RunError, WideEvent } from "./types.ts";
19
16
 
20
17
  /** Inputs for {@link collectWideEvent}. */
@@ -57,18 +54,12 @@ export interface CollectWideEventInput {
57
54
  */
58
55
  export function collectWideEvent(input: CollectWideEventInput): WideEvent {
59
56
  const plane: FlowPlane = input.flow.plane ?? "user";
60
- const principal =
61
- plane === "operator"
62
- ? input.fx.operator.id
63
- : input.fx.auth.userId;
57
+ const principal = plane === "operator" ? input.fx.operator.id : input.fx.auth.userId;
64
58
  const tenant = input.fx.tenant.id;
65
- const subjectId =
66
- input.telemetry.subjectId ?? principal ?? tenant ?? null;
59
+ const subjectId = input.telemetry.subjectId ?? principal ?? tenant ?? null;
67
60
  const cache = cacheDimensionOf(input.telemetry);
68
61
  const gates =
69
- input.telemetry.gates.length > 0
70
- ? [...input.telemetry.gates]
71
- : httpGates(input.trigger);
62
+ input.telemetry.gates.length > 0 ? [...input.telemetry.gates] : httpGates(input.trigger);
72
63
 
73
64
  const error = failureToRunError(input.failure);
74
65
  const durationMs = Math.max(0, input.endedAt - input.startedAt);
@@ -103,9 +94,7 @@ export function collectWideEvent(input: CollectWideEventInput): WideEvent {
103
94
  subjectId,
104
95
  gates,
105
96
  cache,
106
- ...(input.telemetry.replica !== undefined
107
- ? { replica: input.telemetry.replica }
108
- : {}),
97
+ ...(input.telemetry.replica !== undefined ? { replica: input.telemetry.replica } : {}),
109
98
  ...(input.telemetry.replicaLagMs !== undefined
110
99
  ? { replicaLagMs: input.telemetry.replicaLagMs }
111
100
  : {}),
@@ -113,9 +102,7 @@ export function collectWideEvent(input: CollectWideEventInput): WideEvent {
113
102
  ...(input.telemetry.promptVersion !== undefined
114
103
  ? { promptVersion: input.telemetry.promptVersion }
115
104
  : {}),
116
- ...(input.buildVersion !== undefined
117
- ? { buildVersion: input.buildVersion }
118
- : {}),
105
+ ...(input.buildVersion !== undefined ? { buildVersion: input.buildVersion } : {}),
119
106
  error,
120
107
  effects: [...input.ledger.entries],
121
108
  logs: [...input.telemetry.logs],
@@ -129,14 +116,10 @@ export function collectWideEvent(input: CollectWideEventInput): WideEvent {
129
116
 
130
117
  function httpGates(trigger: Trigger): string[] {
131
118
  if (trigger.kind !== "http") return [];
132
- return trigger.gates.map((g) =>
133
- typeof g === "string" ? g : g.name,
134
- );
119
+ return trigger.gates.map((g) => (typeof g === "string" ? g : g.name));
135
120
  }
136
121
 
137
- function failureToRunError(
138
- failure: FlowFailure | null | undefined,
139
- ): RunError | null {
122
+ function failureToRunError(failure: FlowFailure | null | undefined): RunError | null {
140
123
  if (!failure) return null;
141
124
  const code = failure.error?.code ?? "failure";
142
125
  const message = failure.error?.message;