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
|
@@ -57,174 +57,113 @@ const indexRoute = createRoute({
|
|
|
57
57
|
const overviewRoute = createRoute({
|
|
58
58
|
getParentRoute: () => rootRoute,
|
|
59
59
|
path: "/overview",
|
|
60
|
-
component: lazyRouteComponent(
|
|
61
|
-
() => import("./panels/Overview.tsx"),
|
|
62
|
-
"default",
|
|
63
|
-
),
|
|
60
|
+
component: lazyRouteComponent(() => import("./panels/Overview.tsx"), "default"),
|
|
64
61
|
});
|
|
65
62
|
|
|
66
63
|
const flowsRoute = createRoute({
|
|
67
64
|
getParentRoute: () => rootRoute,
|
|
68
65
|
path: "/flows",
|
|
69
66
|
validateSearch: (search: Record<string, unknown>) => parseFlowsSearch(search),
|
|
70
|
-
component: lazyRouteComponent(
|
|
71
|
-
() => import("./panels/Flows.tsx"),
|
|
72
|
-
"default",
|
|
73
|
-
),
|
|
67
|
+
component: lazyRouteComponent(() => import("./panels/Flows.tsx"), "default"),
|
|
74
68
|
});
|
|
75
69
|
|
|
76
70
|
const tracesRoute = createRoute({
|
|
77
71
|
getParentRoute: () => rootRoute,
|
|
78
72
|
path: "/traces",
|
|
79
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
80
|
-
|
|
81
|
-
component: lazyRouteComponent(
|
|
82
|
-
() => import("./panels/Traces.tsx"),
|
|
83
|
-
"default",
|
|
84
|
-
),
|
|
73
|
+
validateSearch: (search: Record<string, unknown>) => parseTracesSearch(search),
|
|
74
|
+
component: lazyRouteComponent(() => import("./panels/Traces.tsx"), "default"),
|
|
85
75
|
});
|
|
86
76
|
|
|
87
77
|
const runsRoute = createRoute({
|
|
88
78
|
getParentRoute: () => rootRoute,
|
|
89
79
|
path: "/runs",
|
|
90
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
91
|
-
|
|
92
|
-
component: lazyRouteComponent(
|
|
93
|
-
() => import("./panels/Runs.tsx"),
|
|
94
|
-
"default",
|
|
95
|
-
),
|
|
80
|
+
validateSearch: (search: Record<string, unknown>) => parseRunsSearch(search),
|
|
81
|
+
component: lazyRouteComponent(() => import("./panels/Runs.tsx"), "default"),
|
|
96
82
|
});
|
|
97
83
|
|
|
98
84
|
const signalsRoute = createRoute({
|
|
99
85
|
getParentRoute: () => rootRoute,
|
|
100
86
|
path: "/signals",
|
|
101
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
102
|
-
|
|
103
|
-
component: lazyRouteComponent(
|
|
104
|
-
() => import("./panels/Signals.tsx"),
|
|
105
|
-
"default",
|
|
106
|
-
),
|
|
87
|
+
validateSearch: (search: Record<string, unknown>) => parseSignalsSearch(search),
|
|
88
|
+
component: lazyRouteComponent(() => import("./panels/Signals.tsx"), "default"),
|
|
107
89
|
});
|
|
108
90
|
|
|
109
91
|
const storeRoute = createRoute({
|
|
110
92
|
getParentRoute: () => rootRoute,
|
|
111
93
|
path: "/store",
|
|
112
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
113
|
-
|
|
114
|
-
component: lazyRouteComponent(
|
|
115
|
-
() => import("./panels/Store.tsx"),
|
|
116
|
-
"default",
|
|
117
|
-
),
|
|
94
|
+
validateSearch: (search: Record<string, unknown>) => parseStoreSearch(search),
|
|
95
|
+
component: lazyRouteComponent(() => import("./panels/Store.tsx"), "default"),
|
|
118
96
|
});
|
|
119
97
|
|
|
120
98
|
const vaultRoute = createRoute({
|
|
121
99
|
getParentRoute: () => rootRoute,
|
|
122
100
|
path: "/vault",
|
|
123
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
124
|
-
|
|
125
|
-
component: lazyRouteComponent(
|
|
126
|
-
() => import("./panels/Vault.tsx"),
|
|
127
|
-
"default",
|
|
128
|
-
),
|
|
101
|
+
validateSearch: (search: Record<string, unknown>) => parseVaultSearch(search),
|
|
102
|
+
component: lazyRouteComponent(() => import("./panels/Vault.tsx"), "default"),
|
|
129
103
|
});
|
|
130
104
|
|
|
131
105
|
const gatesRoute = createRoute({
|
|
132
106
|
getParentRoute: () => rootRoute,
|
|
133
107
|
path: "/gates",
|
|
134
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
135
|
-
|
|
136
|
-
component: lazyRouteComponent(
|
|
137
|
-
() => import("./panels/Gates.tsx"),
|
|
138
|
-
"default",
|
|
139
|
-
),
|
|
108
|
+
validateSearch: (search: Record<string, unknown>) => parseGatesSearch(search),
|
|
109
|
+
component: lazyRouteComponent(() => import("./panels/Gates.tsx"), "default"),
|
|
140
110
|
});
|
|
141
111
|
|
|
142
112
|
const clockRoute = createRoute({
|
|
143
113
|
getParentRoute: () => rootRoute,
|
|
144
114
|
path: "/clock",
|
|
145
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
146
|
-
|
|
147
|
-
component: lazyRouteComponent(
|
|
148
|
-
() => import("./panels/Clock.tsx"),
|
|
149
|
-
"default",
|
|
150
|
-
),
|
|
115
|
+
validateSearch: (search: Record<string, unknown>) => parseClockSearch(search),
|
|
116
|
+
component: lazyRouteComponent(() => import("./panels/Clock.tsx"), "default"),
|
|
151
117
|
});
|
|
152
118
|
|
|
153
119
|
const aiRoute = createRoute({
|
|
154
120
|
getParentRoute: () => rootRoute,
|
|
155
121
|
path: "/ai",
|
|
156
122
|
validateSearch: (search: Record<string, unknown>) => parseAiSearch(search),
|
|
157
|
-
component: lazyRouteComponent(
|
|
158
|
-
() => import("./panels/Ai.tsx"),
|
|
159
|
-
"default",
|
|
160
|
-
),
|
|
123
|
+
component: lazyRouteComponent(() => import("./panels/Ai.tsx"), "default"),
|
|
161
124
|
});
|
|
162
125
|
|
|
163
126
|
const channelsRoute = createRoute({
|
|
164
127
|
getParentRoute: () => rootRoute,
|
|
165
128
|
path: "/channels",
|
|
166
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
167
|
-
|
|
168
|
-
component: lazyRouteComponent(
|
|
169
|
-
() => import("./panels/Channels.tsx"),
|
|
170
|
-
"default",
|
|
171
|
-
),
|
|
129
|
+
validateSearch: (search: Record<string, unknown>) => parseChannelsSearch(search),
|
|
130
|
+
component: lazyRouteComponent(() => import("./panels/Channels.tsx"), "default"),
|
|
172
131
|
});
|
|
173
132
|
|
|
174
133
|
const architectureRoute = createRoute({
|
|
175
134
|
getParentRoute: () => rootRoute,
|
|
176
135
|
path: "/architecture",
|
|
177
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
178
|
-
|
|
179
|
-
component: lazyRouteComponent(
|
|
180
|
-
() => import("./panels/Architecture.tsx"),
|
|
181
|
-
"default",
|
|
182
|
-
),
|
|
136
|
+
validateSearch: (search: Record<string, unknown>) => parseArchitectureSearch(search),
|
|
137
|
+
component: lazyRouteComponent(() => import("./panels/Architecture.tsx"), "default"),
|
|
183
138
|
});
|
|
184
139
|
|
|
185
140
|
const accessRoute = createRoute({
|
|
186
141
|
getParentRoute: () => rootRoute,
|
|
187
142
|
path: "/access",
|
|
188
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
189
|
-
|
|
190
|
-
component: lazyRouteComponent(
|
|
191
|
-
() => import("./panels/Access.tsx"),
|
|
192
|
-
"default",
|
|
193
|
-
),
|
|
143
|
+
validateSearch: (search: Record<string, unknown>) => parseAccessSearch(search),
|
|
144
|
+
component: lazyRouteComponent(() => import("./panels/Access.tsx"), "default"),
|
|
194
145
|
});
|
|
195
146
|
|
|
196
147
|
const manifestDiffRoute = createRoute({
|
|
197
148
|
getParentRoute: () => rootRoute,
|
|
198
149
|
path: "/manifest-diff",
|
|
199
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
200
|
-
|
|
201
|
-
component: lazyRouteComponent(
|
|
202
|
-
() => import("./panels/Diff.tsx"),
|
|
203
|
-
"default",
|
|
204
|
-
),
|
|
150
|
+
validateSearch: (search: Record<string, unknown>) => parseDiffSearch(search),
|
|
151
|
+
component: lazyRouteComponent(() => import("./panels/Diff.tsx"), "default"),
|
|
205
152
|
});
|
|
206
153
|
|
|
207
154
|
/** Alias for AI deep-links that historically used `/diff`. */
|
|
208
155
|
const diffAliasRoute = createRoute({
|
|
209
156
|
getParentRoute: () => rootRoute,
|
|
210
157
|
path: "/diff",
|
|
211
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
212
|
-
|
|
213
|
-
component: lazyRouteComponent(
|
|
214
|
-
() => import("./panels/Diff.tsx"),
|
|
215
|
-
"default",
|
|
216
|
-
),
|
|
158
|
+
validateSearch: (search: Record<string, unknown>) => parseDiffSearch(search),
|
|
159
|
+
component: lazyRouteComponent(() => import("./panels/Diff.tsx"), "default"),
|
|
217
160
|
});
|
|
218
161
|
|
|
219
162
|
const pluginsRoute = createRoute({
|
|
220
163
|
getParentRoute: () => rootRoute,
|
|
221
164
|
path: "/plugins",
|
|
222
|
-
validateSearch: (search: Record<string, unknown>) =>
|
|
223
|
-
|
|
224
|
-
component: lazyRouteComponent(
|
|
225
|
-
() => import("./panels/Plugins.tsx"),
|
|
226
|
-
"default",
|
|
227
|
-
),
|
|
165
|
+
validateSearch: (search: Record<string, unknown>) => parsePluginsSearch(search),
|
|
166
|
+
component: lazyRouteComponent(() => import("./panels/Plugins.tsx"), "default"),
|
|
228
167
|
});
|
|
229
168
|
|
|
230
169
|
const routeTree = rootRoute.addChildren([
|
|
@@ -249,9 +188,7 @@ const routeTree = rootRoute.addChildren([
|
|
|
249
188
|
const router = createRouter({
|
|
250
189
|
routeTree,
|
|
251
190
|
defaultPendingComponent: () => (
|
|
252
|
-
<div className="grid h-full place-items-center text-[var(--oke-muted)]">
|
|
253
|
-
Loading panel…
|
|
254
|
-
</div>
|
|
191
|
+
<div className="grid h-full place-items-center text-[var(--oke-muted)]">Loading panel…</div>
|
|
255
192
|
),
|
|
256
193
|
});
|
|
257
194
|
|
|
@@ -269,9 +206,7 @@ createRoot(el).render(
|
|
|
269
206
|
<QueryClientProvider client={queryClient}>
|
|
270
207
|
<Suspense
|
|
271
208
|
fallback={
|
|
272
|
-
<div className="grid h-full place-items-center text-[var(--oke-muted)]">
|
|
273
|
-
Loading…
|
|
274
|
-
</div>
|
|
209
|
+
<div className="grid h-full place-items-center text-[var(--oke-muted)]">Loading…</div>
|
|
275
210
|
}
|
|
276
211
|
>
|
|
277
212
|
<RouterProvider router={router} />
|
|
@@ -43,9 +43,7 @@ export function AccessPanel() {
|
|
|
43
43
|
const [reason, setReason] = useState("");
|
|
44
44
|
const [onceSecret, setOnceSecret] = useState<OnceSecretState | null>(null);
|
|
45
45
|
const [blast, setBlast] = useState<AccessBlastRadius | null>(null);
|
|
46
|
-
const [effective, setEffective] = useState<AccessEffectiveResponse | null>(
|
|
47
|
-
null,
|
|
48
|
-
);
|
|
46
|
+
const [effective, setEffective] = useState<AccessEffectiveResponse | null>(null);
|
|
49
47
|
|
|
50
48
|
const setSearch = (next: AccessSearch) => {
|
|
51
49
|
void navigate({
|
|
@@ -65,31 +63,22 @@ export function AccessPanel() {
|
|
|
65
63
|
});
|
|
66
64
|
|
|
67
65
|
const data = listQuery.data;
|
|
68
|
-
const section =
|
|
69
|
-
plane === "operator" ? data?.operatorPlane : data?.userPlane;
|
|
66
|
+
const section = plane === "operator" ? data?.operatorPlane : data?.userPlane;
|
|
70
67
|
const grantable = section?.grantableScopes ?? [];
|
|
71
68
|
const hygiene = data?.hygiene;
|
|
72
|
-
const lines = useMemo(
|
|
73
|
-
() => (hygiene ? hygieneLines(hygiene) : []),
|
|
74
|
-
[hygiene],
|
|
75
|
-
);
|
|
69
|
+
const lines = useMemo(() => (hygiene ? hygieneLines(hygiene) : []), [hygiene]);
|
|
76
70
|
|
|
77
71
|
const openKey: AccessKeyRecord | undefined = section?.keys.find(
|
|
78
72
|
(k) => search.kind === "key" && k.id === search.id,
|
|
79
73
|
);
|
|
80
|
-
const openRole = section?.roles.find(
|
|
81
|
-
(r) => search.kind === "role" && r.id === search.id,
|
|
82
|
-
);
|
|
74
|
+
const openRole = section?.roles.find((r) => search.kind === "role" && r.id === search.id);
|
|
83
75
|
const openOperator = section?.operators?.find(
|
|
84
76
|
(o) => search.kind === "operator" && o.id === search.id,
|
|
85
77
|
);
|
|
86
|
-
const openUser = section?.users?.find(
|
|
87
|
-
(u) => search.kind === "user" && u.id === search.id,
|
|
88
|
-
);
|
|
78
|
+
const openUser = section?.users?.find((u) => search.kind === "user" && u.id === search.id);
|
|
89
79
|
|
|
90
80
|
const q = (search.q ?? "").toLowerCase();
|
|
91
|
-
const filterText = (text: string) =>
|
|
92
|
-
q.length === 0 || text.toLowerCase().includes(q);
|
|
81
|
+
const filterText = (text: string) => q.length === 0 || text.toLowerCase().includes(q);
|
|
93
82
|
|
|
94
83
|
const createKey = useMutation({
|
|
95
84
|
mutationFn: async () => {
|
|
@@ -195,10 +184,7 @@ export function AccessPanel() {
|
|
|
195
184
|
|
|
196
185
|
const loadEffective = useMutation({
|
|
197
186
|
mutationFn: async () => {
|
|
198
|
-
const kind =
|
|
199
|
-
search.kind === "invite" || !search.kind || !search.id
|
|
200
|
-
? null
|
|
201
|
-
: search.kind;
|
|
187
|
+
const kind = search.kind === "invite" || !search.kind || !search.id ? null : search.kind;
|
|
202
188
|
if (!kind || !search.id) throw new Error("Select a principal");
|
|
203
189
|
const res = await consoleCalls.accessEffective({
|
|
204
190
|
kind,
|
|
@@ -282,9 +268,7 @@ export function AccessPanel() {
|
|
|
282
268
|
<Input
|
|
283
269
|
aria-label="Filter access"
|
|
284
270
|
value={search.q ?? ""}
|
|
285
|
-
onChange={(e) =>
|
|
286
|
-
setSearch({ ...search, q: e.currentTarget.value || undefined })
|
|
287
|
-
}
|
|
271
|
+
onChange={(e) => setSearch({ ...search, q: e.currentTarget.value || undefined })}
|
|
288
272
|
/>
|
|
289
273
|
</label>
|
|
290
274
|
</header>
|
|
@@ -322,9 +306,7 @@ export function AccessPanel() {
|
|
|
322
306
|
key={op.id}
|
|
323
307
|
selected={search.kind === "operator" && search.id === op.id}
|
|
324
308
|
onClick={() =>
|
|
325
|
-
setSearch(
|
|
326
|
-
openAccessEntity(search, "operator", "operator", op.id),
|
|
327
|
-
)
|
|
309
|
+
setSearch(openAccessEntity(search, "operator", "operator", op.id))
|
|
328
310
|
}
|
|
329
311
|
>
|
|
330
312
|
{op.name}
|
|
@@ -344,9 +326,7 @@ export function AccessPanel() {
|
|
|
344
326
|
<EntityButton
|
|
345
327
|
key={u.id}
|
|
346
328
|
selected={search.kind === "user" && search.id === u.id}
|
|
347
|
-
onClick={() =>
|
|
348
|
-
setSearch(openAccessEntity(search, "user", "user", u.id))
|
|
349
|
-
}
|
|
329
|
+
onClick={() => setSearch(openAccessEntity(search, "user", "user", u.id))}
|
|
350
330
|
>
|
|
351
331
|
{u.name}
|
|
352
332
|
</EntityButton>
|
|
@@ -385,9 +365,7 @@ export function AccessPanel() {
|
|
|
385
365
|
}}
|
|
386
366
|
>
|
|
387
367
|
{k.name}
|
|
388
|
-
{k.unused90d ? (
|
|
389
|
-
<span className="text-[var(--oke-muted)]"> · 90d+</span>
|
|
390
|
-
) : null}
|
|
368
|
+
{k.unused90d ? <span className="text-[var(--oke-muted)]"> · 90d+</span> : null}
|
|
391
369
|
{k.revokedAt != null ? (
|
|
392
370
|
<span className="text-[var(--oke-danger)]"> · revoked</span>
|
|
393
371
|
) : null}
|
|
@@ -403,11 +381,7 @@ export function AccessPanel() {
|
|
|
403
381
|
<EntityButton
|
|
404
382
|
key={i.id}
|
|
405
383
|
selected={search.kind === "invite" && search.id === i.id}
|
|
406
|
-
onClick={() =>
|
|
407
|
-
setSearch(
|
|
408
|
-
openAccessEntity(search, "operator", "invite", i.id),
|
|
409
|
-
)
|
|
410
|
-
}
|
|
384
|
+
onClick={() => setSearch(openAccessEntity(search, "operator", "invite", i.id))}
|
|
411
385
|
>
|
|
412
386
|
{i.email}
|
|
413
387
|
{i.expired ? (
|
|
@@ -443,8 +417,8 @@ export function AccessPanel() {
|
|
|
443
417
|
<div className="space-y-4">
|
|
444
418
|
<h2 className="text-lg font-medium">Create API key</h2>
|
|
445
419
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
446
|
-
Only scopes you hold on the {plane} plane are shown —
|
|
447
|
-
|
|
420
|
+
Only scopes you hold on the {plane} plane are shown — impossibility taught by
|
|
421
|
+
absence. No preview.
|
|
448
422
|
</p>
|
|
449
423
|
<label className="flex flex-col gap-1 text-sm">
|
|
450
424
|
<span>Name</span>
|
|
@@ -454,11 +428,7 @@ export function AccessPanel() {
|
|
|
454
428
|
onChange={(e) => setKeyName(e.currentTarget.value)}
|
|
455
429
|
/>
|
|
456
430
|
</label>
|
|
457
|
-
<ScopePicker
|
|
458
|
-
grantable={grantable}
|
|
459
|
-
selected={selectedScopes}
|
|
460
|
-
onToggle={toggleScope}
|
|
461
|
-
/>
|
|
431
|
+
<ScopePicker grantable={grantable} selected={selectedScopes} onToggle={toggleScope} />
|
|
462
432
|
<Button
|
|
463
433
|
type="button"
|
|
464
434
|
disabled={createKey.isPending || !keyName.trim()}
|
|
@@ -476,9 +446,7 @@ export function AccessPanel() {
|
|
|
476
446
|
<div className="space-y-6">
|
|
477
447
|
<div>
|
|
478
448
|
<h2 className="text-lg font-medium">{openKey.name}</h2>
|
|
479
|
-
<p className="font-mono text-sm text-[var(--oke-muted)]">
|
|
480
|
-
{openKey.id}
|
|
481
|
-
</p>
|
|
449
|
+
<p className="font-mono text-sm text-[var(--oke-muted)]">{openKey.id}</p>
|
|
482
450
|
<ul className="mt-2 font-mono text-sm">
|
|
483
451
|
{openKey.scopes.map((s) => (
|
|
484
452
|
<li key={s}>{s}</li>
|
|
@@ -490,18 +458,11 @@ export function AccessPanel() {
|
|
|
490
458
|
<h3 className="text-sm font-medium">Revocation blast radius</h3>
|
|
491
459
|
{blastLines ? (
|
|
492
460
|
<>
|
|
493
|
-
<p
|
|
494
|
-
className="text-sm"
|
|
495
|
-
role={blastLines.warn ? "alert" : "status"}
|
|
496
|
-
>
|
|
461
|
+
<p className="text-sm" role={blastLines.warn ? "alert" : "status"}>
|
|
497
462
|
{blastLines.volume}
|
|
498
463
|
</p>
|
|
499
|
-
<p className="text-sm text-[var(--oke-muted)]">
|
|
500
|
-
|
|
501
|
-
</p>
|
|
502
|
-
<p className="text-sm text-[var(--oke-muted)]">
|
|
503
|
-
{blastLines.sources}
|
|
504
|
-
</p>
|
|
464
|
+
<p className="text-sm text-[var(--oke-muted)]">{blastLines.lastUsed}</p>
|
|
465
|
+
<p className="text-sm text-[var(--oke-muted)]">{blastLines.sources}</p>
|
|
505
466
|
<p className="text-sm" role="status">
|
|
506
467
|
{blastLines.residual}
|
|
507
468
|
</p>
|
|
@@ -554,18 +515,13 @@ export function AccessPanel() {
|
|
|
554
515
|
</div>
|
|
555
516
|
{revokeKey.error || rotateKey.error ? (
|
|
556
517
|
<p role="alert" className="text-sm text-[var(--oke-danger)]">
|
|
557
|
-
{(
|
|
558
|
-
(revokeKey.error ?? rotateKey.error) as Error
|
|
559
|
-
).message}
|
|
518
|
+
{((revokeKey.error ?? rotateKey.error) as Error).message}
|
|
560
519
|
</p>
|
|
561
520
|
) : null}
|
|
562
521
|
</section>
|
|
563
522
|
) : (
|
|
564
523
|
<p role="status" className="text-sm text-[var(--oke-danger)]">
|
|
565
|
-
Revoked{
|
|
566
|
-
{openKey.revokedAt
|
|
567
|
-
? new Date(openKey.revokedAt).toISOString()
|
|
568
|
-
: ""}
|
|
524
|
+
Revoked {openKey.revokedAt ? new Date(openKey.revokedAt).toISOString() : ""}
|
|
569
525
|
</p>
|
|
570
526
|
)}
|
|
571
527
|
|
|
@@ -583,14 +539,8 @@ export function AccessPanel() {
|
|
|
583
539
|
) : openRole ? (
|
|
584
540
|
<div className="space-y-4">
|
|
585
541
|
<h2 className="text-lg font-medium">{openRole.name}</h2>
|
|
586
|
-
<p className="text-sm text-[var(--oke-muted)]">
|
|
587
|
-
|
|
588
|
-
</p>
|
|
589
|
-
<ScopePicker
|
|
590
|
-
grantable={grantable}
|
|
591
|
-
selected={selectedScopes}
|
|
592
|
-
onToggle={toggleScope}
|
|
593
|
-
/>
|
|
542
|
+
<p className="text-sm text-[var(--oke-muted)]">{openRole.description}</p>
|
|
543
|
+
<ScopePicker grantable={grantable} selected={selectedScopes} onToggle={toggleScope} />
|
|
594
544
|
<Button
|
|
595
545
|
type="button"
|
|
596
546
|
disabled={grantRole.isPending}
|
|
@@ -611,9 +561,7 @@ export function AccessPanel() {
|
|
|
611
561
|
</div>
|
|
612
562
|
) : openOperator || openUser ? (
|
|
613
563
|
<div className="space-y-4">
|
|
614
|
-
<h2 className="text-lg font-medium">
|
|
615
|
-
{openOperator?.name ?? openUser?.name}
|
|
616
|
-
</h2>
|
|
564
|
+
<h2 className="text-lg font-medium">{openOperator?.name ?? openUser?.name}</h2>
|
|
617
565
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
618
566
|
{openOperator?.email ?? openUser?.email}
|
|
619
567
|
</p>
|
|
@@ -631,12 +579,14 @@ export function AccessPanel() {
|
|
|
631
579
|
<EffectiveTable provenance={provenance} />
|
|
632
580
|
) : (
|
|
633
581
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
634
|
-
Choose an identity, role, or key. Planes stay separate; scopes you
|
|
635
|
-
|
|
582
|
+
Choose an identity, role, or key. Planes stay separate; scopes you cannot grant do not
|
|
583
|
+
appear.
|
|
636
584
|
</p>
|
|
637
585
|
)}
|
|
638
586
|
|
|
639
|
-
{search.view === "effective" &&
|
|
587
|
+
{search.view === "effective" &&
|
|
588
|
+
provenance.length > 0 &&
|
|
589
|
+
(openKey || openRole || openOperator || openUser) ? (
|
|
640
590
|
<div className="mt-6">
|
|
641
591
|
<EffectiveTable provenance={provenance} />
|
|
642
592
|
</div>
|
|
@@ -690,18 +640,10 @@ export function AccessPanel() {
|
|
|
690
640
|
);
|
|
691
641
|
}
|
|
692
642
|
|
|
693
|
-
function PlaneGroup({
|
|
694
|
-
label,
|
|
695
|
-
children,
|
|
696
|
-
}: {
|
|
697
|
-
readonly label: string;
|
|
698
|
-
readonly children: ReactNode;
|
|
699
|
-
}) {
|
|
643
|
+
function PlaneGroup({ label, children }: { readonly label: string; readonly children: ReactNode }) {
|
|
700
644
|
return (
|
|
701
645
|
<section aria-label={label} className="border-t border-[var(--oke-line)]">
|
|
702
|
-
<h3 className="px-4 py-2 text-xs uppercase tracking-wide text-[var(--oke-muted)]">
|
|
703
|
-
{label}
|
|
704
|
-
</h3>
|
|
646
|
+
<h3 className="px-4 py-2 text-xs uppercase tracking-wide text-[var(--oke-muted)]">{label}</h3>
|
|
705
647
|
<ul className="pb-2">{children}</ul>
|
|
706
648
|
</section>
|
|
707
649
|
);
|
|
@@ -724,9 +666,7 @@ function EntityButton({
|
|
|
724
666
|
onClick={onClick}
|
|
725
667
|
className={clsx(
|
|
726
668
|
"flex min-h-8 w-full items-center px-4 text-left text-sm",
|
|
727
|
-
selected
|
|
728
|
-
? "bg-[var(--oke-accent)]/15 text-[var(--oke-fg)]"
|
|
729
|
-
: "text-[var(--oke-fg)]",
|
|
669
|
+
selected ? "bg-[var(--oke-accent)]/15 text-[var(--oke-fg)]" : "text-[var(--oke-fg)]",
|
|
730
670
|
)}
|
|
731
671
|
>
|
|
732
672
|
{children}
|
|
@@ -747,9 +687,7 @@ function ScopePicker({
|
|
|
747
687
|
return (
|
|
748
688
|
<section aria-label="Grantable scopes" className="space-y-2">
|
|
749
689
|
<h3 className="text-sm font-medium">Grantable scopes</h3>
|
|
750
|
-
<p className="text-sm text-[var(--oke-muted)]">
|
|
751
|
-
Only scopes you hold appear
|
|
752
|
-
</p>
|
|
690
|
+
<p className="text-sm text-[var(--oke-muted)]">Only scopes you hold appear</p>
|
|
753
691
|
{grantable.length === 0 ? (
|
|
754
692
|
<p role="status" className="text-sm text-[var(--oke-muted)]">
|
|
755
693
|
No grantable scopes on this plane
|
|
@@ -786,9 +724,7 @@ function EffectiveTable({
|
|
|
786
724
|
Every permission with provenance — inverse of the Gates simulator
|
|
787
725
|
</p>
|
|
788
726
|
<table className="w-full text-left text-sm">
|
|
789
|
-
<caption className="sr-only">
|
|
790
|
-
Effective permissions with provenance
|
|
791
|
-
</caption>
|
|
727
|
+
<caption className="sr-only">Effective permissions with provenance</caption>
|
|
792
728
|
<thead>
|
|
793
729
|
<tr className="border-b border-[var(--oke-line)]">
|
|
794
730
|
<th scope="col" className="py-2 pr-4 font-medium">
|