okengine 0.2.6 → 0.3.2
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 +33 -30
- package/README.md +74 -340
- package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +40 -9
- package/package.json +47 -44
- package/site/content/docs/ai/llms-txt.mdx +54 -0
- package/site/content/docs/ai/mcp.mdx +123 -0
- package/site/content/docs/ai/meta.json +5 -0
- package/site/content/docs/ai/skills.mdx +53 -0
- package/site/content/docs/console/access.mdx +29 -0
- package/site/content/docs/console/ai.mdx +35 -0
- package/site/content/docs/console/architecture.mdx +35 -0
- package/site/content/docs/console/channels.mdx +37 -0
- package/site/content/docs/console/clock.mdx +31 -0
- package/site/content/docs/console/flows.mdx +31 -0
- package/site/content/docs/console/gates.mdx +35 -0
- package/site/content/docs/console/manifest-diff.mdx +34 -0
- package/site/content/docs/console/meta.json +23 -0
- package/site/content/docs/console/overview.mdx +40 -0
- package/site/content/docs/console/plugins.mdx +41 -0
- package/site/content/docs/console/privacy.mdx +32 -0
- package/site/content/docs/console/runs.mdx +40 -0
- package/site/content/docs/console/signals.mdx +31 -0
- package/site/content/docs/console/store.mdx +32 -0
- package/site/content/docs/console/tenancy.mdx +32 -0
- package/site/content/docs/console/traces.mdx +34 -0
- package/site/content/docs/console/vault.mdx +37 -0
- package/site/content/docs/elements/ai.mdx +180 -0
- package/site/content/docs/elements/channel.mdx +167 -0
- package/site/content/docs/elements/clock.mdx +182 -0
- package/site/content/docs/elements/flow.mdx +288 -0
- package/site/content/docs/elements/gate.mdx +171 -0
- package/site/content/docs/elements/meta.json +5 -0
- package/site/content/docs/elements/signal.mdx +171 -0
- package/site/content/docs/elements/store.mdx +320 -0
- package/site/content/docs/elements/vault.mdx +263 -0
- package/site/content/docs/get-started/basic-usage.mdx +124 -0
- package/site/content/docs/get-started/comparison.mdx +65 -0
- package/site/content/docs/get-started/installation.mdx +113 -0
- package/site/content/docs/get-started/introduction.mdx +123 -0
- package/site/content/docs/get-started/meta.json +5 -0
- package/site/content/docs/index.mdx +63 -0
- package/site/content/docs/meta.json +5 -0
- package/site/content/docs/plugins/compression.mdx +60 -0
- package/site/content/docs/plugins/cors.mdx +92 -0
- package/site/content/docs/plugins/csrf.mdx +96 -0
- package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
- package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
- package/site/content/docs/plugins/meta.json +15 -0
- package/site/content/docs/plugins/security-headers.mdx +136 -0
- package/site/content/docs/reference/cli.md +101 -0
- package/site/content/docs/reference/configuration.mdx +159 -0
- package/site/content/docs/reference/environment-variables.mdx +87 -0
- package/site/content/docs/reference/errors.mdx +80 -0
- package/site/content/docs/reference/fx.mdx +117 -0
- package/site/content/docs/reference/meta.json +5 -0
- package/site/content/docs/reference/plugins.mdx +249 -0
- package/site/content/docs/reference/security.md +63 -0
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +56 -31
- package/src/auth/invoke-as.ts +1 -3
- package/src/auth/operator.ts +8 -26
- package/src/auth/planes.ts +2 -7
- package/src/auth/plugin.ts +4 -7
- package/src/auth/roles.ts +1 -5
- package/src/auth/sessions.ts +10 -39
- package/src/cli/args.ts +1 -5
- package/src/cli/ask-dev-mode.ts +40 -0
- package/src/cli/build.ts +1 -2
- package/src/cli/client-add.test.ts +8 -15
- package/src/cli/client-add.ts +5 -14
- package/src/cli/completion.test.ts +1 -5
- package/src/cli/completion.ts +4 -17
- package/src/cli/db-auto-push.test.ts +64 -0
- package/src/cli/db-auto-push.ts +72 -0
- package/src/cli/db.test.ts +189 -0
- package/src/cli/db.ts +456 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +193 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev-schema-sync.test.ts +66 -0
- package/src/cli/dev-schema-sync.ts +139 -0
- package/src/cli/dev.test.ts +264 -15
- package/src/cli/dev.ts +355 -139
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +27 -8
- package/src/cli/docker.ts +11 -3
- package/src/cli/doctor-diff.test.ts +1 -5
- package/src/cli/doctor-diff.ts +17 -46
- package/src/cli/doctor-pii.ts +2 -7
- package/src/cli/doctor.test.ts +26 -4
- package/src/cli/doctor.ts +35 -11
- package/src/cli/drizzle-env.test.ts +67 -0
- package/src/cli/drizzle-env.ts +78 -0
- package/src/cli/ensure-drizzle-config.ts +50 -0
- package/src/cli/eval.ts +4 -14
- package/src/cli/gates-list.ts +1 -4
- package/src/cli/hero-meta.test.ts +17 -19
- package/src/cli/hero-meta.ts +20 -30
- package/src/cli/images.ts +3 -8
- package/src/cli/index.ts +11 -2
- package/src/cli/load-config.images.test.ts +14 -14
- package/src/cli/load-config.ts +47 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +65 -0
- package/src/cli/openbao-bootstrap.test.ts +147 -0
- package/src/cli/openbao-bootstrap.ts +280 -0
- package/src/cli/openbao-restart.integration.test.ts +136 -0
- package/src/cli/ports.test.ts +7 -14
- package/src/cli/ports.ts +7 -5
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/resolve-dev-sql-env.test.ts +48 -0
- package/src/cli/resolve-dev-sql-env.ts +42 -0
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +8 -10
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/cli/vault-cmd.ts +63 -0
- package/src/client/budget-entry.ts +1 -6
- package/src/client/create.test.ts +6 -12
- package/src/client/create.ts +2 -8
- package/src/client/errors.ts +1 -4
- package/src/client/index.ts +1 -6
- package/src/client/notes-contract.test.ts +4 -13
- package/src/client/transport.ts +9 -30
- package/src/client/types.ts +15 -30
- package/src/compiler/aot.test.ts +2 -9
- package/src/compiler/aot.ts +1 -4
- package/src/compiler/differential.test.ts +3 -11
- package/src/compiler/dynamic.ts +1 -4
- package/src/compiler/effects-infer.ts +8 -34
- package/src/compiler/emit.ts +1 -3
- package/src/compiler/extract.test.ts +136 -30
- package/src/compiler/extract.ts +485 -157
- package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
- package/src/compiler/fixtures/skyport.expected.json +24 -83
- package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
- package/src/compiler/http-parse.ts +2 -9
- package/src/compiler/index.ts +1 -5
- package/src/compiler/response.ts +16 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +55 -34
- package/src/config/index.ts +177 -46
- package/src/config/resolve-driver.test.ts +28 -17
- package/src/console/budget.test.ts +1 -4
- package/src/console/index.ts +1 -4
- package/src/console/server/access.test.ts +15 -43
- package/src/console/server/access.ts +19 -49
- package/src/console/server/ai.test.ts +3 -11
- package/src/console/server/ai.ts +23 -46
- package/src/console/server/app.ts +16 -45
- package/src/console/server/auth-rate.test.ts +4 -12
- package/src/console/server/bind.ts +1 -5
- package/src/console/server/channels.test.ts +2 -6
- package/src/console/server/channels.ts +10 -35
- package/src/console/server/claim.ts +2 -8
- package/src/console/server/clock.test.ts +2 -6
- package/src/console/server/clock.ts +8 -26
- package/src/console/server/console.test.ts +1 -3
- package/src/console/server/diff.test.ts +5 -17
- package/src/console/server/diff.ts +10 -31
- package/src/console/server/dry-run.audit.test.ts +2 -8
- package/src/console/server/flows.ts +64 -233
- package/src/console/server/gates.test.ts +14 -50
- package/src/console/server/gates.ts +13 -48
- package/src/console/server/index.ts +2 -9
- package/src/console/server/live.ts +3 -12
- package/src/console/server/operator-db.test.ts +4 -15
- package/src/console/server/operator-db.ts +13 -32
- package/src/console/server/plugin.ts +50 -53
- package/src/console/server/plugins.test.ts +2 -6
- package/src/console/server/plugins.ts +17 -56
- package/src/console/server/runs-pii.ts +2 -7
- package/src/console/server/security.gate.test.ts +18 -40
- package/src/console/server/serve.ts +10 -25
- package/src/console/server/signals.test.ts +1 -3
- package/src/console/server/signals.ts +17 -40
- package/src/console/server/state.ts +21 -59
- package/src/console/server/store.test.ts +20 -22
- package/src/console/server/store.ts +31 -76
- package/src/console/server/vault.test.ts +12 -29
- package/src/console/server/vault.ts +44 -66
- package/src/console/ui/access/AccessA11yView.tsx +6 -21
- package/src/console/ui/access/a11y.test.tsx +3 -12
- package/src/console/ui/access/acknowledgement.test.ts +1 -4
- package/src/console/ui/access/acknowledgement.ts +1 -3
- package/src/console/ui/access/blast-radius.ts +1 -3
- package/src/console/ui/access/confirmation.test.ts +1 -5
- package/src/console/ui/access/confirmation.ts +1 -4
- package/src/console/ui/access/fixture.ts +1 -5
- package/src/console/ui/access/grantable.test.ts +1 -3
- package/src/console/ui/access/grantable.ts +2 -7
- package/src/console/ui/access/index.ts +2 -9
- package/src/console/ui/access/provenance.test.ts +1 -3
- package/src/console/ui/access/provenance.ts +2 -6
- package/src/console/ui/access/search.test.ts +1 -5
- package/src/console/ui/access/search.ts +2 -6
- package/src/console/ui/ai/AiA11yView.tsx +6 -17
- package/src/console/ui/ai/a11y.test.tsx +2 -5
- package/src/console/ui/ai/fixture.ts +2 -7
- package/src/console/ui/ai/format.ts +1 -3
- package/src/console/ui/ai/group.test.ts +1 -3
- package/src/console/ui/ai/group.ts +4 -12
- package/src/console/ui/ai/index.ts +2 -9
- package/src/console/ui/ai/promotion.test.ts +2 -7
- package/src/console/ui/ai/promotion.ts +4 -13
- package/src/console/ui/ai/search.test.ts +2 -11
- package/src/console/ui/ai/search.ts +3 -13
- package/src/console/ui/ai/types.ts +1 -8
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
- package/src/console/ui/architecture/a11y.test.tsx +1 -2
- package/src/console/ui/architecture/declared.ts +1 -5
- package/src/console/ui/architecture/index.ts +7 -35
- package/src/console/ui/architecture/layout.ts +1 -3
- package/src/console/ui/architecture/pathologies.ts +10 -19
- package/src/console/ui/architecture/search.ts +6 -15
- package/src/console/ui/architecture/traffic.ts +4 -14
- package/src/console/ui/architecture/types.ts +2 -10
- package/src/console/ui/architecture/view.test.ts +7 -19
- package/src/console/ui/architecture/view.ts +9 -36
- package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
- package/src/console/ui/channels/a11y.test.tsx +1 -2
- package/src/console/ui/channels/confirmation.test.ts +1 -4
- package/src/console/ui/channels/confirmation.ts +1 -4
- package/src/console/ui/channels/findings.ts +1 -5
- package/src/console/ui/channels/index.ts +2 -8
- package/src/console/ui/channels/locale.test.ts +1 -3
- package/src/console/ui/channels/locale.ts +2 -8
- package/src/console/ui/channels/search.ts +4 -13
- package/src/console/ui/channels/taxonomy.ts +1 -3
- package/src/console/ui/clock/ClockA11yView.tsx +9 -26
- package/src/console/ui/clock/a11y.test.tsx +2 -5
- package/src/console/ui/clock/confirmation.test.ts +1 -3
- package/src/console/ui/clock/confirmation.ts +1 -4
- package/src/console/ui/clock/findings.ts +1 -4
- package/src/console/ui/clock/health.ts +2 -7
- package/src/console/ui/clock/index.ts +2 -10
- package/src/console/ui/clock/search.test.ts +1 -3
- package/src/console/ui/clock/search.ts +2 -6
- package/src/console/ui/clock/timeline.test.ts +1 -3
- package/src/console/ui/clock/waiting-on.test.ts +1 -5
- package/src/console/ui/clock/waiting-on.ts +2 -7
- package/src/console/ui/diff/DiffA11yView.tsx +8 -17
- package/src/console/ui/diff/a11y.test.tsx +2 -5
- package/src/console/ui/diff/group.test.ts +3 -13
- package/src/console/ui/diff/group.ts +2 -8
- package/src/console/ui/diff/index.ts +2 -8
- package/src/console/ui/diff/search.test.ts +1 -5
- package/src/console/ui/diff/search.ts +4 -16
- package/src/console/ui/diff/summary.ts +1 -2
- package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
- package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
- package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
- package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
- package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
- package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
- package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
- package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
- package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
- package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
- package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
- package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
- package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
- package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
- package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
- package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
- package/src/console/ui/dist/index.html +1 -1
- package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
- package/src/console/ui/flows/a11y.test.tsx +2 -8
- package/src/console/ui/flows/buffer.test.ts +3 -11
- package/src/console/ui/flows/buffer.ts +4 -11
- package/src/console/ui/flows/confirmation.ts +1 -3
- package/src/console/ui/flows/contract.test.ts +3 -7
- package/src/console/ui/flows/contract.ts +12 -36
- package/src/console/ui/flows/graph.test.ts +3 -11
- package/src/console/ui/flows/graph.ts +5 -15
- package/src/console/ui/flows/index.ts +1 -6
- package/src/console/ui/flows/save-as-test.ts +1 -3
- package/src/console/ui/flows/search.ts +8 -25
- package/src/console/ui/flows/tiers.ts +2 -9
- package/src/console/ui/gates/GatesA11yView.tsx +4 -13
- package/src/console/ui/gates/a11y.test.tsx +2 -5
- package/src/console/ui/gates/audit.ts +1 -3
- package/src/console/ui/gates/denial.test.ts +1 -3
- package/src/console/ui/gates/denial.ts +4 -12
- package/src/console/ui/gates/findings.ts +1 -3
- package/src/console/ui/gates/group.test.ts +3 -3
- package/src/console/ui/gates/group.ts +3 -11
- package/src/console/ui/gates/index.ts +2 -10
- package/src/console/ui/gates/search.ts +3 -10
- package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
- package/src/console/ui/overview/a11y.test.tsx +1 -2
- package/src/console/ui/overview/busiest.ts +1 -3
- package/src/console/ui/overview/compose.ts +1 -13
- package/src/console/ui/overview/cost.ts +34 -38
- package/src/console/ui/overview/fixture.ts +21 -26
- package/src/console/ui/overview/golden.ts +4 -14
- package/src/console/ui/overview/index.ts +2 -9
- package/src/console/ui/overview/rank.test.ts +3 -10
- package/src/console/ui/overview/rank.ts +2 -7
- package/src/console/ui/overview/slo.test.ts +5 -9
- package/src/console/ui/overview/slo.ts +6 -23
- package/src/console/ui/overview/verdict.ts +3 -10
- package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
- package/src/console/ui/plugins/a11y.test.tsx +1 -2
- package/src/console/ui/plugins/fixture.ts +2 -4
- package/src/console/ui/plugins/group.test.ts +1 -3
- package/src/console/ui/plugins/group.ts +1 -6
- package/src/console/ui/plugins/index.ts +3 -13
- package/src/console/ui/plugins/search.ts +7 -19
- package/src/console/ui/runs/RunsA11yView.tsx +5 -20
- package/src/console/ui/runs/a11y.test.tsx +2 -5
- package/src/console/ui/runs/explain.ts +2 -6
- package/src/console/ui/runs/group.ts +3 -12
- package/src/console/ui/runs/histogram.test.ts +2 -11
- package/src/console/ui/runs/histogram.ts +1 -4
- package/src/console/ui/runs/index.ts +4 -18
- package/src/console/ui/runs/project.ts +2 -6
- package/src/console/ui/runs/query.test.ts +1 -3
- package/src/console/ui/runs/query.ts +12 -35
- package/src/console/ui/runs/search.ts +5 -19
- package/src/console/ui/runs/trace-link.test.ts +2 -6
- package/src/console/ui/runs/trace-link.ts +4 -16
- package/src/console/ui/runs/types.ts +1 -3
- package/src/console/ui/shell/App.tsx +2 -10
- package/src/console/ui/shell/client.ts +22 -115
- package/src/console/ui/shell/components/ui.tsx +1 -4
- package/src/console/ui/shell/layout/Shell.tsx +2 -4
- package/src/console/ui/shell/main.tsx +31 -96
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
- package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
- package/src/console/ui/shell/setup/Wizard.tsx +3 -5
- package/src/console/ui/shell/styles.css +1 -2
- package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
- package/src/console/ui/signals/a11y.test.tsx +2 -5
- package/src/console/ui/signals/confirmation.test.ts +1 -5
- package/src/console/ui/signals/confirmation.ts +2 -6
- package/src/console/ui/signals/dry-run.ts +1 -3
- package/src/console/ui/signals/durable.ts +1 -3
- package/src/console/ui/signals/findings.ts +1 -3
- package/src/console/ui/signals/group.test.ts +2 -8
- package/src/console/ui/signals/group.ts +2 -10
- package/src/console/ui/signals/index.ts +1 -4
- package/src/console/ui/signals/monitor.ts +2 -7
- package/src/console/ui/signals/schema-form.test.ts +3 -14
- package/src/console/ui/signals/schema-form.ts +1 -4
- package/src/console/ui/signals/search.ts +4 -13
- package/src/console/ui/store/StoreA11yView.tsx +3 -9
- package/src/console/ui/store/a11y.test.tsx +2 -5
- package/src/console/ui/store/confirmation.test.ts +1 -3
- package/src/console/ui/store/confirmation.ts +1 -4
- package/src/console/ui/store/dry-run.ts +2 -5
- package/src/console/ui/store/fixture.ts +1 -2
- package/src/console/ui/store/group.test.ts +1 -6
- package/src/console/ui/store/group.ts +1 -4
- package/src/console/ui/store/index.ts +1 -5
- package/src/console/ui/store/search.ts +2 -6
- package/src/console/ui/store/will-not-fire.ts +1 -2
- package/src/console/ui/traces/TracesA11yView.tsx +10 -29
- package/src/console/ui/traces/a11y.test.tsx +1 -2
- package/src/console/ui/traces/chain.test.ts +5 -19
- package/src/console/ui/traces/chain.ts +1 -3
- package/src/console/ui/traces/critical-path.test.ts +1 -3
- package/src/console/ui/traces/critical-path.ts +2 -6
- package/src/console/ui/traces/filter.test.ts +2 -6
- package/src/console/ui/traces/filter.ts +5 -13
- package/src/console/ui/traces/fold.test.ts +4 -12
- package/src/console/ui/traces/fold.ts +1 -3
- package/src/console/ui/traces/mini.ts +1 -3
- package/src/console/ui/traces/replay.test.ts +1 -3
- package/src/console/ui/traces/replay.ts +1 -3
- package/src/console/ui/traces/sampling.ts +1 -4
- package/src/console/ui/traces/search.ts +4 -17
- package/src/console/ui/traces/tier.ts +1 -3
- package/src/console/ui/vault/VaultA11yView.tsx +5 -17
- package/src/console/ui/vault/a11y.test.tsx +1 -2
- package/src/console/ui/vault/blast-radius.ts +1 -3
- package/src/console/ui/vault/confirmation.test.ts +1 -5
- package/src/console/ui/vault/confirmation.ts +1 -4
- package/src/console/ui/vault/dormant.test.ts +1 -4
- package/src/console/ui/vault/export-safe.test.ts +1 -5
- package/src/console/ui/vault/export-safe.ts +1 -4
- package/src/console/ui/vault/fixture.ts +3 -3
- package/src/console/ui/vault/group.ts +1 -2
- package/src/console/ui/vault/index.ts +2 -10
- package/src/console/ui/vault/search.ts +2 -6
- package/src/console/ui/vault/types.ts +1 -1
- package/src/console/xss.gate.test.ts +1 -3
- package/src/docker/compose.ts +215 -27
- package/src/docker/derive.ts +6 -14
- package/src/docker/docker.test.ts +118 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +9 -6
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +6 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/openbao.ts +47 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +11 -2
- package/src/docker/recipes/rustfs.ts +32 -0
- package/src/docker/stack-id.test.ts +73 -5
- package/src/docker/stack-id.ts +124 -33
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/stack.ts +36 -4
- package/src/docker/types.ts +16 -4
- package/src/docs-origin.ts +4 -4
- package/src/drivers/ai-anthropic.ts +5 -14
- package/src/drivers/ai-mock.ts +2 -5
- package/src/drivers/ai-openai-compatible.ts +4 -10
- package/src/drivers/ai-providers.test.ts +6 -13
- package/src/drivers/bun-native-completeness.test.ts +6 -15
- package/src/drivers/channel-console.ts +6 -7
- package/src/drivers/channel-fcm.ts +20 -30
- package/src/drivers/channel-resend.ts +1 -3
- package/src/drivers/channel-smtp.ts +2 -6
- package/src/drivers/channel-types.ts +2 -12
- package/src/drivers/channel-unifonic.ts +2 -6
- package/src/drivers/channel-wa-cloud.ts +2 -6
- package/src/drivers/channel-webpush.ts +21 -60
- package/src/drivers/conformance.test.ts +2 -10
- package/src/drivers/conformance.ts +8 -21
- package/src/drivers/drizzle-dialect.test.ts +20 -0
- package/src/drivers/drizzle-dialect.ts +37 -0
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -57
- package/src/drivers/memory.ts +287 -75
- package/src/drivers/pgvector.ts +7 -11
- package/src/drivers/postgres.ts +7 -13
- package/src/drivers/redis.ts +13 -37
- package/src/drivers/s3.ts +15 -18
- package/src/drivers/signal-engine.ts +12 -49
- package/src/drivers/signal-memory.ts +2 -8
- package/src/drivers/signal-nats.ts +4 -9
- package/src/drivers/signal-postgres.ts +62 -129
- package/src/drivers/signal-redis.ts +7 -21
- package/src/drivers/signal-types.ts +1 -4
- package/src/drivers/sqlite.ts +3 -12
- package/src/drivers/types.ts +4 -23
- package/src/drivers/vault-driver-removal.test.ts +55 -0
- package/src/drivers/vault-env.ts +2 -6
- package/src/drivers/vault-infisical.ts +1 -5
- package/src/drivers/vault-managed.ts +1 -5
- package/src/drivers/vault-memory.ts +1 -5
- package/src/drivers/vault-openbao.test.ts +97 -0
- package/src/drivers/vault-openbao.ts +103 -40
- package/src/drivers/vault-types.ts +3 -16
- package/src/elements/ai/declare.ts +4 -14
- package/src/elements/ai/eval.ts +2 -6
- package/src/elements/ai/pii.ts +1 -3
- package/src/elements/ai/runtime.ts +12 -50
- package/src/elements/ai/schema.ts +4 -15
- package/src/elements/ai.test.ts +13 -24
- package/src/elements/ai.ts +1 -5
- package/src/elements/channel/consent.ts +3 -12
- package/src/elements/channel/costs.ts +4 -15
- package/src/elements/channel/declare.ts +1 -4
- package/src/elements/channel/email-auth.ts +1 -4
- package/src/elements/channel/locale.ts +2 -10
- package/src/elements/channel/mask.ts +1 -3
- package/src/elements/channel/mime.ts +2 -12
- package/src/elements/channel/outcomes.test.ts +1 -5
- package/src/elements/channel/outcomes.ts +5 -15
- package/src/elements/channel/receipts.ts +2 -7
- package/src/elements/channel/runtime.ts +28 -74
- package/src/elements/channel/suppression.ts +8 -14
- package/src/elements/channel.test.ts +8 -31
- package/src/elements/channel.ts +3 -14
- package/src/elements/clock/actions.ts +6 -18
- package/src/elements/clock/declare.ts +1 -3
- package/src/elements/clock/dst.ts +1 -5
- package/src/elements/clock/durable.ts +4 -16
- package/src/elements/clock/health.ts +2 -7
- package/src/elements/clock/leader.ts +2 -9
- package/src/elements/clock/reconcile.ts +4 -15
- package/src/elements/clock/runtime.ts +2 -5
- package/src/elements/clock/schedule.ts +4 -20
- package/src/elements/clock.test.ts +2 -7
- package/src/elements/clock.ts +5 -23
- package/src/elements/gate/permissions.ts +1 -4
- package/src/elements/gate/runtime.ts +7 -28
- package/src/elements/gate.ts +1 -5
- package/src/elements/index.ts +9 -7
- package/src/elements/signal/declare.ts +2 -7
- package/src/elements/signal/reconcile.test.ts +1 -4
- package/src/elements/signal/runtime.ts +1 -3
- package/src/elements/signal.test.ts +3 -15
- package/src/elements/signal.ts +2 -8
- package/src/elements/store/cache.test.ts +46 -0
- package/src/elements/store/cache.ts +3 -11
- package/src/elements/store/classify.ts +5 -22
- package/src/elements/store/declare.ts +11 -17
- package/src/elements/store/domain-ddl.test.ts +86 -0
- package/src/elements/store/emit-drizzle.ts +363 -0
- package/src/elements/store/files-policy.test.ts +1 -5
- package/src/elements/store/files-policy.ts +4 -12
- package/src/elements/store/load-plugin-tables.ts +103 -0
- package/src/elements/store/missing-relation.test.ts +83 -0
- package/src/elements/store/missing-relation.ts +38 -0
- package/src/elements/store/replica.ts +1 -4
- package/src/elements/store/resource-list-docs.fixture.ts +56 -0
- package/src/elements/store/resource-list-docs.test.ts +79 -0
- package/src/elements/store/resource.test.ts +253 -0
- package/src/elements/store/resource.ts +786 -0
- package/src/elements/store/runtime.ts +25 -28
- package/src/elements/store/schema-decl.test.ts +227 -0
- package/src/elements/store/schema-decl.ts +516 -0
- package/src/elements/store/sql-condition.test.ts +132 -0
- package/src/elements/store/sql-condition.ts +293 -65
- package/src/elements/store/sql-session.test.ts +135 -0
- package/src/elements/store/sql-session.ts +241 -84
- package/src/elements/store/table.ts +69 -23
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +53 -31
- package/src/elements/vault/chain.ts +34 -0
- package/src/elements/vault/declare.ts +22 -32
- package/src/elements/vault/fingerprint.ts +2 -7
- package/src/elements/vault/redact.ts +2 -6
- package/src/elements/vault/runtime.ts +19 -33
- package/src/elements/vault.test.ts +12 -55
- package/src/elements/vault.ts +9 -13
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +92 -118
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.test.ts +60 -0
- package/src/kernel/boot-bind/channel.ts +61 -5
- package/src/kernel/boot-bind/clock.ts +2 -6
- package/src/kernel/boot-bind/gate.ts +2 -8
- package/src/kernel/boot-bind/runs.ts +1 -3
- package/src/kernel/boot-bind/signal.ts +3 -10
- package/src/kernel/boot-bind/store.test.ts +27 -18
- package/src/kernel/boot-bind/store.ts +93 -52
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -10
- package/src/kernel/boot.ts +30 -77
- package/src/kernel/budget.test.ts +1 -3
- package/src/kernel/capability.ts +3 -10
- package/src/kernel/dry-run.test.ts +1 -4
- package/src/kernel/dry-run.ts +3 -11
- package/src/kernel/edge.test.ts +68 -0
- package/src/kernel/effects.test.ts +1 -5
- package/src/kernel/effects.ts +4 -11
- package/src/kernel/errors.registry.test.ts +2 -8
- package/src/kernel/errors.ts +23 -32
- package/src/kernel/flow.test.ts +12 -25
- package/src/kernel/flow.ts +13 -25
- package/src/kernel/fx.test.ts +31 -40
- package/src/kernel/fx.ts +135 -90
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +43 -10
- package/src/kernel/hooks.ts +25 -12
- package/src/kernel/index.ts +11 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +45 -9
- package/src/kernel/pipeline.test.ts +10 -19
- package/src/kernel/pipeline.ts +5 -17
- package/src/kernel/plug.ts +4 -11
- package/src/kernel/plugin/conflicts.test.ts +13 -25
- package/src/kernel/plugin/decorate.test.ts +8 -13
- package/src/kernel/plugin/scoping.test.ts +4 -11
- package/src/kernel/plugin.ts +81 -27
- package/src/kernel/registry-isolation.test.ts +74 -0
- package/src/kernel/registry.ts +102 -30
- package/src/kernel/router.test.ts +15 -13
- package/src/kernel/router.ts +9 -29
- package/src/kernel/routing-budget.test.ts +1 -3
- package/src/kernel/run-telemetry.ts +1 -3
- package/src/kernel/triggers.ts +63 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/fixtures/skyport.excerpt.json +1 -1
- package/src/manifest/fixtures/skyport.manifest.json +1 -1
- package/src/manifest/index.ts +3 -10
- package/src/manifest/types.ts +30 -6
- package/src/manifest/undeclared.test.ts +4 -12
- package/src/manifest/undeclared.ts +1 -2
- package/src/manifest/validate.test.ts +2 -6
- package/src/manifest/validate.ts +5 -15
- package/src/mcp/authorization.ts +8 -27
- package/src/mcp/confirmation.ts +3 -10
- package/src/mcp/data.ts +2 -6
- package/src/mcp/docs-index.ts +4 -7
- package/src/mcp/docs-mcp.test.ts +3 -12
- package/src/mcp/docs-server.ts +7 -27
- package/src/mcp/docs-tools.ts +2 -6
- package/src/mcp/index.ts +1 -6
- package/src/mcp/injection.gate.test.ts +4 -18
- package/src/mcp/mcp.test.ts +18 -49
- package/src/mcp/protocol.ts +3 -10
- package/src/mcp/server.ts +11 -52
- package/src/mcp/session.ts +4 -14
- package/src/mcp/tools.ts +14 -50
- package/src/plugins/catalogue.test.ts +3 -7
- package/src/plugins/catalogue.ts +1 -3
- package/src/plugins/compression.test.ts +127 -0
- package/src/plugins/compression.ts +94 -0
- package/src/plugins/config-source.test.ts +204 -0
- package/src/plugins/config-source.ts +209 -0
- package/src/plugins/cors.test.ts +138 -0
- package/src/plugins/cors.ts +129 -0
- package/src/plugins/csrf.test.ts +102 -0
- package/src/plugins/csrf.ts +86 -0
- package/src/plugins/headers.ts +54 -0
- package/src/plugins/index.ts +26 -0
- package/src/plugins/ip-allowlist.test.ts +105 -0
- package/src/plugins/ip-allowlist.ts +76 -0
- package/src/plugins/maintenance-mode.test.ts +91 -0
- package/src/plugins/maintenance-mode.ts +85 -0
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/security-headers.test.ts +243 -0
- package/src/plugins/security-headers.ts +255 -0
- package/src/plugins/supply-chain.ts +5 -17
- package/src/release/exports.ts +3 -8
- package/src/release/measure.exports.test.ts +1 -3
- package/src/release/measure.ts +16 -45
- package/src/runs/bench.test.ts +1 -3
- package/src/runs/collect.ts +8 -25
- package/src/runs/drivers/clickhouse.ts +2 -9
- package/src/runs/drivers/files.ts +9 -31
- package/src/runs/drivers/memory.ts +5 -22
- package/src/runs/drivers/postgres.ts +8 -20
- package/src/runs/duckdb.ts +2 -8
- package/src/runs/index.ts +3 -14
- package/src/runs/outlier.ts +3 -10
- package/src/runs/parquet.ts +8 -26
- package/src/runs/privacy.ts +2 -8
- package/src/runs/runs.test.ts +3 -9
- package/src/runs/runtime.ts +7 -32
- package/src/runs/shred.ts +10 -29
- package/src/runs/types.ts +1 -4
- package/src/runtime/bun.ts +4 -15
- package/src/runtime/cold-start.bench.ts +1 -3
- package/src/runtime/dev-request-log.test.ts +1 -4
- package/src/runtime/dev-request-log.ts +1 -4
- package/src/runtime/index.ts +1 -6
- package/src/runtime/primitives.ts +5 -4
- package/src/runtime/security.ts +3 -13
- package/src/runtime/serve.test.ts +4 -7
- package/src/runtime/types.ts +1 -4
- package/src/runtime/web-standard.ts +3 -15
- package/src/term.test.ts +4 -6
- package/src/term.ts +49 -98
- package/src/test/create-test-app.test.ts +4 -14
- package/src/test/create-test-app.ts +27 -33
- package/src/test/provisions.integration.test.ts +3 -11
- package/src/upgrade/codemods.test.ts +25 -6
- package/src/upgrade/codemods.ts +116 -3
- package/src/validation/standard-schema.test.ts +2 -5
- package/src/validation/standard-schema.ts +13 -33
- package/docs/spec/console.md +0 -739
- package/docs/spec/example.md +0 -1196
- package/docs/spec/four-applications.md +0 -1195
- package/docs/spec/unified-theory.md +0 -489
- package/src/cli/doc-drift.test.ts +0 -146
- package/src/cli/doc-drift.ts +0 -430
- package/src/cli/doctor-diff-examples.ts +0 -92
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
- package/src/drivers/vault-sops.ts +0 -271
|
@@ -27,15 +27,10 @@ import type {
|
|
|
27
27
|
*
|
|
28
28
|
* @param url - Optional Redis URL
|
|
29
29
|
*/
|
|
30
|
-
export function createBunSignalRedisClient(
|
|
31
|
-
url
|
|
32
|
-
): SignalRedisClientLike {
|
|
33
|
-
const redis =
|
|
34
|
-
url !== undefined ? new Bun.RedisClient(url) : Bun.redis;
|
|
30
|
+
export function createBunSignalRedisClient(url?: string): SignalRedisClientLike {
|
|
31
|
+
const redis = url !== undefined ? new Bun.RedisClient(url) : Bun.redis;
|
|
35
32
|
/** Subscribe blocks a connection — keep a dedicated client. */
|
|
36
|
-
let sub:
|
|
37
|
-
| InstanceType<typeof Bun.RedisClient>
|
|
38
|
-
| undefined;
|
|
33
|
+
let sub: InstanceType<typeof Bun.RedisClient> | undefined;
|
|
39
34
|
|
|
40
35
|
function subClient(): InstanceType<typeof Bun.RedisClient> {
|
|
41
36
|
if (!sub) {
|
|
@@ -127,16 +122,10 @@ export function parseXreadgroupReply(
|
|
|
127
122
|
* In-memory redis-protocol fake for signal streams + pub/sub.
|
|
128
123
|
*/
|
|
129
124
|
export function createSignalRedisFake(): SignalRedisClientLike & {
|
|
130
|
-
readonly streams: Map<
|
|
131
|
-
string,
|
|
132
|
-
Array<{ id: string; fields: Record<string, string> }>
|
|
133
|
-
>;
|
|
125
|
+
readonly streams: Map<string, Array<{ id: string; fields: Record<string, string> }>>;
|
|
134
126
|
readonly published: Array<{ channel: string; message: string }>;
|
|
135
127
|
} {
|
|
136
|
-
const streams = new Map<
|
|
137
|
-
string,
|
|
138
|
-
Array<{ id: string; fields: Record<string, string> }>
|
|
139
|
-
>();
|
|
128
|
+
const streams = new Map<string, Array<{ id: string; fields: Record<string, string> }>>();
|
|
140
129
|
const groups = new Map<string, Set<string>>();
|
|
141
130
|
const claimed = new Map<string, Set<string>>();
|
|
142
131
|
const subs = new Map<string, Set<(message: string) => void>>();
|
|
@@ -210,9 +199,7 @@ export function createSignalRedisFake(): SignalRedisClientLike & {
|
|
|
210
199
|
*
|
|
211
200
|
* @param options - Declarations / redis client / durable outbox path
|
|
212
201
|
*/
|
|
213
|
-
export async function openRedisSignal(
|
|
214
|
-
options: SignalOpenOptions,
|
|
215
|
-
): Promise<SignalBus> {
|
|
202
|
+
export async function openRedisSignal(options: SignalOpenOptions): Promise<SignalBus> {
|
|
216
203
|
// Same DI shape as postgres/redis/s3: inject a client in tests; production
|
|
217
204
|
// binds Bun.redis (Streams via send until Bun ships typed xadd).
|
|
218
205
|
const redis = options.redis ?? createBunSignalRedisClient();
|
|
@@ -255,8 +242,7 @@ export async function openRedisSignal(
|
|
|
255
242
|
rollback: () => tx.rollback(),
|
|
256
243
|
};
|
|
257
244
|
},
|
|
258
|
-
subscribe: (signal, subscriberId, handler) =>
|
|
259
|
-
outbox.subscribe(signal, subscriberId, handler),
|
|
245
|
+
subscribe: (signal, subscriberId, handler) => outbox.subscribe(signal, subscriberId, handler),
|
|
260
246
|
live: (signal, handler) => outbox.live(signal, handler),
|
|
261
247
|
drain: () => outbox.drain(),
|
|
262
248
|
deadLetters: (s) => outbox.deadLetters(s),
|
|
@@ -229,10 +229,7 @@ export interface SignalRedisClientLike {
|
|
|
229
229
|
): Promise<Array<{ id: string; fields: Record<string, string> }>>;
|
|
230
230
|
xack(key: string, group: string, id: string): Promise<number>;
|
|
231
231
|
publish(channel: string, message: string): Promise<number>;
|
|
232
|
-
subscribe(
|
|
233
|
-
channel: string,
|
|
234
|
-
listener: (message: string) => void,
|
|
235
|
-
): Promise<() => void>;
|
|
232
|
+
subscribe(channel: string, listener: (message: string) => void): Promise<() => void>;
|
|
236
233
|
}
|
|
237
234
|
|
|
238
235
|
/** Minimal NATS / JetStream surface. */
|
package/src/drivers/sqlite.ts
CHANGED
|
@@ -3,26 +3,17 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { Database, type SQLQueryBindings } from "bun:sqlite";
|
|
6
|
-
import type {
|
|
7
|
-
SqlConnectOptions,
|
|
8
|
-
SqlConnection,
|
|
9
|
-
SqlDriver,
|
|
10
|
-
SqlRow,
|
|
11
|
-
} from "./types.ts";
|
|
6
|
+
import type { SqlConnectOptions, SqlConnection, SqlDriver, SqlRow } from "./types.ts";
|
|
12
7
|
|
|
13
8
|
/**
|
|
14
9
|
* Open a bun:sqlite connection implementing {@link SqlConnection}.
|
|
15
10
|
*
|
|
16
11
|
* @param options - URL (`:memory:` / path) or injected Database
|
|
17
12
|
*/
|
|
18
|
-
export async function connectSqlite(
|
|
19
|
-
options: SqlConnectOptions = {},
|
|
20
|
-
): Promise<SqlConnection> {
|
|
13
|
+
export async function connectSqlite(options: SqlConnectOptions = {}): Promise<SqlConnection> {
|
|
21
14
|
const role = options.role ?? "primary";
|
|
22
15
|
const db =
|
|
23
|
-
options.client instanceof Database
|
|
24
|
-
? options.client
|
|
25
|
-
: new Database(options.url ?? ":memory:");
|
|
16
|
+
options.client instanceof Database ? options.client : new Database(options.url ?? ":memory:");
|
|
26
17
|
|
|
27
18
|
function asBindings(params: readonly unknown[]): SQLQueryBindings[] {
|
|
28
19
|
return params as SQLQueryBindings[];
|
package/src/drivers/types.ts
CHANGED
|
@@ -8,14 +8,7 @@
|
|
|
8
8
|
import type { ColumnClassification, StoreFacet } from "../manifest/types.ts";
|
|
9
9
|
|
|
10
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";
|
|
11
|
+
export type StoreDriverId = "sqlite" | "postgres" | "memory" | "redis" | "fs" | "s3" | "pgvector";
|
|
19
12
|
|
|
20
13
|
/** Facets a driver may serve. */
|
|
21
14
|
export type DriverFacet = StoreFacet;
|
|
@@ -112,11 +105,7 @@ export interface KvNamespace {
|
|
|
112
105
|
* @param keys - KEYS table entries (unprefixed)
|
|
113
106
|
* @param args - ARGV table entries
|
|
114
107
|
*/
|
|
115
|
-
eval<T = unknown>(
|
|
116
|
-
script: string,
|
|
117
|
-
keys: readonly string[],
|
|
118
|
-
args?: readonly string[],
|
|
119
|
-
): Promise<T>;
|
|
108
|
+
eval<T = unknown>(script: string, keys: readonly string[], args?: readonly string[]): Promise<T>;
|
|
120
109
|
/**
|
|
121
110
|
* List keys in this namespace, optionally by prefix (Console Store browser).
|
|
122
111
|
*
|
|
@@ -151,11 +140,7 @@ export interface KvClientLike {
|
|
|
151
140
|
* @param numkeys - KEYS count
|
|
152
141
|
* @param keysAndArgs - KEYS then ARGV
|
|
153
142
|
*/
|
|
154
|
-
eval?(
|
|
155
|
-
script: string,
|
|
156
|
-
numkeys: number,
|
|
157
|
-
...keysAndArgs: string[]
|
|
158
|
-
): Promise<unknown>;
|
|
143
|
+
eval?(script: string, numkeys: number, ...keysAndArgs: string[]): Promise<unknown>;
|
|
159
144
|
/**
|
|
160
145
|
* Raw command send (Bun.RedisClient). Used when `eval` is absent.
|
|
161
146
|
*
|
|
@@ -271,11 +256,7 @@ export interface IndexStore {
|
|
|
271
256
|
* @param vector - Embedding
|
|
272
257
|
* @param meta - Optional metadata
|
|
273
258
|
*/
|
|
274
|
-
upsert(
|
|
275
|
-
id: string,
|
|
276
|
-
vector: readonly number[],
|
|
277
|
-
meta?: Record<string, unknown>,
|
|
278
|
-
): Promise<void>;
|
|
259
|
+
upsert(id: string, vector: readonly number[], meta?: Record<string, unknown>): Promise<void>;
|
|
279
260
|
/**
|
|
280
261
|
* Similarity search (cosine).
|
|
281
262
|
*
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gate: the removed vault driver id stays gone from the tracked tree.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors {@link ../cli/doc-staleness.test.ts} — `git grep` must find zero
|
|
5
|
+
* hits (this file splits the token so it never matches itself).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { describe, expect, test } from "bun:test";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
|
|
11
|
+
const ROOT = join(import.meta.dir, "../..");
|
|
12
|
+
|
|
13
|
+
/** Forbidden driver id, split so this file does not match itself. */
|
|
14
|
+
const FORBIDDEN_DRIVER = ["so", "ps"].join("");
|
|
15
|
+
/** Forbidden optional peer, split so this file does not match itself. */
|
|
16
|
+
const FORBIDDEN_AGE = ["age", "-", "encryption"].join("");
|
|
17
|
+
|
|
18
|
+
/** Lockfiles regenerated by `bun install` — not source residue. */
|
|
19
|
+
const LOCKFILE_PREFIXES = ["bun.lock:", "packages/create-oke/template/bun.lock:"];
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Run `git grep -F` and assert zero matches outside allow-listed prefixes.
|
|
23
|
+
*
|
|
24
|
+
* @param pattern - Fixed-string pattern
|
|
25
|
+
* @param ignorePrefixes - `path:line:` prefixes to ignore
|
|
26
|
+
*/
|
|
27
|
+
function assertZeroGitGrep(pattern: string, ignorePrefixes: readonly string[] = []): void {
|
|
28
|
+
const proc = Bun.spawnSync(["git", "grep", "-F", "-i", "-n", "-e", pattern, "--"], {
|
|
29
|
+
cwd: ROOT,
|
|
30
|
+
stdout: "pipe",
|
|
31
|
+
stderr: "pipe",
|
|
32
|
+
});
|
|
33
|
+
// git grep exits 1 when there are no matches.
|
|
34
|
+
if (proc.exitCode === 1) {
|
|
35
|
+
expect(proc.stdout.toString()).toBe("");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const hits = proc.stdout
|
|
39
|
+
.toString()
|
|
40
|
+
.trim()
|
|
41
|
+
.split("\n")
|
|
42
|
+
.filter((line) => line.length > 0)
|
|
43
|
+
.filter((line) => !ignorePrefixes.some((prefix) => line.startsWith(prefix)));
|
|
44
|
+
expect(hits.join("\n")).toBe("");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
describe("removed vault driver gate", () => {
|
|
48
|
+
test("tracked tree has zero matches for the removed driver id", () => {
|
|
49
|
+
assertZeroGitGrep(FORBIDDEN_DRIVER);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("tracked tree has zero matches for the removed age peer outside lockfiles", () => {
|
|
53
|
+
assertZeroGitGrep(FORBIDDEN_AGE, LOCKFILE_PREFIXES);
|
|
54
|
+
});
|
|
55
|
+
});
|
package/src/drivers/vault-env.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `env` vault driver — resolves secrets from the process environment
|
|
3
|
-
* and/or a dotenv file path (`.env.local`, `.env.
|
|
3
|
+
* and/or a dotenv file path (`.env.local`, `.env.docker`, …).
|
|
4
4
|
*
|
|
5
5
|
* Resolution order is owned by {@link createVaultRuntime}; this driver only
|
|
6
6
|
* exposes one layer of the chain. Layer identity (`process.env` vs file)
|
|
@@ -8,11 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { parseDotenv, formatDotenv } from "./vault-dotenv-parse.ts";
|
|
11
|
-
import type {
|
|
12
|
-
VaultBag,
|
|
13
|
-
VaultDriver,
|
|
14
|
-
VaultOpenOptions,
|
|
15
|
-
} from "./vault-types.ts";
|
|
11
|
+
import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
|
|
16
12
|
|
|
17
13
|
/**
|
|
18
14
|
* Create an env vault driver.
|
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
* `infisical` vault driver — Infisical REST secrets API (protocol-shaped).
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type {
|
|
6
|
-
VaultBag,
|
|
7
|
-
VaultDriver,
|
|
8
|
-
VaultOpenOptions,
|
|
9
|
-
} from "./vault-types.ts";
|
|
5
|
+
import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
|
|
10
6
|
|
|
11
7
|
/**
|
|
12
8
|
* Infisical secrets driver.
|
|
@@ -4,11 +4,7 @@
|
|
|
4
4
|
* Values arrive as an injected map (or env); OKE never invents a vendor client.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type {
|
|
8
|
-
VaultBag,
|
|
9
|
-
VaultDriver,
|
|
10
|
-
VaultOpenOptions,
|
|
11
|
-
} from "./vault-types.ts";
|
|
7
|
+
import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
|
|
12
8
|
|
|
13
9
|
/**
|
|
14
10
|
* Managed / platform vault driver.
|
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
* In-memory vault driver — tests and deterministic harnesses.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type {
|
|
6
|
-
VaultBag,
|
|
7
|
-
VaultDriver,
|
|
8
|
-
VaultOpenOptions,
|
|
9
|
-
} from "./vault-types.ts";
|
|
5
|
+
import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
|
|
10
6
|
|
|
11
7
|
/**
|
|
12
8
|
* Create a memory vault driver seeded from `options.secrets`.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenBao vault driver — KV v2 read + write/delete + fail-loud semantics.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, expect, test } from "bun:test";
|
|
6
|
+
import { OpenBaoUnavailableError, openbaoVaultDriver } from "./vault-openbao.ts";
|
|
7
|
+
|
|
8
|
+
/** Scripted fetch: LIST + per-key GET, then capture writes/deletes. */
|
|
9
|
+
function fakeKv(
|
|
10
|
+
seed: Record<string, string>,
|
|
11
|
+
calls: { method: string; path: string; body?: string }[],
|
|
12
|
+
) {
|
|
13
|
+
return (async (input: string | URL | Request, init?: RequestInit) => {
|
|
14
|
+
const url = new URL(String(input));
|
|
15
|
+
const method = init?.method ?? "GET";
|
|
16
|
+
calls.push({
|
|
17
|
+
method,
|
|
18
|
+
path: url.pathname + url.search,
|
|
19
|
+
body: typeof init?.body === "string" ? init.body : undefined,
|
|
20
|
+
});
|
|
21
|
+
const mount = "/v1/secret";
|
|
22
|
+
if (method === "GET" && url.pathname === `${mount}/metadata`) {
|
|
23
|
+
return Response.json({ data: { keys: Object.keys(seed) } });
|
|
24
|
+
}
|
|
25
|
+
if (method === "GET" && url.pathname.startsWith(`${mount}/data/`)) {
|
|
26
|
+
const name = decodeURIComponent(url.pathname.slice(`${mount}/data/`.length));
|
|
27
|
+
if (!(name in seed)) return new Response("{}", { status: 404 });
|
|
28
|
+
return Response.json({ data: { data: { value: seed[name] } } });
|
|
29
|
+
}
|
|
30
|
+
if (method === "POST" && url.pathname.startsWith(`${mount}/data/`)) {
|
|
31
|
+
return new Response(null, { status: 204 });
|
|
32
|
+
}
|
|
33
|
+
if (method === "DELETE" && url.pathname.startsWith(`${mount}/data/`)) {
|
|
34
|
+
return new Response(null, { status: 204 });
|
|
35
|
+
}
|
|
36
|
+
return new Response("{}", { status: 404 });
|
|
37
|
+
}) as typeof globalThis.fetch;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
describe("openbao vault driver", () => {
|
|
41
|
+
test("LIST + GET loads all keys", async () => {
|
|
42
|
+
const calls: { method: string; path: string; body?: string }[] = [];
|
|
43
|
+
const bag = await openbaoVaultDriver.open({
|
|
44
|
+
url: "http://127.0.0.1:8200",
|
|
45
|
+
token: "app-tok",
|
|
46
|
+
fetch: fakeKv({ STRIPE_KEY: "sk_live", DATABASE_URL: "postgres://x" }, calls),
|
|
47
|
+
});
|
|
48
|
+
expect(bag.get("STRIPE_KEY")).toBe("sk_live");
|
|
49
|
+
expect([...bag.names()].sort()).toEqual(["DATABASE_URL", "STRIPE_KEY"]);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("set POSTs KV v2 data payload", async () => {
|
|
53
|
+
const calls: { method: string; path: string; body?: string }[] = [];
|
|
54
|
+
const bag = await openbaoVaultDriver.open({
|
|
55
|
+
url: "http://127.0.0.1:8200",
|
|
56
|
+
token: "app-tok",
|
|
57
|
+
fetch: fakeKv({ STRIPE_KEY: "sk_live" }, calls),
|
|
58
|
+
});
|
|
59
|
+
bag.set?.("STRIPE_KEY", "sk_rotated");
|
|
60
|
+
await Bun.sleep(0);
|
|
61
|
+
const writeCall = calls.find((c) => c.method === "POST");
|
|
62
|
+
expect(writeCall?.path).toBe("/v1/secret/data/STRIPE_KEY");
|
|
63
|
+
expect(writeCall?.body).toBe(JSON.stringify({ data: { value: "sk_rotated" } }));
|
|
64
|
+
expect(bag.get("STRIPE_KEY")).toBe("sk_rotated");
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("unreachable remote fails loud (no soft-empty bag)", async () => {
|
|
68
|
+
let failed: unknown;
|
|
69
|
+
try {
|
|
70
|
+
await openbaoVaultDriver.open({
|
|
71
|
+
url: "http://127.0.0.1:9",
|
|
72
|
+
token: "app-tok",
|
|
73
|
+
fetch: (async () => {
|
|
74
|
+
throw new Error("connect ECONNREFUSED");
|
|
75
|
+
}) as unknown as typeof globalThis.fetch,
|
|
76
|
+
});
|
|
77
|
+
} catch (err) {
|
|
78
|
+
failed = err;
|
|
79
|
+
}
|
|
80
|
+
expect(failed).toBeInstanceOf(OpenBaoUnavailableError);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test("sealed / 5xx on GET fails loud", async () => {
|
|
84
|
+
const fetchFn = (async (input: string | URL | Request) => {
|
|
85
|
+
const url = String(input);
|
|
86
|
+
if (url.includes("metadata")) return Response.json({ data: { keys: ["STRIPE_KEY"] } });
|
|
87
|
+
return new Response("sealed", { status: 503 });
|
|
88
|
+
}) as typeof globalThis.fetch;
|
|
89
|
+
let failed: unknown;
|
|
90
|
+
try {
|
|
91
|
+
await openbaoVaultDriver.open({ url: "http://127.0.0.1:8200", token: "t", fetch: fetchFn });
|
|
92
|
+
} catch (err) {
|
|
93
|
+
failed = err;
|
|
94
|
+
}
|
|
95
|
+
expect(failed).toBeInstanceOf(OpenBaoUnavailableError);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
@@ -1,25 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `openbao` vault driver —
|
|
2
|
+
* `openbao` vault driver — OpenBao (Vault-compatible) KV v2 HTTP API.
|
|
3
3
|
*
|
|
4
4
|
* Protocol-named; image/vendor choice lives in `images`.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
|
|
8
|
+
|
|
9
|
+
/** Error thrown when the remote OpenBao is unreachable / sealed / errors. */
|
|
10
|
+
export class OpenBaoUnavailableError extends Error {
|
|
11
|
+
constructor(message: string) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "OpenBaoUnavailableError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
12
16
|
|
|
13
17
|
/**
|
|
14
|
-
* OpenBao
|
|
18
|
+
* OpenBao KV-v2 bag. Reads are loaded at open when `url` + `token` resolve;
|
|
19
|
+
* writes (`set` / `delete`) hit the HTTP API directly.
|
|
15
20
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* or returns empty until {@link VaultBag.get} is called against a remote.
|
|
21
|
+
* When `url` and `token` are provided, an unreachable, sealed, or erroring
|
|
22
|
+
* OpenBao is **fatal** (fail-loud) — the bag never silently degrades to an
|
|
23
|
+
* empty / seed-only view.
|
|
20
24
|
*
|
|
21
25
|
* For boot validation the runtime passes declared names; this driver loads
|
|
22
|
-
* all keys under `mount` when the LIST API is available, else
|
|
26
|
+
* all keys under `mount` when the LIST API is available, else falls back to
|
|
27
|
+
* GETs for the seed names.
|
|
23
28
|
*/
|
|
24
29
|
export const openbaoVaultDriver: VaultDriver = {
|
|
25
30
|
id: "openbao",
|
|
@@ -34,36 +39,60 @@ export const openbaoVaultDriver: VaultDriver = {
|
|
|
34
39
|
),
|
|
35
40
|
);
|
|
36
41
|
|
|
37
|
-
|
|
38
|
-
|
|
42
|
+
const remote = url !== undefined && token !== undefined;
|
|
43
|
+
let mutableRemote = false;
|
|
44
|
+
|
|
45
|
+
if (remote && url !== undefined && token !== undefined) {
|
|
46
|
+
const headers = { "X-Vault-Token": token };
|
|
47
|
+
const base = `${url}/v1/${mount}`;
|
|
48
|
+
|
|
49
|
+
async function listNames(): Promise<string[]> {
|
|
50
|
+
const res = await fetchFn(`${base}/metadata?list=true`, { headers });
|
|
51
|
+
if (!res.ok) return [];
|
|
52
|
+
const body = (await res.json()) as { data?: { keys?: string[] } };
|
|
53
|
+
return (body.data?.keys ?? []).map((k) => k.replace(/\/$/, ""));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function readName(name: string): Promise<boolean> {
|
|
57
|
+
const res = await fetchFn(`${base}/data/${encodeURIComponent(name)}`, { headers });
|
|
58
|
+
if (res.status === 404) return false;
|
|
59
|
+
if (!res.ok) {
|
|
60
|
+
throw new OpenBaoUnavailableError(
|
|
61
|
+
`openbao vault: GET ${name} failed (${res.status}) — sealed or unauthorized?`,
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
const body = (await res.json()) as { data?: { data?: Record<string, unknown> } };
|
|
65
|
+
const data = body.data?.data ?? {};
|
|
66
|
+
const value =
|
|
67
|
+
typeof data.value === "string"
|
|
68
|
+
? data.value
|
|
69
|
+
: typeof data[name] === "string"
|
|
70
|
+
? (data[name] as string)
|
|
71
|
+
: JSON.stringify(data);
|
|
72
|
+
map.set(name, value);
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// LIST when the token has metadata list; otherwise only fetch the
|
|
77
|
+
// seed/declared names so a least-privilege token still works. A
|
|
78
|
+
// connection-level failure here must never degrade to an empty bag.
|
|
79
|
+
let names: string[] = [];
|
|
39
80
|
try {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
};
|
|
47
|
-
for (const key of body.data?.keys ?? []) {
|
|
48
|
-
const getRes = await fetchFn(`${url}/v1/${mount}/data/${key}`, {
|
|
49
|
-
headers: { "X-Vault-Token": token },
|
|
50
|
-
});
|
|
51
|
-
if (!getRes.ok) continue;
|
|
52
|
-
const got = (await getRes.json()) as {
|
|
53
|
-
data?: { data?: Record<string, unknown> };
|
|
54
|
-
};
|
|
55
|
-
const data = got.data?.data ?? {};
|
|
56
|
-
const value =
|
|
57
|
-
typeof data.value === "string"
|
|
58
|
-
? data.value
|
|
59
|
-
: typeof data[key] === "string"
|
|
60
|
-
? (data[key] as string)
|
|
61
|
-
: JSON.stringify(data);
|
|
62
|
-
map.set(key.replace(/\/$/, ""), value);
|
|
63
|
-
}
|
|
81
|
+
names = await listNames();
|
|
82
|
+
} catch (err) {
|
|
83
|
+
if (map.size === 0) {
|
|
84
|
+
throw new OpenBaoUnavailableError(
|
|
85
|
+
`openbao vault: unreachable at ${url} — ${err instanceof Error ? err.message : String(err)}`,
|
|
86
|
+
);
|
|
64
87
|
}
|
|
65
|
-
|
|
66
|
-
|
|
88
|
+
// Fall through: LIST denied but we still have declared names to GET.
|
|
89
|
+
}
|
|
90
|
+
if (names.length > 0) {
|
|
91
|
+
for (const key of names) await readName(key);
|
|
92
|
+
mutableRemote = true;
|
|
93
|
+
} else if (map.size > 0) {
|
|
94
|
+
for (const name of map.keys()) await readName(name);
|
|
95
|
+
mutableRemote = true;
|
|
67
96
|
}
|
|
68
97
|
}
|
|
69
98
|
|
|
@@ -75,6 +104,40 @@ export const openbaoVaultDriver: VaultDriver = {
|
|
|
75
104
|
names() {
|
|
76
105
|
return [...map.keys()];
|
|
77
106
|
},
|
|
107
|
+
...(mutableRemote && url !== undefined && token !== undefined
|
|
108
|
+
? {
|
|
109
|
+
set(name: string, value: string) {
|
|
110
|
+
void (async () => {
|
|
111
|
+
const res = await fetchFn(`${url}/v1/${mount}/data/${encodeURIComponent(name)}`, {
|
|
112
|
+
method: "POST",
|
|
113
|
+
headers: { "X-Vault-Token": token, "content-type": "application/json" },
|
|
114
|
+
body: JSON.stringify({ data: { value } }),
|
|
115
|
+
});
|
|
116
|
+
if (!res.ok) {
|
|
117
|
+
throw new OpenBaoUnavailableError(
|
|
118
|
+
`openbao vault: write ${name} failed (${res.status})`,
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
map.set(name, value);
|
|
122
|
+
})();
|
|
123
|
+
},
|
|
124
|
+
delete(name: string) {
|
|
125
|
+
const had = map.delete(name);
|
|
126
|
+
void (async () => {
|
|
127
|
+
const res = await fetchFn(`${url}/v1/${mount}/data/${encodeURIComponent(name)}`, {
|
|
128
|
+
method: "DELETE",
|
|
129
|
+
headers: { "X-Vault-Token": token },
|
|
130
|
+
});
|
|
131
|
+
if (!res.ok && res.status !== 404) {
|
|
132
|
+
throw new OpenBaoUnavailableError(
|
|
133
|
+
`openbao vault: delete ${name} failed (${res.status})`,
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
})();
|
|
137
|
+
return had;
|
|
138
|
+
},
|
|
139
|
+
}
|
|
140
|
+
: {}),
|
|
78
141
|
};
|
|
79
142
|
},
|
|
80
143
|
};
|
|
@@ -1,30 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Protocol-named vault driver contracts.
|
|
3
3
|
*
|
|
4
|
-
* Driver ids: `
|
|
4
|
+
* Driver ids: `env` · `openbao` · `infisical` · `managed` · `memory`.
|
|
5
5
|
* Never vendor names (`neon`, `infisical-cloud`, …) — vendor choice lives in `images`.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
/** Protocol ids for vault drivers. */
|
|
9
|
-
export type VaultDriverId =
|
|
10
|
-
| "sops"
|
|
11
|
-
| "env"
|
|
12
|
-
| "openbao"
|
|
13
|
-
| "infisical"
|
|
14
|
-
| "managed"
|
|
15
|
-
| "memory";
|
|
9
|
+
export type VaultDriverId = "env" | "openbao" | "infisical" | "managed" | "memory";
|
|
16
10
|
|
|
17
11
|
/** Options when opening a vault backend. */
|
|
18
12
|
export interface VaultOpenOptions {
|
|
19
|
-
/**
|
|
20
|
-
* Path to a SOPS-encrypted file (`sops` driver) or a dotenv file (`env` driver).
|
|
21
|
-
* Prefer JSON / ENV formats produced by `sops -e` for SOPS.
|
|
22
|
-
*/
|
|
13
|
+
/** Path to a dotenv file (`env` driver). */
|
|
23
14
|
readonly path?: string;
|
|
24
|
-
/** Inline SOPS ciphertext (tests). */
|
|
25
|
-
readonly ciphertext?: string | Uint8Array;
|
|
26
|
-
/** Age identity (`AGE-SECRET-KEY-…`) for Typage decryption. */
|
|
27
|
-
readonly ageIdentity?: string;
|
|
28
15
|
/** Env prefix filter for the `env` driver (default: none — whole `process.env`). */
|
|
29
16
|
readonly envPrefix?: string;
|
|
30
17
|
/** Injected env map for tests (defaults to `process.env`). */
|
|
@@ -145,13 +145,9 @@ export const ai: AiNamespace = {
|
|
|
145
145
|
kind: "prompt",
|
|
146
146
|
name: promptName,
|
|
147
147
|
model: name,
|
|
148
|
-
...(promptOpts.version !== undefined
|
|
149
|
-
? { version: promptOpts.version }
|
|
150
|
-
: {}),
|
|
148
|
+
...(promptOpts.version !== undefined ? { version: promptOpts.version } : {}),
|
|
151
149
|
...(promptOpts.evals !== undefined ? { evals: promptOpts.evals } : {}),
|
|
152
|
-
...(promptOpts.budget !== undefined
|
|
153
|
-
? { budget: promptOpts.budget }
|
|
154
|
-
: {}),
|
|
150
|
+
...(promptOpts.budget !== undefined ? { budget: promptOpts.budget } : {}),
|
|
155
151
|
...(promptOpts.in !== undefined ? { in: promptOpts.in } : {}),
|
|
156
152
|
...(promptOpts.out !== undefined ? { out: promptOpts.out } : {}),
|
|
157
153
|
};
|
|
@@ -167,14 +163,8 @@ export const ai: AiNamespace = {
|
|
|
167
163
|
* @param options - Model + destination index
|
|
168
164
|
*/
|
|
169
165
|
embed(name: string, options: AiEmbedOptions = {}): AiEmbedDecl {
|
|
170
|
-
const model =
|
|
171
|
-
|
|
172
|
-
? options.model
|
|
173
|
-
: options.model?.name;
|
|
174
|
-
const into =
|
|
175
|
-
typeof options.into === "string"
|
|
176
|
-
? options.into
|
|
177
|
-
: options.into?.name;
|
|
166
|
+
const model = typeof options.model === "string" ? options.model : options.model?.name;
|
|
167
|
+
const into = typeof options.into === "string" ? options.into : options.into?.name;
|
|
178
168
|
return {
|
|
179
169
|
kind: "embed",
|
|
180
170
|
name,
|
package/src/elements/ai/eval.ts
CHANGED
|
@@ -52,12 +52,8 @@ export interface RunPromptEvalsOptions {
|
|
|
52
52
|
*
|
|
53
53
|
* @param options - Cases + ask fn
|
|
54
54
|
*/
|
|
55
|
-
export async function runPromptEvals(
|
|
56
|
-
options
|
|
57
|
-
): Promise<EvalSuiteResult> {
|
|
58
|
-
const equals =
|
|
59
|
-
options.equals ??
|
|
60
|
-
((a, b) => JSON.stringify(a) === JSON.stringify(b));
|
|
55
|
+
export async function runPromptEvals(options: RunPromptEvalsOptions): Promise<EvalSuiteResult> {
|
|
56
|
+
const equals = options.equals ?? ((a, b) => JSON.stringify(a) === JSON.stringify(b));
|
|
61
57
|
const results: EvalCaseResult[] = [];
|
|
62
58
|
|
|
63
59
|
for (let i = 0; i < options.cases.length; i++) {
|
package/src/elements/ai/pii.ts
CHANGED
|
@@ -55,9 +55,7 @@ export class AiPiiBuildError extends Error {
|
|
|
55
55
|
*
|
|
56
56
|
* @param tags - Classification value
|
|
57
57
|
*/
|
|
58
|
-
function isPiiTags(
|
|
59
|
-
tags: ColumnClassification | string | readonly string[] | undefined,
|
|
60
|
-
): boolean {
|
|
58
|
+
function isPiiTags(tags: ColumnClassification | string | readonly string[] | undefined): boolean {
|
|
61
59
|
if (!tags) return false;
|
|
62
60
|
if (typeof tags === "string") return tags === "pii";
|
|
63
61
|
if (Array.isArray(tags)) return tags.includes("pii");
|