okengine 0.18.4 → 0.19.0

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/index.mdx +25 -6
  5. package/site/content/docs/ai/llms-txt.mdx +1 -1
  6. package/site/content/docs/ai/meta.json +1 -1
  7. package/site/content/docs/ai/skills.mdx +4 -1
  8. package/site/content/docs/ai/try-it.mdx +58 -0
  9. package/site/content/docs/client/auth.mdx +208 -0
  10. package/site/content/docs/client/calling.mdx +451 -0
  11. package/site/content/docs/client/index.mdx +209 -0
  12. package/site/content/docs/client/live.mdx +234 -0
  13. package/site/content/docs/client/meta.json +5 -0
  14. package/site/content/docs/client/react.mdx +249 -0
  15. package/site/content/docs/elements/ai/agents.mdx +232 -0
  16. package/site/content/docs/elements/ai/index.mdx +341 -0
  17. package/site/content/docs/elements/ai/mcp.mdx +275 -0
  18. package/site/content/docs/elements/ai/meta.json +5 -0
  19. package/site/content/docs/elements/ai/models.mdx +283 -0
  20. package/site/content/docs/elements/ai/prompts.mdx +256 -0
  21. package/site/content/docs/elements/channel/email.mdx +266 -0
  22. package/site/content/docs/elements/channel/index.mdx +344 -0
  23. package/site/content/docs/elements/channel/meta.json +5 -0
  24. package/site/content/docs/elements/channel/push.mdx +218 -0
  25. package/site/content/docs/elements/channel/receipts.mdx +206 -0
  26. package/site/content/docs/elements/channel/sms.mdx +264 -0
  27. package/site/content/docs/elements/channel/whatsapp.mdx +220 -0
  28. package/site/content/docs/elements/clock/index.mdx +300 -0
  29. package/site/content/docs/elements/clock/meta.json +5 -0
  30. package/site/content/docs/elements/clock/schedules.mdx +508 -0
  31. package/site/content/docs/elements/clock/sleep.mdx +445 -0
  32. package/site/content/docs/elements/flow/consumers.mdx +707 -0
  33. package/site/content/docs/elements/flow/http.mdx +1080 -0
  34. package/site/content/docs/elements/flow/index.mdx +618 -0
  35. package/site/content/docs/elements/flow/meta.json +5 -0
  36. package/site/content/docs/elements/flow/routing.mdx +559 -0
  37. package/site/content/docs/elements/flow/workflows.mdx +640 -0
  38. package/site/content/docs/elements/gate/auth.mdx +371 -0
  39. package/site/content/docs/elements/gate/authorization.mdx +298 -0
  40. package/site/content/docs/elements/gate/index.mdx +418 -0
  41. package/site/content/docs/elements/gate/meta.json +5 -0
  42. package/site/content/docs/elements/gate/rate-limits.mdx +365 -0
  43. package/site/content/docs/elements/gate/rls.mdx +303 -0
  44. package/site/content/docs/elements/gate/tenancy.mdx +372 -0
  45. package/site/content/docs/elements/index.mdx +52 -11
  46. package/site/content/docs/elements/signal/broadcast.mdx +517 -0
  47. package/site/content/docs/elements/signal/index.mdx +352 -0
  48. package/site/content/docs/elements/signal/live.mdx +590 -0
  49. package/site/content/docs/elements/signal/meta.json +5 -0
  50. package/site/content/docs/elements/signal/once.mdx +596 -0
  51. package/site/content/docs/elements/store/files.mdx +659 -0
  52. package/site/content/docs/elements/store/index.mdx +310 -0
  53. package/site/content/docs/elements/store/kv.mdx +629 -0
  54. package/site/content/docs/elements/store/meta.json +5 -0
  55. package/site/content/docs/elements/store/search.mdx +946 -0
  56. package/site/content/docs/elements/store/sql.mdx +937 -0
  57. package/site/content/docs/elements/vault/config.mdx +256 -0
  58. package/site/content/docs/elements/vault/index.mdx +356 -0
  59. package/site/content/docs/elements/vault/meta.json +5 -0
  60. package/site/content/docs/elements/vault/rotation.mdx +273 -0
  61. package/site/content/docs/elements/vault/secrets.mdx +285 -0
  62. package/site/content/docs/index.mdx +78 -30
  63. package/site/content/docs/meta.json +11 -8
  64. package/site/content/docs/plugins/cors.mdx +2 -1
  65. package/site/content/docs/plugins/csrf.mdx +4 -1
  66. package/site/content/docs/plugins/headers.mdx +2 -1
  67. package/site/content/docs/plugins/ip-allowlist.mdx +2 -1
  68. package/site/content/docs/plugins/magic-link.mdx +6 -0
  69. package/site/content/docs/plugins/maintenance-mode.mdx +2 -1
  70. package/site/content/docs/plugins/oauth.mdx +1 -1
  71. package/site/content/docs/plugins/otp.mdx +12 -1
  72. package/site/content/docs/plugins/passkey.mdx +39 -15
  73. package/site/content/docs/plugins/two-factor.mdx +91 -34
  74. package/site/content/docs/plugins/username.mdx +1 -1
  75. package/site/content/docs/recipes/caddy.mdx +3 -3
  76. package/site/content/docs/recipes/index.mdx +18 -28
  77. package/site/content/docs/recipes/mailpit.mdx +1 -1
  78. package/site/content/docs/recipes/meilisearch.mdx +3 -3
  79. package/site/content/docs/recipes/meta.json +1 -4
  80. package/site/content/docs/recipes/nginx.mdx +2 -2
  81. package/site/content/docs/recipes/openrouter.mdx +283 -0
  82. package/site/content/docs/recipes/pgdog.mdx +3 -3
  83. package/site/content/docs/recipes/postgres.mdx +1 -2
  84. package/site/content/docs/recipes/rustfs.mdx +2 -2
  85. package/site/content/docs/recipes/traefik.mdx +3 -3
  86. package/site/content/docs/reference/cli.mdx +231 -0
  87. package/site/content/docs/reference/configuration.mdx +30 -10
  88. package/site/content/docs/reference/environment-variables.mdx +93 -20
  89. package/site/content/docs/reference/errors.mdx +132 -29
  90. package/site/content/docs/reference/fx.mdx +137 -73
  91. package/site/content/docs/reference/index.mdx +13 -21
  92. package/site/content/docs/reference/meta.json +4 -5
  93. package/site/content/docs/reference/okid.mdx +42 -17
  94. package/site/content/docs/reference/plugins.mdx +4 -3
  95. package/site/content/docs/reference/security.mdx +197 -0
  96. package/site/content/docs/understand/meta.json +5 -0
  97. package/site/content/docs/understand/the-anatomy.mdx +132 -0
  98. package/site/content/docs/understand/the-model.mdx +32 -0
  99. package/site/content/docs/understand/the-problem.mdx +74 -0
  100. package/site/content/docs/understand/the-vocabulary.mdx +26 -0
  101. package/src/auth/api-keys.ts +2 -1
  102. package/src/auth/bindings.ts +64 -16
  103. package/src/auth/gate-auth.test.ts +6 -1
  104. package/src/auth/identity.ts +152 -5
  105. package/src/auth/index.ts +29 -0
  106. package/src/auth/invites.ts +2 -1
  107. package/src/auth/method-context.ts +41 -0
  108. package/src/auth/oauth-as/crypto.ts +2 -1
  109. package/src/auth/oauth-as/stores.ts +2 -1
  110. package/src/auth/operator.ts +2 -1
  111. package/src/auth/sessions-jwt.test.ts +77 -0
  112. package/src/auth/sessions.ts +20 -4
  113. package/src/auth/tenants.ts +3 -2
  114. package/src/auth/two-factor-challenge.test.ts +61 -0
  115. package/src/auth/two-factor-challenge.ts +284 -0
  116. package/src/auth/verification.ts +5 -0
  117. package/src/bench/REPORT.md +49 -0
  118. package/src/bench/g03-signal-once.bench.ts +1 -1
  119. package/src/bench/g10-observability-contention.bench.ts +1 -1
  120. package/src/bench/g17-hybrid-search.bench.ts +572 -0
  121. package/src/bench/load-app.ts +2 -10
  122. package/src/cli/ai-setup/ai-setup.test.ts +331 -42
  123. package/src/cli/ai-setup/apply.ts +294 -52
  124. package/src/cli/ai-setup/catalog.ts +238 -1342
  125. package/src/cli/ai-setup/index.ts +14 -99
  126. package/src/cli/ai-setup/prompts.ts +60 -443
  127. package/src/cli/ask-seed.test.ts +96 -0
  128. package/src/cli/ask-seed.ts +82 -0
  129. package/src/cli/ask-vault-gaps.test.ts +84 -0
  130. package/src/cli/ask-vault-gaps.ts +146 -0
  131. package/src/cli/build.ts +2 -2
  132. package/src/cli/client-add.test.ts +26 -1
  133. package/src/cli/client-add.ts +106 -27
  134. package/src/cli/competitor-mention-removal.test.ts +1 -1
  135. package/src/cli/db-seed.ts +2 -0
  136. package/src/cli/db.ts +150 -11
  137. package/src/cli/dev.ts +119 -211
  138. package/src/cli/docker-clean.ts +2 -2
  139. package/src/cli/docker-cli.test.ts +1 -1
  140. package/src/cli/doctor-diff.ts +4 -2
  141. package/src/cli/doctor-pii.test.ts +1 -1
  142. package/src/cli/doctor.ts +14 -1
  143. package/src/cli/hero-meta.test.ts +4 -2
  144. package/src/cli/load-config.images.test.ts +8 -10
  145. package/src/cli/load-config.ts +1 -1
  146. package/src/cli/registry.ts +22 -10
  147. package/src/cli/replay.ts +3 -1
  148. package/src/cli/start.ts +1 -1
  149. package/src/cli/tui/keys.ts +2 -3
  150. package/src/client/auth/cookies.ts +74 -0
  151. package/src/client/auth/create-auth-client.ts +636 -0
  152. package/src/client/auth/denials.ts +99 -0
  153. package/src/client/auth/session.ts +283 -0
  154. package/src/client/auth.test.ts +251 -0
  155. package/src/client/auth.ts +39 -114
  156. package/src/client/create-with-session.ts +245 -0
  157. package/src/client/create.ts +51 -5
  158. package/src/client/index.ts +11 -1
  159. package/src/client/live.ts +11 -79
  160. package/src/client/notes-contract.test.ts +5 -10
  161. package/src/client/sse.ts +137 -0
  162. package/src/client/stream.ts +147 -0
  163. package/src/client/transport.test.ts +32 -0
  164. package/src/client/transport.ts +123 -26
  165. package/src/client/types.ts +118 -14
  166. package/src/client-react/index.ts +185 -24
  167. package/src/client-react/use-live-query.ts +13 -3
  168. package/src/compiler/aot.test.ts +7 -4
  169. package/src/compiler/effects-embed.test.ts +56 -0
  170. package/src/compiler/effects-fetch.test.ts +43 -0
  171. package/src/compiler/effects-infer.ts +58 -2
  172. package/src/compiler/extract.test.ts +258 -44
  173. package/src/compiler/extract.ts +566 -48
  174. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -4
  175. package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +2 -8
  176. package/src/compiler/fixtures/skyport.expected.json +4 -4
  177. package/src/compiler/fixtures/triggers/five-triggers.ts +14 -10
  178. package/src/compiler/response.ts +2 -2
  179. package/src/compiler/search-writer-isolation.test.ts +40 -0
  180. package/src/config/index.ts +11 -0
  181. package/src/console/server/app.ts +17 -23
  182. package/src/console/server/bind.ts +4 -0
  183. package/src/console/server/console.test.ts +2 -2
  184. package/src/console/server/flows-invoke.test.ts +50 -34
  185. package/src/console/server/flows.ts +436 -255
  186. package/src/console/server/runs-ingest.test.ts +6 -3
  187. package/src/console/server/serve.ts +1 -1
  188. package/src/console/server/signals.test.ts +1 -5
  189. package/src/console/server/signals.ts +8 -6
  190. package/src/console/server/state.ts +6 -1
  191. package/src/console/server/store.ts +1 -1
  192. package/src/console/ui-next/dist/assets/FileExportIcon-Ck-5od4R.js +1 -0
  193. package/src/console/ui-next/dist/assets/MoreHorizontalCircle01Icon-gMNGsE37.js +1 -0
  194. package/src/console/ui-next/dist/assets/PlusSignIcon-CwG3nxfu.js +1 -0
  195. package/src/console/ui-next/dist/assets/UnavailableIcon-D9cvHVPr.js +1 -0
  196. package/src/console/ui-next/dist/assets/UserIcon-DaE2PB5_.js +1 -0
  197. package/src/console/ui-next/dist/assets/access-page-DFeymU07.js +4 -0
  198. package/src/console/ui-next/dist/assets/agent-disclosure-U1rdfblp.js +1 -0
  199. package/src/console/ui-next/dist/assets/cache-glyph-BeFJeqBG.js +1 -0
  200. package/src/console/ui-next/dist/assets/call-pii-button-CVAONPii.js +1 -0
  201. package/src/console/ui-next/dist/assets/collapsible-D2A6NJ-3.js +1 -0
  202. package/src/console/ui-next/dist/assets/copy-inline-button-CAYD18cr.js +1 -0
  203. package/src/console/ui-next/dist/assets/dagre.esm-B1_XeuLP.js +1 -0
  204. package/src/console/ui-next/dist/assets/detail-header-DVWNjWjg.js +1 -0
  205. package/src/console/ui-next/dist/assets/dropdown-menu-4h2LOVXM.js +1 -0
  206. package/src/console/ui-next/dist/assets/duration-tone-Cgk_h5ja.js +9 -0
  207. package/src/console/ui-next/dist/assets/element-icons-BI8cJgdh.js +1 -0
  208. package/src/console/ui-next/dist/assets/explorer-empty-CJs5A-wm.js +1 -0
  209. package/src/console/ui-next/dist/assets/flows-page-Dss7941e.js +1 -0
  210. package/src/console/ui-next/dist/assets/highlighted-json-MYZQtRnw.js +154 -0
  211. package/src/console/ui-next/dist/assets/http-method-Jrh39p7A.js +1 -0
  212. package/src/console/ui-next/dist/assets/index-D0zS5rKO.css +2 -0
  213. package/src/console/ui-next/dist/assets/index-DXP2dBIF.js +63 -0
  214. package/src/console/ui-next/dist/assets/observability-page-HvolXxTI.js +4 -0
  215. package/src/console/ui-next/dist/assets/react-dom-Ddte4I-Q.js +9 -0
  216. package/src/console/ui-next/dist/assets/replica-lag-CSh2dzrb.js +18 -0
  217. package/src/console/ui-next/dist/assets/request-meta-BatF8KrK.js +1 -0
  218. package/src/console/ui-next/dist/assets/shortcut-keys-3ILd8oGn.js +1 -0
  219. package/src/console/ui-next/dist/assets/{sql-BskegiFM.js → sql-BsFa4tDR.js} +1 -1
  220. package/src/console/ui-next/dist/assets/store-page-eiKiHnNe.js +41 -0
  221. package/src/console/ui-next/dist/assets/trace-detail-sheet-CZkMeKS-.js +2 -0
  222. package/src/console/ui-next/dist/assets/tree-expand-toggle-CW8y5A2h.js +55 -0
  223. package/src/console/ui-next/dist/assets/units-page-B_RWJrEO.js +1 -0
  224. package/src/console/ui-next/dist/assets/{use-vault-list-uk4WVboC.js → use-vault-list-CT4-gajj.js} +1 -1
  225. package/src/console/ui-next/dist/assets/vault-page-CWrg-A68.js +2 -0
  226. package/src/console/ui-next/dist/assets/xyflow-CSyC6ryz.css +1 -0
  227. package/src/console/ui-next/dist/assets/xyflow-yApv7D4e.js +7 -0
  228. package/src/console/ui-next/dist/index.html +6 -13
  229. package/src/console/ui-next/seed-invoke-host.ts +21 -18
  230. package/src/console/ui-next/src/client.ts +7 -2
  231. package/src/console/ui-next/src/features/flows/graph/element-map.ts +2 -0
  232. package/src/console/ui-next/src/features/flows/traces/effect-kind.ts +12 -2
  233. package/src/console/ui-next/src/features/flows/traces/effect-summary.ts +4 -0
  234. package/src/console/ui-next/src/features/flows/traces/trace-detail-sheet.tsx +8 -0
  235. package/src/console/ui-next/src/features/flows/traces/waterfall-bars.ts +4 -0
  236. package/src/console/ui-next/src/features/flows/traces/waterfall-tooltip.ts +9 -3
  237. package/src/console/ui-next/src/features/store/detail/reveal-cell.tsx +7 -11
  238. package/src/console/ui-next/src/features/store/detail/store-row-detail-sheet.tsx +2 -2
  239. package/src/console/ui-next/src/features/store/lib/fields-from-table.ts +2 -0
  240. package/src/console/ui-next/src/features/store/lib/grid-model.test.ts +25 -1
  241. package/src/console/ui-next/src/features/store/lib/grid-model.ts +36 -1
  242. package/src/console/ui-next/src/features/store/query/query-results.tsx +3 -3
  243. package/src/console/ui-next/src/features/units/detail/effects-summary.tsx +2 -0
  244. package/src/console/ui-next/src/features/units/lib/call-read-safe.ts +3 -1
  245. package/src/console/ui-next/src/features/units/lib/fields-from-schema.ts +6 -0
  246. package/src/docker/ai-model-status.test.ts +1 -12
  247. package/src/docker/ai-model-status.ts +10 -38
  248. package/src/docker/compose-up.test.ts +100 -0
  249. package/src/docker/compose-up.ts +292 -0
  250. package/src/docker/compose.ts +4 -14
  251. package/src/docker/derive.ts +9 -34
  252. package/src/docker/docker.test.ts +16 -261
  253. package/src/docker/images-config.test.ts +13 -25
  254. package/src/docker/index.ts +1 -24
  255. package/src/docker/recipes/index.ts +0 -23
  256. package/src/docker/recipes/pgdog.ts +6 -4
  257. package/src/docker/stack-id.test.ts +2 -2
  258. package/src/docker/stack-id.ts +0 -1
  259. package/src/docker/types.ts +2 -2
  260. package/src/drivers/ai-anthropic.ts +10 -0
  261. package/src/drivers/ai-openai-compatible.ts +34 -7
  262. package/src/drivers/ai-providers.test.ts +0 -107
  263. package/src/drivers/ai-stream.test.ts +0 -34
  264. package/src/drivers/ai-types.ts +17 -8
  265. package/src/drivers/channel-fcm.ts +6 -1
  266. package/src/drivers/channel-msegat.ts +6 -1
  267. package/src/drivers/channel-resend.ts +5 -1
  268. package/src/drivers/channel-smtp.ts +5 -1
  269. package/src/drivers/channel-sndr.ts +10 -1
  270. package/src/drivers/channel-taqnyat-mail.ts +5 -1
  271. package/src/drivers/channel-taqnyat-whatsapp.ts +6 -1
  272. package/src/drivers/channel-taqnyat.ts +6 -1
  273. package/src/drivers/channel-types.ts +10 -0
  274. package/src/drivers/channel-unifonic.ts +6 -1
  275. package/src/drivers/channel-wa-cloud.ts +6 -1
  276. package/src/drivers/channel-webpush.ts +6 -1
  277. package/src/drivers/external.ts +33 -0
  278. package/src/drivers/index.ts +0 -10
  279. package/src/drivers/meilisearch.ts +6 -0
  280. package/src/drivers/oauth-types.ts +4 -0
  281. package/src/drivers/postgres.test.ts +74 -3
  282. package/src/drivers/postgres.ts +175 -6
  283. package/src/drivers/signal-types.ts +5 -5
  284. package/src/drivers/types.ts +7 -0
  285. package/src/drivers/vault-types.ts +5 -0
  286. package/src/elements/ai/declare.ts +17 -4
  287. package/src/elements/ai/eval.ts +1 -1
  288. package/src/elements/ai/mcp-http.ts +1 -1
  289. package/src/elements/ai/pii.ts +1 -1
  290. package/src/elements/ai/providers.test.ts +289 -0
  291. package/src/elements/ai/providers.ts +169 -0
  292. package/src/elements/ai/runtime.ts +68 -5
  293. package/src/elements/ai/schema.ts +2 -2
  294. package/src/elements/ai.test.ts +7 -7
  295. package/src/elements/ai.ts +17 -1
  296. package/src/elements/channel/runtime.ts +105 -12
  297. package/src/elements/clock/cron-fields.test.ts +144 -0
  298. package/src/elements/clock/cron-fields.ts +185 -0
  299. package/src/elements/clock/declare.ts +247 -3
  300. package/src/elements/clock.ts +21 -1
  301. package/src/elements/index.ts +15 -0
  302. package/src/elements/signal/chaos-child.ts +1 -2
  303. package/src/elements/signal/declare.ts +65 -37
  304. package/src/elements/signal/delivery-modes.test.ts +11 -31
  305. package/src/elements/signal/dry-run-replay.test.ts +1 -7
  306. package/src/elements/signal/dry-run-write-isolation.test.ts +1 -7
  307. package/src/elements/signal/key-ordering.test.ts +6 -26
  308. package/src/elements/signal/lease-reclaim.test.ts +2 -6
  309. package/src/elements/signal/optional-emit.test.ts +6 -9
  310. package/src/elements/signal/order-lifecycle.test.ts +4 -17
  311. package/src/elements/signal/orphan-messages.test.ts +4 -15
  312. package/src/elements/signal/reconcile.test.ts +2 -2
  313. package/src/elements/signal/runtime.ts +1 -1
  314. package/src/elements/signal/schema-emit.test.ts +4 -8
  315. package/src/elements/signal.test.ts +24 -49
  316. package/src/elements/signal.ts +9 -2
  317. package/src/elements/store/domain-ddl.test.ts +1 -1
  318. package/src/elements/store/live-http.test.ts +9 -4
  319. package/src/elements/store/prepare-row.test.ts +123 -0
  320. package/src/elements/store/resource.ts +43 -12
  321. package/src/elements/store/schema-decl.ts +117 -0
  322. package/src/elements/store/search-backfill.ts +205 -0
  323. package/src/elements/store/search-bind.ts +66 -0
  324. package/src/elements/store/search-bm25.ts +78 -0
  325. package/src/elements/store/search-ddl.ts +156 -0
  326. package/src/elements/store/search-embed-flow.ts +141 -0
  327. package/src/elements/store/search-errors.ts +34 -0
  328. package/src/elements/store/search-fusion.ts +112 -0
  329. package/src/elements/store/search-lsh.ts +179 -0
  330. package/src/elements/store/search-runtime.ts +300 -0
  331. package/src/elements/store/search.test.ts +144 -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 +50 -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 +1 -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 -132
  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 -162
  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-De7Lc2JC.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-RGy7VEA_.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-Ck88Jmv8.css +0 -2
  484. package/src/console/ui-next/dist/assets/index-_rgpdVzo.js +0 -66
  485. package/src/console/ui-next/dist/assets/link-BX6Vqztd.js +0 -1
  486. package/src/console/ui-next/dist/assets/observability-page-Ds6pcnh-.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-4rHOePuE.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-DISPgxLM.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
@@ -12,7 +12,7 @@ These recipes are real, working infrastructure choices behind the same two templ
12
12
 
13
13
  <Callout title="The one rule">
14
14
  Vendor choice lives in `images[…]` — never in `drivers.*`, which only ever say protocol ids
15
- (`postgres`, `redis`, `s3`, `smtp`, `meilisearch`, `openai-compatible`, `ollama`, …).
15
+ (`postgres`, `redis`, `s3`, `smtp`, `meilisearch`, `openai-compatible`, …).
16
16
  </Callout>
17
17
 
18
18
  ## SQL
@@ -98,45 +98,35 @@ Opt-in via `images.proxy` — leave unset until you need an edge or `--scale app
98
98
  />
99
99
  </Cards>
100
100
 
101
- ## AI (local / self-hosted)
101
+ ## AI
102
102
 
103
- Default local pin is **llama.cpp**. Ollama stays fully supported. vLLM / SGLang
104
- are production-tier self-host options most apps still use a managed provider.
103
+ Compose does not manage inference. Prefer [OpenRouter](/docs/recipes/openrouter)
104
+ for zero-Docker `fx.ask`, or BYO any OpenAI-shaped `/v1` via `OKE_AI_URL` /
105
+ `baseUrl` — see [Models](/docs/elements/ai/models).
105
106
 
106
- | Workload | Recipe |
107
- | -------------------------------- | ---------------------------------------------- |
108
- | Single-user / dev (lightest) | [llama.cpp](/docs/recipes/llama-cpp) (default) |
109
- | Local library UX | [Ollama](/docs/recipes/ollama) |
110
- | Multi-user GPU concurrency | [vLLM](/docs/recipes/vllm) |
111
- | Structured / agent GPU workloads | [SGLang](/docs/recipes/sglang) |
112
- | Managed cloud | Anthropic / OpenAI / … (no `images.ai`) |
113
-
114
- All four recipes **loopback-publish only** and pin explicit tags (never
115
- `latest`). Load models from curated registries — never arbitrary untrusted GGUF.
107
+ | Workload | Where |
108
+ | ------------------------------ | -------------------------------------- |
109
+ | Zero Docker / free cloud smoke | [OpenRouter](/docs/recipes/openrouter) |
110
+ | BYO OpenAI-compatible `/v1` | [Models](/docs/elements/ai/models) |
111
+ | Managed cloud (registry) | [Models](/docs/elements/ai/models) |
116
112
 
117
113
  <Cards>
118
114
  <Card
119
- title="llama.cpp"
120
- description="Default local AI OpenAI /v1, lightest footprint."
121
- href="/docs/recipes/llama-cpp"
122
- />
123
- <Card
124
- title="Ollama"
125
- description="Fully supported alternative — library pull UX."
126
- href="/docs/recipes/ollama"
115
+ title="OpenRouter"
116
+ description="Zero Dockeropenrouter/free + auto baseUrl."
117
+ href="/docs/recipes/openrouter"
127
118
  />
128
- <Card title="vLLM" description="Self-hosted multi-user GPU serving." href="/docs/recipes/vllm" />
129
119
  <Card
130
- title="SGLang"
131
- description="Self-hosted structured / agent GPU serving."
132
- href="/docs/recipes/sglang"
120
+ title="Models"
121
+ description="Registry providers + custom baseUrl / OKE_AI_URL."
122
+ href="/docs/elements/ai/models"
133
123
  />
134
124
  </Cards>
135
125
 
136
126
  ## Learn more
137
127
 
138
128
  - [Providers](/docs/providers) — managed cloud alternatives
139
- - [Docker](/docs/deployment/docker) — compose derivation, PgDog, reverse proxy
129
+ - [Configuration](/docs/reference/configuration) — `images` roles and compose derivation
140
130
  - [Store](/docs/elements/store) — `sql` / `kv` / `files` / `index` facets
141
131
 
142
132
  ## Next
@@ -148,5 +138,5 @@ All four recipes **loopback-publish only** and pin explicit tags (never
148
138
  href="/docs/recipes/postgres"
149
139
  />
150
140
  <Card title="Providers" description="Managed cloud alternatives." href="/docs/providers" />
151
- <Card title="Deployment" description="Compose, Swarm, or Kubernetes." href="/docs/deployment" />
141
+ <Card title="Caddy" description="Automatic HTTPS edge." href="/docs/recipes/caddy" />
152
142
  </Cards>
@@ -28,7 +28,7 @@ drivers: {
28
28
  },
29
29
  },
30
30
  images: {
31
- channel: { email: "axllent/mailpit:v1.30.7" },
31
+ channel: { email: "axllent/mailpit:v1.31.1" },
32
32
  },
33
33
  ```
34
34
 
@@ -126,9 +126,9 @@ surfaces as `meilisearch index: unreachable at <url> — …`.
126
126
 
127
127
  <Cards>
128
128
  <Card
129
- title="llama.cpp"
130
- description="Default local AI for the same stack."
131
- href="/docs/recipes/llama-cpp"
129
+ title="OpenRouter"
130
+ description="Zero Docker cloud AI for the same stack."
131
+ href="/docs/recipes/openrouter"
132
132
  />
133
133
  <Card
134
134
  title="Postgres"
@@ -23,9 +23,6 @@
23
23
  "mailpit",
24
24
  "meilisearch",
25
25
  "---AI---",
26
- "llama-cpp",
27
- "ollama",
28
- "vllm",
29
- "sglang"
26
+ "openrouter"
30
27
  ]
31
28
  }
@@ -100,8 +100,8 @@ upstream block.
100
100
 
101
101
  ## Learn more
102
102
 
103
- - [Reverse proxy](/docs/deployment/reverse-proxy) — Caddy / Traefik / nginx choice
104
- - [Docker · Reverse proxy](/docs/deployment/docker#reverse-proxy) — compose layer order
103
+ - [Caddy](/docs/recipes/caddy) — automatic HTTPS alternative
104
+ - [Traefik](/docs/recipes/traefik) — multi-replica discovery via Docker labels
105
105
  - [Security](/docs/reference/security) — `allowedHosts`
106
106
 
107
107
  ## Next
@@ -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