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
package/AGENTS.md
CHANGED
|
@@ -32,11 +32,13 @@ An element earns its place only if it has irreducible physics. New infrastructur
|
|
|
32
32
|
## Core programming vocabulary
|
|
33
33
|
|
|
34
34
|
```typescript
|
|
35
|
-
import { on, flow, signal, store, clock, gate, vault, channel, ai, plugin } from "okengine";
|
|
35
|
+
import { on, flow, call, signal, store, clock, gate, vault, channel, ai, plugin } from "okengine";
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
That is the core programming vocabulary. Everything else is derived.
|
|
39
39
|
|
|
40
|
+
**Invoke contracts** (`in` / `out` / `errors`) are authored on the exposure — `http.*(path?, { … })`, `call(name, { … })`, or `mcp.tool(name, { … })` — not on `flow()`. **Emit schemas** live on Signal / Channel templates. Flow is behavior (`do` + runtime options) only.
|
|
41
|
+
|
|
40
42
|
## Governing rule
|
|
41
43
|
|
|
42
44
|
> **Adopt, don't reinvent; bind natively; name drivers after protocols.**
|
|
@@ -68,13 +70,15 @@ Mnemonic: O·K·E = 6·5·3.
|
|
|
68
70
|
|
|
69
71
|
| Budget | Limit |
|
|
70
72
|
| --------------------- | ------- |
|
|
71
|
-
| Kernel (edge profile) | <
|
|
72
|
-
| Client runtime | <
|
|
73
|
+
| Kernel (edge profile) | < 17 kB |
|
|
74
|
+
| Client runtime | < 5 kB |
|
|
73
75
|
| Cold start on Bun | < 75 ms |
|
|
74
76
|
| p99 routing overhead | < 1 ms |
|
|
75
77
|
|
|
76
78
|
A regression fails the build. Claims we cannot measure, we do not make.
|
|
77
79
|
|
|
80
|
+
After changing `src/kernel/`, `src/client/`, `src/compiler/`, `src/validation/`, or `src/release/limits.ts` / `measure.ts`, run `bun run budgets:core` (kernel edge + client gzip) before claiming done. Do not raise the published 17 kB / 5 kB caps without a measured before/after and an Unreleased changelog note; prefer lazy-loading off the edge graph.
|
|
81
|
+
|
|
78
82
|
## Package shape
|
|
79
83
|
|
|
80
84
|
Published packages:
|
|
@@ -82,16 +86,18 @@ Published packages:
|
|
|
82
86
|
- `okengine` — framework. Subpath exports: `.`, `./client`, `./test`, `./config`, `./auth`, `./plugins`, `./drivers/*`. `"sideEffects": false`. CLI binary: `oke`.
|
|
83
87
|
- `create-oke` — scaffold CLI (`bunx create-oke@latest <name>`). Lives in `packages/create-oke` and ships Notes starters from `packages/create-oke/templates/{standard,advanced}`.
|
|
84
88
|
|
|
85
|
-
Engine: Bun `>=1.4.
|
|
89
|
+
Engine: Bun `>=1.4.2`.
|
|
86
90
|
|
|
87
91
|
## Documentation authority
|
|
88
92
|
|
|
89
|
-
| Surface
|
|
90
|
-
|
|
|
91
|
-
|
|
|
92
|
-
|
|
|
93
|
-
|
|
|
94
|
-
|
|
|
93
|
+
| Surface | Path |
|
|
94
|
+
| ------------ | ------------------------------- |
|
|
95
|
+
| Understand | `site/content/docs/understand/` |
|
|
96
|
+
| Elements | `site/content/docs/elements/` |
|
|
97
|
+
| Client | `site/content/docs/client/` |
|
|
98
|
+
| Reference | `site/content/docs/reference/` |
|
|
99
|
+
| AI Resources | `site/content/docs/ai/` |
|
|
100
|
+
| Manifest | `manifest.v1.schema.json` |
|
|
95
101
|
|
|
96
102
|
**If the documentation is silent, stop and ask.**
|
|
97
103
|
|
|
@@ -99,4 +105,6 @@ Engine: Bun `>=1.4.0`.
|
|
|
99
105
|
|
|
100
106
|
Before claiming work done: run [`.agents/skills/oke-ship`](.agents/skills/oke-ship/SKILL.md) — append notes to `changelog.md` under `## Unreleased` (never under a shipped `## v…` section), and update site docs via [`.agents/skills/oke-docs`](.agents/skills/oke-docs/SKILL.md) for any user-facing surface. Version bump is separate: `bun run bump` promotes Unreleased into the next `## vX.Y.Z`.
|
|
101
107
|
|
|
108
|
+
Do **NOT** run `bun run ci` automatically after finishing an implementation. Only run `bun run ci` when the user explicitly requests it.
|
|
109
|
+
|
|
102
110
|
Dependency bumps (one package, one `package.json`, or all): [`.agents/skills/oke-deps`](.agents/skills/oke-deps/SKILL.md).
|
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<a href="https://www.npmjs.com/package/okengine"><img alt="npm" src="https://shieldcn.dev/npm/okengine.svg?size=sm&variant=outline" /></a>
|
|
17
17
|
<a href="https://jsr.io/@omqkhafi/okengine"><img alt="JSR" src="https://shieldcn.dev/jsr/@omqkhafi/okengine.svg?size=sm&variant=outline" /></a>
|
|
18
18
|
<a href="https://opensource.org/licenses/MIT"><img alt="MIT" src="https://shieldcn.dev/npm/license/okengine.svg?size=sm&variant=outline" /></a>
|
|
19
|
-
<a href="https://bun.sh"><img alt="Bun >=1.4.
|
|
19
|
+
<a href="https://bun.sh"><img alt="Bun >=1.4.2" src="https://shieldcn.dev/badge/Bun-%3E%3D1.4.2.svg?logo=bun&size=sm&variant=outline" /></a>
|
|
20
20
|
<a href="https://github.com/omqkhafi/okengine/actions"><img alt="CI" src="https://shieldcn.dev/github/ci/omqkhafi/okengine.svg?size=sm&variant=outline" /></a>
|
|
21
21
|
<a href="https://github.com/omqkhafi/okengine/commits"><img alt="last commit" src="https://shieldcn.dev/github/last-commit/omqkhafi/okengine.svg?size=sm&variant=outline" /></a>
|
|
22
22
|
</p>
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
|
|
40
40
|
## Install
|
|
41
41
|
|
|
42
|
-
Requires [Bun](https://bun.sh) `>=1.4.
|
|
42
|
+
Requires [Bun](https://bun.sh) `>=1.4.2`.
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
45
|
bunx create-oke@latest my-app # scaffold (recommended)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "okengine",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "One law. Eight elements. One contract. The backend model stays small; operational surfaces are derived from it instead of maintained separately.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -127,6 +127,7 @@
|
|
|
127
127
|
"bench": "bun test ./src/runtime/cold-start.bench.ts src/client/budget.test.ts src/console/budget.test.ts src/kernel/budget.test.ts src/kernel/routing-budget.test.ts src/runs/bench.test.ts src/okid.bench.test.ts",
|
|
128
128
|
"bench:load": "OKE_BENCH=1 bun test ./src/bench/*.bench.ts --timeout 600000 --pass-with-no-tests",
|
|
129
129
|
"budgets": "bun src/release/publish.ts",
|
|
130
|
+
"budgets:core": "bun test src/kernel/budget.test.ts src/client/budget.test.ts",
|
|
130
131
|
"gate": "PUBLISH_GATE=1 bun test src/cli/doc-staleness.test.ts src/cli/competitor-mention-removal.test.ts src/drivers/vault-driver-removal.test.ts src/kernel/errors.registry.test.ts src/upgrade/codemods.test.ts scripts/publish.gate.test.ts",
|
|
131
132
|
"dev": "bun run --cwd site dev",
|
|
132
133
|
"site:build": "bun run --cwd site build",
|
|
@@ -138,39 +139,40 @@
|
|
|
138
139
|
"postinstall": "bun run --cwd examples/keel prepare"
|
|
139
140
|
},
|
|
140
141
|
"dependencies": {
|
|
141
|
-
"@clack/prompts": "^1.
|
|
142
|
-
"@tanstack/react-virtual": "^3.14.
|
|
143
|
-
"intl-messageformat": "^11.2.
|
|
144
|
-
"
|
|
142
|
+
"@clack/prompts": "^1.8.0",
|
|
143
|
+
"@tanstack/react-virtual": "^3.14.11",
|
|
144
|
+
"intl-messageformat": "^11.2.14",
|
|
145
|
+
"oxc-parser": "^0.149.0",
|
|
146
|
+
"sently": "1.2.2"
|
|
145
147
|
},
|
|
146
148
|
"devDependencies": {
|
|
147
|
-
"@base-ui/react": "^1.
|
|
148
|
-
"@codemirror/commands": "^6.
|
|
149
|
+
"@base-ui/react": "^1.8.0",
|
|
150
|
+
"@codemirror/commands": "^6.11.0",
|
|
149
151
|
"@codemirror/lang-json": "^6.0.2",
|
|
150
|
-
"@codemirror/state": "^6.7.
|
|
152
|
+
"@codemirror/state": "^6.7.4",
|
|
151
153
|
"@codemirror/theme-one-dark": "^6.1.3",
|
|
152
|
-
"@codemirror/view": "^6.43.
|
|
154
|
+
"@codemirror/view": "^6.43.11",
|
|
153
155
|
"@dagrejs/dagre": "^3.1.1",
|
|
154
|
-
"@duckdb/node-api": "^1.5.5-r.
|
|
155
|
-
"@electric-sql/pglite": "^0.5.
|
|
156
|
-
"@electric-sql/pglite-pgvector": "^0.0.
|
|
157
|
-
"@hugeicons/core-free-icons": "^4.2
|
|
158
|
-
"@hugeicons/react": "^1.1.
|
|
156
|
+
"@duckdb/node-api": "^1.5.5-r.4",
|
|
157
|
+
"@electric-sql/pglite": "^0.5.8",
|
|
158
|
+
"@electric-sql/pglite-pgvector": "^0.0.9",
|
|
159
|
+
"@hugeicons/core-free-icons": "^4.3.2",
|
|
160
|
+
"@hugeicons/react": "^1.1.10",
|
|
159
161
|
"@number-flow/react": "^0.6.2",
|
|
160
|
-
"@oxc-project/types": "^0.
|
|
161
|
-
"@playwright/test": "^1.
|
|
162
|
+
"@oxc-project/types": "^0.149.0",
|
|
163
|
+
"@playwright/test": "^1.63.0",
|
|
162
164
|
"@sinclair/typebox": "^0.34.52",
|
|
163
165
|
"@tailwindcss/vite": "^4.3.3",
|
|
164
|
-
"@tanstack/react-form": "^1.
|
|
166
|
+
"@tanstack/react-form": "^1.33.5",
|
|
165
167
|
"@tanstack/react-hotkeys": "^0.10.0",
|
|
166
|
-
"@tanstack/react-query": "^5.
|
|
167
|
-
"@tanstack/react-router": "^1.170.
|
|
168
|
-
"@tanstack/react-table": "^
|
|
168
|
+
"@tanstack/react-query": "^5.102.8",
|
|
169
|
+
"@tanstack/react-router": "^1.170.34",
|
|
170
|
+
"@tanstack/react-table": "^9.2.4",
|
|
169
171
|
"@types/bun": "latest",
|
|
170
172
|
"@types/d3-array": "^3.2.2",
|
|
171
|
-
"@types/d3-shape": "^3.
|
|
172
|
-
"@types/react": "^19.
|
|
173
|
-
"@types/react-dom": "^19.
|
|
173
|
+
"@types/d3-shape": "^3.2.0",
|
|
174
|
+
"@types/react": "^19.3.0",
|
|
175
|
+
"@types/react-dom": "^19.3.0",
|
|
174
176
|
"@visx/curve": "4.0.1-alpha.0",
|
|
175
177
|
"@visx/event": "4.0.1-alpha.0",
|
|
176
178
|
"@visx/gradient": "4.0.1-alpha.0",
|
|
@@ -178,43 +180,42 @@
|
|
|
178
180
|
"@visx/responsive": "4.0.1-alpha.0",
|
|
179
181
|
"@visx/scale": "4.0.1-alpha.0",
|
|
180
182
|
"@visx/shape": "4.0.1-alpha.0",
|
|
181
|
-
"@vitejs/plugin-react": "^6.
|
|
182
|
-
"@xyflow/react": "^12.
|
|
183
|
+
"@vitejs/plugin-react": "^6.1.1",
|
|
184
|
+
"@xyflow/react": "^12.11.6",
|
|
183
185
|
"ajv": "^8.20.0",
|
|
184
186
|
"ajv-formats": "^3.0.1",
|
|
185
187
|
"arktype": "^2.2.3",
|
|
186
|
-
"axe-core": "^4.
|
|
188
|
+
"axe-core": "^4.13.0",
|
|
187
189
|
"class-variance-authority": "^0.7.1",
|
|
188
190
|
"clsx": "^2.1.1",
|
|
189
191
|
"d3-array": "^3.2.4",
|
|
190
192
|
"d3-shape": "^3.2.0",
|
|
191
|
-
"date-fns": "^4.
|
|
193
|
+
"date-fns": "^4.4.0",
|
|
192
194
|
"drizzle-kit": "1.0.0-rc.5-ab785fc",
|
|
193
195
|
"drizzle-orm": "1.0.0-rc.5-169397b",
|
|
194
196
|
"drizzle-seed": "^0.3.1",
|
|
195
197
|
"gflows": "^1.2.1",
|
|
196
|
-
"happy-dom": "^20.
|
|
198
|
+
"happy-dom": "^20.14.3",
|
|
197
199
|
"hast-util-to-jsx-runtime": "^2.3.6",
|
|
198
|
-
"mermaid": "^11.
|
|
199
|
-
"motion": "^13.
|
|
200
|
-
"nuqs": "^2.
|
|
201
|
-
"
|
|
202
|
-
"
|
|
203
|
-
"oxlint": "^1.76.0",
|
|
200
|
+
"mermaid": "^11.17.2",
|
|
201
|
+
"motion": "^13.2.0",
|
|
202
|
+
"nuqs": "^2.10.1",
|
|
203
|
+
"oxfmt": "^0.67.0",
|
|
204
|
+
"oxlint": "^1.82.0",
|
|
204
205
|
"oxlint-tsgolint": "^7.0.2001",
|
|
205
|
-
"playwright": "^1.
|
|
206
|
-
"react": "^19.
|
|
207
|
-
"react-dom": "^19.
|
|
208
|
-
"react-resizable-panels": "^4.12.
|
|
209
|
-
"shadcn": "^
|
|
210
|
-
"shiki": "^
|
|
211
|
-
"tailwind-merge": "^3.
|
|
206
|
+
"playwright": "^1.63.0",
|
|
207
|
+
"react": "^19.3.0",
|
|
208
|
+
"react-dom": "^19.3.0",
|
|
209
|
+
"react-resizable-panels": "^4.12.4",
|
|
210
|
+
"shadcn": "^4.21.0",
|
|
211
|
+
"shiki": "^4.4.3",
|
|
212
|
+
"tailwind-merge": "^3.6.0",
|
|
212
213
|
"tailwindcss": "^4.3.3",
|
|
213
214
|
"tw-animate-css": "^1.4.0",
|
|
214
215
|
"typescript": "^7.0.2",
|
|
215
|
-
"valibot": "^1.
|
|
216
|
-
"vite": "^8.
|
|
217
|
-
"zod": "^4.
|
|
216
|
+
"valibot": "^1.5.0",
|
|
217
|
+
"vite": "^8.3.0",
|
|
218
|
+
"zod": "^4.6.1"
|
|
218
219
|
},
|
|
219
220
|
"peerDependencies": {
|
|
220
221
|
"@aws-sdk/client-kms": ">=3.0.0",
|
|
@@ -230,7 +231,7 @@
|
|
|
230
231
|
"drizzle-kit": ">=1.0.0-rc.0",
|
|
231
232
|
"drizzle-orm": ">=1.0.0-rc.0",
|
|
232
233
|
"drizzle-seed": ">=0.3.0",
|
|
233
|
-
"
|
|
234
|
+
"react": ">=18.0.0",
|
|
234
235
|
"zod": ">=3.23.0"
|
|
235
236
|
},
|
|
236
237
|
"peerDependenciesMeta": {
|
|
@@ -264,6 +265,9 @@
|
|
|
264
265
|
"ajv-formats": {
|
|
265
266
|
"optional": true
|
|
266
267
|
},
|
|
268
|
+
"react": {
|
|
269
|
+
"optional": true
|
|
270
|
+
},
|
|
267
271
|
"drizzle-kit": {
|
|
268
272
|
"optional": true
|
|
269
273
|
},
|
|
@@ -273,18 +277,15 @@
|
|
|
273
277
|
"drizzle-seed": {
|
|
274
278
|
"optional": true
|
|
275
279
|
},
|
|
276
|
-
"oxc-parser": {
|
|
277
|
-
"optional": true
|
|
278
|
-
},
|
|
279
280
|
"zod": {
|
|
280
281
|
"optional": true
|
|
281
282
|
}
|
|
282
283
|
},
|
|
283
284
|
"optionalDependencies": {
|
|
284
285
|
"ink": "^6.0.0",
|
|
285
|
-
"react": "^19.
|
|
286
|
+
"react": "^19.3.0"
|
|
286
287
|
},
|
|
287
288
|
"engines": {
|
|
288
|
-
"bun": ">=1.4.
|
|
289
|
+
"bun": ">=1.4.2"
|
|
289
290
|
}
|
|
290
291
|
}
|
|
@@ -40,7 +40,7 @@ The homepage **Onboard AI** button copies a one-line prompt that points an agent
|
|
|
40
40
|
HTML docs pages advertise `rel="alternate"` `type="text/markdown"` to the twin.
|
|
41
41
|
`Accept: text/markdown` on the same URL returns that twin and sets `Vary: Accept`.
|
|
42
42
|
|
|
43
|
-
`/llms.txt` opens with **When to use this** —
|
|
43
|
+
`/llms.txt` opens with **When to use this** — The Problem, The Model, AGENTS.md,
|
|
44
44
|
MCP, CLI, errors, npm, GitHub — then the curated map.
|
|
45
45
|
|
|
46
46
|
Crawlers that honor `robots.txt` are allowed; `/sitemap.xml` lists the handbook and the machine entry points.
|
|
@@ -18,6 +18,9 @@ Tools alone don't make a good operator — an agent also needs to know the _voca
|
|
|
18
18
|
| **Deps skill** | `.agents/skills/oke-deps/` | Updating `package.json` dependencies | Scoped bumps, Bun install, pins (Drizzle RC, fumadocs alias, …) |
|
|
19
19
|
| **Images skill** | `.agents/skills/oke-images/` | Updating Compose image pins | Registry probe, pin style, catalog + recipes + Keel + docs lockstep |
|
|
20
20
|
|
|
21
|
+
Contributor-only skills in the same tree (not required for app authors):
|
|
22
|
+
`oke-ci`, `oke-docs-update`, `oke-docs-visuals`, `oke-console-style`.
|
|
23
|
+
|
|
21
24
|
## AGENTS.md — the root contract
|
|
22
25
|
|
|
23
26
|
Every OKE app's repo carries an `AGENTS.md` that agents (Cursor, Claude Code, and peers) read at session start. It is deliberately short and absolute: every backend behavior is a Flow (`on(Trigger) → Effects`), there are eight elements bound to one contract, all world access goes through `fx`, drivers are named after protocols, and the ports/budgets are fixed. Its closing rule is the one that keeps agents honest: **if the documentation is silent, stop and ask** — never invent the API.
|
|
@@ -43,7 +46,7 @@ Contracts teach the _vocabulary_; [MCP](/docs/ai/mcp) grants the _hands_. An age
|
|
|
43
46
|
## Learn more
|
|
44
47
|
|
|
45
48
|
- [MCP](/docs/ai/mcp) — the runtime surface these contracts pair with
|
|
46
|
-
- [
|
|
49
|
+
- [The Model](/docs/understand/the-model) — the eight elements in human terms
|
|
47
50
|
- [llms.txt](/docs/ai/llms-txt) — `/llms.txt`, `/llms.json`, `/llms/agents`, per-page markdown
|
|
48
51
|
|
|
49
52
|
## Next
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Try It"
|
|
3
|
+
description: "From an empty folder to a Flow running in the Console — one sitting, minimal detour."
|
|
4
|
+
icon: "Terminal"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What you need
|
|
8
|
+
|
|
9
|
+
Bun ≥ 1.4.2, and Docker running. `oke dev` starts everything else — Postgres, Redis, mail — for you.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
bun --version
|
|
13
|
+
docker info
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Scaffold and run
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
bunx create-oke@latest my-app
|
|
20
|
+
cd my-app
|
|
21
|
+
oke dev
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Open the Console at the address printed in the terminal and claim it with the code shown there. The Flows listed weren't configured anywhere — they were derived from the code you just scaffolded.
|
|
25
|
+
|
|
26
|
+
## Call it
|
|
27
|
+
|
|
28
|
+
The starter ships a health Flow. Call it from a typed client, the same way your frontend would:
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import { createClient } from "okengine/client";
|
|
32
|
+
import type { App } from "./app";
|
|
33
|
+
|
|
34
|
+
const api = createClient<App>("http://localhost:6530");
|
|
35
|
+
const { data, error } = await api.main.health({});
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
`data` and `error` are inferred straight from the Flow you just ran — not from a separate schema you maintain by hand.
|
|
39
|
+
|
|
40
|
+
## Prove it, don't just believe it
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
test("boots — health flow", async () => {
|
|
44
|
+
const t = await createTestApp(app);
|
|
45
|
+
const { data } = await t.api.main.health({});
|
|
46
|
+
expect(data).toEqual({ ok: true });
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
bun test
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
No mocked HTTP server, no real clock, no live mail provider. `createTestApp` swaps every driver behind `fx` for a deterministic one — because effects were never allowed to happen any other way.
|
|
55
|
+
|
|
56
|
+
## Where this goes next
|
|
57
|
+
|
|
58
|
+
If this went smoothly, the next page is the honest one: what's solid today, what's still moving, and who this is actually ready for right now.
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Auth"
|
|
3
|
+
description: "createClient({ auth }) → api.auth — cookie-first, authorize/Can UI-only, Gate remains real authz."
|
|
4
|
+
icon: "Lock"
|
|
5
|
+
source: "docs/spec/unified-theory.md"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`createClient(url, { auth })` attaches `api.auth` — session orchestration over the same `/auth/*`
|
|
9
|
+
Flows. Prefer that one call. `createAuthClient` + `bind` stays as a compose escape hatch.
|
|
10
|
+
|
|
11
|
+
For storefronts and SPAs attaching identity to typed calls.
|
|
12
|
+
|
|
13
|
+
<Callout title="The one rule">
|
|
14
|
+
Gate on Flows is real authorization. `authorize` / `hasScope` / `Can` are **UI-only**. Cookie mode
|
|
15
|
+
needs the `csrf` plugin (server soft-requires it when `gate.auth.cookies.enabled`); never persist
|
|
16
|
+
tokens to Storage when cookies own the session.
|
|
17
|
+
</Callout>
|
|
18
|
+
|
|
19
|
+
## Smallest Example
|
|
20
|
+
|
|
21
|
+
<Steps>
|
|
22
|
+
|
|
23
|
+
<Step>
|
|
24
|
+
### One `createClient` with session auth
|
|
25
|
+
|
|
26
|
+
```typescript title="web/src/api.ts"
|
|
27
|
+
import { createClient } from "okengine/client";
|
|
28
|
+
import { vault } from "okengine/vault";
|
|
29
|
+
import { app } from "../../src/app";
|
|
30
|
+
|
|
31
|
+
export const api = createClient(app, vault.env("PUBLIC_API_URL") ?? "", {
|
|
32
|
+
auth: { mode: "cookie", csrfConfigured: true },
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`api.auth` is an `AuthClient`. Unit Flows remain reachable (`api.auth.me`, …) under the same
|
|
37
|
+
namespace.
|
|
38
|
+
|
|
39
|
+
</Step>
|
|
40
|
+
|
|
41
|
+
<Step>
|
|
42
|
+
### Sign in and authorize chrome
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
const result = await api.auth.signIn.email({ email: "alex@acme.co", password });
|
|
46
|
+
if (!result.ok) {
|
|
47
|
+
if (result.twoFactor) {
|
|
48
|
+
await api.auth.completeChallenge({
|
|
49
|
+
challengeId: result.twoFactor.challengeId,
|
|
50
|
+
code: totp,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const gate = api.auth.authorize({ all: ["orders:write"] });
|
|
57
|
+
if (gate.status === "allowed") showFulfillment();
|
|
58
|
+
await api.auth.signOut();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
</Step>
|
|
62
|
+
|
|
63
|
+
</Steps>
|
|
64
|
+
|
|
65
|
+
## Progressive Patterns
|
|
66
|
+
|
|
67
|
+
<Tabs items={["Authorize", "Cookie mode", "SSR", "Methods", "Escape hatch"]}>
|
|
68
|
+
|
|
69
|
+
<Tab value="Authorize">
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
const gate = api.auth.authorize({ all: ["orders:write"] });
|
|
73
|
+
// or: api.auth.authorize({ any: ["orders:write", "admin"] })
|
|
74
|
+
|
|
75
|
+
if (gate.status === "unauthenticated") redirectToSignIn();
|
|
76
|
+
if (gate.status === "loading") return;
|
|
77
|
+
if (gate.status === "denied") showMissing(gate.missing);
|
|
78
|
+
// gate.status === "allowed"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
React: `<Can auth={api.auth} all={["orders:write"]} fallback={<Denied />}>`. Prefer
|
|
82
|
+
`authorize` / `Can` over bare `hasScope`. On server `Forbidden`, use `isForbidden` /
|
|
83
|
+
`forbiddenScopes` and refresh `getSession()` if scopes look stale.
|
|
84
|
+
|
|
85
|
+
</Tab>
|
|
86
|
+
|
|
87
|
+
<Tab value="Cookie mode">
|
|
88
|
+
|
|
89
|
+
When `gate.auth.cookies.enabled`, prefer HttpOnly cookies:
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
export const api = createClient(app, base, {
|
|
93
|
+
auth: { mode: "cookie", csrfConfigured: true },
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Install `csrf({ allowNoHeader: false })`. Cross-origin also needs
|
|
98
|
+
`cors({ origin: [...], credentials: true })`. Prod boots **refuse** without `csrf` when cookies
|
|
99
|
+
are on; dev/test warn.
|
|
100
|
+
|
|
101
|
+
</Tab>
|
|
102
|
+
|
|
103
|
+
<Tab value="SSR">
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
import { createClient } from "okengine/client";
|
|
107
|
+
import { tokenFromRequestCookies, createServerClient } from "okengine/client/auth";
|
|
108
|
+
|
|
109
|
+
// Explicit
|
|
110
|
+
const api = createClient(base, {
|
|
111
|
+
credentials: "include",
|
|
112
|
+
auth: {
|
|
113
|
+
mode: "cookie",
|
|
114
|
+
getToken: () => tokenFromRequestCookies(req),
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Or the thin wrapper (same createClient)
|
|
119
|
+
const api2 = createServerClient(req, base, { $routes });
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
</Tab>
|
|
123
|
+
|
|
124
|
+
<Tab value="Methods">
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
await api.auth.signIn.social({ provider: "google" });
|
|
128
|
+
await api.auth.signIn.passkey({ email });
|
|
129
|
+
await api.auth.signIn.magicLink.request({ email });
|
|
130
|
+
await api.auth.signIn.otp.verify({ email, code });
|
|
131
|
+
await api.auth.signIn.anonymous();
|
|
132
|
+
await api.auth.signUp.email({ email, password, name });
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Helpers call existing plugin Flows only — PKCE / WebAuthn UV stay server-side.
|
|
136
|
+
|
|
137
|
+
</Tab>
|
|
138
|
+
|
|
139
|
+
<Tab value="Escape hatch">
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
import { createClient } from "okengine/client";
|
|
143
|
+
import { createAuthClient } from "okengine/client/auth";
|
|
144
|
+
|
|
145
|
+
const shell = createClient(app, base);
|
|
146
|
+
const auth = createAuthClient(shell, { mode: "bearer", persist: "memory" });
|
|
147
|
+
const api = createClient(app, base, { ...auth.clientOptions });
|
|
148
|
+
auth.bind(api);
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
</Tab>
|
|
152
|
+
|
|
153
|
+
</Tabs>
|
|
154
|
+
|
|
155
|
+
## Helpers
|
|
156
|
+
|
|
157
|
+
| Helper | Package | Role |
|
|
158
|
+
| ------------------------------------------------ | ----------------------- | -------------------------------- |
|
|
159
|
+
| `createClient({ auth })` | `okengine/client` | Happy path — attaches `api.auth` |
|
|
160
|
+
| `createAuthClient` | `okengine/client/auth` | Compose / bind escape hatch |
|
|
161
|
+
| `tokenFromRequestCookies` / `createServerClient` | same | SSR cookie → token |
|
|
162
|
+
| `authorize` / `hasScope` / `can` | on `AuthClient` | UI-only chrome |
|
|
163
|
+
| `isUnauthorized` / `isCsrf` / `forbiddenScopes` | same | Envelope narrowers |
|
|
164
|
+
| `useSession` / `useAuthorize` / `Can` | `okengine/client-react` | React session + chrome |
|
|
165
|
+
|
|
166
|
+
## Denial codes
|
|
167
|
+
|
|
168
|
+
| Code | HTTP | Typical fix |
|
|
169
|
+
| -------------- | ---- | ---------------------------------------------- |
|
|
170
|
+
| `Unauthorized` | 401 | Sign in or refresh; re-login if still denied |
|
|
171
|
+
| `Forbidden` | 403 | Wrong scopes / CSRF — read `error.data.reason` |
|
|
172
|
+
| `RateLimited` | 429 | Wait `retryAfterMs` |
|
|
173
|
+
|
|
174
|
+
Also see [CORS](/docs/plugins/cors) and [CSRF](/docs/plugins/csrf). Advanced create-oke starter
|
|
175
|
+
demos cookie + passkey + `<Can>`.
|
|
176
|
+
|
|
177
|
+
## Troubleshooting
|
|
178
|
+
|
|
179
|
+
<Accordions>
|
|
180
|
+
|
|
181
|
+
<Accordion title="Cookie mode warns about CSRF / prod refuses boot">
|
|
182
|
+
Plug `csrf({ allowNoHeader: false })` when `gate.auth.cookies.enabled`. Set
|
|
183
|
+
`csrfConfigured: true` on the client only after the plugin is installed.
|
|
184
|
+
</Accordion>
|
|
185
|
+
|
|
186
|
+
<Accordion title="authorize allowed but Flow returns Forbidden">
|
|
187
|
+
Expected — client authorize is UI-only. Add `gate.scope` / `gate.policy` on the Flow.
|
|
188
|
+
</Accordion>
|
|
189
|
+
|
|
190
|
+
<Accordion title="localStorage warning">
|
|
191
|
+
Prefer cookie mode or memory / `sessionStorage`. XSS can read Storage until family revoke.
|
|
192
|
+
</Accordion>
|
|
193
|
+
|
|
194
|
+
</Accordions>
|
|
195
|
+
|
|
196
|
+
## Learn more
|
|
197
|
+
|
|
198
|
+
- [Calling](/docs/client/calling) — envelopes, binary `{ response: "blob" }`, REST
|
|
199
|
+
- [React](/docs/client/react) — `useSession` / `Can` / `useAuthorize`
|
|
200
|
+
- [Gate · Auth](/docs/elements/gate/auth) — server cookies and scopes
|
|
201
|
+
|
|
202
|
+
## Next
|
|
203
|
+
|
|
204
|
+
<Cards>
|
|
205
|
+
<Card title="Live" href="/docs/client/live" />
|
|
206
|
+
<Card title="React" href="/docs/client/react" />
|
|
207
|
+
<Card title="Gate Auth" href="/docs/elements/gate/auth" />
|
|
208
|
+
</Cards>
|