chainlesschain 0.166.92 → 0.166.93

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 (174) hide show
  1. package/package.json +3 -3
  2. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  3. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-C74YzqwJ.js → AIOps-oo9rE0gh.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-TFef1hOE.js → ActionButton-CVJVVv4i.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-CYsWpkkU.js → Analytics-CUXuwmia.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-CFf9kjwu.js → AppLayout-iM4PvCuY.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-TQqa94YO.js → Artifacts-DKUIJbf9.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-B79ayqfS.js → Audit-C4_SzFN2.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-pjkHfLP9.js → BackgroundAgents-C3427uy-.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-CE6A-t_r.js → Backup-BpEQQiog.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-CwcgWMBY.js → BaseInput-C_exQomZ.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-BIkDNesY.js → Chat-DzpkLtWa.js} +6 -6
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DgaokYts.js → ChatBubbleRenderer-DX4XmTWm.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-MbypIy5V.js → Checkbox-CxAC1CU8.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-DiFHWDnt.js → Codegen-wDFAGCLp.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-BNMlYMso.js → Col-BvwirhMf.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-B3HVyHOX.js → Community-BJuA7paY.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-C7hlAubb.js → Compact-DzV35_u2.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-PaXZu6sE.js → Compliance-CIDPPvr9.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-BGiojbm-.js → Cowork-DyTMxP3N.js} +3 -3
  22. package/src/assets/web-panel/assets/{Cron-Bmr-1QAx.js → Cron-PcNLjMFx.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-BwUvWCVd.js → Crosschain-B_O7ck6Z.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-k_4QZocW.js → DID-CII35Me1.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-_ieRo2C5.js → Dashboard-DU56fkNz.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-DYHh6T27.js → Dropdown-DHC8HVeJ.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-BNlQcWQX.js → EmailListRenderer-oUOHFNsD.js} +1 -1
  28. package/src/assets/web-panel/assets/{EvolutionSettings-DIkZ6U2D.js → EvolutionSettings-D7RCAWNl.js} +1 -1
  29. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dq7qSr0P.js → FamilyGuardDashboard-CGONPZxC.js} +1 -1
  30. package/src/assets/web-panel/assets/{Federation-C64e3Cbx.js → Federation-BbDlPWcl.js} +1 -1
  31. package/src/assets/web-panel/assets/{FormItemContext-D-GE2vUa.js → FormItemContext-BBJbFQQT.js} +1 -1
  32. package/src/assets/web-panel/assets/{GenericCardRenderer-DO3B2gis.js → GenericCardRenderer-iuxAero4.js} +1 -1
  33. package/src/assets/web-panel/assets/{Git-0ETirIQH.js → Git-Dw0prdY5.js} +2 -2
  34. package/src/assets/web-panel/assets/{Governance-C9fnRygX.js → Governance-DOGqi_uV.js} +1 -1
  35. package/src/assets/web-panel/assets/{Inference-CLJ9RTsK.js → Inference-BY5oUGGj.js} +1 -1
  36. package/src/assets/web-panel/assets/{KnowledgeGraph-D3C_GxrN.js → KnowledgeGraph-CcE2EVYX.js} +1 -1
  37. package/src/assets/web-panel/assets/{Logs-C5ctGbkN.js → Logs-DyfN4R5w.js} +2 -2
  38. package/src/assets/web-panel/assets/MarkdownRenderer-Bj62Aq0M.js +1 -0
  39. package/src/assets/web-panel/assets/{Marketplace-GF_t6hJ_.js → Marketplace-CuuuAXUh.js} +1 -1
  40. package/src/assets/web-panel/assets/{McpTools-BGsGzgQs.js → McpTools-948Fithv.js} +2 -2
  41. package/src/assets/web-panel/assets/{Memory-CcrY2A0j.js → Memory-D4PINvyy.js} +2 -2
  42. package/src/assets/web-panel/assets/{MobileBridge-Bi4T0RlS.js → MobileBridge-ECKMaLzX.js} +1 -1
  43. package/src/assets/web-panel/assets/{MobileProjects-DvjEGyvf.js → MobileProjects-CB5MAcvD.js} +1 -1
  44. package/src/assets/web-panel/assets/{Mtc-DL77Vf-k.js → Mtc-BRzIM3HJ.js} +4 -4
  45. package/src/assets/web-panel/assets/{MtcAudit-CDy_Uswb.js → MtcAudit-CGeAXJGn.js} +2 -2
  46. package/src/assets/web-panel/assets/{Multisig-DL0BAO_c.js → Multisig-C_qJ-8K-.js} +3 -3
  47. package/src/assets/web-panel/assets/{NLProgramming-B-woh5IR.js → NLProgramming-DAEyCn7T.js} +1 -1
  48. package/src/assets/web-panel/assets/{Notes-CEFVCxk7.js → Notes-DmD3MEec.js} +3 -3
  49. package/src/assets/web-panel/assets/{NotificationSettings-BqPPMuAP.js → NotificationSettings-Cv4Q3VC9.js} +1 -1
  50. package/src/assets/web-panel/assets/OrderTableRenderer-BNlpaFjH.js +1 -0
  51. package/src/assets/web-panel/assets/{Organization-B1gX8jlr.js → Organization-DqAFdz6p.js} +2 -2
  52. package/src/assets/web-panel/assets/{Overflow-CeMxuUZy.js → Overflow-8Ye9cIcE.js} +1 -1
  53. package/src/assets/web-panel/assets/{P2P-B5aIRWwJ.js → P2P-755SfHoJ.js} +2 -2
  54. package/src/assets/web-panel/assets/{PdhVaultBrowser-6rYgejd4.js → PdhVaultBrowser-CgZLiucX.js} +4 -4
  55. package/src/assets/web-panel/assets/{Permissions-CqCp2SIl.js → Permissions-C-vFF_rL.js} +3 -3
  56. package/src/assets/web-panel/assets/{PersonalDataHub-BsA7DJWW.js → PersonalDataHub-Diz1oXM3.js} +5 -5
  57. package/src/assets/web-panel/assets/{Pipeline-CiW6HeZh.js → Pipeline-D4kIzsZG.js} +1 -1
  58. package/src/assets/web-panel/assets/{Privacy-DckUOLYq.js → Privacy-QKLkSAUH.js} +1 -1
  59. package/src/assets/web-panel/assets/{ProjectInit-CZppOOYR.js → ProjectInit-I0S9o_RT.js} +2 -2
  60. package/src/assets/web-panel/assets/{ProjectSettings-B9QPzhDU.js → ProjectSettings-DdgV3-Ho.js} +2 -2
  61. package/src/assets/web-panel/assets/{Projects-BErjjGha.js → Projects-BJHHegtj.js} +1 -1
  62. package/src/assets/web-panel/assets/{Providers-DehU6Qiz.js → Providers-uVa1zfbS.js} +1 -1
  63. package/src/assets/web-panel/assets/{QrScannerModal-E1SUvv1m.js → QrScannerModal-YLVpOChR.js} +1 -1
  64. package/src/assets/web-panel/assets/{QuickAsk-COWFxyH3.js → QuickAsk-535AYH61.js} +1 -1
  65. package/src/assets/web-panel/assets/{Recommend-D26pWKxX.js → Recommend-C_P6eNSw.js} +1 -1
  66. package/src/assets/web-panel/assets/{RemoteSession-DCOIaId3.js → RemoteSession-EXH1SbNj.js} +2 -2
  67. package/src/assets/web-panel/assets/{Reputation-DT_AHGAR.js → Reputation-Cxc7d3eU.js} +1 -1
  68. package/src/assets/web-panel/assets/{Row-B50S-1nl.js → Row-EDqJy-wS.js} +1 -1
  69. package/src/assets/web-panel/assets/{RssFeed-BaBnHg3Q.js → RssFeed-C03Xeg9_.js} +2 -2
  70. package/src/assets/web-panel/assets/{Search-BVdnLuuS.js → Search-DsIga9DK.js} +1 -1
  71. package/src/assets/web-panel/assets/{Security-BnacH74J.js → Security-DgArMFc-.js} +3 -3
  72. package/src/assets/web-panel/assets/{Services-CxM08Zch.js → Services-MooDpHBP.js} +2 -2
  73. package/src/assets/web-panel/assets/{Skeleton-DE7CIc1N.js → Skeleton-B10P1Dr6.js} +1 -1
  74. package/src/assets/web-panel/assets/{Skills-CGI0SJmf.js → Skills-DHLHEkLl.js} +1 -1
  75. package/src/assets/web-panel/assets/{Sla-DpEzPcqc.js → Sla-D4RT7d4g.js} +1 -1
  76. package/src/assets/web-panel/assets/{SpeechSettings-CTmnmMHn.js → SpeechSettings-D8u6F-LV.js} +1 -1
  77. package/src/assets/web-panel/assets/{SyncSettings-Dxgrd9hd.js → SyncSettings-4nvNzRq8.js} +2 -2
  78. package/src/assets/web-panel/assets/{Tasks-CW4slS0A.js → Tasks-CmCb8zNO.js} +1 -1
  79. package/src/assets/web-panel/assets/{Templates-DxvGWDgB.js → Templates-CzESIa21.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tenant-_Q0o2tNK.js → Tenant-Ch_N3p4d.js} +1 -1
  81. package/src/assets/web-panel/assets/{Terminal-BTZn8pow.js → Terminal-BZccUf_X.js} +2 -2
  82. package/src/assets/web-panel/assets/{TimelineRenderer-CauL0KFe.js → TimelineRenderer-FrKcNy_3.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tokens-CDoM2qeT.js → Tokens-4xvLpXfD.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trigger-B-QYGEU7.js → Trigger-84UjyxXd.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trust-BD6XJHT-.js → Trust-M6UtHnji.js} +1 -1
  86. package/src/assets/web-panel/assets/{UkeySign-x4TFwCy0.js → UkeySign-L_xEgtCg.js} +1 -1
  87. package/src/assets/web-panel/assets/{VideoEditing-t3imBK_0.js → VideoEditing-BLJCX9ru.js} +1 -1
  88. package/src/assets/web-panel/assets/{Wallet-BCfkWwNC.js → Wallet-DwL6uJCj.js} +4 -4
  89. package/src/assets/web-panel/assets/{WebAuthn-WH314Mdm.js → WebAuthn-Bmn9pdzz.js} +5 -5
  90. package/src/assets/web-panel/assets/{WorkflowEditor-jUlcjrUg.js → WorkflowEditor-DSsZ5xG1.js} +1 -1
  91. package/src/assets/web-panel/assets/{chat-Dg3VASTL.js → chat--FGNUaa8.js} +1 -1
  92. package/src/assets/web-panel/assets/{colors-BNvmBRKE.js → colors-DeuwNdqX.js} +1 -1
  93. package/src/assets/web-panel/assets/{compact-item-BGOfoqf4.js → compact-item-I4XKxRFU.js} +1 -1
  94. package/src/assets/web-panel/assets/{createContext-BNQeqKAs.js → createContext-RoD2p5Ba.js} +1 -1
  95. package/src/assets/web-panel/assets/devWarning-ctnml4IW.js +1 -0
  96. package/src/assets/web-panel/assets/{hasIn-Bg3AjCrq.js → hasIn-BsvyddUM.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-D6UqK83L.js → index-0tRU1Sv-.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-uH2LnAs_.js → index-4xHc2WjT.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-xzaUx19r.js → index-B8-eGLN9.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DYn5DnDk.js → index-BS_uqSTa.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DO0VlNtc.js → index-BYEVBlCl.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DF_FKSVH.js → index-BcBM065G.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CY8cRKHR.js → index-BnrL4s-3.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-COol3xfA.js → index-BrZPb0On.js} +1 -1
  105. package/src/assets/web-panel/assets/index-C7PN8mh1.js +1 -0
  106. package/src/assets/web-panel/assets/{index-BBCMulQ-.js → index-CBazK4-7.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-OUFoxUgH.js → index-CPS3zv1c.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-60AnjUTX.js → index-CSrZiiAs.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-D072oLjp.js → index-CVwZMt9Z.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D_O2ZjPk.js → index-CdgKZYgm.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DcCnO0RU.js → index-CesTu01s.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-7QJUWemf.js → index-CiHlSuMl.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DS04wRll.js → index-CsLVac9n.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Dkp-okWa.js → index-D1ONyBTW.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BmTacaQV.js → index-D4IZsKbF.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BaPvEvB4.js → index-D4P4vpmv.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Co_LnCWD.js → index-D6J8dz7X.js} +1 -1
  118. package/src/assets/web-panel/assets/{index--I3UF5t1.js → index-DChy2sHE.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-B0mgngoB.js → index-DKUCl_Lk.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Cx2EXRfr.js → index-DRluW3_r.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-B_JmInC0.js → index-DWUmhNO-.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DLwEXRrb.js → index-DXnpVGG3.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-fOwii3LP.js → index-DYOpAS6-.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-ZD5Kd8tx.js → index-DiH-3cR2.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-D-mSvCQK.js → index-DlEfwgzr.js} +1 -1
  126. package/src/assets/web-panel/assets/index-KnbBJAO-.js +1 -0
  127. package/src/assets/web-panel/assets/{index-B--0QM0S.js → index-R4St_zjR.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CCFZN66A.js → index-ScgoDU9V.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BSNhW95G.js → index-UWdT_lty.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Cbp-wp-U.js → index-VAlor744.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Bkz1tgFR.js → index-Wco_uvRo.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-pVdQieac.js → index-ZgFED_Zd.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-2D04Zltx.js → index-jaHeti4i.js} +3 -3
  134. package/src/assets/web-panel/assets/{index-hG7jXGEW.js → index-rJDabtw4.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-Wo0f2iqb.js → index-vRiGKIP0.js} +1 -1
  136. package/src/assets/web-panel/assets/{initDefaultProps-B8PN9AxJ.js → initDefaultProps-BHT0PacY.js} +1 -1
  137. package/src/assets/web-panel/assets/{motion-BHivfw5Q.js → motion-CBYsMtsC.js} +1 -1
  138. package/src/assets/web-panel/assets/{move-B0QU5nDd.js → move-DnHfFV4K.js} +1 -1
  139. package/src/assets/web-panel/assets/{mtc-parser-DRwRM3PE.js → mtc-parser-DfGkRYrx.js} +1 -1
  140. package/src/assets/web-panel/assets/{omit-SHt2rV2p.js → omit-SjLcPQA9.js} +1 -1
  141. package/src/assets/web-panel/assets/{pickAttrs-CcmDlEb2.js → pickAttrs-CCZHF4ep.js} +1 -1
  142. package/src/assets/web-panel/assets/{placementArrow-DYatmXDS.js → placementArrow-DjCGn2sJ.js} +1 -1
  143. package/src/assets/web-panel/assets/{responsiveObserve-B7qrsXq5.js → responsiveObserve-BCFCl2on.js} +1 -1
  144. package/src/assets/web-panel/assets/{slide-BRGhlOWd.js → slide-DsfmuIZu.js} +1 -1
  145. package/src/assets/web-panel/assets/{statusUtils-CT-7NXsQ.js → statusUtils-hPKuJUia.js} +1 -1
  146. package/src/assets/web-panel/assets/{styleChecker-rZdw_Yyp.js → styleChecker-DOXKH7Kf.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFlexGapSupport-D8YNIP4P.js → useFlexGapSupport-B_G7yqio.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFs-B8pt0Gu-.js → useFs-BXOTOm2l.js} +1 -1
  149. package/src/assets/web-panel/assets/{usePersonalDataHub-VMmYM1tt.js → usePersonalDataHub-CRvie3g7.js} +1 -1
  150. package/src/assets/web-panel/assets/{vnode-UNDuoPoq.js → vnode-D9_zMmww.js} +1 -1
  151. package/src/assets/web-panel/assets/{zoom-dN-u667S.js → zoom-C4tW03qI.js} +1 -1
  152. package/src/assets/web-panel/index.html +1 -1
  153. package/src/data/changelog.json +13 -0
  154. package/src/lib/artifact-store.js +51 -3
  155. package/src/lib/bounded-artifact-file-read.js +131 -0
  156. package/src/lib/evolution/evolution-artifact-ports.js +209 -129
  157. package/src/lib/evolution/rrsi-history-ledger-adapter.js +25 -0
  158. package/src/lib/evolution/rrsi-installation-route-contracts.js +275 -0
  159. package/src/lib/evolution/rrsi-installation-route-reader.js +282 -0
  160. package/src/lib/evolution/rrsi-observed-text-index.js +978 -0
  161. package/src/lib/evolution/rrsi-registry-runtime-policy.js +648 -0
  162. package/src/lib/evolution/rrsi-registry-store-policy.js +95 -15
  163. package/src/lib/evolution/rrsi-tenant-index-anchor-contracts.js +223 -0
  164. package/src/lib/evolution/rrsi-tenant-index-anchor-history.js +157 -0
  165. package/src/lib/evolution/skill-release-registry.js +20 -5
  166. package/src/lib/process-execution-broker/windows-native-evaluator-capabilities.js +291 -30
  167. package/src/lib/remote-read-loop-guard.js +227 -24
  168. package/src/lib/task-progress-tracker.js +6 -1
  169. package/src/runtime/agent-core.js +71 -23
  170. package/src/assets/web-panel/assets/MarkdownRenderer-Ce-eWK3j.js +0 -1
  171. package/src/assets/web-panel/assets/OrderTableRenderer-GUKQ1xwp.js +0 -1
  172. package/src/assets/web-panel/assets/devWarning-B7_ypN1G.js +0 -1
  173. package/src/assets/web-panel/assets/index-B-jSKJK6.js +0 -1
  174. package/src/assets/web-panel/assets/index-P4FXZJqI.js +0 -1
@@ -0,0 +1,648 @@
1
+ /** Authenticated empty runtime containers; never content-origin admission. */
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { isProxy } from "node:util/types";
5
+ import { inspectPrivatePaths, repairPrivatePath } from "../secure-fs.js";
6
+ import { captureRrsiRegistryStorePolicy } from "./rrsi-registry-store-policy.js";
7
+ import { captureEvolutionLedgerFileBackend } from "./evolution-ledger-file-backend.js";
8
+ import {
9
+ EvolutionArtifactPorts,
10
+ EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
11
+ } from "./evolution-artifact-ports.js";
12
+ import {
13
+ EVOLUTION_LEDGER_MAX_EVENTS,
14
+ EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
15
+ EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
16
+ } from "./evolution-ledger.js";
17
+ import {
18
+ rrsiCanonical,
19
+ rrsiHash,
20
+ rrsiEnvelope,
21
+ rrsiExact,
22
+ rrsiId,
23
+ rrsiFail,
24
+ snapshotRrsiData,
25
+ freezeRrsiData,
26
+ } from "./rrsi-data.js";
27
+
28
+ export const RRSI_REGISTRY_RUNTIME_POLICY_SCHEMA =
29
+ "chainlesschain.rrsi-registry-runtime-policy/v1";
30
+ export const RRSI_REGISTRY_RUNTIME_EVENT_TYPE =
31
+ "rrsi.registry-runtime.initialized";
32
+ export const RRSI_REGISTRY_RUNTIME_ARTIFACT_TYPE =
33
+ "skill-registry-runtime-policy";
34
+ export const RRSI_REGISTRY_RUNTIME_HOLD_CODE =
35
+ "CC_RRSI_REGISTRY_STORE_POLICY_HOLD";
36
+ const EVENT_SCHEMA = "chainlesschain.rrsi-registry-runtime-event/v1";
37
+ const AREAS = [
38
+ "artifacts",
39
+ "active",
40
+ "journals",
41
+ "locks",
42
+ "state-migrations",
43
+ "staging",
44
+ ];
45
+ const PHASES = [
46
+ "prepared",
47
+ ...AREAS.map((name) => `${name}-installed`),
48
+ "committed",
49
+ ];
50
+ const RUNTIMES = new WeakMap();
51
+ const same = (left, right) => rrsiCanonical(left) === rrsiCanonical(right);
52
+ const head = (value) =>
53
+ Object.fromEntries(
54
+ ["ledgerId", "identityDigest", "epoch", "sequence", "headDigest"].map(
55
+ (key) => [key, value[key]],
56
+ ),
57
+ );
58
+ const identity = (stat) => `${stat.dev}:${stat.ino}`;
59
+ function hold(message, cause) {
60
+ try {
61
+ rrsiFail(message, RRSI_REGISTRY_RUNTIME_HOLD_CODE);
62
+ } catch (error) {
63
+ if (cause) error.cause = cause;
64
+ throw error;
65
+ }
66
+ }
67
+ function copyRef(value) {
68
+ return Object.fromEntries(
69
+ ["schema", "ref", "digest"].map((name) => {
70
+ const field = Object.getOwnPropertyDescriptor(value, name);
71
+ if (!field?.enumerable || !("value" in field))
72
+ hold("runtime artifact reference is not original own data");
73
+ return [name, field.value];
74
+ }),
75
+ );
76
+ }
77
+ function own(input, names) {
78
+ if (
79
+ !input ||
80
+ isProxy(input) ||
81
+ Object.getPrototypeOf(input) !== Object.prototype ||
82
+ Reflect.ownKeys(input).length !== names.length
83
+ )
84
+ hold("runtime requires plain own composition fields");
85
+ return Object.fromEntries(
86
+ names.map((name) => {
87
+ const field = Object.getOwnPropertyDescriptor(input, name);
88
+ if (!field?.enumerable || !("value" in field))
89
+ hold("runtime composition cannot use accessors");
90
+ return [name, field.value];
91
+ }),
92
+ );
93
+ }
94
+ function directory(target) {
95
+ // NTFS IDs can exceed Number precision; never round or adopt old projections.
96
+ const stat = fs.lstatSync(target, { bigint: true });
97
+ if (typeof stat.dev !== "bigint" || typeof stat.ino !== "bigint")
98
+ hold("runtime directory identity requires full-precision stat fields");
99
+ const canonical = fs.realpathSync.native(target);
100
+ const equalPath = (left, right) =>
101
+ process.platform === "win32"
102
+ ? left.toLowerCase() === right.toLowerCase()
103
+ : left === right;
104
+ if (
105
+ !stat.isDirectory() ||
106
+ stat.isSymbolicLink() ||
107
+ !equalPath(path.resolve(canonical), target)
108
+ )
109
+ hold("runtime directory must be canonical and non-linked");
110
+ return { path: target, identity: identity(stat) };
111
+ }
112
+ function names(target) {
113
+ const result = [],
114
+ handle = fs.opendirSync(target);
115
+ try {
116
+ for (;;) {
117
+ const entry = handle.readSync();
118
+ if (entry === null) break;
119
+ if (result.length >= 8)
120
+ hold("runtime inventory exceeded its empty-layout bound");
121
+ result.push(entry.name);
122
+ }
123
+ } finally {
124
+ handle.closeSync();
125
+ }
126
+ return result.sort();
127
+ }
128
+ function privateDirectories(entries) {
129
+ if (entries.length === 0) return;
130
+ entries.forEach((entry) => {
131
+ if (!same(directory(entry.path), entry))
132
+ hold("runtime permission boundary identity changed");
133
+ });
134
+ const inspected = inspectPrivatePaths(entries.map((entry) => entry.path));
135
+ if (
136
+ inspected.length !== entries.length ||
137
+ inspected.some((entry) => entry.ok !== true || entry.exists !== true)
138
+ )
139
+ hold(
140
+ "runtime directories require verified owner-only permissions",
141
+ new Error(
142
+ inspected.find((entry) => entry.ok !== true || entry.exists !== true)
143
+ ?.error || "owner-only permission inspection was not successful",
144
+ ),
145
+ );
146
+ entries.forEach((entry) => {
147
+ if (!same(directory(entry.path), entry))
148
+ hold("runtime identity changed during permission inspection");
149
+ });
150
+ }
151
+ function syncDirectory(target) {
152
+ let fd;
153
+ try {
154
+ fd = fs.openSync(target, "r");
155
+ fs.fsyncSync(fd);
156
+ return true;
157
+ } catch (error) {
158
+ if (
159
+ process.platform !== "win32" ||
160
+ !["EACCES", "EINVAL", "EISDIR", "EPERM"].includes(error.code)
161
+ )
162
+ throw error;
163
+ return false;
164
+ } finally {
165
+ if (fd !== undefined) fs.closeSync(fd);
166
+ }
167
+ }
168
+
169
+ export function createRrsiRegistryRuntimePolicy(input) {
170
+ const options = own(input, [
171
+ "storePolicy",
172
+ "backend",
173
+ "artifactPorts",
174
+ "ledgerArtifactResolver",
175
+ ]);
176
+ const policy = captureRrsiRegistryStorePolicy(options.storePolicy);
177
+ const backend = captureEvolutionLedgerFileBackend(options.backend);
178
+ if (
179
+ !policy.matchesBackend(backend) ||
180
+ !policy.matchesArtifactPorts(options.artifactPorts) ||
181
+ !policy.matchesArtifactResolver(options.ledgerArtifactResolver)
182
+ )
183
+ hold(
184
+ "runtime requires the original store policy backend, ports and resolver",
185
+ );
186
+ const ledger = backend.ledger,
187
+ descriptor = freezeRrsiData({
188
+ schema: RRSI_REGISTRY_RUNTIME_POLICY_SCHEMA,
189
+ tenantId: policy.descriptor.tenantId,
190
+ artifactTenantId: policy.descriptor.artifactTenantId,
191
+ audience: policy.descriptor.audience,
192
+ purpose: policy.descriptor.purpose,
193
+ scopeId: `${policy.descriptor.scopeId}.runtime`,
194
+ originAdmissionImplemented: false,
195
+ grantsMutationOrPromotionAuthority: false,
196
+ });
197
+ const methods = Object.fromEntries(
198
+ ["verify", "read", "appendDomainEvent"].map((name) => {
199
+ const method = Object.getOwnPropertyDescriptor(ledger, name)?.value;
200
+ if (typeof method !== "function" || !Object.isFrozen(ledger))
201
+ hold("runtime requires original frozen journal methods");
202
+ return [name, (...args) => Reflect.apply(method, ledger, args)];
203
+ }),
204
+ );
205
+ const eventId = (operationId, phase) =>
206
+ `registry-runtime.${rrsiHash(EVENT_SCHEMA, { operationId, phase }).slice(7)}`;
207
+ const paths = (provision) =>
208
+ Object.fromEntries(
209
+ AREAS.map((name) => [
210
+ name,
211
+ path.join(provision.prepared.release.rootDir, name),
212
+ ]),
213
+ );
214
+ function recordFor(ref, provision) {
215
+ const resolution = Reflect.apply(
216
+ options.ledgerArtifactResolver,
217
+ undefined,
218
+ [
219
+ {
220
+ ledgerId: provision.prepared.journalIdentity.ledgerId,
221
+ epoch: provision.prepared.journalIdentity.epoch,
222
+ ref,
223
+ tenantId: descriptor.artifactTenantId,
224
+ },
225
+ ],
226
+ );
227
+ if (
228
+ resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
229
+ resolution.authenticated !== true ||
230
+ resolution.found !== true ||
231
+ resolution.ref !== ref.ref ||
232
+ resolution.digest !== ref.digest ||
233
+ !Buffer.isBuffer(resolution.bytes) ||
234
+ resolution.bytes.length > 1024 * 1024
235
+ )
236
+ hold("runtime retained artifact cannot be authenticated");
237
+ const stored = snapshotRrsiData(
238
+ JSON.parse(
239
+ new TextDecoder("utf-8", { fatal: true }).decode(resolution.bytes),
240
+ ),
241
+ );
242
+ if (
243
+ stored.schema !== EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA ||
244
+ stored.tenantId !== descriptor.artifactTenantId ||
245
+ stored.audience !== descriptor.audience ||
246
+ stored.purpose !== descriptor.purpose ||
247
+ stored.type !== RRSI_REGISTRY_RUNTIME_ARTIFACT_TYPE ||
248
+ stored.retention !== "ledger" ||
249
+ !Buffer.from(rrsiCanonical(stored)).equals(resolution.bytes)
250
+ )
251
+ hold("runtime artifact bytes or retention scope differ");
252
+ return stored.value;
253
+ }
254
+ function load(operationId) {
255
+ rrsiId(operationId, "provision operation ID");
256
+ for (let attempt = 0; attempt < 3; attempt++) {
257
+ const captured = policy.captureCommittedBoundary(operationId),
258
+ provision = captured.snapshot,
259
+ before = provision.currentHead;
260
+ const events = methods.read({
261
+ afterSequence: 0,
262
+ limit: EVOLUTION_LEDGER_MAX_EVENTS,
263
+ });
264
+ if (!same(before, head(methods.verify()))) continue;
265
+ if (
266
+ events.length !== before.sequence ||
267
+ events.some((event, index) => event.sequence !== index + 1)
268
+ )
269
+ hold("runtime needs complete contiguous history");
270
+ const records = [],
271
+ directories = {},
272
+ fsync = {};
273
+ for (const event of events) {
274
+ if (event.type !== RRSI_REGISTRY_RUNTIME_EVENT_TYPE) continue;
275
+ if (
276
+ records.length >= PHASES.length ||
277
+ event.schema !== EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA ||
278
+ event.tenantId !== descriptor.tenantId ||
279
+ event.artifactTenantId !== descriptor.artifactTenantId ||
280
+ event.correlationId !== descriptor.scopeId ||
281
+ event.skillName !== null ||
282
+ event.decision !== "committed"
283
+ )
284
+ hold("runtime event scope differs");
285
+ const record = recordFor(event.subjectRef, provision),
286
+ previous = records.at(-1);
287
+ const coreNames = [
288
+ "descriptor",
289
+ "operationId",
290
+ "provisionRecordDigest",
291
+ "journalIdentity",
292
+ "phase",
293
+ "previousRecordDigest",
294
+ "observedHead",
295
+ "payload",
296
+ ];
297
+ rrsiExact(
298
+ record,
299
+ [
300
+ "schema",
301
+ ...coreNames,
302
+ "recordDigest",
303
+ "structuralOnly",
304
+ "authenticated",
305
+ "readyForExecution",
306
+ "qualifiesForPromotion",
307
+ ],
308
+ "runtime event record",
309
+ );
310
+ const rebuilt = rrsiEnvelope(
311
+ EVENT_SCHEMA,
312
+ "recordDigest",
313
+ Object.fromEntries(coreNames.map((name) => [name, record[name]])),
314
+ );
315
+ const predecessor = previous
316
+ ? previous.ref
317
+ : provision.records.at(-1).ref;
318
+ if (
319
+ !same(record, rebuilt) ||
320
+ !same(record.descriptor, descriptor) ||
321
+ record.operationId !== operationId ||
322
+ record.provisionRecordDigest !==
323
+ provision.records.at(-1).recordDigest ||
324
+ !same(record.journalIdentity, provision.prepared.journalIdentity) ||
325
+ record.phase !== PHASES[records.length] ||
326
+ record.previousRecordDigest !==
327
+ (previous?.record.recordDigest ?? null) ||
328
+ !same(record.observedHead, {
329
+ ...provision.prepared.journalIdentity,
330
+ sequence: event.sequence - 1,
331
+ headDigest: event.prevDigest,
332
+ }) ||
333
+ event.eventId !== eventId(operationId, record.phase) ||
334
+ !same(event.sourceRefs.map(copyRef), [predecessor]) ||
335
+ event.sequence <= provision.records.at(-1).sequence
336
+ )
337
+ hold("runtime phase, original provisioning or predecessor differs");
338
+ if (record.phase === "prepared") {
339
+ if (!same(record.payload, { paths: paths(provision) }))
340
+ hold("runtime prepared paths differ");
341
+ } else if (record.phase === "committed") {
342
+ if (
343
+ !same(record.payload, {
344
+ directories,
345
+ directoryFsyncVerified: fsync,
346
+ })
347
+ )
348
+ hold("runtime committed inventory differs");
349
+ } else {
350
+ const name = AREAS[records.length - 1],
351
+ entry = record.payload;
352
+ rrsiExact(
353
+ entry,
354
+ ["name", "directory", "directoryFsyncVerified"],
355
+ "runtime installed directory",
356
+ );
357
+ rrsiExact(
358
+ entry.directory,
359
+ ["path", "identity"],
360
+ "runtime directory identity",
361
+ );
362
+ if (
363
+ entry.name !== name ||
364
+ entry.directory.path !== paths(provision)[name] ||
365
+ !/^[0-9]+:[0-9]+$/u.test(entry.directory.identity) ||
366
+ typeof entry.directoryFsyncVerified !== "boolean" ||
367
+ [
368
+ ...provision.prepared.directories,
369
+ ...Object.values(directories),
370
+ ].some((value) => value.identity === entry.directory.identity)
371
+ )
372
+ hold("runtime directory identity or order differs");
373
+ directories[name] = entry.directory;
374
+ fsync[name] = entry.directoryFsyncVerified;
375
+ }
376
+ records.push({
377
+ record,
378
+ ref: copyRef(event.subjectRef),
379
+ sequence: event.sequence,
380
+ });
381
+ }
382
+ const after = captured.recheck();
383
+ if (!same(before, after.currentHead)) continue;
384
+ return {
385
+ provision: after,
386
+ recheckBoundary: captured.recheck,
387
+ head: before,
388
+ records,
389
+ directories,
390
+ fsync,
391
+ };
392
+ }
393
+ hold("runtime journal changed repeatedly during readback");
394
+ }
395
+ function layout(state, ownDirectory = null) {
396
+ const original = state.provision,
397
+ current = state.recheckBoundary();
398
+ if (!same(current.currentHead, state.head))
399
+ hold("runtime head changed after authenticated state capture");
400
+ if (
401
+ !same(original.prepared, current.prepared) ||
402
+ !same(original.markers, current.markers) ||
403
+ !same(original.records, current.records)
404
+ )
405
+ hold("runtime original provisioning changed");
406
+ const prepared = current.prepared,
407
+ all = {
408
+ ...state.directories,
409
+ ...(ownDirectory
410
+ ? { [ownDirectory.name]: ownDirectory.directory }
411
+ : {}),
412
+ };
413
+ for (const entry of prepared.directories) {
414
+ const expected = prepared.directories
415
+ .filter((other) => path.dirname(other.path) === entry.path)
416
+ .map((other) => path.basename(other.path));
417
+ if (
418
+ [prepared.candidate.rootDir, prepared.release.rootDir].includes(
419
+ entry.path,
420
+ )
421
+ )
422
+ expected.push("_tenant.json");
423
+ if (entry.path === prepared.release.rootDir)
424
+ expected.push(...Object.keys(all));
425
+ if (!same(names(entry.path), expected.sort()))
426
+ hold(
427
+ "runtime inventory contains unknown or unrecorded directories/content",
428
+ );
429
+ }
430
+ for (const entry of Object.values(all))
431
+ if (!same(directory(entry.path), entry) || names(entry.path).length !== 0)
432
+ hold(
433
+ "runtime registered directory changed or contains business content",
434
+ );
435
+ for (const entry of Object.values(all))
436
+ if (!same(directory(entry.path), entry))
437
+ hold("runtime directory identity changed during inventory read");
438
+ const after = state.recheckBoundary();
439
+ if (
440
+ !same(after.markers, current.markers) ||
441
+ !same(after.currentHead, state.head)
442
+ )
443
+ hold("runtime marker or journal changed during inventory read");
444
+ return after;
445
+ }
446
+ function append(state, phase, payload, assertOwnership, ownDirectory = null) {
447
+ assertOwnership();
448
+ const current = layout(state, ownDirectory);
449
+ const previous = state.records.at(-1),
450
+ operationId = current.operationId;
451
+ const record = rrsiEnvelope(EVENT_SCHEMA, "recordDigest", {
452
+ descriptor,
453
+ operationId,
454
+ provisionRecordDigest: current.records.at(-1).recordDigest,
455
+ journalIdentity: current.prepared.journalIdentity,
456
+ phase,
457
+ previousRecordDigest: previous?.record.recordDigest ?? null,
458
+ observedHead: current.currentHead,
459
+ payload,
460
+ });
461
+ assertOwnership();
462
+ const publication = Reflect.apply(
463
+ EvolutionArtifactPorts.prototype.putCanonical,
464
+ options.artifactPorts,
465
+ [
466
+ RRSI_REGISTRY_RUNTIME_ARTIFACT_TYPE,
467
+ record,
468
+ {
469
+ audience: descriptor.audience,
470
+ purpose: descriptor.purpose,
471
+ retention: "ledger",
472
+ },
473
+ ],
474
+ );
475
+ if (
476
+ publication?.receipt?.persisted !== true ||
477
+ publication.receipt.integrityVerified !== true ||
478
+ publication.receipt.readbackVerified !== true ||
479
+ publication.receipt.retention !== "ledger" ||
480
+ !same(recordFor(publication.ref, current), record)
481
+ )
482
+ hold("runtime artifact was not retained exactly");
483
+ assertOwnership();
484
+ layout(state, ownDirectory);
485
+ privateDirectories([
486
+ ...Object.values(state.directories),
487
+ ...(ownDirectory ? [ownDirectory.directory] : []),
488
+ ]);
489
+ layout(state, ownDirectory);
490
+ assertOwnership();
491
+ try {
492
+ const receipt = methods.appendDomainEvent(
493
+ {
494
+ type: RRSI_REGISTRY_RUNTIME_EVENT_TYPE,
495
+ eventId: eventId(operationId, phase),
496
+ tenantId: descriptor.tenantId,
497
+ artifactTenantId: descriptor.artifactTenantId,
498
+ correlationId: descriptor.scopeId,
499
+ skillName: null,
500
+ decision: "committed",
501
+ reason:
502
+ "Authenticated empty runtime initialization; origin and business admission remain unavailable",
503
+ sourceRefs: [previous ? previous.ref : current.records.at(-1).ref],
504
+ subjectRef: copyRef(publication.ref),
505
+ },
506
+ {
507
+ expectedHeadDigest: current.currentHead.headDigest,
508
+ expectedSequence: current.currentHead.sequence,
509
+ },
510
+ );
511
+ if (receipt?.authenticated !== true || receipt.durable !== true)
512
+ hold("runtime commit receipt is uncertain");
513
+ } catch (cause) {
514
+ throw Object.assign(
515
+ new Error(
516
+ "runtime commit is uncertain; recover the original operation",
517
+ { cause },
518
+ ),
519
+ { code: "CC_RRSI_REGISTRY_RUNTIME_COMMIT_UNKNOWN", operationId },
520
+ );
521
+ }
522
+ assertOwnership();
523
+ const readback = load(operationId);
524
+ if (readback.records.at(-1)?.record.recordDigest !== record.recordDigest)
525
+ hold("runtime phase cannot be read back");
526
+ layout(readback);
527
+ return readback;
528
+ }
529
+ function read(operationId) {
530
+ try {
531
+ const state = load(operationId);
532
+ if (state.records.length !== PHASES.length)
533
+ hold("runtime initialization is unregistered or incomplete");
534
+ const current = layout(state);
535
+ return freezeRrsiData({
536
+ schema: "chainlesschain.rrsi-registry-runtime-readback/v1",
537
+ operationId,
538
+ directories: state.directories,
539
+ directoryFsyncVerified: state.fsync,
540
+ committedRecordDigest: state.records.at(-1).record.recordDigest,
541
+ currentHead: current.currentHead,
542
+ historyAuthenticated: true,
543
+ runtimeDirectoryIdentityAuthenticated: true,
544
+ originCutoverAuthenticated: false,
545
+ grantsMutationOrPromotionAuthority: false,
546
+ });
547
+ } catch (cause) {
548
+ if (["ENOENT", "ENOTDIR"].includes(cause?.code))
549
+ hold("an authenticated runtime boundary is missing", cause);
550
+ throw cause;
551
+ }
552
+ }
553
+ function initialize(operationId) {
554
+ rrsiId(operationId, "provision operation ID");
555
+ try {
556
+ return policy.maintain((assertOwnership) => {
557
+ let state = load(operationId);
558
+ layout(state);
559
+ privateDirectories([
560
+ state.provision.prepared.parent,
561
+ ...state.provision.prepared.directories,
562
+ ...Object.values(state.directories),
563
+ ]);
564
+ layout(state);
565
+ if (state.records.length === PHASES.length) return read(operationId);
566
+ if (state.records.length === 0)
567
+ state = append(
568
+ state,
569
+ "prepared",
570
+ { paths: paths(state.provision) },
571
+ assertOwnership,
572
+ );
573
+ while (Object.keys(state.directories).length < AREAS.length) {
574
+ const name = AREAS[Object.keys(state.directories).length],
575
+ target = paths(state.provision)[name];
576
+ assertOwnership();
577
+ layout(state);
578
+ assertOwnership();
579
+ fs.mkdirSync(target, { mode: 0o700 });
580
+ const entry = directory(target),
581
+ ownDirectory = { name, directory: entry };
582
+ assertOwnership();
583
+ layout(state, ownDirectory);
584
+ assertOwnership();
585
+ repairPrivatePath(target, {
586
+ failIfUnavailable: true,
587
+ applyWindowsAcl: true,
588
+ });
589
+ privateDirectories([entry]);
590
+ assertOwnership();
591
+ layout(state, ownDirectory);
592
+ assertOwnership();
593
+ const flushed = syncDirectory(
594
+ state.provision.prepared.release.rootDir,
595
+ );
596
+ state = append(
597
+ state,
598
+ `${name}-installed`,
599
+ { ...ownDirectory, directoryFsyncVerified: flushed },
600
+ assertOwnership,
601
+ ownDirectory,
602
+ );
603
+ }
604
+ state = append(
605
+ state,
606
+ "committed",
607
+ {
608
+ directories: state.directories,
609
+ directoryFsyncVerified: state.fsync,
610
+ },
611
+ assertOwnership,
612
+ );
613
+ assertOwnership();
614
+ return read(operationId);
615
+ });
616
+ } catch (cause) {
617
+ if (["ENOENT", "ENOTDIR"].includes(cause?.code))
618
+ hold("an authenticated runtime boundary is missing", cause);
619
+ throw cause;
620
+ }
621
+ }
622
+ const runtime = Object.freeze({
623
+ descriptor,
624
+ initialize,
625
+ recover: initialize,
626
+ read,
627
+ });
628
+ RUNTIMES.set(
629
+ runtime,
630
+ Object.freeze({
631
+ descriptor,
632
+ read,
633
+ matchesPolicy: (value) => value === options.storePolicy,
634
+ verifyPrivateDirectories(operationId) {
635
+ const current = read(operationId);
636
+ privateDirectories(Object.values(current.directories));
637
+ return read(operationId);
638
+ },
639
+ }),
640
+ );
641
+ return runtime;
642
+ }
643
+
644
+ export function captureRrsiRegistryRuntimePolicy(value) {
645
+ const reader = RUNTIMES.get(value);
646
+ if (!reader) hold("a genuine Registry runtime attachment is required");
647
+ return reader;
648
+ }