@nklisch/pi-enhanced 0.1.11 → 0.2.0

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