@nklisch/pi-enhanced 0.1.0 → 0.1.2
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/node_modules/@nklisch/pi-conveniences/package.json +5 -2
- package/node_modules/@nklisch/pi-fff-compat/package.json +5 -2
- package/node_modules/@nklisch/pi-plugins/README.md +16 -13
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-trust-continuity.d.ts +34 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-trust-continuity.js +310 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-trust-continuity.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-coordinator.d.ts +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-coordinator.js +30 -17
- 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 +0 -3
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-eligibility.js +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-eligibility.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-contract.d.ts +40 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-contract.js +28 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-contract.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-service.d.ts +24 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-service.js +67 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-service.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/installed-trust-grant-service.d.ts +110 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/installed-trust-grant-service.js +186 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/installed-trust-grant-service.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/lifecycle-transition-reconciler.d.ts +3 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/lifecycle-transition-reconciler.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-plugin-probe.d.ts +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-plugin-probe.js +38 -11
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-plugin-probe.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-refresh-service.d.ts +2 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-refresh-service.js +22 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-refresh-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-automatic-run-presenter.d.ts +11 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/native-automatic-run-presenter.js +58 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/native-automatic-run-presenter.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-contract.d.ts +2 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-dispatcher.js +2 -0
- 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-help.d.ts +5 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-mutation-dispatch.js +47 -2
- 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 +2505 -2439
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-parser.d.ts +2 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-parser.js +3 -1
- 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 +4 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-registry.d.ts +46 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-registry.js +7 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/native-control-registry.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-diagnostic-registry.d.ts +12 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-diagnostic-registry.js +2 -1
- 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.js +1 -1
- 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 +5 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/native-installed-inspection.js +7 -2
- 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 +464 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-contract.js +3 -2
- 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-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 +77 -11
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-result.js +3 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-result.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-update-contract.d.ts +11 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-update-contract.js +9 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/native-update-contract.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/plugin-lifecycle-service.d.ts +22 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/plugin-lifecycle-service.js +21 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/plugin-lifecycle-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/automatic-update-lifecycle.d.ts +4 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/mcp-runtime.d.ts +0 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/mcp-runtime.js +2 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/mcp-runtime.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/native-control-applications.d.ts +4 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/state-contract.d.ts +28 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-contract.d.ts +15 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-contract.js +1 -1
- 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-service.js +4 -0
- package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-service.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/automatic-update-lifecycle-adapter.js +88 -80
- package/node_modules/@nklisch/pi-plugins/dist/composition/automatic-update-lifecycle-adapter.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/complete-plugin-reload.js +32 -4
- package/node_modules/@nklisch/pi-plugins/dist/composition/complete-plugin-reload.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-update-management-service.d.ts +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-update-management-service.js +9 -1
- 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.js +49 -10
- 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 -0
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-skill-hook-runtime.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/create-skill-hook-runtime.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/composition/packaged-host-startup.js +4 -3
- 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 +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/composition/runtime-desired-state.js +21 -7
- package/node_modules/@nklisch/pi-plugins/dist/composition/runtime-desired-state.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/domain/hook-output-contract.d.ts +7 -1
- package/node_modules/@nklisch/pi-plugins/dist/domain/hook-output-contract.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/domain/hook-visibility.d.ts +16 -0
- package/node_modules/@nklisch/pi-plugins/dist/domain/hook-visibility.js +12 -0
- package/node_modules/@nklisch/pi-plugins/dist/domain/hook-visibility.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/domain/mcp-session-environment.d.ts +23 -0
- package/node_modules/@nklisch/pi-plugins/dist/domain/mcp-session-environment.js +30 -0
- package/node_modules/@nklisch/pi-plugins/dist/domain/mcp-session-environment.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/codec.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/codec.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/config-state.d.ts +15 -0
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/config-state.js +7 -0
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/config-state.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/domain/state/registry.d.ts +7 -0
- package/node_modules/@nklisch/pi-plugins/dist/domain/update-policy.js +2 -0
- package/node_modules/@nklisch/pi-plugins/dist/domain/update-policy.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/index.d.ts +2 -1
- package/node_modules/@nklisch/pi-plugins/dist/index.js +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/index.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/project/node-project-root-resolver.js +8 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/project/node-project-root-resolver.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/local-recovery-filesystem.d.ts +0 -2
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/local-recovery-filesystem.js +3 -52
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/local-recovery-filesystem.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/process-revision-leases.js +6 -8
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/process-revision-leases.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-revision-retention.js +6 -6
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-revision-retention.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-transition-journal.js +4 -49
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-transition-journal.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-lifecycle-state-store.js +9 -18
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-lifecycle-state-store.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-open.d.ts +23 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-open.js +80 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-open.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-scope-lock.d.ts +1 -11
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-scope-lock.js +59 -593
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-scope-lock.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/extension.js +2 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/extension.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/hooks/pi-hook-context-renderer.d.ts +18 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/hooks/pi-hook-context-renderer.js +47 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/hooks/pi-hook-context-renderer.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/hooks/pi-hook-decision-adapter.d.ts +3 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/hooks/pi-hook-decision-adapter.js +28 -11
- package/node_modules/@nklisch/pi-plugins/dist/pi/hooks/pi-hook-decision-adapter.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-install-component.js +2 -2
- 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-manager-actions.d.ts +7 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-actions.js +26 -2
- 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-commands.d.ts +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-commands.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-commands.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-component.d.ts +4 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-component.js +25 -3
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-component.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-controller.js +9 -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 +4 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-model.js +5 -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.d.ts +3 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-render.js +20 -12
- 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 +43 -14
- 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-operation-view.js +13 -8
- 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 +2 -2
- 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 +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/pi/pi-trust-review.d.ts +8 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/pi-trust-review.js +93 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/pi-trust-review.js.map +1 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-command.js +3 -3
- package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-command.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-manager-lifecycle.d.ts +2 -0
- package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-manager-lifecycle.js +8 -2
- package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-manager-lifecycle.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/runtime/hooks/hook-decision-aggregator.js +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/runtime/hooks/hook-decision-aggregator.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/launch-value-provider.js +24 -0
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/launch-value-provider.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/pi-mcp-adapter-package.js +1 -7
- 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 -2
- package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/pi-mcp-adapter-runtime.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/runtime/published-package-receipt.d.ts +10 -13
- package/node_modules/@nklisch/pi-plugins/dist/runtime/published-package-receipt.js +7 -92
- package/node_modules/@nklisch/pi-plugins/dist/runtime/published-package-receipt.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/runtime/subagents/pi-subagents-lifecycle.js +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/runtime/subagents/pi-subagents-package.js +1 -7
- package/node_modules/@nklisch/pi-plugins/dist/runtime/subagents/pi-subagents-package.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/dist/runtime/subagents/subagent-hook-coordinator.js +2 -2
- package/node_modules/@nklisch/pi-plugins/dist/runtime/subagents/subagent-hook-coordinator.js.map +1 -1
- package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/package.json +5 -2
- package/node_modules/@nklisch/pi-plugins/package.json +3 -3
- package/package.json +7 -7
- package/node_modules/@nklisch/pi-conveniences/extensions/agents-context.test.ts +0 -140
- package/node_modules/@nklisch/pi-conveniences/extensions/context-window-footer.test.ts +0 -30
- package/node_modules/@nklisch/pi-conveniences/extensions/exit.test.ts +0 -44
- package/node_modules/@nklisch/pi-conveniences/extensions/model-list.test.ts +0 -34
- package/node_modules/@nklisch/pi-fff-compat/extensions/fff-compat-search.test.ts +0 -76
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/update-activation-context.d.ts +0 -4
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/update-activation-context.js +0 -2
- package/node_modules/@nklisch/pi-plugins/dist/application/ports/update-activation-context.js.map +0 -1
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/identity-bound-sqlite.d.ts +0 -22
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/identity-bound-sqlite.js +0 -256
- package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/identity-bound-sqlite.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nklisch/pi-conveniences",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Small drop-in quality-of-life conveniences for Pi — /exit, .agents/AGENTS.md context loading, context-window footer, and subagent model listing.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "nklisch"
|
|
@@ -44,5 +44,8 @@
|
|
|
44
44
|
"@earendil-works/pi-ai": "0.82.0",
|
|
45
45
|
"@earendil-works/pi-coding-agent": "0.82.0",
|
|
46
46
|
"@earendil-works/pi-tui": "0.82.0"
|
|
47
|
-
}
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"extensions"
|
|
50
|
+
]
|
|
48
51
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nklisch/pi-fff-compat",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Fast FFF-backed file search through Pi-native find/grep semantics — glob-only file lookup and exact regex/literal grep with no fuzzy fallback.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "nklisch"
|
|
@@ -47,5 +47,8 @@
|
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|
|
49
49
|
"test": "bun test extensions/*.test.ts"
|
|
50
|
-
}
|
|
50
|
+
},
|
|
51
|
+
"files": [
|
|
52
|
+
"extensions"
|
|
53
|
+
]
|
|
51
54
|
}
|
|
@@ -8,7 +8,7 @@ Native plugin management for [Pi](https://github.com/badlogic/pi-mono), with com
|
|
|
8
8
|
- transactional install, enable, disable, update, recovery, and uninstall;
|
|
9
9
|
- Agent Skills and command-hook activation;
|
|
10
10
|
- receipt-qualified MCP and subagent lifecycle integration;
|
|
11
|
-
- deterministic `/
|
|
11
|
+
- deterministic `/plugins` commands and a Pi-native interactive manager;
|
|
12
12
|
- offline-safe startup, update policy, diagnostics, and multiprocess coordination.
|
|
13
13
|
|
|
14
14
|
## Requirements
|
|
@@ -22,24 +22,27 @@ Native plugin management for [Pi](https://github.com/badlogic/pi-mono), with com
|
|
|
22
22
|
pi install npm:@nklisch/pi-plugins
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
Then start Pi and run `/
|
|
25
|
+
Then start Pi and run `/plugins`. The manager uses the same progressive list footprint as Pi settings: choose **My Plugins**, **Discover**, **Sources**, **Updates**, or **Health**, then drill into an item and its available actions. Escape returns one level. On a clean installation, open Sources and choose **Add Source**, or use:
|
|
26
26
|
|
|
27
27
|
```text
|
|
28
|
-
/
|
|
29
|
-
/
|
|
28
|
+
/plugins marketplace add nklisch/skills
|
|
29
|
+
/plugins add <plugin@marketplace> --scope user
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
`/
|
|
32
|
+
`/plugins add` adds the complete plugin to the selected user or project plugin list, collects any required configuration and executable trust, installs and enables it, and reloads Pi when activation changes. Use `/plugins help` for the concise command surface:
|
|
33
|
+
|
|
34
|
+
If an installed plugin's executable content changes outside a managed update (a rebuilt local source, a refreshed payload), its exact-trust grant no longer covers it and its hooks and MCP servers stop. At the next session start Pi asks whether to trust the changed content again; accepting records the grant and one `/reload` reactivates the plugin. The same remedy is available any time as the manager's **Trust plugin** action or `/plugins trust`.
|
|
33
35
|
|
|
34
36
|
```text
|
|
35
|
-
/
|
|
36
|
-
/
|
|
37
|
-
/
|
|
38
|
-
/
|
|
39
|
-
/
|
|
40
|
-
/plugin
|
|
41
|
-
/
|
|
42
|
-
/
|
|
37
|
+
/plugins add <plugin> --scope user|project
|
|
38
|
+
/plugins remove <plugin> --scope user|project --keep-data|--delete-data
|
|
39
|
+
/plugins update <plugin> --scope user|project
|
|
40
|
+
/plugins enable <plugin> --scope user|project
|
|
41
|
+
/plugins disable <plugin> --scope user|project
|
|
42
|
+
/plugins trust <plugin> --scope user|project --yes
|
|
43
|
+
/plugins list
|
|
44
|
+
/plugins doctor [plugin]
|
|
45
|
+
/plugins marketplace add|list|refresh|remove ...
|
|
43
46
|
```
|
|
44
47
|
|
|
45
48
|
The older `install`, `uninstall`, and `diagnose` forms remain accepted as compatibility aliases. Workflow-phase and operation-token routes remain available to automation but are intentionally omitted from normal help and completion.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Sha256 } from "../domain/source.js";
|
|
2
|
+
import { type ScopeContext } from "../domain/state/scope.js";
|
|
3
|
+
import type { GenerationMutationCoordinator } from "./generation-mutation-coordinator.js";
|
|
4
|
+
import type { InstalledPluginLoader } from "./ports/installed-plugin-loader.js";
|
|
5
|
+
import type { LifecycleStateStore } from "./ports/lifecycle-state-store.js";
|
|
6
|
+
import type { ProjectTrustPort } from "./ports/project-trust.js";
|
|
7
|
+
/**
|
|
8
|
+
* Automatic trust continuity. Enabling automatic updates is the operator's
|
|
9
|
+
* consent to acquire, validate, and activate compatible new revisions from the
|
|
10
|
+
* same trusted source, including revisions that change hook or MCP execution
|
|
11
|
+
* definitions. Exact-subject trust evaluation never infers that consent at
|
|
12
|
+
* read time, so this service records the exact grant for the selected
|
|
13
|
+
* revision itself whenever the automatic policy, an unchanged source lineage,
|
|
14
|
+
* and a granted baseline all hold. Explicit revocation of the exact subject
|
|
15
|
+
* still wins; a lineage with no granted baseline still requires interactive
|
|
16
|
+
* consent.
|
|
17
|
+
*/
|
|
18
|
+
export interface AutomaticTrustContinuity {
|
|
19
|
+
ensure(scope: ScopeContext, signal: AbortSignal): Promise<AutomaticTrustContinuityResult>;
|
|
20
|
+
}
|
|
21
|
+
export type AutomaticTrustContinuityResult = Readonly<{
|
|
22
|
+
kind: "ensured";
|
|
23
|
+
granted: readonly string[];
|
|
24
|
+
}> | Readonly<{
|
|
25
|
+
kind: "unavailable";
|
|
26
|
+
}>;
|
|
27
|
+
export type AutomaticTrustContinuityDependencies = Readonly<{
|
|
28
|
+
state: LifecycleStateStore;
|
|
29
|
+
mutations: GenerationMutationCoordinator;
|
|
30
|
+
installed: InstalledPluginLoader;
|
|
31
|
+
projectTrust?: ProjectTrustPort;
|
|
32
|
+
sha256: Sha256;
|
|
33
|
+
}>;
|
|
34
|
+
export declare function createAutomaticTrustContinuity(dependencies: AutomaticTrustContinuityDependencies): AutomaticTrustContinuity;
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { compareUtf8 } from "../domain/canonical-json.js";
|
|
2
|
+
import { MarketplaceNameSchema } from "../domain/identity.js";
|
|
3
|
+
import { createTrustCandidate, grantTrust } from "../domain/trust-policy.js";
|
|
4
|
+
import { createTrustStateDocument, verifyTrustStateRecord, } from "../domain/state/trust-state.js";
|
|
5
|
+
import { toScopeReference } from "../domain/state/scope.js";
|
|
6
|
+
import { deriveMarketplaceSourceIdentity } from "../domain/update-policy.js";
|
|
7
|
+
import { parseStateMutation } from "./state-contract.js";
|
|
8
|
+
import { resolveEffectiveUpdatePolicy } from "./update-policy-resolution.js";
|
|
9
|
+
function installedPlugins(snapshot) {
|
|
10
|
+
return "installed" in snapshot ? snapshot.installed.plugins : snapshot.project.plugins;
|
|
11
|
+
}
|
|
12
|
+
function trustRecordsOf(snapshot) {
|
|
13
|
+
return "trust" in snapshot ? snapshot.trust.records : [];
|
|
14
|
+
}
|
|
15
|
+
function marketplaceOf(plugin) {
|
|
16
|
+
return plugin.slice(plugin.lastIndexOf("@") + 1);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Load-free presence check for the selected revision's exact subject. The
|
|
20
|
+
* subject is derived from evidence whose revision-embedded fields are fully
|
|
21
|
+
* determined by the materialization binding, so a record matching plugin,
|
|
22
|
+
* scope, immutable revision, and executable surface IS the exact subject.
|
|
23
|
+
*/
|
|
24
|
+
function hasExactSubjectRecord(records, pluginRecord, selected, scope, sha256) {
|
|
25
|
+
for (const raw of records) {
|
|
26
|
+
let record;
|
|
27
|
+
try {
|
|
28
|
+
record = verifyTrustStateRecord(raw, sha256);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (record.evidence.plugin !== pluginRecord.plugin)
|
|
34
|
+
continue;
|
|
35
|
+
if (record.evidence.scope.kind !== scope.kind ||
|
|
36
|
+
(scope.kind === "project" && (record.evidence.scope.kind !== "project" || record.evidence.scope.projectKey !== scope.projectKey)))
|
|
37
|
+
continue;
|
|
38
|
+
if (record.evidence.immutableRevision === selected.revision &&
|
|
39
|
+
record.evidence.executableSurfaceDigest === selected.evidence.trust.executableSurfaceDigest) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Lineage consent: an exact grant for another installed revision of the same
|
|
47
|
+
* plugin whose stable source identities match the selected revision. Trust
|
|
48
|
+
* evidence embeds the immutable revision in its canonical sources, so lineage
|
|
49
|
+
* is anchored on installed revision records (revision digest plus executable
|
|
50
|
+
* surface) rather than on the grant's canonical source text.
|
|
51
|
+
*/
|
|
52
|
+
function hasGrantedBaseline(records, pluginRecord, selected, scope, sha256) {
|
|
53
|
+
const selectedIdentity = selected.evidence.source;
|
|
54
|
+
if (selectedIdentity.marketplaceSourceIdentity === undefined || selectedIdentity.pluginSourceIdentity === undefined)
|
|
55
|
+
return false;
|
|
56
|
+
for (const raw of records) {
|
|
57
|
+
let record;
|
|
58
|
+
try {
|
|
59
|
+
record = verifyTrustStateRecord(raw, sha256);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
if (record.status !== "granted")
|
|
65
|
+
continue;
|
|
66
|
+
if (record.evidence.plugin !== pluginRecord.plugin)
|
|
67
|
+
continue;
|
|
68
|
+
if (record.evidence.scope.kind !== scope.kind ||
|
|
69
|
+
(scope.kind === "project" && (record.evidence.scope.kind !== "project" || record.evidence.scope.projectKey !== scope.projectKey)))
|
|
70
|
+
continue;
|
|
71
|
+
const anchor = pluginRecord.revisions.find((revision) => revision.revision === record.evidence.immutableRevision &&
|
|
72
|
+
revision.evidence.trust.executableSurfaceDigest === record.evidence.executableSurfaceDigest);
|
|
73
|
+
if (anchor === undefined)
|
|
74
|
+
continue;
|
|
75
|
+
if (anchor.evidence.source.marketplaceSourceIdentity !== selectedIdentity.marketplaceSourceIdentity ||
|
|
76
|
+
anchor.evidence.source.pluginSourceIdentity !== selectedIdentity.pluginSourceIdentity)
|
|
77
|
+
continue;
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
function exactRecord(records, subject, sha256) {
|
|
83
|
+
for (const raw of records) {
|
|
84
|
+
try {
|
|
85
|
+
const record = verifyTrustStateRecord(raw, sha256);
|
|
86
|
+
if (record.subject === subject)
|
|
87
|
+
return record;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
class NoContinuityGrants extends Error {
|
|
96
|
+
constructor() {
|
|
97
|
+
super("locked snapshot already adjudicated every planned subject");
|
|
98
|
+
this.name = "NoContinuityGrants";
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
class ProjectAuthorityStale extends Error {
|
|
102
|
+
constructor() {
|
|
103
|
+
super("project authority changed between planning and commit");
|
|
104
|
+
this.name = "ProjectAuthorityStale";
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export function createAutomaticTrustContinuity(dependencies) {
|
|
108
|
+
if (dependencies === null || typeof dependencies !== "object" || typeof dependencies.sha256 !== "function") {
|
|
109
|
+
throw new TypeError("automatic trust continuity dependencies are required");
|
|
110
|
+
}
|
|
111
|
+
async function projectTrusted(scope, signal) {
|
|
112
|
+
if (scope.kind === "user")
|
|
113
|
+
return true;
|
|
114
|
+
if (dependencies.projectTrust === undefined)
|
|
115
|
+
return false;
|
|
116
|
+
try {
|
|
117
|
+
return (await dependencies.projectTrust.assess(scope.projectKey, signal)).kind === "trusted";
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (signal.aborted)
|
|
121
|
+
throw signal.reason ?? error;
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function planGrants(scope, snapshot, userSnapshot, signal) {
|
|
126
|
+
const policyRecords = "config" in snapshot ? snapshot.config.records : snapshot.project.marketplaceUpdates;
|
|
127
|
+
const scopedPolicy = "config" in snapshot ? snapshot.config.scope.application : snapshot.project.scope.application;
|
|
128
|
+
const globalPolicy = "config" in userSnapshot ? userSnapshot.config.global.application : undefined;
|
|
129
|
+
if (globalPolicy === undefined)
|
|
130
|
+
return undefined;
|
|
131
|
+
const records = trustRecordsOf(userSnapshot);
|
|
132
|
+
const trusted = await projectTrusted(scope, signal);
|
|
133
|
+
if (!trusted)
|
|
134
|
+
return [];
|
|
135
|
+
const planned = [];
|
|
136
|
+
for (const pluginRecord of installedPlugins(snapshot)) {
|
|
137
|
+
const plugin = pluginRecord.plugin;
|
|
138
|
+
const policyRecord = policyRecords.find((record) => record.marketplace === MarketplaceNameSchema.parse(marketplaceOf(plugin)));
|
|
139
|
+
if (policyRecord === undefined)
|
|
140
|
+
continue;
|
|
141
|
+
const selected = pluginRecord.revisions.find((revision) => revision.revision === pluginRecord.selectedRevision);
|
|
142
|
+
if (selected === undefined)
|
|
143
|
+
continue;
|
|
144
|
+
const effective = resolveEffectiveUpdatePolicy({
|
|
145
|
+
plugin,
|
|
146
|
+
record: policyRecord,
|
|
147
|
+
global: globalPolicy,
|
|
148
|
+
...(scopedPolicy === undefined ? {} : { scope: scopedPolicy }),
|
|
149
|
+
marketplaceSourceIdentity: selected.evidence.source.marketplaceSourceIdentity ?? "legacy-unavailable",
|
|
150
|
+
registeredMarketplaceSourceIdentity: deriveMarketplaceSourceIdentity(policyRecord.source, dependencies.sha256),
|
|
151
|
+
pluginSourceIdentity: selected.evidence.source.pluginSourceIdentity ?? "legacy-unavailable",
|
|
152
|
+
});
|
|
153
|
+
if (effective.application !== "automatic" || effective.sourceGuard !== "none")
|
|
154
|
+
continue;
|
|
155
|
+
// Already-adjudicated subjects (granted or revoked) and plugins with no
|
|
156
|
+
// granted lineage never need their retained content loaded. Continuity
|
|
157
|
+
// runs every background cycle, so keep the steady state disk-free.
|
|
158
|
+
if (hasExactSubjectRecord(records, pluginRecord, selected, scope, dependencies.sha256))
|
|
159
|
+
continue;
|
|
160
|
+
if (!hasGrantedBaseline(records, pluginRecord, selected, scope, dependencies.sha256))
|
|
161
|
+
continue;
|
|
162
|
+
let loaded;
|
|
163
|
+
try {
|
|
164
|
+
loaded = await dependencies.installed.load({ scope, revision: selected }, signal);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (signal.aborted)
|
|
168
|
+
throw signal.reason ?? error;
|
|
169
|
+
// Fail closed for this subject only; one unavailable plugin must not
|
|
170
|
+
// block continuity for every other plugin in the scope.
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
let candidate;
|
|
174
|
+
try {
|
|
175
|
+
candidate = createTrustCandidate({
|
|
176
|
+
scope: toScopeReference(scope),
|
|
177
|
+
marketplaceSource: loaded.marketplaceSource,
|
|
178
|
+
plugin: loaded.plugin,
|
|
179
|
+
compatibility: loaded.compatibility,
|
|
180
|
+
content: loaded.content,
|
|
181
|
+
materializationBinding: loaded.binding,
|
|
182
|
+
}, dependencies.sha256);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
// The load-free checks above established absence of any exact record
|
|
188
|
+
// and the presence of a baseline; the candidate only names the subject
|
|
189
|
+
// being granted.
|
|
190
|
+
planned.push({ plugin, candidate, record: pluginRecord, selected });
|
|
191
|
+
}
|
|
192
|
+
return planned;
|
|
193
|
+
}
|
|
194
|
+
async function ensure(scope, signal) {
|
|
195
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
196
|
+
signal.throwIfAborted();
|
|
197
|
+
const loaded = await dependencies.state.read(scope, signal).catch((error) => {
|
|
198
|
+
if (signal.aborted)
|
|
199
|
+
throw error;
|
|
200
|
+
return undefined;
|
|
201
|
+
});
|
|
202
|
+
if (loaded === undefined)
|
|
203
|
+
return { kind: "unavailable" };
|
|
204
|
+
if (!loaded.ok)
|
|
205
|
+
return { kind: "unavailable" };
|
|
206
|
+
// Trust authority is always user state, even for project-scope plugins.
|
|
207
|
+
const userLoaded = scope.kind === "user"
|
|
208
|
+
? loaded
|
|
209
|
+
: await dependencies.state.read({ kind: "user" }, signal).catch((error) => {
|
|
210
|
+
if (signal.aborted)
|
|
211
|
+
throw error;
|
|
212
|
+
return undefined;
|
|
213
|
+
});
|
|
214
|
+
if (userLoaded === undefined || !userLoaded.ok || !("trust" in userLoaded.snapshot))
|
|
215
|
+
return { kind: "unavailable" };
|
|
216
|
+
const planned = await planGrants(scope, loaded.snapshot, userLoaded.snapshot, signal);
|
|
217
|
+
if (planned === undefined)
|
|
218
|
+
return { kind: "unavailable" };
|
|
219
|
+
if (planned.length === 0)
|
|
220
|
+
return { kind: "ensured", granted: [] };
|
|
221
|
+
const outcome = await (async () => {
|
|
222
|
+
try {
|
|
223
|
+
return { result: await dependencies.mutations.runPreparedMutation({
|
|
224
|
+
scope: { kind: "user" },
|
|
225
|
+
plugins: planned.map((entry) => entry.plugin),
|
|
226
|
+
expectedGeneration: userLoaded.snapshot.generation,
|
|
227
|
+
}, async (context) => {
|
|
228
|
+
if (!("trust" in context.snapshot))
|
|
229
|
+
throw new Error("trust authority is not user state");
|
|
230
|
+
const current = context.snapshot.trust.records;
|
|
231
|
+
const additions = [];
|
|
232
|
+
for (const entry of planned) {
|
|
233
|
+
// Re-adjudicate inside the locked snapshot: a concurrent grant or
|
|
234
|
+
// revocation of the exact subject since planning wins.
|
|
235
|
+
if (exactRecord(current, entry.candidate.subject, dependencies.sha256) !== undefined)
|
|
236
|
+
continue;
|
|
237
|
+
if (!hasGrantedBaseline(current, entry.record, entry.selected, scope, dependencies.sha256))
|
|
238
|
+
continue;
|
|
239
|
+
additions.push(grantTrust(entry.candidate, dependencies.sha256));
|
|
240
|
+
}
|
|
241
|
+
// Re-adjudication can remove every planned subject (concurrent
|
|
242
|
+
// grant or baseline revocation). Never commit a no-op trust
|
|
243
|
+
// replacement: churning the user generation moves authority under
|
|
244
|
+
// foreground readers for no semantic change.
|
|
245
|
+
if (additions.length === 0)
|
|
246
|
+
throw new NoContinuityGrants();
|
|
247
|
+
const records = [...current, ...additions].sort((left, right) => compareUtf8(left.subject, right.subject));
|
|
248
|
+
const trust = createTrustStateDocument({
|
|
249
|
+
schemaVersion: 1,
|
|
250
|
+
generation: context.snapshot.generation,
|
|
251
|
+
records,
|
|
252
|
+
}, dependencies.sha256);
|
|
253
|
+
return {
|
|
254
|
+
mutation: parseStateMutation({
|
|
255
|
+
scope: { kind: "user" },
|
|
256
|
+
expectedGeneration: context.snapshot.generation,
|
|
257
|
+
replace: { trust },
|
|
258
|
+
}, dependencies.sha256),
|
|
259
|
+
value: additions.map((record) => record.subject),
|
|
260
|
+
...(scope.kind === "project" ? {
|
|
261
|
+
// The locked snapshot is user state; project authority (trust,
|
|
262
|
+
// policy, selected revision, baseline) can move underneath the
|
|
263
|
+
// plan from another session without advancing the user
|
|
264
|
+
// generation. Re-adjudicate the exact plan against fresh
|
|
265
|
+
// project authority immediately before commit.
|
|
266
|
+
beforeCommit: async () => {
|
|
267
|
+
if (!await projectTrusted(scope, signal))
|
|
268
|
+
throw new ProjectAuthorityStale();
|
|
269
|
+
const fresh = await dependencies.state.read(scope, signal);
|
|
270
|
+
if (!fresh.ok)
|
|
271
|
+
throw new ProjectAuthorityStale();
|
|
272
|
+
const replanned = await planGrants(scope, fresh.snapshot, context.snapshot, signal);
|
|
273
|
+
if (replanned === undefined)
|
|
274
|
+
throw new ProjectAuthorityStale();
|
|
275
|
+
const wanted = planned.map((entry) => entry.candidate.subject).sort(compareUtf8);
|
|
276
|
+
const current = replanned.map((entry) => entry.candidate.subject).sort(compareUtf8);
|
|
277
|
+
if (wanted.length !== current.length || wanted.some((subject, index) => subject !== current[index])) {
|
|
278
|
+
throw new ProjectAuthorityStale();
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
} : {}),
|
|
282
|
+
};
|
|
283
|
+
}, signal) };
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
if (error instanceof NoContinuityGrants)
|
|
287
|
+
return { noGrants: true };
|
|
288
|
+
// The project moved between planning and commit; the retry loop
|
|
289
|
+
// replans against fresh authority.
|
|
290
|
+
if (error instanceof ProjectAuthorityStale)
|
|
291
|
+
return { projectStale: true };
|
|
292
|
+
throw error;
|
|
293
|
+
}
|
|
294
|
+
})();
|
|
295
|
+
if ("noGrants" in outcome)
|
|
296
|
+
return { kind: "ensured", granted: [] };
|
|
297
|
+
if ("projectStale" in outcome)
|
|
298
|
+
continue;
|
|
299
|
+
const result = outcome.result;
|
|
300
|
+
if (result.kind === "committed")
|
|
301
|
+
return { kind: "ensured", granted: result.value };
|
|
302
|
+
if (result.kind === "stale-generation")
|
|
303
|
+
continue;
|
|
304
|
+
return { kind: "unavailable" };
|
|
305
|
+
}
|
|
306
|
+
return { kind: "unavailable" };
|
|
307
|
+
}
|
|
308
|
+
return Object.freeze({ ensure });
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=automatic-trust-continuity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automatic-trust-continuity.js","sourceRoot":"","sources":["../../src/application/automatic-trust-continuity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { type UpdateNoticeId } from "../domain/update-policy.js";
|
|
2
2
|
import type { Sha256 } from "../domain/source.js";
|
|
3
3
|
import { type AutomaticUpdateEligibility } from "./automatic-update-eligibility.js";
|
|
4
|
+
import type { AutomaticTrustContinuity } from "./automatic-trust-continuity.js";
|
|
4
5
|
import type { GenerationMutationCoordinator } from "./generation-mutation-coordinator.js";
|
|
5
6
|
import { type NativeAutomaticUpdateRunRequest, type NativeAutomaticUpdateRunResult } from "./native-update-contract.js";
|
|
6
7
|
import type { AutomaticUpdateLifecyclePort } from "./ports/automatic-update-lifecycle.js";
|
|
7
8
|
import type { LifecycleClock } from "./ports/lifecycle-clock.js";
|
|
8
9
|
import type { LifecycleStateInventoryPort } from "./ports/lifecycle-state-inventory.js";
|
|
9
10
|
import type { LifecycleStateStore } from "./ports/lifecycle-state-store.js";
|
|
10
|
-
import type { UpdateActivationContextPort } from "./ports/update-activation-context.js";
|
|
11
11
|
import type { UpdatePolicyAuthorityPort } from "./ports/update-policy-authority.js";
|
|
12
12
|
import { type CurrentScopeAuthorityDependencies } from "./current-scope-authority.js";
|
|
13
13
|
export interface AutomaticUpdateCoordinator {
|
|
@@ -23,7 +23,7 @@ export type AutomaticUpdateCoordinatorDependencies = Readonly<{
|
|
|
23
23
|
mutations: GenerationMutationCoordinator;
|
|
24
24
|
policy: UpdatePolicyAuthorityPort;
|
|
25
25
|
lifecycle: AutomaticUpdateLifecyclePort;
|
|
26
|
-
|
|
26
|
+
continuity: AutomaticTrustContinuity;
|
|
27
27
|
clock: LifecycleClock;
|
|
28
28
|
sha256: Sha256;
|
|
29
29
|
}> & CurrentScopeAuthorityDependencies;
|
|
@@ -60,10 +60,6 @@ export function createAutomaticUpdateCoordinator(dependencies) {
|
|
|
60
60
|
return AutomaticUpdateEligibilitySchema.parse({ noticeId, kind: "retryable", retryAt: notice.automatic.retryAt });
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
-
// Without a live reload-capable context, defer before candidate materialization
|
|
64
|
-
// or lifecycle inspection. Every authority is reread on the admitted call.
|
|
65
|
-
if (dependencies.activation.availability() !== "available")
|
|
66
|
-
return AutomaticUpdateEligibilitySchema.parse({ noticeId, kind: "awaiting-host-context" });
|
|
67
63
|
const authority = await dependencies.lifecycle.inspect(notice, signal);
|
|
68
64
|
if (authority.source === "changed")
|
|
69
65
|
return AutomaticUpdateEligibilitySchema.parse({ noticeId, kind: "approval-required" });
|
|
@@ -79,8 +75,6 @@ export function createAutomaticUpdateCoordinator(dependencies) {
|
|
|
79
75
|
return AutomaticUpdateEligibilitySchema.parse({ noticeId, kind: "secret-unavailable" });
|
|
80
76
|
if (authority.capability === "unavailable")
|
|
81
77
|
return AutomaticUpdateEligibilitySchema.parse({ noticeId, kind: "capability-unavailable" });
|
|
82
|
-
if (dependencies.activation.availability() !== "available")
|
|
83
|
-
return AutomaticUpdateEligibilitySchema.parse({ noticeId, kind: "awaiting-host-context" });
|
|
84
78
|
return AutomaticUpdateEligibilitySchema.parse({ noticeId, kind: "eligible" });
|
|
85
79
|
}
|
|
86
80
|
async function updateNotice(context, id, update, signal) {
|
|
@@ -127,7 +121,6 @@ export function createAutomaticUpdateCoordinator(dependencies) {
|
|
|
127
121
|
case "eligible": return notice;
|
|
128
122
|
case "manual": return UpdateNoticeSchema.parse({ ...notice, disposition: "manual-required", automatic: undefined });
|
|
129
123
|
case "approval-required": return UpdateNoticeSchema.parse({ ...notice, disposition: "approval-required", automatic: { state: "blocked", reason: "approval-required", attemptedAt } });
|
|
130
|
-
case "awaiting-host-context": return UpdateNoticeSchema.parse({ ...notice, disposition: "automatic-pending", automatic: { state: "pending", reason: "awaiting-host-context", attemptedAt } });
|
|
131
124
|
case "configuration-required": return UpdateNoticeSchema.parse({ ...notice, disposition: "configuration-blocked", automatic: { state: "blocked", reason: "configuration-required", attemptedAt } });
|
|
132
125
|
case "secret-unavailable": return UpdateNoticeSchema.parse({ ...notice, disposition: "configuration-blocked", automatic: { state: "blocked", reason: "secret-unavailable", attemptedAt } });
|
|
133
126
|
case "capability-unavailable": return UpdateNoticeSchema.parse({ ...notice, disposition: "capability-blocked", automatic: { state: "blocked", reason: "capability-unavailable", attemptedAt } });
|
|
@@ -153,6 +146,11 @@ export function createAutomaticUpdateCoordinator(dependencies) {
|
|
|
153
146
|
kind: result.kind === "changed" ? "applied" : "current",
|
|
154
147
|
notice: UpdateNoticeSchema.parse({ ...notice, disposition: "automatic-applied", automatic: { state: "applied", attemptedAt }, resolution: { kind: "installed", at: attemptedAt } }),
|
|
155
148
|
};
|
|
149
|
+
if (result.kind === "staged")
|
|
150
|
+
return {
|
|
151
|
+
kind: "staged",
|
|
152
|
+
notice: UpdateNoticeSchema.parse({ ...notice, disposition: "automatic-applied", automatic: { state: "applied", attemptedAt }, resolution: { kind: "installed", at: attemptedAt } }),
|
|
153
|
+
};
|
|
156
154
|
if (result.kind === "recovery-required")
|
|
157
155
|
return {
|
|
158
156
|
kind: "recovery-required",
|
|
@@ -162,7 +160,7 @@ export function createAutomaticUpdateCoordinator(dependencies) {
|
|
|
162
160
|
if (result.kind === "stale")
|
|
163
161
|
return { kind: "stale", reason: "stale", notice: eligibilityUpdate(notice, AutomaticUpdateEligibilitySchema.parse({ noticeId: notice.id, kind: "stale" })) };
|
|
164
162
|
if (result.kind === "cancelled-before-commit")
|
|
165
|
-
return { kind: "pending", reason: "cancelled-before-commit", notice: UpdateNoticeSchema.parse({ ...notice, disposition: "automatic-pending", automatic: { state: "pending",
|
|
163
|
+
return { kind: "pending", reason: "cancelled-before-commit", notice: UpdateNoticeSchema.parse({ ...notice, disposition: "automatic-pending", automatic: { state: "pending", attemptedAt } }) };
|
|
166
164
|
const retryAt = attemptedAt + AUTOMATIC_RETRY_BASE_MS;
|
|
167
165
|
if (result.kind === "rolled-back") {
|
|
168
166
|
return { kind: "retryable", reason: "rolled-back", notice: eligibilityUpdate(notice, AutomaticUpdateEligibilitySchema.parse({ noticeId: notice.id, kind: "retryable", retryAt })) };
|
|
@@ -180,6 +178,15 @@ export function createAutomaticUpdateCoordinator(dependencies) {
|
|
|
180
178
|
for (const context of await contexts(signal)) {
|
|
181
179
|
if (!await authorized(context, signal))
|
|
182
180
|
continue;
|
|
181
|
+
// Heal already-installed revisions whose exact trust grant predates an
|
|
182
|
+
// authorized automatic update. Continuity never blocks notice work.
|
|
183
|
+
try {
|
|
184
|
+
await dependencies.continuity.ensure(context, signal);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
if (signal.aborted)
|
|
188
|
+
throw signal.reason ?? error;
|
|
189
|
+
}
|
|
183
190
|
const loaded = await dependencies.state.read(context, signal);
|
|
184
191
|
if (!loaded.ok)
|
|
185
192
|
continue;
|
|
@@ -195,27 +202,33 @@ export function createAutomaticUpdateCoordinator(dependencies) {
|
|
|
195
202
|
const eligibility = await evaluate({ noticeId: candidate.notice.id }, signal, parsed.explicit === true);
|
|
196
203
|
if (eligibility.kind !== "eligible") {
|
|
197
204
|
await updateNotice(candidate.context, candidate.notice.id, (notice) => eligibilityUpdate(notice, eligibility), signal);
|
|
198
|
-
outcomes.push({ noticeId: candidate.notice.id,
|
|
205
|
+
outcomes.push({ noticeId: candidate.notice.id, plugin: candidate.notice.plugin, display: candidate.notice.display, kind: eligibility.kind === "retryable" ? "retryable" : eligibility.kind === "recovery-required" ? "recovery-required" : eligibility.kind === "stale" ? "stale" : "blocked", reason: eligibility.kind });
|
|
199
206
|
continue;
|
|
200
207
|
}
|
|
201
208
|
const latest = await locate(candidate.notice.id, signal);
|
|
202
209
|
if (latest === undefined || latest.notice.resolution !== undefined) {
|
|
203
|
-
outcomes.push({ noticeId: candidate.notice.id, kind: "stale", reason: "notice-stale" });
|
|
210
|
+
outcomes.push({ noticeId: candidate.notice.id, plugin: candidate.notice.plugin, display: candidate.notice.display, kind: "stale", reason: "notice-stale" });
|
|
204
211
|
continue;
|
|
205
212
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
await
|
|
209
|
-
|
|
210
|
-
|
|
213
|
+
const result = parsed.mode === "stage"
|
|
214
|
+
? await dependencies.lifecycle.stage(latest.notice, signal)
|
|
215
|
+
: await dependencies.lifecycle.apply(latest.notice, signal);
|
|
216
|
+
if (result.kind === "changed" || result.kind === "staged") {
|
|
217
|
+
// Chain the exact trust grant for the just-committed revision within
|
|
218
|
+
// this run so its hooks and MCP servers activate without re-consent.
|
|
219
|
+
// Like ledger settlement, this local write outranks caller
|
|
220
|
+
// cancellation once the update has committed.
|
|
221
|
+
try {
|
|
222
|
+
await dependencies.continuity.ensure(latest.context, new AbortController().signal);
|
|
223
|
+
}
|
|
224
|
+
catch { /* healed by the next scheduler cycle */ }
|
|
211
225
|
}
|
|
212
|
-
const result = await dependencies.lifecycle.apply(latest.notice, signal);
|
|
213
226
|
const projected = lifecycleOutcome(latest.notice, result);
|
|
214
227
|
// Once lifecycle may have committed, rollback/recovery truth outranks the
|
|
215
228
|
// caller's cancellation. Settle the durable ledger with fresh authority.
|
|
216
229
|
const settlementSignal = new AbortController().signal;
|
|
217
230
|
await updateNotice(latest.context, latest.notice.id, (notice) => lifecycleOutcome(notice, result).notice, settlementSignal);
|
|
218
|
-
outcomes.push({ noticeId: latest.notice.id, kind: projected.kind, ...(projected.reason === undefined ? {} : { reason: projected.reason }) });
|
|
231
|
+
outcomes.push({ noticeId: latest.notice.id, plugin: latest.notice.plugin, display: latest.notice.display, kind: projected.kind, ...(projected.reason === undefined ? {} : { reason: projected.reason }) });
|
|
219
232
|
}
|
|
220
233
|
return NativeAutomaticUpdateRunResultSchema.parse({ outcomes });
|
|
221
234
|
}
|