@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.
Files changed (206) hide show
  1. package/node_modules/@nklisch/pi-conveniences/package.json +5 -2
  2. package/node_modules/@nklisch/pi-fff-compat/package.json +5 -2
  3. package/node_modules/@nklisch/pi-plugins/README.md +16 -13
  4. package/node_modules/@nklisch/pi-plugins/dist/application/automatic-trust-continuity.d.ts +34 -0
  5. package/node_modules/@nklisch/pi-plugins/dist/application/automatic-trust-continuity.js +310 -0
  6. package/node_modules/@nklisch/pi-plugins/dist/application/automatic-trust-continuity.js.map +1 -0
  7. package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-coordinator.d.ts +2 -2
  8. package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-coordinator.js +30 -17
  9. package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-coordinator.js.map +1 -1
  10. package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-eligibility.d.ts +0 -3
  11. package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-eligibility.js +0 -1
  12. package/node_modules/@nklisch/pi-plugins/dist/application/automatic-update-eligibility.js.map +1 -1
  13. package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-contract.d.ts +40 -0
  14. package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-contract.js +28 -0
  15. package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-contract.js.map +1 -0
  16. package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-service.d.ts +24 -0
  17. package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-service.js +67 -0
  18. package/node_modules/@nklisch/pi-plugins/dist/application/hook-visibility-service.js.map +1 -0
  19. package/node_modules/@nklisch/pi-plugins/dist/application/installed-trust-grant-service.d.ts +110 -0
  20. package/node_modules/@nklisch/pi-plugins/dist/application/installed-trust-grant-service.js +186 -0
  21. package/node_modules/@nklisch/pi-plugins/dist/application/installed-trust-grant-service.js.map +1 -0
  22. package/node_modules/@nklisch/pi-plugins/dist/application/lifecycle-transition-reconciler.d.ts +3 -0
  23. package/node_modules/@nklisch/pi-plugins/dist/application/lifecycle-transition-reconciler.js.map +1 -1
  24. package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-plugin-probe.d.ts +0 -1
  25. package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-plugin-probe.js +38 -11
  26. package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-plugin-probe.js.map +1 -1
  27. package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-refresh-service.d.ts +2 -0
  28. package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-refresh-service.js +22 -2
  29. package/node_modules/@nklisch/pi-plugins/dist/application/marketplace-refresh-service.js.map +1 -1
  30. package/node_modules/@nklisch/pi-plugins/dist/application/native-automatic-run-presenter.d.ts +11 -0
  31. package/node_modules/@nklisch/pi-plugins/dist/application/native-automatic-run-presenter.js +58 -0
  32. package/node_modules/@nklisch/pi-plugins/dist/application/native-automatic-run-presenter.js.map +1 -0
  33. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-contract.d.ts +2 -0
  34. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-dispatcher.js +2 -0
  35. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-dispatcher.js.map +1 -1
  36. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-help.d.ts +5 -1
  37. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-mutation-dispatch.js +47 -2
  38. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-mutation-dispatch.js.map +1 -1
  39. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-operation.d.ts +2505 -2439
  40. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-parser.d.ts +2 -0
  41. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-parser.js +3 -1
  42. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-parser.js.map +1 -1
  43. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-progress.d.ts +4 -0
  44. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-registry.d.ts +46 -0
  45. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-registry.js +7 -2
  46. package/node_modules/@nklisch/pi-plugins/dist/application/native-control-registry.js.map +1 -1
  47. package/node_modules/@nklisch/pi-plugins/dist/application/native-diagnostic-registry.d.ts +12 -1
  48. package/node_modules/@nklisch/pi-plugins/dist/application/native-diagnostic-registry.js +2 -1
  49. package/node_modules/@nklisch/pi-plugins/dist/application/native-diagnostic-registry.js.map +1 -1
  50. package/node_modules/@nklisch/pi-plugins/dist/application/native-failure-presenter.js +1 -1
  51. package/node_modules/@nklisch/pi-plugins/dist/application/native-failure-presenter.js.map +1 -1
  52. package/node_modules/@nklisch/pi-plugins/dist/application/native-inspection-contract.d.ts +5 -0
  53. package/node_modules/@nklisch/pi-plugins/dist/application/native-installed-inspection.js +7 -2
  54. package/node_modules/@nklisch/pi-plugins/dist/application/native-installed-inspection.js.map +1 -1
  55. package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-contract.d.ts +464 -0
  56. package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-contract.js +3 -2
  57. package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-contract.js.map +1 -1
  58. package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-session.js +1 -1
  59. package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation-session.js.map +1 -1
  60. package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-operation.d.ts +77 -11
  61. package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-result.js +3 -0
  62. package/node_modules/@nklisch/pi-plugins/dist/application/native-lifecycle-result.js.map +1 -1
  63. package/node_modules/@nklisch/pi-plugins/dist/application/native-update-contract.d.ts +11 -1
  64. package/node_modules/@nklisch/pi-plugins/dist/application/native-update-contract.js +9 -1
  65. package/node_modules/@nklisch/pi-plugins/dist/application/native-update-contract.js.map +1 -1
  66. package/node_modules/@nklisch/pi-plugins/dist/application/plugin-lifecycle-service.d.ts +22 -1
  67. package/node_modules/@nklisch/pi-plugins/dist/application/plugin-lifecycle-service.js +21 -2
  68. package/node_modules/@nklisch/pi-plugins/dist/application/plugin-lifecycle-service.js.map +1 -1
  69. package/node_modules/@nklisch/pi-plugins/dist/application/ports/automatic-update-lifecycle.d.ts +4 -0
  70. package/node_modules/@nklisch/pi-plugins/dist/application/ports/mcp-runtime.d.ts +0 -2
  71. package/node_modules/@nklisch/pi-plugins/dist/application/ports/mcp-runtime.js +2 -1
  72. package/node_modules/@nklisch/pi-plugins/dist/application/ports/mcp-runtime.js.map +1 -1
  73. package/node_modules/@nklisch/pi-plugins/dist/application/ports/native-control-applications.d.ts +4 -0
  74. package/node_modules/@nklisch/pi-plugins/dist/application/state-contract.d.ts +28 -0
  75. package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-contract.d.ts +15 -0
  76. package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-contract.js +1 -1
  77. package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-contract.js.map +1 -1
  78. package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-service.js +4 -0
  79. package/node_modules/@nklisch/pi-plugins/dist/application/trusted-install-service.js.map +1 -1
  80. package/node_modules/@nklisch/pi-plugins/dist/composition/automatic-update-lifecycle-adapter.js +88 -80
  81. package/node_modules/@nklisch/pi-plugins/dist/composition/automatic-update-lifecycle-adapter.js.map +1 -1
  82. package/node_modules/@nklisch/pi-plugins/dist/composition/complete-plugin-reload.js +32 -4
  83. package/node_modules/@nklisch/pi-plugins/dist/composition/complete-plugin-reload.js.map +1 -1
  84. package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-update-management-service.d.ts +2 -2
  85. package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-update-management-service.js +9 -1
  86. package/node_modules/@nklisch/pi-plugins/dist/composition/create-native-update-management-service.js.map +1 -1
  87. package/node_modules/@nklisch/pi-plugins/dist/composition/create-packaged-plugin-host.js +49 -10
  88. package/node_modules/@nklisch/pi-plugins/dist/composition/create-packaged-plugin-host.js.map +1 -1
  89. package/node_modules/@nklisch/pi-plugins/dist/composition/create-skill-hook-runtime.d.ts +2 -0
  90. package/node_modules/@nklisch/pi-plugins/dist/composition/create-skill-hook-runtime.js +1 -1
  91. package/node_modules/@nklisch/pi-plugins/dist/composition/create-skill-hook-runtime.js.map +1 -1
  92. package/node_modules/@nklisch/pi-plugins/dist/composition/packaged-host-startup.js +4 -3
  93. package/node_modules/@nklisch/pi-plugins/dist/composition/packaged-host-startup.js.map +1 -1
  94. package/node_modules/@nklisch/pi-plugins/dist/composition/packaged-plugin-host-contract.d.ts +2 -2
  95. package/node_modules/@nklisch/pi-plugins/dist/composition/runtime-desired-state.js +21 -7
  96. package/node_modules/@nklisch/pi-plugins/dist/composition/runtime-desired-state.js.map +1 -1
  97. package/node_modules/@nklisch/pi-plugins/dist/domain/hook-output-contract.d.ts +7 -1
  98. package/node_modules/@nklisch/pi-plugins/dist/domain/hook-output-contract.js.map +1 -1
  99. package/node_modules/@nklisch/pi-plugins/dist/domain/hook-visibility.d.ts +16 -0
  100. package/node_modules/@nklisch/pi-plugins/dist/domain/hook-visibility.js +12 -0
  101. package/node_modules/@nklisch/pi-plugins/dist/domain/hook-visibility.js.map +1 -0
  102. package/node_modules/@nklisch/pi-plugins/dist/domain/mcp-session-environment.d.ts +23 -0
  103. package/node_modules/@nklisch/pi-plugins/dist/domain/mcp-session-environment.js +30 -0
  104. package/node_modules/@nklisch/pi-plugins/dist/domain/mcp-session-environment.js.map +1 -0
  105. package/node_modules/@nklisch/pi-plugins/dist/domain/state/codec.js +1 -1
  106. package/node_modules/@nklisch/pi-plugins/dist/domain/state/codec.js.map +1 -1
  107. package/node_modules/@nklisch/pi-plugins/dist/domain/state/config-state.d.ts +15 -0
  108. package/node_modules/@nklisch/pi-plugins/dist/domain/state/config-state.js +7 -0
  109. package/node_modules/@nklisch/pi-plugins/dist/domain/state/config-state.js.map +1 -1
  110. package/node_modules/@nklisch/pi-plugins/dist/domain/state/registry.d.ts +7 -0
  111. package/node_modules/@nklisch/pi-plugins/dist/domain/update-policy.js +2 -0
  112. package/node_modules/@nklisch/pi-plugins/dist/domain/update-policy.js.map +1 -1
  113. package/node_modules/@nklisch/pi-plugins/dist/index.d.ts +2 -1
  114. package/node_modules/@nklisch/pi-plugins/dist/index.js +1 -0
  115. package/node_modules/@nklisch/pi-plugins/dist/index.js.map +1 -1
  116. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/project/node-project-root-resolver.js +8 -1
  117. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/project/node-project-root-resolver.js.map +1 -1
  118. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/local-recovery-filesystem.d.ts +0 -2
  119. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/local-recovery-filesystem.js +3 -52
  120. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/local-recovery-filesystem.js.map +1 -1
  121. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/process-revision-leases.js +6 -8
  122. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/process-revision-leases.js.map +1 -1
  123. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-revision-retention.js +6 -6
  124. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-revision-retention.js.map +1 -1
  125. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-transition-journal.js +4 -49
  126. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/recovery/sqlite-transition-journal.js.map +1 -1
  127. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-lifecycle-state-store.js +9 -18
  128. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-lifecycle-state-store.js.map +1 -1
  129. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-open.d.ts +23 -0
  130. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-open.js +80 -0
  131. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-open.js.map +1 -0
  132. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-scope-lock.d.ts +1 -11
  133. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-scope-lock.js +59 -593
  134. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/sqlite-scope-lock.js.map +1 -1
  135. package/node_modules/@nklisch/pi-plugins/dist/pi/extension.js +2 -1
  136. package/node_modules/@nklisch/pi-plugins/dist/pi/extension.js.map +1 -1
  137. package/node_modules/@nklisch/pi-plugins/dist/pi/hooks/pi-hook-context-renderer.d.ts +18 -0
  138. package/node_modules/@nklisch/pi-plugins/dist/pi/hooks/pi-hook-context-renderer.js +47 -0
  139. package/node_modules/@nklisch/pi-plugins/dist/pi/hooks/pi-hook-context-renderer.js.map +1 -0
  140. package/node_modules/@nklisch/pi-plugins/dist/pi/hooks/pi-hook-decision-adapter.d.ts +3 -1
  141. package/node_modules/@nklisch/pi-plugins/dist/pi/hooks/pi-hook-decision-adapter.js +28 -11
  142. package/node_modules/@nklisch/pi-plugins/dist/pi/hooks/pi-hook-decision-adapter.js.map +1 -1
  143. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-install-component.js +2 -2
  144. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-install-component.js.map +1 -1
  145. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-actions.d.ts +7 -1
  146. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-actions.js +26 -2
  147. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-actions.js.map +1 -1
  148. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-commands.d.ts +1 -1
  149. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-commands.js +1 -1
  150. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-commands.js.map +1 -1
  151. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-component.d.ts +4 -0
  152. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-component.js +25 -3
  153. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-component.js.map +1 -1
  154. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-controller.js +9 -1
  155. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-controller.js.map +1 -1
  156. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-model.d.ts +4 -0
  157. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-model.js +5 -0
  158. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-model.js.map +1 -1
  159. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-render.d.ts +3 -0
  160. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-render.js +20 -12
  161. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-render.js.map +1 -1
  162. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-session.js +43 -14
  163. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-manager-session.js.map +1 -1
  164. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-operation-view.js +13 -8
  165. package/node_modules/@nklisch/pi-plugins/dist/pi/manager/plugin-operation-view.js.map +1 -1
  166. package/node_modules/@nklisch/pi-plugins/dist/pi/native-control-human.js +2 -2
  167. package/node_modules/@nklisch/pi-plugins/dist/pi/native-control-human.js.map +1 -1
  168. package/node_modules/@nklisch/pi-plugins/dist/pi/pi-reload-broker.d.ts +2 -2
  169. package/node_modules/@nklisch/pi-plugins/dist/pi/pi-trust-review.d.ts +8 -0
  170. package/node_modules/@nklisch/pi-plugins/dist/pi/pi-trust-review.js +93 -0
  171. package/node_modules/@nklisch/pi-plugins/dist/pi/pi-trust-review.js.map +1 -0
  172. package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-command.js +3 -3
  173. package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-command.js.map +1 -1
  174. package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-manager-lifecycle.d.ts +2 -0
  175. package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-manager-lifecycle.js +8 -2
  176. package/node_modules/@nklisch/pi-plugins/dist/pi/plugin-manager-lifecycle.js.map +1 -1
  177. package/node_modules/@nklisch/pi-plugins/dist/runtime/hooks/hook-decision-aggregator.js +1 -1
  178. package/node_modules/@nklisch/pi-plugins/dist/runtime/hooks/hook-decision-aggregator.js.map +1 -1
  179. package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/launch-value-provider.js +24 -0
  180. package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/launch-value-provider.js.map +1 -1
  181. package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/pi-mcp-adapter-package.js +1 -7
  182. package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/pi-mcp-adapter-package.js.map +1 -1
  183. package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/pi-mcp-adapter-runtime.js +1 -2
  184. package/node_modules/@nklisch/pi-plugins/dist/runtime/mcp/pi-mcp-adapter-runtime.js.map +1 -1
  185. package/node_modules/@nklisch/pi-plugins/dist/runtime/published-package-receipt.d.ts +10 -13
  186. package/node_modules/@nklisch/pi-plugins/dist/runtime/published-package-receipt.js +7 -92
  187. package/node_modules/@nklisch/pi-plugins/dist/runtime/published-package-receipt.js.map +1 -1
  188. package/node_modules/@nklisch/pi-plugins/dist/runtime/subagents/pi-subagents-lifecycle.js +2 -2
  189. package/node_modules/@nklisch/pi-plugins/dist/runtime/subagents/pi-subagents-package.js +1 -7
  190. package/node_modules/@nklisch/pi-plugins/dist/runtime/subagents/pi-subagents-package.js.map +1 -1
  191. package/node_modules/@nklisch/pi-plugins/dist/runtime/subagents/subagent-hook-coordinator.js +2 -2
  192. package/node_modules/@nklisch/pi-plugins/dist/runtime/subagents/subagent-hook-coordinator.js.map +1 -1
  193. package/node_modules/@nklisch/pi-plugins/node_modules/@nklisch/pi-subagents/package.json +5 -2
  194. package/node_modules/@nklisch/pi-plugins/package.json +3 -3
  195. package/package.json +7 -7
  196. package/node_modules/@nklisch/pi-conveniences/extensions/agents-context.test.ts +0 -140
  197. package/node_modules/@nklisch/pi-conveniences/extensions/context-window-footer.test.ts +0 -30
  198. package/node_modules/@nklisch/pi-conveniences/extensions/exit.test.ts +0 -44
  199. package/node_modules/@nklisch/pi-conveniences/extensions/model-list.test.ts +0 -34
  200. package/node_modules/@nklisch/pi-fff-compat/extensions/fff-compat-search.test.ts +0 -76
  201. package/node_modules/@nklisch/pi-plugins/dist/application/ports/update-activation-context.d.ts +0 -4
  202. package/node_modules/@nklisch/pi-plugins/dist/application/ports/update-activation-context.js +0 -2
  203. package/node_modules/@nklisch/pi-plugins/dist/application/ports/update-activation-context.js.map +0 -1
  204. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/identity-bound-sqlite.d.ts +0 -22
  205. package/node_modules/@nklisch/pi-plugins/dist/infrastructure/state/identity-bound-sqlite.js +0 -256
  206. 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.0",
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.0",
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 `/plugin` commands and a Pi-native interactive manager;
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 `/plugin`. 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:
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
- /plugin marketplace add nklisch/skills
29
- /plugin add <plugin@marketplace> --scope user
28
+ /plugins marketplace add nklisch/skills
29
+ /plugins add <plugin@marketplace> --scope user
30
30
  ```
31
31
 
32
- `/plugin 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 `/plugin help` for the concise command surface:
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
- /plugin add <plugin> --scope user|project
36
- /plugin remove <plugin> --scope user|project --keep-data|--delete-data
37
- /plugin update <plugin> --scope user|project
38
- /plugin enable <plugin> --scope user|project
39
- /plugin disable <plugin> --scope user|project
40
- /plugin list
41
- /plugin doctor [plugin]
42
- /plugin marketplace add|list|refresh|remove ...
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":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAkB,MAAM,uBAAuB,CAAC;AAE9E,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAuB,MAAM,2BAA2B,CAAC;AAClG,OAAO,EACL,wBAAwB,EACxB,sBAAsB,GAEvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAqB,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAE7E,OAAO,EAAE,kBAAkB,EAA2B,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAwC7E,SAAS,gBAAgB,CAAC,QAA4B;IACpD,OAAO,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;AACzF,CAAC;AAED,SAAS,cAAc,CAAC,QAA4B;IAClD,OAAO,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,aAAa,CAAC,MAAiB;IACtC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAC5B,OAAoC,EACpC,YAAmC,EACnC,QAAoD,EACpD,KAAmB,EACnB,MAAc;IAEd,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,MAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM;YAAE,SAAS;QAC7D,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YACzC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;YAAE,SAAS;QAChJ,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,KAAK,QAAQ,CAAC,QAAQ;YACvD,MAAM,CAAC,QAAQ,CAAC,uBAAuB,KAAK,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC;YAChG,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CACzB,OAAoC,EACpC,YAAmC,EACnC,QAAoD,EACpD,KAAmB,EACnB,MAAc;IAEd,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;IAClD,IAAI,gBAAgB,CAAC,yBAAyB,KAAK,SAAS,IAAI,gBAAgB,CAAC,oBAAoB,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAClI,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,MAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QAC1C,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM;YAAE,SAAS;QAC7D,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YACzC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;YAAE,SAAS;QAChJ,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CACtD,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,iBAAiB;YACvD,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,KAAK,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;QAC/F,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,yBAAyB,KAAK,gBAAgB,CAAC,yBAAyB;YAC/F,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,oBAAoB,KAAK,gBAAgB,CAAC,oBAAoB;YAAE,SAAS;QACpG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,OAAoC,EAAE,OAAe,EAAE,MAAc;IACxF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACnD,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO;gBAAE,OAAO,MAAM,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,kBAAmB,SAAQ,KAAK;IACpC;QACE,KAAK,CAAC,2DAA2D,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,qBAAsB,SAAQ,KAAK;IACvC;QACE,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,UAAU,8BAA8B,CAAC,YAAkD;IAC/F,IAAI,YAAY,KAAK,IAAI,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,OAAO,YAAY,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC3G,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,KAAmB,EAAE,MAAmB;QACpE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QACvC,IAAI,YAAY,CAAC,YAAY,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC1D,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;QAC/F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,KAAmB,EAAE,QAA4B,EAAE,YAAgC,EAAE,MAAmB;QAChI,MAAM,aAAa,GAAG,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC3G,MAAM,YAAY,GAAG,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;QACnH,MAAM,YAAY,GAAG,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACnG,IAAI,YAAY,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACjD,MAAM,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,KAAK,MAAM,YAAY,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;YACnC,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,KAAK,qBAAqB,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/H,IAAI,YAAY,KAAK,SAAS;gBAAE,SAAS;YACzC,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,YAAY,CAAC,gBAAgB,CAAC,CAAC;YAChH,IAAI,QAAQ,KAAK,SAAS;gBAAE,SAAS;YACrC,MAAM,SAAS,GAAG,4BAA4B,CAAC;gBAC7C,MAAM;gBACN,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,YAAY;gBACpB,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;gBAC9D,yBAAyB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,yBAAyB,IAAI,oBAAoB;gBACrG,mCAAmC,EAAE,+BAA+B,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;gBAC9G,oBAAoB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,oBAAoB,IAAI,oBAAoB;aAC5F,CAAC,CAAC;YACH,IAAI,SAAS,CAAC,WAAW,KAAK,WAAW,IAAI,SAAS,CAAC,WAAW,KAAK,MAAM;gBAAE,SAAS;YACxF,wEAAwE;YACxE,uEAAuE;YACvE,mEAAmE;YACnE,IAAI,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC;gBAAE,SAAS;YACjG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC/F,IAAI,MAA0D,CAAC;YAC/D,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;YACpF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,MAAM,CAAC,OAAO;oBAAE,MAAM,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;gBACjD,qEAAqE;gBACrE,wDAAwD;gBACxD,SAAS;YACX,CAAC;YACD,IAAI,SAAyB,CAAC;YAC9B,IAAI,CAAC;gBACH,SAAS,GAAG,oBAAoB,CAAC;oBAC/B,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC;oBAC9B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;oBAC3C,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,sBAAsB,EAAE,MAAM,CAAC,OAAO;iBACvC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,qEAAqE;YACrE,uEAAuE;YACvE,iBAAiB;YACjB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,KAAmB,EAAE,MAAmB;QAC5D,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACnF,IAAI,MAAM,CAAC,OAAO;oBAAE,MAAM,KAAK,CAAC;gBAChC,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC,CAAC;YACH,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YAC/C,wEAAwE;YACxE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM;gBACtC,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;oBAC/E,IAAI,MAAM,CAAC,OAAO;wBAAE,MAAM,KAAK,CAAC;oBAChC,OAAO,SAAS,CAAC;gBACnB,CAAC,CAAC,CAAC;YACP,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC;gBAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YACpH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACtF,IAAI,OAAO,KAAK,SAAS;gBAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAClE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;gBAChC,IAAI,CAAC;oBACH,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC,SAAS,CAAC,mBAAmB,CACnE;4BACE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;4BACvB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;4BAC7C,kBAAkB,EAAE,UAAU,CAAC,QAAQ,CAAC,UAAU;yBACnD,EACD,KAAK,EAAE,OAAO,EAAE,EAAE;4BAChB,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;gCAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;4BACzF,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;4BAC/C,MAAM,SAAS,GAAuB,EAAE,CAAC;4BACzC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gCAC5B,kEAAkE;gCAClE,uDAAuD;gCACvD,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK,SAAS;oCAAE,SAAS;gCAC/F,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC;oCAAE,SAAS;gCACrG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;4BACnE,CAAC;4BACD,+DAA+D;4BAC/D,4DAA4D;4BAC5D,kEAAkE;4BAClE,6CAA6C;4BAC7C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gCAAE,MAAM,IAAI,kBAAkB,EAAE,CAAC;4BAC3D,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;4BAC3G,MAAM,KAAK,GAAG,wBAAwB,CAAC;gCACrC,aAAa,EAAE,CAAC;gCAChB,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU;gCACvC,OAAO;6BACR,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;4BACxB,OAAO;gCACL,QAAQ,EAAE,kBAAkB,CAAC;oCAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;oCACvB,kBAAkB,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU;oCAC/C,OAAO,EAAE,EAAE,KAAK,EAAE;iCACnB,EAAE,YAAY,CAAC,MAAM,CAAC;gCACvB,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;gCAChD,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC;oCAC7B,+DAA+D;oCAC/D,+DAA+D;oCAC/D,uDAAuD;oCACvD,yDAAyD;oCACzD,+CAA+C;oCAC/C,YAAY,EAAE,KAAK,IAAI,EAAE;wCACvB,IAAI,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC;4CAAE,MAAM,IAAI,qBAAqB,EAAE,CAAC;wCAC5E,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;wCAC3D,IAAI,CAAC,KAAK,CAAC,EAAE;4CAAE,MAAM,IAAI,qBAAqB,EAAE,CAAC;wCACjD,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;wCACpF,IAAI,SAAS,KAAK,SAAS;4CAAE,MAAM,IAAI,qBAAqB,EAAE,CAAC;wCAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;wCACjF,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;wCACpF,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;4CACpG,MAAM,IAAI,qBAAqB,EAAE,CAAC;wCACpC,CAAC;oCACH,CAAC;iCACF,CAAC,CAAC,CAAC,EAAE,CAAC;6BACR,CAAC;wBACJ,CAAC,EACG,MAAM,CACP,EAAE,CAAC;gBACN,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,kBAAkB;wBAAE,OAAO,EAAE,QAAQ,EAAE,IAAa,EAAE,CAAC;oBAC5E,gEAAgE;oBAChE,mCAAmC;oBACnC,IAAI,KAAK,YAAY,qBAAqB;wBAAE,OAAO,EAAE,YAAY,EAAE,IAAa,EAAE,CAAC;oBACnF,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,IAAI,UAAU,IAAI,OAAO;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACnE,IAAI,cAAc,IAAI,OAAO;gBAAE,SAAS;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACnF,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB;gBAAE,SAAS;YACjD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACjC,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC"}
@@ -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
- activation: UpdateActivationContextPort;
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", reason: "awaiting-host-context", attemptedAt } }) };
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, kind: eligibility.kind === "awaiting-host-context" ? "pending" : eligibility.kind === "retryable" ? "retryable" : eligibility.kind === "recovery-required" ? "recovery-required" : eligibility.kind === "stale" ? "stale" : "blocked", reason: eligibility.kind });
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
- if (dependencies.activation.availability() !== "available") {
207
- const pending = AutomaticUpdateEligibilitySchema.parse({ noticeId: latest.notice.id, kind: "awaiting-host-context" });
208
- await updateNotice(latest.context, latest.notice.id, (notice) => eligibilityUpdate(notice, pending), signal);
209
- outcomes.push({ noticeId: latest.notice.id, kind: "pending", reason: "awaiting-host-context" });
210
- continue;
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
  }