okengine 0.2.6 → 0.3.2

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 (681) hide show
  1. package/AGENTS.md +33 -30
  2. package/README.md +74 -340
  3. package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +40 -9
  4. package/package.json +47 -44
  5. package/site/content/docs/ai/llms-txt.mdx +54 -0
  6. package/site/content/docs/ai/mcp.mdx +123 -0
  7. package/site/content/docs/ai/meta.json +5 -0
  8. package/site/content/docs/ai/skills.mdx +53 -0
  9. package/site/content/docs/console/access.mdx +29 -0
  10. package/site/content/docs/console/ai.mdx +35 -0
  11. package/site/content/docs/console/architecture.mdx +35 -0
  12. package/site/content/docs/console/channels.mdx +37 -0
  13. package/site/content/docs/console/clock.mdx +31 -0
  14. package/site/content/docs/console/flows.mdx +31 -0
  15. package/site/content/docs/console/gates.mdx +35 -0
  16. package/site/content/docs/console/manifest-diff.mdx +34 -0
  17. package/site/content/docs/console/meta.json +23 -0
  18. package/site/content/docs/console/overview.mdx +40 -0
  19. package/site/content/docs/console/plugins.mdx +41 -0
  20. package/site/content/docs/console/privacy.mdx +32 -0
  21. package/site/content/docs/console/runs.mdx +40 -0
  22. package/site/content/docs/console/signals.mdx +31 -0
  23. package/site/content/docs/console/store.mdx +32 -0
  24. package/site/content/docs/console/tenancy.mdx +32 -0
  25. package/site/content/docs/console/traces.mdx +34 -0
  26. package/site/content/docs/console/vault.mdx +37 -0
  27. package/site/content/docs/elements/ai.mdx +180 -0
  28. package/site/content/docs/elements/channel.mdx +167 -0
  29. package/site/content/docs/elements/clock.mdx +182 -0
  30. package/site/content/docs/elements/flow.mdx +288 -0
  31. package/site/content/docs/elements/gate.mdx +171 -0
  32. package/site/content/docs/elements/meta.json +5 -0
  33. package/site/content/docs/elements/signal.mdx +171 -0
  34. package/site/content/docs/elements/store.mdx +320 -0
  35. package/site/content/docs/elements/vault.mdx +263 -0
  36. package/site/content/docs/get-started/basic-usage.mdx +124 -0
  37. package/site/content/docs/get-started/comparison.mdx +65 -0
  38. package/site/content/docs/get-started/installation.mdx +113 -0
  39. package/site/content/docs/get-started/introduction.mdx +123 -0
  40. package/site/content/docs/get-started/meta.json +5 -0
  41. package/site/content/docs/index.mdx +63 -0
  42. package/site/content/docs/meta.json +5 -0
  43. package/site/content/docs/plugins/compression.mdx +60 -0
  44. package/site/content/docs/plugins/cors.mdx +92 -0
  45. package/site/content/docs/plugins/csrf.mdx +96 -0
  46. package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
  47. package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
  48. package/site/content/docs/plugins/meta.json +15 -0
  49. package/site/content/docs/plugins/security-headers.mdx +136 -0
  50. package/site/content/docs/reference/cli.md +101 -0
  51. package/site/content/docs/reference/configuration.mdx +159 -0
  52. package/site/content/docs/reference/environment-variables.mdx +87 -0
  53. package/site/content/docs/reference/errors.mdx +80 -0
  54. package/site/content/docs/reference/fx.mdx +117 -0
  55. package/site/content/docs/reference/meta.json +5 -0
  56. package/site/content/docs/reference/plugins.mdx +249 -0
  57. package/site/content/docs/reference/security.md +63 -0
  58. package/src/auth/api-keys.ts +2 -5
  59. package/src/auth/attenuation.ts +2 -6
  60. package/src/auth/auth.test.ts +56 -31
  61. package/src/auth/invoke-as.ts +1 -3
  62. package/src/auth/operator.ts +8 -26
  63. package/src/auth/planes.ts +2 -7
  64. package/src/auth/plugin.ts +4 -7
  65. package/src/auth/roles.ts +1 -5
  66. package/src/auth/sessions.ts +10 -39
  67. package/src/cli/args.ts +1 -5
  68. package/src/cli/ask-dev-mode.ts +40 -0
  69. package/src/cli/build.ts +1 -2
  70. package/src/cli/client-add.test.ts +8 -15
  71. package/src/cli/client-add.ts +5 -14
  72. package/src/cli/completion.test.ts +1 -5
  73. package/src/cli/completion.ts +4 -17
  74. package/src/cli/db-auto-push.test.ts +64 -0
  75. package/src/cli/db-auto-push.ts +72 -0
  76. package/src/cli/db.test.ts +189 -0
  77. package/src/cli/db.ts +456 -0
  78. package/src/cli/dev-app-runner.ts +2 -8
  79. package/src/cli/dev-db-push.test.ts +193 -0
  80. package/src/cli/dev-mode.test.ts +45 -0
  81. package/src/cli/dev-mode.ts +78 -0
  82. package/src/cli/dev-schema-sync.test.ts +66 -0
  83. package/src/cli/dev-schema-sync.ts +139 -0
  84. package/src/cli/dev.test.ts +264 -15
  85. package/src/cli/dev.ts +355 -139
  86. package/src/cli/doc-staleness.test.ts +69 -0
  87. package/src/cli/docker-cli.test.ts +27 -8
  88. package/src/cli/docker.ts +11 -3
  89. package/src/cli/doctor-diff.test.ts +1 -5
  90. package/src/cli/doctor-diff.ts +17 -46
  91. package/src/cli/doctor-pii.ts +2 -7
  92. package/src/cli/doctor.test.ts +26 -4
  93. package/src/cli/doctor.ts +35 -11
  94. package/src/cli/drizzle-env.test.ts +67 -0
  95. package/src/cli/drizzle-env.ts +78 -0
  96. package/src/cli/ensure-drizzle-config.ts +50 -0
  97. package/src/cli/eval.ts +4 -14
  98. package/src/cli/gates-list.ts +1 -4
  99. package/src/cli/hero-meta.test.ts +17 -19
  100. package/src/cli/hero-meta.ts +20 -30
  101. package/src/cli/images.ts +3 -8
  102. package/src/cli/index.ts +11 -2
  103. package/src/cli/load-config.images.test.ts +14 -14
  104. package/src/cli/load-config.ts +47 -47
  105. package/src/cli/mcp-from-console.ts +1 -4
  106. package/src/cli/mode.ts +65 -0
  107. package/src/cli/openbao-bootstrap.test.ts +147 -0
  108. package/src/cli/openbao-bootstrap.ts +280 -0
  109. package/src/cli/openbao-restart.integration.test.ts +136 -0
  110. package/src/cli/ports.test.ts +7 -14
  111. package/src/cli/ports.ts +7 -5
  112. package/src/cli/privacy-erase.ts +1 -3
  113. package/src/cli/registry.ts +75 -25
  114. package/src/cli/resolve-dev-sql-env.test.ts +48 -0
  115. package/src/cli/resolve-dev-sql-env.ts +42 -0
  116. package/src/cli/schema.ts +3 -10
  117. package/src/cli/stack.ts +8 -10
  118. package/src/cli/start.ts +4 -15
  119. package/src/cli/upgrade.ts +1 -4
  120. package/src/cli/vault-cmd.ts +63 -0
  121. package/src/client/budget-entry.ts +1 -6
  122. package/src/client/create.test.ts +6 -12
  123. package/src/client/create.ts +2 -8
  124. package/src/client/errors.ts +1 -4
  125. package/src/client/index.ts +1 -6
  126. package/src/client/notes-contract.test.ts +4 -13
  127. package/src/client/transport.ts +9 -30
  128. package/src/client/types.ts +15 -30
  129. package/src/compiler/aot.test.ts +2 -9
  130. package/src/compiler/aot.ts +1 -4
  131. package/src/compiler/differential.test.ts +3 -11
  132. package/src/compiler/dynamic.ts +1 -4
  133. package/src/compiler/effects-infer.ts +8 -34
  134. package/src/compiler/emit.ts +1 -3
  135. package/src/compiler/extract.test.ts +136 -30
  136. package/src/compiler/extract.ts +485 -157
  137. package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
  138. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  139. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  140. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  141. package/src/compiler/fixtures/skyport.expected.json +24 -83
  142. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  143. package/src/compiler/http-parse.ts +2 -9
  144. package/src/compiler/index.ts +1 -5
  145. package/src/compiler/response.ts +16 -7
  146. package/src/compiler/sucrose.ts +11 -31
  147. package/src/config/define-config.test.ts +55 -34
  148. package/src/config/index.ts +177 -46
  149. package/src/config/resolve-driver.test.ts +28 -17
  150. package/src/console/budget.test.ts +1 -4
  151. package/src/console/index.ts +1 -4
  152. package/src/console/server/access.test.ts +15 -43
  153. package/src/console/server/access.ts +19 -49
  154. package/src/console/server/ai.test.ts +3 -11
  155. package/src/console/server/ai.ts +23 -46
  156. package/src/console/server/app.ts +16 -45
  157. package/src/console/server/auth-rate.test.ts +4 -12
  158. package/src/console/server/bind.ts +1 -5
  159. package/src/console/server/channels.test.ts +2 -6
  160. package/src/console/server/channels.ts +10 -35
  161. package/src/console/server/claim.ts +2 -8
  162. package/src/console/server/clock.test.ts +2 -6
  163. package/src/console/server/clock.ts +8 -26
  164. package/src/console/server/console.test.ts +1 -3
  165. package/src/console/server/diff.test.ts +5 -17
  166. package/src/console/server/diff.ts +10 -31
  167. package/src/console/server/dry-run.audit.test.ts +2 -8
  168. package/src/console/server/flows.ts +64 -233
  169. package/src/console/server/gates.test.ts +14 -50
  170. package/src/console/server/gates.ts +13 -48
  171. package/src/console/server/index.ts +2 -9
  172. package/src/console/server/live.ts +3 -12
  173. package/src/console/server/operator-db.test.ts +4 -15
  174. package/src/console/server/operator-db.ts +13 -32
  175. package/src/console/server/plugin.ts +50 -53
  176. package/src/console/server/plugins.test.ts +2 -6
  177. package/src/console/server/plugins.ts +17 -56
  178. package/src/console/server/runs-pii.ts +2 -7
  179. package/src/console/server/security.gate.test.ts +18 -40
  180. package/src/console/server/serve.ts +10 -25
  181. package/src/console/server/signals.test.ts +1 -3
  182. package/src/console/server/signals.ts +17 -40
  183. package/src/console/server/state.ts +21 -59
  184. package/src/console/server/store.test.ts +20 -22
  185. package/src/console/server/store.ts +31 -76
  186. package/src/console/server/vault.test.ts +12 -29
  187. package/src/console/server/vault.ts +44 -66
  188. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  189. package/src/console/ui/access/a11y.test.tsx +3 -12
  190. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  191. package/src/console/ui/access/acknowledgement.ts +1 -3
  192. package/src/console/ui/access/blast-radius.ts +1 -3
  193. package/src/console/ui/access/confirmation.test.ts +1 -5
  194. package/src/console/ui/access/confirmation.ts +1 -4
  195. package/src/console/ui/access/fixture.ts +1 -5
  196. package/src/console/ui/access/grantable.test.ts +1 -3
  197. package/src/console/ui/access/grantable.ts +2 -7
  198. package/src/console/ui/access/index.ts +2 -9
  199. package/src/console/ui/access/provenance.test.ts +1 -3
  200. package/src/console/ui/access/provenance.ts +2 -6
  201. package/src/console/ui/access/search.test.ts +1 -5
  202. package/src/console/ui/access/search.ts +2 -6
  203. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  204. package/src/console/ui/ai/a11y.test.tsx +2 -5
  205. package/src/console/ui/ai/fixture.ts +2 -7
  206. package/src/console/ui/ai/format.ts +1 -3
  207. package/src/console/ui/ai/group.test.ts +1 -3
  208. package/src/console/ui/ai/group.ts +4 -12
  209. package/src/console/ui/ai/index.ts +2 -9
  210. package/src/console/ui/ai/promotion.test.ts +2 -7
  211. package/src/console/ui/ai/promotion.ts +4 -13
  212. package/src/console/ui/ai/search.test.ts +2 -11
  213. package/src/console/ui/ai/search.ts +3 -13
  214. package/src/console/ui/ai/types.ts +1 -8
  215. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  216. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  217. package/src/console/ui/architecture/declared.ts +1 -5
  218. package/src/console/ui/architecture/index.ts +7 -35
  219. package/src/console/ui/architecture/layout.ts +1 -3
  220. package/src/console/ui/architecture/pathologies.ts +10 -19
  221. package/src/console/ui/architecture/search.ts +6 -15
  222. package/src/console/ui/architecture/traffic.ts +4 -14
  223. package/src/console/ui/architecture/types.ts +2 -10
  224. package/src/console/ui/architecture/view.test.ts +7 -19
  225. package/src/console/ui/architecture/view.ts +9 -36
  226. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  227. package/src/console/ui/channels/a11y.test.tsx +1 -2
  228. package/src/console/ui/channels/confirmation.test.ts +1 -4
  229. package/src/console/ui/channels/confirmation.ts +1 -4
  230. package/src/console/ui/channels/findings.ts +1 -5
  231. package/src/console/ui/channels/index.ts +2 -8
  232. package/src/console/ui/channels/locale.test.ts +1 -3
  233. package/src/console/ui/channels/locale.ts +2 -8
  234. package/src/console/ui/channels/search.ts +4 -13
  235. package/src/console/ui/channels/taxonomy.ts +1 -3
  236. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  237. package/src/console/ui/clock/a11y.test.tsx +2 -5
  238. package/src/console/ui/clock/confirmation.test.ts +1 -3
  239. package/src/console/ui/clock/confirmation.ts +1 -4
  240. package/src/console/ui/clock/findings.ts +1 -4
  241. package/src/console/ui/clock/health.ts +2 -7
  242. package/src/console/ui/clock/index.ts +2 -10
  243. package/src/console/ui/clock/search.test.ts +1 -3
  244. package/src/console/ui/clock/search.ts +2 -6
  245. package/src/console/ui/clock/timeline.test.ts +1 -3
  246. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  247. package/src/console/ui/clock/waiting-on.ts +2 -7
  248. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  249. package/src/console/ui/diff/a11y.test.tsx +2 -5
  250. package/src/console/ui/diff/group.test.ts +3 -13
  251. package/src/console/ui/diff/group.ts +2 -8
  252. package/src/console/ui/diff/index.ts +2 -8
  253. package/src/console/ui/diff/search.test.ts +1 -5
  254. package/src/console/ui/diff/search.ts +4 -16
  255. package/src/console/ui/diff/summary.ts +1 -2
  256. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  257. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  258. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  259. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  260. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  261. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  262. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  263. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  264. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  265. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  266. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  267. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  268. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  269. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  270. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  271. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  272. package/src/console/ui/dist/index.html +1 -1
  273. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  274. package/src/console/ui/flows/a11y.test.tsx +2 -8
  275. package/src/console/ui/flows/buffer.test.ts +3 -11
  276. package/src/console/ui/flows/buffer.ts +4 -11
  277. package/src/console/ui/flows/confirmation.ts +1 -3
  278. package/src/console/ui/flows/contract.test.ts +3 -7
  279. package/src/console/ui/flows/contract.ts +12 -36
  280. package/src/console/ui/flows/graph.test.ts +3 -11
  281. package/src/console/ui/flows/graph.ts +5 -15
  282. package/src/console/ui/flows/index.ts +1 -6
  283. package/src/console/ui/flows/save-as-test.ts +1 -3
  284. package/src/console/ui/flows/search.ts +8 -25
  285. package/src/console/ui/flows/tiers.ts +2 -9
  286. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  287. package/src/console/ui/gates/a11y.test.tsx +2 -5
  288. package/src/console/ui/gates/audit.ts +1 -3
  289. package/src/console/ui/gates/denial.test.ts +1 -3
  290. package/src/console/ui/gates/denial.ts +4 -12
  291. package/src/console/ui/gates/findings.ts +1 -3
  292. package/src/console/ui/gates/group.test.ts +3 -3
  293. package/src/console/ui/gates/group.ts +3 -11
  294. package/src/console/ui/gates/index.ts +2 -10
  295. package/src/console/ui/gates/search.ts +3 -10
  296. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  297. package/src/console/ui/overview/a11y.test.tsx +1 -2
  298. package/src/console/ui/overview/busiest.ts +1 -3
  299. package/src/console/ui/overview/compose.ts +1 -13
  300. package/src/console/ui/overview/cost.ts +34 -38
  301. package/src/console/ui/overview/fixture.ts +21 -26
  302. package/src/console/ui/overview/golden.ts +4 -14
  303. package/src/console/ui/overview/index.ts +2 -9
  304. package/src/console/ui/overview/rank.test.ts +3 -10
  305. package/src/console/ui/overview/rank.ts +2 -7
  306. package/src/console/ui/overview/slo.test.ts +5 -9
  307. package/src/console/ui/overview/slo.ts +6 -23
  308. package/src/console/ui/overview/verdict.ts +3 -10
  309. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  310. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  311. package/src/console/ui/plugins/fixture.ts +2 -4
  312. package/src/console/ui/plugins/group.test.ts +1 -3
  313. package/src/console/ui/plugins/group.ts +1 -6
  314. package/src/console/ui/plugins/index.ts +3 -13
  315. package/src/console/ui/plugins/search.ts +7 -19
  316. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  317. package/src/console/ui/runs/a11y.test.tsx +2 -5
  318. package/src/console/ui/runs/explain.ts +2 -6
  319. package/src/console/ui/runs/group.ts +3 -12
  320. package/src/console/ui/runs/histogram.test.ts +2 -11
  321. package/src/console/ui/runs/histogram.ts +1 -4
  322. package/src/console/ui/runs/index.ts +4 -18
  323. package/src/console/ui/runs/project.ts +2 -6
  324. package/src/console/ui/runs/query.test.ts +1 -3
  325. package/src/console/ui/runs/query.ts +12 -35
  326. package/src/console/ui/runs/search.ts +5 -19
  327. package/src/console/ui/runs/trace-link.test.ts +2 -6
  328. package/src/console/ui/runs/trace-link.ts +4 -16
  329. package/src/console/ui/runs/types.ts +1 -3
  330. package/src/console/ui/shell/App.tsx +2 -10
  331. package/src/console/ui/shell/client.ts +22 -115
  332. package/src/console/ui/shell/components/ui.tsx +1 -4
  333. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  334. package/src/console/ui/shell/main.tsx +31 -96
  335. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  336. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  337. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  338. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  339. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  340. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  341. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  342. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  343. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  344. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  345. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  346. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  347. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  348. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  349. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  350. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  351. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  352. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  353. package/src/console/ui/shell/styles.css +1 -2
  354. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  355. package/src/console/ui/signals/a11y.test.tsx +2 -5
  356. package/src/console/ui/signals/confirmation.test.ts +1 -5
  357. package/src/console/ui/signals/confirmation.ts +2 -6
  358. package/src/console/ui/signals/dry-run.ts +1 -3
  359. package/src/console/ui/signals/durable.ts +1 -3
  360. package/src/console/ui/signals/findings.ts +1 -3
  361. package/src/console/ui/signals/group.test.ts +2 -8
  362. package/src/console/ui/signals/group.ts +2 -10
  363. package/src/console/ui/signals/index.ts +1 -4
  364. package/src/console/ui/signals/monitor.ts +2 -7
  365. package/src/console/ui/signals/schema-form.test.ts +3 -14
  366. package/src/console/ui/signals/schema-form.ts +1 -4
  367. package/src/console/ui/signals/search.ts +4 -13
  368. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  369. package/src/console/ui/store/a11y.test.tsx +2 -5
  370. package/src/console/ui/store/confirmation.test.ts +1 -3
  371. package/src/console/ui/store/confirmation.ts +1 -4
  372. package/src/console/ui/store/dry-run.ts +2 -5
  373. package/src/console/ui/store/fixture.ts +1 -2
  374. package/src/console/ui/store/group.test.ts +1 -6
  375. package/src/console/ui/store/group.ts +1 -4
  376. package/src/console/ui/store/index.ts +1 -5
  377. package/src/console/ui/store/search.ts +2 -6
  378. package/src/console/ui/store/will-not-fire.ts +1 -2
  379. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  380. package/src/console/ui/traces/a11y.test.tsx +1 -2
  381. package/src/console/ui/traces/chain.test.ts +5 -19
  382. package/src/console/ui/traces/chain.ts +1 -3
  383. package/src/console/ui/traces/critical-path.test.ts +1 -3
  384. package/src/console/ui/traces/critical-path.ts +2 -6
  385. package/src/console/ui/traces/filter.test.ts +2 -6
  386. package/src/console/ui/traces/filter.ts +5 -13
  387. package/src/console/ui/traces/fold.test.ts +4 -12
  388. package/src/console/ui/traces/fold.ts +1 -3
  389. package/src/console/ui/traces/mini.ts +1 -3
  390. package/src/console/ui/traces/replay.test.ts +1 -3
  391. package/src/console/ui/traces/replay.ts +1 -3
  392. package/src/console/ui/traces/sampling.ts +1 -4
  393. package/src/console/ui/traces/search.ts +4 -17
  394. package/src/console/ui/traces/tier.ts +1 -3
  395. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  396. package/src/console/ui/vault/a11y.test.tsx +1 -2
  397. package/src/console/ui/vault/blast-radius.ts +1 -3
  398. package/src/console/ui/vault/confirmation.test.ts +1 -5
  399. package/src/console/ui/vault/confirmation.ts +1 -4
  400. package/src/console/ui/vault/dormant.test.ts +1 -4
  401. package/src/console/ui/vault/export-safe.test.ts +1 -5
  402. package/src/console/ui/vault/export-safe.ts +1 -4
  403. package/src/console/ui/vault/fixture.ts +3 -3
  404. package/src/console/ui/vault/group.ts +1 -2
  405. package/src/console/ui/vault/index.ts +2 -10
  406. package/src/console/ui/vault/search.ts +2 -6
  407. package/src/console/ui/vault/types.ts +1 -1
  408. package/src/console/xss.gate.test.ts +1 -3
  409. package/src/docker/compose.ts +215 -27
  410. package/src/docker/derive.ts +6 -14
  411. package/src/docker/docker.test.ts +118 -15
  412. package/src/docker/dockerfile.integration.test.ts +12 -21
  413. package/src/docker/helpers.ts +5 -4
  414. package/src/docker/index.ts +9 -6
  415. package/src/docker/pin.ts +1 -9
  416. package/src/docker/recipes/index.ts +6 -6
  417. package/src/docker/recipes/mailpit.ts +22 -0
  418. package/src/docker/recipes/openbao.ts +47 -0
  419. package/src/docker/recipes/postgres.ts +17 -6
  420. package/src/docker/recipes/redis.ts +11 -2
  421. package/src/docker/recipes/rustfs.ts +32 -0
  422. package/src/docker/stack-id.test.ts +73 -5
  423. package/src/docker/stack-id.ts +124 -33
  424. package/src/docker/stack.integration.test.ts +6 -21
  425. package/src/docker/stack.ts +36 -4
  426. package/src/docker/types.ts +16 -4
  427. package/src/docs-origin.ts +4 -4
  428. package/src/drivers/ai-anthropic.ts +5 -14
  429. package/src/drivers/ai-mock.ts +2 -5
  430. package/src/drivers/ai-openai-compatible.ts +4 -10
  431. package/src/drivers/ai-providers.test.ts +6 -13
  432. package/src/drivers/bun-native-completeness.test.ts +6 -15
  433. package/src/drivers/channel-console.ts +6 -7
  434. package/src/drivers/channel-fcm.ts +20 -30
  435. package/src/drivers/channel-resend.ts +1 -3
  436. package/src/drivers/channel-smtp.ts +2 -6
  437. package/src/drivers/channel-types.ts +2 -12
  438. package/src/drivers/channel-unifonic.ts +2 -6
  439. package/src/drivers/channel-wa-cloud.ts +2 -6
  440. package/src/drivers/channel-webpush.ts +21 -60
  441. package/src/drivers/conformance.test.ts +2 -10
  442. package/src/drivers/conformance.ts +8 -21
  443. package/src/drivers/drizzle-dialect.test.ts +20 -0
  444. package/src/drivers/drizzle-dialect.ts +37 -0
  445. package/src/drivers/fs.ts +2 -8
  446. package/src/drivers/index.ts +12 -57
  447. package/src/drivers/memory.ts +287 -75
  448. package/src/drivers/pgvector.ts +7 -11
  449. package/src/drivers/postgres.ts +7 -13
  450. package/src/drivers/redis.ts +13 -37
  451. package/src/drivers/s3.ts +15 -18
  452. package/src/drivers/signal-engine.ts +12 -49
  453. package/src/drivers/signal-memory.ts +2 -8
  454. package/src/drivers/signal-nats.ts +4 -9
  455. package/src/drivers/signal-postgres.ts +62 -129
  456. package/src/drivers/signal-redis.ts +7 -21
  457. package/src/drivers/signal-types.ts +1 -4
  458. package/src/drivers/sqlite.ts +3 -12
  459. package/src/drivers/types.ts +4 -23
  460. package/src/drivers/vault-driver-removal.test.ts +55 -0
  461. package/src/drivers/vault-env.ts +2 -6
  462. package/src/drivers/vault-infisical.ts +1 -5
  463. package/src/drivers/vault-managed.ts +1 -5
  464. package/src/drivers/vault-memory.ts +1 -5
  465. package/src/drivers/vault-openbao.test.ts +97 -0
  466. package/src/drivers/vault-openbao.ts +103 -40
  467. package/src/drivers/vault-types.ts +3 -16
  468. package/src/elements/ai/declare.ts +4 -14
  469. package/src/elements/ai/eval.ts +2 -6
  470. package/src/elements/ai/pii.ts +1 -3
  471. package/src/elements/ai/runtime.ts +12 -50
  472. package/src/elements/ai/schema.ts +4 -15
  473. package/src/elements/ai.test.ts +13 -24
  474. package/src/elements/ai.ts +1 -5
  475. package/src/elements/channel/consent.ts +3 -12
  476. package/src/elements/channel/costs.ts +4 -15
  477. package/src/elements/channel/declare.ts +1 -4
  478. package/src/elements/channel/email-auth.ts +1 -4
  479. package/src/elements/channel/locale.ts +2 -10
  480. package/src/elements/channel/mask.ts +1 -3
  481. package/src/elements/channel/mime.ts +2 -12
  482. package/src/elements/channel/outcomes.test.ts +1 -5
  483. package/src/elements/channel/outcomes.ts +5 -15
  484. package/src/elements/channel/receipts.ts +2 -7
  485. package/src/elements/channel/runtime.ts +28 -74
  486. package/src/elements/channel/suppression.ts +8 -14
  487. package/src/elements/channel.test.ts +8 -31
  488. package/src/elements/channel.ts +3 -14
  489. package/src/elements/clock/actions.ts +6 -18
  490. package/src/elements/clock/declare.ts +1 -3
  491. package/src/elements/clock/dst.ts +1 -5
  492. package/src/elements/clock/durable.ts +4 -16
  493. package/src/elements/clock/health.ts +2 -7
  494. package/src/elements/clock/leader.ts +2 -9
  495. package/src/elements/clock/reconcile.ts +4 -15
  496. package/src/elements/clock/runtime.ts +2 -5
  497. package/src/elements/clock/schedule.ts +4 -20
  498. package/src/elements/clock.test.ts +2 -7
  499. package/src/elements/clock.ts +5 -23
  500. package/src/elements/gate/permissions.ts +1 -4
  501. package/src/elements/gate/runtime.ts +7 -28
  502. package/src/elements/gate.ts +1 -5
  503. package/src/elements/index.ts +9 -7
  504. package/src/elements/signal/declare.ts +2 -7
  505. package/src/elements/signal/reconcile.test.ts +1 -4
  506. package/src/elements/signal/runtime.ts +1 -3
  507. package/src/elements/signal.test.ts +3 -15
  508. package/src/elements/signal.ts +2 -8
  509. package/src/elements/store/cache.test.ts +46 -0
  510. package/src/elements/store/cache.ts +3 -11
  511. package/src/elements/store/classify.ts +5 -22
  512. package/src/elements/store/declare.ts +11 -17
  513. package/src/elements/store/domain-ddl.test.ts +86 -0
  514. package/src/elements/store/emit-drizzle.ts +363 -0
  515. package/src/elements/store/files-policy.test.ts +1 -5
  516. package/src/elements/store/files-policy.ts +4 -12
  517. package/src/elements/store/load-plugin-tables.ts +103 -0
  518. package/src/elements/store/missing-relation.test.ts +83 -0
  519. package/src/elements/store/missing-relation.ts +38 -0
  520. package/src/elements/store/replica.ts +1 -4
  521. package/src/elements/store/resource-list-docs.fixture.ts +56 -0
  522. package/src/elements/store/resource-list-docs.test.ts +79 -0
  523. package/src/elements/store/resource.test.ts +253 -0
  524. package/src/elements/store/resource.ts +786 -0
  525. package/src/elements/store/runtime.ts +25 -28
  526. package/src/elements/store/schema-decl.test.ts +227 -0
  527. package/src/elements/store/schema-decl.ts +516 -0
  528. package/src/elements/store/sql-condition.test.ts +132 -0
  529. package/src/elements/store/sql-condition.ts +293 -65
  530. package/src/elements/store/sql-session.test.ts +135 -0
  531. package/src/elements/store/sql-session.ts +241 -84
  532. package/src/elements/store/table.ts +69 -23
  533. package/src/elements/store.test.ts +17 -39
  534. package/src/elements/store.ts +53 -31
  535. package/src/elements/vault/chain.ts +34 -0
  536. package/src/elements/vault/declare.ts +22 -32
  537. package/src/elements/vault/fingerprint.ts +2 -7
  538. package/src/elements/vault/redact.ts +2 -6
  539. package/src/elements/vault/runtime.ts +19 -33
  540. package/src/elements/vault.test.ts +12 -55
  541. package/src/elements/vault.ts +9 -13
  542. package/src/index.ts +5 -2
  543. package/src/kernel/adopt-routes.ts +15 -29
  544. package/src/kernel/app.ts +92 -118
  545. package/src/kernel/auth-resolve.ts +2 -9
  546. package/src/kernel/boot-bind/ai.ts +1 -4
  547. package/src/kernel/boot-bind/channel.test.ts +60 -0
  548. package/src/kernel/boot-bind/channel.ts +61 -5
  549. package/src/kernel/boot-bind/clock.ts +2 -6
  550. package/src/kernel/boot-bind/gate.ts +2 -8
  551. package/src/kernel/boot-bind/runs.ts +1 -3
  552. package/src/kernel/boot-bind/signal.ts +3 -10
  553. package/src/kernel/boot-bind/store.test.ts +27 -18
  554. package/src/kernel/boot-bind/store.ts +93 -52
  555. package/src/kernel/boot-bind/vault.ts +2 -8
  556. package/src/kernel/boot.test.ts +4 -10
  557. package/src/kernel/boot.ts +30 -77
  558. package/src/kernel/budget.test.ts +1 -3
  559. package/src/kernel/capability.ts +3 -10
  560. package/src/kernel/dry-run.test.ts +1 -4
  561. package/src/kernel/dry-run.ts +3 -11
  562. package/src/kernel/edge.test.ts +68 -0
  563. package/src/kernel/effects.test.ts +1 -5
  564. package/src/kernel/effects.ts +4 -11
  565. package/src/kernel/errors.registry.test.ts +2 -8
  566. package/src/kernel/errors.ts +23 -32
  567. package/src/kernel/flow.test.ts +12 -25
  568. package/src/kernel/flow.ts +13 -25
  569. package/src/kernel/fx.test.ts +31 -40
  570. package/src/kernel/fx.ts +135 -90
  571. package/src/kernel/hook-timing.test.ts +3 -6
  572. package/src/kernel/hook-timing.ts +5 -14
  573. package/src/kernel/hooks.test.ts +43 -10
  574. package/src/kernel/hooks.ts +25 -12
  575. package/src/kernel/index.ts +11 -17
  576. package/src/kernel/journal.ts +7 -31
  577. package/src/kernel/on.ts +45 -9
  578. package/src/kernel/pipeline.test.ts +10 -19
  579. package/src/kernel/pipeline.ts +5 -17
  580. package/src/kernel/plug.ts +4 -11
  581. package/src/kernel/plugin/conflicts.test.ts +13 -25
  582. package/src/kernel/plugin/decorate.test.ts +8 -13
  583. package/src/kernel/plugin/scoping.test.ts +4 -11
  584. package/src/kernel/plugin.ts +81 -27
  585. package/src/kernel/registry-isolation.test.ts +74 -0
  586. package/src/kernel/registry.ts +102 -30
  587. package/src/kernel/router.test.ts +15 -13
  588. package/src/kernel/router.ts +9 -29
  589. package/src/kernel/routing-budget.test.ts +1 -3
  590. package/src/kernel/run-telemetry.ts +1 -3
  591. package/src/kernel/triggers.ts +63 -21
  592. package/src/manifest/diff.test.ts +26 -91
  593. package/src/manifest/diff.ts +95 -225
  594. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  595. package/src/manifest/fixtures/skyport.manifest.json +1 -1
  596. package/src/manifest/index.ts +3 -10
  597. package/src/manifest/types.ts +30 -6
  598. package/src/manifest/undeclared.test.ts +4 -12
  599. package/src/manifest/undeclared.ts +1 -2
  600. package/src/manifest/validate.test.ts +2 -6
  601. package/src/manifest/validate.ts +5 -15
  602. package/src/mcp/authorization.ts +8 -27
  603. package/src/mcp/confirmation.ts +3 -10
  604. package/src/mcp/data.ts +2 -6
  605. package/src/mcp/docs-index.ts +4 -7
  606. package/src/mcp/docs-mcp.test.ts +3 -12
  607. package/src/mcp/docs-server.ts +7 -27
  608. package/src/mcp/docs-tools.ts +2 -6
  609. package/src/mcp/index.ts +1 -6
  610. package/src/mcp/injection.gate.test.ts +4 -18
  611. package/src/mcp/mcp.test.ts +18 -49
  612. package/src/mcp/protocol.ts +3 -10
  613. package/src/mcp/server.ts +11 -52
  614. package/src/mcp/session.ts +4 -14
  615. package/src/mcp/tools.ts +14 -50
  616. package/src/plugins/catalogue.test.ts +3 -7
  617. package/src/plugins/catalogue.ts +1 -3
  618. package/src/plugins/compression.test.ts +127 -0
  619. package/src/plugins/compression.ts +94 -0
  620. package/src/plugins/config-source.test.ts +204 -0
  621. package/src/plugins/config-source.ts +209 -0
  622. package/src/plugins/cors.test.ts +138 -0
  623. package/src/plugins/cors.ts +129 -0
  624. package/src/plugins/csrf.test.ts +102 -0
  625. package/src/plugins/csrf.ts +86 -0
  626. package/src/plugins/headers.ts +54 -0
  627. package/src/plugins/index.ts +26 -0
  628. package/src/plugins/ip-allowlist.test.ts +105 -0
  629. package/src/plugins/ip-allowlist.ts +76 -0
  630. package/src/plugins/maintenance-mode.test.ts +91 -0
  631. package/src/plugins/maintenance-mode.ts +85 -0
  632. package/src/plugins/node-import-scan.ts +2 -5
  633. package/src/plugins/security-headers.test.ts +243 -0
  634. package/src/plugins/security-headers.ts +255 -0
  635. package/src/plugins/supply-chain.ts +5 -17
  636. package/src/release/exports.ts +3 -8
  637. package/src/release/measure.exports.test.ts +1 -3
  638. package/src/release/measure.ts +16 -45
  639. package/src/runs/bench.test.ts +1 -3
  640. package/src/runs/collect.ts +8 -25
  641. package/src/runs/drivers/clickhouse.ts +2 -9
  642. package/src/runs/drivers/files.ts +9 -31
  643. package/src/runs/drivers/memory.ts +5 -22
  644. package/src/runs/drivers/postgres.ts +8 -20
  645. package/src/runs/duckdb.ts +2 -8
  646. package/src/runs/index.ts +3 -14
  647. package/src/runs/outlier.ts +3 -10
  648. package/src/runs/parquet.ts +8 -26
  649. package/src/runs/privacy.ts +2 -8
  650. package/src/runs/runs.test.ts +3 -9
  651. package/src/runs/runtime.ts +7 -32
  652. package/src/runs/shred.ts +10 -29
  653. package/src/runs/types.ts +1 -4
  654. package/src/runtime/bun.ts +4 -15
  655. package/src/runtime/cold-start.bench.ts +1 -3
  656. package/src/runtime/dev-request-log.test.ts +1 -4
  657. package/src/runtime/dev-request-log.ts +1 -4
  658. package/src/runtime/index.ts +1 -6
  659. package/src/runtime/primitives.ts +5 -4
  660. package/src/runtime/security.ts +3 -13
  661. package/src/runtime/serve.test.ts +4 -7
  662. package/src/runtime/types.ts +1 -4
  663. package/src/runtime/web-standard.ts +3 -15
  664. package/src/term.test.ts +4 -6
  665. package/src/term.ts +49 -98
  666. package/src/test/create-test-app.test.ts +4 -14
  667. package/src/test/create-test-app.ts +27 -33
  668. package/src/test/provisions.integration.test.ts +3 -11
  669. package/src/upgrade/codemods.test.ts +25 -6
  670. package/src/upgrade/codemods.ts +116 -3
  671. package/src/validation/standard-schema.test.ts +2 -5
  672. package/src/validation/standard-schema.ts +13 -33
  673. package/docs/spec/console.md +0 -739
  674. package/docs/spec/example.md +0 -1196
  675. package/docs/spec/four-applications.md +0 -1195
  676. package/docs/spec/unified-theory.md +0 -489
  677. package/src/cli/doc-drift.test.ts +0 -146
  678. package/src/cli/doc-drift.ts +0 -430
  679. package/src/cli/doctor-diff-examples.ts +0 -92
  680. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
  681. package/src/drivers/vault-sops.ts +0 -271
@@ -2,7 +2,7 @@
2
2
  * Vault element — protected knowledge.
3
3
  *
4
4
  * Physics: secrets · config · environment.
5
- * Drivers: `sops` (Typage/age) · `env` · `openbao` · `infisical` · `managed`.
5
+ * Drivers: `env` · `openbao` · `infisical` · `managed`.
6
6
  *
7
7
  * A declaration is a contract, never a value. Boot validates every contract
8
8
  * and lists all gaps at once. Logs/traces receive fingerprints and redaction
@@ -12,15 +12,12 @@
12
12
 
13
13
  export {
14
14
  vault,
15
- fromStack,
16
- FROM_STACK_PREFIX,
17
- isFromStack,
18
- fromStackRole,
19
- } from "./vault/declare.ts";
20
- export type {
21
- VaultSecretDecl,
22
- VaultSecretOptions,
15
+ fromDocker,
16
+ FROM_DOCKER_PREFIX,
17
+ isFromDocker,
18
+ fromDockerRole,
23
19
  } from "./vault/declare.ts";
20
+ export type { VaultSecretDecl, VaultSecretOptions } from "./vault/declare.ts";
24
21
 
25
22
  export {
26
23
  createVaultRuntime,
@@ -37,9 +34,8 @@ export type {
37
34
  VaultRuntime,
38
35
  } from "./vault/runtime.ts";
39
36
 
40
- export {
41
- fingerprintSecret,
42
- fingerprintSecretSync,
43
- } from "./vault/fingerprint.ts";
37
+ export { COMPOSE_ENV_REL, resolveComposeEnvPath } from "./vault/chain.ts";
38
+
39
+ export { fingerprintSecret, fingerprintSecretSync } from "./vault/fingerprint.ts";
44
40
 
45
41
  export { createSecretRedactor } from "./vault/redact.ts";
package/src/index.ts CHANGED
@@ -56,11 +56,14 @@ export {
56
56
  id,
57
57
  now,
58
58
  defineTable,
59
+ field,
59
60
  createStoreRuntime,
60
61
  type StoreDecl,
61
62
  type StoreRuntime,
62
63
  type SqlStoreHandle,
63
64
  type TableHandle,
65
+ type SchemaTableDecl,
66
+ type SchemaColumnDecl,
64
67
  } from "./elements/store.ts";
65
68
 
66
69
  export {
@@ -98,8 +101,8 @@ export {
98
101
 
99
102
  export {
100
103
  vault,
101
- fromStack,
102
- FROM_STACK_PREFIX,
104
+ fromDocker,
105
+ FROM_DOCKER_PREFIX,
103
106
  createVaultRuntime,
104
107
  VaultBootError,
105
108
  SECRET_MASK,
@@ -68,17 +68,12 @@ export type ErrorDataOf<E extends FlowErrorMap> = {
68
68
  *
69
69
  * @typeParam F - Flow definition
70
70
  */
71
- export type RouteFromFlow<F> = F extends FlowDef<
72
- infer I,
73
- infer O,
74
- infer E,
75
- any,
76
- infer T
77
- >
78
- ? [T] extends [HttpTrigger<infer M, infer P>]
79
- ? AppFlowRoute<I, O, ErrorDataOf<E>, M, P>
80
- : AppFlowRoute<I, O, ErrorDataOf<E>>
81
- : never;
71
+ export type RouteFromFlow<F> =
72
+ F extends FlowDef<infer I, infer O, infer E, any, infer T>
73
+ ? [T] extends [HttpTrigger<infer M, infer P>]
74
+ ? AppFlowRoute<I, O, ErrorDataOf<E>, M, P>
75
+ : AppFlowRoute<I, O, ErrorDataOf<E>>
76
+ : never;
82
77
 
83
78
  /**
84
79
  * Map a flow namespace (`{ create, get, … }`) to a unit route table.
@@ -115,12 +110,11 @@ export type RoutesFromAdoptArg<A> = A extends AnyFlowDef
115
110
  *
116
111
  * @typeParam Args - Adopt argument tuple
117
112
  */
118
- export type RoutesFromAdoptArgs<Args extends readonly unknown[]> =
119
- Args extends readonly []
120
- ? {}
121
- : Args extends readonly [infer H, ...infer T]
122
- ? RoutesFromAdoptArg<H> & RoutesFromAdoptArgs<T>
123
- : {};
113
+ export type RoutesFromAdoptArgs<Args extends readonly unknown[]> = Args extends readonly []
114
+ ? {}
115
+ : Args extends readonly [infer H, ...infer T]
116
+ ? RoutesFromAdoptArg<H> & RoutesFromAdoptArgs<T>
117
+ : {};
124
118
 
125
119
  /** Runtime leaf: method/path when the flow has an HTTP trigger. */
126
120
  export interface RuntimeFlowRoute {
@@ -141,8 +135,7 @@ export type RuntimeRouteMap = {
141
135
  * @param flowDef - Flow definition
142
136
  */
143
137
  export function runtimeRouteFromFlow(flowDef: AnyFlowDef): RuntimeFlowRoute {
144
- const trigger: Trigger | undefined =
145
- flowDef.$trigger ?? flowDef.triggers[0];
138
+ const trigger: Trigger | undefined = flowDef.$trigger ?? flowDef.triggers[0];
146
139
  if (trigger?.kind === "http") {
147
140
  return { method: trigger.method, path: trigger.path };
148
141
  }
@@ -156,10 +149,7 @@ export function runtimeRouteFromFlow(flowDef: AnyFlowDef): RuntimeFlowRoute {
156
149
  * @param into - Mutable route map to extend
157
150
  * @returns Flows discovered (for `fx.call` registration)
158
151
  */
159
- export function accumulateAdoptArgs(
160
- args: readonly unknown[],
161
- into: RuntimeRouteMap,
162
- ): AnyFlowDef[] {
152
+ export function accumulateAdoptArgs(args: readonly unknown[], into: RuntimeRouteMap): AnyFlowDef[] {
163
153
  const found: AnyFlowDef[] = [];
164
154
 
165
155
  for (const arg of args) {
@@ -169,9 +159,7 @@ export function accumulateAdoptArgs(
169
159
  }
170
160
  if (typeof arg !== "object" || arg === null) continue;
171
161
 
172
- for (const [unit, value] of Object.entries(
173
- arg as Record<string, unknown>,
174
- )) {
162
+ for (const [unit, value] of Object.entries(arg as Record<string, unknown>)) {
175
163
  if (isFlow(value)) {
176
164
  // Flat `{ create: flow }` without a unit wrapper — skip client map
177
165
  found.push(value);
@@ -180,9 +168,7 @@ export function accumulateAdoptArgs(
180
168
  if (typeof value !== "object" || value === null) continue;
181
169
 
182
170
  const unitBag = into[unit] ?? (into[unit] = {});
183
- for (const [flowName, flowDef] of Object.entries(
184
- value as Record<string, unknown>,
185
- )) {
171
+ for (const [flowName, flowDef] of Object.entries(value as Record<string, unknown>)) {
186
172
  if (!isFlow(flowDef)) continue;
187
173
  found.push(flowDef);
188
174
  unitBag[flowName] = runtimeRouteFromFlow(flowDef);
package/src/kernel/app.ts CHANGED
@@ -32,10 +32,7 @@ import {
32
32
  type CreateAppAuthBindingOptions,
33
33
  } from "./auth-resolve.ts";
34
34
  import { runDurable } from "../elements/clock/durable.ts";
35
- import {
36
- isFlow,
37
- type AnyFlowDef,
38
- } from "./flow.ts";
35
+ import { isFlow, type AnyFlowDef } from "./flow.ts";
39
36
  import {
40
37
  createFxContext,
41
38
  resolveName,
@@ -65,7 +62,7 @@ import {
65
62
  isJournalSuspend,
66
63
  type JournalSession,
67
64
  } from "./journal.ts";
68
- import { listBindings, type Binding } from "./on.ts";
65
+ import { listBindings, resetBindings, type Binding } from "./on.ts";
69
66
  import {
70
67
  applyPrincipal,
71
68
  createElementPipelineHooks,
@@ -80,16 +77,8 @@ import {
80
77
  type AccumulateDecorations,
81
78
  } from "./plug.ts";
82
79
  import type { PluginCapabilities, PluginDef } from "./plugin.ts";
83
- import {
84
- createPluginRegistry,
85
- type PluginRegistry,
86
- } from "./registry.ts";
87
- import {
88
- createRouter,
89
- type Router,
90
- type RouterPreset,
91
- type SmartRouter,
92
- } from "./router.ts";
80
+ import { createPluginRegistry, type PluginRegistry } from "./registry.ts";
81
+ import { createRouter, type Router, type RouterPreset, type SmartRouter } from "./router.ts";
93
82
  import type {
94
83
  CdcTrigger,
95
84
  EveryTrigger,
@@ -113,8 +102,23 @@ export interface OkeOptions {
113
102
  * Default `true`.
114
103
  */
115
104
  readonly aot?: boolean;
116
- /** Extra bindings (in addition to the global {@link on} registry). */
105
+ /**
106
+ * Extra bindings. Combined with the global {@link on} registry unless
107
+ * {@link OkeOptions.registry} is `"ignore"` — then this is the only source.
108
+ */
117
109
  readonly bindings?: readonly Binding[];
110
+ /**
111
+ * How the global {@link on} registry is treated at construction.
112
+ *
113
+ * - `"consume"` (default) — adopt registered bindings, then clear the
114
+ * registry so a later {@link oke} in the same process cannot inherit
115
+ * this app's flows.
116
+ * - `"keep"` — adopt registered bindings and leave the registry intact
117
+ * (legacy behavior).
118
+ * - `"ignore"` — adopt only {@link OkeOptions.bindings}; the registry is
119
+ * neither read nor cleared (embedding / Console).
120
+ */
121
+ readonly registry?: "consume" | "keep" | "ignore";
118
122
  /** Base fx options applied to every invocation. */
119
123
  readonly fx?: Omit<CreateFxOptions, "flow" | "effects" | "capability">;
120
124
  /**
@@ -129,13 +133,13 @@ export interface OkeOptions {
129
133
  * subject key.
130
134
  */
131
135
  readonly archiveInputFields?: readonly string[];
132
- /** Active environment for {@link OkeApp.boot} (defaults to `dev`). */
136
+ /** Active environment for {@link OkeApp.boot} (defaults to `local`). */
133
137
  readonly env?: BootOptions["env"];
134
138
  /**
135
- * Local-server mode (`oke dev -s` / `OKE_STACK=1`) — force the `stack`
139
+ * Docker mode (`oke dev -d` / `OKE_DOCKER=1`) — force the `docker`
136
140
  * driver profile at boot.
137
141
  */
138
- readonly stack?: BootOptions["stack"];
142
+ readonly docker?: BootOptions["docker"];
139
143
  /** Optional `oke.config.ts` document consumed at boot. */
140
144
  readonly config?: BootOptions["config"];
141
145
  /** Pre-built element runtimes (skip construction at boot when present). */
@@ -209,9 +213,7 @@ export interface UnitHooks<D extends Record<string, unknown> = {}> {
209
213
  *
210
214
  * @param pluginDef - Plugin from {@link plugin}
211
215
  */
212
- plug<P extends PluginDef>(
213
- pluginDef: P,
214
- ): UnitHooks<AccumulateDecorations<D, P>>;
216
+ plug<P extends PluginDef>(pluginDef: P): UnitHooks<AccumulateDecorations<D, P>>;
215
217
  }
216
218
 
217
219
  /**
@@ -220,10 +222,7 @@ export interface UnitHooks<D extends Record<string, unknown> = {}> {
220
222
  * @typeParam D - Accumulated decoration types from app `.plug()`
221
223
  * @typeParam R - Accumulated client route map from `.adopt({ unit })`
222
224
  */
223
- export interface OkeApp<
224
- D extends Record<string, unknown> = {},
225
- R extends AppRouteMap = {},
226
- > {
225
+ export interface OkeApp<D extends Record<string, unknown> = {}, R extends AppRouteMap = {}> {
227
226
  /** App name. */
228
227
  readonly name: string;
229
228
  /** Whether AoT compilation is enabled. */
@@ -269,9 +268,7 @@ export interface OkeApp<
269
268
  *
270
269
  * @param pluginDef - Plugin from {@link plugin}
271
270
  */
272
- plug<P extends PluginDef>(
273
- pluginDef: P,
274
- ): OkeApp<AccumulateDecorations<D, P>, R>;
271
+ plug<P extends PluginDef>(pluginDef: P): OkeApp<AccumulateDecorations<D, P>, R>;
275
272
  /**
276
273
  * Captured plugin capabilities for the Manifest.
277
274
  */
@@ -357,10 +354,7 @@ export interface OkeApp<
357
354
  * @param signal - Signal name or handle
358
355
  * @param payload - Payload
359
356
  */
360
- dispatchSignal(
361
- signal: NamedRef,
362
- payload?: unknown,
363
- ): Promise<ExecuteResult[]>;
357
+ dispatchSignal(signal: NamedRef, payload?: unknown): Promise<ExecuteResult[]>;
364
358
  /**
365
359
  * Invoke all flows bound to an `every` interval.
366
360
  *
@@ -374,11 +368,7 @@ export interface OkeApp<
374
368
  * @param payload - before/after
375
369
  * @param column - Optional column filter
376
370
  */
377
- dispatchCdc(
378
- tableName: string,
379
- payload: CdcPayload,
380
- column?: string,
381
- ): Promise<ExecuteResult[]>;
371
+ dispatchCdc(tableName: string, payload: CdcPayload, column?: string): Promise<ExecuteResult[]>;
382
372
  /**
383
373
  * Call a flow by name/handle (same path as `fx.call`).
384
374
  *
@@ -408,10 +398,12 @@ export interface OkeApp<
408
398
  */
409
399
  export function oke(options: OkeOptions): OkeApp {
410
400
  const aot = options.aot !== false;
411
- const adopted: Binding[] = [
412
- ...listBindings(),
413
- ...(options.bindings ?? []),
414
- ];
401
+ const registry = options.registry ?? "consume";
402
+ const adopted: Binding[] =
403
+ registry === "ignore"
404
+ ? [...(options.bindings ?? [])]
405
+ : [...listBindings(), ...(options.bindings ?? [])];
406
+ if (registry === "consume") resetBindings();
415
407
  /** Retained for test harness / boot merges. */
416
408
  const $options = options;
417
409
 
@@ -459,7 +451,7 @@ export function oke(options: OkeOptions): OkeApp {
459
451
  // --- boot (vault → store → signal → clock → channel → AI → runs → caps) ---
460
452
  let bootResult: BootResult | undefined;
461
453
  let bootPromise: Promise<BootResult> | undefined;
462
- let bootEnv: BootOptions["env"] = options.env ?? "dev";
454
+ let bootEnv: BootOptions["env"] = options.env ?? "local";
463
455
  let authBinding: AppAuthBinding | undefined =
464
456
  options.auth !== undefined
465
457
  ? createAppAuthBinding({
@@ -490,10 +482,10 @@ export function oke(options: OkeOptions): OkeApp {
490
482
 
491
483
  async function doBoot(overrides?: Partial<BootOptions>): Promise<BootResult> {
492
484
  const { bootApplication } = await import("./boot.ts");
493
- bootEnv = overrides?.env ?? options.env ?? "dev";
485
+ bootEnv = overrides?.env ?? options.env ?? "local";
494
486
  const merged: BootOptions = {
495
487
  env: bootEnv,
496
- stack: overrides?.stack ?? options.stack,
488
+ docker: overrides?.docker ?? options.docker,
497
489
  config: overrides?.config ?? options.config,
498
490
  elements: overrides?.elements ?? options.elements,
499
491
  secrets: overrides?.secrets ?? options.secrets,
@@ -508,8 +500,7 @@ export function oke(options: OkeOptions): OkeApp {
508
500
  now: overrides?.now ?? options.fx?.now,
509
501
  instanceId: overrides?.instanceId,
510
502
  startScheduler: overrides?.startScheduler ?? options.startScheduler,
511
- schedulerIntervalMs:
512
- overrides?.schedulerIntervalMs ?? options.schedulerIntervalMs,
503
+ schedulerIntervalMs: overrides?.schedulerIntervalMs ?? options.schedulerIntervalMs,
513
504
  bindings: adopted,
514
505
  flows: [...flowsByName.values()],
515
506
  onCronFire: overrides?.onCronFire ?? handleCronFire,
@@ -542,9 +533,7 @@ export function oke(options: OkeOptions): OkeApp {
542
533
  return bootPromise;
543
534
  }
544
535
 
545
- function isRunsRuntimeLike(
546
- value: OkeOptions["runs"],
547
- ): value is RunsRuntime {
536
+ function isRunsRuntimeLike(value: OkeOptions["runs"]): value is RunsRuntime {
548
537
  return (
549
538
  typeof value === "object" &&
550
539
  value !== null &&
@@ -570,20 +559,11 @@ export function oke(options: OkeOptions): OkeApp {
570
559
 
571
560
  const booted = await ensureBoot();
572
561
 
573
- const unitBag =
574
- flowDef.unit !== undefined ? unitHooks.get(flowDef.unit) : undefined;
562
+ const unitBag = flowDef.unit !== undefined ? unitHooks.get(flowDef.unit) : undefined;
575
563
  // app (hooks + plugs) → unit (hooks + plugs) → flow (hooks + plugs)
576
564
  const composedHooks = mergeHooks(
577
- mergeHooks(
578
- appHooks,
579
- pluginRegistry.hooksAt("app", flowDef.unit, flowDef.name),
580
- undefined,
581
- ),
582
- mergeHooks(
583
- unitBag,
584
- pluginRegistry.hooksAt("unit", flowDef.unit, flowDef.name),
585
- undefined,
586
- ),
565
+ mergeHooks(appHooks, pluginRegistry.hooksAt("app", flowDef.unit, flowDef.name), undefined),
566
+ mergeHooks(unitBag, pluginRegistry.hooksAt("unit", flowDef.unit, flowDef.name), undefined),
587
567
  mergeHooks(
588
568
  flowDef.hooks as HookMap,
589
569
  pluginRegistry.hooksAt("flow", flowDef.unit, flowDef.name),
@@ -591,10 +571,7 @@ export function oke(options: OkeOptions): OkeApp {
591
571
  ),
592
572
  );
593
573
 
594
- const decorations = pluginRegistry.decorationsFor(
595
- flowDef.unit,
596
- flowDef.name,
597
- );
574
+ const decorations = pluginRegistry.decorationsFor(flowDef.unit, flowDef.name);
598
575
 
599
576
  const ctx: InvocationContext = {
600
577
  trigger,
@@ -631,10 +608,7 @@ export function oke(options: OkeOptions): OkeApp {
631
608
  // a real HTTP request in production mode.
632
609
  const testMode = bootEnv === "test";
633
610
  if (testMode) {
634
- applyPrincipal(
635
- principals,
636
- extras?.auth as ResolvedPrincipal | undefined,
637
- );
611
+ applyPrincipal(principals, extras?.auth as ResolvedPrincipal | undefined);
638
612
  applyPrincipal(principals, extras?.principal);
639
613
  if (extras?.operator) principals.operator.id = extras.operator.id;
640
614
  }
@@ -645,9 +619,7 @@ export function oke(options: OkeOptions): OkeApp {
645
619
  principals,
646
620
  telemetry,
647
621
  allowTestPrincipals: testMode,
648
- verifyBearer: binding
649
- ? (token) => verifyBearerToken(binding, token)
650
- : undefined,
622
+ verifyBearer: binding ? (token) => verifyBearerToken(binding, token) : undefined,
651
623
  });
652
624
 
653
625
  // Element hooks run first in the app-level onAuth/beforeHandle chain —
@@ -675,9 +647,7 @@ export function oke(options: OkeOptions): OkeApp {
675
647
  effects: flowDef.effects,
676
648
  runTelemetry: telemetry,
677
649
  now,
678
- ...(principals
679
- ? { auth: principals.auth as FxAuth, operator: principals.operator }
680
- : {}),
650
+ ...(principals ? { auth: principals.auth as FxAuth, operator: principals.operator } : {}),
681
651
  ...(capability ? { capability } : {}),
682
652
  ...(booted
683
653
  ? {
@@ -704,29 +674,37 @@ export function oke(options: OkeOptions): OkeApp {
704
674
 
705
675
  const alreadyValidated = extras?.validated === true;
706
676
 
707
- const result = await runPipeline(ctx, fx, hooks, async () => {
708
- try {
709
- if (!alreadyValidated) {
710
- const parsed = await validate(flowDef.in, ctx.input);
711
- if (!parsed.ok) return parsed.failure;
712
- ctx.input = parsed.value;
713
- return await flowDef.do(parsed.value as never, fx);
714
- }
715
- return await flowDef.do(ctx.input as never, fx);
716
- } catch (err) {
717
- // A durable sleep that has not yet elapsed suspends the run — this
718
- // is a park, not a pipeline failure, so it must not throw upward.
719
- if (flowDef.durable && journalSession && isJournalSuspend(err)) {
720
- ctx.state.sleeping = {
721
- wakeAt: err.wakeAt,
722
- label: err.label,
723
- runId: journalSession.runId,
724
- };
725
- return undefined;
677
+ const result = await runPipeline(
678
+ ctx,
679
+ fx,
680
+ hooks,
681
+ async () => {
682
+ try {
683
+ if (!alreadyValidated) {
684
+ const parsed = await validate(flowDef.in, ctx.input);
685
+ if (!parsed.ok) return parsed.failure;
686
+ ctx.input = parsed.value;
687
+ return await flowDef.do(parsed.value as never, fx);
688
+ }
689
+ return await flowDef.do(ctx.input as never, fx);
690
+ } catch (err) {
691
+ // A durable sleep that has not yet elapsed suspends the run — this
692
+ // is a park, not a pipeline failure, so it must not throw upward.
693
+ if (flowDef.durable && journalSession && isJournalSuspend(err)) {
694
+ ctx.state.sleeping = {
695
+ wakeAt: err.wakeAt,
696
+ label: err.label,
697
+ runId: journalSession.runId,
698
+ };
699
+ return undefined;
700
+ }
701
+ throw err;
726
702
  }
727
- throw err;
728
- }
729
- });
703
+ },
704
+ // HTTP flows serialize before `onResponse` so the last stage can see
705
+ // and replace the final response (plugin header/middleware surfaces).
706
+ trigger.kind === "http" ? encodeExecuteResult : undefined,
707
+ );
730
708
 
731
709
  const endedAt = now();
732
710
 
@@ -750,13 +728,9 @@ export function oke(options: OkeOptions): OkeApp {
750
728
  }
751
729
 
752
730
  const runsRuntime =
753
- booted?.runs ??
754
- (isRunsRuntimeLike(options.runs) ? options.runs : undefined);
731
+ booted?.runs ?? (isRunsRuntimeLike(options.runs) ? options.runs : undefined);
755
732
  if (runsRuntime) {
756
- const archiveCleartext = archiveFromInput(
757
- ctx.input,
758
- options.archiveInputFields,
759
- );
733
+ const archiveCleartext = archiveFromInput(ctx.input, options.archiveInputFields);
760
734
  await runsRuntime.record(
761
735
  {
762
736
  flow: flowDef,
@@ -936,8 +910,7 @@ export function oke(options: OkeOptions): OkeApp {
936
910
  if (parts.length >= 2) {
937
911
  const [unit, ...flowParts] = parts;
938
912
  const flowName = flowParts.join("/");
939
- const target =
940
- flowsByName.get(`${unit}.${flowName}`) ?? flowsByName.get(flowName);
913
+ const target = flowsByName.get(`${unit}.${flowName}`) ?? flowsByName.get(flowName);
941
914
  if (!target) {
942
915
  return respond(new Response("Not Found", { status: 404 }));
943
916
  }
@@ -960,6 +933,12 @@ export function oke(options: OkeOptions): OkeApp {
960
933
 
961
934
  const matched = router.match(method, url.pathname);
962
935
  if (!matched) {
936
+ // Plugin edge handlers answer requests no flow owns (e.g. CORS
937
+ // preflight for a path bound to another method) — first Response wins.
938
+ for (const handle of pluginRegistry.edgeHandlers()) {
939
+ const edgeResponse = await handle(request, { method, path: url.pathname });
940
+ if (edgeResponse !== undefined) return respond(edgeResponse);
941
+ }
963
942
  return respond(new Response("Not Found", { status: 404 }));
964
943
  }
965
944
  const { value: binding, params } = matched;
@@ -986,12 +965,11 @@ export function oke(options: OkeOptions): OkeApp {
986
965
  input = undefined;
987
966
  }
988
967
 
989
- const result = await execute(
990
- binding.flow,
991
- input,
992
- binding.trigger,
993
- { request, params, validated },
994
- );
968
+ const result = await execute(binding.flow, input, binding.trigger, {
969
+ request,
970
+ params,
971
+ validated,
972
+ });
995
973
 
996
974
  return respond(encodeExecuteResult(result));
997
975
  },
@@ -1000,9 +978,7 @@ export function oke(options: OkeOptions): OkeApp {
1000
978
  const results: ExecuteResult[] = [];
1001
979
  for (const b of adopted) {
1002
980
  if (b.trigger.kind === "signal" && b.trigger.name === name) {
1003
- results.push(
1004
- await execute(b.flow, payload, b.trigger as SignalAsTrigger),
1005
- );
981
+ results.push(await execute(b.flow, payload, b.trigger as SignalAsTrigger));
1006
982
  }
1007
983
  }
1008
984
  return results;
@@ -1011,9 +987,7 @@ export function oke(options: OkeOptions): OkeApp {
1011
987
  const results: ExecuteResult[] = [];
1012
988
  for (const b of adopted) {
1013
989
  if (b.trigger.kind === "every" && b.trigger.interval === interval) {
1014
- results.push(
1015
- await execute(b.flow, undefined, b.trigger as EveryTrigger),
1016
- );
990
+ results.push(await execute(b.flow, undefined, b.trigger as EveryTrigger));
1017
991
  }
1018
992
  }
1019
993
  return results;
@@ -36,9 +36,7 @@ export interface CreateAppAuthBindingOptions {
36
36
  *
37
37
  * @param options - Secret + optional session store / clock
38
38
  */
39
- export function createAppAuthBinding(
40
- options: CreateAppAuthBindingOptions,
41
- ): AppAuthBinding {
39
+ export function createAppAuthBinding(options: CreateAppAuthBindingOptions): AppAuthBinding {
42
40
  return {
43
41
  secret: options.secret,
44
42
  sessions: options.sessions ?? createSessionStore(),
@@ -57,12 +55,7 @@ export async function verifyBearerToken(
57
55
  auth: AppAuthBinding,
58
56
  token: string,
59
57
  ): Promise<ResolvedPrincipal> {
60
- const claims = await verifyAccess(
61
- auth.sessions,
62
- auth.secret,
63
- token,
64
- auth.now,
65
- );
58
+ const claims = await verifyAccess(auth.sessions, auth.secret, token, auth.now);
66
59
  return claimsToPrincipal(claims);
67
60
  }
68
61
 
@@ -3,10 +3,7 @@
3
3
  */
4
4
 
5
5
  import { mockAiDriver } from "../../drivers/ai-mock.ts";
6
- import {
7
- createAiRuntime,
8
- type AiRuntime,
9
- } from "../../elements/ai.ts";
6
+ import { createAiRuntime, type AiRuntime } from "../../elements/ai.ts";
10
7
  import type { GateRuntime } from "../../elements/gate.ts";
11
8
  import type { BootOptions } from "../boot.ts";
12
9
 
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Channel binder — profile selection + SMTP env parsing.
3
+ */
4
+
5
+ import { afterEach, describe, expect, test } from "bun:test";
6
+ import { resolveEmailDriverId, smtpOptionsFromEnv } from "./channel.ts";
7
+
8
+ const previous = {
9
+ url: process.env.SMTP_URL,
10
+ user: process.env.SMTP_USER,
11
+ password: process.env.SMTP_PASSWORD,
12
+ okeUrl: process.env.OKE_CHANNEL_EMAIL_URL,
13
+ };
14
+
15
+ afterEach(() => {
16
+ restoreEnv("SMTP_URL", previous.url);
17
+ restoreEnv("SMTP_USER", previous.user);
18
+ restoreEnv("SMTP_PASSWORD", previous.password);
19
+ restoreEnv("OKE_CHANNEL_EMAIL_URL", previous.okeUrl);
20
+ });
21
+
22
+ describe("bindChannel driver resolution", () => {
23
+ const options = {
24
+ config: {
25
+ drivers: {
26
+ channel: {
27
+ email: { local: "console", docker: "smtp", test: "console", prod: "smtp" },
28
+ },
29
+ },
30
+ },
31
+ };
32
+
33
+ test("uses console locally and smtp in docker", () => {
34
+ expect(resolveEmailDriverId(options, "local", false)).toBe("console");
35
+ expect(resolveEmailDriverId(options, "docker", true)).toBe("smtp");
36
+ });
37
+
38
+ test("parses SMTP_URL and optional auth overrides", () => {
39
+ process.env.SMTP_URL = "smtp://url-user:url-pass@127.0.0.1:20975";
40
+ process.env.SMTP_USER = "override-user";
41
+ process.env.SMTP_PASSWORD = "override-pass";
42
+ expect(smtpOptionsFromEnv(true)).toEqual({
43
+ host: "127.0.0.1",
44
+ port: 20975,
45
+ user: "override-user",
46
+ pass: "override-pass",
47
+ });
48
+ });
49
+
50
+ test("missing SMTP_URL includes docker recovery hint", () => {
51
+ delete process.env.SMTP_URL;
52
+ delete process.env.OKE_CHANNEL_EMAIL_URL;
53
+ expect(() => smtpOptionsFromEnv(true)).toThrow("docker/.env.docker");
54
+ });
55
+ });
56
+
57
+ function restoreEnv(key: string, value: string | undefined): void {
58
+ if (value === undefined) delete process.env[key];
59
+ else process.env[key] = value;
60
+ }