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
package/AGENTS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # OKE — Agent Contract
2
2
 
3
- This file is loaded by every later session. It prevents drift. Specs live in `docs/spec/`. **If the spec is silent, stop and ask.**
3
+ This file is loaded by every later session. It prevents drift. Product documentation lives in `site/content/docs/`. **If the documentation is silent, stop and ask.**
4
4
 
5
5
  ## The one law
6
6
 
@@ -14,16 +14,16 @@ There are no separate species called endpoints, handlers, consumers, jobs, subsc
14
14
 
15
15
  ## The eight elements
16
16
 
17
- | Element | Essence |
18
- |---|---|
19
- | **Flow** | behavior |
20
- | **Signal** | data in motion |
21
- | **Store** | data at rest (`sql` · `kv` · `files` · `index`) |
22
- | **Clock** | time |
23
- | **Gate** | permission to act |
24
- | **Vault** | protected knowledge |
25
- | **Channel** | reaching humans |
26
- | **AI** | reaching machine intelligence |
17
+ | Element | Essence |
18
+ | ----------- | ----------------------------------------------- |
19
+ | **Flow** | behavior |
20
+ | **Signal** | data in motion |
21
+ | **Store** | data at rest (`sql` · `kv` · `files` · `index`) |
22
+ | **Clock** | time |
23
+ | **Gate** | permission to act |
24
+ | **Vault** | protected knowledge |
25
+ | **Channel** | reaching humans |
26
+ | **AI** | reaching machine intelligence |
27
27
 
28
28
  An element earns its place only if it has irreducible physics. New infrastructure becomes a new **driver** for an existing element — never a ninth element.
29
29
 
@@ -53,39 +53,42 @@ A direct `node:` import (or any other side-channel I/O) in element or flow code
53
53
 
54
54
  ## Ports
55
55
 
56
- | Port | Surface |
57
- |---|---|
58
- | **6530** | App |
59
- | **6533** | Console |
60
- | **6535** | MCP |
56
+ | Port | Surface |
57
+ | -------- | -------------------- |
58
+ | **6530** | App |
59
+ | **6533** | Console |
60
+ | **6535** | MCP |
61
+ | **6536** | Docs MCP (read-only) |
61
62
 
62
63
  Mnemonic: O·K·E = 6·5·3.
63
64
 
64
65
  ## Budgets
65
66
 
66
- | Budget | Limit |
67
- |---|---|
67
+ | Budget | Limit |
68
+ | --------------------- | ------- |
68
69
  | Kernel (edge profile) | < 15 kB |
69
- | Client runtime | < 3 kB |
70
- | Cold start on Bun | < 75 ms |
71
- | p99 routing overhead | < 1 ms |
70
+ | Client runtime | < 3 kB |
71
+ | Cold start on Bun | < 75 ms |
72
+ | p99 routing overhead | < 1 ms |
72
73
 
73
74
  A regression fails the build. Claims we cannot measure, we do not make.
74
75
 
75
76
  ## Package shape
76
77
 
77
78
  Published packages:
78
- - `okengine` — framework. Subpath exports: `.`, `./client`, `./test`, `./config`, `./auth`, `./drivers/*`. `"sideEffects": false`. CLI binary: `oke`.
79
- - `create-oke` — scaffold CLI (`bunx create-oke@latest <name>`). Lives in `packages/create-oke`; clean starters are `templates/*`, teaching apps stay in `examples/*` (`--from-example`).
79
+
80
+ - `okengine` — framework. Subpath exports: `.`, `./client`, `./test`, `./config`, `./auth`, `./plugins`, `./drivers/*`. `"sideEffects": false`. CLI binary: `oke`.
81
+ - `create-oke` — scaffold CLI (`bunx create-oke@latest <name>`). Lives in `packages/create-oke` and ships one standard starter from `packages/create-oke/template`.
80
82
 
81
83
  Engine: Bun `>=1.3`.
82
84
 
83
- ## Spec authority
85
+ ## Documentation authority
84
86
 
85
- | Spec | Path |
86
- |---|---|
87
- | Unified theory | `docs/spec/unified-theory.md` |
88
- | Four applications | `docs/spec/four-applications.md` |
89
- | Console | `docs/spec/console.md` |
87
+ | Surface | Path |
88
+ | -------- | ------------------------------------ |
89
+ | Theory | `site/content/docs/elements/` |
90
+ | Console | `site/content/docs/console/` |
91
+ | CLI | `site/content/docs/reference/cli.md` |
92
+ | Manifest | `manifest.v1.schema.json` |
90
93
 
91
- **If the spec is silent, stop and ask.**
94
+ **If the documentation is silent, stop and ask.**
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  # okengine
9
9
 
10
- *"Encore's batteries and dashboard, Elysia's speed and DX, Hono's portability without the Rust lock-in, the cloud gravity, or the source-available license."*
10
+ _"Stop gluing APIs, jobs, and queues into one backend. One law collapses them client, Console, and infra come free. Yours to host."_
11
11
 
12
12
  [![npm](https://img.shields.io/npm/v/okengine.svg)](https://www.npmjs.com/package/okengine)
13
13
  [![JSR](https://jsr.io/badges/@omqkhafi/okengine)](https://jsr.io/@omqkhafi/okengine)
@@ -15,372 +15,106 @@
15
15
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
16
16
  [![Bun >=1.3](https://img.shields.io/badge/Bun-%3E%3D1.3-black.svg)](https://bun.sh)
17
17
 
18
- **Framework:** [`okengine`](https://www.npmjs.com/package/okengine) · **CLI:** `oke` · **Scaffold:** [`create-oke`](https://www.npmjs.com/package/create-oke) · **Docs:** [okengine.vercel.app](https://okengine.vercel.app) · **License:** MIT
18
+ **Docs:** [oke.omqkhafi.dev](https://oke.omqkhafi.dev) · **Handbook:** [/docs](https://oke.omqkhafi.dev/docs) · **CLI:** `oke` · **Scaffold:** [`create-oke`](https://www.npmjs.com/package/create-oke)
19
19
 
20
- ### Install
20
+ > [!WARNING]
21
+ > **Early development (`v0.x`) — not production-ready.**
22
+ >
23
+ > APIs, drivers, and tooling can change quickly, including **breaking changes**, until an initial stable release. Use for exploration and feedback — **not** production workloads yet.
21
24
 
22
- ```bash
23
- bun add okengine # npm (recommended — ships the `oke` CLI)
24
- bunx jsr add @omqkhafi/okengine # JSR — library API only
25
- bunx create-oke@latest my-app --template hello # scaffold from npm
26
- ```
27
- ---
28
-
29
- ## Start here
30
-
31
- Most backends are a pile of separate tools under one logo: a router, a queue library, a cron library, websockets, tracing. The pieces ship together; they do not follow from one idea. That is why docs sprawl and concepts never get removed.
32
-
33
- OKE starts from one sentence instead:
34
-
35
- > **Every backend behavior is a Flow:** `on(Trigger) → Effects`
36
-
37
- An HTTP route, a cron job, a queue consumer, a CDC hook — same shape. Triggers are typed values. Side effects go through `fx` (the only door to the outside world), so the compiler can see them.
25
+ ## Install
38
26
 
39
- Eight elements cover what a backend needs. Ten exports are the whole public vocabulary. Everything else is derived.
40
-
41
- ```typescript
42
- import { on, flow, signal, store, clock, gate, vault, channel, ai, plugin } from "okengine";
27
+ ```bash
28
+ bun add okengine # framework + `oke` CLI
29
+ bunx jsr add @omqkhafi/okengine # JSR — library API only
30
+ bunx create-oke@latest my-app --template hello # scaffold
43
31
  ```
44
32
 
45
- Batteries included for the Bun era: contract-first APIs, typed client, infrastructure primitives, Console, auth — pure TypeScript, MIT, self-hostable, no cloud lock-in. Handbook: [handbook](https://okengine.vercel.app/docs). Spec depth: [`docs/spec/unified-theory.md`](https://github.com/omqkhafi/okengine/blob/main/docs/spec/unified-theory.md).
46
-
47
- ---
48
-
49
- ## Run something in two minutes
33
+ ## Quick start
50
34
 
51
35
  ```bash
52
36
  bunx create-oke@latest my-app --template hello
53
37
  cd my-app
54
38
  oke dev
39
+ # or: oke mode docker && oke dev # compose infra · app on host Bun
55
40
  ```
56
41
 
57
- | Port | What |
58
- |---|---|
59
- | `:6530` | your app |
60
- | `:6533` | Console |
61
- | `:6535` | MCP (your live Manifest, for agents) |
62
-
63
- Mnemonic: **O·K·E = 6·5·3**. Docs MCP for the handbook is a separate surface on `:6536` (search/fetch only — see [Documentation](#documentation)).
64
-
65
- That scaffolds the **hello** starter — one flow, no Store, the fastest true "it works" moment. Default without `--template` is **standard** (full recommended file layout, empty scaffolding). Open the Console — flows, contracts, effects, and an architecture diagram are already there. Derived, not configured.
42
+ | Port | Surface |
43
+ | ------- | ------------------------------------------- |
44
+ | `:6530` | App |
45
+ | `:6533` | Console |
46
+ | `:6535` | MCP (live Manifest) |
47
+ | `:6536` | Docs MCP (handbook search/fetch, read-only) |
66
48
 
67
- Prefer a worked teaching app (business logic + comments)? Use `--from-example notes|linkly|provisions|skyport` instead.
49
+ Mnemonic: **O·K·E = 6·5·3**.
68
50
 
69
- ### The idea, in one file
51
+ Every backend behavior is a Flow: `on(Trigger) → Effects`. World access goes through `fx`.
70
52
 
71
- A flow is a trigger, contracts, and a `do` that only talks to the world through `fx`:
53
+ Store apps sync schema with `oke db push|generate|migrate` (local `oke dev`
54
+ auto-pushes). Prefer `store.schema.table` + `field.*` or keep a
55
+ hand-written Drizzle `schema.ts`.
72
56
 
73
- ### `examples/notes/src/flows/notes/index.ts`
57
+ ### Resource Flow
74
58
 
75
59
  ```typescript
76
- import { on, flow, http } from "okengine";
60
+ import { on, http, store } from "okengine";
77
61
  import { createInsertSchema, createSelectSchema } from "drizzle-zod";
78
- import { z } from "zod";
79
62
  import { db } from "../../core";
80
- import { notes } from "../../schema";
81
-
82
- // Contracts derived from the schema — one source of truth, refined where the API is stricter
83
- const NewNote = createInsertSchema(notes, { title: (s) => s.min(1).max(120) })
84
- .omit({ id: true, createdAt: true });
85
- const Note = createSelectSchema(notes);
86
- const NoteId = z.object({ id: z.string() });
87
- const NotFound = z.object({});
88
-
89
- export const create = on(http.post("/notes"), flow({
63
+ import { notes as notesTable } from "../../schema";
64
+
65
+ // Contracts derived from the schema — one source of truth.
66
+ const NewNote = createInsertSchema(notesTable, { title: (s) => s.min(1).max(120) }).omit({
67
+ id: true,
68
+ createdAt: true,
69
+ });
70
+ const Note = createSelectSchema(notesTable);
71
+
72
+ // One declarative resource: list (cursor + search + filters + order +
73
+ // select), create (201), get / update / remove with typed NotFound.
74
+ const notesR = store.resource(db, notesTable, {
90
75
  in: NewNote,
91
- out: NoteId,
92
- do: async (input, fx) => {
93
- const [note] = await fx.store(db).insert(notes).values(input).returning();
94
- return { id: note.id };
95
- },
96
- }));
97
- // effects → writes[sql:notes]
98
-
99
- export const list = on(http.get("/notes"), flow({
100
- out: Note.array(),
101
- do: (_, fx) => fx.store(db).select().from(notes),
102
- }));
103
- // effects → reads[sql:notes]
104
-
105
- export const get = on(http.get("/notes/:id"), flow({
106
- in: NoteId,
107
76
  out: Note,
108
- errors: { NotFound },
109
- do: async ({ id }, fx) => (await fx.store(db).findById(notes, id)) ?? fx.fail("NotFound", {}),
110
- }));
111
-
112
- export const remove = on(http.delete("/notes/:id"), flow({
113
- in: NoteId,
114
- errors: { NotFound },
115
- do: async ({ id }, fx) => {
116
- const deleted = await fx.store(db).delete(notes, id);
117
- if (!deleted) return fx.fail("NotFound", {});
77
+ update: NewNote.partial(),
78
+ list: {
79
+ cursor: [notesTable.createdAt, notesTable.id],
80
+ direction: "desc",
81
+ limit: 20,
82
+ maxLimit: 100,
83
+ search: [notesTable.title],
84
+ filter: "all",
85
+ order: "all",
118
86
  },
119
- }));
120
- ```
121
-
122
- Wire the unit into the app. The client needs only this type — no separate codegen:
123
-
124
- ### `examples/notes/src/app.ts`
125
-
126
- ```typescript
127
- import { oke } from "okengine";
128
- import * as notes from "./flows/notes";
129
-
130
- export const app = oke({ name: "notes" }).adopt({ notes });
131
-
132
- export type App = typeof app; // ← the client needs nothing else
87
+ unit: "notes",
88
+ breaking: true,
89
+ });
90
+
91
+ // Mount all five verbs: list/create on /notes, get/update/remove on /notes/:id.
92
+ // `on(http.resource(...))` returns the ops bag; spread it into named exports
93
+ // so `adopt({ notes })` registers each flow under the unit.
94
+ const mounted = on(http.resource("/notes", notesR.all()));
95
+
96
+ export const list = mounted.list;
97
+ export const create = mounted.create;
98
+ export const get = mounted.get;
99
+ export const update = mounted.update;
100
+ export const remove = mounted.remove;
133
101
  ```
134
102
 
135
- The rest of the scaffold is small and ordinary: `oke.config.ts` (drivers by protocol), `src/schema.ts` (Drizzle table), `src/core.ts` (`store.sql`). Full walkthrough: [`docs/spec/four-applications.md`](docs/spec/four-applications.md) · §1 Notes.
136
-
137
- ---
138
-
139
- ## How to learn (read in order)
140
-
141
- Start on the site if you want the handbook path: [Introduction](https://okengine.vercel.app/docs/get-started/introduction) → [Installation](https://okengine.vercel.app/docs/get-started/installation) → [Basic usage](https://okengine.vercel.app/docs/get-started/basic-usage).
142
-
143
- Each teaching app adds the smallest next set of ideas. Do not skip ahead.
144
-
145
- 1. **Notes** — `oke`, `on`, `flow`, `http`, `store.sql`, `fx`, typed errors, typed client
146
- → [`examples/notes`](examples/notes)
147
-
148
- 2. **Linkly** — `signal` (three delivery physics), `clock`, `gate`, triggers beyond HTTP, transactional emit
149
- → [`examples/linkly`](examples/linkly)
150
-
151
- 3. **Provisions** — durable flows, `vault`, `channel`, live queries, plugins, CDC, cache tiers
152
- → [`examples/provisions`](examples/provisions)
153
-
154
- 4. **Skyport** — `ai`, multi-tenancy, SLOs, distributed topology, scaling axes
155
- → [`examples/skyport`](examples/skyport)
156
-
157
- Same path in the spec: [`docs/spec/four-applications.md`](docs/spec/four-applications.md).
158
-
159
- ---
103
+ Full walkthrough: [Basic usage](https://oke.omqkhafi.dev/docs/get-started/basic-usage).
160
104
 
161
105
  ## Documentation
162
106
 
163
- - **Site** [okengine.vercel.app](https://okengine.vercel.app) (landing) · [handbook](https://okengine.vercel.app/docs) (handbook) · [changelog](https://okengine.vercel.app/changelog)
164
- - **Agents on the site** — [`/llms.txt`](https://okengine.vercel.app/llms.txt) index · [`/llms-full.txt`](https://okengine.vercel.app/llms-full.txt) full text · `/llms.mdx/docs/...` per-page markdown
165
- - **Docs MCP** — `:6536` · tools `oke.docs.search` / `oke.docs.get` (read-only; Host/Origin validated like the other surfaces)
166
- - **App MCP** — `:6535` · live Manifest, schemas, effects, traces, Console-safe actions (Bearer + confirmation for writes)
167
- - **Canonical specs in-repo** — [`docs/spec/`](docs/spec) (unified theory, four applications, Console)
168
-
169
- ---
170
-
171
- ## The eight elements
172
-
173
- An element earns its place only if it has irreducible physics. New tech becomes a **driver**, never a ninth element.
174
-
175
- | Element | Essence | Replaces |
176
- |---|---|---|
177
- | **Flow** | behavior | endpoint, handler, consumer, job, workflow |
178
- | **Signal** | data in motion | queue, pub/sub, stream, websocket, SSE |
179
- | **Store** | data at rest | DB, cache, KV, files, search (`sql` · `kv` · `files` · `index`) |
180
- | **Clock** | time | cron, delay, timeout, durable sleep, TTL |
181
- | **Gate** | permission to act | auth, session, ABAC, rate limit, quota, flags |
182
- | **Vault** | protected knowledge | secrets, config, env |
183
- | **Channel** | reaching humans | email, SMS, WhatsApp, push |
184
- | **AI** | reaching machine intelligence | models, prompts, embeddings, agents, RAG |
185
-
186
- ---
187
-
188
- ## What the Manifest is for
189
-
190
- Your TypeScript compiles to `manifest.oke.json`. From that one artifact the rest is derived — client, docs, Console, security matrix, Docker, bundle, tests ([unified theory §8](docs/spec/unified-theory.md#8-the-manifest--the-100-year-artifact)):
191
-
192
- ```mermaid
193
- flowchart TD
194
- code["your code"] -->|compile| manifest["manifest.oke.json"]
195
- manifest --> client["typed client (+ live queries)"]
196
- manifest --> docs["OpenAPI + AsyncAPI + documentation"]
197
- manifest --> arch["architecture diagram (provably accurate — it IS the system)"]
198
- manifest --> console["Console panels, traces, explorers"]
199
- manifest --> mcp["MCP surface for AI agents"]
200
- manifest --> caps["least-privilege capability matrix"]
201
- manifest --> cache["cache invalidation keys"]
202
- manifest --> replica["replica read-routing plan"]
203
- manifest --> docker["Dockerfile + per-role compose files"]
204
- manifest --> bundle["tree-shaken bundle contents"]
205
- manifest --> harness["test harness wiring"]
206
- ```
207
-
208
- ---
209
-
210
- ## Console
211
-
212
- Seventeen panels on `:6533` (app `:6530`, MCP `:6535`): Overview, Flows, Signals, Store, Clock, Gates, Vault, Channels, AI, Architecture, Traces, Runs, Manifest Diff, Access, Plugins — plus Privacy and Tenancy when those plugins are plugged.
213
-
214
- Operator and user planes stay separate. Every Console action is a real flow through `fx`, so the audit log is the trace. Spec: [`docs/spec/console.md`](docs/spec/console.md) · handbook: [console handbook](https://okengine.vercel.app/docs/console/overview).
215
-
216
- ---
217
-
218
- ## How to deploy
219
-
220
- OKE is self-host first — no cloud lock-in. Production artefacts are **derived from the Manifest**, not hand-written: Dockerfile, per-role compose files, and the same entry production actually runs ([unified theory §8](docs/spec/unified-theory.md#8-the-manifest--the-100-year-artifact), [§18](docs/spec/unified-theory.md#18-three-scaling-axes-never-conflated)).
221
-
222
- 1. **Configure drivers and images** in `oke.config.ts` — drivers named after protocols; vendor images keyed by role (e.g. `store.sql`, `store.kv`).
223
- 2. **Check the machine** before you ship:
224
-
225
- ```bash
226
- oke doctor # secrets, ports, drivers, tenancy, schema drift
227
- oke doctor --json # -j agents / CI: JSON on stdout, hints on stderr
228
- oke stack # preview resolved images/tags/ports — writes nothing
229
- oke images list # recipe · image · tag · digest · size (writes nothing)
230
- ```
231
-
232
- 3. **Derive Docker / compose**, then pin digests so tags cannot drift:
233
-
234
- ```bash
235
- oke docker # writes under docker/ (Dockerfile + compose.<role>.yml · …)
236
- oke docker --prod # -p healthchecks, volumes, limits, secret refs, deploy.replicas
237
- oke images pin # tags → digests in oke.images.lock
238
- ```
239
-
240
- 4. **Run what production runs.** `oke start` is the Docker `CMD` — the same process locally and in the container:
241
-
242
- ```bash
243
- oke start # app on :6530 (Console :6533 stays on in prod, behind auth)
244
- ```
245
-
246
- Horizontal scale is the **Clone** axis: run N instances; `oke docker --prod` emits `deploy.replicas`. Split into one container per unit is the **topology** axis — code unchanged (`monolith` vs `services`). For a tiny edge bundle: `oke build --target edge` (`-t`; < 15 kB kernel profile).
247
-
248
- There is no separate “deploy to our cloud” product. You take the derived Dockerfile/compose and run them on whatever host you choose.
249
-
250
- ---
251
-
252
- ## CLI
253
-
254
- Everyday:
255
-
256
- ```bash
257
- bun add okengine # ONE package
258
-
259
- oke dev # watch · hot reload · Console :6533 · app :6530 · MCP :6535
260
- # → also auto-syncs client types on every save
261
- oke dev --stack # -s infra only under docker/ (Postgres/Redis/…); app stays on host Bun
262
- oke dev -s store.sql,store.kv # partial: only these roles get real backends
263
-
264
- oke start # runs exactly what production runs (this is the Docker CMD)
265
- oke doctor # verify secrets, ports, drivers, tenancy, schema drift
266
- oke doctor --diff # -d CI gate: undeclared Manifest contract breaks
267
- oke doctor --json # -j JSON on stdout; hints on stderr (agents / MCP)
268
- oke stack # preview resolved images/tags/ports — writes nothing
269
- oke stack --json # -j
270
- ```
271
-
272
- Schema, vault, client, Docker, build, eval, branch, privacy, upgrade:
273
-
274
- ```bash
275
- oke schema generate # core + plugin tables → schema/oke.ts (--check|-c in CI)
276
- oke vault set STRIPE_KEY # also: list · import .env · key rotate
277
- oke client add <url> # types for a separate frontend repo
278
-
279
- oke docker # artefacts under docker/ (Dockerfile + compose.<role>.yml · …)
280
- oke docker --prod # -p healthchecks, volumes, limits, secret refs, deploy.replicas
281
- oke images list # recipe · image · tag · digest · size (--json|-j)
282
- oke images pin # tags → digests in oke.images.lock
283
-
284
- oke build --target edge # -t < 15 kB kernel profile
285
- oke eval # run prompt eval sets; fails CI on regression
286
- oke branch prod --at "yesterday" # -a fork journaled state into a sandbox
287
- oke privacy erase --subject <id> # -s crypto-shredding: deletes the key, not the terabytes
288
- oke upgrade # dry-run codemods + diff; --apply|-a to write
289
- oke gates list # Module:Action catalogue (--json|-j)
290
- ```
291
-
292
- Shell completion (generated from the command registry — not a hand-maintained script):
293
-
294
- ```bash
295
- eval "$(oke completion bash)"
296
- eval "$(oke completion zsh)"
297
- oke completion fish | source
298
- ```
299
-
300
- Long form is canonical in docs; short form is convenience only. Shared letters follow git’s pattern (different meanings on different subcommands — e.g. `-c` is `--check` on `schema generate`, `--config` on `stack` / `docker` / `images`).
301
-
302
- | Long | Short | Where |
303
- |------|-------|--------|
304
- | `--stack` | `-s` | `dev` |
305
- | `--prod` | `-p` | `docker` |
306
- | `--port` | `-p` | `start` |
307
- | `--check` | `-c` | `schema generate` |
308
- | `--config` | `-c` | `stack`, `docker`, `images` |
309
- | `--apply` | `-a` | `upgrade` |
310
- | `--at` | `-a` | `branch` |
311
- | `--after` | `-a` | `doctor --diff` |
312
- | `--target` | `-t` | `build` |
313
- | `--diff` | `-d` | `doctor` |
314
- | `--json` | `-j` | `doctor`, `stack`, `images list`, `gates list` |
315
- | `--manifest` | `-m` | most Manifest readers |
316
- | `--entry` | `-e` | `dev`, `start`, `build` |
317
- | `--out` / `--outdir` | `-o` | writers |
318
- | `--subject` | `-s` | `privacy erase` |
319
- | `--before` | `-b` | `doctor --diff` |
320
- | `--base` | `-B` | `doctor --diff` |
321
-
322
- | Exit | Meaning |
323
- |------|---------|
324
- | **0** | success |
325
- | **1** | usage / validation |
326
- | **2** | runtime / environment / check failure |
327
-
328
- `oke help` prints the same flag and exit-code tables.
329
-
330
- ---
331
-
332
- ## Plugins and security
333
-
334
- `.plug()` attaches a plugin. Scope is the attachment point: `app.plug()` app-wide, `unit.plug()` one unit, `flow.plug()` one flow. No `global: true`, no inheritance rule — [unified theory §14](docs/spec/unified-theory.md#14-plugins--the-extensibility-law).
335
-
336
- The Console is treated as internet-facing even on localhost. Host header validation, Origin validation, and authentication are mandatory on `:6530`, `:6533`, and `:6535` ([console.md §10](docs/spec/console.md#10-security-posture)): two-plane auth (operator vs user), capability-scoped tokens. Docs MCP `:6536` uses the same Host/Origin checks and stays read-only (no Bearer writes).
337
-
338
- ---
339
-
340
- ## Why Bun, one package, MIT
341
-
342
- **Bun-first** — toolchain stays on latest (TypeScript 7, Bun, oxc): greenfield, speed is part of the promise. User floor stays conservative; adopted infra pins stable digests ([§11](docs/spec/unified-theory.md#11-always-latest--in-three-tiers)).
343
-
344
- **One package** — `okengine` with subpath exports, not a monorepo of many packages to assemble. Small enough to be *finished* ([§27](docs/spec/unified-theory.md#27-package-structure-one-published-package), [§29](docs/spec/unified-theory.md#29-why-this-survives-a-hundred-years)).
345
-
346
- **MIT** — no BSL/SSPL; self-host first; drivers as the community surface. Adopt what exists; bind through Bun’s native clients ([§9](docs/spec/unified-theory.md#9-adopt-dont-reinvent--but-bind-natively), [§16](docs/spec/unified-theory.md#16-the-default-table), [§29](docs/spec/unified-theory.md#29-why-this-survives-a-hundred-years)).
347
-
348
- ---
349
-
350
- ## Budgets
351
-
352
- Measured size and latency caps — see [`BUDGETS.md`](BUDGETS.md). Refresh with `bun run budgets`.
353
-
354
- ---
355
-
356
- ## Local framework link (try changes without publishing)
357
-
358
- To exercise a local `okengine` checkout inside an app (e.g. `oke-1`) without npm publish:
359
-
360
- ```bash
361
- # in the okengine repo
362
- bun link
363
- # if you changed the Console SPA:
364
- bun run build
365
-
366
- # in the app repo
367
- bun link okengine
368
- # edit okengine → restart `bun dev` in the app
369
- ```
370
-
371
- Alternatively set `"okengine": "file:../okengine"` in the app `package.json` and run `bun install`.
372
-
373
- ---
374
-
375
- ## Status
107
+ Everything beyond this page lives in the site handbook:
376
108
 
377
- Pre-1.0. Published on [npm](https://www.npmjs.com/package/okengine) and [JSR](https://jsr.io/@omqkhafi/okengine) (`okengine` + `create-oke`, lockstep). Docs at [okengine.vercel.app](https://okengine.vercel.app). MIT. No `CONTRIBUTING` yet — issues and PRs welcome.
109
+ | Resource | Link |
110
+ | ------------- | ------------------------------------------------------------------ |
111
+ | Docs site | [oke.omqkhafi.dev](https://oke.omqkhafi.dev) |
112
+ | Handbook | [/docs](https://oke.omqkhafi.dev/docs) |
113
+ | Changelog | [/changelog](https://oke.omqkhafi.dev/changelog) |
114
+ | Agents index | [/llms.txt](https://oke.omqkhafi.dev/llms.txt) |
115
+ | CLI reference | [/docs/reference/cli](https://oke.omqkhafi.dev/docs/reference/cli) |
116
+ | Manifest | [`manifest.v1.schema.json`](manifest.v1.schema.json) |
117
+ | Budgets | [`BUDGETS.md`](BUDGETS.md) |
118
+ | Contributing | [`CONTRIBUTING.md`](CONTRIBUTING.md) |
378
119
 
379
- | Resource | Path |
380
- |---|---|
381
- | Docs site | [okengine.vercel.app](https://okengine.vercel.app) · [handbook](https://okengine.vercel.app/docs) · [changelog](https://okengine.vercel.app/changelog) |
382
- | Unified theory | [`docs/spec/unified-theory.md`](https://github.com/omqkhafi/okengine/blob/main/docs/spec/unified-theory.md) |
383
- | Four applications | [`docs/spec/four-applications.md`](https://github.com/omqkhafi/okengine/blob/main/docs/spec/four-applications.md) |
384
- | Console | [`docs/spec/console.md`](https://github.com/omqkhafi/okengine/blob/main/docs/spec/console.md) |
385
- | Scaffold | [`packages/create-oke`](https://github.com/omqkhafi/okengine/tree/main/packages/create-oke) |
386
- | Changelog source | [`docs/changelog.md`](docs/changelog.md) |
120
+ Pre-1.0. Published on [npm](https://www.npmjs.com/package/okengine) and [JSR](https://jsr.io/@omqkhafi/okengine). MIT.
@@ -104,10 +104,7 @@
104
104
  "$defs": {
105
105
  "JsonSchema": {
106
106
  "description": "A JSON Schema document, or an opaque string ref produced by extraction.",
107
- "oneOf": [
108
- { "type": "string", "minLength": 1 },
109
- { "type": "object" }
110
- ]
107
+ "oneOf": [{ "type": "string", "minLength": 1 }, { "type": "object" }]
111
108
  },
112
109
  "ResourceRef": {
113
110
  "description": "Store resource: facet:name (sql:table, kv:namespace, files:bucket, index:name).",
@@ -289,10 +286,7 @@
289
286
  "durable": { "type": "boolean" },
290
287
  "live": { "type": "boolean" },
291
288
  "cache": {
292
- "oneOf": [
293
- { "type": "boolean" },
294
- { "type": "string", "minLength": 1 }
295
- ]
289
+ "oneOf": [{ "type": "boolean" }, { "type": "string", "minLength": 1 }]
296
290
  },
297
291
  "cacheKeys": {
298
292
  "description": "Computed invalidation key expression (derived or declared).",
@@ -342,6 +336,38 @@
342
336
  "retain": { "type": "string", "minLength": 1 }
343
337
  }
344
338
  },
339
+ "DeclaredColumn": {
340
+ "description": "Abstract schema column (DDL shape + optional classification). Bare ColumnClassification remains valid.",
341
+ "type": "object",
342
+ "additionalProperties": false,
343
+ "properties": {
344
+ "type": { "type": "string", "enum": ["text", "integer"] },
345
+ "nullable": { "type": "boolean" },
346
+ "primaryKey": { "type": "boolean" },
347
+ "unique": { "type": "boolean" },
348
+ "default": {
349
+ "anyOf": [
350
+ { "type": "string" },
351
+ { "type": "number" },
352
+ { "type": "boolean" },
353
+ { "type": "null" }
354
+ ]
355
+ },
356
+ "sqlName": { "type": "string", "minLength": 1 },
357
+ "pii": { "type": "boolean" },
358
+ "sensitive": { "type": "boolean" },
359
+ "retain": { "type": "string", "minLength": 1 },
360
+ "references": {
361
+ "description": "Foreign key target from field.*.references().",
362
+ "type": "object",
363
+ "additionalProperties": false,
364
+ "properties": {
365
+ "table": { "type": "string", "minLength": 1 },
366
+ "column": { "type": "string", "minLength": 1 }
367
+ }
368
+ }
369
+ }
370
+ },
345
371
  "Table": {
346
372
  "type": "object",
347
373
  "additionalProperties": false,
@@ -349,7 +375,12 @@
349
375
  "columns": {
350
376
  "type": "object",
351
377
  "propertyNames": { "type": "string", "minLength": 1 },
352
- "additionalProperties": { "$ref": "#/$defs/ColumnClassification" }
378
+ "additionalProperties": {
379
+ "oneOf": [
380
+ { "$ref": "#/$defs/DeclaredColumn" },
381
+ { "$ref": "#/$defs/ColumnClassification" }
382
+ ]
383
+ }
353
384
  },
354
385
  "classifications": {
355
386
  "description": "Field → classification tags (pii, sensitive, retain duration).",