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
@@ -22,43 +22,19 @@
22
22
  */
23
23
 
24
24
  import type { ConfigEnv, OkeConfig } from "../config/index.ts";
25
- import type {
26
- AiRuntime,
27
- CreateAiRuntimeOptions,
28
- } from "../elements/ai.ts";
29
- import type {
30
- ChannelRuntime,
31
- CreateChannelRuntimeOptions,
32
- } from "../elements/channel.ts";
33
- import type {
34
- ClockDecl,
35
- ClockRuntime,
36
- } from "../elements/clock.ts";
37
- import type {
38
- GateDecl,
39
- GateRuntime,
40
- } from "../elements/gate.ts";
41
- import type {
42
- SignalDecl,
43
- SignalRuntime,
44
- } from "../elements/signal.ts";
45
- import type {
46
- StoreDecl,
47
- StoreRuntime,
48
- } from "../elements/store.ts";
25
+ import type { AiRuntime, CreateAiRuntimeOptions } from "../elements/ai.ts";
26
+ import type { ChannelRuntime, CreateChannelRuntimeOptions } from "../elements/channel.ts";
27
+ import type { ClockDecl, ClockRuntime } from "../elements/clock.ts";
28
+ import type { GateDecl, GateRuntime } from "../elements/gate.ts";
29
+ import type { SignalDecl, SignalRuntime } from "../elements/signal.ts";
30
+ import type { StoreDecl, StoreRuntime } from "../elements/store.ts";
49
31
  import type {
50
32
  CreateVaultRuntimeOptions,
51
33
  VaultRuntime,
52
34
  VaultSecretDecl,
53
35
  } from "../elements/vault.ts";
54
- import type {
55
- CreateRunsRuntimeOptions,
56
- RunsRuntime,
57
- } from "../runs/index.ts";
58
- import {
59
- createCapabilityToken,
60
- type CapabilityToken,
61
- } from "./capability.ts";
36
+ import type { CreateRunsRuntimeOptions, RunsRuntime } from "../runs/index.ts";
37
+ import { createCapabilityToken, type CapabilityToken } from "./capability.ts";
62
38
  import type { AnyFlowDef } from "./flow.ts";
63
39
  import type { Binding } from "./on.ts";
64
40
 
@@ -77,16 +53,16 @@ export interface ElementRuntimes {
77
53
  /** Declarations + options consumed by {@link bootApplication}. */
78
54
  export interface BootOptions {
79
55
  /**
80
- * Active environment (defaults to `dev`, or `stack` when
81
- * {@link stack} / `OKE_STACK=1`).
56
+ * Active environment (defaults to `local`, or `docker` when
57
+ * {@link docker} / `OKE_DOCKER=1`).
82
58
  */
83
59
  readonly env?: ConfigEnv;
84
60
  /**
85
- * Local-server mode (`oke dev -s` / `OKE_STACK=1`): force driver maps to the
86
- * `stack` profile and prefer compose URLs (`.env.stack`).
87
- * When unset, derived from `process.env.OKE_STACK`.
61
+ * Docker mode (`oke dev -d` / `OKE_DOCKER=1`): force driver maps to the
62
+ * `docker` profile and prefer compose URLs (`docker/.env.docker`).
63
+ * When unset, derived from `process.env.OKE_DOCKER`.
88
64
  */
89
- readonly stack?: boolean;
65
+ readonly docker?: boolean;
90
66
  /** Optional `oke.config.ts` document. */
91
67
  readonly config?: OkeConfig;
92
68
  /** Pre-built runtimes (skip construction when present). */
@@ -127,10 +103,7 @@ export interface BootOptions {
127
103
  * @param signal - Signal name
128
104
  * @param payload - Payload
129
105
  */
130
- readonly onSignal?: (
131
- signal: string,
132
- payload: unknown,
133
- ) => void | Promise<void>;
106
+ readonly onSignal?: (signal: string, payload: unknown) => void | Promise<void>;
134
107
  /** Injectable clock for test / frozen harnesses. */
135
108
  readonly now?: () => number;
136
109
  /** Instance id for leader election. */
@@ -185,8 +158,7 @@ export interface ElementNeeds {
185
158
  export function resolveElementNeeds(options: BootOptions): ElementNeeds {
186
159
  const pre = options.elements ?? {};
187
160
  let vault =
188
- pre.vault !== undefined ||
189
- (options.vault?.secrets ?? options.secrets ?? []).length > 0;
161
+ pre.vault !== undefined || (options.vault?.secrets ?? options.secrets ?? []).length > 0;
190
162
  let store = pre.store !== undefined || (options.stores?.length ?? 0) > 0;
191
163
  let signal = pre.signal !== undefined || (options.signals?.length ?? 0) > 0;
192
164
  let clock = pre.clock !== undefined || (options.clocks?.length ?? 0) > 0;
@@ -224,10 +196,7 @@ export function resolveElementNeeds(options: BootOptions): ElementNeeds {
224
196
 
225
197
  // AI agents share the gate runtime for tool checks.
226
198
  if (ai) gate = true;
227
- if (
228
- options.onSignal &&
229
- (options.bindings ?? []).some((b) => b.trigger.kind === "signal")
230
- ) {
199
+ if (options.onSignal && (options.bindings ?? []).some((b) => b.trigger.kind === "signal")) {
231
200
  signal = true;
232
201
  }
233
202
 
@@ -251,15 +220,12 @@ async function loadBind<T>(name: string): Promise<T> {
251
220
  *
252
221
  * @param options - Declarations, config, pre-built runtimes
253
222
  */
254
- export async function bootApplication(
255
- input: BootOptions = {},
256
- ): Promise<BootResult> {
257
- const stack =
258
- input.stack === true ||
259
- (input.stack !== false && process.env.OKE_STACK === "1");
260
- // `-s` always selects the `stack` driver profile — not a mix of test/dev +
223
+ export async function bootApplication(input: BootOptions = {}): Promise<BootResult> {
224
+ const docker =
225
+ input.docker === true || (input.docker !== false && process.env.OKE_DOCKER === "1");
226
+ // `-d` always selects the `docker` driver profile — not a mix of test/local +
261
227
  // prod store overrides (templates often pin `env: "test"` for harnesses).
262
- const env: ConfigEnv = stack ? "stack" : (input.env ?? "dev");
228
+ const env: ConfigEnv = docker ? "docker" : (input.env ?? "local");
263
229
  let config = input.config;
264
230
  if (config === undefined) {
265
231
  try {
@@ -269,7 +235,7 @@ export async function bootApplication(
269
235
  config = undefined;
270
236
  }
271
237
  }
272
- const options: BootOptions = { ...input, config, env, stack };
238
+ const options: BootOptions = { ...input, config, env, docker };
273
239
  const pre = options.elements ?? {};
274
240
  const now = options.now ?? (() => Date.now());
275
241
  const needs = resolveElementNeeds(options);
@@ -278,9 +244,7 @@ export async function bootApplication(
278
244
  let vault = pre.vault;
279
245
  if (needs.vault) {
280
246
  if (!vault) {
281
- const { bindVault } = await loadBind<
282
- typeof import("./boot-bind/vault.ts")
283
- >("vault");
247
+ const { bindVault } = await loadBind<typeof import("./boot-bind/vault.ts")>("vault");
284
248
  vault = await bindVault(options, env);
285
249
  } else if (!vault.booted) {
286
250
  await vault.boot();
@@ -347,11 +311,7 @@ export async function bootApplication(
347
311
  }),
348
312
  );
349
313
  }
350
- if (
351
- needs.runs &&
352
- !pre.runs &&
353
- !(options.runs && isRunsRuntime(options.runs))
354
- ) {
314
+ if (needs.runs && !pre.runs && !(options.runs && isRunsRuntime(options.runs))) {
355
315
  binderLoads.push(
356
316
  loadBind<RunsBind>("runs").then((m) => {
357
317
  runsBind = m;
@@ -364,7 +324,7 @@ export async function bootApplication(
364
324
  let store = pre.store;
365
325
  if (needs.store) {
366
326
  if (!store) {
367
- store = storeBind!.bindStore(options, env, now, stack);
327
+ store = storeBind!.bindStore(options, env, now, docker);
368
328
  } else {
369
329
  for (const decl of options.stores ?? []) {
370
330
  store.register?.(decl);
@@ -414,7 +374,7 @@ export async function bootApplication(
414
374
  // 5. Channel
415
375
  let channel = pre.channel;
416
376
  if (needs.channel && !channel) {
417
- channel = channelBind!.bindChannel(options, now);
377
+ channel = channelBind!.bindChannel(options, env, now, docker);
418
378
  }
419
379
 
420
380
  // 6. AI
@@ -431,10 +391,7 @@ export async function bootApplication(
431
391
  runs = options.runs;
432
392
  if (!runs.store) await runs.open();
433
393
  } else {
434
- const runsOpts =
435
- options.runs && !isRunsRuntime(options.runs)
436
- ? options.runs
437
- : undefined;
394
+ const runsOpts = options.runs && !isRunsRuntime(options.runs) ? options.runs : undefined;
438
395
  runs = await runsBind!.bindRuns(runsOpts);
439
396
  }
440
397
  } else if (!runs.store) {
@@ -479,9 +436,7 @@ export async function bootApplication(
479
436
  *
480
437
  * @param flows - Adopted flows
481
438
  */
482
- export function mintCapabilities(
483
- flows: readonly AnyFlowDef[],
484
- ): Map<string, CapabilityToken> {
439
+ export function mintCapabilities(flows: readonly AnyFlowDef[]): Map<string, CapabilityToken> {
485
440
  const map = new Map<string, CapabilityToken>();
486
441
  for (const f of flows) {
487
442
  map.set(f.name, createCapabilityToken(f.name, f.effects));
@@ -489,9 +444,7 @@ export function mintCapabilities(
489
444
  return map;
490
445
  }
491
446
 
492
- function isRunsRuntime(
493
- value: RunsRuntime | CreateRunsRuntimeOptions,
494
- ): value is RunsRuntime {
447
+ function isRunsRuntime(value: RunsRuntime | CreateRunsRuntimeOptions): value is RunsRuntime {
495
448
  return (
496
449
  typeof value === "object" &&
497
450
  value !== null &&
@@ -10,9 +10,7 @@ import { measureKernelEdgeGzipBytes } from "../release/measure.ts";
10
10
  describe("kernel edge bundle budget", () => {
11
11
  test(`edge profile < ${KERNEL_EDGE_BUDGET_BYTES} bytes gzipped`, async () => {
12
12
  const size = await measureKernelEdgeGzipBytes();
13
- console.log(
14
- `kernel edge gzip=${size} budget=${KERNEL_EDGE_BUDGET_BYTES}`,
15
- );
13
+ console.log(`kernel edge gzip=${size} budget=${KERNEL_EDGE_BUDGET_BYTES}`);
16
14
  expect(size).toBeGreaterThan(0);
17
15
  expect(size).toBeLessThan(KERNEL_EDGE_BUDGET_BYTES);
18
16
  });
@@ -11,9 +11,7 @@ import type { EffectKind } from "./effects.ts";
11
11
  import { OKE_ERRORS, throwOke } from "./errors.ts";
12
12
 
13
13
  /** Maps effect kind → the undeclared-access registry key. */
14
- const UNDECLARED_KEY: Readonly<
15
- Record<EffectKind, keyof typeof OKE_ERRORS>
16
- > = {
14
+ const UNDECLARED_KEY: Readonly<Record<EffectKind, keyof typeof OKE_ERRORS>> = {
17
15
  read: "UNDECLARED_READ",
18
16
  write: "UNDECLARED_WRITE",
19
17
  emit: "UNDECLARED_EMIT",
@@ -24,9 +22,7 @@ const UNDECLARED_KEY: Readonly<
24
22
  };
25
23
 
26
24
  /** Maps effect kind → the corresponding `Effects` field. */
27
- const EFFECTS_FIELD: Readonly<
28
- Record<EffectKind, keyof Effects>
29
- > = {
25
+ const EFFECTS_FIELD: Readonly<Record<EffectKind, keyof Effects>> = {
30
26
  read: "reads",
31
27
  write: "writes",
32
28
  emit: "emits",
@@ -72,10 +68,7 @@ export interface CapabilityToken {
72
68
  * @param flow - Flow id (used in error messages)
73
69
  * @param declared - Declared effect surface, or `undefined` for open
74
70
  */
75
- export function createCapabilityToken(
76
- flow: string,
77
- declared?: Effects,
78
- ): CapabilityToken {
71
+ export function createCapabilityToken(flow: string, declared?: Effects): CapabilityToken {
79
72
  const open = declared === undefined;
80
73
  const effects = declared ?? {};
81
74
  const sets: Record<EffectKind, ReadonlySet<string>> = {
@@ -1,9 +1,6 @@
1
1
  import { describe, expect, test } from "bun:test";
2
2
  import type { ChannelRuntime } from "../elements/channel/runtime.ts";
3
- import {
4
- isDryRun,
5
- withDryRun,
6
- } from "./dry-run.ts";
3
+ import { isDryRun, withDryRun } from "./dry-run.ts";
7
4
  import { createFx, type FxStubStoreHandle } from "./fx.ts";
8
5
 
9
6
  describe("fx dry-run stubbing", () => {
@@ -94,10 +94,7 @@ export function setDryRunMessageId(messageId: string): void {
94
94
  * @param kind - Irreversible kind
95
95
  * @param resource - Template / prompt name
96
96
  */
97
- export function recordWouldHaveFired(
98
- kind: "send" | "ask",
99
- resource: string,
100
- ): void {
97
+ export function recordWouldHaveFired(kind: "send" | "ask", resource: string): void {
101
98
  const ctx = storage.getStore();
102
99
  if (!ctx) return;
103
100
  ctx.wouldHaveFired.push({
@@ -115,19 +112,14 @@ export function recordWouldHaveFired(
115
112
  * @param ref - Store resource ref (`sql:inventory`, …)
116
113
  * @param table - Live in-memory table Map
117
114
  */
118
- export function touchDryRunStore(
119
- ref: string,
120
- table: Map<string, unknown>,
121
- ): void {
115
+ export function touchDryRunStore(ref: string, table: Map<string, unknown>): void {
122
116
  const ctx = storage.getStore();
123
117
  if (!ctx) return;
124
118
  if (ctx.storeSnapshots.has(ref)) return;
125
119
  ctx.storeRefs.set(ref, table);
126
120
  ctx.storeSnapshots.set(
127
121
  ref,
128
- new Map(
129
- [...table.entries()].map(([k, v]) => [k, structuredClone(v)]),
130
- ),
122
+ new Map([...table.entries()].map(([k, v]) => [k, structuredClone(v)])),
131
123
  );
132
124
  }
133
125
 
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Plugin edge handlers — the contribution that answers HTTP requests no
3
+ * flow owns (CORS preflight being the prime example), with the plain 404
4
+ * preserved as the floor.
5
+ */
6
+
7
+ import { beforeEach, describe, expect, test } from "bun:test";
8
+ import { oke } from "./app.ts";
9
+ import { flow, resetFlowSeq } from "./flow.ts";
10
+ import { on, resetBindings } from "./on.ts";
11
+ import { plugin } from "./plugin.ts";
12
+ import { createPluginRegistry } from "./registry.ts";
13
+ import { http } from "./triggers.ts";
14
+
15
+ beforeEach(() => {
16
+ resetBindings();
17
+ resetFlowSeq();
18
+ });
19
+
20
+ describe("plugin edge handlers", () => {
21
+ test("an edge handler answers an unmatched request; the flow still owns matched ones", async () => {
22
+ on(http.get("/x"), flow({ name: "x.get", do: () => ({ ok: true }) }));
23
+ const edge = plugin("edge-test", { version: "0.0.1" }).edge((_request, info) => {
24
+ if (info.method === "OPTIONS") {
25
+ return new Response(null, { status: 204, headers: { "x-edge": "yes" } });
26
+ }
27
+ return undefined;
28
+ });
29
+ const app = oke({ name: "edge" }).plug(edge);
30
+
31
+ const preflight = await app.fetch(new Request("http://localhost/x", { method: "OPTIONS" }));
32
+ expect(preflight.status).toBe(204);
33
+ expect(preflight.headers.get("x-edge")).toBe("yes");
34
+
35
+ const matched = await app.fetch(new Request("http://localhost/x"));
36
+ expect(matched.status).toBe(200);
37
+ expect(matched.headers.get("x-edge")).toBeNull();
38
+ });
39
+
40
+ test("returning undefined falls through to the next handler, then the plain 404", async () => {
41
+ const pass = plugin("edge-pass", { version: "0.0.1" }).edge(() => undefined);
42
+ const answer = plugin("edge-answer", { version: "0.0.1" }).edge(
43
+ () => new Response("answered", { status: 418 }),
44
+ );
45
+ const app = oke({ name: "edge-order" }).plug(pass).plug(answer);
46
+
47
+ const res = await app.fetch(new Request("http://localhost/nowhere", { method: "OPTIONS" }));
48
+ expect(res.status).toBe(418);
49
+ expect(await res.text()).toBe("answered");
50
+
51
+ const noPlugins = oke({ name: "edge-none" });
52
+ const missing = await noPlugins.fetch(
53
+ new Request("http://localhost/nowhere", { method: "OPTIONS" }),
54
+ );
55
+ expect(missing.status).toBe(404);
56
+ expect(await missing.text()).toBe("Not Found");
57
+ });
58
+
59
+ test("edge is recorded as an intercept capability", () => {
60
+ const registry = createPluginRegistry();
61
+ const registration = registry.plug(
62
+ plugin("edge-cap", { version: "0.0.1" }).edge(() => undefined),
63
+ { kind: "app" },
64
+ );
65
+ expect(registration?.capabilities.intercepts).toContain("edge");
66
+ expect(registry.edgeHandlers()).toHaveLength(1);
67
+ });
68
+ });
@@ -46,11 +46,7 @@ describe("effects — ledger", () => {
46
46
  });
47
47
 
48
48
  expect(ledger.entries).toHaveLength(3);
49
- expect(ledger.entries.map((e) => e.kind)).toEqual([
50
- "read",
51
- "write",
52
- "emit",
53
- ]);
49
+ expect(ledger.entries.map((e) => e.kind)).toEqual(["read", "write", "emit"]);
54
50
  expect(ledger.entries[0]).toMatchObject({
55
51
  kind: "read",
56
52
  resource: "sql:bookings",
@@ -6,14 +6,7 @@
6
6
  */
7
7
 
8
8
  /** The seven load-bearing effect kinds (manifest `effects` keys, singular). */
9
- export type EffectKind =
10
- | "read"
11
- | "write"
12
- | "emit"
13
- | "send"
14
- | "ask"
15
- | "secret"
16
- | "call";
9
+ export type EffectKind = "read" | "write" | "emit" | "send" | "ask" | "secret" | "call";
17
10
 
18
11
  /**
19
12
  * Reversibility tier — console §9.1 ranking, applied to all seven kinds.
@@ -135,6 +128,6 @@ export async function recordEffect<T>(
135
128
  export const EFFECT_KIND_TIERS: ReadonlyArray<{
136
129
  kind: EffectKind;
137
130
  reversibility: ReversibilityTier;
138
- }> = (
139
- Object.entries(TIER_BY_KIND) as Array<[EffectKind, ReversibilityTier]>
140
- ).map(([kind, reversibility]) => ({ kind, reversibility }));
131
+ }> = (Object.entries(TIER_BY_KIND) as Array<[EffectKind, ReversibilityTier]>).map(
132
+ ([kind, reversibility]) => ({ kind, reversibility }),
133
+ );
@@ -6,11 +6,7 @@
6
6
  */
7
7
 
8
8
  import { describe, expect, test } from "bun:test";
9
- import {
10
- OKE_ERRORS,
11
- OkeError,
12
- type OkeErrorDefinition,
13
- } from "./errors.ts";
9
+ import { OKE_ERRORS, OkeError, type OkeErrorDefinition } from "./errors.ts";
14
10
 
15
11
  describe("OKE error-code registry", () => {
16
12
  test("every code is unique", () => {
@@ -30,9 +26,7 @@ describe("OKE error-code registry", () => {
30
26
  test("OkeError docsUrl matches docs origin /e/{code}", () => {
31
27
  for (const def of Object.values(OKE_ERRORS) as OkeErrorDefinition[]) {
32
28
  const err = new OkeError(def);
33
- expect(err.docsUrl).toBe(
34
- `https://okengine.vercel.app/e/${def.code}`,
35
- );
29
+ expect(err.docsUrl).toBe(`https://oke.omqkhafi.dev/e/${def.code}`);
36
30
  expect(err.message).toContain(err.docsUrl);
37
31
  expect(err.message).toContain(`OKE${def.code}`);
38
32
  expect(err.message).toContain("→");
@@ -99,50 +99,43 @@ export const OKE_ERRORS = {
99
99
  /** Flow reads a store resource not listed in `effects.reads`. */
100
100
  UNDECLARED_READ: {
101
101
  code: 1001,
102
- cause:
103
- 'Flow "{flow}" reads "{resource}" without declaring it.',
102
+ cause: 'Flow "{flow}" reads "{resource}" without declaring it.',
104
103
  fix: 'Add "{resource}" to this flow\'s effects.reads.',
105
104
  },
106
105
  /** Flow writes a store resource not listed in `effects.writes`. */
107
106
  UNDECLARED_WRITE: {
108
107
  code: 1002,
109
- cause:
110
- 'Flow "{flow}" writes "{resource}" without declaring it.',
108
+ cause: 'Flow "{flow}" writes "{resource}" without declaring it.',
111
109
  fix: 'Add "{resource}" to this flow\'s effects.writes.',
112
110
  },
113
111
  /** Flow emits a signal not listed in `effects.emits`. */
114
112
  UNDECLARED_EMIT: {
115
113
  code: 1003,
116
- cause:
117
- 'Flow "{flow}" emits "{resource}" without declaring it.',
114
+ cause: 'Flow "{flow}" emits "{resource}" without declaring it.',
118
115
  fix: 'Add "{resource}" to this flow\'s effects.emits.',
119
116
  },
120
117
  /** Flow sends a channel template not listed in `effects.sends`. */
121
118
  UNDECLARED_SEND: {
122
119
  code: 1004,
123
- cause:
124
- 'Flow "{flow}" sends "{resource}" without declaring it.',
120
+ cause: 'Flow "{flow}" sends "{resource}" without declaring it.',
125
121
  fix: 'Add "{resource}" to this flow\'s effects.sends.',
126
122
  },
127
123
  /** Flow asks a prompt not listed in `effects.asks`. */
128
124
  UNDECLARED_ASK: {
129
125
  code: 1005,
130
- cause:
131
- 'Flow "{flow}" asks "{resource}" without declaring it.',
126
+ cause: 'Flow "{flow}" asks "{resource}" without declaring it.',
132
127
  fix: 'Add "{resource}" to this flow\'s effects.asks.',
133
128
  },
134
129
  /** Flow reads a secret not listed in `effects.secrets`. */
135
130
  UNDECLARED_SECRET: {
136
131
  code: 1006,
137
- cause:
138
- 'Flow "{flow}" reads secret "{resource}" without declaring it.',
132
+ cause: 'Flow "{flow}" reads secret "{resource}" without declaring it.',
139
133
  fix: 'Add "{resource}" to this flow\'s effects.secrets.',
140
134
  },
141
135
  /** Flow calls another flow not listed in `effects.calls`. */
142
136
  UNDECLARED_CALL: {
143
137
  code: 1007,
144
- cause:
145
- 'Flow "{flow}" calls "{resource}" without declaring it.',
138
+ cause: 'Flow "{flow}" calls "{resource}" without declaring it.',
146
139
  fix: 'Add "{resource}" to this flow\'s effects.calls.',
147
140
  },
148
141
  /**
@@ -151,9 +144,17 @@ export const OKE_ERRORS = {
151
144
  */
152
145
  ORPHAN_EMIT: {
153
146
  code: 1042,
154
- cause:
155
- 'Flow "{flow}" emits signal "{resource}" with no subscriber.',
156
- fix: 'Add `on({resource}, …)` or mark the signal `{ optional: true }`.',
147
+ cause: 'Flow "{flow}" emits signal "{resource}" with no subscriber.',
148
+ fix: "Add `on({resource}, …)` or mark the signal `{ optional: true }`.",
149
+ },
150
+ /**
151
+ * Domain table/column missing under docker/prod (migrations not applied).
152
+ * Store/DDL band starts at 1100.
153
+ */
154
+ DOMAIN_SCHEMA_MISSING: {
155
+ code: 1101,
156
+ cause: "domain table not found — migrations have not been applied.",
157
+ fix: "run `oke db migrate` against this environment.",
157
158
  },
158
159
  } as const satisfies Record<string, OkeErrorDefinition>;
159
160
 
@@ -164,10 +165,7 @@ export const OKE_ERRORS = {
164
165
  * @param params - Interpolation params
165
166
  * @returns Never
166
167
  */
167
- export function throwOke(
168
- key: keyof typeof OKE_ERRORS,
169
- params: OkeErrorParams = {},
170
- ): never {
168
+ export function throwOke(key: keyof typeof OKE_ERRORS, params: OkeErrorParams = {}): never {
171
169
  throw new OkeError(OKE_ERRORS[key], params);
172
170
  }
173
171
 
@@ -176,9 +174,7 @@ export function throwOke(
176
174
  *
177
175
  * @param code - Permanent numeric code
178
176
  */
179
- export function lookupOkeError(
180
- code: OkeErrorCode,
181
- ): OkeErrorDefinition | undefined {
177
+ export function lookupOkeError(code: OkeErrorCode): OkeErrorDefinition | undefined {
182
178
  for (const def of Object.values(OKE_ERRORS)) {
183
179
  if (def.code === code) return def;
184
180
  }
@@ -192,14 +188,9 @@ export function lookupOkeError(
192
188
  * @param data - Error payload
193
189
  * @param opts - Optional message override
194
190
  */
195
- export function fail<E>(
196
- code: string,
197
- data: E,
198
- opts?: FailOptions,
199
- ): FlowFailure<E> {
200
- const error: FlowErrorValue<E> = opts?.message !== undefined
201
- ? { code, data, message: opts.message }
202
- : { code, data };
191
+ export function fail<E>(code: string, data: E, opts?: FailOptions): FlowFailure<E> {
192
+ const error: FlowErrorValue<E> =
193
+ opts?.message !== undefined ? { code, data, message: opts.message } : { code, data };
203
194
  return { data: null, error };
204
195
  }
205
196
 
@@ -2,12 +2,7 @@ import { describe, expect, test, beforeEach } from "bun:test";
2
2
  import { oke } from "./app.ts";
3
3
  import { flow, isFlow, resetFlowSeq } from "./flow.ts";
4
4
  import { on, resetBindings } from "./on.ts";
5
- import {
6
- every,
7
- http,
8
- internal,
9
- table,
10
- } from "./triggers.ts";
5
+ import { every, http, internal, table } from "./triggers.ts";
11
6
 
12
7
  beforeEach(() => {
13
8
  resetBindings();
@@ -55,11 +50,7 @@ describe("flow — one species", () => {
55
50
  expect(app.bindings[0]?.flow).toBe(shared);
56
51
  expect(app.bindings[1]?.flow).toBe(shared);
57
52
 
58
- const httpResult = await app.execute(
59
- shared,
60
- { n: 3 },
61
- shared.triggers[0]!,
62
- );
53
+ const httpResult = await app.execute(shared, { n: 3 }, shared.triggers[0]!);
63
54
  const signalResults = await app.dispatchSignal("order-placed", { n: 4 });
64
55
 
65
56
  expect(httpResult.output).toEqual({ n: 6 });
@@ -126,29 +117,25 @@ describe("five trigger kinds", () => {
126
117
 
127
118
  const app = oke({ name: "five" });
128
119
 
129
- const res = await app.fetch(
130
- new Request("http://localhost/abc", { method: "GET" }),
131
- );
120
+ const res = await app.fetch(new Request("http://localhost/abc", { method: "GET" }));
132
121
  expect(res.status).toBe(200);
133
122
  expect(await res.json()).toEqual({ data: { code: "abc" }, error: null });
134
123
 
135
124
  await app.dispatchEvery("1h");
136
125
  await app.dispatchSignal("link-clicked", { code: "sa" });
137
- await app.dispatchCdc("orders", {
138
- before: { status: "open" },
139
- after: { status: "paid" },
140
- }, "status");
126
+ await app.dispatchCdc(
127
+ "orders",
128
+ {
129
+ before: { status: "open" },
130
+ after: { status: "paid" },
131
+ },
132
+ "status",
133
+ );
141
134
 
142
135
  const internalResult = await app.call("t.internal");
143
136
  expect(internalResult).toEqual({ ok: true });
144
137
 
145
- expect(seen).toEqual([
146
- "http:abc",
147
- "every",
148
- "signal:sa",
149
- "cdc:open->paid",
150
- "internal",
151
- ]);
138
+ expect(seen).toEqual(["http:abc", "every", "signal:sa", "cdc:open->paid", "internal"]);
152
139
  expect(httpFlow.triggers[0]?.kind).toBe("http");
153
140
  });
154
141
  });