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
|
@@ -1,18 +1,66 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Errors"
|
|
3
|
-
description: "
|
|
3
|
+
description: "OKE codes, gate denials, and subsystem errors — stable numeric codes with causes and fixes."
|
|
4
4
|
icon: "OctagonAlert"
|
|
5
|
+
source: "docs/spec/unified-theory.md"
|
|
5
6
|
---
|
|
6
7
|
|
|
7
|
-
OKE has two error families
|
|
8
|
+
OKE has two error families: **failures are values** a Flow returns
|
|
9
|
+
(`{ data: null, error: { code, data } }`), while **framework errors are thrown**
|
|
10
|
+
for invariant violations (permanent numeric code + cause + fix).
|
|
8
11
|
|
|
9
12
|
```text
|
|
10
|
-
|
|
13
|
+
OKE1110 domain table not found — migrations have not been applied.
|
|
11
14
|
→ run `oke db migrate` against this environment.
|
|
12
|
-
https://oke.omqkhafi.dev/e/
|
|
15
|
+
https://oke.omqkhafi.dev/e/1110
|
|
13
16
|
```
|
|
14
17
|
|
|
15
|
-
Codes are
|
|
18
|
+
Codes are stable after the domain-range renumber — match them safely across upgrades
|
|
19
|
+
(see the Unreleased Breaking Changes mapping if you still have a pre-renumber note).
|
|
20
|
+
|
|
21
|
+
<Callout title="The one rule">
|
|
22
|
+
Switch on `error.code` for Flow failures. Catch / match `OKE####` only for thrown framework
|
|
23
|
+
invariants. Do not treat a typed `NotFound` as an unhandled exception.
|
|
24
|
+
</Callout>
|
|
25
|
+
|
|
26
|
+
## Smallest Example
|
|
27
|
+
|
|
28
|
+
<Steps>
|
|
29
|
+
|
|
30
|
+
<Step>
|
|
31
|
+
### Return a typed failure
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
on(
|
|
35
|
+
http.get({
|
|
36
|
+
in: z.object({ id: z.string() }),
|
|
37
|
+
errors: { NotFound: z.object({ id: z.string() }) },
|
|
38
|
+
}),
|
|
39
|
+
flow({
|
|
40
|
+
do: async ({ id }, fx) => {
|
|
41
|
+
const [row] = await fx.store(db).select().from(notes).where(eq(notes.id, id));
|
|
42
|
+
if (!row) return fx.fail("NotFound", { id });
|
|
43
|
+
return row;
|
|
44
|
+
},
|
|
45
|
+
}),
|
|
46
|
+
);
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
</Step>
|
|
50
|
+
|
|
51
|
+
<Step>
|
|
52
|
+
### Handle it on the client
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
const { data, error } = await api.notes.get({ id });
|
|
56
|
+
if (error?.code === "NotFound") {
|
|
57
|
+
// value — not a throw
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
</Step>
|
|
62
|
+
|
|
63
|
+
</Steps>
|
|
16
64
|
|
|
17
65
|
## Localized messages
|
|
18
66
|
|
|
@@ -25,34 +73,42 @@ from `Accept-Language` (matched to `i18n.locales`); fallback is `i18n.default`.
|
|
|
25
73
|
| Thrown `OkeError` | `oke.{code}.cause` · `oke.{code}.fix` | Cause + fix lines in the thrown message |
|
|
26
74
|
|
|
27
75
|
Override via `defineLocale`. Pass `fail(code, data, { message })` for a custom
|
|
28
|
-
string. Custom app codes stay message-less until registered.
|
|
76
|
+
string. Custom app codes stay message-less until registered. Full catalogs:
|
|
77
|
+
[i18n](/docs/reference/i18n).
|
|
29
78
|
|
|
30
79
|
## OKE numeric codes
|
|
31
80
|
|
|
32
|
-
| Code | Name | Cause
|
|
33
|
-
| ------ | -------------------- |
|
|
34
|
-
| `1001` | undeclared read | Flow reads a resource not in `effects.reads`
|
|
35
|
-
| `1002` | undeclared write | Flow writes a resource not in `effects.writes`
|
|
36
|
-
| `1003` | undeclared emit | Flow emits a signal not in `effects.emits`
|
|
37
|
-
| `1004` | undeclared send | Flow sends a template not in `effects.sends`
|
|
38
|
-
| `1005` | undeclared ask | Flow asks a prompt not in `effects.asks`
|
|
39
|
-
| `1006` | undeclared secret | Flow reads a secret not in `effects.secrets`
|
|
40
|
-
| `1007` | undeclared call | Flow calls a flow not in `effects.calls`
|
|
41
|
-
| `
|
|
42
|
-
| `
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
48
|
-
| `
|
|
49
|
-
| `
|
|
50
|
-
| `
|
|
81
|
+
| Code | Name | Cause | Fix |
|
|
82
|
+
| ------ | -------------------- | ------------------------------------------------------ | --------------------------------------------------------- |
|
|
83
|
+
| `1001` | undeclared read | Flow reads a resource not in `effects.reads` | Add it to the flow's `effects.reads` |
|
|
84
|
+
| `1002` | undeclared write | Flow writes a resource not in `effects.writes` | Add it to the flow's `effects.writes` |
|
|
85
|
+
| `1003` | undeclared emit | Flow emits a signal not in `effects.emits` | Add it to the flow's `effects.emits` |
|
|
86
|
+
| `1004` | undeclared send | Flow sends a template not in `effects.sends` | Add it to the flow's `effects.sends` |
|
|
87
|
+
| `1005` | undeclared ask | Flow asks a prompt not in `effects.asks` | Add it to the flow's `effects.asks` |
|
|
88
|
+
| `1006` | undeclared secret | Flow reads a secret not in `effects.secrets` | Add it to the flow's `effects.secrets` |
|
|
89
|
+
| `1007` | undeclared call | Flow calls a flow not in `effects.calls` | Add it to the flow's `effects.calls` |
|
|
90
|
+
| `1008` | undeclared fetch | Flow fetches a host not in `effects.fetches` | Add the hostname to the flow's `effects.fetches` |
|
|
91
|
+
| `1009` | undeclared embed | Flow embeds with a model not in `effects.embeds` | Add it to the flow's `effects.embeds` |
|
|
92
|
+
| `1020` | no effects declared | Flow has no `effects` and no Manifest to infer from | Run `oke build` / `oke dev`, or declare effects |
|
|
93
|
+
| `1030` | adopt barrel stale | A `src/flows/<unit>` folder was not adopted | Run `oke dev` or `oke build` to regenerate `generated.ts` |
|
|
94
|
+
| `1040` | HTTP path unresolved | Pathless `http.get()` never received a file-tree stamp | Import `@/flows/generated`, or pass `http.get("/…")` |
|
|
95
|
+
| `1041` | HTTP route clash | Two HTTP flows share the same method + path | Give each flow a unique method + path |
|
|
96
|
+
| `1045` | HTTP flow unnamed | Adopted HTTP flow still has no `unit.export` | Export from `flows/<unit>/` or pass a named `flow` |
|
|
97
|
+
| `1050` | live exposure dup | Same signal, gates, and match on two GET routes | Change the gate or path-param filter |
|
|
98
|
+
| `1060` | MCP tool duplicate | Two MCP tool bindings share the same tool name | Give each MCP tool exposure a unique name |
|
|
99
|
+
| `1110` | schema missing | Domain table absent in `prod` — no auto-DDL | Run `oke db migrate` against this environment |
|
|
100
|
+
| `1210` | live resume gap | `Last-Event-ID` is not on the retained tape | Reconnect without the cursor; remaining tape replays |
|
|
101
|
+
| `1240` | orphan emit | Emit with zero subscribers and `optional` false | Add `on(signal, …)` or declare `optional: true` |
|
|
102
|
+
| `1250` | signal schema | Emit payload failed the signal's `schema` | Pass a payload that matches `schema`, or remove it |
|
|
103
|
+
| `1605` | channel schema | Send payload failed the template's `schema` | Fix template `data` payload or the template `schema` |
|
|
104
|
+
| `1810` | tenant required | Tenant-scoped op with no `fx.tenant.id` | `switchTenant`, signed `tid`, or tenant header |
|
|
105
|
+
| `1820` | tenant not member | Client-supplied tenant id is not a membership | Pick from `listTenants` or add the user as a member |
|
|
106
|
+
| `1830` | tenant unknown scope | Tenant role used an invented or `console:*` scope | Use a declared application scope |
|
|
51
107
|
|
|
52
108
|
<Callout title="Effects are usually inferred">
|
|
53
|
-
The 1001–1007 family exists for flows that declare effects explicitly. Most apps
|
|
54
|
-
`effects` block — inference covers them — so seeing one of these means an explicit
|
|
55
|
-
drifted from the code.
|
|
109
|
+
The 1001–1007 · 1008 · 1009 family exists for flows that declare effects explicitly. Most apps
|
|
110
|
+
never write an `effects` block — inference covers them — so seeing one of these means an explicit
|
|
111
|
+
declaration drifted from the code.
|
|
56
112
|
</Callout>
|
|
57
113
|
|
|
58
114
|
## Gate denials (typed failures)
|
|
@@ -98,9 +154,56 @@ Thrown by specific subsystems — each names its own cause:
|
|
|
98
154
|
| `AccessGrantError` | Console access grant rejected | Re-request access with a valid grant |
|
|
99
155
|
| `UnsupportedPathError` | A route path shape the router can't compile | Simplify the path pattern |
|
|
100
156
|
|
|
157
|
+
## Troubleshooting
|
|
158
|
+
|
|
159
|
+
<Accordions>
|
|
160
|
+
|
|
161
|
+
<Accordion title="I hit OKE1001–1009">
|
|
162
|
+
Explicit `effects` drifted from `do`. Add the missing ledger entry or remove the hand-written
|
|
163
|
+
`effects` block so inference covers the Flow.
|
|
164
|
+
</Accordion>
|
|
165
|
+
|
|
166
|
+
<Accordion title="OKE1040 pathless HTTP never stamped">
|
|
167
|
+
Import `@/flows/generated`, or pass an explicit path: `http.get("/users/:id")`.
|
|
168
|
+
</Accordion>
|
|
169
|
+
|
|
170
|
+
<Accordion title="OKE1041 method + path bound twice">
|
|
171
|
+
A resource mount and a handwritten route share the same method + path. Drop one binding.
|
|
172
|
+
</Accordion>
|
|
173
|
+
|
|
174
|
+
<Accordion title="OKE1110 in production">
|
|
175
|
+
Domain tables missing — prod has no auto-DDL. Run `oke db migrate` against that environment
|
|
176
|
+
([CLI](/docs/reference/cli)).
|
|
177
|
+
</Accordion>
|
|
178
|
+
|
|
179
|
+
<Accordion title="Unauthorized / Forbidden / RateLimited">
|
|
180
|
+
These are gate denials returned as values before `do` runs — not thrown OKE codes. Fix the policy,
|
|
181
|
+
membership, or rate budget. See [Gate](/docs/elements/gate).
|
|
182
|
+
</Accordion>
|
|
183
|
+
|
|
184
|
+
<Accordion title="VaultBootError at startup">
|
|
185
|
+
A vault contract has no value in any resolution layer. The error lists every gap — set the missing
|
|
186
|
+
names ([Vault](/docs/elements/vault)).
|
|
187
|
+
</Accordion>
|
|
188
|
+
|
|
189
|
+
</Accordions>
|
|
190
|
+
|
|
101
191
|
## Learn more
|
|
102
192
|
|
|
103
193
|
- [i18n](/docs/reference/i18n) — catalogs, `fx.t`, locale matching
|
|
104
194
|
- [Flow](/docs/elements/flow) — `fx.fail` and the response envelope
|
|
105
195
|
- [Gate](/docs/elements/gate) — where the three denials come from
|
|
106
|
-
- [CLI
|
|
196
|
+
- [CLI](/docs/reference/cli) — `oke db migrate` and friends
|
|
197
|
+
- [fx](/docs/reference/fx) — how failures and effects surface
|
|
198
|
+
|
|
199
|
+
## Next
|
|
200
|
+
|
|
201
|
+
<Cards>
|
|
202
|
+
<Card title="fx" description="The door that records effects." href="/docs/reference/fx" />
|
|
203
|
+
<Card
|
|
204
|
+
title="Gate"
|
|
205
|
+
description="Where Unauthorized and Forbidden come from."
|
|
206
|
+
href="/docs/elements/gate"
|
|
207
|
+
/>
|
|
208
|
+
<Card title="Client" description="Switch on error.code in the browser." href="/docs/client" />
|
|
209
|
+
</Cards>
|
|
@@ -1,38 +1,89 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "fx"
|
|
3
|
-
description: "The complete fx surface — every call a
|
|
3
|
+
description: "The complete fx surface — every call a Flow can make, its signature, and the effect it records."
|
|
4
4
|
icon: "Braces"
|
|
5
|
+
source: "docs/spec/unified-theory.md"
|
|
5
6
|
---
|
|
6
7
|
|
|
7
|
-
`fx` is the second argument of every `do` — the single door to the world. This page is the
|
|
8
|
+
`fx` is the second argument of every `do` — the single door to the world. This page is the
|
|
9
|
+
whole surface; each entry notes the **effect it records**, which feeds the Manifest, caching,
|
|
10
|
+
and capability checks.
|
|
11
|
+
|
|
12
|
+
<Callout title="The one rule">
|
|
13
|
+
All world access goes through `fx`. No `node:` I/O, no raw `fetch` for side effects (use
|
|
14
|
+
`fx.fetch` instead), no `Date.now()` — clocks, stores, channels, vault, AI, and outbound HTTP only
|
|
15
|
+
through this object.
|
|
16
|
+
</Callout>
|
|
17
|
+
|
|
18
|
+
## Smallest Example
|
|
19
|
+
|
|
20
|
+
<Steps>
|
|
21
|
+
|
|
22
|
+
<Step>
|
|
23
|
+
### Use `fx` inside `do`
|
|
24
|
+
|
|
25
|
+
```typescript title="src/flows/notes/create.ts"
|
|
26
|
+
import { on, flow, http } from "okengine";
|
|
27
|
+
import { z } from "zod";
|
|
28
|
+
import { db, notes } from "@/schema";
|
|
29
|
+
|
|
30
|
+
export const create = on(
|
|
31
|
+
http.post(),
|
|
32
|
+
flow({
|
|
33
|
+
in: z.object({ title: z.string().min(1) }),
|
|
34
|
+
do: async ({ title }, fx) => {
|
|
35
|
+
const id = fx.id();
|
|
36
|
+
await fx.store(db).insert(notes).values({ id, title });
|
|
37
|
+
return fx.json.create({ id, title });
|
|
38
|
+
},
|
|
39
|
+
}),
|
|
40
|
+
);
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
</Step>
|
|
44
|
+
|
|
45
|
+
<Step>
|
|
46
|
+
### Type extracted helpers as `Fx`
|
|
8
47
|
|
|
9
48
|
```typescript
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
49
|
+
import type { Fx } from "okengine";
|
|
50
|
+
|
|
51
|
+
async function loadNote(id: string, fx: Fx) {
|
|
52
|
+
return fx.store(db).findById(notes, id);
|
|
53
|
+
}
|
|
15
54
|
```
|
|
16
55
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
56
|
+
A narrower structural type will not match `store()` overloads. See [Flow](/docs/elements/flow).
|
|
57
|
+
|
|
58
|
+
</Step>
|
|
59
|
+
|
|
60
|
+
</Steps>
|
|
61
|
+
|
|
62
|
+
## What the effects ledger powers
|
|
63
|
+
|
|
64
|
+
| Derived behavior | From |
|
|
65
|
+
| ---------------------- | -------------------------------------- |
|
|
66
|
+
| Cache invalidation | Inferred / ledgered `reads` · `writes` |
|
|
67
|
+
| Live queries / CDC | Store `writes` observed as row events |
|
|
68
|
+
| Least-privilege tokens | Effect matrices on Flows |
|
|
69
|
+
| Deterministic tests | Injectable clock · store · channel |
|
|
70
|
+
| Runs observability | Wide events per invocation (`fx.runs`) |
|
|
21
71
|
|
|
22
72
|
## Stores
|
|
23
73
|
|
|
24
|
-
| Signature | Records
|
|
25
|
-
| ------------------------------------------------------------------- |
|
|
26
|
-
| `fx.store(sqlDecl).select().from(t)…` | `read`
|
|
27
|
-
| `fx.store(sqlDecl).insert(t).values(v)` | `write`
|
|
28
|
-
| `fx.store(sqlDecl).update(t).set(v).where(…)` | `write`
|
|
29
|
-
| `fx.store(sqlDecl).delete(t).where(…)` | `write`
|
|
30
|
-
| `fx.store(sqlDecl).findById(t, id)` | `read`
|
|
31
|
-
| `fx.store(
|
|
32
|
-
| `fx.store(
|
|
33
|
-
| `fx.store(files).
|
|
34
|
-
| `fx.store(files).
|
|
35
|
-
| `fx.store(
|
|
74
|
+
| Signature | Records | Returns |
|
|
75
|
+
| ------------------------------------------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------- |
|
|
76
|
+
| `fx.store(sqlDecl).select().from(t)…` | `read` | inferred rows (`where` · `orderBy` · `limit` · `offset` chainable) |
|
|
77
|
+
| `fx.store(sqlDecl).insert(t).values(v)` | `write` | `Promise<void>` |
|
|
78
|
+
| `fx.store(sqlDecl).update(t).set(v).where(…)` | `write` | `Promise<void>` |
|
|
79
|
+
| `fx.store(sqlDecl).delete(t).where(…)` | `write` | `Promise<void>` |
|
|
80
|
+
| `fx.store(sqlDecl).findById(t, id)` | `read` | row \| undefined |
|
|
81
|
+
| `fx.store(sqlDecl).search(table, { query, fuse?, rerank?, … })` | `read` (+ `ask` if rerank) | `{ data, meta }` hybrid BM25 ± LSH — see [Search](/docs/elements/store/search) |
|
|
82
|
+
| `fx.store(kv).get / set(key, value, ttl?) / delete / list(prefix?)` | read / write | per op |
|
|
83
|
+
| `fx.store(files).put / get / delete / list(prefix?)` | read / write | per op |
|
|
84
|
+
| `fx.store(files).image(key\|bytes).…` | read / write | Bun.Image chain; terminals gate (see [Store](/docs/elements/store#images--image--putimage)) |
|
|
85
|
+
| `fx.store(files).putImage(key, data, opts?)` | `write` | original + variants (+ optional LQIP) |
|
|
86
|
+
| `fx.store(index).upsert / search(vector, topK?) / delete` | read / write | per op |
|
|
36
87
|
|
|
37
88
|
See [Store](/docs/elements/store) for the query-builder surface.
|
|
38
89
|
|
|
@@ -40,7 +91,7 @@ See [Store](/docs/elements/store) for the query-builder surface.
|
|
|
40
91
|
|
|
41
92
|
| Signature | Records | Notes |
|
|
42
93
|
| ------------------------------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
43
|
-
| `fx.emit(signal, payload?, { key? })` | `emit` | Commits the signal outbox when the call resolves; optional `key` serializes `once` per key; stamps producer run id as `parentRunId` for trace chains; throws **
|
|
94
|
+
| `fx.emit(signal, payload?, { key? })` | `emit` | Commits the signal outbox when the call resolves; optional `key` serializes `once` per key; stamps producer run id as `parentRunId` for trace chains; throws **OKE1240** (orphan) or **OKE1250** (schema) |
|
|
44
95
|
| `fx.deadLetters(signal)` | `read` `signal:<name>` | Dead-lettered messages for that signal. Payload typed from `SignalDecl<T>`. Page with `fx.json.withQuery`. Cross-signal throws **OKE1001**. |
|
|
45
96
|
| `fx.live(signal, { match? })` | `read` `signal:<name>` | Live tape as SSE. Returns `JsonStreamResult` (object chunks, `id:` on the wire). Cross-signal throws **OKE1001**. Do not wrap with `fx.json.stream`. |
|
|
46
97
|
|
|
@@ -56,8 +107,10 @@ Declare `effects: { reads: ["runs"] }`. Powers native SLO checkers (Clock + Chan
|
|
|
56
107
|
| `fx.runs.checkSlo(flow, slo, windowMs?)` | `read` `runs` | Availability / latency breaches |
|
|
57
108
|
|
|
58
109
|
```typescript
|
|
110
|
+
const sloCheckClock = clock("ops.slo-check", { every: "5m" });
|
|
111
|
+
|
|
59
112
|
on(
|
|
60
|
-
|
|
113
|
+
sloCheckClock,
|
|
61
114
|
flow("ops.slo-check", {
|
|
62
115
|
effects: { reads: ["runs"], sends: ["slo-alert"] },
|
|
63
116
|
do: async (_, fx) => {
|
|
@@ -159,6 +212,18 @@ const rows = await fx.using(
|
|
|
159
212
|
Omit locale opts and the send uses `fx.locale`. Dry runs record _would have fired_ and never
|
|
160
213
|
contact a provider. Channel bodies use `{{field}}` catalogs — not ICU (see [Channel](/docs/elements/channel)).
|
|
161
214
|
|
|
215
|
+
## Outbound HTTP
|
|
216
|
+
|
|
217
|
+
| Signature | Records | Notes |
|
|
218
|
+
| ---------------------- | --------------------------- | ------------------------------------------------------------------------- |
|
|
219
|
+
| `fx.fetch(url, init?)` | `fetch` on the URL hostname | Always stamps `EffectEntry.external` with `{ host, kind: "third-party" }` |
|
|
220
|
+
|
|
221
|
+
Declare hosts in `effects.fetches` (e.g. `["api.stripe.com"]`). Prefer `fx.step`; use
|
|
222
|
+
`fx.retry` only when the remote API is safe to repeat. Dry runs never hit the network.
|
|
223
|
+
|
|
224
|
+
Use this for third-party REST outside Channel / AI / Store — not as a substitute for those
|
|
225
|
+
elements.
|
|
226
|
+
|
|
162
227
|
## AI
|
|
163
228
|
|
|
164
229
|
| Signature | Records | Returns |
|
|
@@ -170,6 +235,10 @@ contact a provider. Channel bodies use `{{field}}` catalogs — not ICU (see [Ch
|
|
|
170
235
|
|
|
171
236
|
AI calls are nondeterministic: journaling is forced on and auto-cache disabled around them. `tools` are Flow refs — each model tool call goes through `fx.call` (same capability and Runs path).
|
|
172
237
|
|
|
238
|
+
Driver-reported `EffectEntry.external` marks cloud providers as `third-party` and
|
|
239
|
+
self-hosted / `provider: "local"` as `infrastructure` (Console waterfall dashed egress +
|
|
240
|
+
host tooltip).
|
|
241
|
+
|
|
173
242
|
## Vault
|
|
174
243
|
|
|
175
244
|
| Signature | Records | Returns / notes |
|
|
@@ -232,54 +301,9 @@ Returning a plain value instead answers 200 with `{ data: value, error: null }`
|
|
|
232
301
|
| `fx.locale` | Active locale (`Accept-Language` matched to `i18n.locales`) |
|
|
233
302
|
| `fx.id()` | OKID — 21-char native id from `okengine/okid` |
|
|
234
303
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
(FormatJS): `{name}`, plurals, `select` / `selectordinal`, rich-text tags.
|
|
239
|
-
Full syntax and escaping: [i18n · ICU](/docs/reference/i18n#icu-messageformat).
|
|
240
|
-
|
|
241
|
-
Register catalogs with `defineLocale` before boot (nested trees → dot keys). Augment
|
|
242
|
-
`Register` so keys autocomplete and typos fail at compile time:
|
|
243
|
-
|
|
244
|
-
```typescript
|
|
245
|
-
import { defineLocale, defineMessages, type MessagesFor } from "okengine/i18n";
|
|
246
|
-
|
|
247
|
-
export const en = defineMessages({
|
|
248
|
-
greeting: "Hello, {name}",
|
|
249
|
-
items: "{count, plural, one {# item} other {# items}}",
|
|
250
|
-
place: "You finished {place, selectordinal, one {#st} two {#nd} few {#rd} other {#th}}!",
|
|
251
|
-
status: "{status, select, online {Online} offline {Offline} other {Unknown}}",
|
|
252
|
-
cta: "Read <docs>the docs</docs>",
|
|
253
|
-
});
|
|
254
|
-
defineLocale("en", en);
|
|
255
|
-
|
|
256
|
-
defineLocale("ar", {
|
|
257
|
-
greeting: "مرحباً، {name}",
|
|
258
|
-
items: "{count, plural, zero {لا عناصر} one {عنصر واحد} other {# عناصر}}",
|
|
259
|
-
place: "أنهيت في المرتبة {place, selectordinal, other {#}}!",
|
|
260
|
-
status: "{status, select, online {متصل} offline {غير متصل} other {غير معروف}}",
|
|
261
|
-
cta: "اقرأ <docs>التوثيق</docs>",
|
|
262
|
-
} satisfies MessagesFor<typeof en>);
|
|
263
|
-
|
|
264
|
-
declare module "okengine" {
|
|
265
|
-
interface Register {
|
|
266
|
-
messages: typeof en;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
```typescript
|
|
272
|
-
fx.t("greeting", { name: input.name });
|
|
273
|
-
fx.t("items", { count: 3 });
|
|
274
|
-
fx.t("cta", { docs: (chunks) => `<a href="/docs">${chunks.join("")}</a>` });
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
Supported locales and the fallback come from `oke.config.ts` `i18n`.
|
|
278
|
-
`create-oke` scaffolds English and Arabic locale modules already wired this way.
|
|
279
|
-
|
|
280
|
-
Built-in `errors.*` / `oke.*` catalogs localize `fx.fail` messages and thrown
|
|
281
|
-
`OkeError` cause/fix the same way — full i18n guide:
|
|
282
|
-
[i18n](/docs/reference/i18n), [Errors](/docs/reference/errors).
|
|
304
|
+
Catalogs, ICU syntax, and `Register` augmentation live on [i18n](/docs/reference/i18n).
|
|
305
|
+
Id options: [OKID](/docs/reference/okid). Localized `fx.fail` / `OkeError` catalogs:
|
|
306
|
+
[Errors](/docs/reference/errors).
|
|
283
307
|
|
|
284
308
|
## Principals
|
|
285
309
|
|
|
@@ -302,9 +326,49 @@ to the key — see [Gate](/docs/elements/gate#api-keys).
|
|
|
302
326
|
export for existing Grafana/Datadog stacks is additive and never required.
|
|
303
327
|
</Callout>
|
|
304
328
|
|
|
329
|
+
## Troubleshooting
|
|
330
|
+
|
|
331
|
+
<Accordions>
|
|
332
|
+
|
|
333
|
+
<Accordion title="OKE1001–1007 / 1008 / 1009 undeclared effect">
|
|
334
|
+
An explicit `effects` block drifted from what `do` touches. Add the missing ledger entry (`reads`
|
|
335
|
+
· `writes` · `emits` · `sends` · `asks` · `embeds` · `secrets` · `calls` · `fetches`), or drop the
|
|
336
|
+
block so inference covers the Flow ([Errors](/docs/reference/errors)).
|
|
337
|
+
</Accordion>
|
|
338
|
+
|
|
339
|
+
<Accordion title="OKE1240 orphan emit">
|
|
340
|
+
`fx.emit` with zero subscribers and `optional: false`. Add `on(signal, …)` or declare the signal
|
|
341
|
+
`optional: true`.
|
|
342
|
+
</Accordion>
|
|
343
|
+
|
|
344
|
+
<Accordion title="OKE1250 signal schema">
|
|
345
|
+
Emit payload failed the signal's `schema`. Pass a matching payload or remove the schema.
|
|
346
|
+
</Accordion>
|
|
347
|
+
|
|
348
|
+
<Accordion title="Cross-signal fx.live / fx.deadLetters">
|
|
349
|
+
Reading another signal's tape throws **OKE1001**. Declare
|
|
350
|
+
`effects.reads: ["signal:<name>"]` for that name.
|
|
351
|
+
</Accordion>
|
|
352
|
+
|
|
353
|
+
<Accordion title="Helper fx type errors on store()">
|
|
354
|
+
Type the parameter as `Fx` from `okengine`, not a hand-rolled structural type.
|
|
355
|
+
</Accordion>
|
|
356
|
+
|
|
357
|
+
</Accordions>
|
|
358
|
+
|
|
305
359
|
## Learn more
|
|
306
360
|
|
|
307
361
|
- [Flow](/docs/elements/flow) — why `fx` is the only door
|
|
308
362
|
- [Channel](/docs/elements/channel) — `fx.send`, consent, locale chain, `{{field}}` catalogs
|
|
363
|
+
- [i18n](/docs/reference/i18n) — `fx.t`, catalogs, locale matching
|
|
309
364
|
- [Errors](/docs/reference/errors) — what `fx.fail` produces
|
|
310
365
|
- [Configuration](/docs/reference/configuration) — drivers and the `i18n` block
|
|
366
|
+
- [OKID](/docs/reference/okid) — `fx.id()` options
|
|
367
|
+
|
|
368
|
+
## Next
|
|
369
|
+
|
|
370
|
+
<Cards>
|
|
371
|
+
<Card title="Flow" description="Triggers, effects, and durability." href="/docs/elements/flow" />
|
|
372
|
+
<Card title="Errors" description="OKE codes and failure values." href="/docs/reference/errors" />
|
|
373
|
+
<Card title="Client" description="Call Flows with the same envelope." href="/docs/client" />
|
|
374
|
+
</Cards>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Reference"
|
|
3
|
-
description: "Lookup pages — config, fx,
|
|
3
|
+
description: "Lookup pages — CLI, config, fx, errors, security, and plugins."
|
|
4
4
|
icon: "BookMarked"
|
|
5
5
|
source: "docs/spec/unified-theory.md"
|
|
6
6
|
---
|
|
@@ -10,41 +10,33 @@ Dense tables and command lists. Reach for these when you already know what you a
|
|
|
10
10
|
## Pages
|
|
11
11
|
|
|
12
12
|
<Cards>
|
|
13
|
+
<Card title="CLI" description="oke and create-oke commands." href="/docs/reference/cli" />
|
|
13
14
|
<Card
|
|
14
15
|
title="Configuration"
|
|
15
16
|
description="Every option in oke.config.ts."
|
|
16
17
|
href="/docs/reference/configuration"
|
|
17
18
|
/>
|
|
18
|
-
<Card title="fx" description="The complete fx surface and effects." href="/docs/reference/fx" />
|
|
19
|
-
<Card
|
|
20
|
-
title="i18n"
|
|
21
|
-
description="ICU catalogs, fx.t, typed keys, locale matching."
|
|
22
|
-
href="/docs/reference/i18n"
|
|
23
|
-
/>
|
|
24
|
-
<Card
|
|
25
|
-
title="Client"
|
|
26
|
-
description="Typed createClient — REST, RPC, envelope helpers."
|
|
27
|
-
href="/docs/reference/client"
|
|
28
|
-
/>
|
|
29
19
|
<Card
|
|
30
20
|
title="Environment Variables"
|
|
31
21
|
description="Every variable OKE reads."
|
|
32
22
|
href="/docs/reference/environment-variables"
|
|
33
23
|
/>
|
|
24
|
+
<Card title="fx" description="The complete fx surface and effects." href="/docs/reference/fx" />
|
|
34
25
|
<Card title="Errors" description="OKE codes, denials, fixes." href="/docs/reference/errors" />
|
|
35
26
|
<Card
|
|
36
|
-
title="
|
|
37
|
-
description="
|
|
38
|
-
href="/docs/reference/
|
|
27
|
+
title="Security"
|
|
28
|
+
description="Host, Origin, planes, MCP posture."
|
|
29
|
+
href="/docs/reference/security"
|
|
39
30
|
/>
|
|
40
31
|
<Card
|
|
41
|
-
title="
|
|
42
|
-
description="
|
|
43
|
-
href="/docs/reference/
|
|
32
|
+
title="i18n"
|
|
33
|
+
description="ICU catalogs, fx.t, typed keys, locale matching."
|
|
34
|
+
href="/docs/reference/i18n"
|
|
44
35
|
/>
|
|
45
36
|
<Card
|
|
46
|
-
title="
|
|
47
|
-
description="
|
|
48
|
-
href="/docs/reference/
|
|
37
|
+
title="Plugins"
|
|
38
|
+
description="Plugin API — hooks, schemas, identity."
|
|
39
|
+
href="/docs/reference/plugins"
|
|
49
40
|
/>
|
|
41
|
+
<Card title="OKID" description="Native id generator." href="/docs/reference/okid" />
|
|
50
42
|
</Cards>
|