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
@@ -8,11 +8,7 @@
8
8
  */
9
9
 
10
10
  import { createBunCrypto } from "../runtime/primitives.ts";
11
- import type {
12
- OperatorCredentialRow,
13
- OperatorRow,
14
- OperatorSsoLinkRow,
15
- } from "./tables.ts";
11
+ import type { OperatorCredentialRow, OperatorRow, OperatorSsoLinkRow } from "./tables.ts";
16
12
 
17
13
  /** Operator-plane store. */
18
14
  export interface OperatorStore {
@@ -82,15 +78,10 @@ export async function createOperator(
82
78
  * @param store - Operator store
83
79
  * @param operatorId - Operator id
84
80
  */
85
- export function removeOperatorCredential(
86
- store: OperatorStore,
87
- operatorId: string,
88
- ): never {
81
+ export function removeOperatorCredential(store: OperatorStore, operatorId: string): never {
89
82
  void store;
90
83
  void operatorId;
91
- throw new OperatorError(
92
- "operator local credential cannot be removed; SSO is additive only",
93
- );
84
+ throw new OperatorError("operator local credential cannot be removed; SSO is additive only");
94
85
  }
95
86
 
96
87
  /**
@@ -111,9 +102,7 @@ export function linkOperatorSso(
111
102
  throw new OperatorError(`unknown operator: ${operatorId}`);
112
103
  }
113
104
  if (!store.credentials.has(operatorId)) {
114
- throw new OperatorError(
115
- "operator is missing local credential — invariant violated",
116
- );
105
+ throw new OperatorError("operator is missing local credential — invariant violated");
117
106
  }
118
107
  const link: OperatorSsoLinkRow = { operatorId, provider, subject };
119
108
  const list = store.ssoLinks.get(operatorId) ?? [];
@@ -128,14 +117,9 @@ export function linkOperatorSso(
128
117
  */
129
118
  let dummyPasswordHash: string | null = null;
130
119
 
131
- async function dummyHash(
132
- crypto: ReturnType<typeof createBunCrypto>,
133
- ): Promise<string> {
120
+ async function dummyHash(crypto: ReturnType<typeof createBunCrypto>): Promise<string> {
134
121
  if (dummyPasswordHash === null) {
135
- dummyPasswordHash = await crypto.hashPassword(
136
- "oke-operator-timing-dummy",
137
- "argon2id",
138
- );
122
+ dummyPasswordHash = await crypto.hashPassword("oke-operator-timing-dummy", "argon2id");
139
123
  }
140
124
  return dummyPasswordHash;
141
125
  }
@@ -157,10 +141,8 @@ export async function authenticateOperator(
157
141
  ): Promise<OperatorRow | null> {
158
142
  const crypto = createBunCrypto();
159
143
  const op = [...store.operators.values()].find((o) => o.email === email);
160
- const cred =
161
- op && op.status === "active" ? store.credentials.get(op.id) : undefined;
162
- const hash =
163
- cred && cred.loginEnabled ? cred.passwordHash : await dummyHash(crypto);
144
+ const cred = op && op.status === "active" ? store.credentials.get(op.id) : undefined;
145
+ const hash = cred && cred.loginEnabled ? cred.passwordHash : await dummyHash(crypto);
164
146
  const ok = await crypto.verifyPassword(password, hash);
165
147
  if (!ok || !op || !cred || !cred.loginEnabled || op.status !== "active") {
166
148
  return null;
@@ -81,14 +81,9 @@ export function operatorPrincipal(fields: {
81
81
  * @param principal - Acting principal
82
82
  * @param flowPlane - Target flow plane
83
83
  */
84
- export function assertPlaneAccess(
85
- principal: Principal,
86
- flowPlane: AuthPlane,
87
- ): void {
84
+ export function assertPlaneAccess(principal: Principal, flowPlane: AuthPlane): void {
88
85
  if (principal.plane === "user" && flowPlane === "operator") {
89
- throw new CrossPlaneError(
90
- "application principal cannot reach a console (operator) flow",
91
- );
86
+ throw new CrossPlaneError("application principal cannot reach a console (operator) flow");
92
87
  }
93
88
  }
94
89
 
@@ -23,15 +23,12 @@ export interface AuthPluginOptions {
23
23
  * @param options - Session crypto options
24
24
  */
25
25
  export function auth(options: AuthPluginOptions = {}): PluginDef {
26
- let builder = plugin("auth", { version: "0.0.1", config: options }).hook(
27
- "onAuth",
28
- (_ctx) => {
29
- /* principals resolved by session / API key middleware at runtime */
30
- },
31
- );
26
+ let builder = plugin("auth", { version: "0.0.1", config: options }).hook("onAuth", (_ctx) => {
27
+ /* principals resolved by session / API key middleware at runtime */
28
+ });
32
29
 
33
30
  for (const name of Object.values(AUTH_TABLES)) {
34
- builder = builder.table(name, {
31
+ builder = builder.table(name, undefined, {
35
32
  plane: name.includes("operator")
36
33
  ? "operator"
37
34
  : name.includes("identit") || name === AUTH_TABLES.credentials
package/src/auth/roles.ts CHANGED
@@ -38,11 +38,7 @@ export function upsertRole(store: RoleStore, role: RoleRow): void {
38
38
  * @param roleId - Role id
39
39
  * @param actions - Module:Action pairs
40
40
  */
41
- export function setRoleGrants(
42
- store: RoleStore,
43
- roleId: string,
44
- actions: readonly string[],
45
- ): void {
41
+ export function setRoleGrants(store: RoleStore, roleId: string, actions: readonly string[]): void {
46
42
  if (!store.roles.has(roleId)) {
47
43
  throw new Error(`unknown role: ${roleId}`);
48
44
  }
@@ -229,10 +229,7 @@ const sessionAudiences = new Map<string, string>();
229
229
  * @param sessionId - Session id
230
230
  * @param scopes - Scopes
231
231
  */
232
- export function bindSessionScopes(
233
- sessionId: string,
234
- scopes: Iterable<string>,
235
- ): void {
232
+ export function bindSessionScopes(sessionId: string, scopes: Iterable<string>): void {
236
233
  sessionScopes.set(sessionId, [...scopes]);
237
234
  }
238
235
 
@@ -242,10 +239,7 @@ export function bindSessionScopes(
242
239
  * @param sessionId - Session id
243
240
  * @param audience - Audience claim
244
241
  */
245
- export function bindSessionAudience(
246
- sessionId: string,
247
- audience: string,
248
- ): void {
242
+ export function bindSessionAudience(sessionId: string, audience: string): void {
249
243
  sessionAudiences.set(sessionId, audience);
250
244
  }
251
245
 
@@ -292,9 +286,7 @@ export async function verifyAccess(
292
286
  nowOrOptions: (() => number) | VerifyAccessOptions = () => Date.now(),
293
287
  ): Promise<AccessClaims> {
294
288
  const options: VerifyAccessOptions =
295
- typeof nowOrOptions === "function"
296
- ? { now: nowOrOptions }
297
- : nowOrOptions;
289
+ typeof nowOrOptions === "function" ? { now: nowOrOptions } : nowOrOptions;
298
290
  const now = options.now ?? (() => Date.now());
299
291
  const claims = await verifyAccessSignature(secret, token);
300
292
  if (claims.exp <= now()) {
@@ -302,9 +294,7 @@ export async function verifyAccess(
302
294
  }
303
295
  if (options.audience !== undefined) {
304
296
  if (claims.aud !== options.audience) {
305
- throw new SessionError(
306
- `access token audience mismatch: expected ${options.audience}`,
307
- );
297
+ throw new SessionError(`access token audience mismatch: expected ${options.audience}`);
308
298
  }
309
299
  }
310
300
  const session = store.sessions.get(claims.sid);
@@ -325,11 +315,7 @@ export async function verifyAccess(
325
315
  * @param familyId - Family id
326
316
  * @param at - Timestamp
327
317
  */
328
- export function revokeFamily(
329
- store: SessionStore,
330
- familyId: string,
331
- at: number = Date.now(),
332
- ): void {
318
+ export function revokeFamily(store: SessionStore, familyId: string, at: number = Date.now()): void {
333
319
  for (const session of store.sessions.values()) {
334
320
  if (session.familyId === familyId) session.revokedAt = at;
335
321
  }
@@ -348,23 +334,15 @@ export class SessionError extends Error {
348
334
  }
349
335
 
350
336
  async function hashToken(raw: string): Promise<string> {
351
- const digest = await crypto.subtle.digest(
352
- "SHA-256",
353
- new TextEncoder().encode(raw),
354
- );
355
- return [...new Uint8Array(digest)]
356
- .map((b) => b.toString(16).padStart(2, "0"))
357
- .join("");
337
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(raw));
338
+ return [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, "0")).join("");
358
339
  }
359
340
 
360
341
  function cryptoRandomId(): string {
361
342
  return crypto.randomUUID().replace(/-/g, "");
362
343
  }
363
344
 
364
- async function signAccess(
365
- secret: string,
366
- claims: AccessClaims,
367
- ): Promise<string> {
345
+ async function signAccess(secret: string, claims: AccessClaims): Promise<string> {
368
346
  const header = b64url(JSON.stringify({ alg: "HS256", typ: "JWT" }));
369
347
  const payload = b64url(JSON.stringify(claims));
370
348
  const data = `${header}.${payload}`;
@@ -372,10 +350,7 @@ async function signAccess(
372
350
  return `${data}.${sig}`;
373
351
  }
374
352
 
375
- async function verifyAccessSignature(
376
- secret: string,
377
- token: string,
378
- ): Promise<AccessClaims> {
353
+ async function verifyAccessSignature(secret: string, token: string): Promise<AccessClaims> {
379
354
  const parts = token.split(".");
380
355
  if (parts.length !== 3) throw new SessionError("malformed access token");
381
356
  const [header, payload, sig] = parts as [string, string, string];
@@ -393,11 +368,7 @@ async function hmac(secret: string, data: string): Promise<string> {
393
368
  false,
394
369
  ["sign"],
395
370
  );
396
- const sig = await crypto.subtle.sign(
397
- "HMAC",
398
- key,
399
- new TextEncoder().encode(data),
400
- );
371
+ const sig = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(data));
401
372
  return b64urlBytes(new Uint8Array(sig));
402
373
  }
403
374
 
package/src/cli/args.ts CHANGED
@@ -41,10 +41,6 @@ export function flagValue(
41
41
  * @param long - Long flag
42
42
  * @param short - Optional short flag
43
43
  */
44
- export function hasFlag(
45
- args: readonly string[],
46
- long: string,
47
- short?: string,
48
- ): boolean {
44
+ export function hasFlag(args: readonly string[], long: string, short?: string): boolean {
49
45
  return args.includes(long) || (short !== undefined && args.includes(short));
50
46
  }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * One-time interactive `oke dev` mode choice via `@clack/prompts`.
3
+ */
4
+
5
+ import { isCancel, select } from "@clack/prompts";
6
+ import type { DevMode } from "./dev-mode.ts";
7
+
8
+ /**
9
+ * Injectable ask step — production uses {@link askDevMode}.
10
+ *
11
+ * @returns Chosen mode, or `null` if the user cancelled
12
+ */
13
+ export type AskDevModeFn = () => Promise<DevMode | null>;
14
+
15
+ /**
16
+ * Prompt once: local vs docker.
17
+ *
18
+ * @returns Chosen mode, or `null` on cancel
19
+ */
20
+ export async function askDevMode(): Promise<DevMode | null> {
21
+ const value = await select({
22
+ message: "Run against",
23
+ options: [
24
+ {
25
+ value: "local",
26
+ label: "local",
27
+ hint: "sqlite file, instant, no Docker needed",
28
+ },
29
+ {
30
+ value: "docker",
31
+ label: "docker",
32
+ hint: "real Postgres/Redis via compose, closer to production",
33
+ },
34
+ ],
35
+ initialValue: "local",
36
+ });
37
+ if (isCancel(value)) return null;
38
+ if (value === "local" || value === "docker") return value;
39
+ return null;
40
+ }
package/src/cli/build.ts CHANGED
@@ -26,8 +26,7 @@ export async function runBuild(options: BuildOptions = {}): Promise<number> {
26
26
  const target = options.target ?? "bun";
27
27
  const entry = options.entry ?? "src/app.ts";
28
28
  const outdir = options.outdir ?? "dist";
29
- const bunTarget =
30
- target === "edge" ? "browser" : target === "node" ? "node" : "bun";
29
+ const bunTarget = target === "edge" ? "browser" : target === "node" ? "node" : "bun";
31
30
 
32
31
  const bundle =
33
32
  options.bundle ??
@@ -6,10 +6,7 @@ import { describe, expect, test } from "bun:test";
6
6
  import { mkdtemp } from "node:fs/promises";
7
7
  import { tmpdir } from "node:os";
8
8
  import { join } from "node:path";
9
- import {
10
- clientAdd,
11
- emitAmbient,
12
- } from "./client-add.ts";
9
+ import { clientAdd, emitAmbient } from "./client-add.ts";
13
10
  import type { ClientDescriptor } from "../client/types.ts";
14
11
 
15
12
  const fixture: ClientDescriptor = {
@@ -72,10 +69,7 @@ void seats;
72
69
  // Minimal stub so `import type { Register }` resolves.
73
70
  const stubDir = join(dir, "node_modules/okengine");
74
71
  await Bun.$`mkdir -p ${stubDir}`.quiet();
75
- await Bun.write(
76
- join(stubDir, "client.d.ts"),
77
- `export interface Register {}\n`,
78
- );
72
+ await Bun.write(join(stubDir, "client.d.ts"), `export interface Register {}\n`);
79
73
  await Bun.write(
80
74
  join(stubDir, "package.json"),
81
75
  JSON.stringify({
@@ -102,10 +96,11 @@ void seats;
102
96
  }),
103
97
  );
104
98
 
105
- const proc = Bun.spawn(
106
- ["bunx", "tsc", "--project", tsconfig],
107
- { cwd: dir, stdout: "pipe", stderr: "pipe" },
108
- );
99
+ const proc = Bun.spawn(["bunx", "tsc", "--project", tsconfig], {
100
+ cwd: dir,
101
+ stdout: "pipe",
102
+ stderr: "pipe",
103
+ });
109
104
  const [stdout, stderr, code] = await Promise.all([
110
105
  new Response(proc.stdout).text(),
111
106
  new Response(proc.stderr).text(),
@@ -113,9 +108,7 @@ void seats;
113
108
  ]);
114
109
 
115
110
  if (code !== 0) {
116
- throw new Error(
117
- `tsc failed (${code})\n${stdout}\n${stderr}\n--- d.ts ---\n${result.source}`,
118
- );
111
+ throw new Error(`tsc failed (${code})\n${stdout}\n${stderr}\n--- d.ts ---\n${result.source}`);
119
112
  }
120
113
  });
121
114
 
@@ -32,12 +32,9 @@ export interface ClientAddResult {
32
32
  *
33
33
  * @param options - URL / out / test overrides
34
34
  */
35
- export async function clientAdd(
36
- options: ClientAddOptions,
37
- ): Promise<ClientAddResult> {
35
+ export async function clientAdd(options: ClientAddOptions): Promise<ClientAddResult> {
38
36
  const out = options.out ?? "oke-client.d.ts";
39
- const descriptor =
40
- options.descriptor ?? (await fetchDescriptor(options.url, options.fetch));
37
+ const descriptor = options.descriptor ?? (await fetchDescriptor(options.url, options.fetch));
41
38
  const source = emitAmbient(descriptor);
42
39
  await Bun.write(out, source);
43
40
  return { out, source };
@@ -102,12 +99,8 @@ export function emitAmbient(descriptor: ClientDescriptor): string {
102
99
  ` in: ${c.in ?? "unknown"};`,
103
100
  ` out: ${c.out ?? "unknown"};`,
104
101
  errorBlock,
105
- c.method
106
- ? ` method: ${JSON.stringify(c.method)};`
107
- : undefined,
108
- c.path
109
- ? ` path: ${JSON.stringify(c.path)};`
110
- : undefined,
102
+ c.method ? ` method: ${JSON.stringify(c.method)};` : undefined,
103
+ c.path ? ` path: ${JSON.stringify(c.path)};` : undefined,
111
104
  ` }`,
112
105
  ]
113
106
  .filter((line): line is string => line !== undefined)
@@ -147,9 +140,7 @@ async function fetchDescriptor(
147
140
  const base = url.replace(/\/+$/, "");
148
141
  const res = await fetchFn(`${base}/_oke/client.json`);
149
142
  if (!res.ok) {
150
- throw new Error(
151
- `Failed to fetch ${base}/_oke/client.json (${res.status})`,
152
- );
143
+ throw new Error(`Failed to fetch ${base}/_oke/client.json (${res.status})`);
153
144
  }
154
145
  const json: unknown = await res.json();
155
146
  if (
@@ -4,11 +4,7 @@
4
4
 
5
5
  import { describe, expect, test } from "bun:test";
6
6
  import { generateCompletion } from "./completion.ts";
7
- import {
8
- OKE_COMMANDS,
9
- commandNames,
10
- type CliCommand,
11
- } from "./registry.ts";
7
+ import { OKE_COMMANDS, commandNames, type CliCommand } from "./registry.ts";
12
8
 
13
9
  describe("oke completion", () => {
14
10
  test("bash script lists every registry command", () => {
@@ -3,12 +3,7 @@
3
3
  */
4
4
 
5
5
  import { EXIT_OK, EXIT_USAGE } from "./exit.ts";
6
- import {
7
- OKE_COMMANDS,
8
- commandNames,
9
- type CliCommand,
10
- type CliFlag,
11
- } from "./registry.ts";
6
+ import { OKE_COMMANDS, commandNames, type CliCommand, type CliFlag } from "./registry.ts";
12
7
 
13
8
  /** Supported completion shells. */
14
9
  export const COMPLETION_SHELLS = ["bash", "zsh", "fish"] as const;
@@ -63,9 +58,7 @@ Install:
63
58
 
64
59
  const shell = args[0];
65
60
  if (!shell || !isCompletionShell(shell)) {
66
- console.error(
67
- "oke completion: require bash, zsh, or fish — e.g. oke completion zsh",
68
- );
61
+ console.error("oke completion: require bash, zsh, or fish — e.g. oke completion zsh");
69
62
  return EXIT_USAGE;
70
63
  }
71
64
 
@@ -223,9 +216,7 @@ function fishScript(commands: readonly CliCommand[]): string {
223
216
  `complete -c oke -f -n "not __fish_seen_subcommand_from ${names}" -a "${cmd.name}" -d ${fishQuote(cmd.summary)}`,
224
217
  );
225
218
  }
226
- rebuilt.push(
227
- `complete -c oke -f -n "__fish_seen_subcommand_from completion" -a "bash zsh fish"`,
228
- );
219
+ rebuilt.push(`complete -c oke -f -n "__fish_seen_subcommand_from completion" -a "bash zsh fish"`);
229
220
  for (const cmd of commands) {
230
221
  const subs = cmd.subcommands ?? [];
231
222
  if (subs.length === 0) {
@@ -248,11 +239,7 @@ function fishScript(commands: readonly CliCommand[]): string {
248
239
  return `${rebuilt.join("\n")}\n`;
249
240
  }
250
241
 
251
- function fishFlagLine(
252
- command: string,
253
- sub: string | undefined,
254
- flag: CliFlag,
255
- ): string {
242
+ function fishFlagLine(command: string, sub: string | undefined, flag: CliFlag): string {
256
243
  const seen = sub
257
244
  ? `__fish_seen_subcommand_from ${command}; and __fish_seen_subcommand_from ${sub}`
258
245
  : `__fish_seen_subcommand_from ${command}`;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Domain schema watch-path + auto-push policy.
3
+ */
4
+
5
+ import { describe, expect, test } from "bun:test";
6
+ import {
7
+ createDebouncedRunner,
8
+ isDomainSchemaWatchPath,
9
+ resolveDevAutoPush,
10
+ } from "./db-auto-push.ts";
11
+
12
+ describe("isDomainSchemaWatchPath", () => {
13
+ test("matches schema.ts and drizzle.config.ts", () => {
14
+ expect(isDomainSchemaWatchPath("schema.ts")).toBe(true);
15
+ expect(isDomainSchemaWatchPath("drizzle.config.ts")).toBe(true);
16
+ expect(isDomainSchemaWatchPath("flows/notes/schema.ts")).toBe(true);
17
+ expect(isDomainSchemaWatchPath("src/schema.decl.ts")).toBe(true);
18
+ expect(isDomainSchemaWatchPath("src/schema.generated.ts")).toBe(true);
19
+ });
20
+
21
+ test("ignores unrelated files", () => {
22
+ expect(isDomainSchemaWatchPath("flows/notes/index.ts")).toBe(false);
23
+ expect(isDomainSchemaWatchPath(undefined)).toBe(false);
24
+ });
25
+
26
+ test("matches app entry (plugin .table contributions)", () => {
27
+ expect(isDomainSchemaWatchPath("app.ts")).toBe(true);
28
+ expect(isDomainSchemaWatchPath("src/app.ts")).toBe(true);
29
+ });
30
+ });
31
+
32
+ describe("resolveDevAutoPush", () => {
33
+ test("default on for local", () => {
34
+ expect(resolveDevAutoPush({})).toBe(true);
35
+ });
36
+
37
+ test("off for docker", () => {
38
+ expect(resolveDevAutoPush({ docker: true })).toBe(false);
39
+ });
40
+
41
+ test("off for --no-db-push", () => {
42
+ expect(resolveDevAutoPush({ noDbPush: true })).toBe(false);
43
+ });
44
+
45
+ test("off when config.db.autoPush is false", () => {
46
+ expect(resolveDevAutoPush({ configAutoPush: false })).toBe(false);
47
+ });
48
+ });
49
+
50
+ describe("createDebouncedRunner", () => {
51
+ test("coalesces rapid triggers", async () => {
52
+ let count = 0;
53
+ const runner = createDebouncedRunner(() => {
54
+ count++;
55
+ }, 40);
56
+ runner.trigger();
57
+ runner.trigger();
58
+ runner.trigger();
59
+ expect(count).toBe(0);
60
+ await Bun.sleep(80);
61
+ expect(count).toBe(1);
62
+ runner.cancel();
63
+ });
64
+ });
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Debounced domain-schema auto-push for `oke dev` (local mode).
3
+ */
4
+
5
+ import { basename } from "node:path";
6
+
7
+ /** Default debounce for schema-change → push. */
8
+ export const DB_AUTO_PUSH_DEBOUNCE_MS = 300;
9
+
10
+ /**
11
+ * Whether a watched path should trigger `oke db push`.
12
+ *
13
+ * @param filename - Relative path from the watcher (may be undefined)
14
+ */
15
+ export function isDomainSchemaWatchPath(filename: string | null | undefined): boolean {
16
+ if (!filename) return false;
17
+ const normalized = filename.replace(/\\/g, "/");
18
+ const base = basename(normalized);
19
+ if (base === "schema.ts" || base === "schema.tsx") return true;
20
+ if (base === "schema.decl.ts" || base === "schema.decl.tsx") return true;
21
+ if (base === "schema.generated.ts" || base === "schema.generated.tsx") return true;
22
+ if (base === "drizzle.config.ts" || base === "drizzle.config.js") return true;
23
+ // App entry / plugins — `.plug()` table contributions feed emit.
24
+ if (base === "app.ts" || base === "app.tsx") return true;
25
+ // Nested domain schemas commonly live under src/**/schema.ts
26
+ if (/(^|\/)schema(\.decl|\.generated)?\.tsx?$/.test(normalized)) return true;
27
+ return false;
28
+ }
29
+
30
+ /**
31
+ * Resolve whether auto-push is enabled for this `oke dev` session.
32
+ *
33
+ * @param options - Explicit CLI opt-out, config, docker mode
34
+ */
35
+ export function resolveDevAutoPush(options: {
36
+ readonly noDbPush?: boolean;
37
+ readonly docker?: boolean;
38
+ readonly configAutoPush?: boolean;
39
+ }): boolean {
40
+ if (options.docker) return false;
41
+ if (options.noDbPush) return false;
42
+ return options.configAutoPush !== false;
43
+ }
44
+
45
+ /**
46
+ * Create a debounced callback runner.
47
+ *
48
+ * @param fn - Async work
49
+ * @param ms - Debounce window
50
+ */
51
+ export function createDebouncedRunner(
52
+ fn: () => void | Promise<void>,
53
+ ms = DB_AUTO_PUSH_DEBOUNCE_MS,
54
+ ): {
55
+ readonly trigger: () => void;
56
+ readonly cancel: () => void;
57
+ } {
58
+ let timer: ReturnType<typeof setTimeout> | null = null;
59
+ return {
60
+ trigger() {
61
+ if (timer) clearTimeout(timer);
62
+ timer = setTimeout(() => {
63
+ timer = null;
64
+ void fn();
65
+ }, ms);
66
+ },
67
+ cancel() {
68
+ if (timer) clearTimeout(timer);
69
+ timer = null;
70
+ },
71
+ };
72
+ }