@b00dea/cockpit 0.0.0-stage → 0.1.1
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/CHANGELOG.md +474 -0
- package/LICENSE +21 -0
- package/README.md +25 -2
- package/bin/cockpit.mjs +33 -0
- package/cockpit.schema.json +2644 -0
- package/dist/autonomy.d.ts +45 -0
- package/dist/autonomy.js +173 -0
- package/dist/bounded-read.d.ts +14 -0
- package/dist/bounded-read.js +42 -0
- package/dist/browser/commands.d.ts +117 -0
- package/dist/browser/commands.js +453 -0
- package/dist/browser/package-paths.d.ts +1 -0
- package/dist/browser/package-paths.js +6 -0
- package/dist/browser/proxy.d.ts +22 -0
- package/dist/browser/proxy.js +37 -0
- package/dist/browser/runtime.d.ts +118 -0
- package/dist/browser/runtime.js +186 -0
- package/dist/browser/surfaces.d.ts +141 -0
- package/dist/browser/surfaces.js +561 -0
- package/dist/browser/ui-gate.d.ts +15 -0
- package/dist/browser/ui-gate.js +18 -0
- package/dist/canonical-json.d.ts +2 -0
- package/dist/canonical-json.js +5 -0
- package/dist/cli-guard.d.ts +5 -0
- package/dist/cli-guard.js +71 -0
- package/dist/cli-main.d.ts +176 -0
- package/dist/cli-main.js +1584 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +16 -0
- package/dist/command-table.d.ts +121 -0
- package/dist/command-table.js +664 -0
- package/dist/config/load.d.ts +183 -0
- package/dist/config/load.js +367 -0
- package/dist/config/sibling-toml.d.ts +48 -0
- package/dist/config/sibling-toml.js +160 -0
- package/dist/config/surface-tools-toml.d.ts +9 -0
- package/dist/config/surface-tools-toml.js +37 -0
- package/dist/config/unconfirmed-toml.d.ts +9 -0
- package/dist/config/unconfirmed-toml.js +29 -0
- package/dist/config/verified-write.d.ts +43 -0
- package/dist/config/verified-write.js +89 -0
- package/dist/diagnostics.d.ts +26 -0
- package/dist/diagnostics.js +344 -0
- package/dist/docs/check.d.ts +16 -0
- package/dist/docs/check.js +197 -0
- package/dist/docs/decision-record.d.ts +34 -0
- package/dist/docs/decision-record.js +135 -0
- package/dist/docs/decisions.d.ts +16 -0
- package/dist/docs/decisions.js +103 -0
- package/dist/docs/markdown.d.ts +36 -0
- package/dist/docs/markdown.js +88 -0
- package/dist/docs/references.d.ts +32 -0
- package/dist/docs/references.js +148 -0
- package/dist/emit.d.ts +22 -0
- package/dist/emit.js +43 -0
- package/dist/entrypoint-kinds.d.ts +3 -0
- package/dist/entrypoint-kinds.js +11 -0
- package/dist/environment/application/confirm.d.ts +35 -0
- package/dist/environment/application/confirm.js +122 -0
- package/dist/environment/application/destructive.d.ts +6 -0
- package/dist/environment/application/destructive.js +429 -0
- package/dist/environment/application/doctor.d.ts +94 -0
- package/dist/environment/application/doctor.js +247 -0
- package/dist/environment/application/guard.d.ts +49 -0
- package/dist/environment/application/guard.js +677 -0
- package/dist/environment/application/health.d.ts +143 -0
- package/dist/environment/application/health.js +385 -0
- package/dist/environment/application/lifecycle-context.d.ts +235 -0
- package/dist/environment/application/lifecycle-context.js +154 -0
- package/dist/environment/application/lifecycle-state.d.ts +25 -0
- package/dist/environment/application/lifecycle-state.js +202 -0
- package/dist/environment/application/lifecycle.d.ts +18 -0
- package/dist/environment/application/lifecycle.js +737 -0
- package/dist/environment/application/logs.d.ts +45 -0
- package/dist/environment/application/logs.js +127 -0
- package/dist/environment/application/services.d.ts +60 -0
- package/dist/environment/application/services.js +89 -0
- package/dist/environment/application/setup.d.ts +129 -0
- package/dist/environment/application/setup.js +741 -0
- package/dist/environment/application/shared.d.ts +11 -0
- package/dist/environment/application/shared.js +61 -0
- package/dist/environment/application/siblings.d.ts +43 -0
- package/dist/environment/application/siblings.js +269 -0
- package/dist/environment/claims.d.ts +389 -0
- package/dist/environment/claims.js +1701 -0
- package/dist/environment/codex-hook-trust.d.ts +11 -0
- package/dist/environment/codex-hook-trust.js +185 -0
- package/dist/environment/compose-environment.d.ts +1 -0
- package/dist/environment/compose-environment.js +6 -0
- package/dist/environment/compose-ownership.d.ts +21 -0
- package/dist/environment/compose-ownership.js +117 -0
- package/dist/environment/compose-topology.d.ts +125 -0
- package/dist/environment/compose-topology.js +490 -0
- package/dist/environment/contract.d.ts +522 -0
- package/dist/environment/contract.js +794 -0
- package/dist/environment/declaration.d.ts +14 -0
- package/dist/environment/declaration.js +39 -0
- package/dist/environment/destructive-composition.d.ts +29 -0
- package/dist/environment/destructive-composition.js +333 -0
- package/dist/environment/docker-daemon.d.ts +30 -0
- package/dist/environment/docker-daemon.js +78 -0
- package/dist/environment/docker-endpoint.d.ts +10 -0
- package/dist/environment/docker-endpoint.js +19 -0
- package/dist/environment/env-schema-observation.d.ts +46 -0
- package/dist/environment/env-schema-observation.js +241 -0
- package/dist/environment/evidence.d.ts +136 -0
- package/dist/environment/evidence.js +437 -0
- package/dist/environment/executable.d.ts +38 -0
- package/dist/environment/executable.js +190 -0
- package/dist/environment/generated-application/authorities.d.ts +5 -0
- package/dist/environment/generated-application/authorities.js +61 -0
- package/dist/environment/generated-application/bootstrap-skill.d.ts +16 -0
- package/dist/environment/generated-application/bootstrap-skill.js +328 -0
- package/dist/environment/generated-application/check.d.ts +13 -0
- package/dist/environment/generated-application/check.js +191 -0
- package/dist/environment/generated-application/custom-surface.d.ts +26 -0
- package/dist/environment/generated-application/custom-surface.js +289 -0
- package/dist/environment/generated-application/prepare.d.ts +29 -0
- package/dist/environment/generated-application/prepare.js +278 -0
- package/dist/environment/generated-application/publication.d.ts +33 -0
- package/dist/environment/generated-application/publication.js +547 -0
- package/dist/environment/generated-application/shared.d.ts +492 -0
- package/dist/environment/generated-application/shared.js +354 -0
- package/dist/environment/generated-application/surface-observation.d.ts +4 -0
- package/dist/environment/generated-application/surface-observation.js +69 -0
- package/dist/environment/generated-application/surface-outputs.d.ts +71 -0
- package/dist/environment/generated-application/surface-outputs.js +400 -0
- package/dist/environment/generated-application/surfaces.d.ts +3 -0
- package/dist/environment/generated-application/surfaces.js +704 -0
- package/dist/environment/generated-application/sync.d.ts +6 -0
- package/dist/environment/generated-application/sync.js +124 -0
- package/dist/environment/git-observation.d.ts +202 -0
- package/dist/environment/git-observation.js +553 -0
- package/dist/environment/health-composition.d.ts +12 -0
- package/dist/environment/health-composition.js +645 -0
- package/dist/environment/host-observation.d.ts +56 -0
- package/dist/environment/host-observation.js +52 -0
- package/dist/environment/identity.d.ts +48 -0
- package/dist/environment/identity.js +85 -0
- package/dist/environment/init-application.d.ts +333 -0
- package/dist/environment/init-application.js +726 -0
- package/dist/environment/install-policy-observation.d.ts +71 -0
- package/dist/environment/install-policy-observation.js +284 -0
- package/dist/environment/install-policy.d.ts +48 -0
- package/dist/environment/install-policy.js +96 -0
- package/dist/environment/instance.d.ts +33 -0
- package/dist/environment/instance.js +122 -0
- package/dist/environment/instruction-pointer.d.ts +19 -0
- package/dist/environment/instruction-pointer.js +144 -0
- package/dist/environment/lifecycle-composition.d.ts +31 -0
- package/dist/environment/lifecycle-composition.js +742 -0
- package/dist/environment/lifecycle-stage.d.ts +120 -0
- package/dist/environment/lifecycle-stage.js +408 -0
- package/dist/environment/lifecycle.d.ts +75 -0
- package/dist/environment/lifecycle.js +354 -0
- package/dist/environment/logs.d.ts +132 -0
- package/dist/environment/logs.js +519 -0
- package/dist/environment/map-limit.d.ts +2 -0
- package/dist/environment/map-limit.js +13 -0
- package/dist/environment/mcp-observation.d.ts +9 -0
- package/dist/environment/mcp-observation.js +46 -0
- package/dist/environment/observations.d.ts +46 -0
- package/dist/environment/observations.js +346 -0
- package/dist/environment/operator-application.d.ts +79 -0
- package/dist/environment/operator-application.js +197 -0
- package/dist/environment/ports.d.ts +182 -0
- package/dist/environment/ports.js +1205 -0
- package/dist/environment/posture-observation.d.ts +68 -0
- package/dist/environment/posture-observation.js +253 -0
- package/dist/environment/presence.d.ts +4 -0
- package/dist/environment/presence.js +26 -0
- package/dist/environment/read-composition.d.ts +32 -0
- package/dist/environment/read-composition.js +397 -0
- package/dist/environment/readiness-composition.d.ts +57 -0
- package/dist/environment/readiness-composition.js +151 -0
- package/dist/environment/reclaim.d.ts +370 -0
- package/dist/environment/reclaim.js +1940 -0
- package/dist/environment/repository-identity.d.ts +13 -0
- package/dist/environment/repository-identity.js +108 -0
- package/dist/environment/runtime-measurement-record.d.ts +38 -0
- package/dist/environment/runtime-measurement-record.js +111 -0
- package/dist/environment/runtime-measurement.d.ts +27 -0
- package/dist/environment/runtime-measurement.js +224 -0
- package/dist/environment/runtime-probe-residue.d.ts +43 -0
- package/dist/environment/runtime-probe-residue.js +148 -0
- package/dist/environment/runtime-probe.d.ts +72 -0
- package/dist/environment/runtime-probe.js +725 -0
- package/dist/environment/runtime.d.ts +551 -0
- package/dist/environment/runtime.js +2405 -0
- package/dist/environment/seed.d.ts +16 -0
- package/dist/environment/seed.js +43 -0
- package/dist/environment/selftest-application.d.ts +86 -0
- package/dist/environment/selftest-application.js +713 -0
- package/dist/environment/sensitive.d.ts +3 -0
- package/dist/environment/sensitive.js +48 -0
- package/dist/environment/served-checkout-grants.d.ts +53 -0
- package/dist/environment/served-checkout-grants.js +182 -0
- package/dist/environment/setup-observation.d.ts +62 -0
- package/dist/environment/setup-observation.js +1473 -0
- package/dist/environment/setup.d.ts +43 -0
- package/dist/environment/setup.js +176 -0
- package/dist/environment/sibling-checkouts.d.ts +119 -0
- package/dist/environment/sibling-checkouts.js +254 -0
- package/dist/environment/sibling-instructions.d.ts +33 -0
- package/dist/environment/sibling-instructions.js +224 -0
- package/dist/environment/sibling-observation.d.ts +27 -0
- package/dist/environment/sibling-observation.js +45 -0
- package/dist/environment/sibling-pull.d.ts +23 -0
- package/dist/environment/sibling-pull.js +95 -0
- package/dist/environment/sibling-registration.d.ts +45 -0
- package/dist/environment/sibling-registration.js +538 -0
- package/dist/environment/stack-inputs.d.ts +18 -0
- package/dist/environment/stack-inputs.js +210 -0
- package/dist/environment/stack-inventory-prune.d.ts +31 -0
- package/dist/environment/stack-inventory-prune.js +129 -0
- package/dist/environment/stack-inventory-report.d.ts +44 -0
- package/dist/environment/stack-inventory-report.js +78 -0
- package/dist/environment/stack-inventory.d.ts +94 -0
- package/dist/environment/stack-inventory.js +418 -0
- package/dist/environment/state.d.ts +410 -0
- package/dist/environment/state.js +2153 -0
- package/dist/environment/templates.d.ts +140 -0
- package/dist/environment/templates.js +685 -0
- package/dist/environment/tool-registration.d.ts +9 -0
- package/dist/environment/tool-registration.js +92 -0
- package/dist/environment/upgrade-application.d.ts +19 -0
- package/dist/environment/upgrade-application.js +175 -0
- package/dist/environment-exec/execute.d.ts +105 -0
- package/dist/environment-exec/execute.js +1179 -0
- package/dist/environment-exec/libexec-program.d.ts +6 -0
- package/dist/environment-exec/libexec-program.js +22 -0
- package/dist/environment-exec/verified-digest.d.ts +4 -0
- package/dist/environment-exec/verified-digest.js +16 -0
- package/dist/exact-keys.d.ts +7 -0
- package/dist/exact-keys.js +15 -0
- package/dist/fix-catalogue.d.ts +32 -0
- package/dist/fix-catalogue.js +60 -0
- package/dist/freshness.d.ts +29 -0
- package/dist/freshness.js +75 -0
- package/dist/generated-environment/adopt.d.ts +16 -0
- package/dist/generated-environment/adopt.js +271 -0
- package/dist/generated-environment/command.d.ts +47 -0
- package/dist/generated-environment/command.js +75 -0
- package/dist/generated-environment/transaction.d.ts +186 -0
- package/dist/generated-environment/transaction.js +1770 -0
- package/dist/grading/evaluate.d.ts +71 -0
- package/dist/grading/evaluate.js +403 -0
- package/dist/grading/grade.d.ts +33 -0
- package/dist/grading/grade.js +57 -0
- package/dist/guards/answer-confirmation.d.ts +41 -0
- package/dist/guards/answer-confirmation.js +109 -0
- package/dist/guards/evaluator.d.ts +130 -0
- package/dist/guards/evaluator.js +1258 -0
- package/dist/guards/harness-adapter.d.ts +17 -0
- package/dist/guards/harness-adapter.js +57 -0
- package/dist/guards/host.d.ts +8 -0
- package/dist/guards/host.js +10 -0
- package/dist/guards/invocation-parser.d.ts +66 -0
- package/dist/guards/invocation-parser.js +595 -0
- package/dist/guards/local-identity.d.ts +44 -0
- package/dist/guards/local-identity.js +129 -0
- package/dist/guards/policy-change.d.ts +43 -0
- package/dist/guards/policy-change.js +159 -0
- package/dist/guards/policy-pin.d.ts +13 -0
- package/dist/guards/policy-pin.js +177 -0
- package/dist/guards/protected-locations.d.ts +62 -0
- package/dist/guards/protected-locations.js +461 -0
- package/dist/guards/read-only.d.ts +37 -0
- package/dist/guards/read-only.js +315 -0
- package/dist/init/command.d.ts +41 -0
- package/dist/init/command.js +330 -0
- package/dist/init/derive.d.ts +53 -0
- package/dist/init/derive.js +819 -0
- package/dist/init/draft.d.ts +140 -0
- package/dist/init/draft.js +1228 -0
- package/dist/init/render.d.ts +47 -0
- package/dist/init/render.js +104 -0
- package/dist/init/scaffold.d.ts +53 -0
- package/dist/init/scaffold.js +121 -0
- package/dist/invocation.d.ts +13 -0
- package/dist/invocation.js +20 -0
- package/dist/package-metadata.d.ts +9 -0
- package/dist/package-metadata.js +19 -0
- package/dist/readiness.d.ts +53 -0
- package/dist/readiness.js +88 -0
- package/dist/references/named.d.ts +24 -0
- package/dist/references/named.js +27 -0
- package/dist/refusal.d.ts +15 -0
- package/dist/refusal.js +7 -0
- package/dist/registry-derivation.d.ts +31 -0
- package/dist/registry-derivation.js +32 -0
- package/dist/registry-resolve/command.d.ts +47 -0
- package/dist/registry-resolve/command.js +226 -0
- package/dist/registry-resolve/registry.d.ts +68 -0
- package/dist/registry-resolve/registry.js +292 -0
- package/dist/registry-resolve/render-shell.d.ts +18 -0
- package/dist/registry-resolve/render-shell.js +36 -0
- package/dist/repair.d.ts +29 -0
- package/dist/repair.js +8 -0
- package/dist/repository-path.d.ts +9 -0
- package/dist/repository-path.js +16 -0
- package/dist/schema-json.d.ts +1 -0
- package/dist/schema-json.js +177 -0
- package/dist/schema.d.ts +1289 -0
- package/dist/schema.js +985 -0
- package/dist/setup/command.d.ts +4 -0
- package/dist/setup/command.js +4 -0
- package/dist/sha256.d.ts +1 -0
- package/dist/sha256.js +4 -0
- package/dist/surfaces/adoption.d.ts +41 -0
- package/dist/surfaces/adoption.js +217 -0
- package/dist/surfaces/consumer-instructions.d.ts +20 -0
- package/dist/surfaces/consumer-instructions.js +43 -0
- package/dist/surfaces/contract.d.ts +42 -0
- package/dist/surfaces/contract.js +169 -0
- package/dist/surfaces/core-declarations.d.ts +24 -0
- package/dist/surfaces/core-declarations.js +79 -0
- package/dist/surfaces/development-markers.d.ts +1 -0
- package/dist/surfaces/development-markers.js +18 -0
- package/dist/surfaces/generator-adapter.d.ts +71 -0
- package/dist/surfaces/generator-adapter.js +809 -0
- package/dist/surfaces/harness-registry.d.ts +260 -0
- package/dist/surfaces/harness-registry.js +146 -0
- package/dist/surfaces/mcp.d.ts +145 -0
- package/dist/surfaces/mcp.js +349 -0
- package/dist/surfaces/merge.d.ts +30 -0
- package/dist/surfaces/merge.js +105 -0
- package/dist/surfaces/ownership.d.ts +190 -0
- package/dist/surfaces/ownership.js +795 -0
- package/dist/surfaces/projection.d.ts +136 -0
- package/dist/surfaces/projection.js +716 -0
- package/dist/surfaces/render.d.ts +79 -0
- package/dist/surfaces/render.js +636 -0
- package/dist/surfaces/restrictions.d.ts +130 -0
- package/dist/surfaces/restrictions.js +447 -0
- package/dist/surfaces/selftest.d.ts +162 -0
- package/dist/surfaces/selftest.js +393 -0
- package/dist/surfaces/skill-contract.d.ts +85 -0
- package/dist/surfaces/skill-contract.js +449 -0
- package/dist/surfaces/sync.d.ts +57 -0
- package/dist/surfaces/sync.js +164 -0
- package/dist/team-metadata.d.ts +41 -0
- package/dist/team-metadata.js +513 -0
- package/dist/testing/gates.d.ts +91 -0
- package/dist/testing/gates.js +182 -0
- package/dist/testing/hooks.d.ts +59 -0
- package/dist/testing/hooks.js +139 -0
- package/dist/testing/test-protection.d.ts +34 -0
- package/dist/testing/test-protection.js +137 -0
- package/dist/testing/verdict.d.ts +29 -0
- package/dist/testing/verdict.js +62 -0
- package/dist/testing/weakening.d.ts +15 -0
- package/dist/testing/weakening.js +30 -0
- package/dist/work-orders/application-closure.d.ts +7 -0
- package/dist/work-orders/application-closure.js +76 -0
- package/dist/work-orders/application-context.d.ts +162 -0
- package/dist/work-orders/application-context.js +137 -0
- package/dist/work-orders/application-decisions.d.ts +27 -0
- package/dist/work-orders/application-decisions.js +121 -0
- package/dist/work-orders/application-grading.d.ts +11 -0
- package/dist/work-orders/application-grading.js +212 -0
- package/dist/work-orders/application.d.ts +6 -0
- package/dist/work-orders/application.js +223 -0
- package/dist/work-orders/composition.d.ts +101 -0
- package/dist/work-orders/composition.js +1202 -0
- package/dist/work-orders/contract.d.ts +77 -0
- package/dist/work-orders/contract.js +140 -0
- package/dist/work-orders/decisions.d.ts +23 -0
- package/dist/work-orders/decisions.js +55 -0
- package/dist/work-orders/store.d.ts +207 -0
- package/dist/work-orders/store.js +291 -0
- package/docs/README.md +68 -0
- package/docs/architecture.md +136 -0
- package/docs/capability-matrix.md +58 -0
- package/docs/cli-reference.md +807 -0
- package/docs/command-list.md +62 -0
- package/docs/compose-patterns.md +99 -0
- package/docs/concepts.md +173 -0
- package/docs/configuration-essentials.md +177 -0
- package/docs/configuration-reference.md +636 -0
- package/docs/docs-check.md +76 -0
- package/docs/environment.md +948 -0
- package/docs/extending.md +43 -0
- package/docs/faq.md +113 -0
- package/docs/getting-started.md +692 -0
- package/docs/harness-surfaces.md +500 -0
- package/docs/joining-a-team.md +76 -0
- package/docs/release-policy.md +49 -0
- package/docs/safety-and-autonomy.md +463 -0
- package/docs/troubleshooting.md +382 -0
- package/docs/tutorial.md +171 -0
- package/docs/work-and-browser.md +420 -0
- package/libexec/browser-operation.cjs +270 -0
- package/libexec/fence-marker.cjs +101 -0
- package/libexec/fence-marker.d.cts +24 -0
- package/libexec/fenced-group-runner.cjs +77 -0
- package/libexec/fenced-supervisor.cjs +137 -0
- package/libexec/generated-filesystem.cjs +731 -0
- package/libexec/install-filesystem.cjs +225 -0
- package/libexec/rulesync-generator.NOTICE.md +1112 -0
- package/libexec/rulesync-generator.cjs +743 -0
- package/libexec/surface-generator-worker.cjs +266 -0
- package/libexec/surface-output-reader.cjs +99 -0
- package/libexec/surface-scratch-cleanup.cjs +14 -0
- package/libexec/validate-harness-evidence.d.mts +183 -0
- package/libexec/validate-harness-evidence.mjs +1312 -0
- package/package.json +74 -4
- package/surfaces/README.md +33 -0
- package/surfaces/agents/evaluator.agent.md +76 -0
- package/surfaces/guards/bash-guard.sh +48 -0
- package/surfaces/guards/claude.adapter.json +25 -0
- package/surfaces/guards/codex.adapter.json +24 -0
- package/surfaces/guards/opencode.adapter.json +25 -0
- package/surfaces/references/browser.md +63 -0
- package/surfaces/references/test-data-and-personas.md +84 -0
- package/surfaces/references/testing-tiers.md +11 -0
- package/surfaces/skills/cockpit-browser.skill.md +59 -0
- package/surfaces/skills/cockpit-explain.skill.md +32 -0
- package/surfaces/skills/cockpit-fix.skill.md +37 -0
- package/surfaces/skills/cockpit-setup.skill.md +39 -0
- package/surfaces/skills/cockpit-work.skill.md +34 -0
- package/surfaces/skills/collection.json +5 -0
- package/surfaces/skills/procedures/explain.md +66 -0
- package/surfaces/skills/procedures/fix.md +95 -0
- package/surfaces/skills/procedures/setup.md +452 -0
- package/surfaces/skills/procedures/work.md +134 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type EnvironmentDiagnostic } from './environment/contract.js';
|
|
2
|
+
import type { CockpitConfig, Decider, WorkGrading } from './schema.js';
|
|
3
|
+
export type WorkGate = 'accept' | 'amend' | 'answer' | 'signoff' | 'acknowledge';
|
|
4
|
+
type AutonomyDecision = 'sync' | 'stale_delete' | 'reset' | 'mcp_approve';
|
|
5
|
+
export interface EffectivePolicy {
|
|
6
|
+
readonly grading: WorkGrading;
|
|
7
|
+
readonly gates: Readonly<Record<WorkGate, Decider>>;
|
|
8
|
+
readonly autonomy: Readonly<Record<AutonomyDecision, Decider>>;
|
|
9
|
+
}
|
|
10
|
+
export declare const GATE_DEFAULTS: Readonly<Record<WorkGate, Decider>>;
|
|
11
|
+
export declare const AUTONOMY_DEFAULTS: Readonly<Record<AutonomyDecision, Decider>>;
|
|
12
|
+
export declare function effectivePolicy(config: Readonly<{
|
|
13
|
+
work: Readonly<Pick<CockpitConfig['work'], 'grading'> & {
|
|
14
|
+
gates: Readonly<CockpitConfig['work']['gates']>;
|
|
15
|
+
}>;
|
|
16
|
+
autonomy: Readonly<CockpitConfig['autonomy']>;
|
|
17
|
+
}>): EffectivePolicy;
|
|
18
|
+
/** cockpit detects CI from the CI variable, as every hosted runner sets it; an agent can set it too. */
|
|
19
|
+
export declare function runningInCi(env: Readonly<Record<string, string | undefined>>): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Whether this run may pass the decision without a person. A `person` decision is never passed here:
|
|
22
|
+
* its caller asks for the typed digest. A `ci` decision passes only under CI, where a protected
|
|
23
|
+
* environment's reviewers are the human gate; locally that is best-effort, as an agent can set CI too.
|
|
24
|
+
*/
|
|
25
|
+
export declare function decide(decider: Decider, env: Readonly<Record<string, string | undefined>>): 'proceed' | 'person' | 'ci-only';
|
|
26
|
+
export interface PolicyWeakening {
|
|
27
|
+
readonly field: string;
|
|
28
|
+
readonly from: string;
|
|
29
|
+
readonly to: string;
|
|
30
|
+
}
|
|
31
|
+
/** Every field `current` sets weaker than `recorded`, named as cockpit.toml spells it. */
|
|
32
|
+
export declare function policyWeakening(recorded: EffectivePolicy, current: EffectivePolicy): readonly PolicyWeakening[];
|
|
33
|
+
/** The error `check` reports while cockpit.toml sits weaker than the recorded policy; sync would refuse the same change. */
|
|
34
|
+
export declare function policyWeakeningDiagnostic(weakened: readonly PolicyWeakening[]): EnvironmentDiagnostic;
|
|
35
|
+
/** The digest a person types to accept exactly these weakenings of exactly this recorded policy. */
|
|
36
|
+
export declare function weakeningDigest(recorded: EffectivePolicy, current: EffectivePolicy): string;
|
|
37
|
+
/** The policy the last sync recorded, or undefined before the first; an unreadable record refuses. */
|
|
38
|
+
export declare function readRecordedPolicy(root: string): Promise<EffectivePolicy | undefined>;
|
|
39
|
+
export declare function writeRecordedPolicy(root: string, policy: EffectivePolicy): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* The cockpit.toml tables the guard keeps an agent from editing, as parsed values to compare, or
|
|
42
|
+
* undefined when the text is not TOML. [mcp] is pinned only while a person approves MCP servers.
|
|
43
|
+
*/
|
|
44
|
+
export declare function pinnedPolicyTables(text: string): Readonly<Record<string, unknown>> | undefined;
|
|
45
|
+
export {};
|
package/dist/autonomy.js
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// Owns the autonomy policy: who may pass each decision point cockpit gates, as cockpit.toml's [work]
|
|
2
|
+
// and [autonomy] tables declare it, what an unset field means, which change weakens it, and the
|
|
3
|
+
// record of the policy the last sync accepted. Every command that gates a decision asks `decide`
|
|
4
|
+
// here, so a field cannot mean one thing to sync and another to the guard.
|
|
5
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
6
|
+
import { mkdir, open, rename, rm } from 'node:fs/promises';
|
|
7
|
+
import { dirname, join } from 'node:path';
|
|
8
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
9
|
+
import { parse as parseToml, TomlError } from 'smol-toml';
|
|
10
|
+
import { readBoundedFile } from './bounded-read.js';
|
|
11
|
+
import { hasErrorCode, RefusalError } from './environment/contract.js';
|
|
12
|
+
// The owner's defaults: an agent runs cockpit end to end except where stack data is lost or a process
|
|
13
|
+
// would start outside the guard, and a team opts into person or CI gates field by field. A sibling's
|
|
14
|
+
// MCP source is an ordinary file an agent writes, and a harness starts an enabled server outside every
|
|
15
|
+
// guard boundary, so an agent approving MCP servers could run any command it wrote there. Test
|
|
16
|
+
// weakening is judged by the grading model where one grades, so acknowledging it is the agent's too.
|
|
17
|
+
export const GATE_DEFAULTS = Object.freeze({ accept: 'agent', amend: 'agent', answer: 'agent', signoff: 'agent', acknowledge: 'agent' });
|
|
18
|
+
export const AUTONOMY_DEFAULTS = Object.freeze({ sync: 'agent', stale_delete: 'agent', reset: 'person', mcp_approve: 'person' });
|
|
19
|
+
export function effectivePolicy(config) {
|
|
20
|
+
const pick = (declared, defaults) => Object.fromEntries(Object.entries(defaults).map(([key, value]) => [key, declared[key] ?? value]));
|
|
21
|
+
return {
|
|
22
|
+
grading: config.work.grading,
|
|
23
|
+
gates: pick(config.work.gates, GATE_DEFAULTS),
|
|
24
|
+
autonomy: pick({ sync: config.autonomy.sync, stale_delete: config.autonomy.stale_delete,
|
|
25
|
+
reset: config.autonomy.reset, mcp_approve: config.autonomy.mcp_approve }, AUTONOMY_DEFAULTS),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/** cockpit detects CI from the CI variable, as every hosted runner sets it; an agent can set it too. */
|
|
29
|
+
export function runningInCi(env) {
|
|
30
|
+
return typeof env.CI === 'string' && env.CI.length > 0 && env.CI !== 'false' && env.CI !== '0';
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Whether this run may pass the decision without a person. A `person` decision is never passed here:
|
|
34
|
+
* its caller asks for the typed digest. A `ci` decision passes only under CI, where a protected
|
|
35
|
+
* environment's reviewers are the human gate; locally that is best-effort, as an agent can set CI too.
|
|
36
|
+
*/
|
|
37
|
+
export function decide(decider, env) {
|
|
38
|
+
if (decider === 'agent')
|
|
39
|
+
return 'proceed';
|
|
40
|
+
if (decider === 'person')
|
|
41
|
+
return 'person';
|
|
42
|
+
return runningInCi(env) ? 'proceed' : 'ci-only';
|
|
43
|
+
}
|
|
44
|
+
// Stronger is later: an agent decision is the weakest, CI behind reviewers the strongest.
|
|
45
|
+
const DECIDER_RANK = Object.freeze({ agent: 0, person: 1, ci: 2 });
|
|
46
|
+
const GRADING_RANK = Object.freeze({ self: 0, checks: 1, independent: 2 });
|
|
47
|
+
/** Every field `current` sets weaker than `recorded`, named as cockpit.toml spells it. */
|
|
48
|
+
export function policyWeakening(recorded, current) {
|
|
49
|
+
const rows = [];
|
|
50
|
+
if (GRADING_RANK[current.grading] < GRADING_RANK[recorded.grading])
|
|
51
|
+
rows.push({ field: 'work.grading', from: recorded.grading, to: current.grading });
|
|
52
|
+
for (const [table, field] of [['gates', 'work.gates'], ['autonomy', 'autonomy']]) {
|
|
53
|
+
for (const [key, was] of Object.entries(recorded[table])) {
|
|
54
|
+
const now = current[table][key];
|
|
55
|
+
if (DECIDER_RANK[now] < DECIDER_RANK[was])
|
|
56
|
+
rows.push({ field: `${field}.${key}`, from: was, to: now });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return rows;
|
|
60
|
+
}
|
|
61
|
+
/** The error `check` reports while cockpit.toml sits weaker than the recorded policy; sync would refuse the same change. */
|
|
62
|
+
export function policyWeakeningDiagnostic(weakened) {
|
|
63
|
+
const shown = weakened.map(row => `${row.field}: ${row.from} -> ${row.to}`).join('; ');
|
|
64
|
+
return { severity: 'error', target: 'autonomy',
|
|
65
|
+
code: 'POLICY_WEAKENING_UNCONFIRMED',
|
|
66
|
+
message: `cockpit.toml weakens the policy the last sync recorded (${shown})`,
|
|
67
|
+
fix: 'a person runs npx --no cockpit sync --config <your cockpit.toml> --interactive in a terminal outside CI, reads the weakening it shows and types its digest, or the change is reverted' };
|
|
68
|
+
}
|
|
69
|
+
/** The digest a person types to accept exactly these weakenings of exactly this recorded policy. */
|
|
70
|
+
export function weakeningDigest(recorded, current) {
|
|
71
|
+
return createHash('sha256').update(JSON.stringify({ recorded, current })).digest('hex');
|
|
72
|
+
}
|
|
73
|
+
// Written only by cockpit: the guard protects `.cockpit/policy.json` as a control, so the policy an
|
|
74
|
+
// agent's edit would weaken still stands until a person accepts the weakening at sync.
|
|
75
|
+
const POLICY_RECORD_PATH = '.cockpit/policy.json';
|
|
76
|
+
const RECORD_FORMAT = 'cockpit-policy/v1';
|
|
77
|
+
// A record written before a decision point existed lacks its key: the 0.1.0 record has no
|
|
78
|
+
// `acknowledge`. The missing decider is read as `person`, so a default that now hands it to the agent
|
|
79
|
+
// is reported as a weakening a person accepts once at sync, not refused for good nor passed unseen. An
|
|
80
|
+
// unknown key or value was not written by cockpit and refuses.
|
|
81
|
+
function recordedPolicy(value) {
|
|
82
|
+
const deciders = (table, defaults) => {
|
|
83
|
+
if (typeof table !== 'object' || table === null || Array.isArray(table))
|
|
84
|
+
return undefined;
|
|
85
|
+
if (Object.entries(table).some(([key, entry]) => !Object.hasOwn(defaults, key) || !Object.hasOwn(DECIDER_RANK, entry)))
|
|
86
|
+
return undefined;
|
|
87
|
+
const declared = table;
|
|
88
|
+
return Object.fromEntries(Object.keys(defaults).map(key => [key, declared[key] ?? 'person']));
|
|
89
|
+
};
|
|
90
|
+
if (typeof value !== 'object' || value === null || Object.keys(value).sort().join() !== 'autonomy,gates,grading')
|
|
91
|
+
return undefined;
|
|
92
|
+
const row = value;
|
|
93
|
+
const gates = deciders(row.gates, GATE_DEFAULTS);
|
|
94
|
+
const autonomy = deciders(row.autonomy, AUTONOMY_DEFAULTS);
|
|
95
|
+
return Object.hasOwn(GRADING_RANK, row.grading) && gates && autonomy ? { grading: row.grading, gates, autonomy } : undefined;
|
|
96
|
+
}
|
|
97
|
+
// Restoring the committed copy helps only where the damage is uncommitted; where the committed copy is the
|
|
98
|
+
// damaged one, the record is a person's to remove, after which the next sync records cockpit.toml's policy.
|
|
99
|
+
const DAMAGED_RECORD_REMEDY = `restore the committed copy with git restore -- ${POLICY_RECORD_PATH}, or if that copy is the damaged one, `
|
|
100
|
+
+ `a person deletes ${POLICY_RECORD_PATH} and runs npx --no cockpit sync --config <your cockpit.toml> --interactive to record the policy cockpit.toml declares`;
|
|
101
|
+
/** The policy the last sync recorded, or undefined before the first; an unreadable record refuses. */
|
|
102
|
+
export async function readRecordedPolicy(root) {
|
|
103
|
+
const path = join(root, POLICY_RECORD_PATH);
|
|
104
|
+
const unusable = `${POLICY_RECORD_PATH} is not a regular file of at most 64 KiB; restore it with git restore -- ${POLICY_RECORD_PATH}`;
|
|
105
|
+
let read;
|
|
106
|
+
try {
|
|
107
|
+
read = readBoundedFile(path, 65_536);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (hasErrorCode(error, 'ENOENT'))
|
|
111
|
+
return undefined;
|
|
112
|
+
if (hasErrorCode(error, 'ELOOP', 'EISDIR', 'EIO'))
|
|
113
|
+
throw new RefusalError(unusable);
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
if (read.kind === 'too-large')
|
|
117
|
+
throw new RefusalError(unusable);
|
|
118
|
+
const bytes = read.bytes;
|
|
119
|
+
let parsed;
|
|
120
|
+
try {
|
|
121
|
+
parsed = JSON.parse(bytes.toString('utf8'));
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (!(error instanceof SyntaxError))
|
|
125
|
+
throw error;
|
|
126
|
+
throw new RefusalError(`${POLICY_RECORD_PATH} is not JSON; ${DAMAGED_RECORD_REMEDY}`);
|
|
127
|
+
}
|
|
128
|
+
const record = parsed;
|
|
129
|
+
const policy = record?.format === RECORD_FORMAT ? recordedPolicy(record.policy) : undefined;
|
|
130
|
+
if (!policy)
|
|
131
|
+
throw new RefusalError(`${POLICY_RECORD_PATH} is not a ${RECORD_FORMAT} record (an unknown format, table, key, decider or grading); ${DAMAGED_RECORD_REMEDY}`);
|
|
132
|
+
return policy;
|
|
133
|
+
}
|
|
134
|
+
export async function writeRecordedPolicy(root, policy) {
|
|
135
|
+
const path = join(root, POLICY_RECORD_PATH);
|
|
136
|
+
if (isDeepStrictEqual(await readRecordedPolicy(root), policy))
|
|
137
|
+
return;
|
|
138
|
+
await mkdir(dirname(path), { recursive: true });
|
|
139
|
+
const staged = `${path}.${randomUUID()}.tmp`;
|
|
140
|
+
const handle = await open(staged, 'wx', 0o644);
|
|
141
|
+
try {
|
|
142
|
+
await handle.writeFile(`${JSON.stringify({ format: RECORD_FORMAT, policy }, null, 2)}\n`);
|
|
143
|
+
await handle.sync();
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
await handle.close();
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
await rename(staged, path);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
await rm(staged, { force: true });
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* The cockpit.toml tables the guard keeps an agent from editing, as parsed values to compare, or
|
|
158
|
+
* undefined when the text is not TOML. [mcp] is pinned only while a person approves MCP servers.
|
|
159
|
+
*/
|
|
160
|
+
export function pinnedPolicyTables(text) {
|
|
161
|
+
let parsed;
|
|
162
|
+
try {
|
|
163
|
+
parsed = parseToml(text);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (error instanceof TomlError)
|
|
167
|
+
return undefined;
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
const autonomy = parsed.autonomy;
|
|
171
|
+
const mcpByAgent = (autonomy?.mcp_approve ?? AUTONOMY_DEFAULTS.mcp_approve) === 'agent';
|
|
172
|
+
return { work: parsed.work, autonomy: parsed.autonomy, ...(mcpByAgent ? {} : { mcp: parsed.mcp }) };
|
|
173
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type BoundedRead = Readonly<{
|
|
2
|
+
kind: 'complete';
|
|
3
|
+
bytes: Buffer;
|
|
4
|
+
}> | Readonly<{
|
|
5
|
+
kind: 'too-large';
|
|
6
|
+
}>;
|
|
7
|
+
/**
|
|
8
|
+
* Reads a whole regular file without following a symbolic link at its last component and without
|
|
9
|
+
* blocking on a FIFO, so an agent-writable path cannot redirect or stall the read. A file larger
|
|
10
|
+
* than maxBytes is `too-large`. One that is not regular is refused with code EISDIR; one whose
|
|
11
|
+
* identity, size or times change while it is read, or whose name stops naming the opened file, with
|
|
12
|
+
* code EIO. Open errors such as ENOENT or ELOOP propagate.
|
|
13
|
+
*/
|
|
14
|
+
export declare function readBoundedFile(path: string, maxBytes: number): BoundedRead;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { closeSync, constants, fstatSync, lstatSync, openSync, readSync } from 'node:fs';
|
|
2
|
+
import { RefusalError } from './environment/contract.js';
|
|
3
|
+
function sameFile(left, right) {
|
|
4
|
+
return left.dev === right.dev && left.ino === right.ino && left.size === right.size
|
|
5
|
+
&& left.mtimeMs === right.mtimeMs && left.ctimeMs === right.ctimeMs;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Reads a whole regular file without following a symbolic link at its last component and without
|
|
9
|
+
* blocking on a FIFO, so an agent-writable path cannot redirect or stall the read. A file larger
|
|
10
|
+
* than maxBytes is `too-large`. One that is not regular is refused with code EISDIR; one whose
|
|
11
|
+
* identity, size or times change while it is read, or whose name stops naming the opened file, with
|
|
12
|
+
* code EIO. Open errors such as ENOENT or ELOOP propagate.
|
|
13
|
+
*/
|
|
14
|
+
export function readBoundedFile(path, maxBytes) {
|
|
15
|
+
const descriptor = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
16
|
+
try {
|
|
17
|
+
const opened = fstatSync(descriptor);
|
|
18
|
+
if (!opened.isFile())
|
|
19
|
+
throw Object.assign(new RefusalError(`${path} is not a regular file`), { code: 'EISDIR' });
|
|
20
|
+
if (opened.size > maxBytes)
|
|
21
|
+
return { kind: 'too-large' };
|
|
22
|
+
// One byte past the observed size shows a file that grew while it was read.
|
|
23
|
+
const buffer = Buffer.alloc(opened.size + 1);
|
|
24
|
+
let length = 0;
|
|
25
|
+
while (length < buffer.length) {
|
|
26
|
+
const read = readSync(descriptor, buffer, length, buffer.length - length, null);
|
|
27
|
+
if (read === 0)
|
|
28
|
+
break;
|
|
29
|
+
length += read;
|
|
30
|
+
}
|
|
31
|
+
if (length > maxBytes)
|
|
32
|
+
return { kind: 'too-large' };
|
|
33
|
+
const named = lstatSync(path);
|
|
34
|
+
if (length !== opened.size || !sameFile(opened, fstatSync(descriptor)) || named.isSymbolicLink() || !sameFile(opened, named)) {
|
|
35
|
+
throw Object.assign(new RefusalError(`${path} changed while it was read`), { code: 'EIO' });
|
|
36
|
+
}
|
|
37
|
+
return { kind: 'complete', bytes: buffer.subarray(0, length) };
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
closeSync(descriptor);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { type HolderId, type StackId } from '../environment/contract.js';
|
|
2
|
+
import { type StateNamespace } from '../environment/state.js';
|
|
3
|
+
import { type BrowserRuntimeProjection } from './runtime.js';
|
|
4
|
+
import { type BrowserProjectClient } from './surfaces.js';
|
|
5
|
+
export type BrowserCommandKind = 'drive' | 'screenshot';
|
|
6
|
+
interface BrowserRouteDeclaration {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly path: string;
|
|
9
|
+
}
|
|
10
|
+
export interface BrowserRoutePolicy {
|
|
11
|
+
readonly origin: string;
|
|
12
|
+
readonly surfaces: readonly Readonly<{
|
|
13
|
+
name: string;
|
|
14
|
+
url: string;
|
|
15
|
+
}>[];
|
|
16
|
+
}
|
|
17
|
+
type BrowserDiagnosticEntry = Readonly<{
|
|
18
|
+
kind: 'console';
|
|
19
|
+
path?: string;
|
|
20
|
+
line?: number;
|
|
21
|
+
}> | Readonly<{
|
|
22
|
+
kind: 'pageerror';
|
|
23
|
+
name: string;
|
|
24
|
+
}> | Readonly<{
|
|
25
|
+
kind: 'request';
|
|
26
|
+
method: string;
|
|
27
|
+
path: string;
|
|
28
|
+
status: number;
|
|
29
|
+
} | {
|
|
30
|
+
kind: 'request';
|
|
31
|
+
method: string;
|
|
32
|
+
path: string;
|
|
33
|
+
failure: string;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Console and uncaught error text, capped in count and bytes. It is page content, so a reader treats
|
|
37
|
+
* it as data and never as instructions. Present only for a data posture that is isolated, not
|
|
38
|
+
* restored and not reaching production; otherwise `omitted` says why there is none.
|
|
39
|
+
*/
|
|
40
|
+
type BrowserMessageExcerpt = Readonly<{
|
|
41
|
+
trust: 'untrusted-page-content';
|
|
42
|
+
messages: readonly Readonly<{
|
|
43
|
+
kind: 'console' | 'pageerror';
|
|
44
|
+
text: string;
|
|
45
|
+
}>[];
|
|
46
|
+
}> | Readonly<{
|
|
47
|
+
omitted: string;
|
|
48
|
+
}>;
|
|
49
|
+
/** What a route's page did wrong. Identifiers and counts, plus a message excerpt where the data posture allows it: never bodies, headers or cookies. */
|
|
50
|
+
interface BrowserRouteDiagnostics {
|
|
51
|
+
readonly consoleErrors: number;
|
|
52
|
+
readonly consoleWarnings: number;
|
|
53
|
+
readonly pageErrors: number;
|
|
54
|
+
readonly failedRequests: number;
|
|
55
|
+
readonly abortedRequests: number;
|
|
56
|
+
readonly thirdParty: Readonly<{
|
|
57
|
+
requests: number;
|
|
58
|
+
failed: number;
|
|
59
|
+
}>;
|
|
60
|
+
readonly entries: readonly BrowserDiagnosticEntry[];
|
|
61
|
+
readonly omitted: number;
|
|
62
|
+
readonly excerpt: BrowserMessageExcerpt;
|
|
63
|
+
}
|
|
64
|
+
type BrowserRouteVerdict = 'clean' | 'findings';
|
|
65
|
+
export interface BrowserCommandInput {
|
|
66
|
+
readonly runtime: BrowserRuntimeProjection;
|
|
67
|
+
readonly client: BrowserProjectClient;
|
|
68
|
+
readonly policy: BrowserRoutePolicy;
|
|
69
|
+
readonly kind: BrowserCommandKind;
|
|
70
|
+
/** A declared route's name or path; every declared route is driven when absent. */
|
|
71
|
+
readonly route?: string;
|
|
72
|
+
readonly role?: string;
|
|
73
|
+
readonly state?: Readonly<{
|
|
74
|
+
namespace: StateNamespace;
|
|
75
|
+
stackId: StackId;
|
|
76
|
+
ownerId: HolderId;
|
|
77
|
+
}>;
|
|
78
|
+
}
|
|
79
|
+
interface BrowserCommandSurfaceReceipt {
|
|
80
|
+
readonly name: string;
|
|
81
|
+
readonly url: string;
|
|
82
|
+
readonly screenshot?: Readonly<{
|
|
83
|
+
path: string;
|
|
84
|
+
sha256: string;
|
|
85
|
+
byteLength: number;
|
|
86
|
+
}>;
|
|
87
|
+
readonly diagnostics?: BrowserRouteDiagnostics;
|
|
88
|
+
readonly verdict?: BrowserRouteVerdict;
|
|
89
|
+
}
|
|
90
|
+
export interface BrowserCommandReceipt {
|
|
91
|
+
readonly kind: BrowserCommandKind;
|
|
92
|
+
readonly activation: 'application';
|
|
93
|
+
readonly authentication: Readonly<{
|
|
94
|
+
posture: 'bypassed' | 'none';
|
|
95
|
+
} | {
|
|
96
|
+
posture: 'real';
|
|
97
|
+
role: string;
|
|
98
|
+
policy: 'serialized' | 'per-worker';
|
|
99
|
+
}>;
|
|
100
|
+
readonly surfaces: readonly Readonly<BrowserCommandSurfaceReceipt>[];
|
|
101
|
+
/** drive only: findings when any route has console errors, uncaught errors or failed own-origin requests. */
|
|
102
|
+
readonly verdict?: BrowserRouteVerdict;
|
|
103
|
+
}
|
|
104
|
+
export type BrowserCommandResult = Readonly<{
|
|
105
|
+
kind: 'complete';
|
|
106
|
+
receipt: BrowserCommandReceipt;
|
|
107
|
+
}> | Readonly<{
|
|
108
|
+
kind: 'refusal';
|
|
109
|
+
reason: string;
|
|
110
|
+
}>;
|
|
111
|
+
export declare function issueBrowserRoutePolicy(runtime: BrowserRuntimeProjection, input: Readonly<{
|
|
112
|
+
origin: string;
|
|
113
|
+
routes: readonly BrowserRouteDeclaration[];
|
|
114
|
+
}>): BrowserRoutePolicy;
|
|
115
|
+
export declare function isIssuedBrowserCommandReceipt(value: unknown): value is BrowserCommandReceipt;
|
|
116
|
+
export declare function executeBrowserCommand(value: BrowserCommandInput): Promise<BrowserCommandResult>;
|
|
117
|
+
export {};
|