okengine 0.18.5 → 0.19.1

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 (512) hide show
  1. package/AGENTS.md +18 -10
  2. package/README.md +2 -2
  3. package/package.json +51 -50
  4. package/site/content/docs/ai/llms-txt.mdx +1 -1
  5. package/site/content/docs/ai/skills.mdx +4 -1
  6. package/site/content/docs/client/auth.mdx +208 -0
  7. package/site/content/docs/client/calling.mdx +451 -0
  8. package/site/content/docs/client/index.mdx +208 -0
  9. package/site/content/docs/client/live.mdx +234 -0
  10. package/site/content/docs/client/meta.json +5 -0
  11. package/site/content/docs/client/react.mdx +249 -0
  12. package/site/content/docs/elements/ai/agents.mdx +235 -0
  13. package/site/content/docs/elements/ai/index.mdx +342 -0
  14. package/site/content/docs/elements/ai/mcp.mdx +275 -0
  15. package/site/content/docs/elements/ai/meta.json +5 -0
  16. package/site/content/docs/elements/ai/models.mdx +283 -0
  17. package/site/content/docs/elements/ai/prompts.mdx +257 -0
  18. package/site/content/docs/elements/channel/email.mdx +269 -0
  19. package/site/content/docs/elements/channel/index.mdx +344 -0
  20. package/site/content/docs/elements/channel/meta.json +5 -0
  21. package/site/content/docs/elements/channel/push.mdx +218 -0
  22. package/site/content/docs/elements/channel/receipts.mdx +206 -0
  23. package/site/content/docs/elements/channel/sms.mdx +264 -0
  24. package/site/content/docs/elements/channel/whatsapp.mdx +220 -0
  25. package/site/content/docs/elements/clock/index.mdx +301 -0
  26. package/site/content/docs/elements/clock/meta.json +5 -0
  27. package/site/content/docs/elements/clock/schedules.mdx +508 -0
  28. package/site/content/docs/elements/clock/sleep.mdx +448 -0
  29. package/site/content/docs/elements/flow/consumers.mdx +707 -0
  30. package/site/content/docs/elements/flow/http.mdx +1080 -0
  31. package/site/content/docs/elements/flow/index.mdx +618 -0
  32. package/site/content/docs/elements/flow/meta.json +5 -0
  33. package/site/content/docs/elements/flow/routing.mdx +559 -0
  34. package/site/content/docs/elements/flow/workflows.mdx +640 -0
  35. package/site/content/docs/elements/gate/auth.mdx +371 -0
  36. package/site/content/docs/elements/gate/authorization.mdx +298 -0
  37. package/site/content/docs/elements/gate/index.mdx +418 -0
  38. package/site/content/docs/elements/gate/meta.json +5 -0
  39. package/site/content/docs/elements/gate/rate-limits.mdx +365 -0
  40. package/site/content/docs/elements/gate/rls.mdx +303 -0
  41. package/site/content/docs/elements/gate/tenancy.mdx +375 -0
  42. package/site/content/docs/elements/index.mdx +20 -10
  43. package/site/content/docs/elements/signal/broadcast.mdx +519 -0
  44. package/site/content/docs/elements/signal/index.mdx +352 -0
  45. package/site/content/docs/elements/signal/live.mdx +591 -0
  46. package/site/content/docs/elements/signal/meta.json +5 -0
  47. package/site/content/docs/elements/signal/once.mdx +597 -0
  48. package/site/content/docs/elements/store/files.mdx +667 -0
  49. package/site/content/docs/elements/store/index.mdx +313 -0
  50. package/site/content/docs/elements/store/kv.mdx +637 -0
  51. package/site/content/docs/elements/store/meta.json +5 -0
  52. package/site/content/docs/elements/store/search.mdx +950 -0
  53. package/site/content/docs/elements/store/sql.mdx +941 -0
  54. package/site/content/docs/elements/vault/config.mdx +259 -0
  55. package/site/content/docs/elements/vault/index.mdx +356 -0
  56. package/site/content/docs/elements/vault/meta.json +5 -0
  57. package/site/content/docs/elements/vault/rotation.mdx +276 -0
  58. package/site/content/docs/elements/vault/secrets.mdx +288 -0
  59. package/site/content/docs/index.mdx +52 -40
  60. package/site/content/docs/meta.json +8 -7
  61. package/site/content/docs/plugins/cors.mdx +2 -1
  62. package/site/content/docs/plugins/csrf.mdx +4 -1
  63. package/site/content/docs/plugins/headers.mdx +2 -1
  64. package/site/content/docs/plugins/ip-allowlist.mdx +2 -1
  65. package/site/content/docs/plugins/magic-link.mdx +6 -0
  66. package/site/content/docs/plugins/maintenance-mode.mdx +2 -1
  67. package/site/content/docs/plugins/oauth.mdx +1 -1
  68. package/site/content/docs/plugins/otp.mdx +12 -1
  69. package/site/content/docs/plugins/passkey.mdx +39 -15
  70. package/site/content/docs/plugins/two-factor.mdx +91 -34
  71. package/site/content/docs/plugins/username.mdx +1 -1
  72. package/site/content/docs/recipes/caddy.mdx +3 -3
  73. package/site/content/docs/recipes/index.mdx +18 -28
  74. package/site/content/docs/recipes/mailpit.mdx +1 -1
  75. package/site/content/docs/recipes/meilisearch.mdx +3 -3
  76. package/site/content/docs/recipes/meta.json +1 -4
  77. package/site/content/docs/recipes/nginx.mdx +2 -2
  78. package/site/content/docs/recipes/openrouter.mdx +283 -0
  79. package/site/content/docs/recipes/pgdog.mdx +3 -3
  80. package/site/content/docs/recipes/postgres.mdx +1 -2
  81. package/site/content/docs/recipes/rustfs.mdx +2 -2
  82. package/site/content/docs/recipes/traefik.mdx +3 -3
  83. package/site/content/docs/reference/cli.mdx +231 -0
  84. package/site/content/docs/reference/configuration.mdx +30 -10
  85. package/site/content/docs/reference/environment-variables.mdx +93 -20
  86. package/site/content/docs/reference/errors.mdx +132 -29
  87. package/site/content/docs/reference/fx.mdx +138 -73
  88. package/site/content/docs/reference/index.mdx +13 -21
  89. package/site/content/docs/reference/meta.json +4 -5
  90. package/site/content/docs/reference/okid.mdx +42 -17
  91. package/site/content/docs/reference/plugins.mdx +4 -3
  92. package/site/content/docs/reference/security.mdx +197 -0
  93. package/site/content/docs/understand/meta.json +5 -0
  94. package/site/content/docs/understand/the-architecture.mdx +264 -0
  95. package/site/content/docs/understand/try-it.mdx +58 -0
  96. package/src/auth/api-keys.ts +2 -1
  97. package/src/auth/bindings.ts +64 -16
  98. package/src/auth/gate-auth.test.ts +6 -1
  99. package/src/auth/identity.ts +152 -5
  100. package/src/auth/index.ts +29 -0
  101. package/src/auth/invites.ts +2 -1
  102. package/src/auth/method-context.ts +41 -0
  103. package/src/auth/oauth-as/crypto.ts +2 -1
  104. package/src/auth/oauth-as/stores.ts +2 -1
  105. package/src/auth/operator.ts +2 -1
  106. package/src/auth/sessions-jwt.test.ts +77 -0
  107. package/src/auth/sessions.ts +20 -4
  108. package/src/auth/tenants.ts +3 -2
  109. package/src/auth/two-factor-challenge.test.ts +61 -0
  110. package/src/auth/two-factor-challenge.ts +284 -0
  111. package/src/auth/verification.ts +5 -0
  112. package/src/bench/REPORT.md +80 -0
  113. package/src/bench/g03-signal-once.bench.ts +1 -1
  114. package/src/bench/g10-observability-contention.bench.ts +1 -1
  115. package/src/bench/g17-hybrid-search.bench.ts +572 -0
  116. package/src/bench/load-app.ts +2 -10
  117. package/src/cli/ai-setup/ai-setup.test.ts +331 -42
  118. package/src/cli/ai-setup/apply.ts +294 -52
  119. package/src/cli/ai-setup/catalog.ts +238 -1342
  120. package/src/cli/ai-setup/index.ts +14 -99
  121. package/src/cli/ai-setup/prompts.ts +60 -443
  122. package/src/cli/ask-seed.test.ts +96 -0
  123. package/src/cli/ask-seed.ts +82 -0
  124. package/src/cli/ask-vault-gaps.test.ts +84 -0
  125. package/src/cli/ask-vault-gaps.ts +146 -0
  126. package/src/cli/build.ts +2 -2
  127. package/src/cli/client-add.test.ts +26 -1
  128. package/src/cli/client-add.ts +106 -27
  129. package/src/cli/db-seed.ts +2 -0
  130. package/src/cli/db.ts +150 -11
  131. package/src/cli/dev.ts +119 -211
  132. package/src/cli/docker-clean.ts +2 -2
  133. package/src/cli/docker-cli.test.ts +1 -1
  134. package/src/cli/doctor-diff.ts +4 -2
  135. package/src/cli/doctor-pii.test.ts +1 -1
  136. package/src/cli/doctor.ts +14 -1
  137. package/src/cli/hero-meta.test.ts +4 -2
  138. package/src/cli/load-config.images.test.ts +8 -10
  139. package/src/cli/load-config.ts +1 -1
  140. package/src/cli/registry.ts +22 -10
  141. package/src/cli/replay.ts +3 -1
  142. package/src/cli/start.ts +1 -1
  143. package/src/cli/tui/keys.ts +2 -3
  144. package/src/client/auth/cookies.ts +74 -0
  145. package/src/client/auth/create-auth-client.ts +636 -0
  146. package/src/client/auth/denials.ts +99 -0
  147. package/src/client/auth/session.ts +283 -0
  148. package/src/client/auth.test.ts +251 -0
  149. package/src/client/auth.ts +39 -114
  150. package/src/client/create-with-session.ts +245 -0
  151. package/src/client/create.ts +51 -5
  152. package/src/client/index.ts +11 -1
  153. package/src/client/live.ts +11 -79
  154. package/src/client/notes-contract.test.ts +5 -10
  155. package/src/client/sse.ts +137 -0
  156. package/src/client/stream.ts +147 -0
  157. package/src/client/transport.test.ts +32 -0
  158. package/src/client/transport.ts +123 -26
  159. package/src/client/types.ts +118 -14
  160. package/src/client-react/index.ts +185 -24
  161. package/src/client-react/use-live-query.ts +13 -3
  162. package/src/compiler/aot.test.ts +7 -4
  163. package/src/compiler/effects-embed.test.ts +56 -0
  164. package/src/compiler/effects-fetch.test.ts +43 -0
  165. package/src/compiler/effects-infer.ts +58 -2
  166. package/src/compiler/extract.test.ts +257 -43
  167. package/src/compiler/extract.ts +566 -48
  168. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -4
  169. package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +2 -8
  170. package/src/compiler/fixtures/skyport.expected.json +4 -4
  171. package/src/compiler/fixtures/triggers/five-triggers.ts +14 -10
  172. package/src/compiler/response.ts +2 -2
  173. package/src/compiler/search-writer-isolation.test.ts +40 -0
  174. package/src/config/index.ts +11 -0
  175. package/src/console/server/app.ts +17 -23
  176. package/src/console/server/bind.ts +4 -0
  177. package/src/console/server/console.test.ts +2 -2
  178. package/src/console/server/flows-invoke.test.ts +50 -34
  179. package/src/console/server/flows.ts +436 -255
  180. package/src/console/server/runs-ingest.test.ts +6 -3
  181. package/src/console/server/serve.ts +1 -1
  182. package/src/console/server/signals.test.ts +1 -5
  183. package/src/console/server/signals.ts +8 -6
  184. package/src/console/server/state.ts +6 -1
  185. package/src/console/server/store.ts +1 -1
  186. package/src/console/ui-next/dist/assets/FileExportIcon-Ck-5od4R.js +1 -0
  187. package/src/console/ui-next/dist/assets/MoreHorizontalCircle01Icon-gMNGsE37.js +1 -0
  188. package/src/console/ui-next/dist/assets/PlusSignIcon-CwG3nxfu.js +1 -0
  189. package/src/console/ui-next/dist/assets/UnavailableIcon-D9cvHVPr.js +1 -0
  190. package/src/console/ui-next/dist/assets/UserIcon-DaE2PB5_.js +1 -0
  191. package/src/console/ui-next/dist/assets/access-page-C_qLDhTq.js +4 -0
  192. package/src/console/ui-next/dist/assets/agent-disclosure-BHVqr3TN.js +1 -0
  193. package/src/console/ui-next/dist/assets/cache-glyph-CKe92lRQ.js +1 -0
  194. package/src/console/ui-next/dist/assets/call-pii-button-DEwTl8ZX.js +1 -0
  195. package/src/console/ui-next/dist/assets/collapsible-BCBtDrCt.js +1 -0
  196. package/src/console/ui-next/dist/assets/copy-inline-button-CAYD18cr.js +1 -0
  197. package/src/console/ui-next/dist/assets/dagre.esm-B1_XeuLP.js +1 -0
  198. package/src/console/ui-next/dist/assets/detail-header-DVWNjWjg.js +1 -0
  199. package/src/console/ui-next/dist/assets/dropdown-menu-4h2LOVXM.js +1 -0
  200. package/src/console/ui-next/dist/assets/duration-tone-JroqeuCp.js +9 -0
  201. package/src/console/ui-next/dist/assets/element-icons-BI8cJgdh.js +1 -0
  202. package/src/console/ui-next/dist/assets/explorer-empty-CJs5A-wm.js +1 -0
  203. package/src/console/ui-next/dist/assets/flows-page-CVHa0RTt.js +1 -0
  204. package/src/console/ui-next/dist/assets/highlighted-json-DjJW6hqe.js +154 -0
  205. package/src/console/ui-next/dist/assets/http-method-DC5HBdLU.js +1 -0
  206. package/src/console/ui-next/dist/assets/index-CYjiZ3WO.js +63 -0
  207. package/src/console/ui-next/dist/assets/index-D0zS5rKO.css +2 -0
  208. package/src/console/ui-next/dist/assets/observability-page-CAYMyKb3.js +4 -0
  209. package/src/console/ui-next/dist/assets/react-dom-Ddte4I-Q.js +9 -0
  210. package/src/console/ui-next/dist/assets/replica-lag-yAQYLv75.js +18 -0
  211. package/src/console/ui-next/dist/assets/request-meta-D0yusGxJ.js +1 -0
  212. package/src/console/ui-next/dist/assets/shortcut-keys-3ILd8oGn.js +1 -0
  213. package/src/console/ui-next/dist/assets/{sql-BskegiFM.js → sql-BsFa4tDR.js} +1 -1
  214. package/src/console/ui-next/dist/assets/store-page-BTKJeJ02.js +41 -0
  215. package/src/console/ui-next/dist/assets/trace-detail-sheet-Bp-Yygs5.js +2 -0
  216. package/src/console/ui-next/dist/assets/tree-expand-toggle-DoaVDfAM.js +55 -0
  217. package/src/console/ui-next/dist/assets/units-page-BRz7xyYL.js +1 -0
  218. package/src/console/ui-next/dist/assets/{use-vault-list-uk4WVboC.js → use-vault-list-CT4-gajj.js} +1 -1
  219. package/src/console/ui-next/dist/assets/vault-page-3jQt-bOJ.js +2 -0
  220. package/src/console/ui-next/dist/assets/xyflow-CSyC6ryz.css +1 -0
  221. package/src/console/ui-next/dist/assets/xyflow-yApv7D4e.js +7 -0
  222. package/src/console/ui-next/dist/index.html +6 -13
  223. package/src/console/ui-next/seed-invoke-host.ts +21 -18
  224. package/src/console/ui-next/src/client.ts +7 -2
  225. package/src/console/ui-next/src/features/flows/graph/element-map.test.ts +1 -1
  226. package/src/console/ui-next/src/features/flows/graph/element-map.ts +5 -3
  227. package/src/console/ui-next/src/features/flows/traces/effect-kind.ts +12 -2
  228. package/src/console/ui-next/src/features/flows/traces/effect-summary.ts +4 -0
  229. package/src/console/ui-next/src/features/flows/traces/trace-detail-sheet.tsx +8 -0
  230. package/src/console/ui-next/src/features/flows/traces/trace-detail.test.ts +4 -5
  231. package/src/console/ui-next/src/features/flows/traces/trace-gates.ts +3 -6
  232. package/src/console/ui-next/src/features/flows/traces/waterfall-bars.ts +4 -0
  233. package/src/console/ui-next/src/features/flows/traces/waterfall-tooltip.ts +9 -3
  234. package/src/console/ui-next/src/features/store/detail/reveal-cell.tsx +7 -11
  235. package/src/console/ui-next/src/features/store/detail/store-row-detail-sheet.tsx +2 -2
  236. package/src/console/ui-next/src/features/store/lib/fields-from-table.ts +2 -0
  237. package/src/console/ui-next/src/features/store/lib/grid-model.test.ts +25 -1
  238. package/src/console/ui-next/src/features/store/lib/grid-model.ts +36 -1
  239. package/src/console/ui-next/src/features/store/query/query-results.tsx +3 -3
  240. package/src/console/ui-next/src/features/units/detail/effects-summary.tsx +2 -0
  241. package/src/console/ui-next/src/features/units/lib/call-read-safe.ts +3 -1
  242. package/src/console/ui-next/src/features/units/lib/fields-from-schema.ts +6 -0
  243. package/src/docker/ai-model-status.test.ts +1 -12
  244. package/src/docker/ai-model-status.ts +10 -38
  245. package/src/docker/compose-up.test.ts +100 -0
  246. package/src/docker/compose-up.ts +292 -0
  247. package/src/docker/compose.ts +4 -14
  248. package/src/docker/derive.ts +9 -34
  249. package/src/docker/docker.test.ts +16 -261
  250. package/src/docker/images-config.test.ts +13 -25
  251. package/src/docker/index.ts +1 -24
  252. package/src/docker/recipes/index.ts +0 -23
  253. package/src/docker/recipes/pgdog.ts +6 -4
  254. package/src/docker/stack-id.test.ts +2 -2
  255. package/src/docker/stack-id.ts +0 -1
  256. package/src/docker/types.ts +2 -2
  257. package/src/drivers/ai-anthropic.ts +10 -0
  258. package/src/drivers/ai-openai-compatible.ts +34 -7
  259. package/src/drivers/ai-providers.test.ts +0 -107
  260. package/src/drivers/ai-stream.test.ts +0 -34
  261. package/src/drivers/ai-types.ts +17 -8
  262. package/src/drivers/channel-fcm.ts +6 -1
  263. package/src/drivers/channel-msegat.ts +6 -1
  264. package/src/drivers/channel-resend.ts +5 -1
  265. package/src/drivers/channel-smtp.ts +5 -1
  266. package/src/drivers/channel-sndr.ts +10 -1
  267. package/src/drivers/channel-taqnyat-mail.ts +5 -1
  268. package/src/drivers/channel-taqnyat-whatsapp.ts +6 -1
  269. package/src/drivers/channel-taqnyat.ts +6 -1
  270. package/src/drivers/channel-types.ts +10 -0
  271. package/src/drivers/channel-unifonic.ts +6 -1
  272. package/src/drivers/channel-wa-cloud.ts +6 -1
  273. package/src/drivers/channel-webpush.ts +6 -1
  274. package/src/drivers/external.ts +33 -0
  275. package/src/drivers/index.ts +0 -10
  276. package/src/drivers/meilisearch.ts +6 -0
  277. package/src/drivers/oauth-types.ts +4 -0
  278. package/src/drivers/postgres.test.ts +74 -3
  279. package/src/drivers/postgres.ts +175 -6
  280. package/src/drivers/signal-types.ts +5 -5
  281. package/src/drivers/types.ts +7 -0
  282. package/src/drivers/vault-types.ts +5 -0
  283. package/src/elements/ai/declare.ts +17 -4
  284. package/src/elements/ai/eval.ts +1 -1
  285. package/src/elements/ai/mcp-http.ts +1 -1
  286. package/src/elements/ai/pii.ts +1 -1
  287. package/src/elements/ai/providers.test.ts +289 -0
  288. package/src/elements/ai/providers.ts +169 -0
  289. package/src/elements/ai/runtime.ts +68 -5
  290. package/src/elements/ai/schema.ts +2 -2
  291. package/src/elements/ai.test.ts +7 -7
  292. package/src/elements/ai.ts +17 -1
  293. package/src/elements/channel/runtime.ts +105 -12
  294. package/src/elements/clock/cron-fields.test.ts +144 -0
  295. package/src/elements/clock/cron-fields.ts +185 -0
  296. package/src/elements/clock/declare.ts +247 -3
  297. package/src/elements/clock.ts +21 -1
  298. package/src/elements/gate/declare.ts +1 -1
  299. package/src/elements/gate.ts +1 -1
  300. package/src/elements/index.ts +15 -0
  301. package/src/elements/signal/chaos-child.ts +1 -2
  302. package/src/elements/signal/declare.ts +65 -37
  303. package/src/elements/signal/delivery-modes.test.ts +11 -31
  304. package/src/elements/signal/dry-run-replay.test.ts +1 -7
  305. package/src/elements/signal/dry-run-write-isolation.test.ts +1 -7
  306. package/src/elements/signal/key-ordering.test.ts +6 -26
  307. package/src/elements/signal/lease-reclaim.test.ts +2 -6
  308. package/src/elements/signal/optional-emit.test.ts +6 -9
  309. package/src/elements/signal/order-lifecycle.test.ts +4 -17
  310. package/src/elements/signal/orphan-messages.test.ts +4 -15
  311. package/src/elements/signal/reconcile.test.ts +2 -2
  312. package/src/elements/signal/runtime.ts +1 -1
  313. package/src/elements/signal/schema-emit.test.ts +4 -8
  314. package/src/elements/signal.test.ts +24 -49
  315. package/src/elements/signal.ts +9 -2
  316. package/src/elements/store/domain-ddl.test.ts +1 -1
  317. package/src/elements/store/live-http.test.ts +9 -4
  318. package/src/elements/store/prepare-row.test.ts +123 -0
  319. package/src/elements/store/resource.ts +43 -12
  320. package/src/elements/store/schema-decl.ts +117 -0
  321. package/src/elements/store/search-backfill.ts +205 -0
  322. package/src/elements/store/search-bind.ts +66 -0
  323. package/src/elements/store/search-bm25.ts +78 -0
  324. package/src/elements/store/search-ddl.ts +156 -0
  325. package/src/elements/store/search-embed-flow.ts +141 -0
  326. package/src/elements/store/search-errors.ts +34 -0
  327. package/src/elements/store/search-fusion.ts +112 -0
  328. package/src/elements/store/search-lsh.ts +214 -0
  329. package/src/elements/store/search-runtime.pglite.test.ts +186 -0
  330. package/src/elements/store/search-runtime.ts +314 -0
  331. package/src/elements/store/search.test.ts +226 -0
  332. package/src/elements/store/sql-session.test.ts +1 -0
  333. package/src/elements/store/sql-session.ts +83 -3
  334. package/src/elements/store/table.ts +23 -2
  335. package/src/elements/store/upsert-app.test.ts +1 -3
  336. package/src/elements/store.ts +52 -0
  337. package/src/full.ts +4 -2
  338. package/src/http.ts +4 -1
  339. package/src/i18n/catalogs/ar.ts +14 -6
  340. package/src/i18n/catalogs/en.ts +14 -6
  341. package/src/index.ts +6 -1
  342. package/src/kernel/adopt-barrel-fresh.test.ts +7 -7
  343. package/src/kernel/adopt-routes.ts +9 -1
  344. package/src/kernel/app-auth.ts +5 -0
  345. package/src/kernel/app.ts +102 -9
  346. package/src/kernel/auto-cache.test.ts +6 -12
  347. package/src/kernel/auto-registry.test.ts +3 -3
  348. package/src/kernel/boot-bind/ai.test.ts +22 -19
  349. package/src/kernel/boot-bind/ai.ts +5 -43
  350. package/src/kernel/boot-bind/clock.ts +23 -5
  351. package/src/kernel/boot-bind/honor-config.test.ts +4 -4
  352. package/src/kernel/boot.test.ts +11 -6
  353. package/src/kernel/boot.ts +66 -16
  354. package/src/kernel/boundary-contract.ts +93 -0
  355. package/src/kernel/budget.test.ts +1 -1
  356. package/src/kernel/call.ts +89 -0
  357. package/src/kernel/capability.ts +6 -0
  358. package/src/kernel/client-descriptor.ts +123 -0
  359. package/src/kernel/clock-timezone.test.ts +80 -0
  360. package/src/kernel/correlation.test.ts +1 -1
  361. package/src/kernel/dry-run.ts +11 -8
  362. package/src/kernel/effects-stamping.test.ts +42 -9
  363. package/src/kernel/effects.test.ts +4 -2
  364. package/src/kernel/effects.ts +51 -9
  365. package/src/kernel/errors-channel.ts +17 -0
  366. package/src/kernel/errors-live-resume.ts +3 -2
  367. package/src/kernel/errors-tenant.ts +7 -4
  368. package/src/kernel/errors.registry-helpers.ts +96 -0
  369. package/src/kernel/errors.registry.test.ts +139 -25
  370. package/src/kernel/errors.ts +102 -23
  371. package/src/kernel/external-effects.test.ts +196 -0
  372. package/src/kernel/flow.test.ts +13 -4
  373. package/src/kernel/flow.ts +69 -71
  374. package/src/kernel/fx-ask-telemetry.test.ts +2 -2
  375. package/src/kernel/fx-dead-letters.test.ts +3 -3
  376. package/src/kernel/fx-fetch.ts +55 -0
  377. package/src/kernel/fx-live-stream.ts +2 -2
  378. package/src/kernel/fx-live.test.ts +8 -8
  379. package/src/kernel/fx.test.ts +17 -11
  380. package/src/kernel/fx.ts +180 -57
  381. package/src/kernel/horizontal-child.ts +1 -1
  382. package/src/kernel/http-query.test.ts +3 -6
  383. package/src/kernel/index.ts +13 -3
  384. package/src/kernel/instance-id.ts +1 -1
  385. package/src/kernel/instances.test.ts +40 -0
  386. package/src/kernel/instances.ts +47 -9
  387. package/src/kernel/live-http.test.ts +6 -7
  388. package/src/kernel/live-http.ts +6 -2
  389. package/src/kernel/live-resume.test.ts +1 -1
  390. package/src/kernel/mcp-tool.test.ts +3 -3
  391. package/src/kernel/on.ts +98 -4
  392. package/src/kernel/pipeline.test.ts +12 -15
  393. package/src/kernel/plugin-elements.test.ts +1 -1
  394. package/src/kernel/stamp-http.test.ts +3 -3
  395. package/src/kernel/triggers.ts +210 -95
  396. package/src/kernel-entry.ts +0 -1
  397. package/src/manifest/diff.ts +11 -1
  398. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  399. package/src/manifest/types.ts +46 -2
  400. package/src/mcp/docs-index.ts +3 -3
  401. package/src/mcp/docs-mcp.test.ts +2 -2
  402. package/src/mcp/docs-tools.ts +2 -1
  403. package/src/okid.test.ts +56 -0
  404. package/src/okid.ts +55 -11
  405. package/src/plugins/anonymous.ts +8 -4
  406. package/src/plugins/auth/shared.ts +27 -3
  407. package/src/plugins/auth-delivery.mailpit.integration.test.ts +1 -1
  408. package/src/plugins/auth-methods.security.test.ts +561 -23
  409. package/src/plugins/config-source.ts +1 -1
  410. package/src/plugins/csrf.test.ts +65 -0
  411. package/src/plugins/index.ts +2 -0
  412. package/src/plugins/magic-link.ts +36 -16
  413. package/src/plugins/oauth/shared.ts +3 -1
  414. package/src/plugins/oauth.ts +22 -14
  415. package/src/plugins/otp.ts +37 -21
  416. package/src/plugins/passkey-webauthn.ts +9 -6
  417. package/src/plugins/passkey.ts +98 -26
  418. package/src/plugins/pre-account-hijack.test.ts +223 -0
  419. package/src/plugins/two-factor.ts +466 -37
  420. package/src/plugins/username.ts +19 -7
  421. package/src/release/build-lib.ts +1 -0
  422. package/src/release/limits.ts +2 -2
  423. package/src/release/measure.ts +1 -1
  424. package/src/runs/collect.test.ts +0 -2
  425. package/src/runtime/json-code-block.test.ts +250 -20
  426. package/src/runtime/json-code-block.ts +1261 -41
  427. package/src/term.test.ts +1 -1
  428. package/src/test/create-test-app.test.ts +12 -12
  429. package/src/test/live-signals.test.ts +6 -6
  430. package/src/test/provisions.integration.test.ts +10 -14
  431. package/src/test/reset-element-registries.ts +1 -1
  432. package/src/test/tenant-isolation.test.ts +12 -6
  433. package/site/content/docs/deployment/docker-swarm.mdx +0 -164
  434. package/site/content/docs/deployment/docker.mdx +0 -227
  435. package/site/content/docs/deployment/index.mdx +0 -83
  436. package/site/content/docs/deployment/kubernetes.mdx +0 -176
  437. package/site/content/docs/deployment/meta.json +0 -5
  438. package/site/content/docs/deployment/reverse-proxy.mdx +0 -234
  439. package/site/content/docs/elements/ai.mdx +0 -385
  440. package/site/content/docs/elements/channel.mdx +0 -346
  441. package/site/content/docs/elements/clock.mdx +0 -244
  442. package/site/content/docs/elements/flow.mdx +0 -420
  443. package/site/content/docs/elements/gate.mdx +0 -436
  444. package/site/content/docs/elements/signal.mdx +0 -380
  445. package/site/content/docs/elements/store.mdx +0 -1099
  446. package/site/content/docs/elements/vault.mdx +0 -405
  447. package/site/content/docs/get-started/basic-usage.mdx +0 -173
  448. package/site/content/docs/get-started/index.mdx +0 -43
  449. package/site/content/docs/get-started/installation.mdx +0 -220
  450. package/site/content/docs/get-started/introduction.mdx +0 -144
  451. package/site/content/docs/get-started/meta.json +0 -13
  452. package/site/content/docs/get-started/project-structure.mdx +0 -925
  453. package/site/content/docs/get-started/testing.mdx +0 -328
  454. package/site/content/docs/get-started/why.mdx +0 -114
  455. package/site/content/docs/recipes/llama-cpp.mdx +0 -151
  456. package/site/content/docs/recipes/ollama.mdx +0 -142
  457. package/site/content/docs/recipes/sglang.mdx +0 -105
  458. package/site/content/docs/recipes/vllm.mdx +0 -106
  459. package/site/content/docs/reference/cli.md +0 -232
  460. package/site/content/docs/reference/client.mdx +0 -469
  461. package/site/content/docs/reference/security.md +0 -74
  462. package/src/cli/ai-setup/detect-ollama.ts +0 -213
  463. package/src/cli/ai-setup/recommend.test.ts +0 -225
  464. package/src/cli/ai-setup/recommend.ts +0 -225
  465. package/src/cli/dev-controls.test.ts +0 -122
  466. package/src/cli/dev-controls.ts +0 -164
  467. package/src/cli/tui/DevLive.tsx +0 -126
  468. package/src/console/ui-next/dist/assets/access-page-3-EFj-2G.js +0 -4
  469. package/src/console/ui-next/dist/assets/agent-disclosure-BP0Y0Sux.js +0 -1
  470. package/src/console/ui-next/dist/assets/cache-glyph-B5X-NM0-.js +0 -1
  471. package/src/console/ui-next/dist/assets/call-pii-button-ChAUiLo9.js +0 -1
  472. package/src/console/ui-next/dist/assets/collapsible-DGnOM2ph.js +0 -1
  473. package/src/console/ui-next/dist/assets/copy-inline-button-DBHhgHKP.js +0 -1
  474. package/src/console/ui-next/dist/assets/dagre.esm-ZwcdTuZZ.js +0 -1
  475. package/src/console/ui-next/dist/assets/detail-header-DhHM1iaZ.js +0 -1
  476. package/src/console/ui-next/dist/assets/dropdown-menu-_NjTEo5_.js +0 -1
  477. package/src/console/ui-next/dist/assets/duration-tone-sC3lGABz.js +0 -9
  478. package/src/console/ui-next/dist/assets/element-icons-BVXtRyd3.js +0 -1
  479. package/src/console/ui-next/dist/assets/explorer-empty-2uIhBu0_.js +0 -1
  480. package/src/console/ui-next/dist/assets/flows-page-cVFnA4HH.js +0 -1
  481. package/src/console/ui-next/dist/assets/highlighted-json-Awq7gYdu.js +0 -154
  482. package/src/console/ui-next/dist/assets/http-method-_UHM2ODJ.js +0 -1
  483. package/src/console/ui-next/dist/assets/index-CMIgUbD0.js +0 -66
  484. package/src/console/ui-next/dist/assets/index-Ck88Jmv8.css +0 -2
  485. package/src/console/ui-next/dist/assets/link-BX6Vqztd.js +0 -1
  486. package/src/console/ui-next/dist/assets/observability-page-CQ3p34ip.js +0 -4
  487. package/src/console/ui-next/dist/assets/preload-helper-oH4irX4C.js +0 -1
  488. package/src/console/ui-next/dist/assets/react-D8E3mtu1.js +0 -1
  489. package/src/console/ui-next/dist/assets/react-dom-Bph1y7z7.js +0 -9
  490. package/src/console/ui-next/dist/assets/replica-lag-DKRrbvdo.js +0 -18
  491. package/src/console/ui-next/dist/assets/request-meta-DV0ywz7t.js +0 -1
  492. package/src/console/ui-next/dist/assets/shortcut-JQIZlWfm.js +0 -1
  493. package/src/console/ui-next/dist/assets/shortcut-keys-DKxNTe_m.js +0 -1
  494. package/src/console/ui-next/dist/assets/skeleton-D-czQJT6.js +0 -1
  495. package/src/console/ui-next/dist/assets/store-page-02xOiqIK.js +0 -41
  496. package/src/console/ui-next/dist/assets/trace-detail-sheet-B09O8rA6.js +0 -2
  497. package/src/console/ui-next/dist/assets/tree-expand-toggle-BtyhmWb4.js +0 -55
  498. package/src/console/ui-next/dist/assets/units-page-l8FeKfnP.js +0 -1
  499. package/src/console/ui-next/dist/assets/useMutation-B8EO02Ej.js +0 -1
  500. package/src/console/ui-next/dist/assets/useRender-BE2A9BWC.js +0 -1
  501. package/src/console/ui-next/dist/assets/vault-page-CL-d_mLE.js +0 -2
  502. package/src/console/ui-next/dist/assets/xyflow-D7n4g6go.js +0 -7
  503. package/src/console/ui-next/dist/assets/xyflow-DZ0Ws1xk.css +0 -1
  504. package/src/docker/ollama-pull.ts +0 -232
  505. package/src/docker/recipes/llama-cpp.ts +0 -298
  506. package/src/docker/recipes/ollama.ts +0 -44
  507. package/src/docker/recipes/sglang.ts +0 -55
  508. package/src/docker/recipes/vllm.ts +0 -44
  509. package/src/drivers/ai-ollama-tools.integration.test.ts +0 -109
  510. package/src/drivers/ai-ollama.integration.test.ts +0 -184
  511. package/src/drivers/ai-ollama.ts +0 -389
  512. package/src/drivers/ollama.ts +0 -14
@@ -0,0 +1,283 @@
1
+ ---
2
+ title: "OpenRouter"
3
+ description: "Cloud path for fx.ask — provider openrouter auto-resolves base URL; router aliases pick free, auto, coding, fusion, and latest models."
4
+ icon: "Globe"
5
+ source: "docs/spec/unified-theory.md"
6
+ ---
7
+
8
+ OpenRouter is the simplest way to call a real model from OKE: no Docker, no
9
+ Python, no local weights. Set `provider: "openrouter"` and an API key —
10
+ `baseUrl` resolves from the verified registry.
11
+
12
+ <Callout title="The one rule">
13
+ Use a dedicated OpenRouter API key on the binding (`apiKey`), prefer the stable `openrouter/free`
14
+ router alias for zero-cost smoke tests, and keep other providers on their own `ai.model` +
15
+ `apiKey` so keys never collide.
16
+ </Callout>
17
+
18
+ ## Quick start
19
+
20
+ <Steps>
21
+
22
+ <Step>
23
+ ### Declare the cloud binding
24
+
25
+ ```typescript
26
+ import { ai } from "okengine";
27
+
28
+ export const smart = ai.model("smart", {
29
+ provider: "openrouter",
30
+ model: "openrouter/free",
31
+ apiKey: process.env.OPENROUTER_API_KEY,
32
+ });
33
+
34
+ export const triage = smart.prompt("triage");
35
+ ```
36
+
37
+ `baseUrl` becomes `https://openrouter.ai/api/v1` automatically. Pass an explicit
38
+ `baseUrl` only to point at a proxy or mirror.
39
+
40
+ </Step>
41
+
42
+ <Step>
43
+ ### Ask from a flow
44
+
45
+ ```typescript title="src/flows/main/ask.ts"
46
+ import { on, flow, http } from "okengine";
47
+
48
+ export const ask = on(
49
+ http.post(),
50
+ flow({ asks: ["triage"] }, async (fx, input) => {
51
+ return await fx.ask("triage", input);
52
+ }),
53
+ );
54
+ ```
55
+
56
+ </Step>
57
+
58
+ <Step>
59
+ ### Optional setup via CLI
60
+
61
+ create-oke **Recommended** / Customize / Reuse and `oke ai setup --provider openrouter`
62
+ pick `openrouter/free`, write `OPENROUTER_API_KEY` to `.env.local` + `vault.secret` (no
63
+ `dev:` stub). Missing key → `oke dev` asks again ([openrouter.ai](https://openrouter.ai)).
64
+
65
+ </Step>
66
+
67
+ </Steps>
68
+
69
+ ## Router aliases
70
+
71
+ OpenRouter **routers** are model slugs that pick (or compose) upstream models for
72
+ you. Pass the slug as `model` on `ai.model` — same as any other OpenRouter id.
73
+
74
+ | Slug | What it does | Cost |
75
+ | ---------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ------------------------------- |
76
+ | [`openrouter/free`](https://openrouter.ai/docs/guides/routing/routers/free-router) | Random free model that supports your request features | Free |
77
+ | [`openrouter/auto`](https://openrouter.ai/docs/guides/routing/routers/auto-router) | Market-based pick by task type + cost tier | Selected model rate |
78
+ | [`openrouter/pareto-code`](https://openrouter.ai/docs/guides/routing/routers/pareto-router) | Strong coding model by `min_coding_score` | Selected model rate |
79
+ | [`openrouter/fusion`](https://openrouter.ai/docs/guides/routing/routers/fusion-router) | Multi-model panel + analyst deliberation | ~4–5× one completion |
80
+ | [`openrouter/bodybuilder`](https://openrouter.ai/docs/guides/routing/routers/body-builder) | NL → parallel request bodies (you run them) | Builder free; executions billed |
81
+ | [`~author/family-latest`](https://openrouter.ai/docs/guides/routing/routers/latest-resolution) | Newest concrete version in a family | Target model rate |
82
+
83
+ **Consequence:** the response `model` field is the concrete upstream that answered —
84
+ log it for auditability.
85
+
86
+ Router plugin knobs (`cost_tier`, `allowed_models`, `min_coding_score`, fusion
87
+ panel) live on OpenRouter’s request `plugins` / account Routing defaults; OKE
88
+ passes the `model` slug through the openai-compatible driver.
89
+
90
+ ### Free Models Router — `openrouter/free`
91
+
92
+ Ideal for smoke tests, demos, and learning. The router filters free models for
93
+ capabilities your request needs (vision, tools, structured outputs), then picks
94
+ one at random.
95
+
96
+ ```typescript
97
+ export const smoke = ai.model("smoke", {
98
+ provider: "openrouter",
99
+ model: "openrouter/free",
100
+ apiKey: process.env.OPENROUTER_API_KEY,
101
+ });
102
+ ```
103
+
104
+ | Detail | Behavior |
105
+ | ---------------- | ------------------------------------------------ |
106
+ | Selection | Random among eligible free models |
107
+ | Pin a free model | Use `author/model:free` instead of the router |
108
+ | Limits | Lower rate limits; availability and latency vary |
109
+
110
+ Official guide:
111
+ [Free Models Router](https://openrouter.ai/docs/guides/routing/routers/free-router).
112
+
113
+ ### Auto Router — `openrouter/auto`
114
+
115
+ Classifies the prompt (~30 task types), ranks by community spend share over a
116
+ trailing 7-day window, then applies your cost band and fallbacks.
117
+
118
+ ```typescript
119
+ export const smart = ai.model("smart", {
120
+ provider: "openrouter",
121
+ model: "openrouter/auto",
122
+ apiKey: process.env.OPENROUTER_API_KEY,
123
+ });
124
+ ```
125
+
126
+ | Detail | Behavior |
127
+ | ------------ | ------------------------------------------------------------- |
128
+ | Early track | `openrouter/auto-beta` (plugin id `auto-beta-router`) |
129
+ | Cost bands | `low` · `medium` · `high` · `xhigh` · `max` (default ≈ `low`) |
130
+ | Allow / deny | Wildcard patterns via `allowed_models` / `excluded_models` |
131
+ | Sessions | Prefers the prior model while it stays a top candidate |
132
+ | Pricing | No router fee — pay the selected model |
133
+
134
+ Official guide:
135
+ [Auto Router](https://openrouter.ai/docs/guides/routing/routers/auto-router).
136
+
137
+ ### Pareto Router — `openrouter/pareto-code`
138
+
139
+ Coding-only. You set a minimum coding score (`0`–`1`); the router maps it to a
140
+ tier and picks the cheapest (or fastest with `:nitro`) eligible model.
141
+
142
+ ```typescript
143
+ export const coder = ai.model("coder", {
144
+ provider: "openrouter",
145
+ model: "openrouter/pareto-code",
146
+ apiKey: process.env.OPENROUTER_API_KEY,
147
+ });
148
+ ```
149
+
150
+ | `min_coding_score` | Tier |
151
+ | ------------------------------ | ----------------------------- |
152
+ | `>= 0.66` (default if omitted) | high — top of AA coding field |
153
+ | `>= 0.33`, `< 0.66` | medium |
154
+ | `< 0.33` | low |
155
+
156
+ Within the tier: cheapest available (+ same-tier fallbacks on provider errors).
157
+ Use `session_id` for multi-turn stickiness. Official guide:
158
+ [Pareto Router](https://openrouter.ai/docs/guides/routing/routers/pareto-router).
159
+
160
+ ### Fusion Router — `openrouter/fusion`
161
+
162
+ A panel of models answers in parallel; an analyst returns structured consensus /
163
+ contradictions / gaps; your outer model writes the final answer.
164
+
165
+ ```typescript
166
+ export const deliberate = ai.model("deliberate", {
167
+ provider: "openrouter",
168
+ model: "openrouter/fusion",
169
+ apiKey: process.env.OPENROUTER_API_KEY,
170
+ });
171
+ ```
172
+
173
+ | Detail | Behavior |
174
+ | ------------- | --------------------------------------------------------------- |
175
+ | Fast preset | `openrouter/fusion-flash` (`general-fast` panel) |
176
+ | Default panel | Quality: Claude Opus / GPT / Gemini latest aliases |
177
+ | Cost | N panel + 1 analyst + outer — expect ~4–5× with 3 models |
178
+ | Force fusion | OpenRouter `tool_choice: "required"` (model decides by default) |
179
+
180
+ Official guide:
181
+ [Fusion Router](https://openrouter.ai/docs/guides/routing/routers/fusion-router).
182
+
183
+ ### Body Builder — `openrouter/bodybuilder`
184
+
185
+ Describe a multi-model job in natural language. The response is JSON
186
+ `{ requests: [...] }` — generate is free; you execute each body yourself.
187
+ Useful for A/B checks, not a single `fx.ask` answer.
188
+
189
+ ```typescript
190
+ export const builder = ai.model("builder", {
191
+ provider: "openrouter",
192
+ model: "openrouter/bodybuilder",
193
+ apiKey: process.env.OPENROUTER_API_KEY,
194
+ });
195
+ ```
196
+
197
+ Official guide:
198
+ [Body Builder](https://openrouter.ai/docs/guides/routing/routers/body-builder).
199
+
200
+ ### Latest resolution — `~author/family-latest`
201
+
202
+ Stable family alias that always retargets to the newest visible model in that
203
+ family. Response `model` reports the concrete slug.
204
+
205
+ ```typescript
206
+ export const opus = ai.model("opus", {
207
+ provider: "openrouter",
208
+ model: "~anthropic/claude-opus-latest",
209
+ apiKey: process.env.OPENROUTER_API_KEY,
210
+ });
211
+ ```
212
+
213
+ | Detail | Behavior |
214
+ | ---------------- | --------------------------------------------------------- |
215
+ | Reproducibility | Pin a concrete slug (e.g. `anthropic/claude-opus-4.8`) |
216
+ | Reasoning params | Unsupported `none` / disabled may remap on `~latest` only |
217
+ | Pricing | Listed as the current target’s rates |
218
+
219
+ Official guide:
220
+ [Latest Model Resolution](https://openrouter.ai/docs/guides/routing/routers/latest-resolution).
221
+
222
+ ## Multi-provider projects
223
+
224
+ ```typescript
225
+ export const viaOr = ai.model("via-or", {
226
+ provider: "openrouter",
227
+ model: "openrouter/free",
228
+ apiKey: process.env.OPENROUTER_API_KEY,
229
+ });
230
+
231
+ export const viaGroq = ai.model("via-groq", {
232
+ provider: "groq",
233
+ model: "llama-3.1-8b-instant",
234
+ apiKey: process.env.GROQ_API_KEY,
235
+ });
236
+ ```
237
+
238
+ Each binding keeps its own `apiKey` and auto-resolved `baseUrl`. No shared
239
+ process-wide token.
240
+
241
+ ## Troubleshooting
242
+
243
+ <Accordions>
244
+ <Accordion title="401 / invalid API key">
245
+
246
+ Pass `apiKey` on the binding (or the env your setup wrote). OpenRouter does not
247
+ accept an OpenAI key against its base URL.
248
+
249
+ </Accordion>
250
+ <Accordion title="Unknown provider error">
251
+
252
+ Typos fail loud: unknown names require an explicit `baseUrl`. Known names are
253
+ listed on [Models](/docs/elements/ai/models).
254
+
255
+ </Accordion>
256
+ <Accordion title="Free router feels flaky or rate-limited">
257
+
258
+ `openrouter/free` picks randomly among eligible free models — availability and
259
+ limits change. Pin `author/model:free` or move to `openrouter/auto` / a paid id
260
+ for stable prod paths.
261
+
262
+ </Accordion>
263
+ </Accordions>
264
+
265
+ ## Learn more
266
+
267
+ - [Models](/docs/elements/ai/models) — verified providers, limited compatibility, BYO `/v1`
268
+ - [AI](/docs/elements/ai) — prompts and `fx.ask`
269
+ - [OpenRouter routers](https://openrouter.ai/docs/guides/routing/routers/auto-router) — Auto, Free, Pareto, Fusion, Body Builder, Latest
270
+
271
+ Any OpenAI-compatible `/v1` endpoint works via custom `baseUrl` / `OKE_AI_URL`
272
+ on an `openai-compatible` binding — see Models.
273
+
274
+ ## Next
275
+
276
+ <Cards>
277
+ <Card
278
+ title="Models"
279
+ description="Provider registry + custom URL."
280
+ href="/docs/elements/ai/models"
281
+ />
282
+ <Card title="AI" description="Prompts and guardrails." href="/docs/elements/ai" />
283
+ </Cards>
@@ -26,7 +26,7 @@ create-oke asks **Add PgDog connection pooling…?** (or pass `--pgdog`). Manual
26
26
  ```typescript title="oke.config.ts"
27
27
  images: {
28
28
  "store.sql": "postgres:18-alpine",
29
- pgdog: "ghcr.io/pgdogdev/pgdog:v0.1.53",
29
+ pgdog: "ghcr.io/pgdogdev/pgdog:v0.1.57",
30
30
  },
31
31
  ```
32
32
 
@@ -99,7 +99,7 @@ not wired into the generated stack yet.
99
99
  | -------------- | ------------------------------------------------------- |
100
100
  | Container port | `6432` |
101
101
  | `dependsOn` | `store-sql` healthy |
102
- | Healthcheck | `pg_isready -h 127.0.0.1 -p 6432`, every 5s, 12 retries |
102
+ | Healthcheck | `pg_isready -h 127.0.0.1 -p 6432`, every 2s, 20 retries |
103
103
  | Connection URL | `postgres://user:pass@host:6432/db` |
104
104
 
105
105
  ## Troubleshooting
@@ -123,9 +123,9 @@ Postgres), keep `DATABASE_URL` on the pooler for app traffic.
123
123
 
124
124
  ## Learn more
125
125
 
126
- - [Docker · PgDog pooling](/docs/deployment/docker#pgdog-pooling) — compose `-f` layer order
127
126
  - [Postgres](/docs/recipes/postgres) — the backend PgDog fronts
128
127
  - [Store · SQL](/docs/elements/store#sql) — “Connection pooling is infrastructure”
128
+ - [Configuration](/docs/reference/configuration) — `images.pgdog` and compose layers
129
129
 
130
130
  ## Next
131
131
 
@@ -85,8 +85,7 @@ The recipe does **not** declare a named compose volume. Persistence rides the im
85
85
  ## Production note
86
86
 
87
87
  For multi-replica apps, keep SQL on a shared Postgres — Clock CronStore and durable
88
- journal need one backend. See [Clock](/docs/elements/clock#what-the-runtime-guarantees) ·
89
- [Docker](/docs/deployment/docker#share-backing-services).
88
+ journal need one backend. See [Clock](/docs/elements/clock#what-the-runtime-guarantees).
90
89
 
91
90
  Scale out with [PgDog](/docs/recipes/pgdog) so `N × Bun.SQL pool` does not exhaust
92
91
  `max_connections`. Do not also stack a managed provider's pooler on the same URL.
@@ -27,7 +27,7 @@ drivers: {
27
27
  },
28
28
  },
29
29
  images: {
30
- store: { files: "rustfs/rustfs:1.0.0-rc.2" },
30
+ store: { files: "rustfs/rustfs:1.0.0-rc.5" },
31
31
  },
32
32
  ```
33
33
 
@@ -132,7 +132,7 @@ running service; confirm health at `/health` before debugging client signatures.
132
132
 
133
133
  - [Store · Files](/docs/elements/store#files) — facet API and drivers
134
134
  - [Environment variables](/docs/reference/environment-variables) — full `S3_*` map
135
- - [Installation](/docs/get-started/installation) — docker env cheat sheet
135
+ - [Recipes](/docs/recipes) — docker env cheat sheet
136
136
 
137
137
  ## Next
138
138
 
@@ -78,7 +78,7 @@ durable state.
78
78
 
79
79
  Security posture is intentional: Traefik talks to `tcp://socket-proxy:2375` with a
80
80
  filtered API (`CONTAINERS`, `EVENTS`, `PING`, `VERSION`, `NETWORKS` only). Never mount
81
- raw `docker.sock` on Traefik — see [Reverse proxy](/docs/deployment/reverse-proxy).
81
+ raw `docker.sock` on Traefik — keep the socket-proxy companion in front.
82
82
 
83
83
  HTTP entrypoint redirects to `websecure`. For a single instance with no scale plans,
84
84
  [Caddy](/docs/recipes/caddy) is simpler (no labels, no companion).
@@ -122,8 +122,8 @@ re-issuing repeatedly.
122
122
 
123
123
  ## Learn more
124
124
 
125
- - [Reverse proxy](/docs/deployment/reverse-proxy) — Docker-socket-proxy security rationale
126
- - [Docker · Reverse proxy](/docs/deployment/docker#reverse-proxy) — compose layer order
125
+ - [Caddy](/docs/recipes/caddy) — simpler single-instance HTTPS edge
126
+ - [nginx](/docs/recipes/nginx) — static HTTP reverse proxy
127
127
  - [Security](/docs/reference/security) — `allowedHosts`
128
128
 
129
129
  ## Next
@@ -0,0 +1,231 @@
1
+ ---
2
+ title: "CLI"
3
+ description: "oke and create-oke commands — scaffold, develop, ship, and operate an okengine app."
4
+ icon: "Terminal"
5
+ source: "docs/spec/unified-theory.md"
6
+ ---
7
+
8
+ The CLI is how you scaffold, run, and operate an app. `create-oke` writes the project;
9
+ `oke` is the day-to-day binary (dev loop, schema, vault, docker, doctor).
10
+
11
+ For developers who already know the model — look up a command, its flags, and what it
12
+ writes.
13
+
14
+ <Callout title="The one rule">
15
+ Prefer the CLI for environment wiring (`oke dev`, `oke db`, `oke docker`). Put behavior in Flows
16
+ and `oke.config.ts` — never invent a ninth element or hand-edit the Manifest.
17
+ </Callout>
18
+
19
+ ## Smallest Example
20
+
21
+ <Steps>
22
+
23
+ <Step>
24
+ ### Scaffold an app
25
+
26
+ ```bash
27
+ bunx create-oke@latest notes --yes
28
+ cd notes
29
+ ```
30
+
31
+ </Step>
32
+
33
+ <Step>
34
+ ### Run the dev loop
35
+
36
+ ```bash
37
+ oke dev
38
+ ```
39
+
40
+ Compose comes up (pull / create / start progress streams into the boot status
41
+ lines), the backend listens on **6530**, Console on **6533**, app MCP on **6535**,
42
+ docs MCP on **6536**. Open `http://localhost:6533`. Quit with **Ctrl+C**.
43
+
44
+ On a TTY, after schema push, `oke dev` also:
45
+
46
+ 1. Prompts one-by-one for any Vault boot gaps (writes `.env.local`) — e.g.
47
+ `OPENROUTER_API_KEY` when create-oke / `oke ai setup` / Keel declared the
48
+ OpenRouter contract without a value.
49
+ 2. Asks to run `oke db seed` when a seed module exists and `.oke/state.json` has
50
+ not recorded that seed identity yet. Run `oke db seed` anytime later.
51
+
52
+ </Step>
53
+
54
+ </Steps>
55
+
56
+ ## Progressive Patterns
57
+
58
+ <Tabs items={["Daily", "Schema", "Ship", "Scaffold"]}>
59
+
60
+ <Tab value="Daily">
61
+
62
+ ```bash
63
+ oke dev # watch · Console · client types · Docker Compose
64
+ oke test # bun test with PGLite posture
65
+ oke doctor # secrets · ports · schema drift
66
+ oke doctor --diff # CI gate: undeclared contract breaks
67
+ ```
68
+
69
+ </Tab>
70
+
71
+ <Tab value="Schema">
72
+
73
+ ```bash
74
+ oke db push # sync domain schema (dev; auto under oke dev)
75
+ oke db generate # versioned SQL under drizzle/
76
+ oke db migrate # apply migrations (prod)
77
+ oke schema generate # core + plugin stub → .oke/schema/oke.ts
78
+ ```
79
+
80
+ **Consequence:** `oke schema generate` is not `oke db generate`. The first writes the
81
+ framework stub; the second emits your app's Drizzle migrations.
82
+
83
+ </Tab>
84
+
85
+ <Tab value="Ship">
86
+
87
+ ```bash
88
+ oke docker --prod # derive production Compose
89
+ oke build --target bun # tree-shaken bundle
90
+ oke start # production entry (Docker CMD)
91
+ ```
92
+
93
+ </Tab>
94
+
95
+ <Tab value="Scaffold">
96
+
97
+ ```bash
98
+ bunx create-oke@latest my-app --yes
99
+ bunx create-oke@latest my-app -t advanced --locales ar --proxy caddy
100
+ bunx create-oke@latest # interactive (TTY only)
101
+ ```
102
+
103
+ </Tab>
104
+
105
+ </Tabs>
106
+
107
+ ## Port Map
108
+
109
+ | Port | Surface | Who starts it |
110
+ | -------- | -------------------- | ----------------------- |
111
+ | **6530** | Backend API | `oke dev` / `oke start` |
112
+ | **6533** | Developer Console | `oke dev` |
113
+ | **6535** | App MCP | `oke dev` |
114
+ | **6536** | Docs MCP (read-only) | `oke dev` |
115
+
116
+ Override app / console / mcp listen ports in `oke.config.ts` `ports` — see
117
+ [Configuration](/docs/reference/configuration#ports).
118
+
119
+ ## `oke` Commands
120
+
121
+ | Command | Purpose | Key flags / subs |
122
+ | ------------ | ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
123
+ | `dev` | Watch · hot reload · Console · client types (Docker Compose) | `--docker\|-d [roles]`, `--no-db-push`, `--entry\|-e` |
124
+ | `test` | Run bun test with PGLite test posture | |
125
+ | `start` | Production entry (Docker CMD) | `--entry\|-e`, `--port\|-p` |
126
+ | `doctor` | Secrets · ports · stub/domain schema drift | `--manifest`, `--diff`, `--before`, `--after`, `--base`, `--json` |
127
+ | `stack` | Preview images / tags / ports (writes nothing) | `--config`, `--json` |
128
+ | `schema` | Core + plugin tables → `.oke/schema/oke.ts` | `generate` (`--check`, `--manifest`, `--out`) |
129
+ | `db` | Domain schema | `push` · `generate` · `migrate` · `seed` · `studio` · `search-backfill` |
130
+ | `client` | Ambient types for a separate frontend repo | `add <url>` (`--out`) |
131
+ | `vault` | Secrets | `set` · `list` · `import` · `key` · `init` · `status` · `seal` · `unseal` · `rotate` · `rotate-master` · `audit` · `purge-expired` · `backup` · `restore` |
132
+ | `docker` | Derive compose · clean leftover stacks | `--prod\|-p`, `--out`, `--config`, `--manifest`; sub `clean` |
133
+ | `images` | List / pin digests | `list` · `pin` |
134
+ | `build` | Tree-shaken bundle | `--target\|-t bun\|node\|edge`, `--entry`, `--outdir` |
135
+ | `eval` | Prompt eval sets (CI gate) | `--manifest` |
136
+ | `ai` | Configure AI driver + models | `setup` (`--provider`, `--chat`, `--vision`, `--embed`, `--yes`) |
137
+ | `branch` | Fork journaled state | `<name>`, `--at\|-a` |
138
+ | `replay` | Re-invoke a past Flow from Runs | `--request-id\|-r`, `--entry`, `--dry-run`, `--live` |
139
+ | `privacy` | Crypto-shred subject data | `erase` (`--subject\|-s`) |
140
+ | `upgrade` | Breaking-change codemods + diff | `--apply\|-a` |
141
+ | `console` | Console helpers | `claim-code` (`--json`) |
142
+ | `gates` | Gate catalogue from Manifest | `list` (`--manifest`, `--json`) |
143
+ | `completion` | Shell completion script | `bash` · `zsh` · `fish` |
144
+ | `mode` | **Deprecated** — `oke dev` always uses Docker Compose | `--help` |
145
+
146
+ Bare `oke` (TTY) opens the interactive board; `oke --help` prints the catalogue.
147
+
148
+ ### `oke db` detail
149
+
150
+ Shared flags on push / generate / migrate / studio: `--config\|-c`, `--env name`
151
+ (`dev` · `test` · `prod`). Seed adds `--force`, `--entry`. Search-backfill adds
152
+ `--batch n` and a `<table>` positional.
153
+
154
+ ```bash
155
+ oke db push --env dev
156
+ oke db migrate --env prod
157
+ oke db seed --force
158
+ oke db search-backfill notes --batch 500
159
+ ```
160
+
161
+ ## `create-oke`
162
+
163
+ | Flag | Meaning |
164
+ | -------------------------------- | --------------------------------------------------------- |
165
+ | `-t, --template <id>` | `standard` (default) or `advanced` |
166
+ | `--sql <id>` | Store SQL dialect — only `postgres` (test stays `pglite`) |
167
+ | `-y, --yes` | No prompts; defaults + bun install (no `oke dev`) |
168
+ | `--install` / `--no-install` | Run or skip `bun install` after scaffold |
169
+ | `--agents-md` / `--no-agents-md` | Write `AGENTS.md` (default on) |
170
+ | `--ai` / `--no-ai` / `--ai skip` | Configure or skip AI setup |
171
+ | `--locales <tags>` | Extra languages beyond English (e.g. `ar` or `ar,fr`) |
172
+ | `--pgdog` / `--no-pgdog` | Pin PgDog in front of Postgres |
173
+ | `--proxy <id>` / `--no-proxy` | `none` · `caddy` · `traefik` · `nginx` |
174
+ | `-h, --help` | Show help |
175
+
176
+ ## Troubleshooting
177
+
178
+ <Accordions>
179
+
180
+ <Accordion title="oke start: no entry found">
181
+ Set `package.json` `okengine.entry` or `main`, pass `--entry`, or keep a conventional
182
+ `src/app.ts`. Production imports that module; the app must call `createBunRuntime().serve` itself.
183
+ </Accordion>
184
+
185
+ <Accordion title="Confusion: oke schema generate vs oke db generate">
186
+ `oke schema generate` emits framework / plugin stub tables under `.oke/schema/`. `oke db generate`
187
+ emits versioned domain SQL via Drizzle. Use `db` for your app tables; use `schema` when the stub
188
+ drifted after a plugin change.
189
+ </Accordion>
190
+
191
+ <Accordion title="oke mode still in muscle memory">
192
+ `oke mode` is deprecated. `oke dev` always starts Docker Compose. There is no soft-compat for old
193
+ `local` / `docker` env map keys — rename to `dev` / `test` / `prod` in
194
+ [Configuration](/docs/reference/configuration).
195
+ </Accordion>
196
+
197
+ <Accordion title="OKE1110 after deploy">
198
+ Domain tables are missing in prod (no auto-DDL). Run `oke db migrate` against that environment —
199
+ see [Errors](/docs/reference/errors).
200
+ </Accordion>
201
+
202
+ <Accordion title="Claim code missing for first Console operator">
203
+ The setup claim code prints on the `oke dev` TTY board and is mirrored to gitignored
204
+ `.oke/claim-code`. Run `oke console claim-code` while setup is open.
205
+ </Accordion>
206
+
207
+ </Accordions>
208
+
209
+ ## Learn more
210
+
211
+ - [Configuration](/docs/reference/configuration) — `oke.config.ts` drivers and ports
212
+ - [Environment Variables](/docs/reference/environment-variables) — what Compose writes
213
+ - [Security](/docs/reference/security) — Host / Origin / `allowedHosts`
214
+ - [The Architecture](/docs/understand/the-architecture) — one contract; `oke doctor --diff` reviews it
215
+ - [Vault](/docs/elements/vault) — `oke vault` rotate / unseal
216
+
217
+ ## Next
218
+
219
+ <Cards>
220
+ <Card
221
+ title="Configuration"
222
+ description="Every option in oke.config.ts."
223
+ href="/docs/reference/configuration"
224
+ />
225
+ <Card
226
+ title="Security"
227
+ description="Host, Origin, planes, and MCP posture."
228
+ href="/docs/reference/security"
229
+ />
230
+ <Card title="Client" description="Typed createClient for your flows." href="/docs/client" />
231
+ </Cards>