okengine 0.1.4
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 +91 -0
- package/README.md +327 -0
- package/docs/spec/complete-example.md +1188 -0
- package/docs/spec/console.md +739 -0
- package/docs/spec/four-applications.md +1188 -0
- package/docs/spec/unified-theory.md +489 -0
- package/package.json +152 -0
- package/spec/manifest.v1.schema.json +624 -0
- package/src/auth/api-keys.ts +168 -0
- package/src/auth/attenuation.ts +116 -0
- package/src/auth/auth.test.ts +273 -0
- package/src/auth/cross-plane.ts +98 -0
- package/src/auth/index.ts +112 -0
- package/src/auth/invites.ts +66 -0
- package/src/auth/invoke-as.ts +49 -0
- package/src/auth/operator.ts +178 -0
- package/src/auth/planes.ts +102 -0
- package/src/auth/plugin.ts +44 -0
- package/src/auth/roles.ts +84 -0
- package/src/auth/sessions.ts +418 -0
- package/src/auth/tables.ts +131 -0
- package/src/cli/args.ts +50 -0
- package/src/cli/branch.ts +75 -0
- package/src/cli/build.ts +86 -0
- package/src/cli/client-add.test.ts +140 -0
- package/src/cli/client-add.ts +164 -0
- package/src/cli/completion.test.ts +58 -0
- package/src/cli/completion.ts +296 -0
- package/src/cli/dev-app-runner.ts +77 -0
- package/src/cli/dev.test.ts +435 -0
- package/src/cli/dev.ts +594 -0
- package/src/cli/doc-drift.test.ts +146 -0
- package/src/cli/doc-drift.ts +397 -0
- package/src/cli/docker-cli.test.ts +221 -0
- package/src/cli/docker.ts +127 -0
- package/src/cli/doctor-diff-examples.ts +92 -0
- package/src/cli/doctor-diff.test.ts +91 -0
- package/src/cli/doctor-diff.ts +274 -0
- package/src/cli/doctor-pii.test.ts +98 -0
- package/src/cli/doctor-pii.ts +151 -0
- package/src/cli/doctor.test.ts +150 -0
- package/src/cli/doctor.ts +223 -0
- package/src/cli/eval.ts +122 -0
- package/src/cli/exit.ts +19 -0
- package/src/cli/gates-list.test.ts +47 -0
- package/src/cli/gates-list.ts +84 -0
- package/src/cli/images.ts +277 -0
- package/src/cli/index.ts +99 -0
- package/src/cli/json-out.test.ts +129 -0
- package/src/cli/load-config.ts +71 -0
- package/src/cli/mcp-from-console.ts +50 -0
- package/src/cli/privacy-erase.ts +73 -0
- package/src/cli/registry.ts +455 -0
- package/src/cli/safe-defaults.test.ts +92 -0
- package/src/cli/schema.ts +196 -0
- package/src/cli/stack.ts +82 -0
- package/src/cli/start.ts +106 -0
- package/src/cli/upgrade.ts +105 -0
- package/src/cli/vault-cmd.ts +140 -0
- package/src/client/budget-entry.ts +34 -0
- package/src/client/budget.test.ts +17 -0
- package/src/client/create.test.ts +159 -0
- package/src/client/create.ts +152 -0
- package/src/client/errors.ts +60 -0
- package/src/client/index.ts +35 -0
- package/src/client/notes-contract.test.ts +289 -0
- package/src/client/transport.test.ts +123 -0
- package/src/client/transport.ts +254 -0
- package/src/client/types.ts +282 -0
- package/src/compiler/aot.test.ts +248 -0
- package/src/compiler/aot.ts +182 -0
- package/src/compiler/differential.test.ts +241 -0
- package/src/compiler/dynamic.ts +54 -0
- package/src/compiler/effects-infer.ts +541 -0
- package/src/compiler/emit.ts +40 -0
- package/src/compiler/extract.test.ts +177 -0
- package/src/compiler/extract.ts +1368 -0
- package/src/compiler/fixtures/raw/raw-unannotated.ts +28 -0
- package/src/compiler/fixtures/skyport/oke.config.ts +24 -0
- package/src/compiler/fixtures/skyport/src/ai.ts +15 -0
- package/src/compiler/fixtures/skyport/src/app.ts +10 -0
- package/src/compiler/fixtures/skyport/src/channels.ts +6 -0
- package/src/compiler/fixtures/skyport/src/core.ts +3 -0
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +57 -0
- package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +11 -0
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +14 -0
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +20 -0
- package/src/compiler/fixtures/skyport/src/gates.ts +14 -0
- package/src/compiler/fixtures/skyport/src/journeys.ts +9 -0
- package/src/compiler/fixtures/skyport/src/schema.ts +3 -0
- package/src/compiler/fixtures/skyport/src/vault.ts +6 -0
- package/src/compiler/fixtures/skyport.expected.json +241 -0
- package/src/compiler/fixtures/triggers/five-triggers.ts +69 -0
- package/src/compiler/http-parse.ts +214 -0
- package/src/compiler/index.ts +67 -0
- package/src/compiler/response.ts +89 -0
- package/src/compiler/sucrose.ts +238 -0
- package/src/config/index.ts +167 -0
- package/src/console/budget.test.ts +73 -0
- package/src/console/index.ts +30 -0
- package/src/console/server/access.test.ts +370 -0
- package/src/console/server/access.ts +777 -0
- package/src/console/server/ai.test.ts +172 -0
- package/src/console/server/ai.ts +632 -0
- package/src/console/server/app.ts +294 -0
- package/src/console/server/auth-rate.test.ts +81 -0
- package/src/console/server/auth-rate.ts +72 -0
- package/src/console/server/bind.ts +25 -0
- package/src/console/server/channels.test.ts +179 -0
- package/src/console/server/channels.ts +469 -0
- package/src/console/server/claim.test.ts +66 -0
- package/src/console/server/claim.ts +134 -0
- package/src/console/server/clock.test.ts +239 -0
- package/src/console/server/clock.ts +390 -0
- package/src/console/server/console.test.ts +338 -0
- package/src/console/server/diff.test.ts +299 -0
- package/src/console/server/diff.ts +352 -0
- package/src/console/server/dry-run.audit.test.ts +118 -0
- package/src/console/server/flows-invoke.test.ts +148 -0
- package/src/console/server/flows.ts +3633 -0
- package/src/console/server/gates.test.ts +360 -0
- package/src/console/server/gates.ts +869 -0
- package/src/console/server/index.ts +141 -0
- package/src/console/server/live.test.ts +30 -0
- package/src/console/server/live.ts +109 -0
- package/src/console/server/plugin.ts +50 -0
- package/src/console/server/plugins.test.ts +131 -0
- package/src/console/server/plugins.ts +429 -0
- package/src/console/server/runs-pii.ts +98 -0
- package/src/console/server/security-headers.ts +97 -0
- package/src/console/server/security.gate.test.ts +286 -0
- package/src/console/server/serve.ts +319 -0
- package/src/console/server/signals.test.ts +88 -0
- package/src/console/server/signals.ts +282 -0
- package/src/console/server/state.ts +982 -0
- package/src/console/server/store.test.ts +233 -0
- package/src/console/server/store.ts +861 -0
- package/src/console/server/structural.ts +95 -0
- package/src/console/server/vault.test.ts +251 -0
- package/src/console/server/vault.ts +430 -0
- package/src/console/ui/access/AccessA11yView.tsx +237 -0
- package/src/console/ui/access/a11y.test.tsx +122 -0
- package/src/console/ui/access/acknowledgement.test.ts +13 -0
- package/src/console/ui/access/acknowledgement.ts +35 -0
- package/src/console/ui/access/blast-radius.test.ts +26 -0
- package/src/console/ui/access/blast-radius.ts +40 -0
- package/src/console/ui/access/confirmation.test.ts +38 -0
- package/src/console/ui/access/confirmation.ts +36 -0
- package/src/console/ui/access/fixture.ts +203 -0
- package/src/console/ui/access/grantable.test.ts +17 -0
- package/src/console/ui/access/grantable.ts +36 -0
- package/src/console/ui/access/hygiene.test.ts +12 -0
- package/src/console/ui/access/hygiene.ts +39 -0
- package/src/console/ui/access/index.ts +54 -0
- package/src/console/ui/access/provenance.test.ts +12 -0
- package/src/console/ui/access/provenance.ts +29 -0
- package/src/console/ui/access/search.test.ts +17 -0
- package/src/console/ui/access/search.ts +72 -0
- package/src/console/ui/access/types.ts +111 -0
- package/src/console/ui/ai/AiA11yView.tsx +265 -0
- package/src/console/ui/ai/a11y.test.tsx +99 -0
- package/src/console/ui/ai/findings.ts +41 -0
- package/src/console/ui/ai/fixture.ts +182 -0
- package/src/console/ui/ai/format.ts +90 -0
- package/src/console/ui/ai/group.test.ts +37 -0
- package/src/console/ui/ai/group.ts +88 -0
- package/src/console/ui/ai/index.ts +66 -0
- package/src/console/ui/ai/promotion.test.ts +77 -0
- package/src/console/ui/ai/promotion.ts +150 -0
- package/src/console/ui/ai/search.test.ts +40 -0
- package/src/console/ui/ai/search.ts +89 -0
- package/src/console/ui/ai/types.ts +139 -0
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +163 -0
- package/src/console/ui/architecture/a11y.test.tsx +97 -0
- package/src/console/ui/architecture/boundary.ts +42 -0
- package/src/console/ui/architecture/declared.ts +165 -0
- package/src/console/ui/architecture/fixture.ts +74 -0
- package/src/console/ui/architecture/index.ts +84 -0
- package/src/console/ui/architecture/layers.ts +64 -0
- package/src/console/ui/architecture/layout.ts +68 -0
- package/src/console/ui/architecture/pathologies.ts +260 -0
- package/src/console/ui/architecture/search.ts +145 -0
- package/src/console/ui/architecture/traffic.ts +102 -0
- package/src/console/ui/architecture/types.ts +144 -0
- package/src/console/ui/architecture/view.test.ts +165 -0
- package/src/console/ui/architecture/view.ts +516 -0
- package/src/console/ui/channels/ChannelsA11yView.tsx +180 -0
- package/src/console/ui/channels/a11y.test.tsx +96 -0
- package/src/console/ui/channels/confirmation.test.ts +37 -0
- package/src/console/ui/channels/confirmation.ts +27 -0
- package/src/console/ui/channels/fallback.test.ts +15 -0
- package/src/console/ui/channels/fallback.ts +20 -0
- package/src/console/ui/channels/findings.ts +38 -0
- package/src/console/ui/channels/fixture.ts +134 -0
- package/src/console/ui/channels/group.ts +25 -0
- package/src/console/ui/channels/index.ts +57 -0
- package/src/console/ui/channels/locale.test.ts +17 -0
- package/src/console/ui/channels/locale.ts +31 -0
- package/src/console/ui/channels/mask.test.ts +14 -0
- package/src/console/ui/channels/mask.ts +12 -0
- package/src/console/ui/channels/search.ts +58 -0
- package/src/console/ui/channels/taxonomy.test.ts +17 -0
- package/src/console/ui/channels/taxonomy.ts +49 -0
- package/src/console/ui/channels/types.ts +117 -0
- package/src/console/ui/clock/ClockA11yView.tsx +182 -0
- package/src/console/ui/clock/a11y.test.tsx +99 -0
- package/src/console/ui/clock/confirmation.test.ts +32 -0
- package/src/console/ui/clock/confirmation.ts +34 -0
- package/src/console/ui/clock/findings.ts +40 -0
- package/src/console/ui/clock/fixture.ts +111 -0
- package/src/console/ui/clock/health.test.ts +25 -0
- package/src/console/ui/clock/health.ts +61 -0
- package/src/console/ui/clock/index.ts +49 -0
- package/src/console/ui/clock/search.test.ts +39 -0
- package/src/console/ui/clock/search.ts +76 -0
- package/src/console/ui/clock/timeline.test.ts +44 -0
- package/src/console/ui/clock/timeline.ts +41 -0
- package/src/console/ui/clock/types.ts +78 -0
- package/src/console/ui/clock/waiting-on.test.ts +34 -0
- package/src/console/ui/clock/waiting-on.ts +83 -0
- package/src/console/ui/confirmation.unify.test.ts +92 -0
- package/src/console/ui/diff/DiffA11yView.tsx +85 -0
- package/src/console/ui/diff/a11y.test.tsx +99 -0
- package/src/console/ui/diff/fixture.ts +85 -0
- package/src/console/ui/diff/group.test.ts +58 -0
- package/src/console/ui/diff/group.ts +97 -0
- package/src/console/ui/diff/index.ts +38 -0
- package/src/console/ui/diff/search.test.ts +32 -0
- package/src/console/ui/diff/search.ts +75 -0
- package/src/console/ui/diff/summary.ts +74 -0
- package/src/console/ui/diff/types.ts +48 -0
- package/src/console/ui/dist/assets/index-B71Yl_SS.js +10 -0
- package/src/console/ui/dist/assets/panel-access-Dd37LU2c.js +64 -0
- package/src/console/ui/dist/assets/panel-ai-CC7LR6-J.js +1 -0
- package/src/console/ui/dist/assets/panel-architecture-B5b3iKCz.js +1 -0
- package/src/console/ui/dist/assets/panel-channels-CeNjTKXp.js +1 -0
- package/src/console/ui/dist/assets/panel-clock-DgFTLoHV.js +1 -0
- package/src/console/ui/dist/assets/panel-diff-DxehccqB.js +1 -0
- package/src/console/ui/dist/assets/panel-flows-BtrVn-Eg.js +45 -0
- package/src/console/ui/dist/assets/panel-gates-Z9MKRGdH.js +1 -0
- package/src/console/ui/dist/assets/panel-overview-Bd48d9km.js +1 -0
- package/src/console/ui/dist/assets/panel-plugins-DWd0TowH.js +1 -0
- package/src/console/ui/dist/assets/panel-runs-BwsWqKeB.js +1 -0
- package/src/console/ui/dist/assets/panel-signals-9najbZY2.js +1 -0
- package/src/console/ui/dist/assets/panel-store-OHkP2pDp.js +1 -0
- package/src/console/ui/dist/assets/panel-traces-tn2JoY8U.js +1 -0
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +1 -0
- package/src/console/ui/dist/assets/rolldown-runtime-CNC7AqOf.js +1 -0
- package/src/console/ui/dist/assets/style-Cnl7WLya.css +3 -0
- package/src/console/ui/dist/index.html +14 -0
- package/src/console/ui/flows/FlowsA11yView.tsx +155 -0
- package/src/console/ui/flows/a11y.test.tsx +105 -0
- package/src/console/ui/flows/buffer.test.ts +91 -0
- package/src/console/ui/flows/buffer.ts +118 -0
- package/src/console/ui/flows/confirmation.ts +131 -0
- package/src/console/ui/flows/contract.test.ts +89 -0
- package/src/console/ui/flows/contract.ts +353 -0
- package/src/console/ui/flows/fixture.ts +81 -0
- package/src/console/ui/flows/graph.test.ts +101 -0
- package/src/console/ui/flows/graph.ts +549 -0
- package/src/console/ui/flows/index.ts +87 -0
- package/src/console/ui/flows/save-as-test.test.ts +47 -0
- package/src/console/ui/flows/save-as-test.ts +99 -0
- package/src/console/ui/flows/search.ts +255 -0
- package/src/console/ui/flows/tiers.ts +140 -0
- package/src/console/ui/gates/GatesA11yView.tsx +192 -0
- package/src/console/ui/gates/a11y.test.tsx +116 -0
- package/src/console/ui/gates/audit.test.ts +40 -0
- package/src/console/ui/gates/audit.ts +63 -0
- package/src/console/ui/gates/denial.test.ts +36 -0
- package/src/console/ui/gates/denial.ts +51 -0
- package/src/console/ui/gates/findings.ts +19 -0
- package/src/console/ui/gates/fixture.ts +189 -0
- package/src/console/ui/gates/group.test.ts +30 -0
- package/src/console/ui/gates/group.ts +102 -0
- package/src/console/ui/gates/index.ts +47 -0
- package/src/console/ui/gates/search.test.ts +49 -0
- package/src/console/ui/gates/search.ts +115 -0
- package/src/console/ui/gates/types.ts +121 -0
- package/src/console/ui/overview/OverviewA11yView.tsx +152 -0
- package/src/console/ui/overview/a11y.test.tsx +113 -0
- package/src/console/ui/overview/busiest.ts +26 -0
- package/src/console/ui/overview/compose.ts +133 -0
- package/src/console/ui/overview/cost.test.ts +39 -0
- package/src/console/ui/overview/cost.ts +138 -0
- package/src/console/ui/overview/fixture.ts +161 -0
- package/src/console/ui/overview/golden.ts +57 -0
- package/src/console/ui/overview/index.ts +59 -0
- package/src/console/ui/overview/rank.test.ts +136 -0
- package/src/console/ui/overview/rank.ts +210 -0
- package/src/console/ui/overview/slo.test.ts +73 -0
- package/src/console/ui/overview/slo.ts +229 -0
- package/src/console/ui/overview/types.ts +121 -0
- package/src/console/ui/overview/verdict.ts +131 -0
- package/src/console/ui/plugins/PluginsA11yView.tsx +227 -0
- package/src/console/ui/plugins/a11y.test.tsx +97 -0
- package/src/console/ui/plugins/command.test.ts +22 -0
- package/src/console/ui/plugins/command.ts +27 -0
- package/src/console/ui/plugins/findings.ts +39 -0
- package/src/console/ui/plugins/fixture.ts +233 -0
- package/src/console/ui/plugins/group.test.ts +38 -0
- package/src/console/ui/plugins/group.ts +67 -0
- package/src/console/ui/plugins/index.ts +40 -0
- package/src/console/ui/plugins/search.ts +67 -0
- package/src/console/ui/plugins/types.ts +115 -0
- package/src/console/ui/runs/RunsA11yView.tsx +267 -0
- package/src/console/ui/runs/a11y.test.tsx +99 -0
- package/src/console/ui/runs/explain.test.ts +23 -0
- package/src/console/ui/runs/explain.ts +32 -0
- package/src/console/ui/runs/fixture.ts +189 -0
- package/src/console/ui/runs/group.test.ts +24 -0
- package/src/console/ui/runs/group.ts +85 -0
- package/src/console/ui/runs/histogram.test.ts +31 -0
- package/src/console/ui/runs/histogram.ts +85 -0
- package/src/console/ui/runs/index.ts +75 -0
- package/src/console/ui/runs/project.ts +122 -0
- package/src/console/ui/runs/query.test.ts +50 -0
- package/src/console/ui/runs/query.ts +283 -0
- package/src/console/ui/runs/search.test.ts +45 -0
- package/src/console/ui/runs/search.ts +141 -0
- package/src/console/ui/runs/trace-link.test.ts +30 -0
- package/src/console/ui/runs/trace-link.ts +99 -0
- package/src/console/ui/runs/types.ts +137 -0
- package/src/console/ui/shell/App.tsx +56 -0
- package/src/console/ui/shell/client.ts +1715 -0
- package/src/console/ui/shell/components/ui.tsx +110 -0
- package/src/console/ui/shell/index.html +12 -0
- package/src/console/ui/shell/layout/Shell.tsx +95 -0
- package/src/console/ui/shell/main.tsx +281 -0
- package/src/console/ui/shell/panels/Access.tsx +5 -0
- package/src/console/ui/shell/panels/Ai.tsx +5 -0
- package/src/console/ui/shell/panels/Architecture.tsx +5 -0
- package/src/console/ui/shell/panels/Channels.tsx +5 -0
- package/src/console/ui/shell/panels/Clock.tsx +5 -0
- package/src/console/ui/shell/panels/Diff.tsx +5 -0
- package/src/console/ui/shell/panels/Flows.tsx +5 -0
- package/src/console/ui/shell/panels/Gates.tsx +5 -0
- package/src/console/ui/shell/panels/Overview.tsx +6 -0
- package/src/console/ui/shell/panels/Plugins.tsx +5 -0
- package/src/console/ui/shell/panels/Runs.tsx +5 -0
- package/src/console/ui/shell/panels/Signals.tsx +5 -0
- package/src/console/ui/shell/panels/Store.tsx +5 -0
- package/src/console/ui/shell/panels/Traces.tsx +5 -0
- package/src/console/ui/shell/panels/Vault.tsx +5 -0
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +813 -0
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +563 -0
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +377 -0
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +454 -0
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +479 -0
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +275 -0
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +301 -0
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +350 -0
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +502 -0
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +482 -0
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +428 -0
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +413 -0
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +649 -0
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +840 -0
- package/src/console/ui/shell/panels/store/StorePanel.tsx +787 -0
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +539 -0
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +449 -0
- package/src/console/ui/shell/plugin/Sandbox.tsx +29 -0
- package/src/console/ui/shell/setup/Wizard.tsx +189 -0
- package/src/console/ui/shell/styles.css +75 -0
- package/src/console/ui/signals/SignalsA11yView.tsx +276 -0
- package/src/console/ui/signals/a11y.test.tsx +99 -0
- package/src/console/ui/signals/confirmation.test.ts +39 -0
- package/src/console/ui/signals/confirmation.ts +63 -0
- package/src/console/ui/signals/dry-run.test.ts +18 -0
- package/src/console/ui/signals/dry-run.ts +36 -0
- package/src/console/ui/signals/durable.test.ts +22 -0
- package/src/console/ui/signals/durable.ts +41 -0
- package/src/console/ui/signals/findings.ts +33 -0
- package/src/console/ui/signals/fixture.ts +242 -0
- package/src/console/ui/signals/group.test.ts +32 -0
- package/src/console/ui/signals/group.ts +49 -0
- package/src/console/ui/signals/index.ts +52 -0
- package/src/console/ui/signals/monitor.test.ts +30 -0
- package/src/console/ui/signals/monitor.ts +79 -0
- package/src/console/ui/signals/schema-form.test.ts +34 -0
- package/src/console/ui/signals/schema-form.ts +112 -0
- package/src/console/ui/signals/search.ts +102 -0
- package/src/console/ui/signals/types.ts +71 -0
- package/src/console/ui/store/StoreA11yView.tsx +199 -0
- package/src/console/ui/store/a11y.test.tsx +99 -0
- package/src/console/ui/store/cache-view.test.ts +13 -0
- package/src/console/ui/store/cache-view.ts +36 -0
- package/src/console/ui/store/confirmation.test.ts +38 -0
- package/src/console/ui/store/confirmation.ts +55 -0
- package/src/console/ui/store/dry-run.test.ts +15 -0
- package/src/console/ui/store/dry-run.ts +29 -0
- package/src/console/ui/store/fixture.ts +163 -0
- package/src/console/ui/store/group.test.ts +21 -0
- package/src/console/ui/store/group.ts +41 -0
- package/src/console/ui/store/index.ts +40 -0
- package/src/console/ui/store/search.ts +78 -0
- package/src/console/ui/store/types.ts +65 -0
- package/src/console/ui/store/will-not-fire.test.ts +19 -0
- package/src/console/ui/store/will-not-fire.ts +40 -0
- package/src/console/ui/traces/TracesA11yView.tsx +200 -0
- package/src/console/ui/traces/a11y.test.tsx +97 -0
- package/src/console/ui/traces/chain.test.ts +61 -0
- package/src/console/ui/traces/chain.ts +144 -0
- package/src/console/ui/traces/critical-path.test.ts +24 -0
- package/src/console/ui/traces/critical-path.ts +59 -0
- package/src/console/ui/traces/filter.test.ts +78 -0
- package/src/console/ui/traces/filter.ts +112 -0
- package/src/console/ui/traces/fixture.ts +126 -0
- package/src/console/ui/traces/fold.test.ts +67 -0
- package/src/console/ui/traces/fold.ts +170 -0
- package/src/console/ui/traces/index.ts +64 -0
- package/src/console/ui/traces/mini.ts +65 -0
- package/src/console/ui/traces/replay.test.ts +24 -0
- package/src/console/ui/traces/replay.ts +35 -0
- package/src/console/ui/traces/sampling.test.ts +26 -0
- package/src/console/ui/traces/sampling.ts +66 -0
- package/src/console/ui/traces/search.ts +148 -0
- package/src/console/ui/traces/tier.ts +72 -0
- package/src/console/ui/traces/types.ts +125 -0
- package/src/console/ui/tsconfig.json +20 -0
- package/src/console/ui/vault/VaultA11yView.tsx +177 -0
- package/src/console/ui/vault/a11y.test.tsx +97 -0
- package/src/console/ui/vault/blast-radius.test.ts +35 -0
- package/src/console/ui/vault/blast-radius.ts +55 -0
- package/src/console/ui/vault/confirmation.test.ts +41 -0
- package/src/console/ui/vault/confirmation.ts +39 -0
- package/src/console/ui/vault/dormant.test.ts +37 -0
- package/src/console/ui/vault/dormant.ts +28 -0
- package/src/console/ui/vault/export-safe.test.ts +30 -0
- package/src/console/ui/vault/export-safe.ts +65 -0
- package/src/console/ui/vault/fixture.ts +75 -0
- package/src/console/ui/vault/group.test.ts +25 -0
- package/src/console/ui/vault/group.ts +50 -0
- package/src/console/ui/vault/index.ts +45 -0
- package/src/console/ui/vault/search.ts +62 -0
- package/src/console/ui/vault/types.ts +57 -0
- package/src/console/ui/vite.config.ts +84 -0
- package/src/console/xss.gate.test.ts +118 -0
- package/src/docker/compose.ts +226 -0
- package/src/docker/credentials.ts +25 -0
- package/src/docker/derive.ts +83 -0
- package/src/docker/docker.test.ts +185 -0
- package/src/docker/dockerfile.integration.test.ts +170 -0
- package/src/docker/dockerfile.ts +39 -0
- package/src/docker/helpers.ts +103 -0
- package/src/docker/index.ts +52 -0
- package/src/docker/pin.ts +90 -0
- package/src/docker/recipes/index.ts +33 -0
- package/src/docker/recipes/postgres.ts +18 -0
- package/src/docker/recipes/redis.ts +18 -0
- package/src/docker/stack.integration.test.ts +140 -0
- package/src/docker/stack.ts +62 -0
- package/src/docker/types.ts +134 -0
- package/src/drivers/ai-anthropic.ts +128 -0
- package/src/drivers/ai-mock.ts +82 -0
- package/src/drivers/ai-openai-compatible.ts +139 -0
- package/src/drivers/ai-providers.test.ts +163 -0
- package/src/drivers/ai-types.ts +83 -0
- package/src/drivers/bun-native-completeness.test.ts +155 -0
- package/src/drivers/channel-console.ts +118 -0
- package/src/drivers/channel-fcm.ts +96 -0
- package/src/drivers/channel-resend.ts +27 -0
- package/src/drivers/channel-smtp.ts +33 -0
- package/src/drivers/channel-types.ts +160 -0
- package/src/drivers/channel-unifonic.ts +79 -0
- package/src/drivers/channel-wa-cloud.ts +84 -0
- package/src/drivers/channel-webpush.ts +317 -0
- package/src/drivers/conformance.test.ts +89 -0
- package/src/drivers/conformance.ts +162 -0
- package/src/drivers/fs.ts +73 -0
- package/src/drivers/index.ts +194 -0
- package/src/drivers/kv-lua.ts +222 -0
- package/src/drivers/memory.ts +472 -0
- package/src/drivers/pgvector.ts +130 -0
- package/src/drivers/postgres.ts +221 -0
- package/src/drivers/redis.ts +254 -0
- package/src/drivers/s3.ts +129 -0
- package/src/drivers/signal-engine.ts +690 -0
- package/src/drivers/signal-memory.ts +27 -0
- package/src/drivers/signal-nats.ts +131 -0
- package/src/drivers/signal-postgres.ts +1089 -0
- package/src/drivers/signal-redis.ts +275 -0
- package/src/drivers/signal-types.ts +328 -0
- package/src/drivers/sqlite.ts +53 -0
- package/src/drivers/types.ts +334 -0
- package/src/drivers/vault-dotenv-parse.ts +56 -0
- package/src/drivers/vault-env.ts +101 -0
- package/src/drivers/vault-infisical.ts +61 -0
- package/src/drivers/vault-managed.ts +42 -0
- package/src/drivers/vault-memory.ts +38 -0
- package/src/drivers/vault-openbao.ts +80 -0
- package/src/drivers/vault-sops.ts +252 -0
- package/src/drivers/vault-types.ts +84 -0
- package/src/elements/ai/declare.ts +206 -0
- package/src/elements/ai/eval.ts +113 -0
- package/src/elements/ai/pii.ts +108 -0
- package/src/elements/ai/runtime.ts +540 -0
- package/src/elements/ai/schema.ts +194 -0
- package/src/elements/ai.test.ts +393 -0
- package/src/elements/ai.ts +56 -0
- package/src/elements/channel/consent.ts +81 -0
- package/src/elements/channel/costs.test.ts +62 -0
- package/src/elements/channel/costs.ts +130 -0
- package/src/elements/channel/declare.ts +141 -0
- package/src/elements/channel/email-auth.test.ts +47 -0
- package/src/elements/channel/email-auth.ts +109 -0
- package/src/elements/channel/locale.ts +97 -0
- package/src/elements/channel/mask.test.ts +19 -0
- package/src/elements/channel/mask.ts +60 -0
- package/src/elements/channel/mime.ts +23 -0
- package/src/elements/channel/outcomes.test.ts +40 -0
- package/src/elements/channel/outcomes.ts +126 -0
- package/src/elements/channel/receipts.ts +121 -0
- package/src/elements/channel/runtime.ts +500 -0
- package/src/elements/channel/suppression.ts +136 -0
- package/src/elements/channel.test.ts +232 -0
- package/src/elements/channel.ts +109 -0
- package/src/elements/clock/actions.ts +170 -0
- package/src/elements/clock/declare.ts +58 -0
- package/src/elements/clock/dst.ts +197 -0
- package/src/elements/clock/durable.ts +140 -0
- package/src/elements/clock/duration.ts +29 -0
- package/src/elements/clock/health.test.ts +103 -0
- package/src/elements/clock/health.ts +112 -0
- package/src/elements/clock/leader.ts +127 -0
- package/src/elements/clock/reconcile.ts +241 -0
- package/src/elements/clock/runtime.ts +243 -0
- package/src/elements/clock/schedule.ts +262 -0
- package/src/elements/clock/time-travel.ts +53 -0
- package/src/elements/clock.test.ts +365 -0
- package/src/elements/clock.ts +80 -0
- package/src/elements/gate/declare.ts +134 -0
- package/src/elements/gate/permissions.ts +104 -0
- package/src/elements/gate/runtime.ts +177 -0
- package/src/elements/gate/strategies.ts +388 -0
- package/src/elements/gate.test.ts +145 -0
- package/src/elements/gate.ts +41 -0
- package/src/elements/index.ts +169 -0
- package/src/elements/signal/chaos-child.ts +47 -0
- package/src/elements/signal/declare.ts +77 -0
- package/src/elements/signal/dry-run-replay.test.ts +95 -0
- package/src/elements/signal/dry-run-write-isolation.test.ts +94 -0
- package/src/elements/signal/reconcile.test.ts +23 -0
- package/src/elements/signal/reconcile.ts +122 -0
- package/src/elements/signal/runtime.ts +94 -0
- package/src/elements/signal.test.ts +457 -0
- package/src/elements/signal.ts +26 -0
- package/src/elements/store/cache.ts +197 -0
- package/src/elements/store/classify.ts +125 -0
- package/src/elements/store/declare.ts +200 -0
- package/src/elements/store/files-policy.test.ts +31 -0
- package/src/elements/store/files-policy.ts +70 -0
- package/src/elements/store/replica.ts +68 -0
- package/src/elements/store/runtime.ts +393 -0
- package/src/elements/store/sql-condition.ts +205 -0
- package/src/elements/store/sql-session.ts +579 -0
- package/src/elements/store/table.ts +282 -0
- package/src/elements/store.test.ts +370 -0
- package/src/elements/store.ts +99 -0
- package/src/elements/vault/declare.ts +143 -0
- package/src/elements/vault/fingerprint.ts +30 -0
- package/src/elements/vault/redact.ts +52 -0
- package/src/elements/vault/runtime.ts +461 -0
- package/src/elements/vault.test.ts +296 -0
- package/src/elements/vault.ts +44 -0
- package/src/index.ts +183 -0
- package/src/kernel/adopt-routes.ts +194 -0
- package/src/kernel/app.ts +1068 -0
- package/src/kernel/auth-resolve.ts +93 -0
- package/src/kernel/boot.test.ts +173 -0
- package/src/kernel/boot.ts +439 -0
- package/src/kernel/budget-entry.ts +55 -0
- package/src/kernel/budget.test.ts +19 -0
- package/src/kernel/call.test.ts +83 -0
- package/src/kernel/capability.ts +113 -0
- package/src/kernel/dry-run.test.ts +64 -0
- package/src/kernel/dry-run.ts +171 -0
- package/src/kernel/effects.test.ts +89 -0
- package/src/kernel/effects.ts +140 -0
- package/src/kernel/errors.registry.test.ts +39 -0
- package/src/kernel/errors.ts +225 -0
- package/src/kernel/flow.test.ts +154 -0
- package/src/kernel/flow.ts +290 -0
- package/src/kernel/fx.test.ts +245 -0
- package/src/kernel/fx.ts +996 -0
- package/src/kernel/hook-timing.test.ts +72 -0
- package/src/kernel/hook-timing.ts +190 -0
- package/src/kernel/hooks.test.ts +181 -0
- package/src/kernel/hooks.ts +275 -0
- package/src/kernel/index.ts +278 -0
- package/src/kernel/journal.ts +405 -0
- package/src/kernel/journey.ts +75 -0
- package/src/kernel/on.ts +74 -0
- package/src/kernel/pipeline.test.ts +349 -0
- package/src/kernel/pipeline.ts +245 -0
- package/src/kernel/plug.ts +82 -0
- package/src/kernel/plugin/capabilities.test.ts +84 -0
- package/src/kernel/plugin/conflicts.test.ts +106 -0
- package/src/kernel/plugin/decorate.test.ts +111 -0
- package/src/kernel/plugin/scoping.test.ts +138 -0
- package/src/kernel/plugin.ts +485 -0
- package/src/kernel/rate-limit.ts +25 -0
- package/src/kernel/registry.ts +398 -0
- package/src/kernel/router.test.ts +114 -0
- package/src/kernel/router.ts +556 -0
- package/src/kernel/routing-budget.test.ts +19 -0
- package/src/kernel/run-telemetry.ts +70 -0
- package/src/kernel/triggers.ts +324 -0
- package/src/kernel/unit.ts +88 -0
- package/src/manifest/diff.test.ts +866 -0
- package/src/manifest/diff.ts +1670 -0
- package/src/manifest/fixtures/base.manifest.json +112 -0
- package/src/manifest/fixtures/skyport.excerpt.json +51 -0
- package/src/manifest/fixtures/skyport.manifest.json +153 -0
- package/src/manifest/index.ts +27 -0
- package/src/manifest/types.ts +358 -0
- package/src/manifest/undeclared.test.ts +82 -0
- package/src/manifest/undeclared.ts +65 -0
- package/src/manifest/validate.test.ts +105 -0
- package/src/manifest/validate.ts +174 -0
- package/src/mcp/authorization.ts +340 -0
- package/src/mcp/confirmation.ts +174 -0
- package/src/mcp/data.ts +90 -0
- package/src/mcp/index.ts +80 -0
- package/src/mcp/injection.gate.test.ts +176 -0
- package/src/mcp/mcp.test.ts +348 -0
- package/src/mcp/protocol.ts +172 -0
- package/src/mcp/server.ts +283 -0
- package/src/mcp/session.ts +139 -0
- package/src/mcp/tools.ts +391 -0
- package/src/plugins/catalogue.test.ts +48 -0
- package/src/plugins/catalogue.ts +113 -0
- package/src/plugins/node-import-scan.test.ts +28 -0
- package/src/plugins/node-import-scan.ts +98 -0
- package/src/plugins/supply-chain.test.ts +48 -0
- package/src/plugins/supply-chain.ts +460 -0
- package/src/release/index.ts +30 -0
- package/src/release/limits.ts +20 -0
- package/src/release/measure.ts +443 -0
- package/src/release/publish.ts +56 -0
- package/src/runs/bench.test.ts +93 -0
- package/src/runs/collect.ts +144 -0
- package/src/runs/drivers/clickhouse.ts +108 -0
- package/src/runs/drivers/files.ts +201 -0
- package/src/runs/drivers/memory.ts +94 -0
- package/src/runs/drivers/postgres.ts +110 -0
- package/src/runs/duckdb.ts +99 -0
- package/src/runs/index.ts +82 -0
- package/src/runs/outlier.ts +180 -0
- package/src/runs/parquet.ts +210 -0
- package/src/runs/privacy.ts +49 -0
- package/src/runs/runs.test.ts +324 -0
- package/src/runs/runtime.ts +229 -0
- package/src/runs/shred.ts +243 -0
- package/src/runs/telemetry.ts +10 -0
- package/src/runs/types.ts +179 -0
- package/src/runtime/bun.ts +140 -0
- package/src/runtime/cold-start.bench.ts +20 -0
- package/src/runtime/index.ts +46 -0
- package/src/runtime/primitives.ts +242 -0
- package/src/runtime/security.test.ts +170 -0
- package/src/runtime/security.ts +168 -0
- package/src/runtime/serve.test.ts +223 -0
- package/src/runtime/types.ts +217 -0
- package/src/runtime/web-standard.ts +77 -0
- package/src/test/create-test-app.test.ts +161 -0
- package/src/test/create-test-app.ts +533 -0
- package/src/test/index.ts +21 -0
- package/src/test/provisions.integration.test.ts +174 -0
- package/src/upgrade/codemods.test.ts +58 -0
- package/src/upgrade/codemods.ts +83 -0
- package/src/validation/index.ts +23 -0
- package/src/validation/standard-schema.test.ts +96 -0
- package/src/validation/standard-schema.ts +316 -0
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store runtime — binds facet declarations to protocol drivers and produces
|
|
3
|
+
* the handles `fx.store(...)` returns.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Effects, ResourceRef } from "../../manifest/types.ts";
|
|
7
|
+
import type {
|
|
8
|
+
ClassificationMap,
|
|
9
|
+
FilesBucket,
|
|
10
|
+
FilesDriver,
|
|
11
|
+
IndexDriver,
|
|
12
|
+
IndexStore,
|
|
13
|
+
KvDriver,
|
|
14
|
+
KvNamespace,
|
|
15
|
+
SqlConnection,
|
|
16
|
+
SqlDriver,
|
|
17
|
+
SqlRow,
|
|
18
|
+
} from "../../drivers/types.ts";
|
|
19
|
+
import {
|
|
20
|
+
buildClassificationMap,
|
|
21
|
+
type MaskRowsOptions,
|
|
22
|
+
} from "./classify.ts";
|
|
23
|
+
import {
|
|
24
|
+
createStoreCache,
|
|
25
|
+
computedCacheKey,
|
|
26
|
+
parseTtlMs,
|
|
27
|
+
tier1KeysForReads,
|
|
28
|
+
type StoreCache,
|
|
29
|
+
} from "./cache.ts";
|
|
30
|
+
import { resolveSqlTarget, type SqlBindingConfig } from "./replica.ts";
|
|
31
|
+
import { createSqlStoreHandle, type SqlStoreHandle } from "./sql-session.ts";
|
|
32
|
+
import {
|
|
33
|
+
classificationsFromTable,
|
|
34
|
+
type TableHandle,
|
|
35
|
+
} from "./table.ts";
|
|
36
|
+
import type {
|
|
37
|
+
FilesStoreDecl,
|
|
38
|
+
IndexStoreDecl,
|
|
39
|
+
KvStoreDecl,
|
|
40
|
+
SqlStoreDecl,
|
|
41
|
+
StoreDecl,
|
|
42
|
+
} from "./declare.ts";
|
|
43
|
+
|
|
44
|
+
/** Driver bundle wired into a runtime. */
|
|
45
|
+
export interface StoreDriverBundle {
|
|
46
|
+
readonly sql?: SqlDriver;
|
|
47
|
+
readonly kv?: KvDriver;
|
|
48
|
+
readonly files?: FilesDriver;
|
|
49
|
+
readonly index?: IndexDriver;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** SQL binding for one named store. */
|
|
53
|
+
export interface SqlRuntimeBinding extends SqlBindingConfig {
|
|
54
|
+
/** Store declaration name. */
|
|
55
|
+
readonly name: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Options for {@link createStoreRuntime}. */
|
|
59
|
+
export interface CreateStoreRuntimeOptions {
|
|
60
|
+
/** Protocol drivers. */
|
|
61
|
+
readonly drivers: StoreDriverBundle;
|
|
62
|
+
/** SQL bindings keyed by store name. */
|
|
63
|
+
readonly sql?: Readonly<Record<string, SqlRuntimeBinding>>;
|
|
64
|
+
/** KV open options keyed by store name. */
|
|
65
|
+
readonly kv?: Readonly<Record<string, { readonly url?: string; readonly client?: unknown }>>;
|
|
66
|
+
/** Files open options keyed by store name. */
|
|
67
|
+
readonly files?: Readonly<
|
|
68
|
+
Record<string, { readonly root?: string; readonly client?: unknown }>
|
|
69
|
+
>;
|
|
70
|
+
/** Index open options keyed by store name. */
|
|
71
|
+
readonly index?: Readonly<
|
|
72
|
+
Record<string, { readonly dims?: number; readonly url?: string; readonly sql?: SqlConnection }>
|
|
73
|
+
>;
|
|
74
|
+
/** Clock for cache TTLs. */
|
|
75
|
+
readonly now?: () => number;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Per-invocation context when opening a handle through the runtime. */
|
|
79
|
+
export interface StoreInvokeContext {
|
|
80
|
+
/** Flow effects — drive replica routing and cache keys. */
|
|
81
|
+
readonly effects: Effects;
|
|
82
|
+
/** Reveal PII (gated elsewhere). */
|
|
83
|
+
readonly revealPii?: boolean;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Unified handle returned for any facet. */
|
|
87
|
+
export type StoreHandle = SqlStoreHandle | KvStoreFxHandle | FilesStoreFxHandle | IndexStoreFxHandle;
|
|
88
|
+
|
|
89
|
+
/** KV handle on `fx.store`. */
|
|
90
|
+
export interface KvStoreFxHandle {
|
|
91
|
+
readonly ref: `kv:${string}`;
|
|
92
|
+
readonly driverId: "memory" | "redis";
|
|
93
|
+
get(key: string): Promise<unknown>;
|
|
94
|
+
set(key: string, value: unknown, ttl?: string): Promise<void>;
|
|
95
|
+
delete(key: string): Promise<boolean>;
|
|
96
|
+
/**
|
|
97
|
+
* List keys (Console Store browser).
|
|
98
|
+
*
|
|
99
|
+
* @param prefix - Optional prefix filter
|
|
100
|
+
*/
|
|
101
|
+
list(prefix?: string): Promise<string[]>;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Files handle on `fx.store`. */
|
|
105
|
+
export interface FilesStoreFxHandle {
|
|
106
|
+
readonly ref: `files:${string}`;
|
|
107
|
+
readonly driverId: "memory" | "fs" | "s3";
|
|
108
|
+
put(key: string, data: Uint8Array | string): Promise<void>;
|
|
109
|
+
get(key: string): Promise<Uint8Array | null>;
|
|
110
|
+
delete(key: string): Promise<boolean>;
|
|
111
|
+
list(prefix?: string): Promise<string[]>;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Index handle on `fx.store`. */
|
|
115
|
+
export interface IndexStoreFxHandle {
|
|
116
|
+
readonly ref: `index:${string}`;
|
|
117
|
+
readonly driverId: "memory" | "pgvector";
|
|
118
|
+
upsert(
|
|
119
|
+
id: string,
|
|
120
|
+
vector: readonly number[],
|
|
121
|
+
meta?: Record<string, unknown>,
|
|
122
|
+
): Promise<void>;
|
|
123
|
+
search(vector: readonly number[], topK?: number): Promise<
|
|
124
|
+
Array<{ id: string; score: number; meta?: Record<string, unknown> }>
|
|
125
|
+
>;
|
|
126
|
+
delete(id: string): Promise<boolean>;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** Store runtime. */
|
|
130
|
+
export interface StoreRuntime {
|
|
131
|
+
/** Shared multi-tier cache. */
|
|
132
|
+
readonly cache: StoreCache;
|
|
133
|
+
/**
|
|
134
|
+
* Open a handle for a store declaration under the given invoke context.
|
|
135
|
+
*
|
|
136
|
+
* @param decl - Store declaration from `store.sql` / `kv` / …
|
|
137
|
+
* @param ctx - Effects + reveal policy
|
|
138
|
+
*/
|
|
139
|
+
open(decl: StoreDecl, ctx: StoreInvokeContext): Promise<StoreHandle>;
|
|
140
|
+
/**
|
|
141
|
+
* Open by resource ref string.
|
|
142
|
+
*
|
|
143
|
+
* @param ref - `facet:name`
|
|
144
|
+
* @param ctx - Invoke context
|
|
145
|
+
*/
|
|
146
|
+
openRef(ref: ResourceRef, ctx: StoreInvokeContext): Promise<StoreHandle>;
|
|
147
|
+
/**
|
|
148
|
+
* Register a declaration (usually done at module load).
|
|
149
|
+
*
|
|
150
|
+
* @param decl - Declaration to register
|
|
151
|
+
*/
|
|
152
|
+
register(decl: StoreDecl): void;
|
|
153
|
+
/** Registered declarations. */
|
|
154
|
+
readonly declarations: ReadonlyMap<string, StoreDecl>;
|
|
155
|
+
/**
|
|
156
|
+
* After a write flow: invalidate tier-1 keys for written resources.
|
|
157
|
+
*
|
|
158
|
+
* @param effects - Write flow effects
|
|
159
|
+
*/
|
|
160
|
+
onWriteEffects(effects: Effects): ReturnType<StoreCache["invalidateFromEffects"]>;
|
|
161
|
+
/**
|
|
162
|
+
* Seed / remember tier-1 entries for a read flow.
|
|
163
|
+
*
|
|
164
|
+
* @param effects - Read effects
|
|
165
|
+
* @param value - Cached payload
|
|
166
|
+
* @param dimsByResource - Optional key dimensions
|
|
167
|
+
*/
|
|
168
|
+
putTier1(
|
|
169
|
+
effects: Effects,
|
|
170
|
+
value: unknown,
|
|
171
|
+
dimsByResource?: Readonly<Record<string, readonly string[]>>,
|
|
172
|
+
): string[];
|
|
173
|
+
/** Close all open connections. */
|
|
174
|
+
close(): Promise<void>;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Create a store runtime bound to protocol drivers.
|
|
179
|
+
*
|
|
180
|
+
* @param options - Drivers and per-store bindings
|
|
181
|
+
*/
|
|
182
|
+
export function createStoreRuntime(
|
|
183
|
+
options: CreateStoreRuntimeOptions,
|
|
184
|
+
): StoreRuntime {
|
|
185
|
+
const now = options.now ?? (() => Date.now());
|
|
186
|
+
const cache = createStoreCache(now);
|
|
187
|
+
const declarations = new Map<string, StoreDecl>();
|
|
188
|
+
const sqlConns = new Map<string, SqlConnection>();
|
|
189
|
+
const kvNs = new Map<string, KvNamespace>();
|
|
190
|
+
const fileBuckets = new Map<string, FilesBucket>();
|
|
191
|
+
const indexes = new Map<string, IndexStore>();
|
|
192
|
+
|
|
193
|
+
function classificationsFor(decl: SqlStoreDecl): ClassificationMap {
|
|
194
|
+
const nested: Record<string, Record<string, import("../../manifest/types.ts").ColumnClassification>> =
|
|
195
|
+
{ ...(decl.classify ?? {}) };
|
|
196
|
+
if (decl.schema) {
|
|
197
|
+
for (const value of Object.values(decl.schema)) {
|
|
198
|
+
if (value && typeof value === "object" && "columns" in value) {
|
|
199
|
+
const table = value as TableHandle;
|
|
200
|
+
nested[table.name] = {
|
|
201
|
+
...(nested[table.name] ?? {}),
|
|
202
|
+
...classificationsFromTable(table),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return buildClassificationMap(nested);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async function openSql(
|
|
211
|
+
decl: SqlStoreDecl,
|
|
212
|
+
ctx: StoreInvokeContext,
|
|
213
|
+
): Promise<SqlStoreHandle> {
|
|
214
|
+
const binding = options.sql?.[decl.name] ?? {
|
|
215
|
+
name: decl.name,
|
|
216
|
+
primary: { url: ":memory:" },
|
|
217
|
+
};
|
|
218
|
+
const target = resolveSqlTarget(binding, ctx.effects);
|
|
219
|
+
const driver = options.drivers.sql;
|
|
220
|
+
if (!driver) throw new Error("No sql driver configured");
|
|
221
|
+
|
|
222
|
+
const cacheKey = `${decl.name}:${target.role}:${JSON.stringify(target.options.url ?? "")}`;
|
|
223
|
+
let conn = sqlConns.get(cacheKey);
|
|
224
|
+
if (!conn) {
|
|
225
|
+
conn = await driver.connect(target.options);
|
|
226
|
+
sqlConns.set(cacheKey, conn);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return createSqlStoreHandle(`sql:${decl.name}`, {
|
|
230
|
+
connection: conn,
|
|
231
|
+
classifications: classificationsFor(decl),
|
|
232
|
+
revealPii: ctx.revealPii,
|
|
233
|
+
routedRole: target.role,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
async function openKv(decl: KvStoreDecl): Promise<KvStoreFxHandle> {
|
|
238
|
+
const driver = options.drivers.kv;
|
|
239
|
+
if (!driver) throw new Error("No kv driver configured");
|
|
240
|
+
let ns = kvNs.get(decl.name);
|
|
241
|
+
if (!ns) {
|
|
242
|
+
const binding = options.kv?.[decl.name] ?? {};
|
|
243
|
+
ns = await driver.open({
|
|
244
|
+
name: decl.name,
|
|
245
|
+
url: binding.url,
|
|
246
|
+
client: binding.client as never,
|
|
247
|
+
});
|
|
248
|
+
kvNs.set(decl.name, ns);
|
|
249
|
+
}
|
|
250
|
+
const driverId = ns.driverId;
|
|
251
|
+
return {
|
|
252
|
+
ref: `kv:${decl.name}`,
|
|
253
|
+
driverId,
|
|
254
|
+
get: (key) => ns!.get(key),
|
|
255
|
+
set: (key, value, ttl) => ns!.set(key, value, ttl),
|
|
256
|
+
delete: (key) => ns!.delete(key),
|
|
257
|
+
list: (prefix) => ns!.list(prefix),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
async function openFiles(decl: FilesStoreDecl): Promise<FilesStoreFxHandle> {
|
|
262
|
+
const driver = options.drivers.files;
|
|
263
|
+
if (!driver) throw new Error("No files driver configured");
|
|
264
|
+
let bucket = fileBuckets.get(decl.name);
|
|
265
|
+
if (!bucket) {
|
|
266
|
+
const binding = options.files?.[decl.name] ?? {};
|
|
267
|
+
bucket = await driver.open({
|
|
268
|
+
name: decl.name,
|
|
269
|
+
root: binding.root,
|
|
270
|
+
client: binding.client as never,
|
|
271
|
+
});
|
|
272
|
+
fileBuckets.set(decl.name, bucket);
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
ref: `files:${decl.name}`,
|
|
276
|
+
driverId: bucket.driverId,
|
|
277
|
+
put: (key, data) => bucket!.put(key, data),
|
|
278
|
+
get: (key) => bucket!.get(key),
|
|
279
|
+
delete: (key) => bucket!.delete(key),
|
|
280
|
+
list: (prefix) => bucket!.list(prefix),
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
async function openIndex(decl: IndexStoreDecl): Promise<IndexStoreFxHandle> {
|
|
285
|
+
const driver = options.drivers.index;
|
|
286
|
+
if (!driver) throw new Error("No index driver configured");
|
|
287
|
+
let idx = indexes.get(decl.name);
|
|
288
|
+
if (!idx) {
|
|
289
|
+
const binding = options.index?.[decl.name] ?? {};
|
|
290
|
+
idx = await driver.open({
|
|
291
|
+
name: decl.name,
|
|
292
|
+
dims: binding.dims ?? decl.dims ?? 3,
|
|
293
|
+
url: binding.url,
|
|
294
|
+
sql: binding.sql,
|
|
295
|
+
});
|
|
296
|
+
indexes.set(decl.name, idx);
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
ref: `index:${decl.name}`,
|
|
300
|
+
driverId: idx.driverId,
|
|
301
|
+
upsert: (id, vector, meta) => idx!.upsert(id, vector, meta),
|
|
302
|
+
search: (vector, topK) => idx!.search(vector, topK),
|
|
303
|
+
delete: (id) => idx!.delete(id),
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const runtime: StoreRuntime = {
|
|
308
|
+
cache,
|
|
309
|
+
declarations,
|
|
310
|
+
register(decl) {
|
|
311
|
+
declarations.set(`${decl.facet}:${decl.name}`, decl);
|
|
312
|
+
},
|
|
313
|
+
async open(decl, ctx) {
|
|
314
|
+
switch (decl.facet) {
|
|
315
|
+
case "sql":
|
|
316
|
+
return openSql(decl, ctx);
|
|
317
|
+
case "kv":
|
|
318
|
+
return openKv(decl);
|
|
319
|
+
case "files":
|
|
320
|
+
return openFiles(decl);
|
|
321
|
+
case "index":
|
|
322
|
+
return openIndex(decl);
|
|
323
|
+
default: {
|
|
324
|
+
const _exhaustive: never = decl;
|
|
325
|
+
return _exhaustive;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
},
|
|
329
|
+
async openRef(ref, ctx) {
|
|
330
|
+
const decl = declarations.get(ref);
|
|
331
|
+
if (!decl) throw new Error(`Unknown store ref: ${ref}`);
|
|
332
|
+
return this.open(decl, ctx);
|
|
333
|
+
},
|
|
334
|
+
onWriteEffects(effects) {
|
|
335
|
+
return cache.invalidateFromEffects(effects);
|
|
336
|
+
},
|
|
337
|
+
putTier1(effects, value, dimsByResource) {
|
|
338
|
+
const keys = tier1KeysForReads(effects, dimsByResource);
|
|
339
|
+
const resources = effects.reads ?? [];
|
|
340
|
+
for (const key of keys) {
|
|
341
|
+
cache.set({
|
|
342
|
+
tier: 1,
|
|
343
|
+
key,
|
|
344
|
+
value,
|
|
345
|
+
resources,
|
|
346
|
+
expiresAt: null,
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
return keys;
|
|
350
|
+
},
|
|
351
|
+
async close() {
|
|
352
|
+
for (const c of sqlConns.values()) await c.close();
|
|
353
|
+
for (const n of kvNs.values()) await n.close();
|
|
354
|
+
for (const b of fileBuckets.values()) await b.close();
|
|
355
|
+
for (const i of indexes.values()) await i.close();
|
|
356
|
+
sqlConns.clear();
|
|
357
|
+
kvNs.clear();
|
|
358
|
+
fileBuckets.clear();
|
|
359
|
+
indexes.clear();
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
return runtime;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Helper: cache a tier-2 flow result.
|
|
368
|
+
*
|
|
369
|
+
* @param cache - Store cache
|
|
370
|
+
* @param key - Explicit key
|
|
371
|
+
* @param ttl - TTL string
|
|
372
|
+
* @param value - Value
|
|
373
|
+
* @param now - Clock
|
|
374
|
+
*/
|
|
375
|
+
export function putTier2(
|
|
376
|
+
cache: StoreCache,
|
|
377
|
+
key: string,
|
|
378
|
+
ttl: string,
|
|
379
|
+
value: unknown,
|
|
380
|
+
now: () => number = () => Date.now(),
|
|
381
|
+
): void {
|
|
382
|
+
const ms = parseTtlMs(ttl);
|
|
383
|
+
cache.set({
|
|
384
|
+
tier: 2,
|
|
385
|
+
key,
|
|
386
|
+
value,
|
|
387
|
+
resources: [],
|
|
388
|
+
expiresAt: ms > 0 ? now() + ms : null,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
export { computedCacheKey };
|
|
393
|
+
export type { SqlRow, MaskRowsOptions };
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compile Drizzle SQL operators (`eq`, `and`, `lt`, …) and plain equality
|
|
3
|
+
* maps into `WHERE` SQL + bound params for {@link SqlConnection}.
|
|
4
|
+
*
|
|
5
|
+
* Table-agnostic query-builder support — not domain helpers.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/** Equality map for where clauses (`{ code: "sa" }`). */
|
|
9
|
+
export type WhereMap = Readonly<Record<string, unknown>>;
|
|
10
|
+
|
|
11
|
+
/** One compiled predicate (`col op ?`). */
|
|
12
|
+
export interface CompiledPredicate {
|
|
13
|
+
readonly column: string;
|
|
14
|
+
readonly op: "=" | "<" | ">" | "<=" | ">=" | "!=";
|
|
15
|
+
readonly value: unknown;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Compiled WHERE clause. */
|
|
19
|
+
export interface CompiledWhere {
|
|
20
|
+
readonly clause: string;
|
|
21
|
+
readonly params: readonly unknown[];
|
|
22
|
+
readonly predicates: readonly CompiledPredicate[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* True when `value` looks like a Drizzle `SQL` wrapper (`eq` / `and` / …).
|
|
27
|
+
*
|
|
28
|
+
* @param value - Unknown condition
|
|
29
|
+
*/
|
|
30
|
+
export function isDrizzleSql(value: unknown): boolean {
|
|
31
|
+
return (
|
|
32
|
+
typeof value === "object" &&
|
|
33
|
+
value !== null &&
|
|
34
|
+
Array.isArray((value as { queryChunks?: unknown }).queryChunks)
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Compile a where input into SQL.
|
|
40
|
+
*
|
|
41
|
+
* Accepts:
|
|
42
|
+
* - plain {@link WhereMap} equality maps
|
|
43
|
+
* - Drizzle `SQL` from `eq` / `and` / `lt` / …
|
|
44
|
+
*
|
|
45
|
+
* @param where - Condition
|
|
46
|
+
*/
|
|
47
|
+
export function compileWhere(where: unknown): CompiledWhere {
|
|
48
|
+
if (where === undefined || where === null) {
|
|
49
|
+
return { clause: "", params: [], predicates: [] };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (isDrizzleSql(where)) {
|
|
53
|
+
const predicates = extractPredicates(where);
|
|
54
|
+
return predicatesToWhere(predicates);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (typeof where === "object" && !Array.isArray(where)) {
|
|
58
|
+
const predicates: CompiledPredicate[] = Object.entries(
|
|
59
|
+
where as WhereMap,
|
|
60
|
+
).map(([column, value]) => ({
|
|
61
|
+
column,
|
|
62
|
+
op: "=" as const,
|
|
63
|
+
value,
|
|
64
|
+
}));
|
|
65
|
+
return predicatesToWhere(predicates);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
throw new TypeError(
|
|
69
|
+
"sql where: expected equality map or Drizzle SQL condition",
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Turn predicates into `col = ? AND …` form.
|
|
75
|
+
*
|
|
76
|
+
* @param predicates - Ordered predicates
|
|
77
|
+
*/
|
|
78
|
+
function predicatesToWhere(
|
|
79
|
+
predicates: readonly CompiledPredicate[],
|
|
80
|
+
): CompiledWhere {
|
|
81
|
+
if (predicates.length === 0) {
|
|
82
|
+
return { clause: "", params: [], predicates: [] };
|
|
83
|
+
}
|
|
84
|
+
const clause = predicates
|
|
85
|
+
.map((p) => `${quoteIdent(p.column)} ${p.op} ?`)
|
|
86
|
+
.join(" AND ");
|
|
87
|
+
return {
|
|
88
|
+
clause,
|
|
89
|
+
params: predicates.map((p) => p.value),
|
|
90
|
+
predicates,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Walk Drizzle `queryChunks` and collect simple binary comparisons.
|
|
96
|
+
*
|
|
97
|
+
* @param node - Drizzle SQL or nested chunk
|
|
98
|
+
*/
|
|
99
|
+
function extractPredicates(node: unknown): CompiledPredicate[] {
|
|
100
|
+
const out: CompiledPredicate[] = [];
|
|
101
|
+
walk(node, out);
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function walk(node: unknown, out: CompiledPredicate[]): void {
|
|
106
|
+
if (!node || typeof node !== "object") return;
|
|
107
|
+
const chunks = (node as { queryChunks?: unknown[] }).queryChunks;
|
|
108
|
+
if (!Array.isArray(chunks)) return;
|
|
109
|
+
|
|
110
|
+
// Flatten nested SQL wrappers first so we can scan for col / op / param.
|
|
111
|
+
const flat: unknown[] = [];
|
|
112
|
+
for (const c of chunks) {
|
|
113
|
+
if (c && typeof c === "object" && "queryChunks" in (c as object)) {
|
|
114
|
+
walk(c, out);
|
|
115
|
+
} else {
|
|
116
|
+
flat.push(c);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
for (let i = 0; i < flat.length; i++) {
|
|
121
|
+
const col = asColumn(flat[i]);
|
|
122
|
+
if (!col) continue;
|
|
123
|
+
const op = asOperator(flat[i + 1]);
|
|
124
|
+
if (!op) continue;
|
|
125
|
+
const param = asParam(flat[i + 2]);
|
|
126
|
+
if (param === undefined) continue;
|
|
127
|
+
out.push({ column: col, op, value: param });
|
|
128
|
+
i += 2;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function asColumn(chunk: unknown): string | undefined {
|
|
133
|
+
if (!chunk || typeof chunk !== "object") return undefined;
|
|
134
|
+
const name = (chunk as { name?: unknown }).name;
|
|
135
|
+
return typeof name === "string" && name.length > 0 ? name : undefined;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function asOperator(chunk: unknown): CompiledPredicate["op"] | undefined {
|
|
139
|
+
if (!chunk || typeof chunk !== "object") return undefined;
|
|
140
|
+
const value = (chunk as { value?: unknown }).value;
|
|
141
|
+
const text = Array.isArray(value)
|
|
142
|
+
? value.join("")
|
|
143
|
+
: typeof value === "string"
|
|
144
|
+
? value
|
|
145
|
+
: "";
|
|
146
|
+
const trimmed = text.trim();
|
|
147
|
+
switch (trimmed) {
|
|
148
|
+
case "=":
|
|
149
|
+
return "=";
|
|
150
|
+
case "<":
|
|
151
|
+
return "<";
|
|
152
|
+
case ">":
|
|
153
|
+
return ">";
|
|
154
|
+
case "<=":
|
|
155
|
+
return "<=";
|
|
156
|
+
case ">=":
|
|
157
|
+
return ">=";
|
|
158
|
+
case "!=":
|
|
159
|
+
case "<>":
|
|
160
|
+
return "!=";
|
|
161
|
+
default:
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function asParam(chunk: unknown): unknown {
|
|
167
|
+
if (!chunk || typeof chunk !== "object") return undefined;
|
|
168
|
+
if (!("value" in (chunk as object))) return undefined;
|
|
169
|
+
// StringChunk also has `.value` (array of strings) — skip those.
|
|
170
|
+
if (Array.isArray((chunk as { value: unknown }).value)) return undefined;
|
|
171
|
+
if ((chunk as { name?: unknown }).name) return undefined;
|
|
172
|
+
return (chunk as { value: unknown }).value;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Resolve select-projection keys → SQL column names from Drizzle columns.
|
|
177
|
+
*
|
|
178
|
+
* @param columns - `{ alias: table.col }` or undefined for `*`
|
|
179
|
+
*/
|
|
180
|
+
export function resolveSelectColumns(
|
|
181
|
+
columns: unknown,
|
|
182
|
+
): ReadonlyArray<{ readonly alias: string; readonly sqlName: string }> | null {
|
|
183
|
+
if (columns === undefined || columns === null) return null;
|
|
184
|
+
if (typeof columns !== "object" || Array.isArray(columns)) {
|
|
185
|
+
throw new TypeError("select(): expected a column map");
|
|
186
|
+
}
|
|
187
|
+
const out: Array<{ alias: string; sqlName: string }> = [];
|
|
188
|
+
for (const [alias, col] of Object.entries(columns as Record<string, unknown>)) {
|
|
189
|
+
if (col && typeof col === "object" && typeof (col as { name?: unknown }).name === "string") {
|
|
190
|
+
out.push({ alias, sqlName: (col as { name: string }).name });
|
|
191
|
+
} else if (typeof col === "string") {
|
|
192
|
+
out.push({ alias, sqlName: col });
|
|
193
|
+
} else {
|
|
194
|
+
throw new TypeError(`select(): invalid column for ${JSON.stringify(alias)}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return out;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function quoteIdent(name: string): string {
|
|
201
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
|
|
202
|
+
throw new Error(`Invalid SQL identifier: ${name}`);
|
|
203
|
+
}
|
|
204
|
+
return `"${name}"`;
|
|
205
|
+
}
|