okengine 0.2.5 → 0.2.8
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 +24 -23
- package/README.md +52 -346
- package/docs/spec/console.md +165 -142
- package/docs/spec/example.md +490 -312
- package/docs/spec/four-applications.md +495 -314
- package/docs/spec/unified-theory.md +184 -175
- package/package.json +46 -38
- package/spec/manifest.v1.schema.json +40 -9
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +53 -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 +386 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +163 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev.test.ts +148 -21
- package/src/cli/dev.ts +208 -134
- package/src/cli/doc-drift.test.ts +3 -2
- package/src/cli/doc-drift.ts +21 -50
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +7 -8
- package/src/cli/docker.ts +1 -3
- package/src/cli/doctor-diff-examples.ts +1 -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/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 +41 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +45 -0
- package/src/cli/ports.test.ts +4 -13
- package/src/cli/ports.ts +1 -3
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +2 -7
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- 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 +8 -29
- 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 +96 -30
- package/src/compiler/extract.ts +362 -156
- package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
- 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 +4 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +57 -34
- package/src/config/index.ts +181 -37
- 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 +14 -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 +23 -60
- 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 +112 -20
- package/src/docker/derive.ts +5 -19
- package/src/docker/docker.test.ts +15 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +4 -11
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +5 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +6 -1
- package/src/docker/recipes/rustfs.ts +33 -0
- package/src/docker/stack-id.test.ts +33 -0
- package/src/docker/stack-id.ts +25 -13
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/types.ts +13 -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/fs.ts +2 -8
- package/src/drivers/index.ts +12 -56
- package/src/drivers/memory.ts +14 -41
- 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 +5 -17
- 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-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.ts +1 -5
- package/src/drivers/vault-sops.ts +10 -35
- package/src/drivers/vault-types.ts +1 -7
- 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 +8 -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/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.ts +11 -21
- package/src/elements/store/sql-session.test.ts +50 -0
- package/src/elements/store/sql-session.ts +60 -63
- package/src/elements/store/table.ts +35 -19
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +37 -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 +18 -32
- package/src/elements/vault.test.ts +12 -28
- package/src/elements/vault.ts +8 -12
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +34 -94
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.ts +2 -8
- 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 +17 -17
- package/src/kernel/boot-bind/store.ts +44 -50
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -9
- package/src/kernel/boot.ts +29 -76
- 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/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 +5 -25
- package/src/kernel/fx.test.ts +15 -44
- package/src/kernel/fx.ts +27 -79
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +10 -10
- package/src/kernel/hooks.ts +3 -12
- package/src/kernel/index.ts +4 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +1 -6
- 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 +48 -24
- package/src/kernel/registry.ts +80 -29
- 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 +4 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/index.ts +2 -9
- package/src/manifest/types.ts +29 -5
- 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 +4 -14
- 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/node-import-scan.ts +2 -5
- 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 +15 -43
- 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 +13 -31
- 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/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
|
@@ -7,11 +7,7 @@
|
|
|
7
7
|
* `age-encryption` is an optional peer — loaded only when this driver runs.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import type {
|
|
11
|
-
VaultBag,
|
|
12
|
-
VaultDriver,
|
|
13
|
-
VaultOpenOptions,
|
|
14
|
-
} from "./vault-types.ts";
|
|
10
|
+
import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
|
|
15
11
|
|
|
16
12
|
/** Minimal Typage surface used by this driver. */
|
|
17
13
|
type AgeModule = typeof import("age-encryption");
|
|
@@ -23,9 +19,7 @@ async function loadAge(): Promise<AgeModule> {
|
|
|
23
19
|
try {
|
|
24
20
|
return await import("age-encryption");
|
|
25
21
|
} catch {
|
|
26
|
-
throw new Error(
|
|
27
|
-
"sops vault: install optional peer `age-encryption` (bun add age-encryption)",
|
|
28
|
-
);
|
|
22
|
+
throw new Error("sops vault: install optional peer `age-encryption` (bun add age-encryption)");
|
|
29
23
|
}
|
|
30
24
|
}
|
|
31
25
|
|
|
@@ -49,9 +43,8 @@ const ENC_RE =
|
|
|
49
43
|
*/
|
|
50
44
|
function b64(input: string): Uint8Array {
|
|
51
45
|
const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
|
|
52
|
-
const pad =
|
|
53
|
-
? normalized
|
|
54
|
-
: normalized + "=".repeat(4 - (normalized.length % 4));
|
|
46
|
+
const pad =
|
|
47
|
+
normalized.length % 4 === 0 ? normalized : normalized + "=".repeat(4 - (normalized.length % 4));
|
|
55
48
|
const bin = atob(pad);
|
|
56
49
|
const out = new Uint8Array(bin.length);
|
|
57
50
|
for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);
|
|
@@ -84,10 +77,7 @@ function asBufferSource(bytes: Uint8Array): Uint8Array<ArrayBuffer> {
|
|
|
84
77
|
* @param enc - `ENC[AES256_GCM,…]` string
|
|
85
78
|
* @param dataKey - 32-byte SOPS data key
|
|
86
79
|
*/
|
|
87
|
-
async function decryptValue(
|
|
88
|
-
enc: string,
|
|
89
|
-
dataKey: Uint8Array,
|
|
90
|
-
): Promise<string> {
|
|
80
|
+
async function decryptValue(enc: string, dataKey: Uint8Array): Promise<string> {
|
|
91
81
|
const m = ENC_RE.exec(enc);
|
|
92
82
|
const dataB64 = m?.groups?.data;
|
|
93
83
|
const ivB64 = m?.groups?.iv;
|
|
@@ -108,11 +98,7 @@ async function decryptValue(
|
|
|
108
98
|
const cipher = new Uint8Array(data.length + tag.length);
|
|
109
99
|
cipher.set(data, 0);
|
|
110
100
|
cipher.set(tag, data.length);
|
|
111
|
-
const plain = await crypto.subtle.decrypt(
|
|
112
|
-
{ name: "AES-GCM", iv },
|
|
113
|
-
key,
|
|
114
|
-
asBufferSource(cipher),
|
|
115
|
-
);
|
|
101
|
+
const plain = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, key, asBufferSource(cipher));
|
|
116
102
|
return new TextDecoder().decode(plain);
|
|
117
103
|
}
|
|
118
104
|
|
|
@@ -122,10 +108,7 @@ async function decryptValue(
|
|
|
122
108
|
* @param identity - `AGE-SECRET-KEY-…`
|
|
123
109
|
* @param encBlock - Armored age ciphertext from `sops.age[].enc`
|
|
124
110
|
*/
|
|
125
|
-
async function decryptDataKey(
|
|
126
|
-
identity: string,
|
|
127
|
-
encBlock: string,
|
|
128
|
-
): Promise<Uint8Array> {
|
|
111
|
+
async function decryptDataKey(identity: string, encBlock: string): Promise<Uint8Array> {
|
|
129
112
|
const age = await loadAge();
|
|
130
113
|
const d = new age.Decrypter();
|
|
131
114
|
d.addIdentity(identity.trim());
|
|
@@ -163,10 +146,7 @@ function parseSopsJson(text: string): {
|
|
|
163
146
|
* @param plaintext - Cleartext
|
|
164
147
|
* @param dataKey - 32-byte key
|
|
165
148
|
*/
|
|
166
|
-
export async function sopsEncryptValue(
|
|
167
|
-
plaintext: string,
|
|
168
|
-
dataKey: Uint8Array,
|
|
169
|
-
): Promise<string> {
|
|
149
|
+
export async function sopsEncryptValue(plaintext: string, dataKey: Uint8Array): Promise<string> {
|
|
170
150
|
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
171
151
|
const key = await crypto.subtle.importKey(
|
|
172
152
|
"raw",
|
|
@@ -176,11 +156,7 @@ export async function sopsEncryptValue(
|
|
|
176
156
|
["encrypt"],
|
|
177
157
|
);
|
|
178
158
|
const cipher = new Uint8Array(
|
|
179
|
-
await crypto.subtle.encrypt(
|
|
180
|
-
{ name: "AES-GCM", iv },
|
|
181
|
-
key,
|
|
182
|
-
new TextEncoder().encode(plaintext),
|
|
183
|
-
),
|
|
159
|
+
await crypto.subtle.encrypt({ name: "AES-GCM", iv }, key, new TextEncoder().encode(plaintext)),
|
|
184
160
|
);
|
|
185
161
|
const tag = cipher.slice(cipher.length - 16);
|
|
186
162
|
const data = cipher.slice(0, cipher.length - 16);
|
|
@@ -205,8 +181,7 @@ export async function buildSopsFixture(
|
|
|
205
181
|
const e = new age.Encrypter();
|
|
206
182
|
e.addRecipient(recipient);
|
|
207
183
|
const encKey = await e.encrypt(key);
|
|
208
|
-
const encBytes =
|
|
209
|
-
typeof encKey === "string" ? new TextEncoder().encode(encKey) : encKey;
|
|
184
|
+
const encBytes = typeof encKey === "string" ? new TextEncoder().encode(encKey) : encKey;
|
|
210
185
|
const encArmored = age.armor.encode(encBytes);
|
|
211
186
|
const out: Record<string, unknown> = {};
|
|
212
187
|
for (const [name, value] of Object.entries(secrets)) {
|
|
@@ -6,13 +6,7 @@
|
|
|
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 = "sops" | "env" | "openbao" | "infisical" | "managed" | "memory";
|
|
16
10
|
|
|
17
11
|
/** Options when opening a vault backend. */
|
|
18
12
|
export interface VaultOpenOptions {
|
|
@@ -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");
|
|
@@ -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", () => {
|