create-principles-disciple 1.121.7 → 1.121.9

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 (461) hide show
  1. package/README.md +13 -1
  2. package/console/dist/server/config/pd-config-store.d.ts +1 -3
  3. package/console/dist/server/config/pd-config-store.js +4 -4
  4. package/console/dist/server/feedback/channels.d.ts +2 -8
  5. package/console/dist/server/feedback/channels.js +0 -11
  6. package/console/dist/server/index.js +34 -5
  7. package/console/dist/server/models/ActivationsConsoleModel.d.ts +28 -1
  8. package/console/dist/server/models/ActivationsConsoleModel.js +72 -30
  9. package/console/dist/server/models/GovernanceExperienceCollector.d.ts +28 -0
  10. package/console/dist/server/models/GovernanceExperienceCollector.js +305 -0
  11. package/console/dist/server/models/GovernanceProjectionCollector.d.ts +60 -2
  12. package/console/dist/server/models/GovernanceProjectionCollector.js +323 -285
  13. package/console/dist/server/models/PrincipleClassifier.d.ts +1 -1
  14. package/console/dist/server/models/PrincipleClassifier.js +7 -4
  15. package/console/dist/server/models/PrinciplesConsoleModel.d.ts +2 -1
  16. package/console/dist/server/models/ReceiptsConsoleModel.d.ts +5 -0
  17. package/console/dist/server/models/ReceiptsConsoleModel.js +140 -13
  18. package/console/dist/server/routes/activations.js +1 -1
  19. package/console/dist/server/routes/failed-tasks.js +28 -11
  20. package/console/dist/server/routes/governance.d.ts +26 -0
  21. package/console/dist/server/routes/governance.js +51 -0
  22. package/console/dist/server/routes/owner-identity.d.ts +31 -0
  23. package/console/dist/server/routes/owner-identity.js +76 -0
  24. package/console/dist/server/routes/update-history.d.ts +5 -0
  25. package/console/dist/server/routes/update-history.js +50 -4
  26. package/console/dist/server/routes/update.js +186 -32
  27. package/console/dist/shared/feedback-channel-ids.d.ts +13 -0
  28. package/console/dist/shared/feedback-channel-ids.js +12 -0
  29. package/console/dist/shared/feedback-contract.d.ts +46 -0
  30. package/console/dist/shared/feedback-contract.js +45 -0
  31. package/console/dist/ui/App.js +1 -1
  32. package/console/dist/ui/api.d.ts +22 -3
  33. package/console/dist/ui/api.js +63 -3
  34. package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.d.ts +6 -0
  35. package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.js +66 -0
  36. package/console/dist/ui/i18n/en.json +198 -2
  37. package/console/dist/ui/i18n/zh-CN.json +196 -0
  38. package/console/dist/ui/pages/activation/ActivationPage.js +14 -2
  39. package/console/dist/ui/pages/failed-tasks/FailedTasksPage.js +25 -5
  40. package/console/dist/ui/pages/focus/FocusPage.d.ts +28 -1
  41. package/console/dist/ui/pages/focus/FocusPage.js +128 -15
  42. package/console/dist/ui/pages/principles/PrincipleDetailPage.d.ts +30 -0
  43. package/console/dist/ui/pages/principles/PrincipleDetailPage.js +49 -6
  44. package/console/dist/ui/pages/settings/SettingsPage.js +67 -2
  45. package/console/dist/ui/pages/settings/UpdatePage.js +7 -7
  46. package/console/dist/ui/utils/enum-labels.js +0 -1
  47. package/console/dist/ui/utils/validators.d.ts +53 -21
  48. package/console/dist/ui/utils/validators.js +248 -21
  49. package/console/dist/web/assets/app.css +6 -0
  50. package/console/dist/web/assets/app.js +2721 -1664
  51. package/console/package.json +4 -2
  52. package/core/dist/host/host-adapter.d.ts +1 -1
  53. package/core/dist/host/host-adapter.d.ts.map +1 -1
  54. package/core/dist/host/host-adapter.js +1 -0
  55. package/core/dist/host/host-adapter.js.map +1 -1
  56. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +12 -2
  57. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  58. package/core/dist/runtime-v2/__tests__/attack-e2e-pipeline-smoke.test.js +1 -1
  59. package/core/dist/runtime-v2/__tests__/attack-e2e-pipeline-smoke.test.js.map +1 -1
  60. package/core/dist/runtime-v2/__tests__/governance-experience.test.d.ts +2 -0
  61. package/core/dist/runtime-v2/__tests__/governance-experience.test.d.ts.map +1 -0
  62. package/core/dist/runtime-v2/__tests__/governance-experience.test.js +300 -0
  63. package/core/dist/runtime-v2/__tests__/governance-experience.test.js.map +1 -0
  64. package/core/dist/runtime-v2/__tests__/owner-identity.test.d.ts +2 -0
  65. package/core/dist/runtime-v2/__tests__/owner-identity.test.d.ts.map +1 -0
  66. package/core/dist/runtime-v2/__tests__/owner-identity.test.js +147 -0
  67. package/core/dist/runtime-v2/__tests__/owner-identity.test.js.map +1 -0
  68. package/core/dist/runtime-v2/__tests__/product-telemetry-contract.test.d.ts +18 -0
  69. package/core/dist/runtime-v2/__tests__/product-telemetry-contract.test.d.ts.map +1 -0
  70. package/core/dist/runtime-v2/__tests__/product-telemetry-contract.test.js +303 -0
  71. package/core/dist/runtime-v2/__tests__/product-telemetry-contract.test.js.map +1 -0
  72. package/core/dist/runtime-v2/__tests__/recovery-actions-log.test.js +40 -0
  73. package/core/dist/runtime-v2/__tests__/recovery-actions-log.test.js.map +1 -1
  74. package/core/dist/runtime-v2/__tests__/status-contract.test.d.ts +2 -0
  75. package/core/dist/runtime-v2/__tests__/status-contract.test.d.ts.map +1 -0
  76. package/core/dist/runtime-v2/__tests__/status-contract.test.js +107 -0
  77. package/core/dist/runtime-v2/__tests__/status-contract.test.js.map +1 -0
  78. package/core/dist/runtime-v2/activation/__tests__/promotion-evidence-snapshot.test.d.ts +2 -0
  79. package/core/dist/runtime-v2/activation/__tests__/promotion-evidence-snapshot.test.d.ts.map +1 -0
  80. package/core/dist/runtime-v2/activation/__tests__/promotion-evidence-snapshot.test.js +104 -0
  81. package/core/dist/runtime-v2/activation/__tests__/promotion-evidence-snapshot.test.js.map +1 -0
  82. package/core/dist/runtime-v2/activation/__tests__/promotion-readiness-evaluator.test.js +19 -0
  83. package/core/dist/runtime-v2/activation/__tests__/promotion-readiness-evaluator.test.js.map +1 -1
  84. package/core/dist/runtime-v2/activation/__tests__/rulecode-owner-decision-service.test.js +20 -0
  85. package/core/dist/runtime-v2/activation/__tests__/rulecode-owner-decision-service.test.js.map +1 -1
  86. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-safety-store.test.js +40 -0
  87. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-safety-store.test.js.map +1 -1
  88. package/core/dist/runtime-v2/activation/index.d.ts +2 -0
  89. package/core/dist/runtime-v2/activation/index.d.ts.map +1 -1
  90. package/core/dist/runtime-v2/activation/index.js +1 -0
  91. package/core/dist/runtime-v2/activation/index.js.map +1 -1
  92. package/core/dist/runtime-v2/activation/promotion-evidence-snapshot.d.ts +30 -0
  93. package/core/dist/runtime-v2/activation/promotion-evidence-snapshot.d.ts.map +1 -0
  94. package/core/dist/runtime-v2/activation/promotion-evidence-snapshot.js +87 -0
  95. package/core/dist/runtime-v2/activation/promotion-evidence-snapshot.js.map +1 -0
  96. package/core/dist/runtime-v2/activation/promotion-readiness-evaluator.d.ts.map +1 -1
  97. package/core/dist/runtime-v2/activation/promotion-readiness-evaluator.js +3 -0
  98. package/core/dist/runtime-v2/activation/promotion-readiness-evaluator.js.map +1 -1
  99. package/core/dist/runtime-v2/activation/promotion-readiness-reader.d.ts +1 -1
  100. package/core/dist/runtime-v2/activation/promotion-readiness-reader.d.ts.map +1 -1
  101. package/core/dist/runtime-v2/activation/promotion-readiness-reader.js +2 -2
  102. package/core/dist/runtime-v2/activation/promotion-readiness-reader.js.map +1 -1
  103. package/core/dist/runtime-v2/activation/rulecode-owner-decision-service.d.ts.map +1 -1
  104. package/core/dist/runtime-v2/activation/rulecode-owner-decision-service.js +18 -9
  105. package/core/dist/runtime-v2/activation/rulecode-owner-decision-service.js.map +1 -1
  106. package/core/dist/runtime-v2/adapter/__tests__/chaos-json-repair.test.js +1 -1
  107. package/core/dist/runtime-v2/adapter/__tests__/chaos-json-repair.test.js.map +1 -1
  108. package/core/dist/runtime-v2/adapter/__tests__/json-extractor.test.js +91 -1
  109. package/core/dist/runtime-v2/adapter/__tests__/json-extractor.test.js.map +1 -1
  110. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-runtime-adapter.test.js +59 -12
  111. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-runtime-adapter.test.js.map +1 -1
  112. package/core/dist/runtime-v2/adapter/__tests__/runtime-config-contract.test.js +10 -9
  113. package/core/dist/runtime-v2/adapter/__tests__/runtime-config-contract.test.js.map +1 -1
  114. package/core/dist/runtime-v2/adapter/__tests__/structured-output-repair.test.js +42 -1
  115. package/core/dist/runtime-v2/adapter/__tests__/structured-output-repair.test.js.map +1 -1
  116. package/core/dist/runtime-v2/adapter/json-extractor.d.ts +25 -0
  117. package/core/dist/runtime-v2/adapter/json-extractor.d.ts.map +1 -1
  118. package/core/dist/runtime-v2/adapter/json-extractor.js +126 -0
  119. package/core/dist/runtime-v2/adapter/json-extractor.js.map +1 -1
  120. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.d.ts +9 -4
  121. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.d.ts.map +1 -1
  122. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.js +9 -4
  123. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.js.map +1 -1
  124. package/core/dist/runtime-v2/adapter/output-repair-contract.d.ts +5 -1
  125. package/core/dist/runtime-v2/adapter/output-repair-contract.d.ts.map +1 -1
  126. package/core/dist/runtime-v2/adapter/output-repair-contract.js +4 -1
  127. package/core/dist/runtime-v2/adapter/output-repair-contract.js.map +1 -1
  128. package/core/dist/runtime-v2/adapter/pi-ai-catalog.d.ts +7 -0
  129. package/core/dist/runtime-v2/adapter/pi-ai-catalog.d.ts.map +1 -0
  130. package/core/dist/runtime-v2/adapter/pi-ai-catalog.js +19 -0
  131. package/core/dist/runtime-v2/adapter/pi-ai-catalog.js.map +1 -0
  132. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts +13 -15
  133. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
  134. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +104 -37
  135. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
  136. package/core/dist/runtime-v2/adapter/structured-output-repair.d.ts +16 -1
  137. package/core/dist/runtime-v2/adapter/structured-output-repair.d.ts.map +1 -1
  138. package/core/dist/runtime-v2/adapter/structured-output-repair.js +38 -6
  139. package/core/dist/runtime-v2/adapter/structured-output-repair.js.map +1 -1
  140. package/core/dist/runtime-v2/adapter/tools/diagnostician-tool.d.ts +1 -1
  141. package/core/dist/runtime-v2/adapter/tools/diagnostician-tool.d.ts.map +1 -1
  142. package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js +8 -9
  143. package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js.map +1 -1
  144. package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +27 -3
  145. package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -1
  146. package/core/dist/runtime-v2/config/__tests__/pd-config-principles.test.d.ts +11 -0
  147. package/core/dist/runtime-v2/config/__tests__/pd-config-principles.test.d.ts.map +1 -0
  148. package/core/dist/runtime-v2/config/__tests__/pd-config-principles.test.js +93 -0
  149. package/core/dist/runtime-v2/config/__tests__/pd-config-principles.test.js.map +1 -0
  150. package/core/dist/runtime-v2/config/__tests__/pd-config-workspace.test.js +41 -0
  151. package/core/dist/runtime-v2/config/__tests__/pd-config-workspace.test.js.map +1 -1
  152. package/core/dist/runtime-v2/config/index.d.ts +2 -2
  153. package/core/dist/runtime-v2/config/index.d.ts.map +1 -1
  154. package/core/dist/runtime-v2/config/index.js +2 -0
  155. package/core/dist/runtime-v2/config/index.js.map +1 -1
  156. package/core/dist/runtime-v2/config/pd-config-agent-binding.d.ts.map +1 -1
  157. package/core/dist/runtime-v2/config/pd-config-agent-binding.js +4 -13
  158. package/core/dist/runtime-v2/config/pd-config-agent-binding.js.map +1 -1
  159. package/core/dist/runtime-v2/config/pd-config-effective.d.ts.map +1 -1
  160. package/core/dist/runtime-v2/config/pd-config-effective.js +14 -7
  161. package/core/dist/runtime-v2/config/pd-config-effective.js.map +1 -1
  162. package/core/dist/runtime-v2/config/pd-config-feature-flags.d.ts.map +1 -1
  163. package/core/dist/runtime-v2/config/pd-config-feature-flags.js +5 -12
  164. package/core/dist/runtime-v2/config/pd-config-feature-flags.js.map +1 -1
  165. package/core/dist/runtime-v2/config/pd-config-types.d.ts +8 -0
  166. package/core/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
  167. package/core/dist/runtime-v2/config/pd-config-types.js +2 -0
  168. package/core/dist/runtime-v2/config/pd-config-types.js.map +1 -1
  169. package/core/dist/runtime-v2/config/pd-config-validate.d.ts.map +1 -1
  170. package/core/dist/runtime-v2/config/pd-config-validate.js +48 -3
  171. package/core/dist/runtime-v2/config/pd-config-validate.js.map +1 -1
  172. package/core/dist/runtime-v2/core-principles/__tests__/core-axiom-block.test.js +36 -8
  173. package/core/dist/runtime-v2/core-principles/__tests__/core-axiom-block.test.js.map +1 -1
  174. package/core/dist/runtime-v2/core-principles/__tests__/core-principle-registry.test.js +36 -12
  175. package/core/dist/runtime-v2/core-principles/__tests__/core-principle-registry.test.js.map +1 -1
  176. package/core/dist/runtime-v2/core-principles/core-axiom-block.d.ts +22 -8
  177. package/core/dist/runtime-v2/core-principles/core-axiom-block.d.ts.map +1 -1
  178. package/core/dist/runtime-v2/core-principles/core-axiom-block.js +28 -13
  179. package/core/dist/runtime-v2/core-principles/core-axiom-block.js.map +1 -1
  180. package/core/dist/runtime-v2/core-principles/core-principle-registry.d.ts +29 -4
  181. package/core/dist/runtime-v2/core-principles/core-principle-registry.d.ts.map +1 -1
  182. package/core/dist/runtime-v2/core-principles/core-principle-registry.js +68 -33
  183. package/core/dist/runtime-v2/core-principles/core-principle-registry.js.map +1 -1
  184. package/core/dist/runtime-v2/core-principles/index.d.ts +3 -3
  185. package/core/dist/runtime-v2/core-principles/index.d.ts.map +1 -1
  186. package/core/dist/runtime-v2/core-principles/index.js +1 -1
  187. package/core/dist/runtime-v2/core-principles/index.js.map +1 -1
  188. package/core/dist/runtime-v2/evolution/evolution-types.d.ts +2 -1
  189. package/core/dist/runtime-v2/evolution/evolution-types.d.ts.map +1 -1
  190. package/core/dist/runtime-v2/evolution/evolution-types.js.map +1 -1
  191. package/core/dist/runtime-v2/feature-flags/__tests__/anonymous-product-telemetry-flag.test.d.ts +2 -0
  192. package/core/dist/runtime-v2/feature-flags/__tests__/anonymous-product-telemetry-flag.test.d.ts.map +1 -0
  193. package/core/dist/runtime-v2/feature-flags/__tests__/anonymous-product-telemetry-flag.test.js +48 -0
  194. package/core/dist/runtime-v2/feature-flags/__tests__/anonymous-product-telemetry-flag.test.js.map +1 -0
  195. package/core/dist/runtime-v2/feature-flags/__tests__/codex-conversation-ingestion-flag.test.d.ts +2 -0
  196. package/core/dist/runtime-v2/feature-flags/__tests__/codex-conversation-ingestion-flag.test.d.ts.map +1 -0
  197. package/core/dist/runtime-v2/feature-flags/__tests__/codex-conversation-ingestion-flag.test.js +46 -0
  198. package/core/dist/runtime-v2/feature-flags/__tests__/codex-conversation-ingestion-flag.test.js.map +1 -0
  199. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +86 -31
  200. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  201. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-lifecycle.test.d.ts +2 -0
  202. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-lifecycle.test.d.ts.map +1 -0
  203. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-lifecycle.test.js +83 -0
  204. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-lifecycle.test.js.map +1 -0
  205. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts +19 -1
  206. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  207. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +128 -10
  208. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  209. package/core/dist/runtime-v2/feature-flags/feature-flag-lifecycle.d.ts +37 -0
  210. package/core/dist/runtime-v2/feature-flags/feature-flag-lifecycle.d.ts.map +1 -0
  211. package/core/dist/runtime-v2/feature-flags/feature-flag-lifecycle.js +304 -0
  212. package/core/dist/runtime-v2/feature-flags/feature-flag-lifecycle.js.map +1 -0
  213. package/core/dist/runtime-v2/feature-flags/index.d.ts +4 -2
  214. package/core/dist/runtime-v2/feature-flags/index.d.ts.map +1 -1
  215. package/core/dist/runtime-v2/feature-flags/index.js +3 -1
  216. package/core/dist/runtime-v2/feature-flags/index.js.map +1 -1
  217. package/core/dist/runtime-v2/governance-experience-contract.d.ts +468 -0
  218. package/core/dist/runtime-v2/governance-experience-contract.d.ts.map +1 -0
  219. package/core/dist/runtime-v2/governance-experience-contract.js +208 -0
  220. package/core/dist/runtime-v2/governance-experience-contract.js.map +1 -0
  221. package/core/dist/runtime-v2/governance-experience.d.ts +11 -0
  222. package/core/dist/runtime-v2/governance-experience.d.ts.map +1 -0
  223. package/core/dist/runtime-v2/governance-experience.js +276 -0
  224. package/core/dist/runtime-v2/governance-experience.js.map +1 -0
  225. package/core/dist/runtime-v2/index.d.ts +20 -8
  226. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  227. package/core/dist/runtime-v2/index.js +20 -6
  228. package/core/dist/runtime-v2/index.js.map +1 -1
  229. package/core/dist/runtime-v2/internalization/__tests__/artificer-output-retry-flag.test.js +29 -10
  230. package/core/dist/runtime-v2/internalization/__tests__/artificer-output-retry-flag.test.js.map +1 -1
  231. package/core/dist/runtime-v2/owner-identity.d.ts +69 -0
  232. package/core/dist/runtime-v2/owner-identity.d.ts.map +1 -0
  233. package/core/dist/runtime-v2/owner-identity.js +179 -0
  234. package/core/dist/runtime-v2/owner-identity.js.map +1 -0
  235. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  236. package/core/dist/runtime-v2/pain-signal-runtime-factory.js +2 -3
  237. package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  238. package/core/dist/runtime-v2/product-telemetry/daily-identity.d.ts +70 -0
  239. package/core/dist/runtime-v2/product-telemetry/daily-identity.d.ts.map +1 -0
  240. package/core/dist/runtime-v2/product-telemetry/daily-identity.js +89 -0
  241. package/core/dist/runtime-v2/product-telemetry/daily-identity.js.map +1 -0
  242. package/core/dist/runtime-v2/product-telemetry/snapshot-contract.d.ts +110 -0
  243. package/core/dist/runtime-v2/product-telemetry/snapshot-contract.d.ts.map +1 -0
  244. package/core/dist/runtime-v2/product-telemetry/snapshot-contract.js +250 -0
  245. package/core/dist/runtime-v2/product-telemetry/snapshot-contract.js.map +1 -0
  246. package/core/dist/runtime-v2/pruning-read-model.d.ts +2 -1
  247. package/core/dist/runtime-v2/pruning-read-model.d.ts.map +1 -1
  248. package/core/dist/runtime-v2/pruning-read-model.js.map +1 -1
  249. package/core/dist/runtime-v2/receipt-coverage.d.ts +63 -0
  250. package/core/dist/runtime-v2/receipt-coverage.d.ts.map +1 -0
  251. package/core/dist/runtime-v2/receipt-coverage.js +19 -0
  252. package/core/dist/runtime-v2/receipt-coverage.js.map +1 -0
  253. package/core/dist/runtime-v2/recovery-actions-log.d.ts +7 -0
  254. package/core/dist/runtime-v2/recovery-actions-log.d.ts.map +1 -1
  255. package/core/dist/runtime-v2/recovery-actions-log.js +6 -0
  256. package/core/dist/runtime-v2/recovery-actions-log.js.map +1 -1
  257. package/core/dist/runtime-v2/runtime-protocol.js +1 -1
  258. package/core/dist/runtime-v2/runtime-protocol.js.map +1 -1
  259. package/core/dist/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.js +17 -1
  260. package/core/dist/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.js.map +1 -1
  261. package/core/dist/runtime-v2/store/task/sqlite-task-store.d.ts.map +1 -1
  262. package/core/dist/runtime-v2/store/task/sqlite-task-store.js +10 -0
  263. package/core/dist/runtime-v2/store/task/sqlite-task-store.js.map +1 -1
  264. package/core/dist/runtime-v2/store/task/task-types.d.ts +2 -0
  265. package/core/dist/runtime-v2/store/task/task-types.d.ts.map +1 -1
  266. package/core/dist/runtime-v2/task-status.d.ts +9 -5
  267. package/core/dist/runtime-v2/task-status.d.ts.map +1 -1
  268. package/core/dist/runtime-v2/task-status.js +15 -7
  269. package/core/dist/runtime-v2/task-status.js.map +1 -1
  270. package/core/dist/runtime-v2/types/event-types.d.ts +4 -0
  271. package/core/dist/runtime-v2/types/event-types.d.ts.map +1 -1
  272. package/core/dist/runtime-v2/types/event-types.js.map +1 -1
  273. package/core/dist/runtime-v2/types/index.d.ts +1 -1
  274. package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
  275. package/core/dist/runtime-v2/types/index.js +1 -1
  276. package/core/dist/runtime-v2/types/index.js.map +1 -1
  277. package/core/dist/runtime-v2/types/principle-enums.d.ts +3 -2
  278. package/core/dist/runtime-v2/types/principle-enums.d.ts.map +1 -1
  279. package/core/dist/runtime-v2/types/principle-enums.js +11 -5
  280. package/core/dist/runtime-v2/types/principle-enums.js.map +1 -1
  281. package/core/dist/runtime-v2/types/principle-schema.d.ts +1 -1
  282. package/core/dist/runtime-v2/types/principle-tree-store.d.ts +1 -1
  283. package/core/dist/runtime-v2/utils/cli-process-runner.d.ts.map +1 -1
  284. package/core/dist/runtime-v2/utils/cli-process-runner.js +3 -2
  285. package/core/dist/runtime-v2/utils/cli-process-runner.js.map +1 -1
  286. package/core/package.json +4 -5
  287. package/dist/i18n.d.ts.map +1 -1
  288. package/dist/i18n.js +4 -2
  289. package/dist/i18n.js.map +1 -1
  290. package/dist/index.d.ts +2 -0
  291. package/dist/index.d.ts.map +1 -1
  292. package/dist/index.js +47 -11
  293. package/dist/index.js.map +1 -1
  294. package/dist/installer.d.ts +31 -5
  295. package/dist/installer.d.ts.map +1 -1
  296. package/dist/installer.js +472 -161
  297. package/dist/installer.js.map +1 -1
  298. package/dist/installers/codex-host-installer.d.ts.map +1 -1
  299. package/dist/installers/codex-host-installer.js +4 -0
  300. package/dist/installers/codex-host-installer.js.map +1 -1
  301. package/dist/mvp-config.d.ts +10 -0
  302. package/dist/mvp-config.d.ts.map +1 -1
  303. package/dist/mvp-config.js +30 -3
  304. package/dist/mvp-config.js.map +1 -1
  305. package/dist/uninstaller.d.ts +9 -1
  306. package/dist/uninstaller.d.ts.map +1 -1
  307. package/dist/uninstaller.js +103 -23
  308. package/dist/uninstaller.js.map +1 -1
  309. package/dist/update/atomic-file.d.ts +35 -0
  310. package/dist/update/atomic-file.d.ts.map +1 -0
  311. package/dist/update/atomic-file.js +120 -0
  312. package/dist/update/atomic-file.js.map +1 -0
  313. package/dist/update/bootstrap-protocol.d.ts +55 -0
  314. package/dist/update/bootstrap-protocol.d.ts.map +1 -0
  315. package/dist/update/bootstrap-protocol.js +132 -0
  316. package/dist/update/bootstrap-protocol.js.map +1 -0
  317. package/dist/update/channel-metadata.d.ts +28 -0
  318. package/dist/update/channel-metadata.d.ts.map +1 -0
  319. package/dist/update/channel-metadata.js +90 -0
  320. package/dist/update/channel-metadata.js.map +1 -0
  321. package/dist/update/channel-promotion.d.ts +39 -0
  322. package/dist/update/channel-promotion.d.ts.map +1 -0
  323. package/dist/update/channel-promotion.js +55 -0
  324. package/dist/update/channel-promotion.js.map +1 -0
  325. package/dist/update/data-compatibility.d.ts +35 -0
  326. package/dist/update/data-compatibility.d.ts.map +1 -0
  327. package/dist/update/data-compatibility.js +45 -0
  328. package/dist/update/data-compatibility.js.map +1 -0
  329. package/dist/update/install-layout.d.ts +59 -0
  330. package/dist/update/install-layout.d.ts.map +1 -0
  331. package/dist/update/install-layout.js +127 -0
  332. package/dist/update/install-layout.js.map +1 -0
  333. package/dist/update/legacy-migration.d.ts +56 -0
  334. package/dist/update/legacy-migration.d.ts.map +1 -0
  335. package/dist/update/legacy-migration.js +254 -0
  336. package/dist/update/legacy-migration.js.map +1 -0
  337. package/dist/update/product-identity.d.ts +50 -0
  338. package/dist/update/product-identity.d.ts.map +1 -0
  339. package/dist/update/product-identity.js +63 -0
  340. package/dist/update/product-identity.js.map +1 -0
  341. package/dist/update/release-asset-manifest.d.ts +31 -0
  342. package/dist/update/release-asset-manifest.d.ts.map +1 -0
  343. package/dist/update/release-asset-manifest.js +161 -0
  344. package/dist/update/release-asset-manifest.js.map +1 -0
  345. package/dist/update/release-identity.d.ts +33 -0
  346. package/dist/update/release-identity.d.ts.map +1 -0
  347. package/dist/update/release-identity.js +108 -0
  348. package/dist/update/release-identity.js.map +1 -0
  349. package/dist/update/release-manager.d.ts +96 -0
  350. package/dist/update/release-manager.d.ts.map +1 -0
  351. package/dist/update/release-manager.js +253 -0
  352. package/dist/update/release-manager.js.map +1 -0
  353. package/dist/update/release-metadata.d.ts +57 -0
  354. package/dist/update/release-metadata.d.ts.map +1 -0
  355. package/dist/update/release-metadata.js +200 -0
  356. package/dist/update/release-metadata.js.map +1 -0
  357. package/dist/update/release-policy.d.ts +51 -0
  358. package/dist/update/release-policy.d.ts.map +1 -0
  359. package/dist/update/release-policy.js +103 -0
  360. package/dist/update/release-policy.js.map +1 -0
  361. package/dist/update/rollback-policy.d.ts +56 -0
  362. package/dist/update/rollback-policy.d.ts.map +1 -0
  363. package/dist/update/rollback-policy.js +61 -0
  364. package/dist/update/rollback-policy.js.map +1 -0
  365. package/dist/update/transaction-journal.d.ts +121 -0
  366. package/dist/update/transaction-journal.d.ts.map +1 -0
  367. package/dist/update/transaction-journal.js +333 -0
  368. package/dist/update/transaction-journal.js.map +1 -0
  369. package/dist/update/trust-metadata.d.ts +55 -0
  370. package/dist/update/trust-metadata.d.ts.map +1 -0
  371. package/dist/update/trust-metadata.js +170 -0
  372. package/dist/update/trust-metadata.js.map +1 -0
  373. package/dist/update/update-history.d.ts +46 -0
  374. package/dist/update/update-history.d.ts.map +1 -0
  375. package/dist/update/update-history.js +123 -0
  376. package/dist/update/update-history.js.map +1 -0
  377. package/dist/utils/env.d.ts +7 -0
  378. package/dist/utils/env.d.ts.map +1 -1
  379. package/dist/utils/env.js +134 -44
  380. package/dist/utils/env.js.map +1 -1
  381. package/host-runtime/dist/governance-observation-store.d.ts +172 -0
  382. package/host-runtime/dist/governance-observation-store.js +649 -0
  383. package/host-runtime/dist/index.d.ts +6 -0
  384. package/host-runtime/dist/index.js +8 -0
  385. package/host-runtime/dist/product-telemetry/consent-store.d.ts +107 -0
  386. package/host-runtime/dist/product-telemetry/consent-store.js +329 -0
  387. package/host-runtime/dist/product-telemetry/eligibility.d.ts +53 -0
  388. package/host-runtime/dist/product-telemetry/eligibility.js +69 -0
  389. package/host-runtime/dist/product-telemetry/exporter.d.ts +46 -0
  390. package/host-runtime/dist/product-telemetry/exporter.js +71 -0
  391. package/host-runtime/dist/product-telemetry/milestone-readers.d.ts +61 -0
  392. package/host-runtime/dist/product-telemetry/milestone-readers.js +234 -0
  393. package/host-runtime/dist/product-telemetry/service.d.ts +142 -0
  394. package/host-runtime/dist/product-telemetry/service.js +532 -0
  395. package/host-runtime/dist/product-telemetry/workspace-scope.d.ts +38 -0
  396. package/host-runtime/dist/product-telemetry/workspace-scope.js +64 -0
  397. package/host-runtime/package.json +7 -2
  398. package/install-layout/dist/index.d.ts +48 -0
  399. package/install-layout/dist/index.js +81 -0
  400. package/install-layout/dist/index.test.d.ts +1 -0
  401. package/install-layout/dist/index.test.js +34 -0
  402. package/install-layout/package.json +33 -0
  403. package/package.json +16 -6
  404. package/pd-cli/dist/commands/__tests__/telemetry-flag-wiring.test.d.ts +9 -0
  405. package/pd-cli/dist/commands/__tests__/telemetry-flag-wiring.test.d.ts.map +1 -0
  406. package/pd-cli/dist/commands/__tests__/telemetry-flag-wiring.test.js +76 -0
  407. package/pd-cli/dist/commands/__tests__/telemetry-flag-wiring.test.js.map +1 -0
  408. package/pd-cli/dist/commands/__tests__/version.test.d.ts +2 -0
  409. package/pd-cli/dist/commands/__tests__/version.test.d.ts.map +1 -0
  410. package/pd-cli/dist/commands/__tests__/version.test.js +134 -0
  411. package/pd-cli/dist/commands/__tests__/version.test.js.map +1 -0
  412. package/pd-cli/dist/commands/console.d.ts.map +1 -1
  413. package/pd-cli/dist/commands/console.js +29 -10
  414. package/pd-cli/dist/commands/console.js.map +1 -1
  415. package/pd-cli/dist/commands/pain-record.d.ts.map +1 -1
  416. package/pd-cli/dist/commands/pain-record.js +6 -15
  417. package/pd-cli/dist/commands/pain-record.js.map +1 -1
  418. package/pd-cli/dist/commands/runtime-activation.d.ts +29 -0
  419. package/pd-cli/dist/commands/runtime-activation.d.ts.map +1 -1
  420. package/pd-cli/dist/commands/runtime-activation.js +70 -31
  421. package/pd-cli/dist/commands/runtime-activation.js.map +1 -1
  422. package/pd-cli/dist/commands/runtime-internalization-enqueue-successors.d.ts.map +1 -1
  423. package/pd-cli/dist/commands/runtime-internalization-enqueue-successors.js +2 -2
  424. package/pd-cli/dist/commands/runtime-internalization-enqueue-successors.js.map +1 -1
  425. package/pd-cli/dist/commands/telemetry.d.ts +82 -0
  426. package/pd-cli/dist/commands/telemetry.d.ts.map +1 -0
  427. package/pd-cli/dist/commands/telemetry.js +268 -0
  428. package/pd-cli/dist/commands/telemetry.js.map +1 -0
  429. package/pd-cli/dist/commands/version.d.ts +11 -0
  430. package/pd-cli/dist/commands/version.d.ts.map +1 -0
  431. package/pd-cli/dist/commands/version.js +48 -0
  432. package/pd-cli/dist/commands/version.js.map +1 -0
  433. package/pd-cli/dist/index.js +35 -2
  434. package/pd-cli/dist/index.js.map +1 -1
  435. package/pd-cli/dist/services/version-report.d.ts +44 -0
  436. package/pd-cli/dist/services/version-report.d.ts.map +1 -0
  437. package/pd-cli/dist/services/version-report.js +152 -0
  438. package/pd-cli/dist/services/version-report.js.map +1 -0
  439. package/pd-cli/package.json +3 -2
  440. package/plugin/dist/bundle.js +870 -932
  441. package/plugin/dist/core/init.d.ts +2 -1
  442. package/plugin/dist/core/principle-application-ledger.d.ts +10 -0
  443. package/plugin/dist/core/product-telemetry-trigger.d.ts +14 -0
  444. package/plugin/dist/core/thinking-os-parser.d.ts +5 -2
  445. package/plugin/dist/governance-audit.js +386 -0
  446. package/plugin/dist/hooks/gate-block-helper.d.ts +25 -1
  447. package/plugin/dist/hooks/gate.d.ts +22 -0
  448. package/plugin/dist/openclaw.plugin.json +1 -1
  449. package/plugin/dist/rulehost-evidence.js +832 -0
  450. package/plugin/dist/templates/langs/en/principles/THINKING_OS.md +53 -45
  451. package/plugin/dist/templates/langs/en/skills/pd-mentor/SKILL.md +1 -1
  452. package/plugin/dist/templates/langs/zh/principles/THINKING_OS.md +62 -46
  453. package/plugin/dist/templates/langs/zh/skills/pd-mentor/SKILL.md +1 -1
  454. package/plugin/dist/templates/workspace/.principles/THINKING_OS.md +66 -38
  455. package/plugin/openclaw.plugin.json +1 -1
  456. package/plugin/package.json +1 -1
  457. package/plugin/templates/langs/en/principles/THINKING_OS.md +53 -45
  458. package/plugin/templates/langs/en/skills/pd-mentor/SKILL.md +1 -1
  459. package/plugin/templates/langs/zh/principles/THINKING_OS.md +62 -46
  460. package/plugin/templates/langs/zh/skills/pd-mentor/SKILL.md +1 -1
  461. package/plugin/templates/workspace/.principles/THINKING_OS.md +66 -38
@@ -0,0 +1,253 @@
1
+ /**
2
+ * ReleaseManager — the deep module behind every update surface (SPEC §6.2).
3
+ *
4
+ * External surface is intentionally small: inspect / check / apply /
5
+ * rollback. The module hides metadata validation, download, extraction,
6
+ * staging, probes, journaling, host control, rollback, and cleanup. In this
7
+ * phase (shadow mode) apply/rollback refuse read-only: activation lands with
8
+ * the transaction state machine, never by loosening this gate.
9
+ *
10
+ * Every refusal carries a stable reason and an Owner-visible next action
11
+ * (rc-9) and is computed BEFORE any installation state is mutated.
12
+ */
13
+ import * as fs from 'node:fs';
14
+ import * as os from 'node:os';
15
+ import * as path from 'node:path';
16
+ import { resolveTrustedReleaseTarget, downloadTrustedReleasePayload, ReleaseTrustError } from './trust-metadata.js';
17
+ import { parseChannelMetadata } from './channel-metadata.js';
18
+ import { buildReleaseMetadata, isReleaseMetadataExpired, parseReleaseMetadata, verifyReleaseMetadataIdentity, } from './release-metadata.js';
19
+ import { evaluateReleaseAdvancement, } from './release-policy.js';
20
+ import { readBootstrapManifest, readInstallConfig, resolvePdHomePaths, } from './install-layout.js';
21
+ import { readActiveRecord, TransactionJournalError } from './transaction-journal.js';
22
+ export class ReleaseManagerError extends Error {
23
+ reason;
24
+ nextAction;
25
+ constructor(reason, message, nextAction) {
26
+ super(message);
27
+ this.name = 'ReleaseManagerError';
28
+ this.reason = reason;
29
+ this.nextAction = nextAction;
30
+ }
31
+ }
32
+ /**
33
+ * Single authority for active.json: the transaction journal's strict reader
34
+ * (schemaVersion + full field set). This adapter only maps its corruption
35
+ * error onto the ReleaseManager surface contract — it must never re-parse or
36
+ * re-validate the file with a second, weaker schema.
37
+ */
38
+ function readActiveReleaseRecord(paths) {
39
+ try {
40
+ return readActiveRecord(paths.activeRecordPath);
41
+ }
42
+ catch (error) {
43
+ if (error instanceof TransactionJournalError) {
44
+ throw new ReleaseManagerError('active_record_corrupt', `active.json is corrupt and must be recovered from the transaction journal: ${paths.activeRecordPath} (${error.message})`, 'Run the official installer recovery or an explicit update operation; the last journal-confirmed release is selected automatically.');
45
+ }
46
+ throw error;
47
+ }
48
+ }
49
+ /**
50
+ * Reads a cached TUF-verified document, mapping corrupt JSON to the
51
+ * ReleaseManager error contract instead of leaking a bare SyntaxError
52
+ * (rc-3/rc-9: corrupted required state fails loud with a next action).
53
+ */
54
+ function parseCachedJson(filePath) {
55
+ try {
56
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
57
+ }
58
+ catch (error) {
59
+ throw new ReleaseManagerError('release_metadata_invalid', `A cached verified metadata document is not valid JSON (${filePath}): ${error instanceof Error ? error.message : String(error)}`, 'The cached document disagrees with its verified digest chain. Re-run the update check to re-verify and replace it.');
60
+ }
61
+ }
62
+ /**
63
+ * The signed channel document is fetched from the trusted TUF target
64
+ * `channels/<channel>.json`; its payload is the ChannelMetadata. The release
65
+ * metadata document comes from `releases/<release-id>/metadata.json` —
66
+ * already verified as a trusted target with an exact digest.
67
+ */
68
+ export class ReleaseManager {
69
+ paths;
70
+ options;
71
+ constructor(options) {
72
+ this.options = options;
73
+ this.paths = resolvePdHomePaths(options.pdHome);
74
+ }
75
+ inspect() {
76
+ const installConfig = readInstallConfig(this.paths);
77
+ const bootstrap = readBootstrapManifest(this.paths);
78
+ const active = readActiveReleaseRecord(this.paths);
79
+ // readActiveRecord returns null only when active.json is absent, so the
80
+ // releases/ skeleton alone distinguishes a pre-activation dual-slot root.
81
+ const layout = active !== null
82
+ ? 'dual-slot'
83
+ : fs.existsSync(this.paths.releasesDir)
84
+ ? 'dual-slot'
85
+ : fs.existsSync(this.legacyOverlayMarker())
86
+ ? 'legacy-overlay'
87
+ : 'none';
88
+ return {
89
+ layout,
90
+ productVersion: active?.productVersion ?? null,
91
+ releaseId: active?.releaseId ?? null,
92
+ generation: active?.generation ?? null,
93
+ bootstrapVersion: bootstrap?.bootstrapVersion ?? null,
94
+ channel: installConfig.channel,
95
+ };
96
+ }
97
+ async check(channel) {
98
+ const now = this.options.now ?? (() => new Date());
99
+ const status = this.inspect();
100
+ const channelTargetPath = `channels/${channel}.json`;
101
+ let trustedTarget;
102
+ try {
103
+ trustedTarget = await resolveTrustedReleaseTarget({
104
+ metadataDir: this.paths.trustDir,
105
+ metadataBaseUrl: this.options.metadataBaseUrl,
106
+ targetPath: channelTargetPath,
107
+ expectedChannel: channel,
108
+ expectedPlatform: 'metadata',
109
+ fetcher: this.options.fetcher,
110
+ });
111
+ }
112
+ catch (error) {
113
+ if (error instanceof ReleaseTrustError) {
114
+ throw new ReleaseManagerError('metadata_refresh_failed', error.message, error.nextAction);
115
+ }
116
+ throw error;
117
+ }
118
+ // Download the digest-verified channel payload into the installation's
119
+ // channels cache before parsing it (verify-then-trust, never the reverse).
120
+ await downloadTrustedReleasePayload({
121
+ metadataDir: this.paths.trustDir,
122
+ metadataBaseUrl: this.options.metadataBaseUrl,
123
+ targetPath: channelTargetPath,
124
+ destinationPath: path.join(this.paths.channelsDir, `${channel}.json`),
125
+ fetcher: this.options.fetcher,
126
+ });
127
+ const channelMetadata = this.readChannelMetadataPayload(channel);
128
+ const releaseMetadata = this.readReleaseMetadataDocument(channelMetadata, now);
129
+ // Current state for the advancement policy comes from the ACTIVE release's
130
+ // own metadata when a dual-slot installation exists.
131
+ let decision = evaluateReleaseAdvancement({
132
+ channel: channelMetadata,
133
+ candidate: releaseMetadata,
134
+ current: null,
135
+ bootstrapVersion: status.bootstrapVersion ?? '0.0.0',
136
+ now: now(),
137
+ });
138
+ if (status.releaseId !== null && status.productVersion !== null) {
139
+ const activeMetadata = this.readActiveReleaseMetadata(status.releaseId);
140
+ if (activeMetadata !== null) {
141
+ decision = evaluateReleaseAdvancement({
142
+ channel: channelMetadata,
143
+ candidate: releaseMetadata,
144
+ current: {
145
+ productVersion: status.productVersion,
146
+ releaseId: status.releaseId,
147
+ publicationSequence: activeMetadata.publicationSequence,
148
+ bootstrapVersion: status.bootstrapVersion ?? '0.0.0',
149
+ previouslyConfirmedReleaseIds: [status.releaseId],
150
+ },
151
+ bootstrapVersion: status.bootstrapVersion ?? '0.0.0',
152
+ now: now(),
153
+ });
154
+ }
155
+ }
156
+ const candidate = {
157
+ productVersion: releaseMetadata.productVersion,
158
+ releaseId: releaseMetadata.releaseId,
159
+ publicationSequence: releaseMetadata.publicationSequence,
160
+ assets: releaseMetadata.assets.map((asset) => ({
161
+ platform: asset.platform,
162
+ arch: asset.arch,
163
+ nodeAbi: asset.nodeAbi,
164
+ })),
165
+ };
166
+ const shadowComparison = await this.compareWithLegacyUpdater(status, decision, candidate.productVersion);
167
+ return {
168
+ channel,
169
+ candidate,
170
+ decision,
171
+ trustedTarget,
172
+ shadowComparison,
173
+ };
174
+ }
175
+ async apply() {
176
+ void this.paths; // reserved: Phase 4 activation drives this.paths / this.options
177
+ throw new ReleaseManagerError('shadow_mode_read_only', 'Release application is not enabled yet: the ReleaseManager runs in read-only shadow mode while the transactional activation system is brought up.', 'Continue using the current update path. Activation arrives with the dual-slot transaction rollout; this refusal protects against hybrid installations.');
178
+ }
179
+ async rollback() {
180
+ void this.paths; // reserved: Phase 4 rollback drives this.paths / this.options
181
+ throw new ReleaseManagerError('shadow_mode_read_only', 'Rollback is not enabled yet: the ReleaseManager runs in read-only shadow mode while the transactional activation system is brought up.', 'Continue using the current update path. Rollback arrives with the dual-slot transaction rollout.');
182
+ }
183
+ legacyOverlayMarker() {
184
+ const openclawRoot = this.options.openclawHome
185
+ ?? path.join(os.homedir(), '.openclaw');
186
+ return path.join(openclawRoot, 'extensions', 'principles-disciple');
187
+ }
188
+ readChannelMetadataPayload(channel) {
189
+ // The channel payload was downloaded and digest-verified by the TUF chain
190
+ // before this reader parses it (verify-then-trust).
191
+ const payloadPath = path.join(this.paths.channelsDir, `${channel}.json`);
192
+ if (!fs.existsSync(payloadPath)) {
193
+ throw new ReleaseManagerError('release_metadata_unavailable', `The signed channel payload is not cached locally: ${payloadPath}`, 'Re-run the update check so the verified channel payload is stored, then retry.');
194
+ }
195
+ const payload = parseCachedJson(payloadPath);
196
+ return parseChannelMetadata(payload);
197
+ }
198
+ readActiveReleaseMetadata(releaseId) {
199
+ const metadataPath = path.join(this.paths.releasesDir, releaseId, 'metadata.json');
200
+ if (!fs.existsSync(metadataPath))
201
+ return null;
202
+ const document = parseCachedJson(metadataPath);
203
+ const metadata = parseReleaseMetadata(document);
204
+ verifyReleaseMetadataIdentity(metadata);
205
+ return metadata;
206
+ }
207
+ readReleaseMetadataDocument(channel, now) {
208
+ const releaseDir = path.join(this.paths.releasesDir, channel.releaseId);
209
+ const metadataPath = path.join(releaseDir, 'metadata.json');
210
+ if (!fs.existsSync(metadataPath)) {
211
+ throw new ReleaseManagerError('release_metadata_unavailable', `Release metadata for ${channel.productVersion} is not available locally: ${metadataPath}`, 'This shadow-mode check only evaluates already-verified metadata. Download arrives with the transactional updater.');
212
+ }
213
+ const document = parseCachedJson(metadataPath);
214
+ const metadata = parseReleaseMetadata(document);
215
+ verifyReleaseMetadataIdentity(metadata);
216
+ if (isReleaseMetadataExpired(metadata, now())) {
217
+ throw new ReleaseManagerError('release_metadata_invalid', `Release metadata for ${metadata.productVersion} expired at ${metadata.expiresAt}.`, 'Wait for refreshed signed metadata from the official repository.');
218
+ }
219
+ if (metadata.metadataDigest !== channel.releaseMetadataDigest) {
220
+ throw new ReleaseManagerError('release_metadata_invalid', 'The cached release metadata does not match the digest the signed channel points at.', 'Re-run the update check to re-verify metadata, then retry.');
221
+ }
222
+ return metadata;
223
+ }
224
+ async compareWithLegacyUpdater(status, decision, candidateVersion) {
225
+ if (this.options.legacyCheck === undefined || status.productVersion === null) {
226
+ return { legacy: null, agrees: null, note: 'legacy comparison unavailable (no legacy updater or no active release)' };
227
+ }
228
+ let failureNote = null;
229
+ const legacy = await this.options.legacyCheck(status.productVersion).catch((error) => {
230
+ failureNote = `legacy updater failed: ${error instanceof Error ? error.message : String(error)}`;
231
+ return null;
232
+ });
233
+ if (failureNote !== null) {
234
+ return { legacy: null, agrees: null, note: failureNote };
235
+ }
236
+ if (legacy === null) {
237
+ return { legacy: null, agrees: null, note: 'legacy updater returned no decision' };
238
+ }
239
+ const newWouldAdvance = decision.allowed && decision.direction !== 'reinstall';
240
+ const legacyWouldAdvance = legacy.updateAvailable === true
241
+ && legacy.latestVersion !== null
242
+ && legacy.latestVersion !== status.productVersion;
243
+ const agrees = newWouldAdvance === legacyWouldAdvance;
244
+ return {
245
+ legacy,
246
+ agrees,
247
+ note: agrees ? null : `decision mismatch: new=${newWouldAdvance ? 'advance' : 'no-advance'} (${candidateVersion}) legacy=${legacyWouldAdvance ? 'advance' : 'no-advance'} (${legacy.latestVersion ?? 'unknown'})`,
248
+ };
249
+ }
250
+ }
251
+ /** Producer helper re-exported for the publication pipeline. */
252
+ export { buildReleaseMetadata };
253
+ //# sourceMappingURL=release-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-manager.js","sourceRoot":"","sources":["../../src/update/release-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,iBAAiB,EAA6B,MAAM,qBAAqB,CAAC;AAC/I,OAAO,EAAE,oBAAoB,EAAwB,MAAM,uBAAuB,CAAC;AACnF,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,6BAA6B,GAE9B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,0BAA0B,GAE3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,GAInB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAWrF,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,MAAM,CAAuB;IAC7B,UAAU,CAAS;IAE5B,YAAY,MAA4B,EAAE,OAAe,EAAE,UAAkB;QAC3E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAsDD;;;;;GAKG;AACH,SAAS,uBAAuB,CAAC,KAAkB;IACjD,IAAI,CAAC;QACH,OAAO,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,uBAAuB,EAAE,CAAC;YAC7C,MAAM,IAAI,mBAAmB,CAC3B,uBAAuB,EACvB,8EAA8E,KAAK,CAAC,gBAAgB,KAAK,KAAK,CAAC,OAAO,GAAG,EACzH,oIAAoI,CACrI,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAY,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,mBAAmB,CAC3B,0BAA0B,EAC1B,0DAA0D,QAAQ,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAChI,oHAAoH,CACrH,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACR,KAAK,CAAc;IACnB,OAAO,CAAwB;IAEhD,YAAY,OAA8B;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,OAAO;QACL,MAAM,aAAa,GAAkB,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,SAAS,GAA6B,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,wEAAwE;QACxE,0EAA0E;QAC1E,MAAM,MAAM,GAAuB,MAAM,KAAK,IAAI;YAChD,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;gBACrC,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBACzC,CAAC,CAAC,gBAAgB;oBAClB,CAAC,CAAC,MAAM,CAAC;QACf,OAAO;YACL,MAAM;YACN,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,IAAI;YAC9C,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,IAAI;YACpC,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI;YACtC,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,IAAI,IAAI;YACrD,OAAO,EAAE,aAAa,CAAC,OAAO;SAC/B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAA2B;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAS,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,MAAM,iBAAiB,GAAG,YAAY,OAAO,OAAO,CAAC;QAErD,IAAI,aAAmC,CAAC;QACxC,IAAI,CAAC;YACH,aAAa,GAAG,MAAM,2BAA2B,CAAC;gBAChD,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;gBAChC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe;gBAC7C,UAAU,EAAE,iBAAiB;gBAC7B,eAAe,EAAE,OAAO;gBACxB,gBAAgB,EAAE,UAAU;gBAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;aAC9B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;gBACvC,MAAM,IAAI,mBAAmB,CAC3B,yBAAyB,EACzB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,UAAU,CACjB,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,uEAAuE;QACvE,2EAA2E;QAC3E,MAAM,6BAA6B,CAAC;YAClC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;YAChC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe;YAC7C,UAAU,EAAE,iBAAiB;YAC7B,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,OAAO,OAAO,CAAC;YACrE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;SAC9B,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;QAEjE,MAAM,eAAe,GAAG,IAAI,CAAC,2BAA2B,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QAE/E,2EAA2E;QAC3E,qDAAqD;QACrD,IAAI,QAAQ,GAAG,0BAA0B,CAAC;YACxC,OAAO,EAAE,eAAe;YACxB,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,IAAI;YACb,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,OAAO;YACpD,GAAG,EAAE,GAAG,EAAE;SACX,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YAChE,MAAM,cAAc,GAAG,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxE,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;gBAC5B,QAAQ,GAAG,0BAA0B,CAAC;oBACpC,OAAO,EAAE,eAAe;oBACxB,SAAS,EAAE,eAAe;oBAC1B,OAAO,EAAE;wBACP,cAAc,EAAE,MAAM,CAAC,cAAc;wBACrC,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,mBAAmB,EAAE,cAAc,CAAC,mBAAmB;wBACvD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,OAAO;wBACpD,6BAA6B,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC;qBAClD;oBACD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,OAAO;oBACpD,GAAG,EAAE,GAAG,EAAE;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG;YAChB,cAAc,EAAE,eAAe,CAAC,cAAc;YAC9C,SAAS,EAAE,eAAe,CAAC,SAAS;YACpC,mBAAmB,EAAE,eAAe,CAAC,mBAAmB;YACxD,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC7C,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;SACJ,CAAC;QAEF,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;QAEzG,OAAO;YACL,OAAO;YACP,SAAS;YACT,QAAQ;YACR,aAAa;YACb,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,gEAAgE;QACjF,MAAM,IAAI,mBAAmB,CAC3B,uBAAuB,EACvB,mJAAmJ,EACnJ,wJAAwJ,CACzJ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,8DAA8D;QAC/E,MAAM,IAAI,mBAAmB,CAC3B,uBAAuB,EACvB,wIAAwI,EACxI,kGAAkG,CACnG,CAAC;IACJ,CAAC;IAEO,mBAAmB;QACzB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY;eACzC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,qBAAqB,CAAC,CAAC;IACtE,CAAC;IAEO,0BAA0B,CAAC,OAA2B;QAC5D,0EAA0E;QAC1E,oDAAoD;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;QACzE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,mBAAmB,CAC3B,8BAA8B,EAC9B,qDAAqD,WAAW,EAAE,EAClE,gFAAgF,CACjF,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAY,eAAe,CAAC,WAAW,CAAC,CAAC;QACtD,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAEO,yBAAyB,CAAC,SAAiB;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QACnF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9C,MAAM,QAAQ,GAAY,eAAe,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAChD,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,2BAA2B,CACjC,OAAwB,EACxB,GAAe;QAEf,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,mBAAmB,CAC3B,8BAA8B,EAC9B,wBAAwB,OAAO,CAAC,cAAc,8BAA8B,YAAY,EAAE,EAC1F,mHAAmH,CACpH,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAY,eAAe,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAChD,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,wBAAwB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,mBAAmB,CAC3B,0BAA0B,EAC1B,wBAAwB,QAAQ,CAAC,cAAc,eAAe,QAAQ,CAAC,SAAS,GAAG,EACnF,kEAAkE,CACnE,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,cAAc,KAAK,OAAO,CAAC,qBAAqB,EAAE,CAAC;YAC9D,MAAM,IAAI,mBAAmB,CAC3B,0BAA0B,EAC1B,qFAAqF,EACrF,4DAA4D,CAC7D,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,wBAAwB,CACpC,MAAqB,EACrB,QAA+B,EAC/B,gBAAwB;QAExB,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YAC7E,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,wEAAwE,EAAE,CAAC;QACxH,CAAC;QACD,IAAI,WAAW,GAAkB,IAAI,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC5F,WAAW,GAAG,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACjG,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAC3D,CAAC;QACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC;QACrF,CAAC;QACD,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,SAAS,KAAK,WAAW,CAAC;QAC/E,MAAM,kBAAkB,GAAG,MAAM,CAAC,eAAe,KAAK,IAAI;eACrD,MAAM,CAAC,aAAa,KAAK,IAAI;eAC7B,MAAM,CAAC,aAAa,KAAK,MAAM,CAAC,cAAc,CAAC;QACpD,MAAM,MAAM,GAAG,eAAe,KAAK,kBAAkB,CAAC;QACtD,OAAO;YACL,MAAM;YACN,MAAM;YACN,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,KAAK,gBAAgB,YAAY,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC,aAAa,IAAI,SAAS,GAAG;SAClN,CAAC;IACJ,CAAC;CACF;AAED,gEAAgE;AAChE,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Strict Release Metadata contract (SPEC §4.2).
3
+ *
4
+ * Release Metadata is immutable after publication. It records product
5
+ * version, release ID, source commit, asset digests, supported platforms,
6
+ * minimum bootstrap version, compatibility constraints, and the publication
7
+ * sequence. Signed envelopes arrive as `unknown`; nothing is trusted until
8
+ * this validator accepts it. Required fields fail loud (rc-3), elements are
9
+ * validated (rc-4), and own-property access is used throughout (rc-5).
10
+ */
11
+ import { type ReleaseAssetIdentity } from './release-identity.js';
12
+ export declare const RELEASE_METADATA_SCHEMA_VERSION = 1;
13
+ export interface ReleaseMetadata {
14
+ readonly schemaVersion: number;
15
+ readonly productVersion: string;
16
+ readonly releaseId: string;
17
+ readonly sourceCommit: string;
18
+ readonly metadataDigest: string;
19
+ readonly minBootstrapVersion: string;
20
+ readonly publicationSequence: number;
21
+ readonly expiresAt: string;
22
+ readonly assets: readonly ReleaseAssetIdentity[];
23
+ readonly compatibility: {
24
+ readonly dataSchemaForwardReadableFrom: string;
25
+ };
26
+ }
27
+ export type ReleaseMetadataErrorCode = 'release_metadata_invalid' | 'release_metadata_identity_mismatch';
28
+ export declare class ReleaseMetadataError extends Error {
29
+ readonly code: ReleaseMetadataErrorCode;
30
+ readonly field: string;
31
+ constructor(code: ReleaseMetadataErrorCode, field: string, message: string);
32
+ }
33
+ /**
34
+ * Field-by-field strict parse. Rejects unknown top-level fields so a future
35
+ * schema change fails loud instead of silently dropping meaning.
36
+ */
37
+ export declare function parseReleaseMetadata(value: unknown): ReleaseMetadata;
38
+ /**
39
+ * Verifies the internal identity chain: recomputing the release ID from the
40
+ * metadata's own content must reproduce `releaseId`, and the canonical
41
+ * document digest must reproduce `metadataDigest`. A metadata document whose
42
+ * identity does not close is refuse-before-activation (SPEC §4.3).
43
+ */
44
+ export declare function verifyReleaseMetadataIdentity(metadata: ReleaseMetadata): void;
45
+ export declare function isReleaseMetadataExpired(metadata: ReleaseMetadata, now?: Date): boolean;
46
+ /** Builds a well-formed metadata document from identity inputs (producer side). */
47
+ export declare function buildReleaseMetadata(input: {
48
+ productVersion: string;
49
+ sourceCommit: string;
50
+ minBootstrapVersion: string;
51
+ publicationSequence: number;
52
+ expiresAt: string;
53
+ assets: readonly ReleaseAssetIdentity[];
54
+ dataSchemaForwardReadableFrom: string;
55
+ }): ReleaseMetadata;
56
+ export declare function isReleaseMetadata(value: unknown): value is ReleaseMetadata;
57
+ //# sourceMappingURL=release-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-metadata.d.ts","sourceRoot":"","sources":["../../src/update/release-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACjD,QAAQ,CAAC,aAAa,EAAE;QACtB,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC;KAChD,CAAC;CACH;AAED,MAAM,MAAM,wBAAwB,GAChC,0BAA0B,GAC1B,oCAAoC,CAAC;AAEzC,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,YAAY,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAKzE;CACF;AA+BD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAkFpE;AAgBD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAsB7E;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAEnG;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACxC,6BAA6B,EAAE,MAAM,CAAC;CACvC,GAAG,eAAe,CAkBlB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAS1E"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Strict Release Metadata contract (SPEC §4.2).
3
+ *
4
+ * Release Metadata is immutable after publication. It records product
5
+ * version, release ID, source commit, asset digests, supported platforms,
6
+ * minimum bootstrap version, compatibility constraints, and the publication
7
+ * sequence. Signed envelopes arrive as `unknown`; nothing is trusted until
8
+ * this validator accepts it. Required fields fail loud (rc-3), elements are
9
+ * validated (rc-4), and own-property access is used throughout (rc-5).
10
+ */
11
+ import { assertGitCommit, assertSha256Hex, isSha256Hex, parseProductVersion, ProductIdentityError, } from './product-identity.js';
12
+ import { canonicalJson, computeReleaseContentDigest, deriveReleaseId, } from './release-identity.js';
13
+ export const RELEASE_METADATA_SCHEMA_VERSION = 1;
14
+ export class ReleaseMetadataError extends Error {
15
+ code;
16
+ field;
17
+ constructor(code, field, message) {
18
+ super(message);
19
+ this.name = 'ReleaseMetadataError';
20
+ this.code = code;
21
+ this.field = field;
22
+ }
23
+ }
24
+ function isPlainObject(value) {
25
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
26
+ }
27
+ function requireOwn(record, field) {
28
+ if (!Object.hasOwn(record, field)) {
29
+ throw new ReleaseMetadataError('release_metadata_invalid', field, `Release metadata is missing required field "${field}"`);
30
+ }
31
+ return record[field];
32
+ }
33
+ function parseRfc3339Utc(value, field) {
34
+ if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/.test(value)) {
35
+ throw new ReleaseMetadataError('release_metadata_invalid', field, `${field} must be an RFC3339 UTC timestamp ending in Z, got: ${JSON.stringify(value)}`);
36
+ }
37
+ const time = Date.parse(value);
38
+ if (Number.isNaN(time)) {
39
+ throw new ReleaseMetadataError('release_metadata_invalid', field, `${field} is not a valid date: ${JSON.stringify(value)}`);
40
+ }
41
+ return value;
42
+ }
43
+ function parsePositiveInteger(value, field) {
44
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0) {
45
+ throw new ReleaseMetadataError('release_metadata_invalid', field, `${field} must be a positive safe integer, got: ${JSON.stringify(value)}`);
46
+ }
47
+ return value;
48
+ }
49
+ /**
50
+ * Field-by-field strict parse. Rejects unknown top-level fields so a future
51
+ * schema change fails loud instead of silently dropping meaning.
52
+ */
53
+ export function parseReleaseMetadata(value) {
54
+ if (!isPlainObject(value)) {
55
+ throw new ReleaseMetadataError('release_metadata_invalid', 'root', 'Release metadata must be a JSON object');
56
+ }
57
+ const record = value;
58
+ const schemaVersion = requireOwn(record, 'schemaVersion');
59
+ if (schemaVersion !== RELEASE_METADATA_SCHEMA_VERSION) {
60
+ throw new ReleaseMetadataError('release_metadata_invalid', 'schemaVersion', `Unsupported release metadata schemaVersion: ${JSON.stringify(schemaVersion)}`);
61
+ }
62
+ const { productVersion } = parseProductVersion(requireOwn(record, 'productVersion'));
63
+ const minBootstrapVersion = parseProductVersion(requireOwn(record, 'minBootstrapVersion'), 'minBootstrapVersion').productVersion;
64
+ const sourceCommit = assertGitCommit(requireOwn(record, 'sourceCommit'), 'sourceCommit');
65
+ const releaseId = assertSha256Hex(requireOwn(record, 'releaseId'), 'releaseId');
66
+ const metadataDigest = assertSha256Hex(requireOwn(record, 'metadataDigest'), 'metadataDigest');
67
+ const publicationSequence = parsePositiveInteger(requireOwn(record, 'publicationSequence'), 'publicationSequence');
68
+ const expiresAt = parseRfc3339Utc(requireOwn(record, 'expiresAt'), 'expiresAt');
69
+ const assetsValue = requireOwn(record, 'assets');
70
+ if (!Array.isArray(assetsValue) || assetsValue.length === 0) {
71
+ throw new ReleaseMetadataError('release_metadata_invalid', 'assets', 'assets must be a non-empty array');
72
+ }
73
+ const compatibilityValue = requireOwn(record, 'compatibility');
74
+ if (!isPlainObject(compatibilityValue)) {
75
+ throw new ReleaseMetadataError('release_metadata_invalid', 'compatibility', 'compatibility must be an object');
76
+ }
77
+ const dataSchemaForwardReadableFrom = requireOwn(compatibilityValue, 'dataSchemaForwardReadableFrom');
78
+ parseProductVersion(dataSchemaForwardReadableFrom, 'compatibility.dataSchemaForwardReadableFrom');
79
+ const knownKeys = new Set([
80
+ 'schemaVersion', 'productVersion', 'releaseId', 'sourceCommit', 'metadataDigest',
81
+ 'minBootstrapVersion', 'publicationSequence', 'expiresAt', 'assets', 'compatibility',
82
+ ]);
83
+ for (const key of Object.keys(record)) {
84
+ if (!knownKeys.has(key)) {
85
+ throw new ReleaseMetadataError('release_metadata_invalid', key, `Release metadata contains unknown field "${key}"`);
86
+ }
87
+ }
88
+ const assets = assetsValue.map((asset, index) => {
89
+ if (!isPlainObject(asset)) {
90
+ throw new ReleaseMetadataError('release_metadata_invalid', 'assets', `assets[${index}] must be an object`);
91
+ }
92
+ const assetKeys = new Set(['platform', 'arch', 'nodeAbi', 'archiveSha256', 'archiveSizeBytes']);
93
+ for (const key of Object.keys(asset)) {
94
+ if (!assetKeys.has(key)) {
95
+ throw new ReleaseMetadataError('release_metadata_invalid', 'assets', `assets[${index}] contains unknown field "${key}"`);
96
+ }
97
+ }
98
+ return {
99
+ platform: requireOwn(asset, 'platform'),
100
+ arch: requireOwn(asset, 'arch'),
101
+ nodeAbi: requireOwn(asset, 'nodeAbi'),
102
+ archiveSha256: requireOwn(asset, 'archiveSha256'),
103
+ archiveSizeBytes: requireOwn(asset, 'archiveSizeBytes'),
104
+ };
105
+ });
106
+ // The identity validator inside deriveReleaseId re-checks every asset field
107
+ // strictly (identifier shape, digest hex, size) — reuse it by round-tripping.
108
+ try {
109
+ deriveReleaseId({ productVersion, sourceCommit, minBootstrapVersion, assets });
110
+ }
111
+ catch (error) {
112
+ if (error instanceof ProductIdentityError) {
113
+ throw new ReleaseMetadataError('release_metadata_invalid', error.field, error.message);
114
+ }
115
+ throw error;
116
+ }
117
+ return {
118
+ schemaVersion,
119
+ productVersion,
120
+ releaseId,
121
+ sourceCommit,
122
+ metadataDigest,
123
+ minBootstrapVersion,
124
+ publicationSequence,
125
+ expiresAt,
126
+ assets,
127
+ compatibility: { dataSchemaForwardReadableFrom: dataSchemaForwardReadableFrom },
128
+ };
129
+ }
130
+ function metadataToJsonValue(metadata) {
131
+ return JSON.parse(canonicalJson({
132
+ schemaVersion: metadata.schemaVersion,
133
+ productVersion: metadata.productVersion,
134
+ releaseId: metadata.releaseId,
135
+ sourceCommit: metadata.sourceCommit,
136
+ minBootstrapVersion: metadata.minBootstrapVersion,
137
+ publicationSequence: metadata.publicationSequence,
138
+ expiresAt: metadata.expiresAt,
139
+ assets: metadata.assets,
140
+ compatibility: metadata.compatibility,
141
+ }));
142
+ }
143
+ /**
144
+ * Verifies the internal identity chain: recomputing the release ID from the
145
+ * metadata's own content must reproduce `releaseId`, and the canonical
146
+ * document digest must reproduce `metadataDigest`. A metadata document whose
147
+ * identity does not close is refuse-before-activation (SPEC §4.3).
148
+ */
149
+ export function verifyReleaseMetadataIdentity(metadata) {
150
+ const derivedReleaseId = deriveReleaseId({
151
+ productVersion: metadata.productVersion,
152
+ sourceCommit: metadata.sourceCommit,
153
+ minBootstrapVersion: metadata.minBootstrapVersion,
154
+ assets: metadata.assets,
155
+ });
156
+ if (derivedReleaseId !== metadata.releaseId) {
157
+ throw new ReleaseMetadataError('release_metadata_identity_mismatch', 'releaseId', `Release metadata releaseId ${metadata.releaseId} does not match the identity derived from its own content (${derivedReleaseId})`);
158
+ }
159
+ const documentDigest = computeReleaseContentDigest(metadataToJsonValue(metadata));
160
+ if (documentDigest !== metadata.metadataDigest) {
161
+ throw new ReleaseMetadataError('release_metadata_identity_mismatch', 'metadataDigest', `Release metadata digest ${metadata.metadataDigest} does not match the canonical document digest (${documentDigest})`);
162
+ }
163
+ }
164
+ export function isReleaseMetadataExpired(metadata, now = new Date()) {
165
+ return Date.parse(metadata.expiresAt) <= now.getTime();
166
+ }
167
+ /** Builds a well-formed metadata document from identity inputs (producer side). */
168
+ export function buildReleaseMetadata(input) {
169
+ const releaseId = deriveReleaseId(input);
170
+ const metadata = {
171
+ schemaVersion: RELEASE_METADATA_SCHEMA_VERSION,
172
+ productVersion: input.productVersion,
173
+ releaseId,
174
+ sourceCommit: input.sourceCommit,
175
+ metadataDigest: '',
176
+ minBootstrapVersion: input.minBootstrapVersion,
177
+ publicationSequence: input.publicationSequence,
178
+ expiresAt: input.expiresAt,
179
+ assets: [...input.assets],
180
+ compatibility: { dataSchemaForwardReadableFrom: input.dataSchemaForwardReadableFrom },
181
+ };
182
+ const metadataDigest = computeReleaseContentDigest(metadataToJsonValue(metadata));
183
+ const complete = { ...metadata, metadataDigest };
184
+ verifyReleaseMetadataIdentity(complete);
185
+ return complete;
186
+ }
187
+ export function isReleaseMetadata(value) {
188
+ if (typeof value !== 'object' || value === null)
189
+ return false;
190
+ if (!isSha256Hex(Reflect.get(value, 'releaseId')))
191
+ return false;
192
+ try {
193
+ parseReleaseMetadata(value);
194
+ return true;
195
+ }
196
+ catch {
197
+ return false;
198
+ }
199
+ }
200
+ //# sourceMappingURL=release-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-metadata.js","sourceRoot":"","sources":["../../src/update/release-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Release advancement preflight policy (SPEC §4.3, §9, §13).
3
+ *
4
+ * Pure decisions over already-validated metadata: publication sequence
5
+ * monotonicity, the explicit downgrade policy, channel pointer integrity,
6
+ * expiry, and bootstrap compatibility. Every refusal carries a stable reason
7
+ * code and an Owner-visible next action (rc-9) and must happen BEFORE any
8
+ * installation state is mutated (ERR-074 guard placement).
9
+ */
10
+ import type { ChannelMetadata } from './channel-metadata.js';
11
+ import type { ReleaseMetadata } from './release-metadata.js';
12
+ export type ReleasePolicyRefusalReason = 'channel_pointer_mismatch' | 'release_metadata_expired' | 'channel_metadata_expired' | 'sequence_regression' | 'downgrade_blocked' | 'bootstrap_too_old';
13
+ export interface ReleasePolicyRefusal {
14
+ readonly allowed: false;
15
+ readonly reason: ReleasePolicyRefusalReason;
16
+ readonly message: string;
17
+ readonly nextAction: string;
18
+ }
19
+ export interface ReleasePolicyAllowance {
20
+ readonly allowed: true;
21
+ readonly direction: 'update' | 'reinstall' | 'explicit_downgrade';
22
+ }
23
+ export type ReleasePolicyDecision = ReleasePolicyRefusal | ReleasePolicyAllowance;
24
+ export interface CurrentInstallationState {
25
+ readonly productVersion: string;
26
+ readonly releaseId: string;
27
+ readonly publicationSequence: number;
28
+ readonly bootstrapVersion: string;
29
+ /** Releases previously confirmed on this installation (rollback-safe targets). */
30
+ readonly previouslyConfirmedReleaseIds: readonly string[];
31
+ }
32
+ /**
33
+ * The channel pointer must reference exactly this release metadata document
34
+ * (SPEC §4.3: "Channel Metadata references the exact Release Metadata digest").
35
+ */
36
+ export declare function verifyChannelPointer(channel: ChannelMetadata, release: ReleaseMetadata): ReleasePolicyRefusal | null;
37
+ /**
38
+ * Full advancement decision. `allowExplicitDowngrade` is the Owner's explicit
39
+ * confirmation flag; even with it, the target must be a previously confirmed
40
+ * release — arbitrary downgrades to unseen releases stay refused because their
41
+ * data compatibility window is unproven (SPEC §10).
42
+ */
43
+ export declare function evaluateReleaseAdvancement(input: {
44
+ channel: ChannelMetadata;
45
+ candidate: ReleaseMetadata;
46
+ current: CurrentInstallationState | null;
47
+ bootstrapVersion: string;
48
+ now?: Date;
49
+ allowExplicitDowngrade?: boolean;
50
+ }): ReleasePolicyDecision;
51
+ //# sourceMappingURL=release-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-policy.d.ts","sourceRoot":"","sources":["../../src/update/release-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK7D,MAAM,MAAM,0BAA0B,GAClC,0BAA0B,GAC1B,0BAA0B,GAC1B,0BAA0B,GAC1B,qBAAqB,GACrB,mBAAmB,GACnB,mBAAmB,CAAC;AAExB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,WAAW,GAAG,oBAAoB,CAAC;CACnE;AAED,MAAM,MAAM,qBAAqB,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;AAElF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,kFAAkF;IAClF,QAAQ,CAAC,6BAA6B,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,GAAG,oBAAoB,GAAG,IAAI,CAkBpH;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,GAAG,qBAAqB,CAmExB"}