@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,9 @@
|
|
|
1
|
+
import type { SiblingOutcome } from './sibling-registration.js';
|
|
2
|
+
export interface ToolChangeInput {
|
|
3
|
+
readonly operation: 'add' | 'remove';
|
|
4
|
+
readonly configPath: string;
|
|
5
|
+
readonly tool: string;
|
|
6
|
+
/** Show the edited list and write nothing. */
|
|
7
|
+
readonly dryRun: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function runToolChange(input: ToolChangeInput): Promise<SiblingOutcome>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns `cockpit tool add` and `cockpit tool remove`: they edit the `[surfaces] tools` list of
|
|
3
|
+
* cockpit.toml so nobody hand-edits it. They write no tool's files: the next sync renders an added
|
|
4
|
+
* tool from the same sources as the others, and offers a removed tool's owned files to the
|
|
5
|
+
* stale-removal approval that already guards every deletion of a generated file.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
import { readFile } from 'node:fs/promises';
|
|
9
|
+
import { parse, TomlError } from 'smol-toml';
|
|
10
|
+
import { loadCockpitConfig } from '../config/load.js';
|
|
11
|
+
import { canonicalJson } from '../canonical-json.js';
|
|
12
|
+
import { setSurfaceTools } from '../config/surface-tools-toml.js';
|
|
13
|
+
import { writeVerifiedConfig } from '../config/verified-write.js';
|
|
14
|
+
import { cockpitCommand } from '../fix-catalogue.js';
|
|
15
|
+
import { CockpitConfig } from '../schema.js';
|
|
16
|
+
import { harnessFact, SURFACE_TARGETS } from '../surfaces/harness-registry.js';
|
|
17
|
+
import { ENVIRONMENT_CODES, errorCause } from './contract.js';
|
|
18
|
+
import { refusalOutcome as refused } from '../refusal.js';
|
|
19
|
+
const EDIT_BY_HAND_FIX = 'edit the tools list under [surfaces] in cockpit.toml by hand, then run npx --no cockpit sync --config <your cockpit.toml> --dry-run';
|
|
20
|
+
function done(artifact, result) {
|
|
21
|
+
return { status: 0, diagnostics: [], destination: null, artifact, result };
|
|
22
|
+
}
|
|
23
|
+
export async function runToolChange(input) {
|
|
24
|
+
if (!SURFACE_TARGETS.includes(input.tool)) {
|
|
25
|
+
return refused('CLI_USAGE_INVALID', `unknown tool ${JSON.stringify(input.tool)}; cockpit renders ${SURFACE_TARGETS.join(', ')}`, input.tool);
|
|
26
|
+
}
|
|
27
|
+
const tool = input.tool;
|
|
28
|
+
const loaded = await loadCockpitConfig(input.configPath);
|
|
29
|
+
if (loaded.kind !== 'complete')
|
|
30
|
+
return { status: 2, result: null, diagnostics: loaded.diagnostics };
|
|
31
|
+
const configPath = loaded.result.source.path;
|
|
32
|
+
const config = loaded.result.config;
|
|
33
|
+
// The list keeps the order it was written in; an added tool goes last.
|
|
34
|
+
const before = config.surfaces.tools;
|
|
35
|
+
const after = input.operation === 'add' ? before.includes(tool) ? before : [...before, tool] : before.filter(row => row !== tool);
|
|
36
|
+
const preview = cockpitCommand('sync', { config: configPath, args: '--dry-run' });
|
|
37
|
+
if (after.length === before.length) {
|
|
38
|
+
return done(`${harnessFact(tool).displayName} (${tool}) is ${input.operation === 'add' ? 'already' : 'not'} listed in ${configPath}; nothing was written.\n`, { action: 'unchanged', config: configPath, tool, tools: before });
|
|
39
|
+
}
|
|
40
|
+
const bytes = await readFile(configPath);
|
|
41
|
+
const sha256 = createHash('sha256').update(bytes).digest('hex');
|
|
42
|
+
if (sha256 !== loaded.result.source.sha256) {
|
|
43
|
+
return refused(ENVIRONMENT_CODES.CONFIG_CHANGED_DURING_EXECUTION, 'cockpit.toml changed while it was being read; nothing was written', configPath, `run the same npx --no cockpit tool ${input.operation} command again`);
|
|
44
|
+
}
|
|
45
|
+
const edit = setSurfaceTools(bytes.toString('utf8'), after);
|
|
46
|
+
if (edit.kind === 'unsupported') {
|
|
47
|
+
return refused(ENVIRONMENT_CODES.CONFIG_SCHEMA_INVALID, `cockpit.toml cannot be edited safely: ${edit.reason}; nothing was written`, 'surfaces.tools', EDIT_BY_HAND_FIX);
|
|
48
|
+
}
|
|
49
|
+
// The schema decides what a list may hold (a guarded tool, every browser harness), so its refusal is the message.
|
|
50
|
+
let parsed;
|
|
51
|
+
try {
|
|
52
|
+
parsed = CockpitConfig.safeParse(parse(edit.text));
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const where = error instanceof TomlError ? `at line ${error.line}, column ${error.column}` : errorCause(error);
|
|
56
|
+
return refused(ENVIRONMENT_CODES.CONFIG_PARSE_INVALID, `the edit would leave cockpit.toml unparseable (${where}); nothing was written`, 'surfaces.tools', EDIT_BY_HAND_FIX);
|
|
57
|
+
}
|
|
58
|
+
if (!parsed.success) {
|
|
59
|
+
const issue = parsed.error.issues[0];
|
|
60
|
+
return refused(ENVIRONMENT_CODES.CONFIG_SCHEMA_INVALID, `${input.operation === 'add' ? 'adding' : 'removing'} ${tool} would leave cockpit.toml invalid (${issue ? `${issue.path.join('.') || '(root)'}: ${issue.message}` : 'schema'}); nothing was written`, 'surfaces.tools', 'change what the message names first, then run the command again');
|
|
61
|
+
}
|
|
62
|
+
const expected = canonicalJson({ ...config, surfaces: { ...config.surfaces, tools: after } });
|
|
63
|
+
const exact = (candidate) => canonicalJson(candidate) === expected;
|
|
64
|
+
if (!exact(parsed.data)) {
|
|
65
|
+
return refused(ENVIRONMENT_CODES.CONFIG_SCHEMA_INVALID, 'the edit would change more than the tools list; nothing was written', 'surfaces.tools', EDIT_BY_HAND_FIX);
|
|
66
|
+
}
|
|
67
|
+
const line = `tools = [${after.map(row => JSON.stringify(row)).join(', ')}]`;
|
|
68
|
+
const next = input.operation === 'add'
|
|
69
|
+
? `The next sync writes ${harnessFact(tool).displayName}'s instructions, skills and settings from the same sources as the other tools; preview them with ${preview}.`
|
|
70
|
+
: `The next sync offers the files cockpit wrote for ${harnessFact(tool).displayName} for removal: ${preview} lists them, and a person approves their removal with ${cockpitCommand('sync', { config: configPath, args: '--interactive' })}.`;
|
|
71
|
+
const result = { action: input.dryRun ? 'previewed' : input.operation === 'add' ? 'added' : 'removed', config: configPath, tool, tools: after,
|
|
72
|
+
next: preview };
|
|
73
|
+
if (input.dryRun)
|
|
74
|
+
return done(`Would set [surfaces] ${line} in ${configPath}; nothing was written.\n${next}\n`, result);
|
|
75
|
+
const rerun = `let the other edit finish, then run the same npx --no cockpit tool ${input.operation} command again`;
|
|
76
|
+
const written = await writeVerifiedConfig({
|
|
77
|
+
path: configPath, expectedSha256: sha256, temporaryTag: 'tool',
|
|
78
|
+
edit: () => edit.text,
|
|
79
|
+
isExactChange: exact,
|
|
80
|
+
messages: {
|
|
81
|
+
changedBefore: { message: 'cockpit.toml changed since it was read; nothing was written', fix: rerun },
|
|
82
|
+
changedDuring: { message: 'cockpit.toml changed while the edit was being prepared; nothing was written', fix: rerun },
|
|
83
|
+
invalid: (reason) => ({ message: `the edit would leave cockpit.toml invalid (${reason}); nothing was written`, fix: EDIT_BY_HAND_FIX }),
|
|
84
|
+
notExact: { message: 'the edit would change more than the tools list; nothing was written', fix: EDIT_BY_HAND_FIX },
|
|
85
|
+
writtenMismatch: { message: 'the tools list was written, but re-reading cockpit.toml shows a change beyond it',
|
|
86
|
+
fix: 'review cockpit.toml for the change you did not make before running npx --no cockpit sync --config <your cockpit.toml> --dry-run' },
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
if (written.kind !== 'complete')
|
|
90
|
+
return refused(written.code, written.message, configPath, written.fix);
|
|
91
|
+
return done(`Set [surfaces] ${line} in ${configPath}.\n${next}\n`, result);
|
|
92
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ExecuteProbeOutcome, ForegroundProcessInput, ForegroundProcessOutcome } from '../environment-exec/execute.js';
|
|
2
|
+
import type { Diagnostic } from '../diagnostics.js';
|
|
3
|
+
import { type ExecutionStep } from './contract.js';
|
|
4
|
+
export interface UpgradeInput {
|
|
5
|
+
readonly configPath: string;
|
|
6
|
+
readonly version?: string;
|
|
7
|
+
readonly dryRun: boolean;
|
|
8
|
+
readonly env: Readonly<Record<string, string>>;
|
|
9
|
+
}
|
|
10
|
+
export interface UpgradeDependencies {
|
|
11
|
+
readonly execute: (step: ExecutionStep) => Promise<ExecuteProbeOutcome>;
|
|
12
|
+
readonly executeForeground: (input: ForegroundProcessInput) => Promise<ForegroundProcessOutcome>;
|
|
13
|
+
}
|
|
14
|
+
export interface UpgradeOutcome {
|
|
15
|
+
readonly status: number;
|
|
16
|
+
readonly result: unknown;
|
|
17
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
18
|
+
}
|
|
19
|
+
export declare function runUpgrade(input: UpgradeInput, dependencies: UpgradeDependencies): Promise<UpgradeOutcome>;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns `cockpit upgrade`: move the exact pin of the installed package, then re-run `sync` in a new
|
|
3
|
+
* process so the new version renders the generated files (this process holds the old code).
|
|
4
|
+
*
|
|
5
|
+
* The pin is exact because `check` refuses a running version that differs from it, so the install
|
|
6
|
+
* must be exact too. The package manager comes from the single lockfile at the cockpit root. Every
|
|
7
|
+
* child process crosses the supplied `execute` / `executeForeground`, which production binds to
|
|
8
|
+
* `environment-exec/execute.ts`; sync's own refusals and exit code pass through unchanged.
|
|
9
|
+
*/
|
|
10
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
11
|
+
import { dirname, join, resolve } from 'node:path';
|
|
12
|
+
import { authenticatedExecutionOutcome } from '../environment-exec/execute.js';
|
|
13
|
+
import { formatShellCommand } from '../fix-catalogue.js';
|
|
14
|
+
import { installedPackageMetadata } from '../package-metadata.js';
|
|
15
|
+
import { ENVIRONMENT_CODES, errorCause, hasErrorCode } from './contract.js';
|
|
16
|
+
import { resolveExecutable } from './executable.js';
|
|
17
|
+
const VERSION = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/;
|
|
18
|
+
const LOCKFILES = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'npm-shrinkwrap.json', 'bun.lock', 'bun.lockb'];
|
|
19
|
+
// Flags checked against each manager's own --help: a dev dependency saved at the exact version.
|
|
20
|
+
const INSTALL = {
|
|
21
|
+
'package-lock.json': { manager: 'npm', verb: 'install', flags: ['--save-dev', '--save-exact'] },
|
|
22
|
+
'pnpm-lock.yaml': { manager: 'pnpm', verb: 'add', flags: ['--save-dev', '--save-exact'] },
|
|
23
|
+
'yarn.lock': { manager: 'yarn', verb: 'add', flags: ['--dev', '--exact'] },
|
|
24
|
+
};
|
|
25
|
+
const LOOKUP_TIMEOUT_MS = 60_000;
|
|
26
|
+
const INSTALL_TIMEOUT_MS = 600_000;
|
|
27
|
+
// Each call site writes its code and fix as literals so the troubleshooting index captures them.
|
|
28
|
+
function refused(diagnostic, status = 2) {
|
|
29
|
+
return { status, result: null, diagnostics: [diagnostic] };
|
|
30
|
+
}
|
|
31
|
+
/** Orders two versions; a prerelease sorts before its release, and prerelease identifiers compare as semver says. */
|
|
32
|
+
function compareVersions(a, b) {
|
|
33
|
+
const [x, y] = [VERSION.exec(a), VERSION.exec(b)];
|
|
34
|
+
for (let i = 1; i <= 3; i++)
|
|
35
|
+
if (x[i] !== y[i])
|
|
36
|
+
return Number(x[i]) < Number(y[i]) ? -1 : 1;
|
|
37
|
+
if (x[4] === y[4])
|
|
38
|
+
return 0;
|
|
39
|
+
if (x[4] === undefined || y[4] === undefined)
|
|
40
|
+
return x[4] === undefined ? 1 : -1;
|
|
41
|
+
const [p, q] = [x[4].split('.'), y[4].split('.')];
|
|
42
|
+
for (let i = 0; i < Math.max(p.length, q.length); i++) {
|
|
43
|
+
if (p[i] === undefined || q[i] === undefined)
|
|
44
|
+
return p[i] === undefined ? -1 : 1;
|
|
45
|
+
if (p[i] === q[i])
|
|
46
|
+
continue;
|
|
47
|
+
const numeric = [/^\d+$/.test(p[i]), /^\d+$/.test(q[i])];
|
|
48
|
+
if (numeric[0] && numeric[1])
|
|
49
|
+
return Number(p[i]) < Number(q[i]) ? -1 : 1;
|
|
50
|
+
if (numeric[0] !== numeric[1])
|
|
51
|
+
return numeric[0] ? -1 : 1;
|
|
52
|
+
return p[i] < q[i] ? -1 : 1;
|
|
53
|
+
}
|
|
54
|
+
return 0;
|
|
55
|
+
}
|
|
56
|
+
function step(executable, cwd, env, id, args, timeoutMs) {
|
|
57
|
+
return {
|
|
58
|
+
id, argv: [executable.canonicalPath, ...args],
|
|
59
|
+
argv0: executable.invocationPath, cwd, env, timeoutMs,
|
|
60
|
+
stdoutLimitBytes: 65_536, stderrLimitBytes: 65_536,
|
|
61
|
+
outputOverflow: 'retain-tail', failureOutput: 'stderr-tail',
|
|
62
|
+
paths: [], ports: [], labels: { purpose: id }, expected: [],
|
|
63
|
+
consumedFiles: [{ path: executable.canonicalPath, sha256: executable.sha256,
|
|
64
|
+
maxBytes: 536_870_912, argvIndexes: [0], executable: true, executionMode: executable.executionMode }],
|
|
65
|
+
filesystemChecks: [], compensation: [],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function lockfilesAt(root) {
|
|
69
|
+
const found = [];
|
|
70
|
+
for (const name of LOCKFILES) {
|
|
71
|
+
try {
|
|
72
|
+
await stat(join(root, name));
|
|
73
|
+
found.push(name);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (!hasErrorCode(error, 'ENOENT'))
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return found;
|
|
81
|
+
}
|
|
82
|
+
/** The `Upgrade:` lines of every changelog entry after `from` up to and including `to`. */
|
|
83
|
+
function upgradeNotes(changelog, from, to) {
|
|
84
|
+
const notes = [];
|
|
85
|
+
let inRange = false;
|
|
86
|
+
for (const line of changelog.split('\n')) {
|
|
87
|
+
const heading = /^## (\S+)\s*$/.exec(line);
|
|
88
|
+
if (heading)
|
|
89
|
+
inRange = VERSION.test(heading[1]) && compareVersions(heading[1], from) > 0 && compareVersions(heading[1], to) <= 0;
|
|
90
|
+
else if (inRange && /\bUpgrade:/.test(line))
|
|
91
|
+
notes.push(line.trim().replace(/^[-*]\s+/, ''));
|
|
92
|
+
}
|
|
93
|
+
return notes;
|
|
94
|
+
}
|
|
95
|
+
export async function runUpgrade(input, dependencies) {
|
|
96
|
+
const { name, version: installed } = installedPackageMetadata;
|
|
97
|
+
const configPath = resolve(input.configPath);
|
|
98
|
+
const root = dirname(configPath);
|
|
99
|
+
const npmPage = (version) => `https://www.npmjs.com/package/${name}/v/${version}`;
|
|
100
|
+
const found = await lockfilesAt(root);
|
|
101
|
+
const lockfile = found.length === 1 ? INSTALL[found[0]] : undefined;
|
|
102
|
+
if (!lockfile)
|
|
103
|
+
return refused({ severity: 'error', code: 'UPGRADE_PACKAGE_MANAGER_UNKNOWN',
|
|
104
|
+
message: found.length === 0 ? `no lockfile in ${root}, so the package manager is unknown`
|
|
105
|
+
: `${found.join(', ')} in ${root} ${found.length > 1 ? 'name more than one package manager' : 'is not a lockfile upgrade supports'}`,
|
|
106
|
+
fix: 'keep exactly one of package-lock.json, pnpm-lock.yaml or yarn.lock at the cockpit root and put its package manager (npm, pnpm or yarn) on PATH, then run npx --no cockpit upgrade --config <your cockpit.toml>' });
|
|
107
|
+
const manager = await resolveExecutable(lockfile.manager, input.env);
|
|
108
|
+
if (manager.state !== 'available')
|
|
109
|
+
return refused({ severity: 'error', code: 'UPGRADE_PACKAGE_MANAGER_UNKNOWN',
|
|
110
|
+
message: `${lockfile.manager} is not on PATH: ${manager.reason}`, fix: 'keep exactly one of package-lock.json, pnpm-lock.yaml or yarn.lock at the cockpit root and put its package manager (npm, pnpm or yarn) on PATH, then run npx --no cockpit upgrade --config <your cockpit.toml>' });
|
|
111
|
+
let target = input.version;
|
|
112
|
+
if (target === undefined) {
|
|
113
|
+
const npm = await resolveExecutable('npm', input.env);
|
|
114
|
+
if (npm.state !== 'available')
|
|
115
|
+
return refused({ severity: 'error', code: 'UPGRADE_REGISTRY_UNREACHABLE',
|
|
116
|
+
message: `npm is needed to look up the latest ${name} and is not on PATH: ${npm.reason}`, fix: 'check the network, the registry login and that npm is on PATH, or name the version: npx --no cockpit upgrade --config <your cockpit.toml> <version>' });
|
|
117
|
+
const lookup = step(npm.value, root, input.env, 'upgrade:latest', ['view', name, 'version', '--json'], LOOKUP_TIMEOUT_MS);
|
|
118
|
+
const outcome = authenticatedExecutionOutcome(await dependencies.execute(lookup), lookup);
|
|
119
|
+
let published;
|
|
120
|
+
try {
|
|
121
|
+
published = outcome?.kind === 'complete' ? JSON.parse(outcome.stdout.toString('utf8')) : undefined;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
published = undefined;
|
|
125
|
+
} // reported below as an answer that is not a version
|
|
126
|
+
if (typeof published !== 'string' || !VERSION.test(published))
|
|
127
|
+
return refused({ severity: 'error', code: 'UPGRADE_REGISTRY_UNREACHABLE',
|
|
128
|
+
message: `the registry did not give the latest ${name} version (${outcome?.kind === 'complete' ? 'the answer was not a version' : outcome ? `${outcome.code}: ${outcome.stderr.toString('utf8').trim().split('\n').slice(0, 2).join(' | ').slice(0, 256)}` : 'the lookup could not be authenticated'})`,
|
|
129
|
+
fix: 'check the network, the registry login and that npm is on PATH, or name the version: npx --no cockpit upgrade --config <your cockpit.toml> <version>' });
|
|
130
|
+
target = published;
|
|
131
|
+
}
|
|
132
|
+
else if (!VERSION.test(target))
|
|
133
|
+
return refused({ severity: 'error', code: 'UPGRADE_VERSION_INVALID', target: '<version>',
|
|
134
|
+
message: `"${target}" is not an exact version`, fix: 'give a full version such as 1.2.3, not a range or tag' });
|
|
135
|
+
const order = compareVersions(target, installed);
|
|
136
|
+
if (order === 0 || order < 0 && input.version === undefined)
|
|
137
|
+
return refused({ severity: 'error', code: 'UPGRADE_ALREADY_CURRENT',
|
|
138
|
+
message: `already on ${installed}${order === 0 ? '' : `; the latest published is ${target}`}`,
|
|
139
|
+
fix: 'nothing to upgrade; to move to another version name it: npx --no cockpit upgrade --config <your cockpit.toml> <version>' });
|
|
140
|
+
const spec = `${name}@${target}`;
|
|
141
|
+
const installArgv = [lockfile.manager, lockfile.verb, ...lockfile.flags, spec];
|
|
142
|
+
const syncArgv = ['npx', '--no', 'cockpit', 'sync', '--config', configPath];
|
|
143
|
+
const result = { from: installed, to: target, packageManager: lockfile.manager,
|
|
144
|
+
install: formatShellCommand(installArgv), sync: formatShellCommand(syncArgv), dryRun: input.dryRun };
|
|
145
|
+
if (input.dryRun)
|
|
146
|
+
return { status: 0, diagnostics: [],
|
|
147
|
+
result: { ...result, next: 'nothing was run; drop --dry-run to install and sync' } };
|
|
148
|
+
const install = step(manager.value, root, input.env, 'upgrade:install', installArgv.slice(1), INSTALL_TIMEOUT_MS);
|
|
149
|
+
const installOutcome = authenticatedExecutionOutcome(await dependencies.execute(install), install);
|
|
150
|
+
if (installOutcome?.kind !== 'complete')
|
|
151
|
+
return refused({ severity: 'error', code: 'UPGRADE_INSTALL_FAILED',
|
|
152
|
+
message: `${result.install} failed (${installOutcome ? `${installOutcome.code}, exit ${installOutcome.execution.exitCode}: ${installOutcome.stderr.toString('utf8').trim().split('\n').slice(-3).join(' | ').slice(0, 512)}` : 'the outcome could not be authenticated'})`,
|
|
153
|
+
fix: 'fix what the package manager reported (is the version published?), then run npx --no cockpit upgrade --config <your cockpit.toml> <version>' });
|
|
154
|
+
const npx = await resolveExecutable('npx', input.env);
|
|
155
|
+
if (npx.state !== 'available')
|
|
156
|
+
return refused({ severity: 'error', code: 'UPGRADE_SYNC_FAILED',
|
|
157
|
+
message: `${spec} is installed but npx is not on PATH: ${npx.reason}`, fix: 'act on what sync reported above or put npx on PATH, then run npx --no cockpit sync --config <your cockpit.toml>' });
|
|
158
|
+
const synced = await dependencies.executeForeground({ executable: npx.value, argv: syncArgv.slice(1), cwd: root, env: input.env });
|
|
159
|
+
if (synced.kind !== 'complete' || synced.exitCode !== 0)
|
|
160
|
+
return refused({ severity: 'error', code: 'UPGRADE_SYNC_FAILED',
|
|
161
|
+
message: `${spec} is installed but sync did not finish (${synced.kind === 'refusal' ? synced.code : `exit ${synced.exitCode}`}); the generated files are still those of ${installed}`,
|
|
162
|
+
fix: 'act on what sync reported above or put npx on PATH, then run npx --no cockpit sync --config <your cockpit.toml>' }, synced.exitCode === 0 ? 1 : synced.exitCode);
|
|
163
|
+
let notes;
|
|
164
|
+
try {
|
|
165
|
+
notes = upgradeNotes(await readFile(join(root, 'node_modules', name, 'CHANGELOG.md'), 'utf8'), installed, target);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
return { status: 0, diagnostics: [], result: { ...result,
|
|
169
|
+
upgradeSteps: `the installed package's CHANGELOG.md could not be read (${hasErrorCode(error, 'ENOENT') ? 'missing' : errorCause(error)}); release notes: ${npmPage(target)}`,
|
|
170
|
+
next: 'review git diff, then commit package.json, the lockfile and the regenerated files together' } };
|
|
171
|
+
}
|
|
172
|
+
return { status: 0, diagnostics: [], result: { ...result,
|
|
173
|
+
upgradeSteps: notes.length === 0 ? 'the changelog lists no Upgrade: steps between these versions' : notes,
|
|
174
|
+
next: 'review git diff, then commit package.json, the lockfile and the regenerated files together' } };
|
|
175
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { ENVIRONMENT_CODES, type ExecutionFailureCode, type ExecutionPlan, type ExecutionReceipt, type ExecutionStep, type ExecutionFence, type EnvironmentDiagnostic } from '../environment/contract.js';
|
|
2
|
+
export interface FencedExecutionTermination {
|
|
3
|
+
readonly kind: 'fenced-execution-termination';
|
|
4
|
+
}
|
|
5
|
+
export declare function repairFencedExecution(fence: ExecutionFence): Promise<{
|
|
6
|
+
readonly kind: 'complete';
|
|
7
|
+
readonly evidence: FencedExecutionTermination;
|
|
8
|
+
} | {
|
|
9
|
+
readonly kind: 'refusal';
|
|
10
|
+
readonly code: typeof ENVIRONMENT_CODES.DRAIN_ATTEMPT_REPAIR_REQUIRED;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function cleanupFencedExecution(fence: ExecutionFence): Promise<boolean>;
|
|
13
|
+
export declare function consumeFencedExecutionTermination(evidence: FencedExecutionTermination, fence: ExecutionFence): boolean;
|
|
14
|
+
export interface ForegroundProcessInput {
|
|
15
|
+
readonly executable: import('../environment/executable.js').ResolvedExecutable;
|
|
16
|
+
readonly argv: readonly string[];
|
|
17
|
+
readonly cwd: string;
|
|
18
|
+
readonly env: Readonly<Record<string, string>>;
|
|
19
|
+
}
|
|
20
|
+
export type ForegroundProcessOutcome = Readonly<{
|
|
21
|
+
kind: 'complete';
|
|
22
|
+
exitCode: number;
|
|
23
|
+
signal: NodeJS.Signals | null;
|
|
24
|
+
terminationConfirmed: true;
|
|
25
|
+
}> | Readonly<{
|
|
26
|
+
kind: 'refusal';
|
|
27
|
+
code: ExecutionFailureCode;
|
|
28
|
+
exitCode: number;
|
|
29
|
+
signal: NodeJS.Signals | null;
|
|
30
|
+
started: boolean;
|
|
31
|
+
terminationConfirmed: boolean;
|
|
32
|
+
}>;
|
|
33
|
+
interface StepExecution {
|
|
34
|
+
id: string;
|
|
35
|
+
exitCode: number;
|
|
36
|
+
signal: NodeJS.Signals | null;
|
|
37
|
+
stdoutBytes: number;
|
|
38
|
+
stderrBytes: number;
|
|
39
|
+
}
|
|
40
|
+
interface ProbeStepExecution extends StepExecution {
|
|
41
|
+
started: boolean;
|
|
42
|
+
stdoutObservedBytes: number;
|
|
43
|
+
stderrObservedBytes: number;
|
|
44
|
+
stdoutRetainedBytes: number;
|
|
45
|
+
stderrRetainedBytes: number;
|
|
46
|
+
}
|
|
47
|
+
interface CompensationFailure {
|
|
48
|
+
id: string;
|
|
49
|
+
code: ExecutionFailureCode;
|
|
50
|
+
}
|
|
51
|
+
export type ExecutePlanOutcome = {
|
|
52
|
+
kind: 'complete';
|
|
53
|
+
status: 0;
|
|
54
|
+
diagnostics: readonly EnvironmentDiagnostic[];
|
|
55
|
+
result: {
|
|
56
|
+
steps: readonly StepExecution[];
|
|
57
|
+
};
|
|
58
|
+
} | {
|
|
59
|
+
kind: 'refusal';
|
|
60
|
+
status: 2;
|
|
61
|
+
diagnostics: readonly EnvironmentDiagnostic[];
|
|
62
|
+
result: null;
|
|
63
|
+
execution: {
|
|
64
|
+
completedStepIds: readonly string[];
|
|
65
|
+
failedStep: {
|
|
66
|
+
id: string;
|
|
67
|
+
started: boolean;
|
|
68
|
+
stderr?: string;
|
|
69
|
+
};
|
|
70
|
+
compensation: {
|
|
71
|
+
attemptedStepIds: readonly string[];
|
|
72
|
+
completedStepIds: readonly string[];
|
|
73
|
+
failed: readonly CompensationFailure[];
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
export type ExecuteProbeOutcome = {
|
|
78
|
+
kind: 'complete';
|
|
79
|
+
execution: ProbeStepExecution;
|
|
80
|
+
receipt: ExecutionReceipt;
|
|
81
|
+
stdout: Buffer;
|
|
82
|
+
stderr: Buffer;
|
|
83
|
+
} | {
|
|
84
|
+
kind: 'refusal';
|
|
85
|
+
code: ExecutionFailureCode;
|
|
86
|
+
execution: ProbeStepExecution;
|
|
87
|
+
receipt?: ExecutionReceipt;
|
|
88
|
+
stdout: Buffer;
|
|
89
|
+
stderr: Buffer;
|
|
90
|
+
};
|
|
91
|
+
/** The outcome when this executor produced it for exactly `step`; undefined for any other value. */
|
|
92
|
+
export declare function authenticatedExecutionOutcome(outcome: unknown, step: ExecutionStep): ExecuteProbeOutcome | undefined;
|
|
93
|
+
/** Runs one operator/agent session process while retaining ownership of its whole process group. */
|
|
94
|
+
/** Whether a foreground process inherits a terminal on both stdin and stdout, so it may ask for one of its own. */
|
|
95
|
+
export declare function foregroundTerminal(): boolean;
|
|
96
|
+
export declare function executeForegroundProcess(input: ForegroundProcessInput, options?: Readonly<{
|
|
97
|
+
signal?: AbortSignal;
|
|
98
|
+
}>): Promise<ForegroundProcessOutcome>;
|
|
99
|
+
export declare function executeProbe(step: ExecutionStep, options?: {
|
|
100
|
+
signal?: AbortSignal;
|
|
101
|
+
}): Promise<ExecuteProbeOutcome>;
|
|
102
|
+
export declare function executePlan(plan: ExecutionPlan, options?: {
|
|
103
|
+
signal?: AbortSignal;
|
|
104
|
+
}): Promise<ExecutePlanOutcome>;
|
|
105
|
+
export {};
|