okengine 0.18.5 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/skills.mdx +4 -1
- 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 +208 -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 +235 -0
- package/site/content/docs/elements/ai/index.mdx +342 -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 +257 -0
- package/site/content/docs/elements/channel/email.mdx +269 -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 +301 -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 +448 -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 +375 -0
- package/site/content/docs/elements/index.mdx +20 -10
- package/site/content/docs/elements/signal/broadcast.mdx +519 -0
- package/site/content/docs/elements/signal/index.mdx +352 -0
- package/site/content/docs/elements/signal/live.mdx +591 -0
- package/site/content/docs/elements/signal/meta.json +5 -0
- package/site/content/docs/elements/signal/once.mdx +597 -0
- package/site/content/docs/elements/store/files.mdx +667 -0
- package/site/content/docs/elements/store/index.mdx +313 -0
- package/site/content/docs/elements/store/kv.mdx +637 -0
- package/site/content/docs/elements/store/meta.json +5 -0
- package/site/content/docs/elements/store/search.mdx +950 -0
- package/site/content/docs/elements/store/sql.mdx +941 -0
- package/site/content/docs/elements/vault/config.mdx +259 -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 +276 -0
- package/site/content/docs/elements/vault/secrets.mdx +288 -0
- package/site/content/docs/index.mdx +52 -40
- 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 +138 -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-architecture.mdx +264 -0
- package/site/content/docs/understand/try-it.mdx +58 -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 +80 -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-C_qLDhTq.js +4 -0
- package/src/console/ui-next/dist/assets/agent-disclosure-BHVqr3TN.js +1 -0
- package/src/console/ui-next/dist/assets/cache-glyph-CKe92lRQ.js +1 -0
- package/src/console/ui-next/dist/assets/call-pii-button-DEwTl8ZX.js +1 -0
- package/src/console/ui-next/dist/assets/collapsible-BCBtDrCt.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-JroqeuCp.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-CVHa0RTt.js +1 -0
- package/src/console/ui-next/dist/assets/highlighted-json-DjJW6hqe.js +154 -0
- package/src/console/ui-next/dist/assets/http-method-DC5HBdLU.js +1 -0
- package/src/console/ui-next/dist/assets/index-CYjiZ3WO.js +63 -0
- package/src/console/ui-next/dist/assets/index-D0zS5rKO.css +2 -0
- package/src/console/ui-next/dist/assets/observability-page-CAYMyKb3.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-yAQYLv75.js +18 -0
- package/src/console/ui-next/dist/assets/request-meta-D0yusGxJ.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-BTKJeJ02.js +41 -0
- package/src/console/ui-next/dist/assets/trace-detail-sheet-Bp-Yygs5.js +2 -0
- package/src/console/ui-next/dist/assets/tree-expand-toggle-DoaVDfAM.js +55 -0
- package/src/console/ui-next/dist/assets/units-page-BRz7xyYL.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-3jQt-bOJ.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.test.ts +1 -1
- package/src/console/ui-next/src/features/flows/graph/element-map.ts +5 -3
- 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/trace-detail.test.ts +4 -5
- package/src/console/ui-next/src/features/flows/traces/trace-gates.ts +3 -6
- 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/gate/declare.ts +1 -1
- package/src/elements/gate.ts +1 -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 +214 -0
- package/src/elements/store/search-runtime.pglite.test.ts +186 -0
- package/src/elements/store/search-runtime.ts +314 -0
- package/src/elements/store/search.test.ts +226 -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 +52 -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 +2 -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
|
@@ -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
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "CLI"
|
|
3
|
+
description: "oke and create-oke commands — scaffold, develop, ship, and operate an okengine app."
|
|
4
|
+
icon: "Terminal"
|
|
5
|
+
source: "docs/spec/unified-theory.md"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
The CLI is how you scaffold, run, and operate an app. `create-oke` writes the project;
|
|
9
|
+
`oke` is the day-to-day binary (dev loop, schema, vault, docker, doctor).
|
|
10
|
+
|
|
11
|
+
For developers who already know the model — look up a command, its flags, and what it
|
|
12
|
+
writes.
|
|
13
|
+
|
|
14
|
+
<Callout title="The one rule">
|
|
15
|
+
Prefer the CLI for environment wiring (`oke dev`, `oke db`, `oke docker`). Put behavior in Flows
|
|
16
|
+
and `oke.config.ts` — never invent a ninth element or hand-edit the Manifest.
|
|
17
|
+
</Callout>
|
|
18
|
+
|
|
19
|
+
## Smallest Example
|
|
20
|
+
|
|
21
|
+
<Steps>
|
|
22
|
+
|
|
23
|
+
<Step>
|
|
24
|
+
### Scaffold an app
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
bunx create-oke@latest notes --yes
|
|
28
|
+
cd notes
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
</Step>
|
|
32
|
+
|
|
33
|
+
<Step>
|
|
34
|
+
### Run the dev loop
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
oke dev
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Compose comes up (pull / create / start progress streams into the boot status
|
|
41
|
+
lines), the backend listens on **6530**, Console on **6533**, app MCP on **6535**,
|
|
42
|
+
docs MCP on **6536**. Open `http://localhost:6533`. Quit with **Ctrl+C**.
|
|
43
|
+
|
|
44
|
+
On a TTY, after schema push, `oke dev` also:
|
|
45
|
+
|
|
46
|
+
1. Prompts one-by-one for any Vault boot gaps (writes `.env.local`) — e.g.
|
|
47
|
+
`OPENROUTER_API_KEY` when create-oke / `oke ai setup` / Keel declared the
|
|
48
|
+
OpenRouter contract without a value.
|
|
49
|
+
2. Asks to run `oke db seed` when a seed module exists and `.oke/state.json` has
|
|
50
|
+
not recorded that seed identity yet. Run `oke db seed` anytime later.
|
|
51
|
+
|
|
52
|
+
</Step>
|
|
53
|
+
|
|
54
|
+
</Steps>
|
|
55
|
+
|
|
56
|
+
## Progressive Patterns
|
|
57
|
+
|
|
58
|
+
<Tabs items={["Daily", "Schema", "Ship", "Scaffold"]}>
|
|
59
|
+
|
|
60
|
+
<Tab value="Daily">
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
oke dev # watch · Console · client types · Docker Compose
|
|
64
|
+
oke test # bun test with PGLite posture
|
|
65
|
+
oke doctor # secrets · ports · schema drift
|
|
66
|
+
oke doctor --diff # CI gate: undeclared contract breaks
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
</Tab>
|
|
70
|
+
|
|
71
|
+
<Tab value="Schema">
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
oke db push # sync domain schema (dev; auto under oke dev)
|
|
75
|
+
oke db generate # versioned SQL under drizzle/
|
|
76
|
+
oke db migrate # apply migrations (prod)
|
|
77
|
+
oke schema generate # core + plugin stub → .oke/schema/oke.ts
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Consequence:** `oke schema generate` is not `oke db generate`. The first writes the
|
|
81
|
+
framework stub; the second emits your app's Drizzle migrations.
|
|
82
|
+
|
|
83
|
+
</Tab>
|
|
84
|
+
|
|
85
|
+
<Tab value="Ship">
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
oke docker --prod # derive production Compose
|
|
89
|
+
oke build --target bun # tree-shaken bundle
|
|
90
|
+
oke start # production entry (Docker CMD)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
</Tab>
|
|
94
|
+
|
|
95
|
+
<Tab value="Scaffold">
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
bunx create-oke@latest my-app --yes
|
|
99
|
+
bunx create-oke@latest my-app -t advanced --locales ar --proxy caddy
|
|
100
|
+
bunx create-oke@latest # interactive (TTY only)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
</Tab>
|
|
104
|
+
|
|
105
|
+
</Tabs>
|
|
106
|
+
|
|
107
|
+
## Port Map
|
|
108
|
+
|
|
109
|
+
| Port | Surface | Who starts it |
|
|
110
|
+
| -------- | -------------------- | ----------------------- |
|
|
111
|
+
| **6530** | Backend API | `oke dev` / `oke start` |
|
|
112
|
+
| **6533** | Developer Console | `oke dev` |
|
|
113
|
+
| **6535** | App MCP | `oke dev` |
|
|
114
|
+
| **6536** | Docs MCP (read-only) | `oke dev` |
|
|
115
|
+
|
|
116
|
+
Override app / console / mcp listen ports in `oke.config.ts` `ports` — see
|
|
117
|
+
[Configuration](/docs/reference/configuration#ports).
|
|
118
|
+
|
|
119
|
+
## `oke` Commands
|
|
120
|
+
|
|
121
|
+
| Command | Purpose | Key flags / subs |
|
|
122
|
+
| ------------ | ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
123
|
+
| `dev` | Watch · hot reload · Console · client types (Docker Compose) | `--docker\|-d [roles]`, `--no-db-push`, `--entry\|-e` |
|
|
124
|
+
| `test` | Run bun test with PGLite test posture | |
|
|
125
|
+
| `start` | Production entry (Docker CMD) | `--entry\|-e`, `--port\|-p` |
|
|
126
|
+
| `doctor` | Secrets · ports · stub/domain schema drift | `--manifest`, `--diff`, `--before`, `--after`, `--base`, `--json` |
|
|
127
|
+
| `stack` | Preview images / tags / ports (writes nothing) | `--config`, `--json` |
|
|
128
|
+
| `schema` | Core + plugin tables → `.oke/schema/oke.ts` | `generate` (`--check`, `--manifest`, `--out`) |
|
|
129
|
+
| `db` | Domain schema | `push` · `generate` · `migrate` · `seed` · `studio` · `search-backfill` |
|
|
130
|
+
| `client` | Ambient types for a separate frontend repo | `add <url>` (`--out`) |
|
|
131
|
+
| `vault` | Secrets | `set` · `list` · `import` · `key` · `init` · `status` · `seal` · `unseal` · `rotate` · `rotate-master` · `audit` · `purge-expired` · `backup` · `restore` |
|
|
132
|
+
| `docker` | Derive compose · clean leftover stacks | `--prod\|-p`, `--out`, `--config`, `--manifest`; sub `clean` |
|
|
133
|
+
| `images` | List / pin digests | `list` · `pin` |
|
|
134
|
+
| `build` | Tree-shaken bundle | `--target\|-t bun\|node\|edge`, `--entry`, `--outdir` |
|
|
135
|
+
| `eval` | Prompt eval sets (CI gate) | `--manifest` |
|
|
136
|
+
| `ai` | Configure AI driver + models | `setup` (`--provider`, `--chat`, `--vision`, `--embed`, `--yes`) |
|
|
137
|
+
| `branch` | Fork journaled state | `<name>`, `--at\|-a` |
|
|
138
|
+
| `replay` | Re-invoke a past Flow from Runs | `--request-id\|-r`, `--entry`, `--dry-run`, `--live` |
|
|
139
|
+
| `privacy` | Crypto-shred subject data | `erase` (`--subject\|-s`) |
|
|
140
|
+
| `upgrade` | Breaking-change codemods + diff | `--apply\|-a` |
|
|
141
|
+
| `console` | Console helpers | `claim-code` (`--json`) |
|
|
142
|
+
| `gates` | Gate catalogue from Manifest | `list` (`--manifest`, `--json`) |
|
|
143
|
+
| `completion` | Shell completion script | `bash` · `zsh` · `fish` |
|
|
144
|
+
| `mode` | **Deprecated** — `oke dev` always uses Docker Compose | `--help` |
|
|
145
|
+
|
|
146
|
+
Bare `oke` (TTY) opens the interactive board; `oke --help` prints the catalogue.
|
|
147
|
+
|
|
148
|
+
### `oke db` detail
|
|
149
|
+
|
|
150
|
+
Shared flags on push / generate / migrate / studio: `--config\|-c`, `--env name`
|
|
151
|
+
(`dev` · `test` · `prod`). Seed adds `--force`, `--entry`. Search-backfill adds
|
|
152
|
+
`--batch n` and a `<table>` positional.
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
oke db push --env dev
|
|
156
|
+
oke db migrate --env prod
|
|
157
|
+
oke db seed --force
|
|
158
|
+
oke db search-backfill notes --batch 500
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## `create-oke`
|
|
162
|
+
|
|
163
|
+
| Flag | Meaning |
|
|
164
|
+
| -------------------------------- | --------------------------------------------------------- |
|
|
165
|
+
| `-t, --template <id>` | `standard` (default) or `advanced` |
|
|
166
|
+
| `--sql <id>` | Store SQL dialect — only `postgres` (test stays `pglite`) |
|
|
167
|
+
| `-y, --yes` | No prompts; defaults + bun install (no `oke dev`) |
|
|
168
|
+
| `--install` / `--no-install` | Run or skip `bun install` after scaffold |
|
|
169
|
+
| `--agents-md` / `--no-agents-md` | Write `AGENTS.md` (default on) |
|
|
170
|
+
| `--ai` / `--no-ai` / `--ai skip` | Configure or skip AI setup |
|
|
171
|
+
| `--locales <tags>` | Extra languages beyond English (e.g. `ar` or `ar,fr`) |
|
|
172
|
+
| `--pgdog` / `--no-pgdog` | Pin PgDog in front of Postgres |
|
|
173
|
+
| `--proxy <id>` / `--no-proxy` | `none` · `caddy` · `traefik` · `nginx` |
|
|
174
|
+
| `-h, --help` | Show help |
|
|
175
|
+
|
|
176
|
+
## Troubleshooting
|
|
177
|
+
|
|
178
|
+
<Accordions>
|
|
179
|
+
|
|
180
|
+
<Accordion title="oke start: no entry found">
|
|
181
|
+
Set `package.json` `okengine.entry` or `main`, pass `--entry`, or keep a conventional
|
|
182
|
+
`src/app.ts`. Production imports that module; the app must call `createBunRuntime().serve` itself.
|
|
183
|
+
</Accordion>
|
|
184
|
+
|
|
185
|
+
<Accordion title="Confusion: oke schema generate vs oke db generate">
|
|
186
|
+
`oke schema generate` emits framework / plugin stub tables under `.oke/schema/`. `oke db generate`
|
|
187
|
+
emits versioned domain SQL via Drizzle. Use `db` for your app tables; use `schema` when the stub
|
|
188
|
+
drifted after a plugin change.
|
|
189
|
+
</Accordion>
|
|
190
|
+
|
|
191
|
+
<Accordion title="oke mode still in muscle memory">
|
|
192
|
+
`oke mode` is deprecated. `oke dev` always starts Docker Compose. There is no soft-compat for old
|
|
193
|
+
`local` / `docker` env map keys — rename to `dev` / `test` / `prod` in
|
|
194
|
+
[Configuration](/docs/reference/configuration).
|
|
195
|
+
</Accordion>
|
|
196
|
+
|
|
197
|
+
<Accordion title="OKE1110 after deploy">
|
|
198
|
+
Domain tables are missing in prod (no auto-DDL). Run `oke db migrate` against that environment —
|
|
199
|
+
see [Errors](/docs/reference/errors).
|
|
200
|
+
</Accordion>
|
|
201
|
+
|
|
202
|
+
<Accordion title="Claim code missing for first Console operator">
|
|
203
|
+
The setup claim code prints on the `oke dev` TTY board and is mirrored to gitignored
|
|
204
|
+
`.oke/claim-code`. Run `oke console claim-code` while setup is open.
|
|
205
|
+
</Accordion>
|
|
206
|
+
|
|
207
|
+
</Accordions>
|
|
208
|
+
|
|
209
|
+
## Learn more
|
|
210
|
+
|
|
211
|
+
- [Configuration](/docs/reference/configuration) — `oke.config.ts` drivers and ports
|
|
212
|
+
- [Environment Variables](/docs/reference/environment-variables) — what Compose writes
|
|
213
|
+
- [Security](/docs/reference/security) — Host / Origin / `allowedHosts`
|
|
214
|
+
- [The Architecture](/docs/understand/the-architecture) — one contract; `oke doctor --diff` reviews it
|
|
215
|
+
- [Vault](/docs/elements/vault) — `oke vault` rotate / unseal
|
|
216
|
+
|
|
217
|
+
## Next
|
|
218
|
+
|
|
219
|
+
<Cards>
|
|
220
|
+
<Card
|
|
221
|
+
title="Configuration"
|
|
222
|
+
description="Every option in oke.config.ts."
|
|
223
|
+
href="/docs/reference/configuration"
|
|
224
|
+
/>
|
|
225
|
+
<Card
|
|
226
|
+
title="Security"
|
|
227
|
+
description="Host, Origin, planes, and MCP posture."
|
|
228
|
+
href="/docs/reference/security"
|
|
229
|
+
/>
|
|
230
|
+
<Card title="Client" description="Typed createClient for your flows." href="/docs/client" />
|
|
231
|
+
</Cards>
|