okengine 0.2.6 → 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 +45 -37
- 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
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import {
|
|
3
|
-
canDismissOnceSecret,
|
|
4
|
-
ONCE_SECRET_ACK_LABEL,
|
|
5
|
-
} from "./acknowledgement.ts";
|
|
2
|
+
import { canDismissOnceSecret, ONCE_SECRET_ACK_LABEL } from "./acknowledgement.ts";
|
|
6
3
|
|
|
7
4
|
describe("once-secret acknowledgement", () => {
|
|
8
5
|
test("dismiss requires explicit acknowledgement — not a soft done", () => {
|
|
@@ -16,9 +16,7 @@ export interface OnceSecretState {
|
|
|
16
16
|
*
|
|
17
17
|
* @param state - Dialog state
|
|
18
18
|
*/
|
|
19
|
-
export function canDismissOnceSecret(
|
|
20
|
-
state: Pick<OnceSecretState, "acknowledged">,
|
|
21
|
-
): boolean {
|
|
19
|
+
export function canDismissOnceSecret(state: Pick<OnceSecretState, "acknowledged">): boolean {
|
|
22
20
|
return state.acknowledged === true;
|
|
23
21
|
}
|
|
24
22
|
|
|
@@ -18,9 +18,7 @@ export interface AccessBlastRadiusLines {
|
|
|
18
18
|
*
|
|
19
19
|
* @param blast - Queried radius
|
|
20
20
|
*/
|
|
21
|
-
export function formatAccessBlastRadius(
|
|
22
|
-
blast: AccessBlastRadius,
|
|
23
|
-
): AccessBlastRadiusLines {
|
|
21
|
+
export function formatAccessBlastRadius(blast: AccessBlastRadius): AccessBlastRadiusLines {
|
|
24
22
|
return {
|
|
25
23
|
volume:
|
|
26
24
|
blast.callVolume === 0
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import {
|
|
3
|
-
revokeConfirmation,
|
|
4
|
-
rotateConfirmation,
|
|
5
|
-
validateTypedConfirm,
|
|
6
|
-
} from "./confirmation.ts";
|
|
2
|
+
import { revokeConfirmation, rotateConfirmation, validateTypedConfirm } from "./confirmation.ts";
|
|
7
3
|
|
|
8
4
|
describe("access confirmation", () => {
|
|
9
5
|
test("revoke and rotate always require typed confirm (D)", () => {
|
|
@@ -5,10 +5,7 @@
|
|
|
5
5
|
* Revoke and rotate follow D (irreversible → typed confirm + reason).
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
9
|
-
type ConfirmationPattern,
|
|
10
|
-
validateTypedConfirm,
|
|
11
|
-
} from "../flows/confirmation.ts";
|
|
8
|
+
import { type ConfirmationPattern, validateTypedConfirm } from "../flows/confirmation.ts";
|
|
12
9
|
|
|
13
10
|
export { validateTypedConfirm };
|
|
14
11
|
export type { ConfirmationPattern };
|
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
* Fixture Access projection for unit tests and the axe gate.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type {
|
|
6
|
-
AccessBlastRadius,
|
|
7
|
-
AccessEffectiveResponse,
|
|
8
|
-
AccessListResponse,
|
|
9
|
-
} from "./types.ts";
|
|
5
|
+
import type { AccessBlastRadius, AccessEffectiveResponse, AccessListResponse } from "./types.ts";
|
|
10
6
|
|
|
11
7
|
/** Full list response fixture — planes separate. */
|
|
12
8
|
export const ACCESS_LIST_FIXTURE: AccessListResponse = {
|
|
@@ -8,9 +8,7 @@ describe("grantable scopes (UI)", () => {
|
|
|
8
8
|
const ops = ACCESS_LIST_FIXTURE.operatorPlane.grantableScopes;
|
|
9
9
|
expect(user.every((s) => !s.startsWith("console:"))).toBe(true);
|
|
10
10
|
expect(ops.every((s) => s.startsWith("console:"))).toBe(true);
|
|
11
|
-
expect(visibleGrantableScopes(user, ["member", "console:x"])).toEqual([
|
|
12
|
-
"member",
|
|
13
|
-
]);
|
|
11
|
+
expect(visibleGrantableScopes(user, ["member", "console:x"])).toEqual(["member"]);
|
|
14
12
|
expect(allGrantable(["member"], user)).toBe(true);
|
|
15
13
|
expect(allGrantable(["console:store.sql:read"], user)).toBe(false);
|
|
16
14
|
});
|
|
@@ -16,9 +16,7 @@ export function visibleGrantableScopes(
|
|
|
16
16
|
): string[] {
|
|
17
17
|
if (!candidates) return [...grantable].sort((a, b) => a.localeCompare(b));
|
|
18
18
|
const allowed = new Set(grantable);
|
|
19
|
-
return candidates
|
|
20
|
-
.filter((s) => allowed.has(s))
|
|
21
|
-
.sort((a, b) => a.localeCompare(b));
|
|
19
|
+
return candidates.filter((s) => allowed.has(s)).sort((a, b) => a.localeCompare(b));
|
|
22
20
|
}
|
|
23
21
|
|
|
24
22
|
/**
|
|
@@ -27,10 +25,7 @@ export function visibleGrantableScopes(
|
|
|
27
25
|
* @param requested - Requested scopes
|
|
28
26
|
* @param grantable - Grantable scopes
|
|
29
27
|
*/
|
|
30
|
-
export function allGrantable(
|
|
31
|
-
requested: readonly string[],
|
|
32
|
-
grantable: readonly string[],
|
|
33
|
-
): boolean {
|
|
28
|
+
export function allGrantable(requested: readonly string[], grantable: readonly string[]): boolean {
|
|
34
29
|
const allowed = new Set(grantable);
|
|
35
30
|
return requested.every((s) => allowed.has(s));
|
|
36
31
|
}
|
|
@@ -15,11 +15,7 @@ export type {
|
|
|
15
15
|
AccessUserRecord,
|
|
16
16
|
} from "./types.ts";
|
|
17
17
|
|
|
18
|
-
export {
|
|
19
|
-
ACCESS_BLAST_FIXTURE,
|
|
20
|
-
ACCESS_EFFECTIVE_FIXTURE,
|
|
21
|
-
ACCESS_LIST_FIXTURE,
|
|
22
|
-
} from "./fixture.ts";
|
|
18
|
+
export { ACCESS_BLAST_FIXTURE, ACCESS_EFFECTIVE_FIXTURE, ACCESS_LIST_FIXTURE } from "./fixture.ts";
|
|
23
19
|
|
|
24
20
|
export {
|
|
25
21
|
parseAccessSearch,
|
|
@@ -42,10 +38,7 @@ export {
|
|
|
42
38
|
type OnceSecretState,
|
|
43
39
|
} from "./acknowledgement.ts";
|
|
44
40
|
|
|
45
|
-
export {
|
|
46
|
-
formatAccessBlastRadius,
|
|
47
|
-
type AccessBlastRadiusLines,
|
|
48
|
-
} from "./blast-radius.ts";
|
|
41
|
+
export { formatAccessBlastRadius, type AccessBlastRadiusLines } from "./blast-radius.ts";
|
|
49
42
|
|
|
50
43
|
export { visibleGrantableScopes, allGrantable } from "./grantable.ts";
|
|
51
44
|
|
|
@@ -5,8 +5,6 @@ import { formatProvenance } from "./provenance.ts";
|
|
|
5
5
|
describe("formatProvenance", () => {
|
|
6
6
|
test("shows which role granted which scope", () => {
|
|
7
7
|
const lines = formatProvenance(ACCESS_EFFECTIVE_FIXTURE);
|
|
8
|
-
expect(lines.find((l) => l.scope === "booking:create")?.sources).toContain(
|
|
9
|
-
"role member",
|
|
10
|
-
);
|
|
8
|
+
expect(lines.find((l) => l.scope === "booking:create")?.sources).toContain("role member");
|
|
11
9
|
});
|
|
12
10
|
});
|
|
@@ -15,15 +15,11 @@ export interface ProvenanceLine {
|
|
|
15
15
|
*
|
|
16
16
|
* @param effective - Server response
|
|
17
17
|
*/
|
|
18
|
-
export function formatProvenance(
|
|
19
|
-
effective: AccessEffectiveResponse,
|
|
20
|
-
): ProvenanceLine[] {
|
|
18
|
+
export function formatProvenance(effective: AccessEffectiveResponse): ProvenanceLine[] {
|
|
21
19
|
return effective.scopes.map((row) => ({
|
|
22
20
|
scope: row.scope,
|
|
23
21
|
sources: row.sources
|
|
24
|
-
.map((s) =>
|
|
25
|
-
s.kind === "direct" ? `direct (${s.name})` : `role ${s.name}`,
|
|
26
|
-
)
|
|
22
|
+
.map((s) => (s.kind === "direct" ? `direct (${s.name})` : `role ${s.name}`))
|
|
27
23
|
.join(", "),
|
|
28
24
|
}));
|
|
29
25
|
}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import {
|
|
3
|
-
openAccessEntity,
|
|
4
|
-
parseAccessSearch,
|
|
5
|
-
serializeAccessSearch,
|
|
6
|
-
} from "./search.ts";
|
|
2
|
+
import { openAccessEntity, parseAccessSearch, serializeAccessSearch } from "./search.ts";
|
|
7
3
|
|
|
8
4
|
describe("access search", () => {
|
|
9
5
|
test("round-trip plane + entity", () => {
|
|
@@ -24,9 +24,7 @@ export type AccessSearch = z.infer<typeof AccessSearchSchema>;
|
|
|
24
24
|
*
|
|
25
25
|
* @param search - Raw router search
|
|
26
26
|
*/
|
|
27
|
-
export function parseAccessSearch(
|
|
28
|
-
search: Record<string, unknown>,
|
|
29
|
-
): AccessSearch {
|
|
27
|
+
export function parseAccessSearch(search: Record<string, unknown>): AccessSearch {
|
|
30
28
|
const parsed = AccessSearchSchema.safeParse(search);
|
|
31
29
|
return parsed.success ? parsed.data : {};
|
|
32
30
|
}
|
|
@@ -36,9 +34,7 @@ export function parseAccessSearch(
|
|
|
36
34
|
*
|
|
37
35
|
* @param search - Search state
|
|
38
36
|
*/
|
|
39
|
-
export function serializeAccessSearch(
|
|
40
|
-
search: AccessSearch,
|
|
41
|
-
): Record<string, string> {
|
|
37
|
+
export function serializeAccessSearch(search: AccessSearch): Record<string, string> {
|
|
42
38
|
const out: Record<string, string> = {};
|
|
43
39
|
if (search.q) out.q = search.q;
|
|
44
40
|
if (search.plane) out.plane = search.plane;
|
|
@@ -43,8 +43,7 @@ export function AiA11yView(props: AiA11yViewProps) {
|
|
|
43
43
|
const prompts = filterPrompts(data.prompts, undefined);
|
|
44
44
|
const agents = filterAgents(data.agents, undefined);
|
|
45
45
|
const versions = versionsForPrompt(data.versions, promptName);
|
|
46
|
-
const selected =
|
|
47
|
-
versions.find((v) => v.version === version) ?? versions[versions.length - 1];
|
|
46
|
+
const selected = versions.find((v) => v.version === version) ?? versions[versions.length - 1];
|
|
48
47
|
const baseline = versions.find((v) => v.version === 2) ?? versions[0];
|
|
49
48
|
const decision =
|
|
50
49
|
baseline && selected && baseline.version !== selected.version
|
|
@@ -78,9 +77,7 @@ export function AiA11yView(props: AiA11yViewProps) {
|
|
|
78
77
|
{p.name}
|
|
79
78
|
{p.version !== undefined ? ` @${p.version}` : ""}
|
|
80
79
|
</button>
|
|
81
|
-
<a href={manifestDiffHref(p.manifestDiffPath)}>
|
|
82
|
-
Manifest Diff
|
|
83
|
-
</a>
|
|
80
|
+
<a href={manifestDiffHref(p.manifestDiffPath)}>Manifest Diff</a>
|
|
84
81
|
</li>
|
|
85
82
|
))}
|
|
86
83
|
</ul>
|
|
@@ -180,11 +177,7 @@ export function AiA11yView(props: AiA11yViewProps) {
|
|
|
180
177
|
<ul>
|
|
181
178
|
{agents.map((a) => (
|
|
182
179
|
<li key={a.name}>
|
|
183
|
-
<button
|
|
184
|
-
type="button"
|
|
185
|
-
aria-pressed={a.name === agentName}
|
|
186
|
-
style={{ minHeight: 32 }}
|
|
187
|
-
>
|
|
180
|
+
<button type="button" aria-pressed={a.name === agentName} style={{ minHeight: 32 }}>
|
|
188
181
|
{a.name}
|
|
189
182
|
</button>
|
|
190
183
|
</li>
|
|
@@ -194,14 +187,11 @@ export function AiA11yView(props: AiA11yViewProps) {
|
|
|
194
187
|
|
|
195
188
|
{run ? (
|
|
196
189
|
<section aria-label="Agent run trail">
|
|
197
|
-
<h2>
|
|
198
|
-
Agent run {run.id}
|
|
199
|
-
</h2>
|
|
190
|
+
<h2>Agent run {run.id}</h2>
|
|
200
191
|
<ol>
|
|
201
192
|
{run.trail.map((step, i) => (
|
|
202
193
|
<li key={`${step.tool}-${i}`}>
|
|
203
|
-
<span>{trailStatusLabel(step.status)}</span>{
|
|
204
|
-
<span>{step.tool}</span>
|
|
194
|
+
<span>{trailStatusLabel(step.status)}</span> <span>{step.tool}</span>
|
|
205
195
|
{step.status === "denied" && step.denial ? (
|
|
206
196
|
<p role="status">
|
|
207
197
|
DENIED by gate {step.denial.gate}: {step.denial.reason}
|
|
@@ -225,8 +215,7 @@ export function AiA11yView(props: AiA11yViewProps) {
|
|
|
225
215
|
<ul>
|
|
226
216
|
{data.fallbackChains.map((chain, i) => (
|
|
227
217
|
<li key={i}>
|
|
228
|
-
{chain.prompt}:{" "}
|
|
229
|
-
{chain.attempts.map((a) => a.model).join(" → ")}
|
|
218
|
+
{chain.prompt}: {chain.attempts.map((a) => a.model).join(" → ")}
|
|
230
219
|
{chain.costConsequence !== null
|
|
231
220
|
? ` · cost consequence ${formatCost(chain.costConsequence)}`
|
|
232
221
|
: ""}
|
|
@@ -16,8 +16,7 @@ describe("AI panel accessibility", () => {
|
|
|
16
16
|
let container: HTMLElement;
|
|
17
17
|
|
|
18
18
|
beforeEach(() => {
|
|
19
|
-
(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT =
|
|
20
|
-
true;
|
|
19
|
+
(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
|
|
21
20
|
window = new Window({ url: "http://console.test/ai" });
|
|
22
21
|
Object.defineProperty(globalThis, "window", {
|
|
23
22
|
value: window,
|
|
@@ -70,9 +69,7 @@ describe("AI panel accessibility", () => {
|
|
|
70
69
|
|
|
71
70
|
test("axe reports zero violations at WCAG 2.2 AA", async () => {
|
|
72
71
|
await act(async () => {
|
|
73
|
-
root.render(
|
|
74
|
-
<AiA11yView openPrompt="ticket-triage" openVersion={3} openAgent="support" />,
|
|
75
|
-
);
|
|
72
|
+
root.render(<AiA11yView openPrompt="ticket-triage" openVersion={3} openAgent="support" />);
|
|
76
73
|
});
|
|
77
74
|
|
|
78
75
|
await new Promise((r) => setTimeout(r, 10));
|
|
@@ -4,14 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import type { AiListResponse, PromptVersionMetrics } from "./types.ts";
|
|
6
6
|
|
|
7
|
-
function dist(
|
|
8
|
-
samples: readonly number[],
|
|
9
|
-
): PromptVersionMetrics["cost"] {
|
|
7
|
+
function dist(samples: readonly number[]): PromptVersionMetrics["cost"] {
|
|
10
8
|
const sorted = [...samples].sort((a, b) => a - b);
|
|
11
|
-
const mean =
|
|
12
|
-
sorted.length === 0
|
|
13
|
-
? 0
|
|
14
|
-
: sorted.reduce((a, b) => a + b, 0) / sorted.length;
|
|
9
|
+
const mean = sorted.length === 0 ? 0 : sorted.reduce((a, b) => a + b, 0) / sorted.length;
|
|
15
10
|
const p50 = sorted[Math.floor(sorted.length * 0.5)] ?? 0;
|
|
16
11
|
const p95 = sorted[Math.floor(sorted.length * 0.95)] ?? p50;
|
|
17
12
|
const min = sorted[0] ?? 0;
|
|
@@ -65,9 +65,7 @@ export function distributionSummary(
|
|
|
65
65
|
*
|
|
66
66
|
* @param buckets - Histogram
|
|
67
67
|
*/
|
|
68
|
-
export function maxBucketCount(
|
|
69
|
-
buckets: readonly AiDistributionBucket[],
|
|
70
|
-
): number {
|
|
68
|
+
export function maxBucketCount(buckets: readonly AiDistributionBucket[]): number {
|
|
71
69
|
return buckets.reduce((m, b) => Math.max(m, b.count), 0);
|
|
72
70
|
}
|
|
73
71
|
|
|
@@ -25,9 +25,7 @@ describe("AI group helpers", () => {
|
|
|
25
25
|
|
|
26
26
|
test("allowPiiStanding keeps only acknowledgements", () => {
|
|
27
27
|
expect(allowPiiStanding(AI_LIST_FIXTURE.allowPii)).toHaveLength(1);
|
|
28
|
-
expect(allowPiiStanding(AI_LIST_FIXTURE.allowPii)[0]!.flowId).toBe(
|
|
29
|
-
"support.createTicket",
|
|
30
|
-
);
|
|
28
|
+
expect(allowPiiStanding(AI_LIST_FIXTURE.allowPii)[0]!.flowId).toBe("support.createTicket");
|
|
31
29
|
});
|
|
32
30
|
|
|
33
31
|
test("runsForAgent + filterAgents", () => {
|
|
@@ -24,8 +24,7 @@ export function filterPrompts(
|
|
|
24
24
|
if (!needle) return prompts;
|
|
25
25
|
return prompts.filter(
|
|
26
26
|
(p) =>
|
|
27
|
-
p.name.toLowerCase().includes(needle) ||
|
|
28
|
-
(p.model?.toLowerCase().includes(needle) ?? false),
|
|
27
|
+
p.name.toLowerCase().includes(needle) || (p.model?.toLowerCase().includes(needle) ?? false),
|
|
29
28
|
);
|
|
30
29
|
}
|
|
31
30
|
|
|
@@ -58,9 +57,7 @@ export function versionsForPrompt(
|
|
|
58
57
|
versions: readonly PromptVersionMetrics[],
|
|
59
58
|
prompt: string,
|
|
60
59
|
): readonly PromptVersionMetrics[] {
|
|
61
|
-
return versions
|
|
62
|
-
.filter((v) => v.prompt === prompt)
|
|
63
|
-
.sort((a, b) => a.version - b.version);
|
|
60
|
+
return versions.filter((v) => v.prompt === prompt).sort((a, b) => a.version - b.version);
|
|
64
61
|
}
|
|
65
62
|
|
|
66
63
|
/**
|
|
@@ -69,10 +66,7 @@ export function versionsForPrompt(
|
|
|
69
66
|
* @param runs - All runs
|
|
70
67
|
* @param agent - Agent name
|
|
71
68
|
*/
|
|
72
|
-
export function runsForAgent(
|
|
73
|
-
runs: readonly AgentRunRow[],
|
|
74
|
-
agent: string,
|
|
75
|
-
): readonly AgentRunRow[] {
|
|
69
|
+
export function runsForAgent(runs: readonly AgentRunRow[], agent: string): readonly AgentRunRow[] {
|
|
76
70
|
return runs.filter((r) => r.agent === agent);
|
|
77
71
|
}
|
|
78
72
|
|
|
@@ -81,8 +75,6 @@ export function runsForAgent(
|
|
|
81
75
|
*
|
|
82
76
|
* @param rows - All allowPii projections
|
|
83
77
|
*/
|
|
84
|
-
export function allowPiiStanding(
|
|
85
|
-
rows: readonly AllowPiiRow[],
|
|
86
|
-
): readonly AllowPiiRow[] {
|
|
78
|
+
export function allowPiiStanding(rows: readonly AllowPiiRow[]): readonly AllowPiiRow[] {
|
|
87
79
|
return rows.filter((r) => r.allowPii);
|
|
88
80
|
}
|
|
@@ -54,13 +54,6 @@ export {
|
|
|
54
54
|
trailStatusLabel,
|
|
55
55
|
} from "./format.ts";
|
|
56
56
|
|
|
57
|
-
export {
|
|
58
|
-
AI_LIST_FIXTURE,
|
|
59
|
-
VERSION_V2,
|
|
60
|
-
VERSION_V3,
|
|
61
|
-
} from "./fixture.ts";
|
|
57
|
+
export { AI_LIST_FIXTURE, VERSION_V2, VERSION_V3 } from "./fixture.ts";
|
|
62
58
|
|
|
63
|
-
export {
|
|
64
|
-
overBudgetFindings,
|
|
65
|
-
type OverBudgetFinding,
|
|
66
|
-
} from "./findings.ts";
|
|
59
|
+
export { overBudgetFindings, type OverBudgetFinding } from "./findings.ts";
|
|
@@ -4,10 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { describe, expect, test } from "bun:test";
|
|
6
6
|
import { VERSION_V2, VERSION_V3 } from "./fixture.ts";
|
|
7
|
-
import {
|
|
8
|
-
formatPromotionBlockers,
|
|
9
|
-
promotionDecision,
|
|
10
|
-
} from "./promotion.ts";
|
|
7
|
+
import { formatPromotionBlockers, promotionDecision } from "./promotion.ts";
|
|
11
8
|
import type { PromptVersionMetrics } from "./types.ts";
|
|
12
9
|
|
|
13
10
|
function withRates(
|
|
@@ -29,9 +26,7 @@ describe("promotionDecision", () => {
|
|
|
29
26
|
expect(decision.numbers.fromSchemaInvalidRate).toBe(0.02);
|
|
30
27
|
const lines = formatPromotionBlockers(decision);
|
|
31
28
|
expect(lines.some((l) => l.includes("schema-invalid"))).toBe(true);
|
|
32
|
-
expect(lines.some((l) => l.includes("improved — still blocked"))).toBe(
|
|
33
|
-
true,
|
|
34
|
-
);
|
|
29
|
+
expect(lines.some((l) => l.includes("improved — still blocked"))).toBe(true);
|
|
35
30
|
});
|
|
36
31
|
|
|
37
32
|
test("allows when schema and budget do not regress", () => {
|
|
@@ -56,9 +56,7 @@ export function promotionDecision(
|
|
|
56
56
|
to: PromptVersionMetrics,
|
|
57
57
|
): PromotionDecision {
|
|
58
58
|
if (from.prompt !== to.prompt) {
|
|
59
|
-
throw new Error(
|
|
60
|
-
`promotionDecision: prompt mismatch (${from.prompt} vs ${to.prompt})`,
|
|
61
|
-
);
|
|
59
|
+
throw new Error(`promotionDecision: prompt mismatch (${from.prompt} vs ${to.prompt})`);
|
|
62
60
|
}
|
|
63
61
|
|
|
64
62
|
const numbers: PromotionNumbers = {
|
|
@@ -70,8 +68,7 @@ export function promotionDecision(
|
|
|
70
68
|
toOverBudgetRate: to.overBudgetRate,
|
|
71
69
|
fromP95Cost: from.cost.p95,
|
|
72
70
|
toP95Cost: to.cost.p95,
|
|
73
|
-
budgetMaxCostPerCall:
|
|
74
|
-
to.budgetMaxCostPerCall ?? from.budgetMaxCostPerCall,
|
|
71
|
+
budgetMaxCostPerCall: to.budgetMaxCostPerCall ?? from.budgetMaxCostPerCall,
|
|
75
72
|
};
|
|
76
73
|
|
|
77
74
|
const blockers: PromotionBlocker[] = [];
|
|
@@ -86,11 +83,7 @@ export function promotionDecision(
|
|
|
86
83
|
const budget = numbers.budgetMaxCostPerCall;
|
|
87
84
|
if (to.overBudgetRate > from.overBudgetRate + 1e-12) {
|
|
88
85
|
blockers.push("budget");
|
|
89
|
-
} else if (
|
|
90
|
-
budget !== null &&
|
|
91
|
-
to.cost.p95 > budget &&
|
|
92
|
-
from.cost.p95 <= budget
|
|
93
|
-
) {
|
|
86
|
+
} else if (budget !== null && to.cost.p95 > budget && from.cost.p95 <= budget) {
|
|
94
87
|
blockers.push("budget");
|
|
95
88
|
}
|
|
96
89
|
|
|
@@ -133,9 +126,7 @@ export function formatPromotionBlockers(
|
|
|
133
126
|
}
|
|
134
127
|
if (decision.blockers.includes("budget")) {
|
|
135
128
|
const budget =
|
|
136
|
-
n.budgetMaxCostPerCall !== null
|
|
137
|
-
? `budget $${n.budgetMaxCostPerCall.toFixed(4)}`
|
|
138
|
-
: "budget";
|
|
129
|
+
n.budgetMaxCostPerCall !== null ? `budget $${n.budgetMaxCostPerCall.toFixed(4)}` : "budget";
|
|
139
130
|
lines.push(
|
|
140
131
|
`over-budget ${(n.fromOverBudgetRate * 100).toFixed(1)}% → ${(n.toOverBudgetRate * 100).toFixed(1)}%` +
|
|
141
132
|
` · p95 $${n.fromP95Cost.toFixed(4)} → $${n.toP95Cost.toFixed(4)} (${budget})`,
|
|
@@ -3,12 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { describe, expect, test } from "bun:test";
|
|
6
|
-
import {
|
|
7
|
-
manifestDiffHref,
|
|
8
|
-
openPromptVersion,
|
|
9
|
-
parseAiSearch,
|
|
10
|
-
serializeAiSearch,
|
|
11
|
-
} from "./search.ts";
|
|
6
|
+
import { manifestDiffHref, openPromptVersion, parseAiSearch, serializeAiSearch } from "./search.ts";
|
|
12
7
|
|
|
13
8
|
describe("AI search", () => {
|
|
14
9
|
test("round-trips prompt + version", () => {
|
|
@@ -28,11 +23,7 @@ describe("AI search", () => {
|
|
|
28
23
|
});
|
|
29
24
|
|
|
30
25
|
test("openPromptVersion clears agent selection", () => {
|
|
31
|
-
const next = openPromptVersion(
|
|
32
|
-
{ agent: "support", run: "r1" },
|
|
33
|
-
"ticket-triage",
|
|
34
|
-
3,
|
|
35
|
-
);
|
|
26
|
+
const next = openPromptVersion({ agent: "support", run: "r1" }, "ticket-triage", 3);
|
|
36
27
|
expect(next.agent).toBeUndefined();
|
|
37
28
|
expect(next.prompt).toBe("ticket-triage");
|
|
38
29
|
expect(next.version).toBe(3);
|
|
@@ -36,9 +36,7 @@ export function parseAiSearch(search: Record<string, unknown>): AiSearch {
|
|
|
36
36
|
*
|
|
37
37
|
* @param search - Typed search
|
|
38
38
|
*/
|
|
39
|
-
export function serializeAiSearch(
|
|
40
|
-
search: AiSearch,
|
|
41
|
-
): Record<string, string | number> {
|
|
39
|
+
export function serializeAiSearch(search: AiSearch): Record<string, string | number> {
|
|
42
40
|
const out: Record<string, string | number> = {};
|
|
43
41
|
if (search.prompt) out.prompt = search.prompt;
|
|
44
42
|
if (search.version !== undefined) out.version = search.version;
|
|
@@ -55,11 +53,7 @@ export function serializeAiSearch(
|
|
|
55
53
|
* @param prompt - Prompt name
|
|
56
54
|
* @param version - Version
|
|
57
55
|
*/
|
|
58
|
-
export function openPromptVersion(
|
|
59
|
-
search: AiSearch,
|
|
60
|
-
prompt: string,
|
|
61
|
-
version: number,
|
|
62
|
-
): AiSearch {
|
|
56
|
+
export function openPromptVersion(search: AiSearch, prompt: string, version: number): AiSearch {
|
|
63
57
|
return { ...search, prompt, version, agent: undefined, run: undefined };
|
|
64
58
|
}
|
|
65
59
|
|
|
@@ -70,11 +64,7 @@ export function openPromptVersion(
|
|
|
70
64
|
* @param agent - Agent name
|
|
71
65
|
* @param run - Run id
|
|
72
66
|
*/
|
|
73
|
-
export function openAgentRun(
|
|
74
|
-
search: AiSearch,
|
|
75
|
-
agent: string,
|
|
76
|
-
run: string,
|
|
77
|
-
): AiSearch {
|
|
67
|
+
export function openAgentRun(search: AiSearch, agent: string, run: string): AiSearch {
|
|
78
68
|
return { ...search, agent, run };
|
|
79
69
|
}
|
|
80
70
|
|
|
@@ -88,14 +88,7 @@ export interface FallbackChainRow {
|
|
|
88
88
|
|
|
89
89
|
/** Agent tool effect — Flows/Traces vocabulary. */
|
|
90
90
|
export interface AgentToolEffect {
|
|
91
|
-
readonly kind:
|
|
92
|
-
| "read"
|
|
93
|
-
| "write"
|
|
94
|
-
| "emit"
|
|
95
|
-
| "send"
|
|
96
|
-
| "ask"
|
|
97
|
-
| "secret"
|
|
98
|
-
| "call";
|
|
91
|
+
readonly kind: "read" | "write" | "emit" | "send" | "ask" | "secret" | "call";
|
|
99
92
|
readonly resource: string;
|
|
100
93
|
}
|
|
101
94
|
|
|
@@ -4,10 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { buildCausalityGraph } from "../flows/graph.ts";
|
|
7
|
-
import {
|
|
8
|
-
ARCHITECTURE_RUNS_FIXTURE,
|
|
9
|
-
ARCHITECTURE_TEST_MANIFEST,
|
|
10
|
-
} from "./fixture.ts";
|
|
7
|
+
import { ARCHITECTURE_RUNS_FIXTURE, ARCHITECTURE_TEST_MANIFEST } from "./fixture.ts";
|
|
11
8
|
import { LAYER_LABEL, ELEMENT_LAYERS } from "./types.ts";
|
|
12
9
|
import { buildArchitectureView } from "./view.ts";
|
|
13
10
|
import { layersOf, type ArchitectureSearch } from "./search.ts";
|
|
@@ -44,9 +41,7 @@ export function ArchitectureA11yView(props: ArchitectureA11yViewProps) {
|
|
|
44
41
|
<header>
|
|
45
42
|
<h1>Architecture</h1>
|
|
46
43
|
<p>What shape — clustered by unit, typed layers, live traffic</p>
|
|
47
|
-
<p role="status">
|
|
48
|
-
Boundary crossings: {view.boundaryCrossingCount}
|
|
49
|
-
</p>
|
|
44
|
+
<p role="status">Boundary crossings: {view.boundaryCrossingCount}</p>
|
|
50
45
|
</header>
|
|
51
46
|
|
|
52
47
|
<main id="architecture-main">
|
|
@@ -74,22 +69,12 @@ export function ArchitectureA11yView(props: ArchitectureA11yViewProps) {
|
|
|
74
69
|
<fieldset>
|
|
75
70
|
<legend>Focus depth</legend>
|
|
76
71
|
<label>
|
|
77
|
-
<input
|
|
78
|
-
|
|
79
|
-
name="depth"
|
|
80
|
-
checked={view.depth === 1}
|
|
81
|
-
onChange={() => {}}
|
|
82
|
-
/>{" "}
|
|
83
|
-
1 hop
|
|
72
|
+
<input type="radio" name="depth" checked={view.depth === 1} onChange={() => {}} /> 1
|
|
73
|
+
hop
|
|
84
74
|
</label>
|
|
85
75
|
<label>
|
|
86
|
-
<input
|
|
87
|
-
|
|
88
|
-
name="depth"
|
|
89
|
-
checked={view.depth === 2}
|
|
90
|
-
onChange={() => {}}
|
|
91
|
-
/>{" "}
|
|
92
|
-
2 hops
|
|
76
|
+
<input type="radio" name="depth" checked={view.depth === 2} onChange={() => {}} /> 2
|
|
77
|
+
hops
|
|
93
78
|
</label>
|
|
94
79
|
</fieldset>
|
|
95
80
|
</div>
|
|
@@ -116,15 +101,9 @@ export function ArchitectureA11yView(props: ArchitectureA11yViewProps) {
|
|
|
116
101
|
<ul aria-label="Nodes">
|
|
117
102
|
{view.nodes.map((n) => (
|
|
118
103
|
<li key={n.id}>
|
|
119
|
-
<button
|
|
120
|
-
type="button"
|
|
121
|
-
aria-pressed={n.focused === true}
|
|
122
|
-
style={{ minHeight: 32 }}
|
|
123
|
-
>
|
|
104
|
+
<button type="button" aria-pressed={n.focused === true} style={{ minHeight: 32 }}>
|
|
124
105
|
{n.label}
|
|
125
|
-
{n.kind === "unit" && n.flowCount !== undefined
|
|
126
|
-
? ` (${n.flowCount} flows)`
|
|
127
|
-
: ""}
|
|
106
|
+
{n.kind === "unit" && n.flowCount !== undefined ? ` (${n.flowCount} flows)` : ""}
|
|
128
107
|
{!n.insideBoundary ? " — outside boundary" : ""}
|
|
129
108
|
</button>
|
|
130
109
|
</li>
|
|
@@ -16,8 +16,7 @@ describe("Architecture panel accessibility", () => {
|
|
|
16
16
|
let container: HTMLElement;
|
|
17
17
|
|
|
18
18
|
beforeEach(() => {
|
|
19
|
-
(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT =
|
|
20
|
-
true;
|
|
19
|
+
(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
|
|
21
20
|
window = new Window({ url: "http://console.test/architecture" });
|
|
22
21
|
Object.defineProperty(globalThis, "window", {
|
|
23
22
|
value: window,
|
|
@@ -5,11 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { CausalityGraph, FlowNode } from "../flows/graph.ts";
|
|
8
|
-
import {
|
|
9
|
-
isBoundaryExternal,
|
|
10
|
-
layerOfCause,
|
|
11
|
-
layerOfEffectRef,
|
|
12
|
-
} from "./layers.ts";
|
|
8
|
+
import { isBoundaryExternal, layerOfCause, layerOfEffectRef } from "./layers.ts";
|
|
13
9
|
import type { ElementLayer } from "./types.ts";
|
|
14
10
|
|
|
15
11
|
/** One fine-grained declared relationship before aggregation / focus. */
|