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
|
@@ -6,19 +6,11 @@
|
|
|
6
6
|
* Agent denials are recorded on the denial ledger — not errors.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type {
|
|
10
|
-
AiDriver,
|
|
11
|
-
AiModelClient,
|
|
12
|
-
} from "../../drivers/ai-types.ts";
|
|
9
|
+
import type { AiDriver, AiModelClient } from "../../drivers/ai-types.ts";
|
|
13
10
|
import type { IndexStore } from "../../drivers/types.ts";
|
|
14
11
|
import type { GatePolicyContext } from "../gate/declare.ts";
|
|
15
12
|
import type { GateRuntime } from "../gate/runtime.ts";
|
|
16
|
-
import type {
|
|
17
|
-
AiAgentDecl,
|
|
18
|
-
AiEmbedDecl,
|
|
19
|
-
AiModelDecl,
|
|
20
|
-
AiPromptDecl,
|
|
21
|
-
} from "./declare.ts";
|
|
13
|
+
import type { AiAgentDecl, AiEmbedDecl, AiModelDecl, AiPromptDecl } from "./declare.ts";
|
|
22
14
|
import {
|
|
23
15
|
AiSchemaValidationError,
|
|
24
16
|
coerceModelObject,
|
|
@@ -37,14 +29,7 @@ export interface AgentDenial {
|
|
|
37
29
|
|
|
38
30
|
/** Effect on a tool flow — same vocabulary as Flows / Traces. */
|
|
39
31
|
export interface AgentToolEffect {
|
|
40
|
-
readonly kind:
|
|
41
|
-
| "read"
|
|
42
|
-
| "write"
|
|
43
|
-
| "emit"
|
|
44
|
-
| "send"
|
|
45
|
-
| "ask"
|
|
46
|
-
| "secret"
|
|
47
|
-
| "call";
|
|
32
|
+
readonly kind: "read" | "write" | "emit" | "send" | "ask" | "secret" | "call";
|
|
48
33
|
readonly resource: string;
|
|
49
34
|
}
|
|
50
35
|
|
|
@@ -122,10 +107,7 @@ export interface CreateAiRuntimeOptions {
|
|
|
122
107
|
* @param name - Flow name
|
|
123
108
|
* @param input - Tool input
|
|
124
109
|
*/
|
|
125
|
-
readonly callFlow?: (
|
|
126
|
-
name: string,
|
|
127
|
-
input: unknown,
|
|
128
|
-
) => Promise<unknown>;
|
|
110
|
+
readonly callFlow?: (name: string, input: unknown) => Promise<unknown>;
|
|
129
111
|
/**
|
|
130
112
|
* Resolve gates required for a tool flow.
|
|
131
113
|
*
|
|
@@ -186,11 +168,7 @@ export interface AiRuntime {
|
|
|
186
168
|
* @param input - Prompt input
|
|
187
169
|
* @param opts - via / allowPii
|
|
188
170
|
*/
|
|
189
|
-
ask(
|
|
190
|
-
prompt: string,
|
|
191
|
-
input?: unknown,
|
|
192
|
-
opts?: AiAskOptions,
|
|
193
|
-
): Promise<Record<string, unknown>>;
|
|
171
|
+
ask(prompt: string, input?: unknown, opts?: AiAskOptions): Promise<Record<string, unknown>>;
|
|
194
172
|
/**
|
|
195
173
|
* Run a bounded agent; tool calls that fail gates are denied + recorded.
|
|
196
174
|
*
|
|
@@ -215,11 +193,7 @@ export interface AiRuntime {
|
|
|
215
193
|
* @param id - Document id
|
|
216
194
|
* @param text - Text to embed
|
|
217
195
|
*/
|
|
218
|
-
embed(
|
|
219
|
-
embed: string,
|
|
220
|
-
id: string,
|
|
221
|
-
text: string,
|
|
222
|
-
): Promise<void>;
|
|
196
|
+
embed(embed: string, id: string, text: string): Promise<void>;
|
|
223
197
|
}
|
|
224
198
|
|
|
225
199
|
/**
|
|
@@ -227,9 +201,7 @@ export interface AiRuntime {
|
|
|
227
201
|
*
|
|
228
202
|
* @param options - Declarations + clients + gates
|
|
229
203
|
*/
|
|
230
|
-
export function createAiRuntime(
|
|
231
|
-
options: CreateAiRuntimeOptions = {},
|
|
232
|
-
): AiRuntime {
|
|
204
|
+
export function createAiRuntime(options: CreateAiRuntimeOptions = {}): AiRuntime {
|
|
233
205
|
const prompts = new Map<string, AiPromptDecl>();
|
|
234
206
|
for (const p of options.prompts ?? []) prompts.set(p.name, p);
|
|
235
207
|
const agents = new Map<string, AiAgentDecl>();
|
|
@@ -239,9 +211,7 @@ export function createAiRuntime(
|
|
|
239
211
|
const models = new Map<string, AiModelDecl>();
|
|
240
212
|
for (const m of options.models ?? []) models.set(m.name, m);
|
|
241
213
|
|
|
242
|
-
const clients = new Map<string, AiModelClient>(
|
|
243
|
-
Object.entries(options.clients ?? {}),
|
|
244
|
-
);
|
|
214
|
+
const clients = new Map<string, AiModelClient>(Object.entries(options.clients ?? {}));
|
|
245
215
|
const denials: AgentDenial[] = [];
|
|
246
216
|
const agentRuns: AgentRunRecord[] = [];
|
|
247
217
|
const journal: AiJournalEntry[] = [];
|
|
@@ -297,9 +267,7 @@ export function createAiRuntime(
|
|
|
297
267
|
}
|
|
298
268
|
}
|
|
299
269
|
|
|
300
|
-
const via =
|
|
301
|
-
opts?.via ??
|
|
302
|
-
(decl.model ? [decl.model] : [...models.keys()].slice(0, 1));
|
|
270
|
+
const via = opts?.via ?? (decl.model ? [decl.model] : [...models.keys()].slice(0, 1));
|
|
303
271
|
const attempts: AiFallbackAttempt[] = [];
|
|
304
272
|
let lastError: string | undefined;
|
|
305
273
|
let lastSchema: AiSchemaMismatch | undefined;
|
|
@@ -314,10 +282,7 @@ export function createAiRuntime(
|
|
|
314
282
|
messages: [
|
|
315
283
|
{
|
|
316
284
|
role: "user",
|
|
317
|
-
content:
|
|
318
|
-
typeof input === "string"
|
|
319
|
-
? input
|
|
320
|
-
: JSON.stringify(input ?? {}),
|
|
285
|
+
content: typeof input === "string" ? input : JSON.stringify(input ?? {}),
|
|
321
286
|
},
|
|
322
287
|
],
|
|
323
288
|
responseFormat: decl.out,
|
|
@@ -325,8 +290,7 @@ export function createAiRuntime(
|
|
|
325
290
|
const attemptCost = result.usage?.cost ?? 0;
|
|
326
291
|
totalCost += attemptCost;
|
|
327
292
|
const latencyMs = Math.max(0, now() - attemptStart);
|
|
328
|
-
const raw =
|
|
329
|
-
result.raw !== undefined ? result.raw : result.text;
|
|
293
|
+
const raw = result.raw !== undefined ? result.raw : result.text;
|
|
330
294
|
|
|
331
295
|
try {
|
|
332
296
|
const output = decl.out
|
|
@@ -409,9 +373,7 @@ export function createAiRuntime(
|
|
|
409
373
|
at: now(),
|
|
410
374
|
});
|
|
411
375
|
}
|
|
412
|
-
throw new Error(
|
|
413
|
-
`ai: all models failed for prompt "${prompt}": ${lastError}`,
|
|
414
|
-
);
|
|
376
|
+
throw new Error(`ai: all models failed for prompt "${prompt}": ${lastError}`);
|
|
415
377
|
},
|
|
416
378
|
|
|
417
379
|
async runAgent(agent, runOpts) {
|
|
@@ -63,9 +63,7 @@ export class AiSchemaValidationError extends Error {
|
|
|
63
63
|
*
|
|
64
64
|
* @param schema - Declared `out`
|
|
65
65
|
*/
|
|
66
|
-
export function isObjectSchema(
|
|
67
|
-
schema: unknown,
|
|
68
|
-
): schema is {
|
|
66
|
+
export function isObjectSchema(schema: unknown): schema is {
|
|
69
67
|
readonly properties?: Record<string, unknown>;
|
|
70
68
|
readonly required?: readonly string[];
|
|
71
69
|
readonly type?: string;
|
|
@@ -114,15 +112,10 @@ export function matchOutSchema(
|
|
|
114
112
|
if (!isObjectSchema(schema)) return null;
|
|
115
113
|
|
|
116
114
|
const props = (schema.properties ?? {}) as Record<string, unknown>;
|
|
117
|
-
const required = Array.isArray(schema.required)
|
|
118
|
-
? [...schema.required]
|
|
119
|
-
: Object.keys(props);
|
|
115
|
+
const required = Array.isArray(schema.required) ? [...schema.required] : Object.keys(props);
|
|
120
116
|
const keys = new Set(Object.keys(value));
|
|
121
117
|
const missing = required.filter((k) => !keys.has(k));
|
|
122
|
-
const extra =
|
|
123
|
-
Object.keys(props).length > 0
|
|
124
|
-
? [...keys].filter((k) => !(k in props))
|
|
125
|
-
: [];
|
|
118
|
+
const extra = Object.keys(props).length > 0 ? [...keys].filter((k) => !(k in props)) : [];
|
|
126
119
|
const typeMismatches: string[] = [];
|
|
127
120
|
for (const [key, propSchema] of Object.entries(props)) {
|
|
128
121
|
if (!(key in value)) continue;
|
|
@@ -140,11 +133,7 @@ export function matchOutSchema(
|
|
|
140
133
|
}
|
|
141
134
|
}
|
|
142
135
|
|
|
143
|
-
if (
|
|
144
|
-
missing.length === 0 &&
|
|
145
|
-
extra.length === 0 &&
|
|
146
|
-
typeMismatches.length === 0
|
|
147
|
-
) {
|
|
136
|
+
if (missing.length === 0 && extra.length === 0 && typeMismatches.length === 0) {
|
|
148
137
|
return null;
|
|
149
138
|
}
|
|
150
139
|
return { missing, extra, typeMismatches };
|
package/src/elements/ai.test.ts
CHANGED
|
@@ -9,11 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { describe, expect, test } from "bun:test";
|
|
12
|
-
import {
|
|
13
|
-
createMockAiDriver,
|
|
14
|
-
memoryIndexDriver,
|
|
15
|
-
mockAiDriver,
|
|
16
|
-
} from "../drivers/index.ts";
|
|
12
|
+
import { createMockAiDriver, memoryIndexDriver, mockAiDriver } from "../drivers/index.ts";
|
|
17
13
|
import { createFx } from "../kernel/fx.ts";
|
|
18
14
|
import {
|
|
19
15
|
ai,
|
|
@@ -43,10 +39,7 @@ describe("ai declaration", () => {
|
|
|
43
39
|
maxSteps: 6,
|
|
44
40
|
model: smart,
|
|
45
41
|
});
|
|
46
|
-
expect(agent.tools).toEqual([
|
|
47
|
-
"bookings.getBooking",
|
|
48
|
-
"bookings.refundBooking",
|
|
49
|
-
]);
|
|
42
|
+
expect(agent.tools).toEqual(["bookings.getBooking", "bookings.refundBooking"]);
|
|
50
43
|
|
|
51
44
|
const embed = ai.embed("docs", {
|
|
52
45
|
model: smart,
|
|
@@ -70,8 +63,7 @@ describe("agent gate denial is recorded", () => {
|
|
|
70
63
|
const runtime = createAiRuntime({
|
|
71
64
|
agents: [refund],
|
|
72
65
|
gates,
|
|
73
|
-
gatesForFlow: (name) =>
|
|
74
|
-
name === "bookings.refundBooking" ? ["member"] : [],
|
|
66
|
+
gatesForFlow: (name) => (name === "bookings.refundBooking" ? ["member"] : []),
|
|
75
67
|
callFlow: async (name) => {
|
|
76
68
|
called.push(name);
|
|
77
69
|
return { ok: true };
|
|
@@ -95,9 +87,7 @@ describe("agent gate denial is recorded", () => {
|
|
|
95
87
|
const member = gate.policy("member", ({ auth }) => !!auth.verified);
|
|
96
88
|
const gates = createGateRuntime({ gates: [member] });
|
|
97
89
|
const runtime = createAiRuntime({
|
|
98
|
-
agents: [
|
|
99
|
-
ai.agent("support", { tools: ["bookings.getBooking"], maxSteps: 1 }),
|
|
100
|
-
],
|
|
90
|
+
agents: [ai.agent("support", { tools: ["bookings.getBooking"], maxSteps: 1 })],
|
|
101
91
|
gates,
|
|
102
92
|
gatesForFlow: () => ["member"],
|
|
103
93
|
callFlow: async () => ({ booking: "B1" }),
|
|
@@ -270,10 +260,7 @@ describe("embeddings into store.index", () => {
|
|
|
270
260
|
indexes: { kb: index },
|
|
271
261
|
});
|
|
272
262
|
await runtime.embed("docs", "doc-1", "hello world");
|
|
273
|
-
const hits = await index.search(
|
|
274
|
-
(await client.embed!({ input: "hello world" })).vectors[0]!,
|
|
275
|
-
1,
|
|
276
|
-
);
|
|
263
|
+
const hits = await index.search((await client.embed!({ input: "hello world" })).vectors[0]!, 1);
|
|
277
264
|
expect(hits[0]?.id).toBe("doc-1");
|
|
278
265
|
});
|
|
279
266
|
});
|
|
@@ -300,9 +287,13 @@ describe("model fallback chain", () => {
|
|
|
300
287
|
clients: { smart: failing, fast: ok },
|
|
301
288
|
});
|
|
302
289
|
|
|
303
|
-
const out = await runtime.ask(
|
|
304
|
-
|
|
305
|
-
|
|
290
|
+
const out = await runtime.ask(
|
|
291
|
+
"ticket-triage",
|
|
292
|
+
{ subject: "x" },
|
|
293
|
+
{
|
|
294
|
+
via: ["smart", "fast"],
|
|
295
|
+
},
|
|
296
|
+
);
|
|
306
297
|
expect(out.urgency).toBe("low");
|
|
307
298
|
const entry = runtime.journal[0]!;
|
|
308
299
|
expect(entry.attempts).toHaveLength(2);
|
|
@@ -343,9 +334,7 @@ describe("schema-validation is its own class", () => {
|
|
|
343
334
|
}
|
|
344
335
|
expect(thrown).toBeInstanceOf(AiSchemaValidationError);
|
|
345
336
|
expect((thrown as AiSchemaValidationError).code).toBe("AiSchemaInvalid");
|
|
346
|
-
expect((thrown as AiSchemaValidationError).mismatch.missing).toContain(
|
|
347
|
-
"team",
|
|
348
|
-
);
|
|
337
|
+
expect((thrown as AiSchemaValidationError).mismatch.missing).toContain("team");
|
|
349
338
|
expect(runtime.journal[0]!.outcome).toBe("schema_invalid");
|
|
350
339
|
expect(runtime.journal[0]!.outcome).not.toBe("provider_error");
|
|
351
340
|
});
|
package/src/elements/ai.ts
CHANGED
|
@@ -41,11 +41,7 @@ export type {
|
|
|
41
41
|
CreateAiRuntimeOptions,
|
|
42
42
|
} from "./ai/runtime.ts";
|
|
43
43
|
|
|
44
|
-
export {
|
|
45
|
-
assertAllowPiiForAsk,
|
|
46
|
-
AiPiiBuildError,
|
|
47
|
-
type PiiAskCheckInput,
|
|
48
|
-
} from "./ai/pii.ts";
|
|
44
|
+
export { assertAllowPiiForAsk, AiPiiBuildError, type PiiAskCheckInput } from "./ai/pii.ts";
|
|
49
45
|
|
|
50
46
|
export {
|
|
51
47
|
runPromptEvals,
|
|
@@ -44,15 +44,8 @@ export interface ConsentStore {
|
|
|
44
44
|
export function createConsentStore(): ConsentStore {
|
|
45
45
|
const rows: OptOut[] = [];
|
|
46
46
|
|
|
47
|
-
function matches(
|
|
48
|
-
subject
|
|
49
|
-
medium: ChannelMedium,
|
|
50
|
-
): boolean {
|
|
51
|
-
return rows.some(
|
|
52
|
-
(r) =>
|
|
53
|
-
r.subject === subject &&
|
|
54
|
-
(r.medium === "all" || r.medium === medium),
|
|
55
|
-
);
|
|
47
|
+
function matches(subject: string, medium: ChannelMedium): boolean {
|
|
48
|
+
return rows.some((r) => r.subject === subject && (r.medium === "all" || r.medium === medium));
|
|
56
49
|
}
|
|
57
50
|
|
|
58
51
|
return {
|
|
@@ -60,9 +53,7 @@ export function createConsentStore(): ConsentStore {
|
|
|
60
53
|
return matches(subject, medium);
|
|
61
54
|
},
|
|
62
55
|
optOut(subject, medium) {
|
|
63
|
-
if (
|
|
64
|
-
!rows.some((r) => r.subject === subject && r.medium === medium)
|
|
65
|
-
) {
|
|
56
|
+
if (!rows.some((r) => r.subject === subject && r.medium === medium)) {
|
|
66
57
|
rows.push({ subject, medium, at: Date.now() });
|
|
67
58
|
}
|
|
68
59
|
},
|
|
@@ -42,10 +42,7 @@ export interface FallbackWeeklyCostDelta {
|
|
|
42
42
|
* @param medium - Channel medium
|
|
43
43
|
* @param costs - Unit cost table
|
|
44
44
|
*/
|
|
45
|
-
export function costOf(
|
|
46
|
-
medium: string,
|
|
47
|
-
costs: MediumCosts = DEFAULT_MEDIUM_COSTS,
|
|
48
|
-
): number {
|
|
45
|
+
export function costOf(medium: string, costs: MediumCosts = DEFAULT_MEDIUM_COSTS): number {
|
|
49
46
|
return costs[medium as ChannelMedium] ?? costs.any ?? 0.005;
|
|
50
47
|
}
|
|
51
48
|
|
|
@@ -69,9 +66,7 @@ export function fallbackWeeklyCostDelta(
|
|
|
69
66
|
): FallbackWeeklyCostDelta {
|
|
70
67
|
const costs = options.costs ?? DEFAULT_MEDIUM_COSTS;
|
|
71
68
|
const end = options.weekEndMs ?? options.now ?? Date.now();
|
|
72
|
-
const inWeek = receipts.filter(
|
|
73
|
-
(r) => r.at >= options.weekStartMs && r.at <= end,
|
|
74
|
-
);
|
|
69
|
+
const inWeek = receipts.filter((r) => r.at >= options.weekStartMs && r.at <= end);
|
|
75
70
|
const fallbacks = inWeek.filter((r) => r.status === "fallback");
|
|
76
71
|
|
|
77
72
|
let weeklyDeltaUsd = 0;
|
|
@@ -80,8 +75,7 @@ export function fallbackWeeklyCostDelta(
|
|
|
80
75
|
|
|
81
76
|
for (const r of fallbacks) {
|
|
82
77
|
const first = r.attempts[0];
|
|
83
|
-
const winner =
|
|
84
|
-
[...r.attempts].reverse().find((a) => a.ok) ?? r.attempts.at(-1);
|
|
78
|
+
const winner = [...r.attempts].reverse().find((a) => a.ok) ?? r.attempts.at(-1);
|
|
85
79
|
if (!first || !winner) continue;
|
|
86
80
|
const primary = mediumFromDriver(first.driverId, r.medium);
|
|
87
81
|
const fb = mediumFromDriver(winner.driverId, r.medium);
|
|
@@ -118,12 +112,7 @@ function mediumFromDriver(driverId: string, receiptMedium: string): string {
|
|
|
118
112
|
if (id.includes("push") || id.includes("fcm") || id.includes("webpush")) {
|
|
119
113
|
return "push";
|
|
120
114
|
}
|
|
121
|
-
if (
|
|
122
|
-
id.includes("smtp") ||
|
|
123
|
-
id.includes("resend") ||
|
|
124
|
-
id.includes("ses") ||
|
|
125
|
-
id.includes("email")
|
|
126
|
-
) {
|
|
115
|
+
if (id.includes("smtp") || id.includes("resend") || id.includes("ses") || id.includes("email")) {
|
|
127
116
|
return "email";
|
|
128
117
|
}
|
|
129
118
|
return receiptMedium === "any" ? "email" : receiptMedium;
|
|
@@ -104,10 +104,7 @@ export const channel: ChannelNamespace = {
|
|
|
104
104
|
* @param name - Template id
|
|
105
105
|
* @param options - Medium / locales / schema
|
|
106
106
|
*/
|
|
107
|
-
template(
|
|
108
|
-
name: string,
|
|
109
|
-
options: ChannelTemplateOptions = {},
|
|
110
|
-
): ChannelTemplateDecl {
|
|
107
|
+
template(name: string, options: ChannelTemplateOptions = {}): ChannelTemplateDecl {
|
|
111
108
|
if (!name) throw new TypeError("channel.template: name is required");
|
|
112
109
|
return {
|
|
113
110
|
kind: "template",
|
|
@@ -73,10 +73,7 @@ export async function verifyEmailAuth(
|
|
|
73
73
|
};
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
async function safeLookup(
|
|
77
|
-
lookup: DnsTxtLookup,
|
|
78
|
-
name: string,
|
|
79
|
-
): Promise<readonly string[]> {
|
|
76
|
+
async function safeLookup(lookup: DnsTxtLookup, name: string): Promise<readonly string[]> {
|
|
80
77
|
try {
|
|
81
78
|
return await lookup(name);
|
|
82
79
|
} catch {
|
|
@@ -30,13 +30,7 @@ export interface ResolveLocaleOptions {
|
|
|
30
30
|
*/
|
|
31
31
|
export function isRtlLocale(locale: string): boolean {
|
|
32
32
|
const base = locale.toLowerCase().split("-")[0] ?? locale;
|
|
33
|
-
return
|
|
34
|
-
base === "ar" ||
|
|
35
|
-
base === "he" ||
|
|
36
|
-
base === "fa" ||
|
|
37
|
-
base === "ur" ||
|
|
38
|
-
base === "yi"
|
|
39
|
-
);
|
|
33
|
+
return base === "ar" || base === "he" || base === "fa" || base === "ur" || base === "yi";
|
|
40
34
|
}
|
|
41
35
|
|
|
42
36
|
/**
|
|
@@ -59,9 +53,7 @@ export function parseAcceptLanguage(header: string | undefined): string | undefi
|
|
|
59
53
|
*
|
|
60
54
|
* @param options - Resolution inputs
|
|
61
55
|
*/
|
|
62
|
-
export function resolveLocale(
|
|
63
|
-
options: ResolveLocaleOptions = {},
|
|
64
|
-
): LocaleResolution {
|
|
56
|
+
export function resolveLocale(options: ResolveLocaleOptions = {}): LocaleResolution {
|
|
65
57
|
const defaultLocale = options.defaultLocale ?? "en";
|
|
66
58
|
const chain: LocaleChainStep[] = [];
|
|
67
59
|
|
|
@@ -38,9 +38,7 @@ export function maskEmail(email: string): string {
|
|
|
38
38
|
const name = parts[0] ?? domain;
|
|
39
39
|
const tld = parts.length > 1 ? parts.slice(1).join(".") : "";
|
|
40
40
|
const domainMask =
|
|
41
|
-
name.length <= 1
|
|
42
|
-
? "*"
|
|
43
|
-
: `${name[0]!}${"*".repeat(Math.min(3, name.length - 1))}`;
|
|
41
|
+
name.length <= 1 ? "*" : `${name[0]!}${"*".repeat(Math.min(3, name.length - 1))}`;
|
|
44
42
|
return tld ? `${localMask}@${domainMask}.${tld}` : `${localMask}@${domainMask}`;
|
|
45
43
|
}
|
|
46
44
|
|
|
@@ -6,18 +6,8 @@
|
|
|
6
6
|
* transports; OKE does not re-implement it.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
export type {
|
|
10
|
-
Attachment,
|
|
11
|
-
MailOptions,
|
|
12
|
-
SendResult,
|
|
13
|
-
Transport,
|
|
14
|
-
RetryConfig,
|
|
15
|
-
} from "sently";
|
|
9
|
+
export type { Attachment, MailOptions, SendResult, Transport, RetryConfig } from "sently";
|
|
16
10
|
|
|
17
11
|
export { SentlyError } from "sently/errors";
|
|
18
12
|
export { RetryTransport } from "sently/transports/retry";
|
|
19
|
-
export {
|
|
20
|
-
FallbackTransport,
|
|
21
|
-
FallbackError,
|
|
22
|
-
type FallbackAttempt,
|
|
23
|
-
} from "sently/transports/fallback";
|
|
13
|
+
export { FallbackTransport, FallbackError, type FallbackAttempt } from "sently/transports/fallback";
|
|
@@ -3,11 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { describe, expect, test } from "bun:test";
|
|
6
|
-
import {
|
|
7
|
-
buildOutcomeRows,
|
|
8
|
-
formatAttemptChain,
|
|
9
|
-
VERDICT_BY_STATE,
|
|
10
|
-
} from "./outcomes.ts";
|
|
6
|
+
import { buildOutcomeRows, formatAttemptChain, VERDICT_BY_STATE } from "./outcomes.ts";
|
|
11
7
|
|
|
12
8
|
describe("delivery outcome taxonomy", () => {
|
|
13
9
|
test("every state carries a verdict", () => {
|
|
@@ -18,9 +18,7 @@ export type DeliveryOutcomeState =
|
|
|
18
18
|
export type DeliveryVerdict = "correct" | "retry" | "suppress" | "review";
|
|
19
19
|
|
|
20
20
|
/** Verdict for each of the seven states. */
|
|
21
|
-
export const VERDICT_BY_STATE: Readonly<
|
|
22
|
-
Record<DeliveryOutcomeState, DeliveryVerdict>
|
|
23
|
-
> = {
|
|
21
|
+
export const VERDICT_BY_STATE: Readonly<Record<DeliveryOutcomeState, DeliveryVerdict>> = {
|
|
24
22
|
"suppressed/opted-out": "correct",
|
|
25
23
|
"suppressed/prior-bounce": "correct",
|
|
26
24
|
"blocked/invalid-address": "review",
|
|
@@ -34,9 +32,7 @@ export const VERDICT_BY_STATE: Readonly<
|
|
|
34
32
|
* Consequence weight — higher is worse for sender reputation.
|
|
35
33
|
* Complaints outrank many hard bounces.
|
|
36
34
|
*/
|
|
37
|
-
export const CONSEQUENCE_WEIGHT: Readonly<
|
|
38
|
-
Record<DeliveryOutcomeState, number>
|
|
39
|
-
> = {
|
|
35
|
+
export const CONSEQUENCE_WEIGHT: Readonly<Record<DeliveryOutcomeState, number>> = {
|
|
40
36
|
"suppressed/opted-out": 0,
|
|
41
37
|
"suppressed/prior-bounce": 1,
|
|
42
38
|
"blocked/invalid-address": 3,
|
|
@@ -70,9 +66,7 @@ export interface OutcomeRow {
|
|
|
70
66
|
*
|
|
71
67
|
* @param rows - Taxonomy rows with counts
|
|
72
68
|
*/
|
|
73
|
-
export function rankByConsequence(
|
|
74
|
-
rows: readonly OutcomeRow[],
|
|
75
|
-
): readonly OutcomeRow[] {
|
|
69
|
+
export function rankByConsequence(rows: readonly OutcomeRow[]): readonly OutcomeRow[] {
|
|
76
70
|
return [...rows].sort((a, b) => {
|
|
77
71
|
if (b.weight !== a.weight) return b.weight - a.weight;
|
|
78
72
|
return b.count - a.count;
|
|
@@ -101,9 +95,7 @@ export function buildOutcomeRows(
|
|
|
101
95
|
*
|
|
102
96
|
* @param status - Receipt status
|
|
103
97
|
*/
|
|
104
|
-
export function isDeliveryOutcomeState(
|
|
105
|
-
status: string,
|
|
106
|
-
): status is DeliveryOutcomeState {
|
|
98
|
+
export function isDeliveryOutcomeState(status: string): status is DeliveryOutcomeState {
|
|
107
99
|
return (DELIVERY_OUTCOME_STATES as readonly string[]).includes(status);
|
|
108
100
|
}
|
|
109
101
|
|
|
@@ -120,7 +112,5 @@ export function formatAttemptChain(
|
|
|
120
112
|
}[],
|
|
121
113
|
): string {
|
|
122
114
|
if (attempts.length === 0) return "";
|
|
123
|
-
return attempts
|
|
124
|
-
.map((a) => `${a.driverId} ${a.ok ? "succeeded" : "failed"}`)
|
|
125
|
-
.join(" → ");
|
|
115
|
+
return attempts.map((a) => `${a.driverId} ${a.ok ? "succeeded" : "failed"}`).join(" → ");
|
|
126
116
|
}
|
|
@@ -13,10 +13,7 @@ export type DeliverySuccessStatus = "sent" | "fallback";
|
|
|
13
13
|
export type DeliveryLegacyStatus = "failed" | "opted-out";
|
|
14
14
|
|
|
15
15
|
/** Full receipt status — success paths + seven-state taxonomy. */
|
|
16
|
-
export type DeliveryStatus =
|
|
17
|
-
| DeliverySuccessStatus
|
|
18
|
-
| DeliveryLegacyStatus
|
|
19
|
-
| DeliveryOutcomeState;
|
|
16
|
+
export type DeliveryStatus = DeliverySuccessStatus | DeliveryLegacyStatus | DeliveryOutcomeState;
|
|
20
17
|
|
|
21
18
|
/** Delivery receipt. */
|
|
22
19
|
export interface DeliveryReceipt {
|
|
@@ -103,9 +100,7 @@ export function createReceiptLedger(): ReceiptLedger {
|
|
|
103
100
|
return undefined;
|
|
104
101
|
},
|
|
105
102
|
updateStatus(messageId, patch) {
|
|
106
|
-
const idx = rows.findIndex(
|
|
107
|
-
(r) => r.messageId === messageId || r.id === messageId,
|
|
108
|
-
);
|
|
103
|
+
const idx = rows.findIndex((r) => r.messageId === messageId || r.id === messageId);
|
|
109
104
|
if (idx < 0) return undefined;
|
|
110
105
|
const prev = rows[idx]!;
|
|
111
106
|
const next: DeliveryReceipt = {
|