@nklisch/pi-enhanced 0.1.10 → 0.2.0
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 +14 -0
- package/node_modules/@nklisch/pi-clearance/native/clearance-core.darwin-arm64.node +0 -0
- package/node_modules/@nklisch/pi-clearance/native/clearance-core.darwin-x64.node +0 -0
- package/node_modules/@nklisch/pi-clearance/native/clearance-core.linux-arm64-gnu.node +0 -0
- package/node_modules/@nklisch/pi-clearance/native/clearance-core.win32-x64-msvc.node +0 -0
- package/node_modules/@nklisch/pi-plugins/README.md +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/adoption-contract.d.ts +0 -6
- package/node_modules/@nklisch/pi-plugins/dist/application/agent-orientation.d.ts +66 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/agent-orientation.js +223 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/agent-orientation.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-trust-continuity.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-trust-continuity.js +15 -33
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-trust-continuity.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-coordinator.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-coordinator.js +17 -20
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-coordinator.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-eligibility.d.ts +3 -3
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-eligibility.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-eligibility.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/configuration-service.d.ts +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/configuration-service.js +5 -5
- package/node_modules/@nklisch/pi-plugins/dist/application/configuration-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/convergence-service.d.ts +98 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/convergence-service.js +270 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/convergence-service.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/exact-trust-grant-service.d.ts +3 -5
- package/node_modules/@nklisch/pi-plugins/dist/application/exact-trust-grant-service.js +18 -20
- package/node_modules/@nklisch/pi-plugins/dist/application/exact-trust-grant-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-service.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-service.js +3 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/host-observation-contract.d.ts +25 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/host-observation-contract.js +5 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/host-observation-contract.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/host-precedence-service.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/host-precedence-service.js +3 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/host-precedence-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/inspection-contract.d.ts +0 -4
- package/node_modules/@nklisch/pi-plugins/dist/application/installed-revision-descriptor.d.ts +0 -4
- package/node_modules/@nklisch/pi-plugins/dist/application/installed-trust-grant-service.d.ts +0 -9
- package/node_modules/@nklisch/pi-plugins/dist/application/installed-trust-grant-service.js +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/installed-trust-grant-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-inspection-contract.d.ts +0 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-refresh-service.d.ts +4 -7
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-refresh-service.js +88 -122
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-refresh-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-registration-service.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-registration-service.js +56 -94
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-registration-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-update-policy-service.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-update-policy-service.js +7 -6
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-update-policy-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-automatic-run-presenter.d.ts +3 -4
- package/node_modules/@nklisch/pi-plugins/dist/application/native-automatic-run-presenter.js +8 -11
- package/node_modules/@nklisch/pi-plugins/dist/application/native-automatic-run-presenter.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-candidate-inspection.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-candidate-inspection.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-contract.d.ts +7 -6
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-contract.js +4 -5
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-contract.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-dispatcher.js +2 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-dispatcher.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-error.d.ts +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-error.js +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-error.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-help.d.ts +5 -3
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-install.d.ts +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-lifecycle.js +4 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-lifecycle.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-mutation-dispatch.js +13 -21
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-mutation-dispatch.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-operation.d.ts +122 -1124
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-parser.d.ts +8 -4
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-parser.js +4 -3
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-parser.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-progress.d.ts +6 -4
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-read-dispatch.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-read-dispatch.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-registry.d.ts +30 -7
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-registry.js +4 -3
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-registry.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-safe-projection.d.ts +0 -6
- package/node_modules/@nklisch/pi-plugins/dist/application/native-diagnostic-registry.d.ts +49 -49
- package/node_modules/@nklisch/pi-plugins/dist/application/native-diagnostic-registry.js +10 -10
- package/node_modules/@nklisch/pi-plugins/dist/application/native-diagnostic-registry.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-failure-presenter.d.ts +0 -5
- package/node_modules/@nklisch/pi-plugins/dist/application/native-failure-presenter.js +13 -11
- package/node_modules/@nklisch/pi-plugins/dist/application/native-failure-presenter.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-inspection-contract.d.ts +55 -70
- package/node_modules/@nklisch/pi-plugins/dist/application/native-inspection-contract.js +4 -3
- package/node_modules/@nklisch/pi-plugins/dist/application/native-inspection-contract.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-inspection-service.js +30 -11
- package/node_modules/@nklisch/pi-plugins/dist/application/native-inspection-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-installed-inspection.js +46 -35
- package/node_modules/@nklisch/pi-plugins/dist/application/native-installed-inspection.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-contract.d.ts +362 -1284
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-contract.js +11 -12
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-contract.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-service.d.ts +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-service.js +4 -26
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-session.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-session.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation.d.ts +79 -235
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation.js +26 -41
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-result.d.ts +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-result.js +23 -68
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-result.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-target.d.ts +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-target.js +0 -18
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-target.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-update.d.ts +0 -4
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-update.js +0 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-update.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-update-contract.d.ts +2 -5
- package/node_modules/@nklisch/pi-plugins/dist/application/native-update-contract.js +5 -5
- package/node_modules/@nklisch/pi-plugins/dist/application/native-update-contract.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-update-policy-service.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/native-update-policy-service.js +4 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/native-update-policy-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/plugin-lifecycle-contract.d.ts +30 -57
- package/node_modules/@nklisch/pi-plugins/dist/application/plugin-lifecycle-contract.js +9 -32
- package/node_modules/@nklisch/pi-plugins/dist/application/plugin-lifecycle-contract.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/plugin-lifecycle-service.d.ts +57 -75
- package/node_modules/@nklisch/pi-plugins/dist/application/plugin-lifecycle-service.js +293 -583
- package/node_modules/@nklisch/pi-plugins/dist/application/plugin-lifecycle-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/artifact-gc.d.ts +21 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/artifact-gc.js +2 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/artifact-gc.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/automatic-update-lifecycle.d.ts +5 -6
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/installed-plugin-loader.d.ts +0 -4
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/lifecycle-reload.d.ts +80 -13
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/lifecycle-reload.js +6 -3
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/lifecycle-reload.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/mcp-runtime.d.ts +0 -16
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/native-control-input.d.ts +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/native-inspection-evidence.d.ts +4 -4
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/pending-data-deletion.d.ts +26 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/pending-data-deletion.js +8 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/pending-data-deletion.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-contract.d.ts +12 -9
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-contract.js +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-contract.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-planner.js +1 -10
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-planner.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-projection.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-projection.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-service.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-service.js +6 -10
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-state.d.ts +2 -4
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-state.js +9 -8
- package/node_modules/@nklisch/pi-plugins/dist/application/project-sync-state.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/state-contract.d.ts +16 -32
- package/node_modules/@nklisch/pi-plugins/dist/application/state-transaction.d.ts +48 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/state-transaction.js +107 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/state-transaction.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-contract.d.ts +1725 -4546
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-contract.js +3 -22
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-contract.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-lifecycle.d.ts +1 -3
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-lifecycle.js +1 -5
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-lifecycle.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-service.js +33 -122
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-session.d.ts +0 -20
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-session.js +1 -23
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-session.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/update-contract.d.ts +0 -7
- package/node_modules/@nklisch/pi-plugins/dist/application/update-contract.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/update-contract.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/update-notification-service.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/update-notification-service.js +5 -3
- package/node_modules/@nklisch/pi-plugins/dist/application/update-notification-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/update-scheduler-lease-state.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/update-scheduler-lease-state.js +6 -4
- package/node_modules/@nklisch/pi-plugins/dist/application/update-scheduler-lease-state.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/agent-orientation-facts.d.ts +42 -0
- package/node_modules/@nklisch/pi-plugins/dist/composition/agent-orientation-facts.js +223 -0
- package/node_modules/@nklisch/pi-plugins/dist/composition/agent-orientation-facts.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/composition/automatic-update-lifecycle-adapter.js +12 -18
- package/node_modules/@nklisch/pi-plugins/dist/composition/automatic-update-lifecycle-adapter.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/background-update-coordinator.d.ts +3 -0
- package/node_modules/@nklisch/pi-plugins/dist/composition/background-update-coordinator.js +10 -0
- package/node_modules/@nklisch/pi-plugins/dist/composition/background-update-coordinator.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/complete-plugin-reload.d.ts +3 -7
- package/node_modules/@nklisch/pi-plugins/dist/composition/complete-plugin-reload.js +64 -153
- package/node_modules/@nklisch/pi-plugins/dist/composition/complete-plugin-reload.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-marketplace-discovery-services.d.ts +2 -3
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-marketplace-discovery-services.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-mcp-runtime.d.ts +3 -7
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-mcp-runtime.js +4 -8
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-mcp-runtime.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-inspection-service.d.ts +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-inspection-service.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-inspection-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-lifecycle-operation-service.d.ts +2 -5
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-lifecycle-operation-service.js +70 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-lifecycle-operation-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-update-management-service.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-update-management-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-packaged-plugin-host.d.ts +12 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-packaged-plugin-host.js +177 -66
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-packaged-plugin-host.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-skill-hook-runtime.d.ts +2 -4
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-skill-hook-runtime.js +24 -43
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-skill-hook-runtime.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-trusted-installation-service.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-trusted-installation-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/host-status-service.d.ts +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/host-status-service.js +4 -4
- package/node_modules/@nklisch/pi-plugins/dist/composition/host-status-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/native-inspection-evidence.d.ts +3 -3
- package/node_modules/@nklisch/pi-plugins/dist/composition/native-inspection-evidence.js +6 -6
- package/node_modules/@nklisch/pi-plugins/dist/composition/native-inspection-evidence.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/packaged-host-startup.d.ts +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/packaged-host-startup.js +4 -5
- package/node_modules/@nklisch/pi-plugins/dist/composition/packaged-host-startup.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/packaged-plugin-host-contract.d.ts +5 -0
- package/node_modules/@nklisch/pi-plugins/dist/composition/plugin-host-paths.d.ts +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/composition/plugin-host-paths.js +6 -0
- package/node_modules/@nklisch/pi-plugins/dist/composition/plugin-host-paths.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/runtime-desired-state.d.ts +15 -0
- package/node_modules/@nklisch/pi-plugins/dist/composition/runtime-desired-state.js +228 -154
- package/node_modules/@nklisch/pi-plugins/dist/composition/runtime-desired-state.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/runtime-participant-qualification.d.ts +7 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/runtime-participant-qualification.js +17 -4
- package/node_modules/@nklisch/pi-plugins/dist/composition/runtime-participant-qualification.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/domain/compatibility-policy.d.ts +0 -4
- package/node_modules/@nklisch/pi-plugins/dist/domain/compatibility.d.ts +0 -6
- package/node_modules/@nklisch/pi-plugins/dist/domain/error-contract.d.ts +0 -6
- package/node_modules/@nklisch/pi-plugins/dist/domain/error-contract.js +0 -2
- package/node_modules/@nklisch/pi-plugins/dist/domain/error-contract.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/domain/errors.d.ts +0 -6
- package/node_modules/@nklisch/pi-plugins/dist/domain/marketplace.d.ts +0 -2
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/config-state.d.ts +2 -6
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/installed-state.d.ts +4 -4
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/installed-state.js +5 -7
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/installed-state.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/project-state.d.ts +2 -4
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/references.d.ts +1 -8
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/references.js +0 -9
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/references.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/registry.d.ts +4 -8
- package/node_modules/@nklisch/pi-plugins/dist/domain/update-policy.d.ts +5 -13
- package/node_modules/@nklisch/pi-plugins/dist/domain/update-policy.js +2 -3
- package/node_modules/@nklisch/pi-plugins/dist/domain/update-policy.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/index.d.ts +16 -38
- package/node_modules/@nklisch/pi-plugins/dist/index.js +8 -22
- package/node_modules/@nklisch/pi-plugins/dist/index.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/cleanup/pending-data-deletion.d.ts +8 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/cleanup/pending-data-deletion.js +112 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/cleanup/pending-data-deletion.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/convergence/artifact-gc.d.ts +17 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/convergence/artifact-gc.js +143 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/convergence/artifact-gc.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/convergence/create-node-convergence.d.ts +16 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/convergence/create-node-convergence.js +14 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/convergence/create-node-convergence.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/filesystem/immutable-content-store.d.ts +0 -8
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/filesystem/immutable-content-store.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/filesystem/immutable-content-store.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/filesystem/staging-allocator.d.ts +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/filesystem/staging-allocator.js +1 -24
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/filesystem/staging-allocator.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/lifecycle-convergence-migration.d.ts +33 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/lifecycle-convergence-migration.js +416 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/lifecycle-convergence-migration.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-lifecycle-state-store.d.ts +10 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-lifecycle-state-store.js +31 -4
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-lifecycle-state-store.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/agent-orientation-publisher.d.ts +17 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/agent-orientation-publisher.js +81 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/agent-orientation-publisher.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/extension.js +8 -3
- package/node_modules/@nklisch/pi-plugins/dist/pi/extension.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/pi-control-input.js +0 -2
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/pi-control-input.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-install-component.js +9 -22
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-install-component.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-install-flow.d.ts +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-actions.d.ts +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-actions.js +7 -7
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-actions.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-controller.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-controller.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-model.d.ts +8 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-model.js +7 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-model.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-render.js +6 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-render.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-session.js +11 -22
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-session.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-status.d.ts +1 -2
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-status.js +1 -3
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-status.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-operation-view.js +2 -4
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-operation-view.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/native-control-human.js +5 -7
- package/node_modules/@nklisch/pi-plugins/dist/pi/native-control-human.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/pi-reload-broker.d.ts +6 -6
- package/node_modules/@nklisch/pi-plugins/dist/pi/pi-reload-broker.js +36 -6
- package/node_modules/@nklisch/pi-plugins/dist/pi/pi-reload-broker.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/plain-language.js +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/plain-language.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-command.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-command.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/lifecycle-participant.d.ts +0 -2
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/mcp-runtime-binding-provider.d.ts +12 -0
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/mcp-runtime-binding-provider.js +43 -0
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/mcp-runtime-binding-provider.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/pi-mcp-adapter-package.d.ts +12 -1
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/pi-mcp-adapter-package.js +27 -10
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/pi-mcp-adapter-package.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/pi-mcp-adapter-runtime.js +1 -1
- package/node_modules/@nklisch/pi-plugins/package.json +3 -3
- package/package.json +6 -3
- package/node_modules/@nklisch/pi-plugins/dist/application/generation-mutation-coordinator.d.ts +0 -79
- package/node_modules/@nklisch/pi-plugins/dist/application/generation-mutation-coordinator.js +0 -424
- package/node_modules/@nklisch/pi-plugins/dist/application/generation-mutation-coordinator.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/keyed-mutation-scheduler.d.ts +0 -19
- package/node_modules/@nklisch/pi-plugins/dist/application/keyed-mutation-scheduler.js +0 -235
- package/node_modules/@nklisch/pi-plugins/dist/application/keyed-mutation-scheduler.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/lifecycle-transition-reconciler.d.ts +0 -79
- package/node_modules/@nklisch/pi-plugins/dist/application/lifecycle-transition-reconciler.js +0 -236
- package/node_modules/@nklisch/pi-plugins/dist/application/lifecycle-transition-reconciler.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/mutation-coordination.d.ts +0 -19
- package/node_modules/@nklisch/pi-plugins/dist/application/mutation-coordination.js +0 -12
- package/node_modules/@nklisch/pi-plugins/dist/application/mutation-coordination.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-uninstall-cleanup.d.ts +0 -25
- package/node_modules/@nklisch/pi-plugins/dist/application/native-uninstall-cleanup.js +0 -39
- package/node_modules/@nklisch/pi-plugins/dist/application/native-uninstall-cleanup.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/lifecycle-transition-store.d.ts +0 -5020
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/lifecycle-transition-store.js +0 -129
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/lifecycle-transition-store.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/mutation-execution-context.d.ts +0 -9
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/mutation-execution-context.js +0 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/mutation-execution-context.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/recovery-artifacts.d.ts +0 -29
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/recovery-artifacts.js +0 -4
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/recovery-artifacts.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/revision-lease-store.d.ts +0 -65
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/revision-lease-store.js +0 -16
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/revision-lease-store.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/revision-retention-store.d.ts +0 -43
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/revision-retention-store.js +0 -12
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/revision-retention-store.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/scope-lock.d.ts +0 -15
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/scope-lock.js +0 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/scope-lock.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/recovery-contract.d.ts +0 -1078
- package/node_modules/@nklisch/pi-plugins/dist/application/recovery-contract.js +0 -126
- package/node_modules/@nklisch/pi-plugins/dist/application/recovery-contract.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/recovery-service.d.ts +0 -39
- package/node_modules/@nklisch/pi-plugins/dist/application/recovery-service.js +0 -170
- package/node_modules/@nklisch/pi-plugins/dist/application/recovery-service.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/revision-collection-service.d.ts +0 -52
- package/node_modules/@nklisch/pi-plugins/dist/application/revision-collection-service.js +0 -228
- package/node_modules/@nklisch/pi-plugins/dist/application/revision-collection-service.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/create-node-recovery-adapters.d.ts +0 -23
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/create-node-recovery-adapters.js +0 -82
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/create-node-recovery-adapters.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/local-recovery-filesystem.d.ts +0 -15
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/local-recovery-filesystem.js +0 -35
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/local-recovery-filesystem.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/process-revision-leases.d.ts +0 -7
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/process-revision-leases.js +0 -95
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/process-revision-leases.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/recovery-artifact-scanner.d.ts +0 -3
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/recovery-artifact-scanner.js +0 -83
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/recovery-artifact-scanner.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/revision-artifact-store.d.ts +0 -3
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/revision-artifact-store.js +0 -178
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/revision-artifact-store.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-revision-retention.d.ts +0 -7
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-revision-retention.js +0 -73
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-revision-retention.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-transition-journal.d.ts +0 -28
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-transition-journal.js +0 -445
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-transition-journal.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/keyed-mutation-scheduler.d.ts +0 -5
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/keyed-mutation-scheduler.js +0 -17
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/keyed-mutation-scheduler.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-scope-lock.d.ts +0 -15
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-scope-lock.js +0 -292
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-scope-lock.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/revision-lease-provider.d.ts +0 -18
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/revision-lease-provider.js +0 -180
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/revision-lease-provider.js.map +0 -1
|
@@ -1,100 +1,34 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { LifecycleOperationSchema, LifecycleOriginSchema, LifecycleRetainedDataSchema, LifecycleRejectionCodeSchema, } from "./plugin-lifecycle-contract.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { authorizeAutomaticUpdateCandidate, createAutomaticUpdateAuthorizationEvidence } from "./automatic-update-authorization.js";
|
|
7
|
-
import { resolveEffectiveUpdatePolicy } from "./update-policy-resolution.js";
|
|
8
|
-
import { prepareEnableCandidate, prepareInactiveProjection, preparePluginCandidate, } from "./plugin-candidate-preparation.js";
|
|
9
|
-
import { CandidateContentCleanupError, isCandidateContentCleanupError, } from "./ports/candidate-content-lease.js";
|
|
3
|
+
import { runScopedMutation } from "./state-transaction.js";
|
|
4
|
+
import { prepareEnableCandidate, prepareInactiveProjection, preparePluginCandidate } from "./plugin-candidate-preparation.js";
|
|
5
|
+
import { CandidateContentCleanupError, isCandidateContentCleanupError } from "./ports/candidate-content-lease.js";
|
|
10
6
|
import { deriveLifecycleTargetDigest } from "./native-lifecycle-target.js";
|
|
11
7
|
import { PluginConfigurationReadResultSchema } from "./ports/plugin-configuration-store.js";
|
|
12
8
|
import { verifyPluginConfigurationDocument } from "../domain/configured-values.js";
|
|
13
|
-
import { parseStateMutation
|
|
14
|
-
import { createInstalledRevisionRecord, InstalledPluginRecordSchema, } from "../domain/state/installed-state.js";
|
|
15
|
-
import { createInstalledUserStateDocument, } from "../domain/state/installed-state.js";
|
|
9
|
+
import { parseStateMutation } from "./state-contract.js";
|
|
10
|
+
import { createInstalledRevisionRecord, InstalledPluginRecordSchema, createInstalledUserStateDocument, } from "../domain/state/installed-state.js";
|
|
16
11
|
import { createProjectLocalStateDocument } from "../domain/state/project-state.js";
|
|
17
|
-
import { ScopeContextSchema, createScopeContext, toScopeReference
|
|
12
|
+
import { ScopeContextSchema, createScopeContext, toScopeReference } from "../domain/state/scope.js";
|
|
18
13
|
import { PluginKeySchema } from "../domain/identity.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class GuardMismatch extends Error {
|
|
24
|
-
generation;
|
|
25
|
-
constructor(generation) {
|
|
26
|
-
super("lifecycle target changed while a prepared transition was waiting");
|
|
27
|
-
this.name = "GuardMismatch";
|
|
28
|
-
this.generation = generation;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
class PromotionFailure extends Error {
|
|
32
|
-
constructor() {
|
|
33
|
-
super("content promotion did not return the requested immutable revision");
|
|
34
|
-
this.name = "PromotionFailure";
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
class ConfigurationGuardMismatch extends Error {
|
|
38
|
-
constructor() {
|
|
39
|
-
super("prepared configuration authority changed");
|
|
40
|
-
this.name = "ConfigurationGuardMismatch";
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
class ConfigurationGuardUnavailable extends Error {
|
|
44
|
-
constructor() {
|
|
45
|
-
super("prepared configuration authority is unavailable");
|
|
46
|
-
this.name = "ConfigurationGuardUnavailable";
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
function sameJson(left, right) {
|
|
50
|
-
return JSON.stringify(left) === JSON.stringify(right);
|
|
51
|
-
}
|
|
52
|
-
function asScopeContext(input, sha256) {
|
|
53
|
-
return createScopeContext(ScopeContextSchema.parse(input), sha256);
|
|
54
|
-
}
|
|
14
|
+
import { GenerationSchema } from "../domain/state/config-state.js";
|
|
15
|
+
import { ContentDigestSchema } from "../domain/content-manifest.js";
|
|
16
|
+
function sameJson(left, right) { return JSON.stringify(left) === JSON.stringify(right); }
|
|
17
|
+
function asScopeContext(input, sha256) { return createScopeContext(ScopeContextSchema.parse(input), sha256); }
|
|
55
18
|
function targetRecord(snapshot, plugin) {
|
|
56
|
-
return "installed" in snapshot
|
|
57
|
-
? snapshot.installed.plugins.find((record) => record.plugin === plugin)
|
|
58
|
-
: snapshot.project.plugins.find((record) => record.plugin === plugin);
|
|
59
|
-
}
|
|
60
|
-
function withoutPending(record) {
|
|
61
|
-
const { pendingTransition: _pendingTransition, ...value } = record;
|
|
62
|
-
return InstalledPluginRecordSchema.parse(value);
|
|
63
|
-
}
|
|
64
|
-
function withPending(record, reference, _sha256) {
|
|
65
|
-
return InstalledPluginRecordSchema.parse({ ...withoutPending(record), pendingTransition: reference });
|
|
66
|
-
}
|
|
67
|
-
function scopeRecords(snapshot) {
|
|
68
|
-
return "installed" in snapshot ? snapshot.installed.plugins : snapshot.project.plugins;
|
|
19
|
+
return "installed" in snapshot ? snapshot.installed.plugins.find((record) => record.plugin === plugin) : snapshot.project.plugins.find((record) => record.plugin === plugin);
|
|
69
20
|
}
|
|
21
|
+
function records(snapshot) { return "installed" in snapshot ? snapshot.installed.plugins : snapshot.project.plugins; }
|
|
70
22
|
function replaceTarget(snapshot, plugin, replacement, sha256) {
|
|
71
|
-
const
|
|
23
|
+
const next = records(snapshot).filter((record) => record.plugin !== plugin);
|
|
72
24
|
if (replacement !== null)
|
|
73
|
-
|
|
25
|
+
next.push(replacement);
|
|
74
26
|
if ("installed" in snapshot) {
|
|
75
|
-
const installed = createInstalledUserStateDocument({
|
|
76
|
-
|
|
77
|
-
generation: snapshot.generation,
|
|
78
|
-
plugins: records,
|
|
79
|
-
}, sha256);
|
|
80
|
-
return parseStateMutation({
|
|
81
|
-
scope: snapshot.scope,
|
|
82
|
-
expectedGeneration: snapshot.generation,
|
|
83
|
-
replace: { installed },
|
|
84
|
-
}, sha256);
|
|
27
|
+
const installed = createInstalledUserStateDocument({ ...snapshot.installed, generation: snapshot.generation, plugins: next }, sha256);
|
|
28
|
+
return parseStateMutation({ scope: snapshot.scope, expectedGeneration: snapshot.generation, replace: { installed } }, sha256);
|
|
85
29
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const project = createProjectLocalStateDocument({
|
|
89
|
-
...snapshot.project,
|
|
90
|
-
generation: snapshot.generation,
|
|
91
|
-
plugins: records,
|
|
92
|
-
}, snapshot.scope, sha256);
|
|
93
|
-
return parseStateMutation({
|
|
94
|
-
scope: snapshot.scope,
|
|
95
|
-
expectedGeneration: snapshot.generation,
|
|
96
|
-
replace: { project },
|
|
97
|
-
}, sha256);
|
|
30
|
+
const project = createProjectLocalStateDocument({ ...snapshot.project, generation: snapshot.generation, plugins: next }, snapshot.scope, sha256);
|
|
31
|
+
return parseStateMutation({ scope: snapshot.scope, expectedGeneration: snapshot.generation, replace: { project } }, sha256);
|
|
98
32
|
}
|
|
99
33
|
function mapPreparationCode(code) {
|
|
100
34
|
switch (code) {
|
|
@@ -108,23 +42,15 @@ function mapPreparationCode(code) {
|
|
|
108
42
|
default: return "MALFORMED";
|
|
109
43
|
}
|
|
110
44
|
}
|
|
111
|
-
function
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
return { kind: "adapter-error", code: "ADAPTER_FAILED" };
|
|
118
|
-
}
|
|
119
|
-
function cleanupSignal() {
|
|
120
|
-
return new AbortController().signal;
|
|
121
|
-
}
|
|
45
|
+
function operationOrigin(request) { return LifecycleOriginSchema.parse(request.origin ?? "manual"); }
|
|
46
|
+
function retainedData(request) { return LifecycleRetainedDataSchema.parse(request.retainedData ?? "keep"); }
|
|
47
|
+
function current(operation, snapshot) { return { kind: "current", operation, snapshot }; }
|
|
48
|
+
function rejected(operation, code) { return { kind: "rejected", operation, code: LifecycleRejectionCodeSchema.parse(code) }; }
|
|
49
|
+
function cleanupSignal() { return new AbortController().signal; }
|
|
122
50
|
async function discardCandidate(dependencies, candidate) {
|
|
123
51
|
if (candidate?.allocation === undefined)
|
|
124
52
|
return;
|
|
125
|
-
const recovery = Object.freeze({
|
|
126
|
-
retry: () => dependencies.content.discardStaging(candidate.allocation, cleanupSignal()),
|
|
127
|
-
});
|
|
53
|
+
const recovery = Object.freeze({ retry: () => dependencies.content.discardStaging(candidate.allocation, cleanupSignal()) });
|
|
128
54
|
try {
|
|
129
55
|
await recovery.retry();
|
|
130
56
|
}
|
|
@@ -132,241 +58,100 @@ async function discardCandidate(dependencies, candidate) {
|
|
|
132
58
|
throw new CandidateContentCleanupError(recovery, { cause: error });
|
|
133
59
|
}
|
|
134
60
|
}
|
|
135
|
-
async function
|
|
136
|
-
if (
|
|
137
|
-
return
|
|
61
|
+
async function exactConfigurationState(dependencies, prepared, expected) {
|
|
62
|
+
if (expected === undefined)
|
|
63
|
+
return "current";
|
|
64
|
+
if (prepared === undefined || prepared.revision.configurationRef === undefined)
|
|
65
|
+
return "stale";
|
|
66
|
+
try {
|
|
67
|
+
const result = PluginConfigurationReadResultSchema.parse(await dependencies.configurations.read(prepared.revision.configurationRef, cleanupSignal()));
|
|
68
|
+
if (result.kind === "missing")
|
|
69
|
+
return "stale";
|
|
70
|
+
const document = verifyPluginConfigurationDocument(result.document, prepared.normalized.configuration, dependencies.sha256);
|
|
71
|
+
return document.configurationRef === prepared.revision.configurationRef && document.plugin === prepared.plugin && sameJson(document.scope, toScopeReference(prepared.scope)) && document.revision === expected ? "current" : "stale";
|
|
138
72
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
throw new Error("installed state selected revision is missing");
|
|
142
|
-
const loaded = await dependencies.installed.load({ scope, revision: selected }, signal);
|
|
143
|
-
if (loaded.binding !== selected.revision || loaded.plugin.identity.key !== plugin)
|
|
144
|
-
throw new Error("installed loader returned a different selected revision");
|
|
145
|
-
const reconstructed = createInstalledRevisionRecord({
|
|
146
|
-
plugin: loaded.plugin,
|
|
147
|
-
compatibility: loaded.compatibility,
|
|
148
|
-
content: loaded.content,
|
|
149
|
-
revision: selected.revision,
|
|
150
|
-
contentRef: selected.contentRef,
|
|
151
|
-
dataRef: selected.dataRef,
|
|
152
|
-
...(selected.configurationRef === undefined ? {} : { configurationRef: selected.configurationRef }),
|
|
153
|
-
...(selected.evidence.source.marketplaceSourceIdentity === undefined ? {} : { marketplaceSourceIdentity: selected.evidence.source.marketplaceSourceIdentity }),
|
|
154
|
-
...(selected.evidence.source.pluginSourceIdentity === undefined ? {} : { pluginSourceIdentity: selected.evidence.source.pluginSourceIdentity }),
|
|
155
|
-
...(selected.evidence.source.declaredVersion === undefined ? {} : { declaredVersion: selected.evidence.source.declaredVersion }),
|
|
156
|
-
scope: toScopeReference(scope),
|
|
157
|
-
}, dependencies.sha256);
|
|
158
|
-
if (!sameJson(reconstructed, selected))
|
|
159
|
-
throw new Error("installed loader evidence does not match selected state");
|
|
160
|
-
const projection = createActiveProjectionExpectation(createPluginRuntimeProjection({
|
|
161
|
-
scope: toScopeReference(scope),
|
|
162
|
-
plugin: loaded.plugin,
|
|
163
|
-
compatibility: loaded.compatibility,
|
|
164
|
-
revision: selected,
|
|
165
|
-
sha256: dependencies.sha256,
|
|
166
|
-
}), dependencies.sha256);
|
|
167
|
-
const prepared = await dependencies.projections.prepare(projection, signal);
|
|
168
|
-
const verified = verifyProjectionExpectation(prepared, dependencies.sha256);
|
|
169
|
-
if (!sameJson(verified, projection))
|
|
170
|
-
throw new Error("previous projection adapter returned different evidence");
|
|
171
|
-
return verified;
|
|
172
|
-
}
|
|
173
|
-
function observationMatches(observation, expectation, plugin) {
|
|
174
|
-
if (expectation.kind === "inactive") {
|
|
175
|
-
return observation.kind === "inactive" &&
|
|
176
|
-
sameJson(observation.scope, expectation.scope) &&
|
|
177
|
-
observation.plugin === plugin &&
|
|
178
|
-
observation.projectionDigest === expectation.digest;
|
|
73
|
+
catch {
|
|
74
|
+
return "unavailable";
|
|
179
75
|
}
|
|
180
|
-
return observation.kind === "active" &&
|
|
181
|
-
sameJson(observation.scope, expectation.projection.scope) &&
|
|
182
|
-
observation.plugin === plugin &&
|
|
183
|
-
observation.revision === expectation.projection.revision &&
|
|
184
|
-
observation.projectionDigest === expectation.projection.digest;
|
|
185
76
|
}
|
|
186
|
-
|
|
77
|
+
function appendPrevious(candidate, previous, operation) {
|
|
78
|
+
if (operation !== "update" || previous === undefined)
|
|
79
|
+
return candidate;
|
|
80
|
+
const previousRevision = previous.selectedRevision === candidate.selectedRevision
|
|
81
|
+
? previous.previousRevision
|
|
82
|
+
: previous.selectedRevision;
|
|
83
|
+
return InstalledPluginRecordSchema.parse({
|
|
84
|
+
...candidate,
|
|
85
|
+
...(previousRevision === undefined ? {} : { previousRevision }),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function sourceEvidenceMatches(candidate, expected) {
|
|
89
|
+
const actual = candidate.evidence.source;
|
|
90
|
+
const wanted = expected.evidence.source;
|
|
91
|
+
if (actual.kind !== wanted.kind || actual.sourceHash !== wanted.sourceHash)
|
|
92
|
+
return false;
|
|
93
|
+
if ("revision" in actual && "revision" in wanted && actual.revision !== wanted.revision)
|
|
94
|
+
return false;
|
|
95
|
+
if ("marketplaceRevision" in actual && "marketplaceRevision" in wanted && actual.marketplaceRevision !== wanted.marketplaceRevision)
|
|
96
|
+
return false;
|
|
97
|
+
if (actual.kind === "npm" && wanted.kind === "npm" && actual.sourceRevision !== wanted.sourceRevision)
|
|
98
|
+
return false;
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
async function activate(dependencies, operation, scope, snapshot, plugin, signal) {
|
|
187
102
|
try {
|
|
188
|
-
const
|
|
189
|
-
if (
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
if (
|
|
194
|
-
return {
|
|
103
|
+
const result = await dependencies.reload.reload({ scope: toScopeReference(scope) }, signal);
|
|
104
|
+
if (result.kind === "accepted") {
|
|
105
|
+
const degraded = result.report?.kind === "degraded"
|
|
106
|
+
? result.report.degraded.find((entry) => entry.plugin === plugin && (entry.scope === undefined || sameJson(entry.scope, toScopeReference(scope))))
|
|
107
|
+
: undefined;
|
|
108
|
+
if (degraded !== undefined) {
|
|
109
|
+
return {
|
|
110
|
+
kind: "degraded",
|
|
111
|
+
operation,
|
|
112
|
+
snapshot,
|
|
113
|
+
failure: { plugin, code: degraded.code, explanation: degraded.explanation },
|
|
114
|
+
...(degraded.runningRevision === undefined ? {} : { runningRevision: ContentDigestSchema.parse(degraded.runningRevision) }),
|
|
115
|
+
};
|
|
195
116
|
}
|
|
196
|
-
return {
|
|
117
|
+
return { kind: "applied", operation, snapshot, activation: "applied" };
|
|
197
118
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
return { ok: true, observation };
|
|
203
|
-
}
|
|
204
|
-
catch (error) {
|
|
205
|
-
return { ok: false, failure: safeFailure(error) };
|
|
119
|
+
if (result.code === "PI_RELOAD_CONTEXT_UNAVAILABLE")
|
|
120
|
+
return { kind: "live-next-start", operation, snapshot, note: "no-reload-context" };
|
|
121
|
+
return { kind: "live-next-start", operation, snapshot, note: "reload-failed" };
|
|
206
122
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
if (operation === "disable" || operation === "uninstall") {
|
|
210
|
-
return InstalledPluginRecordSchema.parse({ ...withoutPending(previous), activation: "disabled" });
|
|
123
|
+
catch {
|
|
124
|
+
return { kind: "live-next-start", operation, snapshot, note: "reload-failed" };
|
|
211
125
|
}
|
|
212
|
-
if (prepared === undefined)
|
|
213
|
-
throw new Error("activation candidate is missing");
|
|
214
|
-
return prepared.record;
|
|
215
|
-
}
|
|
216
|
-
function operationOrigin(request) {
|
|
217
|
-
return LifecycleOriginSchema.parse(request.origin ?? "manual");
|
|
218
|
-
}
|
|
219
|
-
function retainedData(request) {
|
|
220
|
-
return LifecycleRetainedDataSchema.parse("retainedData" in request ? request.retainedData ?? "keep" : "keep");
|
|
221
|
-
}
|
|
222
|
-
function noOp(operation, snapshot) {
|
|
223
|
-
return { kind: "unchanged", operation, snapshot };
|
|
224
|
-
}
|
|
225
|
-
function rejected(operation, code) {
|
|
226
|
-
return { kind: "rejected", operation, code: LifecycleRejectionCodeSchema.parse(code) };
|
|
227
126
|
}
|
|
228
|
-
function
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
127
|
+
function mapMutation(operation, result, signal) {
|
|
128
|
+
if (result.kind === "committed")
|
|
129
|
+
return { kind: "committed", snapshot: result.snapshot };
|
|
130
|
+
if (result.kind === "stale")
|
|
131
|
+
return { kind: "stale", operation, expected: GenerationSchema.parse(result.expected), ...(result.actual === undefined ? {} : { actual: GenerationSchema.parse(result.actual) }) };
|
|
132
|
+
if (result.kind === "retryable")
|
|
133
|
+
return rejected(operation, result.code);
|
|
134
|
+
if (result.kind === "reject")
|
|
135
|
+
return result.value;
|
|
136
|
+
if (result.kind === "no-op")
|
|
137
|
+
return result.value;
|
|
138
|
+
if (signal.aborted)
|
|
139
|
+
return rejected(operation, "ABORTED");
|
|
140
|
+
return rejected(operation, "MALFORMED");
|
|
232
141
|
}
|
|
233
142
|
function createPluginLifecycleImplementation(dependencies) {
|
|
234
143
|
if (dependencies === null || typeof dependencies !== "object")
|
|
235
144
|
throw new TypeError("lifecycle service dependencies are required");
|
|
236
145
|
const preparation = dependencies;
|
|
237
|
-
const reconciler = createLifecycleTransitionReconciler({
|
|
238
|
-
state: dependencies.state,
|
|
239
|
-
mutations: dependencies.mutations,
|
|
240
|
-
reload: dependencies.reload,
|
|
241
|
-
transitions: dependencies.transitions,
|
|
242
|
-
sha256: dependencies.sha256,
|
|
243
|
-
});
|
|
244
146
|
async function load(scope, signal) {
|
|
245
147
|
const result = await dependencies.state.read(scope, signal);
|
|
246
148
|
return result.ok ? result.snapshot : undefined;
|
|
247
149
|
}
|
|
248
|
-
async function
|
|
249
|
-
if (
|
|
250
|
-
return;
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
// only degrades to the pre-existing fence: the row stays owned by this
|
|
254
|
-
// process and recovery adopts it after this process exits.
|
|
255
|
-
try {
|
|
256
|
-
await dependencies.transitions.releaseOwnership({ scope: toScopeReference(scope), reference }, cleanupSignal());
|
|
257
|
-
}
|
|
258
|
-
catch { /* next start still recovers through owner death */ }
|
|
259
|
-
}
|
|
260
|
-
async function trustFor(scope, requestRecords, signal) {
|
|
261
|
-
if (requestRecords !== undefined)
|
|
262
|
-
return requestRecords;
|
|
263
|
-
const snapshot = await load({ kind: "user" }, signal);
|
|
264
|
-
return snapshot !== undefined && "trust" in snapshot ? snapshot.trust.records : [];
|
|
265
|
-
}
|
|
266
|
-
async function exactConfigurationState(prepared, expectedRevision) {
|
|
267
|
-
if (expectedRevision === undefined)
|
|
268
|
-
return "current";
|
|
269
|
-
const ref = prepared?.revision.configurationRef;
|
|
270
|
-
if (ref === undefined || prepared === undefined)
|
|
271
|
-
return "stale";
|
|
272
|
-
try {
|
|
273
|
-
const result = PluginConfigurationReadResultSchema.parse(await dependencies.configurations.read(ref, new AbortController().signal));
|
|
274
|
-
if (result.kind === "missing")
|
|
275
|
-
return "stale";
|
|
276
|
-
const document = verifyPluginConfigurationDocument(result.document, prepared.normalized.configuration, dependencies.sha256);
|
|
277
|
-
return document.configurationRef === ref && document.plugin === prepared.plugin &&
|
|
278
|
-
sameJson(document.scope, toScopeReference(prepared.scope)) && document.revision === expectedRevision
|
|
279
|
-
? "current"
|
|
280
|
-
: "stale";
|
|
281
|
-
}
|
|
282
|
-
catch {
|
|
283
|
-
return "unavailable";
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
async function runFirstCommit(operation, scope, plugin, before, previous, candidate, prepared, reference, expectedConfigurationRevision, signal) {
|
|
287
|
-
let expected = before.generation;
|
|
288
|
-
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
289
|
-
try {
|
|
290
|
-
const result = await dependencies.mutations.runPreparedMutation({ scope, plugins: [plugin], expectedGeneration: expected }, async (context) => {
|
|
291
|
-
await context.assertOwned();
|
|
292
|
-
const current = targetRecord(context.snapshot, plugin);
|
|
293
|
-
if (!sameJson(current, previous))
|
|
294
|
-
throw new GuardMismatch(context.snapshot.generation);
|
|
295
|
-
const configurationState = await exactConfigurationState(prepared, expectedConfigurationRevision);
|
|
296
|
-
if (configurationState === "stale")
|
|
297
|
-
throw new ConfigurationGuardMismatch();
|
|
298
|
-
if (configurationState === "unavailable")
|
|
299
|
-
throw new ConfigurationGuardUnavailable();
|
|
300
|
-
let promotion;
|
|
301
|
-
if (prepared?.promotion !== undefined) {
|
|
302
|
-
try {
|
|
303
|
-
promotion = await dependencies.content.promote(prepared.promotion, signal);
|
|
304
|
-
}
|
|
305
|
-
catch {
|
|
306
|
-
throw new PromotionFailure();
|
|
307
|
-
}
|
|
308
|
-
if (!sameJson(promotion.identity, prepared.promotion.identity) || !sameJson(promotion.manifest, prepared.promotion.manifest)) {
|
|
309
|
-
throw new PromotionFailure();
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
return {
|
|
313
|
-
mutation: replaceTarget(context.snapshot, plugin, withPending(candidate, reference, dependencies.sha256), dependencies.sha256),
|
|
314
|
-
value: promotion,
|
|
315
|
-
};
|
|
316
|
-
}, signal);
|
|
317
|
-
if (result.kind === "committed")
|
|
318
|
-
return { kind: "committed", snapshot: result.snapshot };
|
|
319
|
-
if (result.kind === "stale-generation") {
|
|
320
|
-
if (attempt === 1)
|
|
321
|
-
return { kind: "stale", expected: result.expected, actual: result.actual };
|
|
322
|
-
const fresh = await load(scope, signal);
|
|
323
|
-
if (fresh === undefined)
|
|
324
|
-
return { kind: "recovery" };
|
|
325
|
-
if (targetRecord(fresh, plugin) !== undefined && !sameJson(targetRecord(fresh, plugin), previous)) {
|
|
326
|
-
return { kind: "stale", expected: expected, actual: fresh.generation };
|
|
327
|
-
}
|
|
328
|
-
if (targetRecord(fresh, plugin) === undefined && previous !== undefined) {
|
|
329
|
-
return { kind: "stale", expected: expected, actual: fresh.generation };
|
|
330
|
-
}
|
|
331
|
-
expected = fresh.generation;
|
|
332
|
-
continue;
|
|
333
|
-
}
|
|
334
|
-
if (result.kind === "commit-failed")
|
|
335
|
-
return { kind: "rejected", code: "MALFORMED" };
|
|
336
|
-
// A concurrent unrelated writer can advance the scope between the
|
|
337
|
-
// store commit and the coordinator's verification read. Resolve that
|
|
338
|
-
// ambiguous outcome from current authority only when our exact
|
|
339
|
-
// pending candidate and transition reference are durably present.
|
|
340
|
-
const fresh = await load(scope, signal);
|
|
341
|
-
const freshTarget = fresh === undefined ? undefined : targetRecord(fresh, plugin);
|
|
342
|
-
const expectedTarget = withPending(candidate, reference, dependencies.sha256);
|
|
343
|
-
if (fresh !== undefined && sameJson(freshTarget, expectedTarget)) {
|
|
344
|
-
return { kind: "committed", snapshot: fresh };
|
|
345
|
-
}
|
|
346
|
-
return result.actual === undefined
|
|
347
|
-
? { kind: "recovery" }
|
|
348
|
-
: { kind: "recovery", committed: result.actual };
|
|
349
|
-
}
|
|
350
|
-
catch (error) {
|
|
351
|
-
// The coordinator preserves durable commit evidence when only scope
|
|
352
|
-
// lease cleanup fails. Replaying would be unsafe; continue the
|
|
353
|
-
// transition from the exact committed snapshot instead.
|
|
354
|
-
if (error instanceof CommittedMutationCleanupError)
|
|
355
|
-
return { kind: "committed", snapshot: error.committed.snapshot };
|
|
356
|
-
if (signal.aborted)
|
|
357
|
-
return { kind: "rejected", code: "ABORTED" };
|
|
358
|
-
if (error instanceof GuardMismatch)
|
|
359
|
-
return { kind: "stale", expected, actual: error.generation };
|
|
360
|
-
if (error instanceof ConfigurationGuardMismatch)
|
|
361
|
-
return { kind: "rejected", code: "CONFIGURATION_STALE" };
|
|
362
|
-
if (error instanceof ConfigurationGuardUnavailable)
|
|
363
|
-
return { kind: "rejected", code: "MALFORMED" };
|
|
364
|
-
if (error instanceof PromotionFailure)
|
|
365
|
-
return { kind: "rejected", code: "PROMOTION_FAILED" };
|
|
366
|
-
return { kind: "recovery" };
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
return { kind: "stale", expected, actual: expected };
|
|
150
|
+
async function trustFor(request, signal) {
|
|
151
|
+
if (request.trustRecords !== undefined)
|
|
152
|
+
return request.trustRecords;
|
|
153
|
+
const result = await dependencies.state.read({ kind: "user" }, signal);
|
|
154
|
+
return result.ok && "trust" in result.snapshot ? result.snapshot.trust.records : [];
|
|
370
155
|
}
|
|
371
156
|
async function execute(operation, request, signal) {
|
|
372
157
|
LifecycleOperationSchema.parse(operation);
|
|
@@ -374,124 +159,34 @@ function createPluginLifecycleImplementation(dependencies) {
|
|
|
374
159
|
return rejected(operation, "ABORTED");
|
|
375
160
|
const scope = asScopeContext(request.scope, dependencies.sha256);
|
|
376
161
|
const plugin = PluginKeySchema.parse(request.plugin);
|
|
377
|
-
const
|
|
378
|
-
let initial;
|
|
379
|
-
try {
|
|
380
|
-
initial = await load(scope, signal);
|
|
381
|
-
}
|
|
382
|
-
catch {
|
|
383
|
-
return rejected(operation, signal.aborted ? "ABORTED" : "MALFORMED");
|
|
384
|
-
}
|
|
162
|
+
const initial = await load(scope, signal).catch(() => undefined);
|
|
385
163
|
if (initial === undefined)
|
|
386
164
|
return rejected(operation, "MALFORMED");
|
|
387
165
|
const previous = targetRecord(initial, plugin);
|
|
388
|
-
if (previous?.pendingTransition !== undefined)
|
|
389
|
-
return rejected(operation, "PENDING_TRANSITION");
|
|
390
166
|
const expectedTarget = "expectedTarget" in request ? request.expectedTarget : undefined;
|
|
391
|
-
if (expectedTarget !== undefined) {
|
|
392
|
-
|
|
393
|
-
previous.selectedRevision !== expectedTarget.selectedRevision || previous.activation !== expectedTarget.activation ||
|
|
394
|
-
deriveLifecycleTargetDigest(toScopeReference(scope), previous, dependencies.sha256) !== expectedTarget.targetDigest) {
|
|
395
|
-
return { kind: "stale", operation, expected: expectedTarget.generation, actual: initial.generation };
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
if (operation === "enable" && (previous === undefined || previous.activation === "enabled")) {
|
|
399
|
-
return previous === undefined ? rejected(operation, "NOT_INSTALLED") : noOp(operation, initial);
|
|
400
|
-
}
|
|
401
|
-
if (operation === "disable" && (previous === undefined || previous.activation === "disabled")) {
|
|
402
|
-
return previous === undefined ? rejected(operation, "NOT_INSTALLED") : noOp(operation, initial);
|
|
167
|
+
if (expectedTarget !== undefined && (previous === undefined || expectedTarget.plugin !== plugin || expectedTarget.selectedRevision !== previous.selectedRevision || expectedTarget.activation !== previous.activation || deriveLifecycleTargetDigest(toScopeReference(scope), previous, dependencies.sha256) !== expectedTarget.targetDigest)) {
|
|
168
|
+
return { kind: "stale", operation, expected: expectedTarget.generation, actual: initial.generation };
|
|
403
169
|
}
|
|
170
|
+
if (operation === "install" && previous !== undefined)
|
|
171
|
+
return rejected(operation, "ALREADY_INSTALLED");
|
|
404
172
|
if (operation === "update" && previous === undefined)
|
|
405
173
|
return rejected(operation, "NOT_INSTALLED");
|
|
174
|
+
if (operation === "enable" && previous === undefined)
|
|
175
|
+
return rejected(operation, "NOT_INSTALLED");
|
|
176
|
+
if (operation === "disable" && previous === undefined)
|
|
177
|
+
return rejected(operation, "NOT_INSTALLED");
|
|
406
178
|
if (operation === "uninstall" && previous === undefined)
|
|
407
|
-
return
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
? initial.trust.records
|
|
413
|
-
: await trustFor(scope, undefined, signal))
|
|
414
|
-
: [];
|
|
415
|
-
let automaticAuthorization;
|
|
416
|
-
if (operation === "update" && origin === "automatic-update") {
|
|
417
|
-
const automaticRequest = request;
|
|
418
|
-
if (automaticRequest.expectedRevision === undefined)
|
|
419
|
-
return rejected(operation, "INVALID_REQUEST");
|
|
420
|
-
const policyRecord = "config" in initial
|
|
421
|
-
? initial.config.records.find((record) => record.marketplace === automaticRequest.entry.identity.value.marketplaceName)
|
|
422
|
-
: initial.project.marketplaceUpdates.find((record) => record.marketplace === automaticRequest.entry.identity.value.marketplaceName);
|
|
423
|
-
if (policyRecord === undefined)
|
|
424
|
-
return rejected(operation, "UNTRUSTED");
|
|
425
|
-
const selected = previous?.revisions.find((revision) => revision.revision === previous.selectedRevision);
|
|
426
|
-
if (selected === undefined)
|
|
427
|
-
return rejected(operation, "MALFORMED");
|
|
428
|
-
try {
|
|
429
|
-
const loadedPrevious = await dependencies.installed.load({ scope, revision: selected }, signal);
|
|
430
|
-
const previousCandidate = createTrustCandidate({
|
|
431
|
-
scope: toScopeReference(scope),
|
|
432
|
-
marketplaceSource: loadedPrevious.marketplaceSource,
|
|
433
|
-
plugin: loadedPrevious.plugin,
|
|
434
|
-
compatibility: loadedPrevious.compatibility,
|
|
435
|
-
content: loadedPrevious.content,
|
|
436
|
-
materializationBinding: loadedPrevious.binding,
|
|
437
|
-
}, dependencies.sha256);
|
|
438
|
-
let globalPolicy;
|
|
439
|
-
let scopedPolicy;
|
|
440
|
-
if ("config" in initial) {
|
|
441
|
-
globalPolicy = initial.config.global.application;
|
|
442
|
-
scopedPolicy = initial.config.scope.application;
|
|
443
|
-
}
|
|
444
|
-
else {
|
|
445
|
-
const userPolicy = await dependencies.state.read({ kind: "user" }, signal);
|
|
446
|
-
if (!userPolicy.ok || !("config" in userPolicy.snapshot))
|
|
447
|
-
return rejected(operation, "UNTRUSTED");
|
|
448
|
-
globalPolicy = userPolicy.snapshot.config.global.application;
|
|
449
|
-
scopedPolicy = initial.project.scope.application;
|
|
450
|
-
}
|
|
451
|
-
const effectivePolicy = resolveEffectiveUpdatePolicy({
|
|
452
|
-
plugin,
|
|
453
|
-
record: MarketplaceUpdateRecordSchema.parse(policyRecord),
|
|
454
|
-
global: globalPolicy,
|
|
455
|
-
...(scopedPolicy === undefined ? {} : { scope: scopedPolicy }),
|
|
456
|
-
marketplaceSourceIdentity: selected.evidence.source.marketplaceSourceIdentity ?? "legacy-unavailable",
|
|
457
|
-
registeredMarketplaceSourceIdentity: deriveMarketplaceSourceIdentity(policyRecord.source, dependencies.sha256),
|
|
458
|
-
pluginSourceIdentity: selected.evidence.source.pluginSourceIdentity ?? "legacy-unavailable",
|
|
459
|
-
});
|
|
460
|
-
const authority = await authorizeAutomaticUpdateCandidate({
|
|
461
|
-
scope,
|
|
462
|
-
previous: loadedPrevious,
|
|
463
|
-
previousRecord: selected,
|
|
464
|
-
candidate: previousCandidate,
|
|
465
|
-
candidateMarketplaceSourceIdentity: deriveMarketplaceSourceIdentity(automaticRequest.marketplaceSource.declared, dependencies.sha256),
|
|
466
|
-
candidatePluginSourceIdentity: derivePluginSourceIdentity(automaticRequest.entry.source.value, dependencies.sha256),
|
|
467
|
-
expectedRevision: automaticRequest.expectedRevision,
|
|
468
|
-
policyRecord: MarketplaceUpdateRecordSchema.parse(policyRecord),
|
|
469
|
-
effectivePolicy,
|
|
470
|
-
trustRecords,
|
|
471
|
-
...(scope.kind === "project" && "project" in initial ? { projectDeclarationDigest: initial.project.declarationDigest } : {}),
|
|
472
|
-
}, { projectTrust: dependencies.projectTrust, sha256: dependencies.sha256 }, signal);
|
|
473
|
-
if (authority.kind === "denied")
|
|
474
|
-
return rejected(operation, authority.code === "STATE_STALE" ? "MALFORMED" : authority.code === "PROJECT_UNTRUSTED" ? "UNTRUSTED" : "UNTRUSTED");
|
|
475
|
-
automaticAuthorization = createAutomaticUpdateAuthorizationEvidence({
|
|
476
|
-
kind: "automatic-authorization",
|
|
477
|
-
scope: toScopeReference(scope),
|
|
478
|
-
plugin,
|
|
479
|
-
expectedRevision: automaticRequest.expectedRevision,
|
|
480
|
-
marketplaceSourceIdentity: deriveMarketplaceSourceIdentity(automaticRequest.marketplaceSource.declared, dependencies.sha256),
|
|
481
|
-
pluginSourceIdentity: derivePluginSourceIdentity(automaticRequest.entry.source.value, dependencies.sha256),
|
|
482
|
-
});
|
|
483
|
-
}
|
|
484
|
-
catch (error) {
|
|
485
|
-
if (signal.aborted)
|
|
486
|
-
return rejected(operation, "ABORTED");
|
|
487
|
-
return rejected(operation, "UNTRUSTED");
|
|
488
|
-
}
|
|
489
|
-
}
|
|
179
|
+
return current(operation, initial);
|
|
180
|
+
if (operation === "enable" && previous?.activation === "enabled")
|
|
181
|
+
return current(operation, initial);
|
|
182
|
+
if (operation === "disable" && previous?.activation === "disabled")
|
|
183
|
+
return current(operation, initial);
|
|
490
184
|
let prepared;
|
|
491
|
-
let candidateExpectation;
|
|
492
185
|
try {
|
|
493
186
|
if (operation === "install" || operation === "update") {
|
|
494
187
|
const installRequest = request;
|
|
188
|
+
const preparedInstallRequest = request;
|
|
189
|
+
const trustRecords = await trustFor(installRequest, signal);
|
|
495
190
|
const candidateRequest = {
|
|
496
191
|
operation,
|
|
497
192
|
scope,
|
|
@@ -501,15 +196,9 @@ function createPluginLifecycleImplementation(dependencies) {
|
|
|
501
196
|
trustRecords,
|
|
502
197
|
configurationPathContext: installRequest.configurationPathContext,
|
|
503
198
|
...(previous === undefined ? {} : { existing: previous }),
|
|
504
|
-
...(automaticAuthorization === undefined ? {} : { automaticAuthorization }),
|
|
505
199
|
...(installRequest.expectedRevision === undefined ? {} : { expectedRevision: installRequest.expectedRevision }),
|
|
506
|
-
...(
|
|
507
|
-
|
|
508
|
-
expectedBinding: installRequest.expectedBinding,
|
|
509
|
-
...(installRequest.expectedConfigurationRevision === undefined
|
|
510
|
-
? {}
|
|
511
|
-
: { expectedConfigurationRevision: installRequest.expectedConfigurationRevision }),
|
|
512
|
-
} : {}),
|
|
200
|
+
...(installRequest.automaticAuthorization === undefined ? {} : { automaticAuthorization: installRequest.automaticAuthorization }),
|
|
201
|
+
...("candidateLease" in request ? { candidateLease: preparedInstallRequest.candidateLease, expectedBinding: preparedInstallRequest.expectedBinding, ...(preparedInstallRequest.expectedConfigurationRevision === undefined ? {} : { expectedConfigurationRevision: preparedInstallRequest.expectedConfigurationRevision }) } : {}),
|
|
513
202
|
};
|
|
514
203
|
const result = await preparePluginCandidate(preparation, candidateRequest, signal);
|
|
515
204
|
if (result.kind === "rejected")
|
|
@@ -517,41 +206,21 @@ function createPluginLifecycleImplementation(dependencies) {
|
|
|
517
206
|
prepared = result.candidate;
|
|
518
207
|
if (prepared.plugin !== plugin) {
|
|
519
208
|
await discardCandidate(dependencies, prepared);
|
|
209
|
+
prepared = undefined;
|
|
520
210
|
return rejected(operation, "MALFORMED");
|
|
521
211
|
}
|
|
522
|
-
if (operation === "install" && previous !== undefined) {
|
|
523
|
-
if (previous.selectedRevision === prepared.record.selectedRevision && previous.activation === "enabled") {
|
|
524
|
-
await discardCandidate(dependencies, prepared);
|
|
525
|
-
return noOp(operation, initial);
|
|
526
|
-
}
|
|
527
|
-
await discardCandidate(dependencies, prepared);
|
|
528
|
-
return rejected(operation, "ALREADY_INSTALLED");
|
|
529
|
-
}
|
|
530
212
|
if (operation === "update" && previous !== undefined && previous.selectedRevision === prepared.record.selectedRevision && previous.activation === "enabled") {
|
|
531
213
|
await discardCandidate(dependencies, prepared);
|
|
532
|
-
|
|
214
|
+
prepared = undefined;
|
|
215
|
+
return current(operation, initial);
|
|
533
216
|
}
|
|
534
|
-
candidateExpectation = prepared.projection;
|
|
535
217
|
}
|
|
536
218
|
else if (operation === "enable") {
|
|
537
|
-
if (previous === undefined)
|
|
538
|
-
return rejected(operation, "NOT_INSTALLED");
|
|
539
219
|
const enableRequest = request;
|
|
540
|
-
const result = await prepareEnableCandidate(preparation, {
|
|
541
|
-
operation: "enable",
|
|
542
|
-
scope,
|
|
543
|
-
installed: previous,
|
|
544
|
-
trustRecords,
|
|
545
|
-
configurationPathContext: enableRequest.configurationPathContext,
|
|
546
|
-
...(enableRequest.expectedConfigurationRevision === undefined ? {} : { expectedConfigurationRevision: enableRequest.expectedConfigurationRevision }),
|
|
547
|
-
}, signal);
|
|
220
|
+
const result = await prepareEnableCandidate(preparation, { operation: "enable", scope, installed: previous, trustRecords: await trustFor(enableRequest, signal), configurationPathContext: enableRequest.configurationPathContext, ...(enableRequest.expectedConfigurationRevision === undefined ? {} : { expectedConfigurationRevision: enableRequest.expectedConfigurationRevision }) }, signal);
|
|
548
221
|
if (result.kind === "rejected")
|
|
549
222
|
return rejected(operation, mapPreparationCode(result.code));
|
|
550
223
|
prepared = result.candidate;
|
|
551
|
-
candidateExpectation = prepared.projection;
|
|
552
|
-
}
|
|
553
|
-
else {
|
|
554
|
-
candidateExpectation = await prepareInactiveProjection(dependencies, { scope, plugin }, signal);
|
|
555
224
|
}
|
|
556
225
|
}
|
|
557
226
|
catch (error) {
|
|
@@ -560,139 +229,186 @@ function createPluginLifecycleImplementation(dependencies) {
|
|
|
560
229
|
throw error;
|
|
561
230
|
return rejected(operation, signal.aborted ? "ABORTED" : "PROJECTION_FAILED");
|
|
562
231
|
}
|
|
563
|
-
const
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
232
|
+
const expectedConfigurationRevision = "expectedConfigurationRevision" in request ? request.expectedConfigurationRevision : undefined;
|
|
233
|
+
const candidate = operation === "uninstall"
|
|
234
|
+
? InstalledPluginRecordSchema.parse({ ...previous, activation: "disabled" })
|
|
235
|
+
: operation === "disable"
|
|
236
|
+
? InstalledPluginRecordSchema.parse({ ...previous, activation: "disabled" })
|
|
237
|
+
: appendPrevious(prepared?.record ?? previous, previous, operation);
|
|
238
|
+
if (operation === "uninstall" && retainedData(request) === "delete-confirmed" && dependencies.pendingDeletes !== undefined && previous !== undefined) {
|
|
239
|
+
const selected = previous.revisions.find((revision) => revision.revision === previous.selectedRevision);
|
|
240
|
+
if (selected === undefined)
|
|
241
|
+
return rejected(operation, "MALFORMED");
|
|
242
|
+
try {
|
|
243
|
+
await dependencies.pendingDeletes.create({ scope: toScopeReference(scope), plugin, dataRef: selected.dataRef, requestedAt: Date.now() });
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
return rejected(operation, "MALFORMED");
|
|
247
|
+
}
|
|
567
248
|
}
|
|
568
|
-
let operationId;
|
|
569
249
|
try {
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
250
|
+
if (prepared?.promotion !== undefined) {
|
|
251
|
+
const promotion = await dependencies.content.promote(prepared.promotion, signal);
|
|
252
|
+
if (!sameJson(promotion.identity, prepared.promotion.identity) || !sameJson(promotion.manifest, prepared.promotion.manifest)) {
|
|
253
|
+
await discardCandidate(dependencies, prepared);
|
|
254
|
+
prepared = undefined;
|
|
255
|
+
return rejected(operation, "PROMOTION_FAILED");
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const mutation = runScopedMutation(dependencies.state, scope, (snapshot) => {
|
|
259
|
+
const latest = targetRecord(snapshot, plugin);
|
|
260
|
+
if (!sameJson(latest, previous))
|
|
261
|
+
return { kind: "reject", value: { kind: "stale", operation, expected: initial.generation, actual: snapshot.generation } };
|
|
262
|
+
const replacement = operation === "uninstall" ? null : candidate;
|
|
263
|
+
return { kind: "commit", mutation: replaceTarget(snapshot, plugin, replacement, dependencies.sha256), value: undefined, recheckAuthority: async () => {
|
|
264
|
+
const configurationState = await exactConfigurationState(dependencies, prepared, expectedConfigurationRevision);
|
|
265
|
+
if (configurationState === "stale")
|
|
266
|
+
throw new Error("CONFIGURATION_STALE");
|
|
267
|
+
if (configurationState === "unavailable")
|
|
268
|
+
throw new Error("CONFIGURATION_UNAVAILABLE");
|
|
269
|
+
} };
|
|
270
|
+
}, signal);
|
|
271
|
+
const committed = await mutation;
|
|
272
|
+
const mapped = mapMutation(operation, committed, signal);
|
|
273
|
+
if (!("kind" in mapped) || mapped.kind !== "committed") {
|
|
274
|
+
await discardCandidate(dependencies, prepared);
|
|
275
|
+
return mapped;
|
|
276
|
+
}
|
|
574
277
|
await discardCandidate(dependencies, prepared);
|
|
575
|
-
|
|
278
|
+
if (operation === "update" && request.activation === "deferred")
|
|
279
|
+
return { kind: "live-next-start", operation, snapshot: mapped.snapshot, note: "no-reload-context" };
|
|
280
|
+
if (operation === "uninstall" && retainedData(request) === "delete-confirmed" && dependencies.pendingDeletes !== undefined && dependencies.dataRemoval !== undefined && previous !== undefined) {
|
|
281
|
+
const selected = previous.revisions.find((revision) => revision.revision === previous.selectedRevision);
|
|
282
|
+
if (selected !== undefined) {
|
|
283
|
+
const marker = { scope: toScopeReference(scope), plugin, dataRef: selected.dataRef, requestedAt: Date.now() };
|
|
284
|
+
try {
|
|
285
|
+
await dependencies.dataRemoval.remove({ ...marker, confirmation: "delete-confirmed", capability: {} }, signal);
|
|
286
|
+
await dependencies.pendingDeletes.remove(marker);
|
|
287
|
+
}
|
|
288
|
+
catch { /* convergence retries the durable marker */ }
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return activate(dependencies, operation, scope, mapped.snapshot, plugin, signal);
|
|
576
292
|
}
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
293
|
+
catch (error) {
|
|
294
|
+
await discardCandidate(dependencies, prepared).catch(() => undefined);
|
|
295
|
+
if (signal.aborted)
|
|
296
|
+
return rejected(operation, "ABORTED");
|
|
297
|
+
if (error instanceof Error && error.message === "CONFIGURATION_STALE")
|
|
298
|
+
return rejected(operation, "CONFIGURATION_STALE");
|
|
299
|
+
if (error instanceof Error && error.message === "CONFIGURATION_UNAVAILABLE")
|
|
300
|
+
return rejected(operation, "UNCONFIGURED");
|
|
301
|
+
if (error instanceof Error && error.message.includes("promotion"))
|
|
302
|
+
return rejected(operation, "PROMOTION_FAILED");
|
|
586
303
|
return rejected(operation, "MALFORMED");
|
|
587
304
|
}
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
const
|
|
591
|
-
|
|
592
|
-
operation,
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
});
|
|
305
|
+
}
|
|
306
|
+
async function repair(request, signal) {
|
|
307
|
+
const operation = "repair";
|
|
308
|
+
if (signal.aborted)
|
|
309
|
+
return rejected(operation, "ABORTED");
|
|
310
|
+
const scope = asScopeContext(request.scope, dependencies.sha256);
|
|
311
|
+
const plugin = PluginKeySchema.parse(request.plugin);
|
|
312
|
+
const initial = await load(scope, signal).catch(() => undefined);
|
|
313
|
+
if (initial === undefined)
|
|
314
|
+
return rejected(operation, "MALFORMED");
|
|
315
|
+
const installed = targetRecord(initial, plugin);
|
|
316
|
+
const selected = installed?.revisions.find((revision) => revision.revision === installed.selectedRevision);
|
|
317
|
+
if (installed === undefined)
|
|
318
|
+
return rejected(operation, "NOT_INSTALLED");
|
|
319
|
+
if (selected === undefined)
|
|
320
|
+
return rejected(operation, "MALFORMED");
|
|
321
|
+
let prepared;
|
|
606
322
|
try {
|
|
607
|
-
const
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
323
|
+
const preparedResult = await preparePluginCandidate(preparation, {
|
|
324
|
+
operation: "update",
|
|
325
|
+
scope,
|
|
326
|
+
entry: request.entry,
|
|
327
|
+
marketplaceSource: request.marketplaceSource,
|
|
328
|
+
sourceContext: request.sourceContext,
|
|
329
|
+
trustRecords: await trustFor(request, signal),
|
|
330
|
+
configurationPathContext: request.configurationPathContext,
|
|
331
|
+
existing: installed,
|
|
332
|
+
expectedRevision: selected.revision,
|
|
333
|
+
...(request.expectedConfigurationRevision === undefined ? {} : { expectedConfigurationRevision: request.expectedConfigurationRevision }),
|
|
334
|
+
}, signal);
|
|
335
|
+
if (preparedResult.kind === "rejected")
|
|
336
|
+
return rejected(operation, mapPreparationCode(preparedResult.code));
|
|
337
|
+
prepared = preparedResult.candidate;
|
|
338
|
+
if (prepared.plugin !== plugin || prepared.revision.revision !== selected.revision || !sourceEvidenceMatches(prepared.revision, selected)) {
|
|
339
|
+
await discardCandidate(dependencies, prepared).catch(() => undefined);
|
|
340
|
+
prepared = undefined;
|
|
341
|
+
return rejected(operation, "AVAILABLE_REVISION_CHANGED");
|
|
342
|
+
}
|
|
343
|
+
if (prepared.promotion !== undefined) {
|
|
344
|
+
const promotion = await dependencies.content.promote(prepared.promotion, signal);
|
|
345
|
+
if (!sameJson(promotion.identity, prepared.promotion.identity) || !sameJson(promotion.manifest, prepared.promotion.manifest)) {
|
|
346
|
+
await discardCandidate(dependencies, prepared).catch(() => undefined);
|
|
347
|
+
prepared = undefined;
|
|
348
|
+
return rejected(operation, "PROMOTION_FAILED");
|
|
349
|
+
}
|
|
611
350
|
}
|
|
612
|
-
}
|
|
613
|
-
catch {
|
|
614
351
|
await discardCandidate(dependencies, prepared);
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
return rejected(operation, first.code);
|
|
626
|
-
if (first.kind === "recovery")
|
|
627
|
-
return recovery(operation, reference, first.committed);
|
|
628
|
-
const committed = first.snapshot;
|
|
629
|
-
if (operation === "update" && request.activation === "deferred") {
|
|
630
|
-
// Staged update: the candidate is committed and the durable transition
|
|
631
|
-
// stays pending on purpose. The next start/reload activates the new
|
|
632
|
-
// revision and settles the journal through the normal recovery path —
|
|
633
|
-
// in ANY session, so journal ownership must not stay bound to this
|
|
634
|
-
// process's lifetime.
|
|
635
|
-
await releaseStagedOwnership(scope, reference);
|
|
636
|
-
return { kind: "staged", operation, transition: reference, snapshot: committed };
|
|
352
|
+
prepared = undefined;
|
|
353
|
+
const latest = await load(scope, signal);
|
|
354
|
+
const latestRecord = latest === undefined ? undefined : targetRecord(latest, plugin);
|
|
355
|
+
if (latest === undefined || latestRecord === undefined || latestRecord.selectedRevision !== selected.revision) {
|
|
356
|
+
return { kind: "stale", operation, expected: initial.generation, ...(latest === undefined ? {} : { actual: latest.generation }) };
|
|
357
|
+
}
|
|
358
|
+
// Repair never commits when the authority pointer already names the
|
|
359
|
+
// repaired revision. The promotion above is idempotent and is the only
|
|
360
|
+
// persistent change in the common missing-files case.
|
|
361
|
+
return activate(dependencies, operation, scope, latest, plugin, signal);
|
|
637
362
|
}
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
363
|
+
catch (error) {
|
|
364
|
+
await discardCandidate(dependencies, prepared).catch(() => undefined);
|
|
365
|
+
if (signal.aborted)
|
|
366
|
+
return rejected(operation, "ABORTED");
|
|
367
|
+
if (error instanceof Error && error.message === "AVAILABLE_REVISION_CHANGED")
|
|
368
|
+
return rejected(operation, "AVAILABLE_REVISION_CHANGED");
|
|
369
|
+
if (error instanceof Error && error.message.includes("promotion"))
|
|
370
|
+
return rejected(operation, "PROMOTION_FAILED");
|
|
371
|
+
return rejected(operation, "MALFORMED");
|
|
642
372
|
}
|
|
643
|
-
|
|
644
|
-
|
|
373
|
+
}
|
|
374
|
+
async function rollback(request, signal) {
|
|
375
|
+
const operation = "rollback";
|
|
376
|
+
if (signal.aborted)
|
|
377
|
+
return rejected(operation, "ABORTED");
|
|
378
|
+
const scope = asScopeContext(request.scope, dependencies.sha256);
|
|
379
|
+
const plugin = PluginKeySchema.parse(request.plugin);
|
|
380
|
+
const initial = await load(scope, signal).catch(() => undefined);
|
|
381
|
+
if (initial === undefined)
|
|
382
|
+
return rejected(operation, "MALFORMED");
|
|
383
|
+
const previous = targetRecord(initial, plugin);
|
|
384
|
+
const expectedTarget = request.expectedTarget;
|
|
385
|
+
if (expectedTarget !== undefined && (previous === undefined || expectedTarget.plugin !== plugin || expectedTarget.selectedRevision !== previous.selectedRevision || expectedTarget.activation !== previous.activation || deriveLifecycleTargetDigest(toScopeReference(scope), previous, dependencies.sha256) !== expectedTarget.targetDigest)) {
|
|
386
|
+
return { kind: "stale", operation, expected: expectedTarget.generation, actual: initial.generation };
|
|
645
387
|
}
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
}
|
|
388
|
+
if (previous === undefined)
|
|
389
|
+
return rejected(operation, "NOT_INSTALLED");
|
|
390
|
+
if (previous.previousRevision === undefined || !previous.revisions.some((revision) => revision.revision === previous.previousRevision))
|
|
391
|
+
return rejected(operation, "MALFORMED");
|
|
392
|
+
const mutation = await runScopedMutation(dependencies.state, scope, (snapshot) => {
|
|
393
|
+
const latest = targetRecord(snapshot, plugin);
|
|
394
|
+
if (latest === undefined || !sameJson(latest, previous)) {
|
|
395
|
+
return { kind: "reject", value: { kind: "stale", operation, expected: initial.generation, actual: snapshot.generation } };
|
|
655
396
|
}
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
operation,
|
|
667
|
-
scope,
|
|
668
|
-
plugin,
|
|
669
|
-
previous,
|
|
670
|
-
candidate,
|
|
671
|
-
final: finalRecord,
|
|
672
|
-
reference,
|
|
673
|
-
committed,
|
|
674
|
-
previousProjection: previousExpectation,
|
|
675
|
-
candidateProjection: candidateExpectation,
|
|
676
|
-
activation,
|
|
397
|
+
const fallback = latest.previousRevision;
|
|
398
|
+
if (fallback === undefined || !latest.revisions.some((revision) => revision.revision === fallback)) {
|
|
399
|
+
return { kind: "reject", value: rejected(operation, "MALFORMED") };
|
|
400
|
+
}
|
|
401
|
+
const replacement = InstalledPluginRecordSchema.parse({
|
|
402
|
+
...latest,
|
|
403
|
+
selectedRevision: fallback,
|
|
404
|
+
previousRevision: latest.selectedRevision,
|
|
405
|
+
});
|
|
406
|
+
return { kind: "commit", mutation: replaceTarget(snapshot, plugin, replacement, dependencies.sha256), value: undefined };
|
|
677
407
|
}, signal);
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
kind: "rolled-back",
|
|
683
|
-
operation,
|
|
684
|
-
failure: reconciled.failure,
|
|
685
|
-
snapshot: reconciled.snapshot,
|
|
686
|
-
observation: reconciled.observation,
|
|
687
|
-
};
|
|
688
|
-
}
|
|
689
|
-
return {
|
|
690
|
-
kind: "changed",
|
|
691
|
-
operation,
|
|
692
|
-
snapshot: reconciled.snapshot,
|
|
693
|
-
observation: reconciled.observation,
|
|
694
|
-
...(operation === "uninstall" ? { cleanup: { kind: "deferred", retainedData: retainedData(request), transition: reference } } : {}),
|
|
695
|
-
};
|
|
408
|
+
const mapped = mapMutation(operation, mutation, signal);
|
|
409
|
+
if (!("kind" in mapped) || mapped.kind !== "committed")
|
|
410
|
+
return mapped;
|
|
411
|
+
return activate(dependencies, operation, scope, mapped.snapshot, plugin, signal);
|
|
696
412
|
}
|
|
697
413
|
const application = Object.freeze({
|
|
698
414
|
install: (request, signal) => execute("install", request, signal),
|
|
@@ -700,6 +416,8 @@ function createPluginLifecycleImplementation(dependencies) {
|
|
|
700
416
|
disable: (request, signal) => execute("disable", request, signal),
|
|
701
417
|
update: (request, signal) => execute("update", request, signal),
|
|
702
418
|
uninstall: (request, signal) => execute("uninstall", request, signal),
|
|
419
|
+
repair,
|
|
420
|
+
rollback,
|
|
703
421
|
});
|
|
704
422
|
async function executePrepared(operation, request, signal) {
|
|
705
423
|
const preparedRequest = {
|
|
@@ -720,7 +438,6 @@ function createPluginLifecycleImplementation(dependencies) {
|
|
|
720
438
|
return await execute(operation, preparedRequest, signal);
|
|
721
439
|
}
|
|
722
440
|
finally {
|
|
723
|
-
// No-op after transfer; mandatory cleanup when lifecycle returned before claim.
|
|
724
441
|
await request.lease.release();
|
|
725
442
|
}
|
|
726
443
|
}
|
|
@@ -730,14 +447,7 @@ function createPluginLifecycleImplementation(dependencies) {
|
|
|
730
447
|
});
|
|
731
448
|
return Object.freeze({ application, prepared, preparedInstall: prepared });
|
|
732
449
|
}
|
|
733
|
-
export function createPluginLifecycleComposition(dependencies) {
|
|
734
|
-
|
|
735
|
-
}
|
|
736
|
-
/** Source-compatible public lifecycle factory. */
|
|
737
|
-
export function createPluginLifecycleService(dependencies) {
|
|
738
|
-
return createPluginLifecycleImplementation(dependencies).application;
|
|
739
|
-
}
|
|
740
|
-
export const PluginLifecycleResultSchema = z.object({
|
|
741
|
-
kind: z.enum(["changed", "unchanged", "rejected", "stale", "rolled-back", "recovery-required", "staged"]),
|
|
742
|
-
}).passthrough().readonly();
|
|
450
|
+
export function createPluginLifecycleComposition(dependencies) { return createPluginLifecycleImplementation(dependencies); }
|
|
451
|
+
export function createPluginLifecycleService(dependencies) { return createPluginLifecycleImplementation(dependencies).application; }
|
|
452
|
+
export const PluginLifecycleResultSchema = z.object({ kind: z.enum(["applied", "live-next-start", "degraded", "current", "rejected", "stale"]) }).passthrough().readonly();
|
|
743
453
|
//# sourceMappingURL=plugin-lifecycle-service.js.map
|