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,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol-named store driver contracts.
|
|
3
|
+
*
|
|
4
|
+
* Driver ids are protocols/standards (`postgres`, `redis`, `s3`) — never vendors.
|
|
5
|
+
* Vendor choice lives in `images`, keyed by role.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ColumnClassification, StoreFacet } from "../manifest/types.ts";
|
|
9
|
+
|
|
10
|
+
/** Protocol ids for store drivers in scope. */
|
|
11
|
+
export type StoreDriverId =
|
|
12
|
+
| "sqlite"
|
|
13
|
+
| "postgres"
|
|
14
|
+
| "memory"
|
|
15
|
+
| "redis"
|
|
16
|
+
| "fs"
|
|
17
|
+
| "s3"
|
|
18
|
+
| "pgvector";
|
|
19
|
+
|
|
20
|
+
/** Facets a driver may serve. */
|
|
21
|
+
export type DriverFacet = StoreFacet;
|
|
22
|
+
|
|
23
|
+
/** Connection role for SQL routing. */
|
|
24
|
+
export type SqlRole = "primary" | "replica";
|
|
25
|
+
|
|
26
|
+
/** A SQL row as a plain object. */
|
|
27
|
+
export type SqlRow = Record<string, unknown>;
|
|
28
|
+
|
|
29
|
+
/** Options when opening a SQL connection. */
|
|
30
|
+
export interface SqlConnectOptions {
|
|
31
|
+
/** Connection URL or path (`:memory:`, `file:…`, `postgres://…`). */
|
|
32
|
+
readonly url?: string;
|
|
33
|
+
/** Explicit role (defaults to primary). */
|
|
34
|
+
readonly role?: SqlRole;
|
|
35
|
+
/** Pool / open hint — ignored by memory/sqlite. */
|
|
36
|
+
readonly pool?: { readonly max?: number };
|
|
37
|
+
/**
|
|
38
|
+
* Injected client for tests (Bun.SQL-compatible query fn, or bun:sqlite Database).
|
|
39
|
+
* Production code omits this and binds the native client.
|
|
40
|
+
*/
|
|
41
|
+
readonly client?: unknown;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Low-level SQL connection used by every sql driver. */
|
|
45
|
+
export interface SqlConnection {
|
|
46
|
+
/** Protocol driver id. */
|
|
47
|
+
readonly driverId: "sqlite" | "postgres" | "memory";
|
|
48
|
+
/** Primary vs replica. */
|
|
49
|
+
readonly role: SqlRole;
|
|
50
|
+
/**
|
|
51
|
+
* Run a parameterised query and return rows.
|
|
52
|
+
*
|
|
53
|
+
* @param sql - SQL text with `?` placeholders
|
|
54
|
+
* @param params - Bound parameters
|
|
55
|
+
*/
|
|
56
|
+
query(sql: string, params?: readonly unknown[]): Promise<SqlRow[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Execute a statement (DDL / DML) and return change count when known.
|
|
59
|
+
*
|
|
60
|
+
* @param sql - SQL text with `?` placeholders
|
|
61
|
+
* @param params - Bound parameters
|
|
62
|
+
*/
|
|
63
|
+
exec(sql: string, params?: readonly unknown[]): Promise<{ changes: number }>;
|
|
64
|
+
/** Close the connection. */
|
|
65
|
+
close(): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** SQL driver factory. */
|
|
69
|
+
export interface SqlDriver {
|
|
70
|
+
/** Protocol id. */
|
|
71
|
+
readonly id: "sqlite" | "postgres" | "memory";
|
|
72
|
+
/** Facet this driver serves. */
|
|
73
|
+
readonly facet: "sql";
|
|
74
|
+
/**
|
|
75
|
+
* Open a connection.
|
|
76
|
+
*
|
|
77
|
+
* @param options - URL / role / injected client
|
|
78
|
+
*/
|
|
79
|
+
connect(options?: SqlConnectOptions): Promise<SqlConnection>;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Key-value namespace handle. */
|
|
83
|
+
export interface KvNamespace {
|
|
84
|
+
/** Protocol driver id. */
|
|
85
|
+
readonly driverId: "memory" | "redis";
|
|
86
|
+
/**
|
|
87
|
+
* Read a key.
|
|
88
|
+
*
|
|
89
|
+
* @param key - Entry key
|
|
90
|
+
*/
|
|
91
|
+
get(key: string): Promise<unknown>;
|
|
92
|
+
/**
|
|
93
|
+
* Write a key.
|
|
94
|
+
*
|
|
95
|
+
* @param key - Entry key
|
|
96
|
+
* @param value - JSON-serialisable value
|
|
97
|
+
* @param ttl - Optional TTL string (e.g. `"5m"`) — best-effort
|
|
98
|
+
*/
|
|
99
|
+
set(key: string, value: unknown, ttl?: string): Promise<void>;
|
|
100
|
+
/**
|
|
101
|
+
* Delete a key.
|
|
102
|
+
*
|
|
103
|
+
* @param key - Entry key
|
|
104
|
+
*/
|
|
105
|
+
delete(key: string): Promise<boolean>;
|
|
106
|
+
/**
|
|
107
|
+
* Atomically evaluate a Lua script (redis `EVAL` semantics).
|
|
108
|
+
*
|
|
109
|
+
* Keys are namespaced by the driver. Used by Gate rate strategies.
|
|
110
|
+
*
|
|
111
|
+
* @param script - Lua source
|
|
112
|
+
* @param keys - KEYS table entries (unprefixed)
|
|
113
|
+
* @param args - ARGV table entries
|
|
114
|
+
*/
|
|
115
|
+
eval<T = unknown>(
|
|
116
|
+
script: string,
|
|
117
|
+
keys: readonly string[],
|
|
118
|
+
args?: readonly string[],
|
|
119
|
+
): Promise<T>;
|
|
120
|
+
/**
|
|
121
|
+
* List keys in this namespace, optionally by prefix (Console Store browser).
|
|
122
|
+
*
|
|
123
|
+
* @param prefix - Key prefix filter
|
|
124
|
+
*/
|
|
125
|
+
list(prefix?: string): Promise<string[]>;
|
|
126
|
+
/** Close / release. */
|
|
127
|
+
close(): Promise<void>;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Options when opening a KV namespace. */
|
|
131
|
+
export interface KvOpenOptions {
|
|
132
|
+
/** Namespace name. */
|
|
133
|
+
readonly name: string;
|
|
134
|
+
/** Redis URL when using the redis driver. */
|
|
135
|
+
readonly url?: string;
|
|
136
|
+
/** Injected client for tests. */
|
|
137
|
+
readonly client?: KvClientLike;
|
|
138
|
+
/** Injectable clock for Lua EVAL TTLs (memory / fakes). */
|
|
139
|
+
readonly nowMs?: () => number;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** Minimal Redis-like client used by the redis driver (and test fakes). */
|
|
143
|
+
export interface KvClientLike {
|
|
144
|
+
get(key: string): Promise<string | null>;
|
|
145
|
+
set(key: string, value: string, opts?: { ex?: number }): Promise<unknown>;
|
|
146
|
+
del(...keys: string[]): Promise<number>;
|
|
147
|
+
/**
|
|
148
|
+
* Redis `EVAL` — required for atomic Gate rate strategies.
|
|
149
|
+
*
|
|
150
|
+
* @param script - Lua source
|
|
151
|
+
* @param numkeys - KEYS count
|
|
152
|
+
* @param keysAndArgs - KEYS then ARGV
|
|
153
|
+
*/
|
|
154
|
+
eval?(
|
|
155
|
+
script: string,
|
|
156
|
+
numkeys: number,
|
|
157
|
+
...keysAndArgs: string[]
|
|
158
|
+
): Promise<unknown>;
|
|
159
|
+
/**
|
|
160
|
+
* Raw command send (Bun.RedisClient). Used when `eval` is absent.
|
|
161
|
+
*
|
|
162
|
+
* @param command - Redis command name
|
|
163
|
+
* @param args - Command arguments
|
|
164
|
+
*/
|
|
165
|
+
send?(command: string, args: string[]): Promise<unknown>;
|
|
166
|
+
/**
|
|
167
|
+
* Redis `SCAN` cursor iteration — optional; used for Console key browse.
|
|
168
|
+
*
|
|
169
|
+
* @param cursor - Cursor string
|
|
170
|
+
* @param opts - MATCH / COUNT
|
|
171
|
+
*/
|
|
172
|
+
scan?(
|
|
173
|
+
cursor: string,
|
|
174
|
+
opts?: { readonly match?: string; readonly count?: number },
|
|
175
|
+
): Promise<[string, string[]]>;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** KV driver factory. */
|
|
179
|
+
export interface KvDriver {
|
|
180
|
+
readonly id: "memory" | "redis";
|
|
181
|
+
readonly facet: "kv";
|
|
182
|
+
/**
|
|
183
|
+
* Open a namespace.
|
|
184
|
+
*
|
|
185
|
+
* @param options - Name / URL / client
|
|
186
|
+
*/
|
|
187
|
+
open(options: KvOpenOptions): Promise<KvNamespace>;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Object / file store handle. */
|
|
191
|
+
export interface FilesBucket {
|
|
192
|
+
readonly driverId: "memory" | "fs" | "s3";
|
|
193
|
+
/**
|
|
194
|
+
* Write an object.
|
|
195
|
+
*
|
|
196
|
+
* @param key - Object key
|
|
197
|
+
* @param data - Bytes or UTF-8 string
|
|
198
|
+
*/
|
|
199
|
+
put(key: string, data: Uint8Array | string): Promise<void>;
|
|
200
|
+
/**
|
|
201
|
+
* Read an object.
|
|
202
|
+
*
|
|
203
|
+
* @param key - Object key
|
|
204
|
+
*/
|
|
205
|
+
get(key: string): Promise<Uint8Array | null>;
|
|
206
|
+
/**
|
|
207
|
+
* Delete an object.
|
|
208
|
+
*
|
|
209
|
+
* @param key - Object key
|
|
210
|
+
*/
|
|
211
|
+
delete(key: string): Promise<boolean>;
|
|
212
|
+
/**
|
|
213
|
+
* List object keys, optionally by prefix.
|
|
214
|
+
*
|
|
215
|
+
* @param prefix - Key prefix filter
|
|
216
|
+
*/
|
|
217
|
+
list(prefix?: string): Promise<string[]>;
|
|
218
|
+
/** Close / release. */
|
|
219
|
+
close(): Promise<void>;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/** Options when opening a files bucket. */
|
|
223
|
+
export interface FilesOpenOptions {
|
|
224
|
+
/** Bucket / root name. */
|
|
225
|
+
readonly name: string;
|
|
226
|
+
/** Local root path (`fs`) or S3 bucket name. */
|
|
227
|
+
readonly root?: string;
|
|
228
|
+
/** Injected S3-like client for tests. */
|
|
229
|
+
readonly client?: S3ClientLike;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** Minimal S3-like surface used by the s3 driver (and test fakes). */
|
|
233
|
+
export interface S3ClientLike {
|
|
234
|
+
file(key: string): {
|
|
235
|
+
write(data: Uint8Array | string): Promise<number>;
|
|
236
|
+
arrayBuffer(): Promise<ArrayBuffer>;
|
|
237
|
+
exists(): Promise<boolean>;
|
|
238
|
+
delete(): Promise<void>;
|
|
239
|
+
};
|
|
240
|
+
list(options?: { prefix?: string }): Promise<{
|
|
241
|
+
contents?: Array<{ key?: string }>;
|
|
242
|
+
}>;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/** Files driver factory. */
|
|
246
|
+
export interface FilesDriver {
|
|
247
|
+
readonly id: "memory" | "fs" | "s3";
|
|
248
|
+
readonly facet: "files";
|
|
249
|
+
/**
|
|
250
|
+
* Open a bucket.
|
|
251
|
+
*
|
|
252
|
+
* @param options - Name / root / client
|
|
253
|
+
*/
|
|
254
|
+
open(options: FilesOpenOptions): Promise<FilesBucket>;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/** Vector index hit. */
|
|
258
|
+
export interface IndexHit {
|
|
259
|
+
readonly id: string;
|
|
260
|
+
readonly score: number;
|
|
261
|
+
readonly meta?: Record<string, unknown>;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/** Vector index handle. */
|
|
265
|
+
export interface IndexStore {
|
|
266
|
+
readonly driverId: "memory" | "pgvector";
|
|
267
|
+
/**
|
|
268
|
+
* Upsert a vector.
|
|
269
|
+
*
|
|
270
|
+
* @param id - Document id
|
|
271
|
+
* @param vector - Embedding
|
|
272
|
+
* @param meta - Optional metadata
|
|
273
|
+
*/
|
|
274
|
+
upsert(
|
|
275
|
+
id: string,
|
|
276
|
+
vector: readonly number[],
|
|
277
|
+
meta?: Record<string, unknown>,
|
|
278
|
+
): Promise<void>;
|
|
279
|
+
/**
|
|
280
|
+
* Similarity search (cosine).
|
|
281
|
+
*
|
|
282
|
+
* @param vector - Query embedding
|
|
283
|
+
* @param topK - Max hits
|
|
284
|
+
*/
|
|
285
|
+
search(vector: readonly number[], topK?: number): Promise<IndexHit[]>;
|
|
286
|
+
/**
|
|
287
|
+
* Delete a vector.
|
|
288
|
+
*
|
|
289
|
+
* @param id - Document id
|
|
290
|
+
*/
|
|
291
|
+
delete(id: string): Promise<boolean>;
|
|
292
|
+
/** Close / release. */
|
|
293
|
+
close(): Promise<void>;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/** Options when opening an index. */
|
|
297
|
+
export interface IndexOpenOptions {
|
|
298
|
+
/** Index name. */
|
|
299
|
+
readonly name: string;
|
|
300
|
+
/** Vector dimensions. */
|
|
301
|
+
readonly dims: number;
|
|
302
|
+
/** Postgres URL when using pgvector. */
|
|
303
|
+
readonly url?: string;
|
|
304
|
+
/** Injected SQL connection for pgvector tests. */
|
|
305
|
+
readonly sql?: SqlConnection;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/** Index driver factory. */
|
|
309
|
+
export interface IndexDriver {
|
|
310
|
+
readonly id: "memory" | "pgvector";
|
|
311
|
+
readonly facet: "index";
|
|
312
|
+
/**
|
|
313
|
+
* Open an index.
|
|
314
|
+
*
|
|
315
|
+
* @param options - Name / dims / SQL
|
|
316
|
+
*/
|
|
317
|
+
open(options: IndexOpenOptions): Promise<IndexStore>;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/** Union of all store drivers. */
|
|
321
|
+
export type StoreDriver = SqlDriver | KvDriver | FilesDriver | IndexDriver;
|
|
322
|
+
|
|
323
|
+
/** Table column classification map: `table.column` → classification. */
|
|
324
|
+
export type ClassificationMap = ReadonlyMap<string, ColumnClassification>;
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Build a `table.column` key for classification lookup.
|
|
328
|
+
*
|
|
329
|
+
* @param table - Table name
|
|
330
|
+
* @param column - Column name
|
|
331
|
+
*/
|
|
332
|
+
export function classificationKey(table: string, column: string): string {
|
|
333
|
+
return `${table}.${column}`;
|
|
334
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dotenv-shaped parse/serialise shared by the `env` vault driver and CLI.
|
|
3
|
+
*
|
|
4
|
+
* UI / Console must never call this — resolution belongs to VaultRuntime.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Parse dotenv text into a name → value map.
|
|
9
|
+
*
|
|
10
|
+
* @param text - File contents
|
|
11
|
+
*/
|
|
12
|
+
export function parseDotenv(text: string): Map<string, string> {
|
|
13
|
+
const map = new Map<string, string>();
|
|
14
|
+
for (const line of text.split("\n")) {
|
|
15
|
+
const trimmed = line.trim();
|
|
16
|
+
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
17
|
+
const eq = trimmed.indexOf("=");
|
|
18
|
+
if (eq === -1) continue;
|
|
19
|
+
const key = trimmed.slice(0, eq).trim();
|
|
20
|
+
let value = trimmed.slice(eq + 1).trim();
|
|
21
|
+
if (
|
|
22
|
+
(value.startsWith('"') && value.endsWith('"')) ||
|
|
23
|
+
(value.startsWith("'") && value.endsWith("'"))
|
|
24
|
+
) {
|
|
25
|
+
value = value.slice(1, -1);
|
|
26
|
+
}
|
|
27
|
+
if (key.length > 0) map.set(key, value);
|
|
28
|
+
}
|
|
29
|
+
return map;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Escape a value for dotenv serialisation.
|
|
34
|
+
*
|
|
35
|
+
* @param value - Cleartext
|
|
36
|
+
*/
|
|
37
|
+
export function escapeDotenvValue(value: string): string {
|
|
38
|
+
if (/[\s#"'=\\]/.test(value)) {
|
|
39
|
+
return `"${value.replaceAll("\\", "\\\\").replaceAll('"', '\\"')}"`;
|
|
40
|
+
}
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Serialise a map to dotenv text.
|
|
46
|
+
*
|
|
47
|
+
* @param map - Name → value
|
|
48
|
+
*/
|
|
49
|
+
export function formatDotenv(map: ReadonlyMap<string, string>): string {
|
|
50
|
+
return (
|
|
51
|
+
[...map.entries()]
|
|
52
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
53
|
+
.map(([k, v]) => `${k}=${escapeDotenvValue(v)}`)
|
|
54
|
+
.join("\n") + (map.size > 0 ? "\n" : "")
|
|
55
|
+
);
|
|
56
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `env` vault driver — resolves secrets from the process environment
|
|
3
|
+
* and/or a dotenv file path (`.env.local`, `.env.stack`, …).
|
|
4
|
+
*
|
|
5
|
+
* Resolution order is owned by {@link createVaultRuntime}; this driver only
|
|
6
|
+
* exposes one layer of the chain. Layer identity (`process.env` vs file)
|
|
7
|
+
* is declared on {@link VaultChainLayer.source}.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { parseDotenv, formatDotenv } from "./vault-dotenv-parse.ts";
|
|
11
|
+
import type {
|
|
12
|
+
VaultBag,
|
|
13
|
+
VaultDriver,
|
|
14
|
+
VaultOpenOptions,
|
|
15
|
+
} from "./vault-types.ts";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Create an env vault driver.
|
|
19
|
+
*
|
|
20
|
+
* Reads, in order of precedence for this single layer:
|
|
21
|
+
* 1. `options.env` when provided (tests)
|
|
22
|
+
* 2. dotenv file at `options.path` when provided
|
|
23
|
+
* 3. otherwise `process.env`
|
|
24
|
+
*
|
|
25
|
+
* When both `env` and `path` are omitted, the bag is a snapshot of
|
|
26
|
+
* `process.env` (immutable). When `path` is set, the bag is mutable and
|
|
27
|
+
* persists via {@link VaultBag.set} / {@link VaultBag.delete}.
|
|
28
|
+
*/
|
|
29
|
+
export const envVaultDriver: VaultDriver = {
|
|
30
|
+
id: "env",
|
|
31
|
+
async open(options: VaultOpenOptions = {}): Promise<VaultBag> {
|
|
32
|
+
const prefix = options.envPrefix ?? "";
|
|
33
|
+
const map = new Map<string, string>();
|
|
34
|
+
const mutable = options.path !== undefined && options.env === undefined;
|
|
35
|
+
|
|
36
|
+
if (options.env) {
|
|
37
|
+
fillFromRecord(map, options.env, prefix);
|
|
38
|
+
} else if (options.path) {
|
|
39
|
+
const file = Bun.file(options.path);
|
|
40
|
+
if (await file.exists()) {
|
|
41
|
+
const parsed = parseDotenv(await file.text());
|
|
42
|
+
for (const [key, value] of parsed) {
|
|
43
|
+
if (prefix && !key.startsWith(prefix)) continue;
|
|
44
|
+
const name = prefix ? key.slice(prefix.length) : key;
|
|
45
|
+
if (name.length > 0 && value.length > 0) map.set(name, value);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
fillFromRecord(map, process.env, prefix);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const path = options.path;
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
driverId: "env",
|
|
56
|
+
get(name) {
|
|
57
|
+
return map.get(name);
|
|
58
|
+
},
|
|
59
|
+
names() {
|
|
60
|
+
return [...map.keys()];
|
|
61
|
+
},
|
|
62
|
+
...(mutable
|
|
63
|
+
? {
|
|
64
|
+
set(name: string, value: string) {
|
|
65
|
+
map.set(name, value);
|
|
66
|
+
if (path) {
|
|
67
|
+
void Bun.write(path, formatDotenv(map));
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
delete(name: string) {
|
|
71
|
+
const had = map.delete(name);
|
|
72
|
+
if (had && path) {
|
|
73
|
+
void Bun.write(path, formatDotenv(map));
|
|
74
|
+
}
|
|
75
|
+
return had;
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
: {}),
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Copy string entries from a record into a map, applying an optional prefix.
|
|
85
|
+
*
|
|
86
|
+
* @param map - Destination
|
|
87
|
+
* @param record - Source env-like map
|
|
88
|
+
* @param prefix - Optional key prefix to strip
|
|
89
|
+
*/
|
|
90
|
+
function fillFromRecord(
|
|
91
|
+
map: Map<string, string>,
|
|
92
|
+
record: Readonly<Record<string, string | undefined>>,
|
|
93
|
+
prefix: string,
|
|
94
|
+
): void {
|
|
95
|
+
for (const [key, value] of Object.entries(record)) {
|
|
96
|
+
if (typeof value !== "string" || value.length === 0) continue;
|
|
97
|
+
if (prefix && !key.startsWith(prefix)) continue;
|
|
98
|
+
const name = prefix ? key.slice(prefix.length) : key;
|
|
99
|
+
if (name.length > 0) map.set(name, value);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `infisical` vault driver — Infisical REST secrets API (protocol-shaped).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
VaultBag,
|
|
7
|
+
VaultDriver,
|
|
8
|
+
VaultOpenOptions,
|
|
9
|
+
} from "./vault-types.ts";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Infisical secrets driver.
|
|
13
|
+
*
|
|
14
|
+
* `url` + `token` (+ optional `mount` as project/env path) load secrets at open.
|
|
15
|
+
*/
|
|
16
|
+
export const infisicalVaultDriver: VaultDriver = {
|
|
17
|
+
id: "infisical",
|
|
18
|
+
async open(options: VaultOpenOptions = {}): Promise<VaultBag> {
|
|
19
|
+
const url = options.url?.replace(/\/$/, "");
|
|
20
|
+
const token = options.token;
|
|
21
|
+
const fetchFn = options.fetch ?? globalThis.fetch;
|
|
22
|
+
const map = new Map<string, string>(
|
|
23
|
+
Object.entries(options.secrets ?? {}).filter(
|
|
24
|
+
(e): e is [string, string] => typeof e[1] === "string",
|
|
25
|
+
),
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
if (url && token) {
|
|
29
|
+
try {
|
|
30
|
+
const path = options.mount
|
|
31
|
+
? `${url}/api/v3/secrets/raw?secretPath=${encodeURIComponent(options.mount)}`
|
|
32
|
+
: `${url}/api/v3/secrets/raw`;
|
|
33
|
+
const res = await fetchFn(path, {
|
|
34
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
35
|
+
});
|
|
36
|
+
if (res.ok) {
|
|
37
|
+
const body = (await res.json()) as {
|
|
38
|
+
secrets?: Array<{ secretKey?: string; secretValue?: string }>;
|
|
39
|
+
};
|
|
40
|
+
for (const s of body.secrets ?? []) {
|
|
41
|
+
if (s.secretKey && typeof s.secretValue === "string") {
|
|
42
|
+
map.set(s.secretKey, s.secretValue);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
} catch {
|
|
47
|
+
// Remote unavailable — boot validation reports gaps.
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
driverId: "infisical",
|
|
53
|
+
get(name) {
|
|
54
|
+
return map.get(name);
|
|
55
|
+
},
|
|
56
|
+
names() {
|
|
57
|
+
return [...map.keys()];
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `managed` vault driver — platform-injected secrets (Fly / Railway / K8s).
|
|
3
|
+
*
|
|
4
|
+
* Values arrive as an injected map (or env); OKE never invents a vendor client.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
VaultBag,
|
|
9
|
+
VaultDriver,
|
|
10
|
+
VaultOpenOptions,
|
|
11
|
+
} from "./vault-types.ts";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Managed / platform vault driver.
|
|
15
|
+
*/
|
|
16
|
+
export const managedVaultDriver: VaultDriver = {
|
|
17
|
+
id: "managed",
|
|
18
|
+
async open(options: VaultOpenOptions = {}): Promise<VaultBag> {
|
|
19
|
+
const fromSecrets = Object.entries(options.secrets ?? {}).filter(
|
|
20
|
+
(e): e is [string, string] => typeof e[1] === "string",
|
|
21
|
+
);
|
|
22
|
+
const fromEnv = Object.entries(options.env ?? process.env).filter(
|
|
23
|
+
(e): e is [string, string] => typeof e[1] === "string" && e[1].length > 0,
|
|
24
|
+
);
|
|
25
|
+
const map = new Map<string, string>([...fromEnv, ...fromSecrets]);
|
|
26
|
+
return {
|
|
27
|
+
driverId: "managed",
|
|
28
|
+
get(name) {
|
|
29
|
+
return map.get(name);
|
|
30
|
+
},
|
|
31
|
+
names() {
|
|
32
|
+
return [...map.keys()];
|
|
33
|
+
},
|
|
34
|
+
set(name, value) {
|
|
35
|
+
map.set(name, value);
|
|
36
|
+
},
|
|
37
|
+
delete(name) {
|
|
38
|
+
return map.delete(name);
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory vault driver — tests and deterministic harnesses.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
VaultBag,
|
|
7
|
+
VaultDriver,
|
|
8
|
+
VaultOpenOptions,
|
|
9
|
+
} from "./vault-types.ts";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Create a memory vault driver seeded from `options.secrets`.
|
|
13
|
+
*/
|
|
14
|
+
export const memoryVaultDriver: VaultDriver = {
|
|
15
|
+
id: "memory",
|
|
16
|
+
async open(options: VaultOpenOptions = {}): Promise<VaultBag> {
|
|
17
|
+
const map = new Map<string, string>(
|
|
18
|
+
Object.entries(options.secrets ?? {}).filter(
|
|
19
|
+
(e): e is [string, string] => typeof e[1] === "string",
|
|
20
|
+
),
|
|
21
|
+
);
|
|
22
|
+
return {
|
|
23
|
+
driverId: "memory",
|
|
24
|
+
get(name) {
|
|
25
|
+
return map.get(name);
|
|
26
|
+
},
|
|
27
|
+
names() {
|
|
28
|
+
return [...map.keys()];
|
|
29
|
+
},
|
|
30
|
+
set(name, value) {
|
|
31
|
+
map.set(name, value);
|
|
32
|
+
},
|
|
33
|
+
delete(name) {
|
|
34
|
+
return map.delete(name);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
};
|