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
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stream `docker compose up -d` so `oke dev` can show pull / start progress.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/** Lifecycle phase inferred from a compose progress line. */
|
|
6
|
+
export type ComposeUpPhase =
|
|
7
|
+
| "pulling"
|
|
8
|
+
| "pulled"
|
|
9
|
+
| "creating"
|
|
10
|
+
| "created"
|
|
11
|
+
| "starting"
|
|
12
|
+
| "started"
|
|
13
|
+
| "waiting"
|
|
14
|
+
| "healthy"
|
|
15
|
+
| "downloading"
|
|
16
|
+
| "extracting"
|
|
17
|
+
| "error"
|
|
18
|
+
| "other";
|
|
19
|
+
|
|
20
|
+
/** One parsed compose progress event (may be activity-only). */
|
|
21
|
+
export type ComposeUpEvent = {
|
|
22
|
+
/** Raw line with ANSI / CR noise stripped. */
|
|
23
|
+
readonly raw: string;
|
|
24
|
+
/** Image / service / container / network name when known. */
|
|
25
|
+
readonly target?: string;
|
|
26
|
+
/** Compose resource kind when the line names one. */
|
|
27
|
+
readonly kind?: "container" | "image" | "network" | "volume" | "service";
|
|
28
|
+
/** Lifecycle phase when known. */
|
|
29
|
+
readonly phase?: ComposeUpPhase;
|
|
30
|
+
/** Extra detail (download bar, error text). */
|
|
31
|
+
readonly detail?: string;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/** Options for {@link runComposeUp}. */
|
|
35
|
+
export type RunComposeUpOptions = {
|
|
36
|
+
readonly files: readonly string[];
|
|
37
|
+
readonly cwd: string;
|
|
38
|
+
readonly env: Readonly<Record<string, string>>;
|
|
39
|
+
/** Called for each meaningful progress line (after parse). */
|
|
40
|
+
readonly onEvent?: (event: ComposeUpEvent) => void;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const ANSI_RE = /\x1b\[[0-9;]*[A-Za-z]/g;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Strip ANSI escapes and normalize whitespace for parsing / display.
|
|
47
|
+
*
|
|
48
|
+
* @param text - Raw chunk or line
|
|
49
|
+
*/
|
|
50
|
+
export function stripAnsi(text: string): string {
|
|
51
|
+
return text.replace(ANSI_RE, "").replace(/\r/g, "");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Shorten a compose container / image name for status chrome.
|
|
56
|
+
*
|
|
57
|
+
* @param name - Full target from compose output
|
|
58
|
+
*/
|
|
59
|
+
export function shortenComposeTarget(name: string): string {
|
|
60
|
+
const trimmed = name.trim();
|
|
61
|
+
if (!trimmed) return trimmed;
|
|
62
|
+
// Image refs: `postgres:16-alpine` / `library/redis:7` → repo leaf
|
|
63
|
+
if (trimmed.includes(":")) {
|
|
64
|
+
const repo = trimmed.slice(0, trimmed.indexOf(":"));
|
|
65
|
+
const slash = repo.lastIndexOf("/");
|
|
66
|
+
return slash >= 0 ? repo.slice(slash + 1) : repo;
|
|
67
|
+
}
|
|
68
|
+
// `oke-<slug>-postgres-1` → `postgres` (drop replica, take last segment)
|
|
69
|
+
if (/^oke-/i.test(trimmed)) {
|
|
70
|
+
const noReplica = trimmed.replace(/-\d+$/, "");
|
|
71
|
+
const parts = noReplica.split("-").filter(Boolean);
|
|
72
|
+
const leaf = parts[parts.length - 1];
|
|
73
|
+
if (leaf) return leaf;
|
|
74
|
+
}
|
|
75
|
+
return trimmed;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Human label for a compose phase (status line suffix).
|
|
80
|
+
*
|
|
81
|
+
* @param phase - Parsed phase
|
|
82
|
+
*/
|
|
83
|
+
export function composeUpPhaseLabel(phase: ComposeUpPhase): string {
|
|
84
|
+
switch (phase) {
|
|
85
|
+
case "pulling":
|
|
86
|
+
return "pulling…";
|
|
87
|
+
case "pulled":
|
|
88
|
+
return "pulled";
|
|
89
|
+
case "creating":
|
|
90
|
+
return "creating…";
|
|
91
|
+
case "created":
|
|
92
|
+
return "created";
|
|
93
|
+
case "starting":
|
|
94
|
+
return "starting…";
|
|
95
|
+
case "started":
|
|
96
|
+
return "started";
|
|
97
|
+
case "waiting":
|
|
98
|
+
return "waiting…";
|
|
99
|
+
case "healthy":
|
|
100
|
+
return "healthy";
|
|
101
|
+
case "downloading":
|
|
102
|
+
return "downloading…";
|
|
103
|
+
case "extracting":
|
|
104
|
+
return "extracting…";
|
|
105
|
+
case "error":
|
|
106
|
+
return "error";
|
|
107
|
+
case "other":
|
|
108
|
+
return "";
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Map a phase to a boot ● status.
|
|
114
|
+
*
|
|
115
|
+
* @param phase - Parsed phase
|
|
116
|
+
*/
|
|
117
|
+
export function composeUpPhaseStatus(phase: ComposeUpPhase): "ready" | "pending" | "error" {
|
|
118
|
+
if (phase === "error") return "error";
|
|
119
|
+
if (phase === "pulled" || phase === "created" || phase === "started" || phase === "healthy") {
|
|
120
|
+
return "ready";
|
|
121
|
+
}
|
|
122
|
+
return "pending";
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const KIND_PHASE: Record<string, ComposeUpPhase> = {
|
|
126
|
+
pulling: "pulling",
|
|
127
|
+
pulled: "pulled",
|
|
128
|
+
creating: "creating",
|
|
129
|
+
created: "created",
|
|
130
|
+
starting: "starting",
|
|
131
|
+
started: "started",
|
|
132
|
+
waiting: "waiting",
|
|
133
|
+
healthy: "healthy",
|
|
134
|
+
error: "error",
|
|
135
|
+
errored: "error",
|
|
136
|
+
failed: "error",
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Parse one docker compose progress line into a structured event.
|
|
141
|
+
*
|
|
142
|
+
* Handles Compose plain progress (`Image x Pulling`, `Container y Started`)
|
|
143
|
+
* and common layer download chatter.
|
|
144
|
+
*
|
|
145
|
+
* @param line - One logical line (already split on `\n` / `\r`)
|
|
146
|
+
*/
|
|
147
|
+
export function parseComposeProgressLine(line: string): ComposeUpEvent | null {
|
|
148
|
+
const raw = stripAnsi(line).trim();
|
|
149
|
+
if (!raw) return null;
|
|
150
|
+
// Spinner / empty chrome
|
|
151
|
+
if (/^[.·…]+$/.test(raw)) return null;
|
|
152
|
+
|
|
153
|
+
const kinded =
|
|
154
|
+
/^(Container|Image|Network|Volume|Service)\s+(.+?)\s+(Pulling|Pulled|Creating|Created|Starting|Started|Waiting|Healthy|Error|Errored|Failed)\b/i.exec(
|
|
155
|
+
raw,
|
|
156
|
+
);
|
|
157
|
+
if (kinded?.[1] && kinded[2] && kinded[3]) {
|
|
158
|
+
const phase = KIND_PHASE[kinded[3].toLowerCase()] ?? "other";
|
|
159
|
+
const kind = kinded[1].toLowerCase() as ComposeUpEvent["kind"];
|
|
160
|
+
return { raw, target: kinded[2].trim(), kind, phase };
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// `postgres Pulling` / `postgres Pulled` (service-keyed)
|
|
164
|
+
const bare =
|
|
165
|
+
/^([A-Za-z0-9][A-Za-z0-9._/-]*)\s+(Pulling|Pulled|Creating|Created|Starting|Started|Waiting|Healthy)\b/i.exec(
|
|
166
|
+
raw,
|
|
167
|
+
);
|
|
168
|
+
if (bare?.[1] && bare[2]) {
|
|
169
|
+
const phase = KIND_PHASE[bare[2].toLowerCase()] ?? "other";
|
|
170
|
+
return { raw, target: bare[1], phase };
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (/\bDownloading\b/i.test(raw) || /\bDownload complete\b/i.test(raw)) {
|
|
174
|
+
return { raw, phase: "downloading", detail: raw };
|
|
175
|
+
}
|
|
176
|
+
if (/\bExtracting\b/i.test(raw) || /\bPull complete\b/i.test(raw)) {
|
|
177
|
+
return { raw, phase: "extracting", detail: raw };
|
|
178
|
+
}
|
|
179
|
+
if (/\b(error|failed|fatal)\b/i.test(raw)) {
|
|
180
|
+
return { raw, phase: "error", detail: raw };
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Keep other non-empty lines as activity so pulls never look frozen.
|
|
184
|
+
return { raw, phase: "other", detail: raw };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Format a status message for one compose event.
|
|
189
|
+
*
|
|
190
|
+
* @param event - Parsed event
|
|
191
|
+
*/
|
|
192
|
+
export function formatComposeUpEventMessage(event: ComposeUpEvent): string {
|
|
193
|
+
if (event.target && event.phase && event.phase !== "other") {
|
|
194
|
+
const label = composeUpPhaseLabel(event.phase);
|
|
195
|
+
const name = shortenComposeTarget(event.target);
|
|
196
|
+
return label ? `${name} ${label}` : name;
|
|
197
|
+
}
|
|
198
|
+
if (event.detail) {
|
|
199
|
+
// Cap long download bars for the status chrome.
|
|
200
|
+
const d = event.detail.length > 72 ? `${event.detail.slice(0, 69)}…` : event.detail;
|
|
201
|
+
return d;
|
|
202
|
+
}
|
|
203
|
+
return event.raw.length > 72 ? `${event.raw.slice(0, 69)}…` : event.raw;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Pump a byte stream into logical lines (`\n` and `\r`), invoking `onLine`.
|
|
208
|
+
*
|
|
209
|
+
* @param stream - Process stdout/stderr
|
|
210
|
+
* @param onLine - Per logical line
|
|
211
|
+
* @param collect - Append raw text for error reporting
|
|
212
|
+
*/
|
|
213
|
+
async function pumpComposeStream(
|
|
214
|
+
stream: ReadableStream<Uint8Array> | null,
|
|
215
|
+
onLine: (line: string) => void,
|
|
216
|
+
collect: (chunk: string) => void,
|
|
217
|
+
): Promise<void> {
|
|
218
|
+
if (!stream) return;
|
|
219
|
+
const reader = stream.getReader();
|
|
220
|
+
const dec = new TextDecoder();
|
|
221
|
+
let buf = "";
|
|
222
|
+
for (;;) {
|
|
223
|
+
const { done, value } = await reader.read();
|
|
224
|
+
if (done) break;
|
|
225
|
+
const chunk = dec.decode(value, { stream: true });
|
|
226
|
+
collect(chunk);
|
|
227
|
+
buf += chunk;
|
|
228
|
+
// Progress bars use `\r`; treat both as line breaks.
|
|
229
|
+
for (;;) {
|
|
230
|
+
const nl = buf.search(/[\r\n]/);
|
|
231
|
+
if (nl < 0) break;
|
|
232
|
+
const line = buf.slice(0, nl);
|
|
233
|
+
const sep = buf[nl];
|
|
234
|
+
buf = buf.slice(nl + 1);
|
|
235
|
+
// Swallow the LF of a CRLF pair.
|
|
236
|
+
if (sep === "\r" && buf.startsWith("\n")) buf = buf.slice(1);
|
|
237
|
+
if (line.length > 0) onLine(line);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (buf.length > 0) onLine(buf);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Run `docker compose … up -d --remove-orphans --progress=plain`, streaming
|
|
245
|
+
* progress events. Throws when the process exits non-zero.
|
|
246
|
+
*
|
|
247
|
+
* @param options - Files, cwd, env, optional event sink
|
|
248
|
+
*/
|
|
249
|
+
export async function runComposeUp(options: RunComposeUpOptions): Promise<void> {
|
|
250
|
+
const args = [
|
|
251
|
+
"compose",
|
|
252
|
+
"--progress",
|
|
253
|
+
"plain",
|
|
254
|
+
...options.files.flatMap((f) => ["-f", f]),
|
|
255
|
+
"up",
|
|
256
|
+
"-d",
|
|
257
|
+
"--remove-orphans",
|
|
258
|
+
];
|
|
259
|
+
const proc = Bun.spawn(["docker", ...args], {
|
|
260
|
+
cwd: options.cwd,
|
|
261
|
+
stdout: "pipe",
|
|
262
|
+
stderr: "pipe",
|
|
263
|
+
env: {
|
|
264
|
+
...process.env,
|
|
265
|
+
...options.env,
|
|
266
|
+
BUILDKIT_PROGRESS: "plain",
|
|
267
|
+
COMPOSE_ANSI: "never",
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
let stdout = "";
|
|
272
|
+
let stderr = "";
|
|
273
|
+
const emitLine = (line: string): void => {
|
|
274
|
+
const event = parseComposeProgressLine(line);
|
|
275
|
+
if (!event) return;
|
|
276
|
+
options.onEvent?.(event);
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
await Promise.all([
|
|
280
|
+
pumpComposeStream(proc.stdout, emitLine, (c) => {
|
|
281
|
+
stdout += c;
|
|
282
|
+
}),
|
|
283
|
+
pumpComposeStream(proc.stderr, emitLine, (c) => {
|
|
284
|
+
stderr += c;
|
|
285
|
+
}),
|
|
286
|
+
]);
|
|
287
|
+
const code = await proc.exited;
|
|
288
|
+
if (code !== 0) {
|
|
289
|
+
const detail = [stdout.trim(), stderr.trim()].filter(Boolean).join("\n");
|
|
290
|
+
throw new Error(`oke dev: docker compose exited ${code}` + (detail ? `\n${detail}` : ""));
|
|
291
|
+
}
|
|
292
|
+
}
|
package/src/docker/compose.ts
CHANGED
|
@@ -463,7 +463,7 @@ export function buildStackEnv(
|
|
|
463
463
|
env.OKE_STORE_INDEX_URL = url;
|
|
464
464
|
env.OKE_STORE_INDEX_KEY = spec.credentials.password;
|
|
465
465
|
} else if (spec.role === "ai") {
|
|
466
|
-
//
|
|
466
|
+
// Unsupported compose role — prefer BYO `OKE_AI_URL` for cloud / local servers.
|
|
467
467
|
env[`${prefix}_URL`] = url;
|
|
468
468
|
env.OKE_AI_URL = url;
|
|
469
469
|
} else if (spec.role === "proxy") {
|
|
@@ -508,7 +508,7 @@ const ROLE_SECTION_TITLE: Readonly<Record<string, string>> = {
|
|
|
508
508
|
"store.index": "store.index — search index",
|
|
509
509
|
"channel.email": "channel.email — Mailpit (SMTP + UI)",
|
|
510
510
|
signal: "signal — message bus",
|
|
511
|
-
ai: "ai —
|
|
511
|
+
ai: "ai — (unsupported; use OKE_AI_URL)",
|
|
512
512
|
proxy: "proxy — edge reverse proxy (Caddy / Traefik / nginx)",
|
|
513
513
|
};
|
|
514
514
|
|
|
@@ -561,7 +561,7 @@ const ROLE_ALIASES: Readonly<Record<string, readonly string[]>> = {
|
|
|
561
561
|
"MP_SMTP_AUTH_ALLOW_INSECURE",
|
|
562
562
|
],
|
|
563
563
|
// OKE_AI_URL is already emitted as `${prefix}_URL` — do not alias it again.
|
|
564
|
-
ai: [
|
|
564
|
+
ai: [],
|
|
565
565
|
proxy: ["OKE_PROXY_HOST", "OKE_PROXY_ACME_EMAIL"],
|
|
566
566
|
"store.index": ["OKE_STORE_INDEX_KEY"],
|
|
567
567
|
};
|
|
@@ -578,11 +578,6 @@ const ROLE_CONTROL_EXAMPLES: Readonly<Record<string, readonly string[]>> = {
|
|
|
578
578
|
"MP_SMTP_AUTH_ACCEPT_ANY=1",
|
|
579
579
|
"MP_SMTP_AUTH_ALLOW_INSECURE=1",
|
|
580
580
|
],
|
|
581
|
-
// Curated Docker Hub `ai/` model id for llama.cpp; Ollama tags differ.
|
|
582
|
-
// OKE_AI_CTX_SIZE bounds the KV cache llama-server allocates at load —
|
|
583
|
-
// left at the model's full native context (often 32K-256K+), a small
|
|
584
|
-
// model's KV cache alone can OOM the container regardless of host RAM.
|
|
585
|
-
ai: ["OKE_AI_MODEL=granite3.3:2b", "OKE_AI_CTX_SIZE=4096"],
|
|
586
581
|
proxy: ["OKE_PROXY_HOST=localhost", "OKE_PROXY_ACME_EMAIL=admin@example.com"],
|
|
587
582
|
};
|
|
588
583
|
|
|
@@ -600,12 +595,7 @@ function roleFromEnvKey(key: string): string | undefined {
|
|
|
600
595
|
}
|
|
601
596
|
if (key === "PGDATA" || key === "POSTGRES_INITDB_ARGS") return "store.sql";
|
|
602
597
|
if (key.startsWith("OKE_STORE_KV_MAXMEMORY")) return "store.kv";
|
|
603
|
-
if (
|
|
604
|
-
key === "OKE_AI_URL" ||
|
|
605
|
-
key === "OKE_AI_MODEL" ||
|
|
606
|
-
key === "OKE_AI_CTX_SIZE" ||
|
|
607
|
-
key === "OLLAMA_HOST"
|
|
608
|
-
) {
|
|
598
|
+
if (key === "OKE_AI_URL" || key === "OKE_AI_MODEL") {
|
|
609
599
|
return "ai";
|
|
610
600
|
}
|
|
611
601
|
if (key === "OKE_PROXY_URL" || key === "OKE_PROXY_HOST" || key === "OKE_PROXY_ACME_EMAIL") {
|
package/src/docker/derive.ts
CHANGED
|
@@ -17,12 +17,6 @@ import {
|
|
|
17
17
|
import { emitDockerfile } from "./dockerfile.ts";
|
|
18
18
|
import { buildCaddyfile } from "./recipes/caddy.ts";
|
|
19
19
|
import { buildNginxConf } from "./recipes/nginx.ts";
|
|
20
|
-
import {
|
|
21
|
-
buildLlamaCppEntrypoint,
|
|
22
|
-
LLAMA_CPP_ENTRYPOINT_FILE,
|
|
23
|
-
LLAMA_CPP_ENTRYPOINT_HOST_PATH,
|
|
24
|
-
llamaCpp,
|
|
25
|
-
} from "./recipes/llama-cpp.ts";
|
|
26
20
|
import { buildPgDogToml, buildPgDogUsersToml, PGDOG_CONFIG_DIR } from "./recipes/pgdog.ts";
|
|
27
21
|
import {
|
|
28
22
|
emitPostgresAdvisorDockerfile,
|
|
@@ -33,6 +27,9 @@ import type { DeriveOptions, DeriveResult, GeneratedFile } from "./types.ts";
|
|
|
33
27
|
import { DEFAULT_DOCKER_DIR } from "./types.ts";
|
|
34
28
|
import { APP_PORT } from "../runtime/types.ts";
|
|
35
29
|
|
|
30
|
+
/** Legacy llama.cpp entrypoint path (relative to compose dir) — pruned once. */
|
|
31
|
+
const LEGACY_LLAMA_ENTRYPOINT_HOST_PATH = "../.oke/llama-entrypoint.py";
|
|
32
|
+
|
|
36
33
|
/**
|
|
37
34
|
* Derive infrastructure files from normalised image pins.
|
|
38
35
|
*
|
|
@@ -76,7 +73,6 @@ export function deriveInfrastructure(options: DeriveOptions): DeriveResult {
|
|
|
76
73
|
...composeFilesContent,
|
|
77
74
|
...pgdogConfigFiles(specs),
|
|
78
75
|
...proxyConfigFiles(specs, normalised.appPort),
|
|
79
|
-
...llamaCppEntrypointFiles(specs),
|
|
80
76
|
...postgresAdvisorDockerfileFiles(specs),
|
|
81
77
|
];
|
|
82
78
|
|
|
@@ -112,25 +108,6 @@ function postgresAdvisorDockerfileFiles(specs: DeriveResult["specs"]): Generated
|
|
|
112
108
|
];
|
|
113
109
|
}
|
|
114
110
|
|
|
115
|
-
/**
|
|
116
|
-
* Emit `.oke/llama-entrypoint.py` (path relative to compose dir) when the AI
|
|
117
|
-
* role is llama.cpp so first boot can Hub-pull then serve single-model
|
|
118
|
-
* (router `--docker-repo` hangs on b10290+). Kept out of `docker/` so app
|
|
119
|
-
* trees stay TypeScript-only.
|
|
120
|
-
*
|
|
121
|
-
* @param specs - Normalised services
|
|
122
|
-
*/
|
|
123
|
-
function llamaCppEntrypointFiles(specs: DeriveResult["specs"]): GeneratedFile[] {
|
|
124
|
-
const ai = specs.find((s) => s.role === "ai");
|
|
125
|
-
if (!ai || !llamaCpp.match(ai.image)) return [];
|
|
126
|
-
return [
|
|
127
|
-
{
|
|
128
|
-
path: LLAMA_CPP_ENTRYPOINT_HOST_PATH,
|
|
129
|
-
content: buildLlamaCppEntrypoint(),
|
|
130
|
-
},
|
|
131
|
-
];
|
|
132
|
-
}
|
|
133
|
-
|
|
134
111
|
/**
|
|
135
112
|
* Emit PgDog TOML configs when both `pgdog` and `store.sql` are in the stack.
|
|
136
113
|
*
|
|
@@ -208,7 +185,7 @@ export async function writeDerivedFiles(
|
|
|
208
185
|
mkdirSync(root, { recursive: true });
|
|
209
186
|
const keep = new Set(result.files.map((f) => f.path));
|
|
210
187
|
pruneStaleGenerated(root, keep);
|
|
211
|
-
|
|
188
|
+
pruneLegacyLlamaEntrypoint(root);
|
|
212
189
|
for (const file of result.files) {
|
|
213
190
|
const path = join(root, file.path);
|
|
214
191
|
mkdirSync(dirname(path), { recursive: true });
|
|
@@ -255,21 +232,19 @@ const PRUNE_ROOT_FILES = new Set([
|
|
|
255
232
|
"compose.prod.yml",
|
|
256
233
|
"Caddyfile",
|
|
257
234
|
"nginx.conf",
|
|
258
|
-
// Legacy: entrypoint used to land in `docker
|
|
259
|
-
|
|
235
|
+
// Legacy: llama.cpp entrypoint used to land in `docker/`.
|
|
236
|
+
"llama-entrypoint.py",
|
|
260
237
|
"pgdog.toml",
|
|
261
238
|
"users.toml",
|
|
262
239
|
]);
|
|
263
240
|
|
|
264
241
|
/**
|
|
265
|
-
* Drop `.oke/llama-entrypoint.py`
|
|
242
|
+
* Drop stale `.oke/llama-entrypoint.py` from older stacks (AI recipes removed).
|
|
266
243
|
*
|
|
267
244
|
* @param root - Compose directory (`docker/`)
|
|
268
|
-
* @param keep - Relative paths that will be rewritten
|
|
269
245
|
*/
|
|
270
|
-
function
|
|
271
|
-
|
|
272
|
-
const abs = join(root, LLAMA_CPP_ENTRYPOINT_HOST_PATH);
|
|
246
|
+
function pruneLegacyLlamaEntrypoint(root: string): void {
|
|
247
|
+
const abs = join(root, LEGACY_LLAMA_ENTRYPOINT_HOST_PATH);
|
|
273
248
|
try {
|
|
274
249
|
unlinkSync(abs);
|
|
275
250
|
} catch {
|