okengine 0.18.4 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +18 -10
- package/README.md +2 -2
- package/package.json +51 -50
- package/site/content/docs/ai/index.mdx +25 -6
- 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 +52 -11
- 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 +78 -30
- package/site/content/docs/meta.json +11 -8
- 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/competitor-mention-removal.test.ts +1 -1
- 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 +258 -44
- 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 -132
- 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 -162
- 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-De7Lc2JC.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-RGy7VEA_.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-Ck88Jmv8.css +0 -2
- package/src/console/ui-next/dist/assets/index-_rgpdVzo.js +0 -66
- package/src/console/ui-next/dist/assets/link-BX6Vqztd.js +0 -1
- package/src/console/ui-next/dist/assets/observability-page-Ds6pcnh-.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-4rHOePuE.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-DISPgxLM.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/src/kernel/triggers.ts
CHANGED
|
@@ -6,11 +6,14 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { flattenGateArgs, GATE_PUBLIC_NAME, type GateAllDecl } from "../elements/gate/flatten.ts";
|
|
9
|
+
import type { ClockDecl } from "../elements/clock/declare.ts";
|
|
10
|
+
import type { BoundaryContract } from "./boundary-contract.ts";
|
|
9
11
|
import type { NamedRef } from "./fx.ts";
|
|
10
12
|
import { HTTP_PATH_PENDING, type HttpPathPending } from "./http-path-pending.ts";
|
|
11
13
|
import { lazyRequire } from "./lazy-require.ts";
|
|
12
14
|
|
|
13
15
|
export { HTTP_PATH_PENDING, isPendingHttpPath, type HttpPathPending } from "./http-path-pending.ts";
|
|
16
|
+
export type { BoundaryContract } from "./boundary-contract.ts";
|
|
14
17
|
|
|
15
18
|
/** HTTP methods accepted by {@link http}. */
|
|
16
19
|
export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS" | "HEAD" | "QUERY";
|
|
@@ -27,15 +30,25 @@ export type GateAttach<T> = (...gates: GateArg[]) => T;
|
|
|
27
30
|
/**
|
|
28
31
|
* HTTP trigger value. Method and path are literal type parameters so
|
|
29
32
|
* `typeof app` / the client can derive REST wire shape from the declaration.
|
|
33
|
+
* `C` preserves the invoke-contract bag for {@link on} → `$routes` typing.
|
|
30
34
|
*
|
|
31
35
|
* @typeParam M - HTTP method literal
|
|
32
36
|
* @typeParam P - Path template literal (`/notes/:id`)
|
|
37
|
+
* @typeParam C - Invoke contract bag (or `undefined` when omitted)
|
|
33
38
|
*/
|
|
34
|
-
export interface HttpTrigger<
|
|
39
|
+
export interface HttpTrigger<
|
|
40
|
+
M extends HttpMethod = HttpMethod,
|
|
41
|
+
P extends string = string,
|
|
42
|
+
// Default `any` so `Trigger` accepts contracted + contractless HTTP triggers;
|
|
43
|
+
// verb overloads still pin `C` to `undefined` or the authored bag.
|
|
44
|
+
C extends BoundaryContract | undefined = any,
|
|
45
|
+
> {
|
|
35
46
|
readonly kind: "http";
|
|
36
47
|
readonly method: M;
|
|
37
48
|
readonly path: P;
|
|
38
49
|
readonly gates: readonly GateRef[];
|
|
50
|
+
/** Invoke contract authored on the verb options bag. */
|
|
51
|
+
readonly contract?: C extends undefined ? never : C;
|
|
39
52
|
/**
|
|
40
53
|
* Signal this GET exposes as a live SSE feed (`undefined` when not a live route).
|
|
41
54
|
*/
|
|
@@ -43,17 +56,17 @@ export interface HttpTrigger<M extends HttpMethod = HttpMethod, P extends string
|
|
|
43
56
|
/**
|
|
44
57
|
* Attach gates (registration order). `gate.all` handles and arrays flatten.
|
|
45
58
|
*/
|
|
46
|
-
readonly gate: GateAttach<HttpTrigger<M, P>>;
|
|
59
|
+
readonly gate: GateAttach<HttpTrigger<M, P, C>>;
|
|
47
60
|
/**
|
|
48
61
|
* Attach the unauthenticated public sentinel.
|
|
49
62
|
*/
|
|
50
|
-
public(): HttpTrigger<M, P>;
|
|
63
|
+
public(): HttpTrigger<M, P, C>;
|
|
51
64
|
/**
|
|
52
65
|
* Expose a `delivery: "live"` signal as SSE on this GET.
|
|
53
66
|
*
|
|
54
67
|
* @param signal - Live signal handle
|
|
55
68
|
*/
|
|
56
|
-
live(signal: SignalSource): LiveHttpTrigger<M, P>;
|
|
69
|
+
live(signal: SignalSource): LiveHttpTrigger<M, P, C>;
|
|
57
70
|
/**
|
|
58
71
|
* Declare a live query surface over a table on this GET: same CDC +
|
|
59
72
|
* per-subscriber RLS classification physics as
|
|
@@ -62,7 +75,7 @@ export interface HttpTrigger<M extends HttpMethod = HttpMethod, P extends string
|
|
|
62
75
|
*
|
|
63
76
|
* @param table - `store.schema.table` (or drizzle/table handle) binding
|
|
64
77
|
*/
|
|
65
|
-
live(table: object): LiveHttpTrigger<M, P>;
|
|
78
|
+
live(table: object): LiveHttpTrigger<M, P, C>;
|
|
66
79
|
}
|
|
67
80
|
|
|
68
81
|
/**
|
|
@@ -73,14 +86,23 @@ export interface HttpTrigger<M extends HttpMethod = HttpMethod, P extends string
|
|
|
73
86
|
*
|
|
74
87
|
* @typeParam M - HTTP method literal
|
|
75
88
|
* @typeParam P - Path template literal
|
|
89
|
+
* @typeParam C - Invoke contract bag (or `undefined` when omitted)
|
|
76
90
|
*/
|
|
77
91
|
export interface LiveHttpTrigger<
|
|
78
92
|
M extends HttpMethod = "GET",
|
|
79
93
|
P extends string = string,
|
|
80
|
-
|
|
94
|
+
C extends BoundaryContract | undefined = any,
|
|
95
|
+
> extends HttpTrigger<M, P, C> {
|
|
81
96
|
readonly liveSignal: SignalSource;
|
|
82
|
-
readonly gate: GateAttach<LiveHttpTrigger<M, P>>;
|
|
83
|
-
public(): LiveHttpTrigger<M, P>;
|
|
97
|
+
readonly gate: GateAttach<LiveHttpTrigger<M, P, C>>;
|
|
98
|
+
public(): LiveHttpTrigger<M, P, C>;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Clock / cron trigger (`clock("daily", { every: "1d" })`). */
|
|
102
|
+
export interface ClockTrigger {
|
|
103
|
+
readonly kind: "clock";
|
|
104
|
+
readonly name: string;
|
|
105
|
+
readonly clock?: ClockDecl;
|
|
84
106
|
}
|
|
85
107
|
|
|
86
108
|
/** Clock / interval trigger (`every("1h")`). */
|
|
@@ -124,17 +146,20 @@ export interface InternalTrigger {
|
|
|
124
146
|
* Gates are required (typically `gate.auth` + `gate.scope(...)`) exactly
|
|
125
147
|
* like sensitive HTTP routes.
|
|
126
148
|
*/
|
|
127
|
-
export interface McpToolTrigger {
|
|
149
|
+
export interface McpToolTrigger<C extends BoundaryContract | undefined = any> {
|
|
128
150
|
readonly kind: "mcp";
|
|
129
151
|
/** Tool name exposed in MCP `tools/list`. */
|
|
130
152
|
readonly name: string;
|
|
131
153
|
readonly gates: readonly GateRef[];
|
|
132
|
-
|
|
154
|
+
/** Invoke contract authored on `mcp.tool(name, bag)`. */
|
|
155
|
+
readonly contract?: C extends undefined ? never : C;
|
|
156
|
+
readonly gate: GateAttach<McpToolTrigger<C>>;
|
|
133
157
|
}
|
|
134
158
|
|
|
135
159
|
/** Discriminated union of all trigger kinds. */
|
|
136
160
|
export type Trigger =
|
|
137
161
|
| HttpTrigger
|
|
162
|
+
| ClockTrigger
|
|
138
163
|
| EveryTrigger
|
|
139
164
|
| SignalAsTrigger
|
|
140
165
|
| CdcTrigger
|
|
@@ -164,34 +189,54 @@ export function createGateAttach<T>(
|
|
|
164
189
|
* @param path - Route path
|
|
165
190
|
* @param gates - Attached gate refs
|
|
166
191
|
* @param liveSignal - Live signal when `.live(signal)` was applied
|
|
192
|
+
* @param contract - Invoke contract bag from the verb options
|
|
167
193
|
*/
|
|
168
|
-
export function createHttpTrigger<
|
|
194
|
+
export function createHttpTrigger<
|
|
195
|
+
M extends HttpMethod,
|
|
196
|
+
P extends string,
|
|
197
|
+
C extends BoundaryContract | undefined = undefined,
|
|
198
|
+
>(
|
|
169
199
|
method: M,
|
|
170
200
|
path: P,
|
|
171
201
|
gates: readonly GateRef[],
|
|
172
202
|
liveSignal: SignalSource,
|
|
173
|
-
|
|
174
|
-
|
|
203
|
+
contract?: C,
|
|
204
|
+
): LiveHttpTrigger<M, P, C>;
|
|
205
|
+
export function createHttpTrigger<
|
|
206
|
+
M extends HttpMethod,
|
|
207
|
+
P extends string,
|
|
208
|
+
C extends BoundaryContract | undefined = undefined,
|
|
209
|
+
>(
|
|
175
210
|
method: M,
|
|
176
211
|
path: P,
|
|
177
212
|
gates?: readonly GateRef[],
|
|
178
213
|
liveSignal?: SignalSource,
|
|
179
|
-
|
|
180
|
-
|
|
214
|
+
contract?: C,
|
|
215
|
+
): HttpTrigger<M, P, C>;
|
|
216
|
+
export function createHttpTrigger<
|
|
217
|
+
M extends HttpMethod,
|
|
218
|
+
P extends string,
|
|
219
|
+
C extends BoundaryContract | undefined = undefined,
|
|
220
|
+
>(
|
|
181
221
|
method: M,
|
|
182
222
|
path: P,
|
|
183
223
|
gates: readonly GateRef[] = [],
|
|
184
224
|
liveSignal?: SignalSource,
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
225
|
+
contract?: C,
|
|
226
|
+
): HttpTrigger<M, P, C> {
|
|
227
|
+
const trigger = {
|
|
228
|
+
kind: "http" as const,
|
|
188
229
|
method,
|
|
189
230
|
path,
|
|
190
231
|
gates,
|
|
232
|
+
...(contract !== undefined ? { contract } : {}),
|
|
191
233
|
...(liveSignal !== undefined ? { liveSignal } : {}),
|
|
192
|
-
gate: createGateAttach(
|
|
234
|
+
gate: createGateAttach(
|
|
235
|
+
(next) => createHttpTrigger(method, path, next, liveSignal, contract),
|
|
236
|
+
gates,
|
|
237
|
+
),
|
|
193
238
|
public() {
|
|
194
|
-
return createHttpTrigger(method, path, [...gates, GATE_PUBLIC_NAME], liveSignal);
|
|
239
|
+
return createHttpTrigger(method, path, [...gates, GATE_PUBLIC_NAME], liveSignal, contract);
|
|
195
240
|
},
|
|
196
241
|
live(source: SignalSource | object) {
|
|
197
242
|
if (typeof source === "object" && !("name" in source)) {
|
|
@@ -203,12 +248,12 @@ export function createHttpTrigger<M extends HttpMethod, P extends string>(
|
|
|
203
248
|
"table",
|
|
204
249
|
);
|
|
205
250
|
const signal = { name: `oke/live/sql:${storeTable.resolveTableName(source)}` };
|
|
206
|
-
return createHttpTrigger(method, path, gates, signal);
|
|
251
|
+
return createHttpTrigger(method, path, gates, signal, contract);
|
|
207
252
|
}
|
|
208
|
-
return createHttpTrigger(method, path, gates, source as SignalSource);
|
|
253
|
+
return createHttpTrigger(method, path, gates, source as SignalSource, contract);
|
|
209
254
|
},
|
|
210
255
|
};
|
|
211
|
-
return trigger
|
|
256
|
+
return trigger as HttpTrigger<M, P, C>;
|
|
212
257
|
}
|
|
213
258
|
|
|
214
259
|
/** Flow shape accepted by {@link http.resource} (duck-typed — any FlowDef). */
|
|
@@ -272,64 +317,113 @@ function loadHttpResource(): typeof import("./http-resource.ts") {
|
|
|
272
317
|
/**
|
|
273
318
|
* Shape of the {@link http} trigger namespace. Each method keeps `P` as a
|
|
274
319
|
* generic type parameter so callers (and the client) retain literal path
|
|
275
|
-
* types for param extraction.
|
|
320
|
+
* types for param extraction. Invoke contracts use an options bag
|
|
321
|
+
* (`http.post({ in, out })` or `http.post("/notes", { in, out })`); the bag
|
|
322
|
+
* type is preserved so {@link on} can project `in` / `out` / `errors` onto
|
|
323
|
+
* `FlowDef` / `$routes`.
|
|
276
324
|
*/
|
|
277
325
|
export interface HttpTriggerNamespace {
|
|
278
|
-
/**
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
326
|
+
/** Pathless — file-tree stamp fills the URL. Unresolved sentinel fails boot. */
|
|
327
|
+
get<C extends BoundaryContract | undefined = undefined>(
|
|
328
|
+
contract?: C,
|
|
329
|
+
): HttpTrigger<"GET", HttpPathPending, C>;
|
|
282
330
|
/**
|
|
283
331
|
* @param path - Route path (`/:id` params supported)
|
|
332
|
+
* @param contract - Invoke contract bag
|
|
284
333
|
*/
|
|
285
|
-
get<P extends string
|
|
334
|
+
get<P extends string, C extends BoundaryContract | undefined = undefined>(
|
|
335
|
+
path: P,
|
|
336
|
+
contract?: C,
|
|
337
|
+
): HttpTrigger<"GET", P, C>;
|
|
286
338
|
/** Pathless — file-tree stamp fills the URL. */
|
|
287
|
-
post
|
|
339
|
+
post<C extends BoundaryContract | undefined = undefined>(
|
|
340
|
+
contract?: C,
|
|
341
|
+
): HttpTrigger<"POST", HttpPathPending, C>;
|
|
288
342
|
/**
|
|
289
343
|
* @param path - Route path
|
|
344
|
+
* @param contract - Invoke contract bag
|
|
290
345
|
*/
|
|
291
|
-
post<P extends string
|
|
346
|
+
post<P extends string, C extends BoundaryContract | undefined = undefined>(
|
|
347
|
+
path: P,
|
|
348
|
+
contract?: C,
|
|
349
|
+
): HttpTrigger<"POST", P, C>;
|
|
292
350
|
/** Pathless — file-tree stamp fills the URL. */
|
|
293
|
-
put
|
|
351
|
+
put<C extends BoundaryContract | undefined = undefined>(
|
|
352
|
+
contract?: C,
|
|
353
|
+
): HttpTrigger<"PUT", HttpPathPending, C>;
|
|
294
354
|
/**
|
|
295
355
|
* @param path - Route path
|
|
356
|
+
* @param contract - Invoke contract bag
|
|
296
357
|
*/
|
|
297
|
-
put<P extends string
|
|
358
|
+
put<P extends string, C extends BoundaryContract | undefined = undefined>(
|
|
359
|
+
path: P,
|
|
360
|
+
contract?: C,
|
|
361
|
+
): HttpTrigger<"PUT", P, C>;
|
|
298
362
|
/** Pathless — file-tree stamp fills the URL. */
|
|
299
|
-
patch
|
|
363
|
+
patch<C extends BoundaryContract | undefined = undefined>(
|
|
364
|
+
contract?: C,
|
|
365
|
+
): HttpTrigger<"PATCH", HttpPathPending, C>;
|
|
300
366
|
/**
|
|
301
367
|
* @param path - Route path
|
|
368
|
+
* @param contract - Invoke contract bag
|
|
302
369
|
*/
|
|
303
|
-
patch<P extends string
|
|
370
|
+
patch<P extends string, C extends BoundaryContract | undefined = undefined>(
|
|
371
|
+
path: P,
|
|
372
|
+
contract?: C,
|
|
373
|
+
): HttpTrigger<"PATCH", P, C>;
|
|
304
374
|
/** Pathless — file-tree stamp fills the URL. */
|
|
305
|
-
delete
|
|
375
|
+
delete<C extends BoundaryContract | undefined = undefined>(
|
|
376
|
+
contract?: C,
|
|
377
|
+
): HttpTrigger<"DELETE", HttpPathPending, C>;
|
|
306
378
|
/**
|
|
307
379
|
* @param path - Route path
|
|
380
|
+
* @param contract - Invoke contract bag
|
|
308
381
|
*/
|
|
309
|
-
delete<P extends string
|
|
382
|
+
delete<P extends string, C extends BoundaryContract | undefined = undefined>(
|
|
383
|
+
path: P,
|
|
384
|
+
contract?: C,
|
|
385
|
+
): HttpTrigger<"DELETE", P, C>;
|
|
310
386
|
/** Pathless — file-tree stamp fills the URL. */
|
|
311
|
-
options
|
|
387
|
+
options<C extends BoundaryContract | undefined = undefined>(
|
|
388
|
+
contract?: C,
|
|
389
|
+
): HttpTrigger<"OPTIONS", HttpPathPending, C>;
|
|
312
390
|
/**
|
|
313
391
|
* @param path - Route path
|
|
392
|
+
* @param contract - Invoke contract bag
|
|
314
393
|
*/
|
|
315
|
-
options<P extends string
|
|
394
|
+
options<P extends string, C extends BoundaryContract | undefined = undefined>(
|
|
395
|
+
path: P,
|
|
396
|
+
contract?: C,
|
|
397
|
+
): HttpTrigger<"OPTIONS", P, C>;
|
|
316
398
|
/** Pathless — file-tree stamp fills the URL. */
|
|
317
|
-
head
|
|
399
|
+
head<C extends BoundaryContract | undefined = undefined>(
|
|
400
|
+
contract?: C,
|
|
401
|
+
): HttpTrigger<"HEAD", HttpPathPending, C>;
|
|
318
402
|
/**
|
|
319
403
|
* @param path - Route path
|
|
404
|
+
* @param contract - Invoke contract bag
|
|
320
405
|
*/
|
|
321
|
-
head<P extends string
|
|
406
|
+
head<P extends string, C extends BoundaryContract | undefined = undefined>(
|
|
407
|
+
path: P,
|
|
408
|
+
contract?: C,
|
|
409
|
+
): HttpTrigger<"HEAD", P, C>;
|
|
322
410
|
/**
|
|
323
411
|
* Safe, idempotent read that carries a JSON body (RFC 10008).
|
|
324
412
|
* Pathless — file-tree stamp fills the URL.
|
|
325
413
|
*/
|
|
326
|
-
query
|
|
414
|
+
query<C extends BoundaryContract | undefined = undefined>(
|
|
415
|
+
contract?: C,
|
|
416
|
+
): HttpTrigger<"QUERY", HttpPathPending, C>;
|
|
327
417
|
/**
|
|
328
418
|
* Safe, idempotent read that carries a JSON body (RFC 10008).
|
|
329
419
|
*
|
|
330
420
|
* @param path - Route path
|
|
421
|
+
* @param contract - Invoke contract bag
|
|
331
422
|
*/
|
|
332
|
-
query<P extends string
|
|
423
|
+
query<P extends string, C extends BoundaryContract | undefined = undefined>(
|
|
424
|
+
path: P,
|
|
425
|
+
contract?: C,
|
|
426
|
+
): HttpTrigger<"QUERY", P, C>;
|
|
333
427
|
/**
|
|
334
428
|
* Mount a CRUD resource (list/create on `path`, get/update/remove on
|
|
335
429
|
* `path/:id`) for the `on(http.resource(…))` overload. Chain `.gate(...)`
|
|
@@ -344,17 +438,44 @@ export interface HttpTriggerNamespace {
|
|
|
344
438
|
live(signal: SignalSource): LiveHttpTrigger<"GET">;
|
|
345
439
|
}
|
|
346
440
|
|
|
441
|
+
/** True when `value` looks like a {@link BoundaryContract} options bag (not a path). */
|
|
442
|
+
function isHttpContractBag(value: unknown): value is BoundaryContract {
|
|
443
|
+
if (typeof value !== "object" || value === null) return false;
|
|
444
|
+
const o = value as Record<string, unknown>;
|
|
445
|
+
return "in" in o || "out" in o || "errors" in o || "breaking" in o;
|
|
446
|
+
}
|
|
447
|
+
|
|
347
448
|
/** Bind an HTTP verb constructor (`http.get`, `http.query`, …). */
|
|
348
449
|
function httpVerb<M extends HttpMethod>(
|
|
349
450
|
method: M,
|
|
350
451
|
): {
|
|
351
|
-
|
|
352
|
-
|
|
452
|
+
<C extends BoundaryContract | undefined = undefined>(
|
|
453
|
+
contract?: C,
|
|
454
|
+
): HttpTrigger<M, HttpPathPending, C>;
|
|
455
|
+
<P extends string, C extends BoundaryContract | undefined = undefined>(
|
|
456
|
+
path: P,
|
|
457
|
+
contract?: C,
|
|
458
|
+
): HttpTrigger<M, P, C>;
|
|
353
459
|
} {
|
|
354
|
-
return ((
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
460
|
+
return ((pathOrContract?: string | BoundaryContract, maybeContract?: BoundaryContract) => {
|
|
461
|
+
if (pathOrContract === undefined) {
|
|
462
|
+
return createHttpTrigger(method, HTTP_PATH_PENDING);
|
|
463
|
+
}
|
|
464
|
+
if (typeof pathOrContract === "string") {
|
|
465
|
+
return createHttpTrigger(method, pathOrContract, [], undefined, maybeContract);
|
|
466
|
+
}
|
|
467
|
+
if (isHttpContractBag(pathOrContract)) {
|
|
468
|
+
return createHttpTrigger(method, HTTP_PATH_PENDING, [], undefined, pathOrContract);
|
|
469
|
+
}
|
|
470
|
+
throw new TypeError(`http.${method.toLowerCase()}(…): expected a path string or contract bag`);
|
|
471
|
+
}) as {
|
|
472
|
+
<C extends BoundaryContract | undefined = undefined>(
|
|
473
|
+
contract?: C,
|
|
474
|
+
): HttpTrigger<M, HttpPathPending, C>;
|
|
475
|
+
<P extends string, C extends BoundaryContract | undefined = undefined>(
|
|
476
|
+
path: P,
|
|
477
|
+
contract?: C,
|
|
478
|
+
): HttpTrigger<M, P, C>;
|
|
358
479
|
};
|
|
359
480
|
}
|
|
360
481
|
|
|
@@ -378,12 +499,19 @@ export const http: HttpTriggerNamespace = {
|
|
|
378
499
|
};
|
|
379
500
|
|
|
380
501
|
/**
|
|
381
|
-
*
|
|
502
|
+
* True when `value` is a declared clock handle (`clock("daily", { every: "1d" })`).
|
|
382
503
|
*
|
|
383
|
-
* @param
|
|
504
|
+
* @param value - Unknown
|
|
384
505
|
*/
|
|
385
|
-
export function
|
|
386
|
-
|
|
506
|
+
export function isClockDecl(value: unknown): value is ClockDecl {
|
|
507
|
+
if (typeof value !== "object" || value === null) return false;
|
|
508
|
+
const v = value as Record<string, unknown>;
|
|
509
|
+
return (
|
|
510
|
+
typeof v.name === "string" &&
|
|
511
|
+
!("kind" in v) &&
|
|
512
|
+
!("do" in v) &&
|
|
513
|
+
("cron" in v || "every" in v || "timezone" in v)
|
|
514
|
+
);
|
|
387
515
|
}
|
|
388
516
|
|
|
389
517
|
/**
|
|
@@ -427,34 +555,6 @@ export function isSignalTriggerSource(value: unknown): value is SignalSource {
|
|
|
427
555
|
return true;
|
|
428
556
|
}
|
|
429
557
|
|
|
430
|
-
/** Table handle returned by {@link table}. */
|
|
431
|
-
export interface TableHandle {
|
|
432
|
-
readonly name: string;
|
|
433
|
-
/**
|
|
434
|
-
* CDC trigger when `column` (or any column) changes.
|
|
435
|
-
*
|
|
436
|
-
* @param column - Optional column name
|
|
437
|
-
*/
|
|
438
|
-
changed(column?: string): CdcTrigger;
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
* CDC table handle — `table("orders").changed("status")`.
|
|
443
|
-
*
|
|
444
|
-
* @param name - Table name
|
|
445
|
-
* @param store - Optional store name
|
|
446
|
-
*/
|
|
447
|
-
export function table(name: string, store?: string): TableHandle {
|
|
448
|
-
return {
|
|
449
|
-
name,
|
|
450
|
-
changed(column?: string): CdcTrigger {
|
|
451
|
-
return column === undefined
|
|
452
|
-
? { kind: "cdc", table: name, store }
|
|
453
|
-
: { kind: "cdc", table: name, column, store };
|
|
454
|
-
},
|
|
455
|
-
};
|
|
456
|
-
}
|
|
457
|
-
|
|
458
558
|
/**
|
|
459
559
|
* Explicit internal / call-only trigger.
|
|
460
560
|
* Prefer an untriggered `flow(name, {…})` when no trigger value is needed.
|
|
@@ -462,42 +562,51 @@ export function table(name: string, store?: string): TableHandle {
|
|
|
462
562
|
export const internal: InternalTrigger = { kind: "internal" };
|
|
463
563
|
|
|
464
564
|
/**
|
|
465
|
-
* MCP tool namespace — `mcp.tool("bookings.create")` marks a flow
|
|
466
|
-
* explicitly exposed MCP tool for OAuth user-plane clients. Chain
|
|
467
|
-
* like HTTP triggers; no gates ⇒ not exposed (deny-by-default).
|
|
565
|
+
* MCP tool namespace — `mcp.tool("bookings.create", { in, out })` marks a flow
|
|
566
|
+
* as an explicitly exposed MCP tool for OAuth user-plane clients. Chain
|
|
567
|
+
* `.gate(...)` like HTTP triggers; no gates ⇒ not exposed (deny-by-default).
|
|
468
568
|
*
|
|
469
569
|
* @param name - Tool name (namespaced, e.g. `bookings.create`)
|
|
470
570
|
*/
|
|
471
571
|
export const mcp: {
|
|
472
572
|
/**
|
|
473
573
|
* @param name - Tool name
|
|
574
|
+
* @param contract - Invoke contract bag
|
|
474
575
|
*/
|
|
475
|
-
tool
|
|
576
|
+
tool<C extends BoundaryContract | undefined = undefined>(
|
|
577
|
+
name: string,
|
|
578
|
+
contract?: C,
|
|
579
|
+
): McpToolTrigger<C>;
|
|
476
580
|
} = {
|
|
477
|
-
tool(name: string): McpToolTrigger {
|
|
581
|
+
tool(name: string, contract?: BoundaryContract): McpToolTrigger {
|
|
478
582
|
if (typeof name !== "string" || name.trim().length === 0) {
|
|
479
583
|
throw new TypeError("mcp.tool(name): name is required");
|
|
480
584
|
}
|
|
481
|
-
return withMcpGates(name, []);
|
|
585
|
+
return withMcpGates(name, [], contract);
|
|
482
586
|
},
|
|
483
587
|
};
|
|
484
588
|
|
|
485
589
|
/** @internal Attach a resolved gate list onto a fresh {@link McpToolTrigger}. */
|
|
486
|
-
function withMcpGates
|
|
590
|
+
function withMcpGates<C extends BoundaryContract | undefined = undefined>(
|
|
591
|
+
name: string,
|
|
592
|
+
gates: readonly GateRef[],
|
|
593
|
+
contract?: C,
|
|
594
|
+
): McpToolTrigger<C> {
|
|
487
595
|
return {
|
|
488
596
|
kind: "mcp",
|
|
489
597
|
name,
|
|
490
598
|
gates,
|
|
491
|
-
|
|
492
|
-
|
|
599
|
+
...(contract !== undefined ? { contract } : {}),
|
|
600
|
+
gate: createGateAttach((next) => withMcpGates(name, next, contract), gates),
|
|
601
|
+
} as McpToolTrigger<C>;
|
|
493
602
|
}
|
|
494
603
|
|
|
495
604
|
/**
|
|
496
605
|
* Normalize anything accepted by {@link on} into a {@link Trigger}.
|
|
497
606
|
*
|
|
498
|
-
* @param value - Trigger or signal handle
|
|
607
|
+
* @param value - Trigger, clock, or signal handle
|
|
499
608
|
*/
|
|
500
|
-
export function normalizeTrigger(value: Trigger | SignalSource): Trigger {
|
|
609
|
+
export function normalizeTrigger(value: Trigger | SignalSource | ClockDecl): Trigger {
|
|
501
610
|
if (typeof value !== "object" || value === null) {
|
|
502
611
|
throw new TypeError("on() expected a trigger or signal handle");
|
|
503
612
|
}
|
|
@@ -505,6 +614,7 @@ export function normalizeTrigger(value: Trigger | SignalSource): Trigger {
|
|
|
505
614
|
const kind = (value as Trigger).kind;
|
|
506
615
|
if (
|
|
507
616
|
kind === "http" ||
|
|
617
|
+
kind === "clock" ||
|
|
508
618
|
kind === "every" ||
|
|
509
619
|
kind === "signal" ||
|
|
510
620
|
kind === "cdc" ||
|
|
@@ -514,6 +624,9 @@ export function normalizeTrigger(value: Trigger | SignalSource): Trigger {
|
|
|
514
624
|
return value as Trigger;
|
|
515
625
|
}
|
|
516
626
|
}
|
|
627
|
+
if (isClockDecl(value)) {
|
|
628
|
+
return { kind: "clock", name: value.name, clock: value };
|
|
629
|
+
}
|
|
517
630
|
if (isSignalTriggerSource(value)) {
|
|
518
631
|
return asSignalTrigger(value);
|
|
519
632
|
}
|
|
@@ -527,6 +640,8 @@ export function normalizeTrigger(value: Trigger | SignalSource): Trigger {
|
|
|
527
640
|
*/
|
|
528
641
|
export type BoundTriggerOf<T> = T extends Trigger
|
|
529
642
|
? T
|
|
530
|
-
: T extends
|
|
531
|
-
?
|
|
532
|
-
:
|
|
643
|
+
: T extends ClockDecl
|
|
644
|
+
? ClockTrigger
|
|
645
|
+
: T extends SignalSource
|
|
646
|
+
? SignalAsTrigger
|
|
647
|
+
: Trigger;
|
package/src/kernel-entry.ts
CHANGED
package/src/manifest/diff.ts
CHANGED
|
@@ -42,7 +42,17 @@ const CATEGORY_RANK: Record<DiffCategory, number> = {
|
|
|
42
42
|
"no-impact": 0,
|
|
43
43
|
};
|
|
44
44
|
|
|
45
|
-
const EFFECT_KEYS = [
|
|
45
|
+
const EFFECT_KEYS = [
|
|
46
|
+
"reads",
|
|
47
|
+
"writes",
|
|
48
|
+
"emits",
|
|
49
|
+
"sends",
|
|
50
|
+
"asks",
|
|
51
|
+
"embeds",
|
|
52
|
+
"secrets",
|
|
53
|
+
"calls",
|
|
54
|
+
"fetches",
|
|
55
|
+
] as const;
|
|
46
56
|
|
|
47
57
|
/** Isolation strength: higher = stronger tenant separation. */
|
|
48
58
|
const ISOLATION_RANK: Record<string, number> = {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"secrets": []
|
|
16
16
|
},
|
|
17
17
|
"slo": { "availability": "99.9%", "latency": { "p99": "200ms" } },
|
|
18
|
-
"source": "src/flows/bookings/index.ts:
|
|
18
|
+
"source": "src/flows/bookings/index.ts:24"
|
|
19
19
|
},
|
|
20
20
|
"bookings.mine": { "cacheKeys": "computed:sql:bookings/userId" },
|
|
21
21
|
"payments.chargeBooking": {
|
package/src/manifest/types.ts
CHANGED
|
@@ -89,7 +89,8 @@ export type JsonSchema = string | Record<string, unknown>;
|
|
|
89
89
|
*
|
|
90
90
|
* `secrets` is a capability (not an irreversible effect).
|
|
91
91
|
* `calls` portals to the callee's transitive effects.
|
|
92
|
-
* `sends` / `asks`
|
|
92
|
+
* `sends` / `asks` / `embeds` / `fetches` are irreversible
|
|
93
|
+
* (asks/embeds also nondeterministic + cost).
|
|
93
94
|
*/
|
|
94
95
|
export interface Effects {
|
|
95
96
|
/** Store reads, plus `"runs"` for `fx.runs` and `signal:name` for `fx.deadLetters` / `fx.live`. */
|
|
@@ -108,12 +109,28 @@ export interface Effects {
|
|
|
108
109
|
sends?: TemplateRef[];
|
|
109
110
|
/** AI prompt asks (irreversible, nondeterministic, cost). */
|
|
110
111
|
asks?: PromptRef[];
|
|
112
|
+
/**
|
|
113
|
+
* AI embedding model refs from `fx.embed` (irreversible, nondeterministic, cost).
|
|
114
|
+
* Distinct from {@link asks} — never conflated with prompt asks.
|
|
115
|
+
*/
|
|
116
|
+
embeds?: EmbedRef[];
|
|
111
117
|
/** Vault secret capabilities. */
|
|
112
118
|
secrets?: SecretRef[];
|
|
113
119
|
/** Nested flow calls (transitive effects). */
|
|
114
120
|
calls?: FlowRef[];
|
|
121
|
+
/**
|
|
122
|
+
* Outbound HTTP hosts from `fx.fetch` (irreversible).
|
|
123
|
+
* Hostname only (e.g. `"api.stripe.com"`), never a full URL.
|
|
124
|
+
*/
|
|
125
|
+
fetches?: FetchHostRef[];
|
|
115
126
|
}
|
|
116
127
|
|
|
128
|
+
/** Embedding model ref for `effects.embeds` / `fx.embed` (model name). */
|
|
129
|
+
export type EmbedRef = string;
|
|
130
|
+
|
|
131
|
+
/** Host ref for `effects.fetches` / `fx.fetch` (hostname). */
|
|
132
|
+
export type FetchHostRef = string;
|
|
133
|
+
|
|
117
134
|
/** HTTP trigger surface. */
|
|
118
135
|
export interface HttpTrigger {
|
|
119
136
|
method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS" | "QUERY";
|
|
@@ -299,6 +316,14 @@ export interface DeclaredColumn extends ColumnClassification {
|
|
|
299
316
|
description?: string;
|
|
300
317
|
/** Foreign key when `.references()` was declared. */
|
|
301
318
|
references?: DeclaredColumnReference;
|
|
319
|
+
/**
|
|
320
|
+
* Built-in hybrid search — BM25 when present; LSH when `embed` is set.
|
|
321
|
+
* Weight is BM25F field weight (default 1).
|
|
322
|
+
*/
|
|
323
|
+
searchable?: { weight: number };
|
|
324
|
+
/** Async embedding + LSH — requires `searchable` and a configured AI element. */
|
|
325
|
+
/** Concrete after extract resolves project defaults — `dims` is always set. */
|
|
326
|
+
embed?: { model?: string; dims: number };
|
|
302
327
|
}
|
|
303
328
|
|
|
304
329
|
/** Field classification value forms. */
|
|
@@ -331,6 +356,15 @@ export interface Table {
|
|
|
331
356
|
* defaulting.
|
|
332
357
|
*/
|
|
333
358
|
live?: boolean;
|
|
359
|
+
/**
|
|
360
|
+
* Derived hybrid-search posture for Console / doctor inspectability.
|
|
361
|
+
* Present when any column has `.searchable()` / `.embed()`.
|
|
362
|
+
*/
|
|
363
|
+
search?: {
|
|
364
|
+
engines: Array<"bm25" | "lsh">;
|
|
365
|
+
/** True when push detected existing rows needing `oke db search-backfill`. */
|
|
366
|
+
backfillRequired?: boolean;
|
|
367
|
+
};
|
|
334
368
|
}
|
|
335
369
|
|
|
336
370
|
/** One Store declaration. */
|
|
@@ -494,10 +528,20 @@ export interface Plugin {
|
|
|
494
528
|
tables?: Record<string, PluginTable>;
|
|
495
529
|
}
|
|
496
530
|
|
|
497
|
-
/** Store-wide live-query defaulting configuration. */
|
|
531
|
+
/** Store-wide live-query / search defaulting configuration. */
|
|
498
532
|
export interface StoreLive {
|
|
499
533
|
/** `oke({ store: { live: true } })` is on — new tables are live by default. */
|
|
500
534
|
live?: boolean;
|
|
535
|
+
/**
|
|
536
|
+
* Project default for field `.embed()` — `oke({ store: { search: { embed } } })`.
|
|
537
|
+
* Per-field `.embed({ model?, dims? })` overrides these when set.
|
|
538
|
+
*/
|
|
539
|
+
search?: {
|
|
540
|
+
embed?: {
|
|
541
|
+
model: string;
|
|
542
|
+
dims: number;
|
|
543
|
+
};
|
|
544
|
+
};
|
|
501
545
|
}
|
|
502
546
|
|
|
503
547
|
/** Tenancy configuration (resolver is code; isolation is data). */
|