okengine 0.18.5 → 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.
- package/AGENTS.md +18 -10
- package/README.md +2 -2
- package/package.json +51 -50
- package/site/content/docs/ai/llms-txt.mdx +1 -1
- package/site/content/docs/ai/meta.json +1 -1
- package/site/content/docs/ai/skills.mdx +4 -1
- package/site/content/docs/ai/try-it.mdx +58 -0
- package/site/content/docs/client/auth.mdx +208 -0
- package/site/content/docs/client/calling.mdx +451 -0
- package/site/content/docs/client/index.mdx +209 -0
- package/site/content/docs/client/live.mdx +234 -0
- package/site/content/docs/client/meta.json +5 -0
- package/site/content/docs/client/react.mdx +249 -0
- package/site/content/docs/elements/ai/agents.mdx +232 -0
- package/site/content/docs/elements/ai/index.mdx +341 -0
- package/site/content/docs/elements/ai/mcp.mdx +275 -0
- package/site/content/docs/elements/ai/meta.json +5 -0
- package/site/content/docs/elements/ai/models.mdx +283 -0
- package/site/content/docs/elements/ai/prompts.mdx +256 -0
- package/site/content/docs/elements/channel/email.mdx +266 -0
- package/site/content/docs/elements/channel/index.mdx +344 -0
- package/site/content/docs/elements/channel/meta.json +5 -0
- package/site/content/docs/elements/channel/push.mdx +218 -0
- package/site/content/docs/elements/channel/receipts.mdx +206 -0
- package/site/content/docs/elements/channel/sms.mdx +264 -0
- package/site/content/docs/elements/channel/whatsapp.mdx +220 -0
- package/site/content/docs/elements/clock/index.mdx +300 -0
- package/site/content/docs/elements/clock/meta.json +5 -0
- package/site/content/docs/elements/clock/schedules.mdx +508 -0
- package/site/content/docs/elements/clock/sleep.mdx +445 -0
- package/site/content/docs/elements/flow/consumers.mdx +707 -0
- package/site/content/docs/elements/flow/http.mdx +1080 -0
- package/site/content/docs/elements/flow/index.mdx +618 -0
- package/site/content/docs/elements/flow/meta.json +5 -0
- package/site/content/docs/elements/flow/routing.mdx +559 -0
- package/site/content/docs/elements/flow/workflows.mdx +640 -0
- package/site/content/docs/elements/gate/auth.mdx +371 -0
- package/site/content/docs/elements/gate/authorization.mdx +298 -0
- package/site/content/docs/elements/gate/index.mdx +418 -0
- package/site/content/docs/elements/gate/meta.json +5 -0
- package/site/content/docs/elements/gate/rate-limits.mdx +365 -0
- package/site/content/docs/elements/gate/rls.mdx +303 -0
- package/site/content/docs/elements/gate/tenancy.mdx +372 -0
- package/site/content/docs/elements/index.mdx +20 -10
- package/site/content/docs/elements/signal/broadcast.mdx +517 -0
- package/site/content/docs/elements/signal/index.mdx +352 -0
- package/site/content/docs/elements/signal/live.mdx +590 -0
- package/site/content/docs/elements/signal/meta.json +5 -0
- package/site/content/docs/elements/signal/once.mdx +596 -0
- package/site/content/docs/elements/store/files.mdx +659 -0
- package/site/content/docs/elements/store/index.mdx +310 -0
- package/site/content/docs/elements/store/kv.mdx +629 -0
- package/site/content/docs/elements/store/meta.json +5 -0
- package/site/content/docs/elements/store/search.mdx +946 -0
- package/site/content/docs/elements/store/sql.mdx +937 -0
- package/site/content/docs/elements/vault/config.mdx +256 -0
- package/site/content/docs/elements/vault/index.mdx +356 -0
- package/site/content/docs/elements/vault/meta.json +5 -0
- package/site/content/docs/elements/vault/rotation.mdx +273 -0
- package/site/content/docs/elements/vault/secrets.mdx +285 -0
- package/site/content/docs/index.mdx +63 -36
- package/site/content/docs/meta.json +8 -7
- package/site/content/docs/plugins/cors.mdx +2 -1
- package/site/content/docs/plugins/csrf.mdx +4 -1
- package/site/content/docs/plugins/headers.mdx +2 -1
- package/site/content/docs/plugins/ip-allowlist.mdx +2 -1
- package/site/content/docs/plugins/magic-link.mdx +6 -0
- package/site/content/docs/plugins/maintenance-mode.mdx +2 -1
- package/site/content/docs/plugins/oauth.mdx +1 -1
- package/site/content/docs/plugins/otp.mdx +12 -1
- package/site/content/docs/plugins/passkey.mdx +39 -15
- package/site/content/docs/plugins/two-factor.mdx +91 -34
- package/site/content/docs/plugins/username.mdx +1 -1
- package/site/content/docs/recipes/caddy.mdx +3 -3
- package/site/content/docs/recipes/index.mdx +18 -28
- package/site/content/docs/recipes/mailpit.mdx +1 -1
- package/site/content/docs/recipes/meilisearch.mdx +3 -3
- package/site/content/docs/recipes/meta.json +1 -4
- package/site/content/docs/recipes/nginx.mdx +2 -2
- package/site/content/docs/recipes/openrouter.mdx +283 -0
- package/site/content/docs/recipes/pgdog.mdx +3 -3
- package/site/content/docs/recipes/postgres.mdx +1 -2
- package/site/content/docs/recipes/rustfs.mdx +2 -2
- package/site/content/docs/recipes/traefik.mdx +3 -3
- package/site/content/docs/reference/cli.mdx +231 -0
- package/site/content/docs/reference/configuration.mdx +30 -10
- package/site/content/docs/reference/environment-variables.mdx +93 -20
- package/site/content/docs/reference/errors.mdx +132 -29
- package/site/content/docs/reference/fx.mdx +137 -73
- package/site/content/docs/reference/index.mdx +13 -21
- package/site/content/docs/reference/meta.json +4 -5
- package/site/content/docs/reference/okid.mdx +42 -17
- package/site/content/docs/reference/plugins.mdx +4 -3
- package/site/content/docs/reference/security.mdx +197 -0
- package/site/content/docs/understand/meta.json +5 -0
- package/site/content/docs/understand/the-anatomy.mdx +132 -0
- package/site/content/docs/understand/the-model.mdx +32 -0
- package/site/content/docs/understand/the-problem.mdx +74 -0
- package/site/content/docs/understand/the-vocabulary.mdx +26 -0
- package/src/auth/api-keys.ts +2 -1
- package/src/auth/bindings.ts +64 -16
- package/src/auth/gate-auth.test.ts +6 -1
- package/src/auth/identity.ts +152 -5
- package/src/auth/index.ts +29 -0
- package/src/auth/invites.ts +2 -1
- package/src/auth/method-context.ts +41 -0
- package/src/auth/oauth-as/crypto.ts +2 -1
- package/src/auth/oauth-as/stores.ts +2 -1
- package/src/auth/operator.ts +2 -1
- package/src/auth/sessions-jwt.test.ts +77 -0
- package/src/auth/sessions.ts +20 -4
- package/src/auth/tenants.ts +3 -2
- package/src/auth/two-factor-challenge.test.ts +61 -0
- package/src/auth/two-factor-challenge.ts +284 -0
- package/src/auth/verification.ts +5 -0
- package/src/bench/REPORT.md +49 -0
- package/src/bench/g03-signal-once.bench.ts +1 -1
- package/src/bench/g10-observability-contention.bench.ts +1 -1
- package/src/bench/g17-hybrid-search.bench.ts +572 -0
- package/src/bench/load-app.ts +2 -10
- package/src/cli/ai-setup/ai-setup.test.ts +331 -42
- package/src/cli/ai-setup/apply.ts +294 -52
- package/src/cli/ai-setup/catalog.ts +238 -1342
- package/src/cli/ai-setup/index.ts +14 -99
- package/src/cli/ai-setup/prompts.ts +60 -443
- package/src/cli/ask-seed.test.ts +96 -0
- package/src/cli/ask-seed.ts +82 -0
- package/src/cli/ask-vault-gaps.test.ts +84 -0
- package/src/cli/ask-vault-gaps.ts +146 -0
- package/src/cli/build.ts +2 -2
- package/src/cli/client-add.test.ts +26 -1
- package/src/cli/client-add.ts +106 -27
- package/src/cli/db-seed.ts +2 -0
- package/src/cli/db.ts +150 -11
- package/src/cli/dev.ts +119 -211
- package/src/cli/docker-clean.ts +2 -2
- package/src/cli/docker-cli.test.ts +1 -1
- package/src/cli/doctor-diff.ts +4 -2
- package/src/cli/doctor-pii.test.ts +1 -1
- package/src/cli/doctor.ts +14 -1
- package/src/cli/hero-meta.test.ts +4 -2
- package/src/cli/load-config.images.test.ts +8 -10
- package/src/cli/load-config.ts +1 -1
- package/src/cli/registry.ts +22 -10
- package/src/cli/replay.ts +3 -1
- package/src/cli/start.ts +1 -1
- package/src/cli/tui/keys.ts +2 -3
- package/src/client/auth/cookies.ts +74 -0
- package/src/client/auth/create-auth-client.ts +636 -0
- package/src/client/auth/denials.ts +99 -0
- package/src/client/auth/session.ts +283 -0
- package/src/client/auth.test.ts +251 -0
- package/src/client/auth.ts +39 -114
- package/src/client/create-with-session.ts +245 -0
- package/src/client/create.ts +51 -5
- package/src/client/index.ts +11 -1
- package/src/client/live.ts +11 -79
- package/src/client/notes-contract.test.ts +5 -10
- package/src/client/sse.ts +137 -0
- package/src/client/stream.ts +147 -0
- package/src/client/transport.test.ts +32 -0
- package/src/client/transport.ts +123 -26
- package/src/client/types.ts +118 -14
- package/src/client-react/index.ts +185 -24
- package/src/client-react/use-live-query.ts +13 -3
- package/src/compiler/aot.test.ts +7 -4
- package/src/compiler/effects-embed.test.ts +56 -0
- package/src/compiler/effects-fetch.test.ts +43 -0
- package/src/compiler/effects-infer.ts +58 -2
- package/src/compiler/extract.test.ts +257 -43
- package/src/compiler/extract.ts +566 -48
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -4
- package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +2 -8
- package/src/compiler/fixtures/skyport.expected.json +4 -4
- package/src/compiler/fixtures/triggers/five-triggers.ts +14 -10
- package/src/compiler/response.ts +2 -2
- package/src/compiler/search-writer-isolation.test.ts +40 -0
- package/src/config/index.ts +11 -0
- package/src/console/server/app.ts +17 -23
- package/src/console/server/bind.ts +4 -0
- package/src/console/server/console.test.ts +2 -2
- package/src/console/server/flows-invoke.test.ts +50 -34
- package/src/console/server/flows.ts +436 -255
- package/src/console/server/runs-ingest.test.ts +6 -3
- package/src/console/server/serve.ts +1 -1
- package/src/console/server/signals.test.ts +1 -5
- package/src/console/server/signals.ts +8 -6
- package/src/console/server/state.ts +6 -1
- package/src/console/server/store.ts +1 -1
- package/src/console/ui-next/dist/assets/FileExportIcon-Ck-5od4R.js +1 -0
- package/src/console/ui-next/dist/assets/MoreHorizontalCircle01Icon-gMNGsE37.js +1 -0
- package/src/console/ui-next/dist/assets/PlusSignIcon-CwG3nxfu.js +1 -0
- package/src/console/ui-next/dist/assets/UnavailableIcon-D9cvHVPr.js +1 -0
- package/src/console/ui-next/dist/assets/UserIcon-DaE2PB5_.js +1 -0
- package/src/console/ui-next/dist/assets/access-page-DFeymU07.js +4 -0
- package/src/console/ui-next/dist/assets/agent-disclosure-U1rdfblp.js +1 -0
- package/src/console/ui-next/dist/assets/cache-glyph-BeFJeqBG.js +1 -0
- package/src/console/ui-next/dist/assets/call-pii-button-CVAONPii.js +1 -0
- package/src/console/ui-next/dist/assets/collapsible-D2A6NJ-3.js +1 -0
- package/src/console/ui-next/dist/assets/copy-inline-button-CAYD18cr.js +1 -0
- package/src/console/ui-next/dist/assets/dagre.esm-B1_XeuLP.js +1 -0
- package/src/console/ui-next/dist/assets/detail-header-DVWNjWjg.js +1 -0
- package/src/console/ui-next/dist/assets/dropdown-menu-4h2LOVXM.js +1 -0
- package/src/console/ui-next/dist/assets/duration-tone-Cgk_h5ja.js +9 -0
- package/src/console/ui-next/dist/assets/element-icons-BI8cJgdh.js +1 -0
- package/src/console/ui-next/dist/assets/explorer-empty-CJs5A-wm.js +1 -0
- package/src/console/ui-next/dist/assets/flows-page-Dss7941e.js +1 -0
- package/src/console/ui-next/dist/assets/highlighted-json-MYZQtRnw.js +154 -0
- package/src/console/ui-next/dist/assets/http-method-Jrh39p7A.js +1 -0
- package/src/console/ui-next/dist/assets/index-D0zS5rKO.css +2 -0
- package/src/console/ui-next/dist/assets/index-DXP2dBIF.js +63 -0
- package/src/console/ui-next/dist/assets/observability-page-HvolXxTI.js +4 -0
- package/src/console/ui-next/dist/assets/react-dom-Ddte4I-Q.js +9 -0
- package/src/console/ui-next/dist/assets/replica-lag-CSh2dzrb.js +18 -0
- package/src/console/ui-next/dist/assets/request-meta-BatF8KrK.js +1 -0
- package/src/console/ui-next/dist/assets/shortcut-keys-3ILd8oGn.js +1 -0
- package/src/console/ui-next/dist/assets/{sql-BskegiFM.js → sql-BsFa4tDR.js} +1 -1
- package/src/console/ui-next/dist/assets/store-page-eiKiHnNe.js +41 -0
- package/src/console/ui-next/dist/assets/trace-detail-sheet-CZkMeKS-.js +2 -0
- package/src/console/ui-next/dist/assets/tree-expand-toggle-CW8y5A2h.js +55 -0
- package/src/console/ui-next/dist/assets/units-page-B_RWJrEO.js +1 -0
- package/src/console/ui-next/dist/assets/{use-vault-list-uk4WVboC.js → use-vault-list-CT4-gajj.js} +1 -1
- package/src/console/ui-next/dist/assets/vault-page-CWrg-A68.js +2 -0
- package/src/console/ui-next/dist/assets/xyflow-CSyC6ryz.css +1 -0
- package/src/console/ui-next/dist/assets/xyflow-yApv7D4e.js +7 -0
- package/src/console/ui-next/dist/index.html +6 -13
- package/src/console/ui-next/seed-invoke-host.ts +21 -18
- package/src/console/ui-next/src/client.ts +7 -2
- package/src/console/ui-next/src/features/flows/graph/element-map.ts +2 -0
- package/src/console/ui-next/src/features/flows/traces/effect-kind.ts +12 -2
- package/src/console/ui-next/src/features/flows/traces/effect-summary.ts +4 -0
- package/src/console/ui-next/src/features/flows/traces/trace-detail-sheet.tsx +8 -0
- package/src/console/ui-next/src/features/flows/traces/waterfall-bars.ts +4 -0
- package/src/console/ui-next/src/features/flows/traces/waterfall-tooltip.ts +9 -3
- package/src/console/ui-next/src/features/store/detail/reveal-cell.tsx +7 -11
- package/src/console/ui-next/src/features/store/detail/store-row-detail-sheet.tsx +2 -2
- package/src/console/ui-next/src/features/store/lib/fields-from-table.ts +2 -0
- package/src/console/ui-next/src/features/store/lib/grid-model.test.ts +25 -1
- package/src/console/ui-next/src/features/store/lib/grid-model.ts +36 -1
- package/src/console/ui-next/src/features/store/query/query-results.tsx +3 -3
- package/src/console/ui-next/src/features/units/detail/effects-summary.tsx +2 -0
- package/src/console/ui-next/src/features/units/lib/call-read-safe.ts +3 -1
- package/src/console/ui-next/src/features/units/lib/fields-from-schema.ts +6 -0
- package/src/docker/ai-model-status.test.ts +1 -12
- package/src/docker/ai-model-status.ts +10 -38
- package/src/docker/compose-up.test.ts +100 -0
- package/src/docker/compose-up.ts +292 -0
- package/src/docker/compose.ts +4 -14
- package/src/docker/derive.ts +9 -34
- package/src/docker/docker.test.ts +16 -261
- package/src/docker/images-config.test.ts +13 -25
- package/src/docker/index.ts +1 -24
- package/src/docker/recipes/index.ts +0 -23
- package/src/docker/recipes/pgdog.ts +6 -4
- package/src/docker/stack-id.test.ts +2 -2
- package/src/docker/stack-id.ts +0 -1
- package/src/docker/types.ts +2 -2
- package/src/drivers/ai-anthropic.ts +10 -0
- package/src/drivers/ai-openai-compatible.ts +34 -7
- package/src/drivers/ai-providers.test.ts +0 -107
- package/src/drivers/ai-stream.test.ts +0 -34
- package/src/drivers/ai-types.ts +17 -8
- package/src/drivers/channel-fcm.ts +6 -1
- package/src/drivers/channel-msegat.ts +6 -1
- package/src/drivers/channel-resend.ts +5 -1
- package/src/drivers/channel-smtp.ts +5 -1
- package/src/drivers/channel-sndr.ts +10 -1
- package/src/drivers/channel-taqnyat-mail.ts +5 -1
- package/src/drivers/channel-taqnyat-whatsapp.ts +6 -1
- package/src/drivers/channel-taqnyat.ts +6 -1
- package/src/drivers/channel-types.ts +10 -0
- package/src/drivers/channel-unifonic.ts +6 -1
- package/src/drivers/channel-wa-cloud.ts +6 -1
- package/src/drivers/channel-webpush.ts +6 -1
- package/src/drivers/external.ts +33 -0
- package/src/drivers/index.ts +0 -10
- package/src/drivers/meilisearch.ts +6 -0
- package/src/drivers/oauth-types.ts +4 -0
- package/src/drivers/postgres.test.ts +74 -3
- package/src/drivers/postgres.ts +175 -6
- package/src/drivers/signal-types.ts +5 -5
- package/src/drivers/types.ts +7 -0
- package/src/drivers/vault-types.ts +5 -0
- package/src/elements/ai/declare.ts +17 -4
- package/src/elements/ai/eval.ts +1 -1
- package/src/elements/ai/mcp-http.ts +1 -1
- package/src/elements/ai/pii.ts +1 -1
- package/src/elements/ai/providers.test.ts +289 -0
- package/src/elements/ai/providers.ts +169 -0
- package/src/elements/ai/runtime.ts +68 -5
- package/src/elements/ai/schema.ts +2 -2
- package/src/elements/ai.test.ts +7 -7
- package/src/elements/ai.ts +17 -1
- package/src/elements/channel/runtime.ts +105 -12
- package/src/elements/clock/cron-fields.test.ts +144 -0
- package/src/elements/clock/cron-fields.ts +185 -0
- package/src/elements/clock/declare.ts +247 -3
- package/src/elements/clock.ts +21 -1
- package/src/elements/index.ts +15 -0
- package/src/elements/signal/chaos-child.ts +1 -2
- package/src/elements/signal/declare.ts +65 -37
- package/src/elements/signal/delivery-modes.test.ts +11 -31
- package/src/elements/signal/dry-run-replay.test.ts +1 -7
- package/src/elements/signal/dry-run-write-isolation.test.ts +1 -7
- package/src/elements/signal/key-ordering.test.ts +6 -26
- package/src/elements/signal/lease-reclaim.test.ts +2 -6
- package/src/elements/signal/optional-emit.test.ts +6 -9
- package/src/elements/signal/order-lifecycle.test.ts +4 -17
- package/src/elements/signal/orphan-messages.test.ts +4 -15
- package/src/elements/signal/reconcile.test.ts +2 -2
- package/src/elements/signal/runtime.ts +1 -1
- package/src/elements/signal/schema-emit.test.ts +4 -8
- package/src/elements/signal.test.ts +24 -49
- package/src/elements/signal.ts +9 -2
- package/src/elements/store/domain-ddl.test.ts +1 -1
- package/src/elements/store/live-http.test.ts +9 -4
- package/src/elements/store/prepare-row.test.ts +123 -0
- package/src/elements/store/resource.ts +43 -12
- package/src/elements/store/schema-decl.ts +117 -0
- package/src/elements/store/search-backfill.ts +205 -0
- package/src/elements/store/search-bind.ts +66 -0
- package/src/elements/store/search-bm25.ts +78 -0
- package/src/elements/store/search-ddl.ts +156 -0
- package/src/elements/store/search-embed-flow.ts +141 -0
- package/src/elements/store/search-errors.ts +34 -0
- package/src/elements/store/search-fusion.ts +112 -0
- package/src/elements/store/search-lsh.ts +179 -0
- package/src/elements/store/search-runtime.ts +300 -0
- package/src/elements/store/search.test.ts +144 -0
- package/src/elements/store/sql-session.test.ts +1 -0
- package/src/elements/store/sql-session.ts +83 -3
- package/src/elements/store/table.ts +23 -2
- package/src/elements/store/upsert-app.test.ts +1 -3
- package/src/elements/store.ts +50 -0
- package/src/full.ts +4 -2
- package/src/http.ts +4 -1
- package/src/i18n/catalogs/ar.ts +14 -6
- package/src/i18n/catalogs/en.ts +14 -6
- package/src/index.ts +6 -1
- package/src/kernel/adopt-barrel-fresh.test.ts +7 -7
- package/src/kernel/adopt-routes.ts +9 -1
- package/src/kernel/app-auth.ts +5 -0
- package/src/kernel/app.ts +102 -9
- package/src/kernel/auto-cache.test.ts +6 -12
- package/src/kernel/auto-registry.test.ts +3 -3
- package/src/kernel/boot-bind/ai.test.ts +22 -19
- package/src/kernel/boot-bind/ai.ts +5 -43
- package/src/kernel/boot-bind/clock.ts +23 -5
- package/src/kernel/boot-bind/honor-config.test.ts +4 -4
- package/src/kernel/boot.test.ts +11 -6
- package/src/kernel/boot.ts +66 -16
- package/src/kernel/boundary-contract.ts +93 -0
- package/src/kernel/budget.test.ts +1 -1
- package/src/kernel/call.ts +89 -0
- package/src/kernel/capability.ts +6 -0
- package/src/kernel/client-descriptor.ts +123 -0
- package/src/kernel/clock-timezone.test.ts +80 -0
- package/src/kernel/correlation.test.ts +1 -1
- package/src/kernel/dry-run.ts +11 -8
- package/src/kernel/effects-stamping.test.ts +42 -9
- package/src/kernel/effects.test.ts +4 -2
- package/src/kernel/effects.ts +51 -9
- package/src/kernel/errors-channel.ts +17 -0
- package/src/kernel/errors-live-resume.ts +3 -2
- package/src/kernel/errors-tenant.ts +7 -4
- package/src/kernel/errors.registry-helpers.ts +96 -0
- package/src/kernel/errors.registry.test.ts +139 -25
- package/src/kernel/errors.ts +102 -23
- package/src/kernel/external-effects.test.ts +196 -0
- package/src/kernel/flow.test.ts +13 -4
- package/src/kernel/flow.ts +69 -71
- package/src/kernel/fx-ask-telemetry.test.ts +2 -2
- package/src/kernel/fx-dead-letters.test.ts +3 -3
- package/src/kernel/fx-fetch.ts +55 -0
- package/src/kernel/fx-live-stream.ts +2 -2
- package/src/kernel/fx-live.test.ts +8 -8
- package/src/kernel/fx.test.ts +17 -11
- package/src/kernel/fx.ts +180 -57
- package/src/kernel/horizontal-child.ts +1 -1
- package/src/kernel/http-query.test.ts +3 -6
- package/src/kernel/index.ts +13 -3
- package/src/kernel/instance-id.ts +1 -1
- package/src/kernel/instances.test.ts +40 -0
- package/src/kernel/instances.ts +47 -9
- package/src/kernel/live-http.test.ts +6 -7
- package/src/kernel/live-http.ts +6 -2
- package/src/kernel/live-resume.test.ts +1 -1
- package/src/kernel/mcp-tool.test.ts +3 -3
- package/src/kernel/on.ts +98 -4
- package/src/kernel/pipeline.test.ts +12 -15
- package/src/kernel/plugin-elements.test.ts +1 -1
- package/src/kernel/stamp-http.test.ts +3 -3
- package/src/kernel/triggers.ts +210 -95
- package/src/kernel-entry.ts +0 -1
- package/src/manifest/diff.ts +11 -1
- package/src/manifest/fixtures/skyport.excerpt.json +1 -1
- package/src/manifest/types.ts +46 -2
- package/src/mcp/docs-index.ts +3 -3
- package/src/mcp/docs-mcp.test.ts +2 -2
- package/src/mcp/docs-tools.ts +1 -1
- package/src/okid.test.ts +56 -0
- package/src/okid.ts +55 -11
- package/src/plugins/anonymous.ts +8 -4
- package/src/plugins/auth/shared.ts +27 -3
- package/src/plugins/auth-delivery.mailpit.integration.test.ts +1 -1
- package/src/plugins/auth-methods.security.test.ts +561 -23
- package/src/plugins/config-source.ts +1 -1
- package/src/plugins/csrf.test.ts +65 -0
- package/src/plugins/index.ts +2 -0
- package/src/plugins/magic-link.ts +36 -16
- package/src/plugins/oauth/shared.ts +3 -1
- package/src/plugins/oauth.ts +22 -14
- package/src/plugins/otp.ts +37 -21
- package/src/plugins/passkey-webauthn.ts +9 -6
- package/src/plugins/passkey.ts +98 -26
- package/src/plugins/pre-account-hijack.test.ts +223 -0
- package/src/plugins/two-factor.ts +466 -37
- package/src/plugins/username.ts +19 -7
- package/src/release/build-lib.ts +1 -0
- package/src/release/limits.ts +2 -2
- package/src/release/measure.ts +1 -1
- package/src/runs/collect.test.ts +0 -2
- package/src/runtime/json-code-block.test.ts +250 -20
- package/src/runtime/json-code-block.ts +1261 -41
- package/src/term.test.ts +1 -1
- package/src/test/create-test-app.test.ts +12 -12
- package/src/test/live-signals.test.ts +6 -6
- package/src/test/provisions.integration.test.ts +10 -14
- package/src/test/reset-element-registries.ts +1 -1
- package/src/test/tenant-isolation.test.ts +12 -6
- package/site/content/docs/deployment/docker-swarm.mdx +0 -164
- package/site/content/docs/deployment/docker.mdx +0 -227
- package/site/content/docs/deployment/index.mdx +0 -83
- package/site/content/docs/deployment/kubernetes.mdx +0 -176
- package/site/content/docs/deployment/meta.json +0 -5
- package/site/content/docs/deployment/reverse-proxy.mdx +0 -234
- package/site/content/docs/elements/ai.mdx +0 -385
- package/site/content/docs/elements/channel.mdx +0 -346
- package/site/content/docs/elements/clock.mdx +0 -244
- package/site/content/docs/elements/flow.mdx +0 -420
- package/site/content/docs/elements/gate.mdx +0 -436
- package/site/content/docs/elements/signal.mdx +0 -380
- package/site/content/docs/elements/store.mdx +0 -1099
- package/site/content/docs/elements/vault.mdx +0 -405
- package/site/content/docs/get-started/basic-usage.mdx +0 -173
- package/site/content/docs/get-started/index.mdx +0 -43
- package/site/content/docs/get-started/installation.mdx +0 -220
- package/site/content/docs/get-started/introduction.mdx +0 -144
- package/site/content/docs/get-started/meta.json +0 -13
- package/site/content/docs/get-started/project-structure.mdx +0 -925
- package/site/content/docs/get-started/testing.mdx +0 -328
- package/site/content/docs/get-started/why.mdx +0 -114
- package/site/content/docs/recipes/llama-cpp.mdx +0 -151
- package/site/content/docs/recipes/ollama.mdx +0 -142
- package/site/content/docs/recipes/sglang.mdx +0 -105
- package/site/content/docs/recipes/vllm.mdx +0 -106
- package/site/content/docs/reference/cli.md +0 -232
- package/site/content/docs/reference/client.mdx +0 -469
- package/site/content/docs/reference/security.md +0 -74
- package/src/cli/ai-setup/detect-ollama.ts +0 -213
- package/src/cli/ai-setup/recommend.test.ts +0 -225
- package/src/cli/ai-setup/recommend.ts +0 -225
- package/src/cli/dev-controls.test.ts +0 -122
- package/src/cli/dev-controls.ts +0 -164
- package/src/cli/tui/DevLive.tsx +0 -126
- package/src/console/ui-next/dist/assets/access-page-3-EFj-2G.js +0 -4
- package/src/console/ui-next/dist/assets/agent-disclosure-BP0Y0Sux.js +0 -1
- package/src/console/ui-next/dist/assets/cache-glyph-B5X-NM0-.js +0 -1
- package/src/console/ui-next/dist/assets/call-pii-button-ChAUiLo9.js +0 -1
- package/src/console/ui-next/dist/assets/collapsible-DGnOM2ph.js +0 -1
- package/src/console/ui-next/dist/assets/copy-inline-button-DBHhgHKP.js +0 -1
- package/src/console/ui-next/dist/assets/dagre.esm-ZwcdTuZZ.js +0 -1
- package/src/console/ui-next/dist/assets/detail-header-DhHM1iaZ.js +0 -1
- package/src/console/ui-next/dist/assets/dropdown-menu-_NjTEo5_.js +0 -1
- package/src/console/ui-next/dist/assets/duration-tone-sC3lGABz.js +0 -9
- package/src/console/ui-next/dist/assets/element-icons-BVXtRyd3.js +0 -1
- package/src/console/ui-next/dist/assets/explorer-empty-2uIhBu0_.js +0 -1
- package/src/console/ui-next/dist/assets/flows-page-cVFnA4HH.js +0 -1
- package/src/console/ui-next/dist/assets/highlighted-json-Awq7gYdu.js +0 -154
- package/src/console/ui-next/dist/assets/http-method-_UHM2ODJ.js +0 -1
- package/src/console/ui-next/dist/assets/index-CMIgUbD0.js +0 -66
- package/src/console/ui-next/dist/assets/index-Ck88Jmv8.css +0 -2
- package/src/console/ui-next/dist/assets/link-BX6Vqztd.js +0 -1
- package/src/console/ui-next/dist/assets/observability-page-CQ3p34ip.js +0 -4
- package/src/console/ui-next/dist/assets/preload-helper-oH4irX4C.js +0 -1
- package/src/console/ui-next/dist/assets/react-D8E3mtu1.js +0 -1
- package/src/console/ui-next/dist/assets/react-dom-Bph1y7z7.js +0 -9
- package/src/console/ui-next/dist/assets/replica-lag-DKRrbvdo.js +0 -18
- package/src/console/ui-next/dist/assets/request-meta-DV0ywz7t.js +0 -1
- package/src/console/ui-next/dist/assets/shortcut-JQIZlWfm.js +0 -1
- package/src/console/ui-next/dist/assets/shortcut-keys-DKxNTe_m.js +0 -1
- package/src/console/ui-next/dist/assets/skeleton-D-czQJT6.js +0 -1
- package/src/console/ui-next/dist/assets/store-page-02xOiqIK.js +0 -41
- package/src/console/ui-next/dist/assets/trace-detail-sheet-B09O8rA6.js +0 -2
- package/src/console/ui-next/dist/assets/tree-expand-toggle-BtyhmWb4.js +0 -55
- package/src/console/ui-next/dist/assets/units-page-l8FeKfnP.js +0 -1
- package/src/console/ui-next/dist/assets/useMutation-B8EO02Ej.js +0 -1
- package/src/console/ui-next/dist/assets/useRender-BE2A9BWC.js +0 -1
- package/src/console/ui-next/dist/assets/vault-page-CL-d_mLE.js +0 -2
- package/src/console/ui-next/dist/assets/xyflow-D7n4g6go.js +0 -7
- package/src/console/ui-next/dist/assets/xyflow-DZ0Ws1xk.css +0 -1
- package/src/docker/ollama-pull.ts +0 -232
- package/src/docker/recipes/llama-cpp.ts +0 -298
- package/src/docker/recipes/ollama.ts +0 -44
- package/src/docker/recipes/sglang.ts +0 -55
- package/src/docker/recipes/vllm.ts +0 -44
- package/src/drivers/ai-ollama-tools.integration.test.ts +0 -109
- package/src/drivers/ai-ollama.integration.test.ts +0 -184
- package/src/drivers/ai-ollama.ts +0 -389
- 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`,
|
|
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
|
|
101
|
+
## AI
|
|
102
102
|
|
|
103
|
-
|
|
104
|
-
|
|
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
|
|
107
|
-
|
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
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="
|
|
120
|
-
description="
|
|
121
|
-
href="/docs/recipes/
|
|
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 Docker — openrouter/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="
|
|
131
|
-
description="
|
|
132
|
-
href="/docs/
|
|
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
|
-
- [
|
|
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="
|
|
141
|
+
<Card title="Caddy" description="Automatic HTTPS edge." href="/docs/recipes/caddy" />
|
|
152
142
|
</Cards>
|
|
@@ -126,9 +126,9 @@ surfaces as `meilisearch index: unreachable at <url> — …`.
|
|
|
126
126
|
|
|
127
127
|
<Cards>
|
|
128
128
|
<Card
|
|
129
|
-
title="
|
|
130
|
-
description="
|
|
131
|
-
href="/docs/recipes/
|
|
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"
|
|
@@ -100,8 +100,8 @@ upstream block.
|
|
|
100
100
|
|
|
101
101
|
## Learn more
|
|
102
102
|
|
|
103
|
-
- [
|
|
104
|
-
- [
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
- [
|
|
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 —
|
|
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
|
-
- [
|
|
126
|
-
- [
|
|
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
|