chainlesschain 0.166.117 → 0.166.121

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 (195) hide show
  1. package/README.md +36 -4
  2. package/package.json +3 -3
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/.build-hash +1 -1
  6. package/src/assets/web-panel/assets/{AIOps-C9tSCImB.js → AIOps-DYEi6MCC.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-CXKExmT_.js → ActionButton-kLXp42k3.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-DE8WBWHo.js → Analytics-BOgKma-R.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-BdpwNM08.js → AppLayout-D8z-uRpv.js} +5 -5
  10. package/src/assets/web-panel/assets/{Artifacts-94TQpe38.js → Artifacts-TFX0t24T.js} +1 -1
  11. package/src/assets/web-panel/assets/{Audit-DdDEv5Ej.js → Audit-GjRCAv0V.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-TU9nlV7j.js → BackgroundAgents-CpQcMxi1.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-C0GPoUUq.js → Backup-BuQNWrhT.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-iyrVn2I6.js → BaseInput-QuOtSaFy.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-Dqo8spwp.js → Chat-BC0W1L_3.js} +5 -5
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CDqHSzc4.js → ChatBubbleRenderer-B6SagRW5.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-BF_XJvQi.js → Checkbox-BsdQ1Ku0.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-5tUWoOa9.js → Codegen-CPsAAoqV.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-BQxSeRvG.js → Col-C9LgCMN0.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-B2Ra7w-J.js → Community-Xj0vGvD5.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-GjxJwlr0.js → Compact-CXoqTgrf.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-BTUP6RTA.js → Compliance-CeshjrVy.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-DiwfL16s.js → Cowork-DjXRRrg1.js} +3 -3
  24. package/src/assets/web-panel/assets/{Cron-1ceOo5ux.js → Cron-vGoU419C.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-aHYxLu0u.js → Crosschain-DZaChZ5s.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-eeTjzOLV.js → DID-BojMQqQM.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-CT3fpkvX.js → Dashboard-pKAYt4UL.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-B3UpOy-N.js → Dropdown-CqJa8N05.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-Ba2Rvoru.js → EmailListRenderer-fZ4_KAvw.js} +1 -1
  30. package/src/assets/web-panel/assets/{EvolutionSettings-CGtn93on.js → EvolutionSettings-C3kenWes.js} +1 -1
  31. package/src/assets/web-panel/assets/{FamilyGuardDashboard-C0IUdHQt.js → FamilyGuardDashboard-B3tqj1Hu.js} +1 -1
  32. package/src/assets/web-panel/assets/{Federation-1QIDwemn.js → Federation-CS1M1oJN.js} +1 -1
  33. package/src/assets/web-panel/assets/{FormItemContext-NGbSsdje.js → FormItemContext-C5q-KYPu.js} +1 -1
  34. package/src/assets/web-panel/assets/{GenericCardRenderer-DzVZc2Ba.js → GenericCardRenderer-Bl43BLxD.js} +1 -1
  35. package/src/assets/web-panel/assets/{Git-B_1TDbSr.js → Git-BiN2Uo-z.js} +2 -2
  36. package/src/assets/web-panel/assets/{Governance-BDl_ySyI.js → Governance-weglJWG4.js} +1 -1
  37. package/src/assets/web-panel/assets/{Inference-CAp-wcCK.js → Inference-B4qBxVSK.js} +1 -1
  38. package/src/assets/web-panel/assets/{KnowledgeGraph-DRjRcxul.js → KnowledgeGraph-iePl1vLv.js} +1 -1
  39. package/src/assets/web-panel/assets/Logs-t2lKo4HX.js +2 -0
  40. package/src/assets/web-panel/assets/MarkdownRenderer-CxSrBHYC.js +1 -0
  41. package/src/assets/web-panel/assets/{Marketplace-DfiXL6UO.js → Marketplace-D0Y_OmXs.js} +1 -1
  42. package/src/assets/web-panel/assets/{McpTools-D9rIvFjN.js → McpTools-B7zxPsFE.js} +3 -3
  43. package/src/assets/web-panel/assets/{Memory-D-p7yDzj.js → Memory-DDpmVHpl.js} +2 -2
  44. package/src/assets/web-panel/assets/{MobileBridge-D0XT5B6m.js → MobileBridge-BLXNdKH0.js} +1 -1
  45. package/src/assets/web-panel/assets/{MobileProjects-CL9cHVIk.js → MobileProjects-CF6DqNfk.js} +1 -1
  46. package/src/assets/web-panel/assets/{Mtc-CME4kDmC.js → Mtc-7OFckDUe.js} +4 -4
  47. package/src/assets/web-panel/assets/{MtcAudit-BjGOXFnn.js → MtcAudit-2QFWPXVR.js} +4 -4
  48. package/src/assets/web-panel/assets/{Multisig-CSzc53e0.js → Multisig-D9opE0iP.js} +3 -3
  49. package/src/assets/web-panel/assets/{NLProgramming-BYjZnaH8.js → NLProgramming-jOD2E7Rs.js} +1 -1
  50. package/src/assets/web-panel/assets/{Notes-BUPOYE0C.js → Notes-CgtysN6L.js} +3 -3
  51. package/src/assets/web-panel/assets/{NotificationSettings-BK8YADru.js → NotificationSettings-Itz3X5DM.js} +1 -1
  52. package/src/assets/web-panel/assets/OrderTableRenderer-C2ylWgSI.js +1 -0
  53. package/src/assets/web-panel/assets/{Organization-B0WNlhMd.js → Organization-CKgpbSoy.js} +4 -4
  54. package/src/assets/web-panel/assets/{Overflow-CED6ZO87.js → Overflow-C0Pi9LvB.js} +1 -1
  55. package/src/assets/web-panel/assets/{P2P-CBdc8fkP.js → P2P-DdIDorai.js} +2 -2
  56. package/src/assets/web-panel/assets/{PdhVaultBrowser-DuauYi03.js → PdhVaultBrowser-DVJz6cGr.js} +4 -4
  57. package/src/assets/web-panel/assets/{Permissions-kfgY0ukN.js → Permissions-D19dtcL0.js} +4 -4
  58. package/src/assets/web-panel/assets/{PersonalDataHub-CDY3I1Do.js → PersonalDataHub-A-QMQUJW.js} +5 -5
  59. package/src/assets/web-panel/assets/{Pipeline-B9x0wKSK.js → Pipeline-7YF1yhkH.js} +1 -1
  60. package/src/assets/web-panel/assets/{Privacy-Cqhcr_Qv.js → Privacy-CcsoAU7d.js} +1 -1
  61. package/src/assets/web-panel/assets/{ProjectInit-CFhoyo57.js → ProjectInit-CMU0Z5in.js} +2 -2
  62. package/src/assets/web-panel/assets/{ProjectSettings-DCBjV2Hm.js → ProjectSettings-D3l0RXK6.js} +2 -2
  63. package/src/assets/web-panel/assets/Projects-BCcHN_fQ.js +1 -0
  64. package/src/assets/web-panel/assets/{Providers-BuCIWZY1.js → Providers-DB0pw3DM.js} +1 -1
  65. package/src/assets/web-panel/assets/{QrScannerModal-CEXNL5CB.js → QrScannerModal-SVvLX_VH.js} +1 -1
  66. package/src/assets/web-panel/assets/{QuickAsk-DgK8aLAU.js → QuickAsk-B4dJgwL4.js} +1 -1
  67. package/src/assets/web-panel/assets/{Recommend-BxEYQRAs.js → Recommend-9GxSlYt5.js} +1 -1
  68. package/src/assets/web-panel/assets/{RemoteSession-PRsxNsYU.js → RemoteSession-C5vzfpTM.js} +2 -2
  69. package/src/assets/web-panel/assets/{Reputation-S-tQH70r.js → Reputation-7AeSkJz1.js} +1 -1
  70. package/src/assets/web-panel/assets/{Row-U1Ws3CJl.js → Row-Dc3RwqWR.js} +1 -1
  71. package/src/assets/web-panel/assets/{RssFeed-BftCyeii.js → RssFeed-Y8iSgp9o.js} +3 -3
  72. package/src/assets/web-panel/assets/{Search-o4gK0cPy.js → Search-bxkz-UtW.js} +1 -1
  73. package/src/assets/web-panel/assets/{Security-U2ZRpsbA.js → Security-cs5yf-AE.js} +3 -3
  74. package/src/assets/web-panel/assets/{Services-D0tRjWl_.js → Services-2va9CJFi.js} +2 -2
  75. package/src/assets/web-panel/assets/{Skeleton-DzZ8TFsB.js → Skeleton-n8HOSPcE.js} +1 -1
  76. package/src/assets/web-panel/assets/{Skills-B1cC7rju.js → Skills-BcV5aWYc.js} +1 -1
  77. package/src/assets/web-panel/assets/{Sla-CtIHOR0J.js → Sla-B73zPlDG.js} +1 -1
  78. package/src/assets/web-panel/assets/{SpeechSettings-CD8ZlQpW.js → SpeechSettings-OhhEZsxi.js} +1 -1
  79. package/src/assets/web-panel/assets/{SyncSettings-BilFQWQk.js → SyncSettings-4HT8618-.js} +2 -2
  80. package/src/assets/web-panel/assets/{Tasks-Bmg2qLXl.js → Tasks-Dw7nEG94.js} +1 -1
  81. package/src/assets/web-panel/assets/{Templates-D6yofyC1.js → Templates-BX7zHI9M.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tenant-BzttD-Gp.js → Tenant-SrFN1ZTF.js} +1 -1
  83. package/src/assets/web-panel/assets/{Terminal-DyRXeYuH.js → Terminal-B-ohas9S.js} +3 -3
  84. package/src/assets/web-panel/assets/{TimelineRenderer-Bdmkx-Tr.js → TimelineRenderer-exEpcIMD.js} +1 -1
  85. package/src/assets/web-panel/assets/{Tokens-10RcVAVJ.js → Tokens-Fucr0-Ek.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trigger-CKV-9DdV.js → Trigger-CPlH4qBU.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trust-BEc-sW1q.js → Trust-DCNisGxI.js} +1 -1
  88. package/src/assets/web-panel/assets/{UkeySign-BSql8piX.js → UkeySign-Crf4bea0.js} +1 -1
  89. package/src/assets/web-panel/assets/{VideoEditing-C4OH2f4s.js → VideoEditing-JAq5jURW.js} +1 -1
  90. package/src/assets/web-panel/assets/{Wallet-BSSvWKmv.js → Wallet-BaOfcyqF.js} +4 -4
  91. package/src/assets/web-panel/assets/{WebAuthn-LxIzXo9d.js → WebAuthn-DMtCTRsk.js} +5 -5
  92. package/src/assets/web-panel/assets/{WorkflowEditor-DWwdfcte.js → WorkflowEditor-BAKiA5p0.js} +1 -1
  93. package/src/assets/web-panel/assets/{addon-fit-CK6X9sAG.js → addon-fit-CbkjSUJl.js} +1 -1
  94. package/src/assets/web-panel/assets/{chat-DWxYYLD5.js → chat-D3MA12Z1.js} +1 -1
  95. package/src/assets/web-panel/assets/{colors-BxEcQqtg.js → colors-C7xYOAG-.js} +1 -1
  96. package/src/assets/web-panel/assets/{compact-item-DNbezFOJ.js → compact-item-ClybpIV-.js} +1 -1
  97. package/src/assets/web-panel/assets/{createContext-DaJXc5nx.js → createContext-Dyp-8LSs.js} +1 -1
  98. package/src/assets/web-panel/assets/devWarning-CTazgK0z.js +1 -0
  99. package/src/assets/web-panel/assets/{hasIn-BMrw3sg3.js → hasIn-D4xsaFD1.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-Cm9DYzhC.js → index-B-eU0wCl.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BaByEdBj.js → index-B7jiI-31.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-T4T84G6X.js → index-BKyEhMUl.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-LRb0QX6S.js → index-BMybVxE3.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-Dwg38xTG.js → index-BagQvwmy.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Bum_aSyd.js → index-BcmJBS7G.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BCCd8Rj6.js → index-BfZW-iaH.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-B9b6UaZl.js → index-BmBqpU1f.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-6W0V5G2t.js → index-Bn8O_DC1.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BR4nWOmR.js → index-BpLWtYzy.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-2c0bL3SE.js → index-CHJUN9dR.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DpSp97J8.js → index-CNBhQp0_.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DEvdSKT4.js → index-CS7E_bsQ.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BNZDGV2q.js → index-CSOgUWox.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-VD-dTYQE.js → index-CiRxc4Y0.js} +1 -1
  115. package/src/assets/web-panel/assets/index-CrZlBv0O.js +1 -0
  116. package/src/assets/web-panel/assets/{index-CpwgF7vh.js → index-CvsWZZzU.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BcuytRTa.js → index-Cvwa0445.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-B_b9_6wQ.js → index-CxSVA3yj.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CaxzeSIM.js → index-D5aA2hc_.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-cCqCEa9X.js → index-D6ETHrUX.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-DzZHBzCb.js → index-D6GFzqYv.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-hPy_f08G.js → index-DDDP6-gb.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-NEW5EN2w.js → index-DJVzi25x.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Dr18agDl.js → index-DMlcfkHz.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DarVV5yG.js → index-DNeHM7F3.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-7zzLqfvI.js → index-DT57ltH_.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BAV07GDK.js → index-DWHngGhj.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-cKBpcInt.js → index-DuGdqMTo.js} +1 -1
  129. package/src/assets/web-panel/assets/index-DyNp52Uj.js +1 -0
  130. package/src/assets/web-panel/assets/{index-CL-36X3A.js → index-KvhXXaLi.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CiEdfbB9.js → index-Rk6e-ajq.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-rFaCnjXi.js → index-ZmHm5rHI.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-IX0g0s2t.js → index-_9loRV63.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-C25ig6EV.js → index-avRJM_PM.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-Bs2QyMPQ.js → index-ciHSB-CC.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-pzYLf5qu.js → index-faSaFsUp.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-DL0k35f0.js → index-nV4PAkOC.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-Ca2hwPMo.js → index-v5sQDXJx.js} +1 -1
  139. package/src/assets/web-panel/assets/{initDefaultProps-BWVLgWhF.js → initDefaultProps-xrojGNIo.js} +1 -1
  140. package/src/assets/web-panel/assets/{markdown-Yo_c6Krv.js → markdown-Bq2x0XsR.js} +1 -1
  141. package/src/assets/web-panel/assets/markdown-DUKxbhE4.js +51 -0
  142. package/src/assets/web-panel/assets/{motion-KJZ1xfDE.js → motion-DzhD1BmE.js} +1 -1
  143. package/src/assets/web-panel/assets/{move-DGqU6H7M.js → move-BAq6xac8.js} +1 -1
  144. package/src/assets/web-panel/assets/{mtc-parser-Dg0xkI5J.js → mtc-parser-CbbkHqsY.js} +1 -1
  145. package/src/assets/web-panel/assets/{omit-B6RnMJAQ.js → omit-DvK7nt_t.js} +1 -1
  146. package/src/assets/web-panel/assets/{pickAttrs-Ctw2i3jb.js → pickAttrs-B8N30ZEF.js} +1 -1
  147. package/src/assets/web-panel/assets/{placementArrow-D3F3x8Jm.js → placementArrow-cUxaRoU7.js} +1 -1
  148. package/src/assets/web-panel/assets/{responsiveObserve-W6eHE0nM.js → responsiveObserve-CxMioios.js} +1 -1
  149. package/src/assets/web-panel/assets/{slide-BlFf8sY5.js → slide-CQx7R0mc.js} +1 -1
  150. package/src/assets/web-panel/assets/{statusUtils-Cd6LMwmy.js → statusUtils-kUphM3-c.js} +1 -1
  151. package/src/assets/web-panel/assets/{styleChecker-Bg5-U4Y1.js → styleChecker-BrGZ1xWq.js} +1 -1
  152. package/src/assets/web-panel/assets/{useFlexGapSupport-DTkLS3tn.js → useFlexGapSupport-Sb5Vj_ag.js} +1 -1
  153. package/src/assets/web-panel/assets/{useFs-CwYGzoBt.js → useFs-DrMnDCO5.js} +1 -1
  154. package/src/assets/web-panel/assets/{usePersonalDataHub-PCgFQXZP.js → usePersonalDataHub-C48ZIkOr.js} +1 -1
  155. package/src/assets/web-panel/assets/{vnode-CJM7MkrB.js → vnode-BQP6PZY_.js} +1 -1
  156. package/src/assets/web-panel/assets/{xterm-BZcWGsqw.js → xterm-zbskxxGA.js} +1 -1
  157. package/src/assets/web-panel/assets/{zoom-CP0mgaFi.js → zoom-DOJny9bH.js} +1 -1
  158. package/src/assets/web-panel/index.html +1 -1
  159. package/src/data/changelog.json +28 -2
  160. package/src/harness/jsonl-session-store.js +2 -1
  161. package/src/lib/artifact-store.js +129 -20
  162. package/src/lib/bounded-artifact-file-read.js +128 -46
  163. package/src/lib/evolution/agent-evolution-ingress.js +41 -7
  164. package/src/lib/evolution/agent-evolution-runtime-composition.js +65 -27
  165. package/src/lib/evolution/evidence-json-text.js +124 -8
  166. package/src/lib/evolution/evolution-artifact-ports.js +1005 -83
  167. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +59 -15
  168. package/src/lib/evolution/evolution-evidence-projector.js +59 -3
  169. package/src/lib/evolution/evolution-evidence-storage-layout.js +115 -0
  170. package/src/lib/evolution/evolution-file-witness.js +7 -3
  171. package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +6 -2
  172. package/src/lib/evolution/evolution-ledger-file-manifest-head-store.js +6 -2
  173. package/src/lib/evolution/evolution-ledger.js +226 -55
  174. package/src/lib/evolution/evolution-private-storage.js +20 -0
  175. package/src/lib/evolution/evolution-run-ledger-adapter.js +298 -11
  176. package/src/lib/evolution/evolution-windows-directory-durability.js +215 -32
  177. package/src/lib/evolution/local-ui-evolution-runtime.js +3 -38
  178. package/src/lib/evolution/local-ui-signing-authority.js +69 -0
  179. package/src/lib/ollama-provider-fetch.js +33 -0
  180. package/src/lib/provider-stream.js +14 -13
  181. package/src/lib/session-history-origins.js +71 -32
  182. package/src/lib/session-message-provenance.js +26 -2
  183. package/src/lib/session-runtime-retention.js +10 -1
  184. package/src/lib/session-transcript-migration.js +67 -12
  185. package/src/lib/storage-failure-cause-codes.js +449 -0
  186. package/src/runtime/agent-core.js +54 -33
  187. package/src/runtime/headless-stream.js +89 -10
  188. package/src/assets/web-panel/assets/Logs-qSuwMwk7.js +0 -2
  189. package/src/assets/web-panel/assets/MarkdownRenderer-BgnYTegK.js +0 -1
  190. package/src/assets/web-panel/assets/OrderTableRenderer-B5F8bnWt.js +0 -1
  191. package/src/assets/web-panel/assets/Projects-C51w0LnM.js +0 -1
  192. package/src/assets/web-panel/assets/devWarning-CRyXoGo9.js +0 -1
  193. package/src/assets/web-panel/assets/index-C-W0Ntk_.js +0 -1
  194. package/src/assets/web-panel/assets/index-CCk_qhBx.js +0 -1
  195. package/src/assets/web-panel/assets/markdown-CsiA8-E5.js +0 -50
@@ -16,6 +16,7 @@ import {
16
16
  } from "../secure-fs.js";
17
17
  import { withFileLock } from "../with-file-lock.js";
18
18
  import { isLocalUiEvolutionFileSystem } from "./evolution-windows-directory-durability.js";
19
+ import { isProductionEvolutionFileSystem } from "./evolution-private-storage.js";
19
20
  import {
20
21
  assertKnowledgeWikiSourceAdmission,
21
22
  WIKI_SOURCE_ADMISSION_INVALID_CODE,
@@ -65,6 +66,8 @@ export const EVOLUTION_LEDGER_V2_CUTOVER_COMPLETED =
65
66
  "evolution.ledger-v2.cutover-completed";
66
67
  const MIGRATION_SOURCES = new WeakMap();
67
68
  const DIRECTORY_BOUNDARIES = new WeakMap();
69
+ const VERIFIED_HISTORY_READERS = new WeakMap();
70
+ const DEFAULT_APPEND_PORTS = new WeakSet();
68
71
 
69
72
  const IDENTITY_DOMAIN = "chainlesschain.evolution-ledger-identity/v1\0";
70
73
  const EVENT_DOMAIN = "chainlesschain.evolution-event/v2\0";
@@ -1684,6 +1687,11 @@ const PHYSICAL_DIRECTORY_FIELDS = Object.freeze([
1684
1687
  "gid",
1685
1688
  ]);
1686
1689
  const physicalBirthtime = (stat) => artifactPhysicalIdentity(stat).birthtimeMs;
1690
+ const physicalFileFingerprint = (stat) =>
1691
+ [
1692
+ ...PHYSICAL_FILE_FIELDS.map((field) => String(stat[field])),
1693
+ String(stat.birthtimeNs ?? physicalBirthtime(stat)),
1694
+ ].join(":");
1687
1695
  const samePhysicalFile = (left, right) =>
1688
1696
  PHYSICAL_FILE_FIELDS.every((field) => left[field] === right[field]) &&
1689
1697
  physicalBirthtime(left) === physicalBirthtime(right);
@@ -1713,6 +1721,16 @@ function assertPhysicalFile(stat, maximum, label) {
1713
1721
  }
1714
1722
  }
1715
1723
 
1724
+ function assertWindowsAclPhysicalFile(stat, label) {
1725
+ assertPhysicalFile(stat, Number.MAX_SAFE_INTEGER, label);
1726
+ if (typeof stat.birthtimeNs !== "bigint") {
1727
+ throw ledgerError(
1728
+ "CC_EVOLUTION_LEDGER_CORRUPT",
1729
+ `${label} requires full-precision creation time`,
1730
+ );
1731
+ }
1732
+ }
1733
+
1716
1734
  function physicalDirectoryIdentity(stat) {
1717
1735
  if (
1718
1736
  PHYSICAL_DIRECTORY_FIELDS.some(
@@ -1946,6 +1964,7 @@ export class EvolutionLedger {
1946
1964
  #lockTimeoutMs;
1947
1965
  #localUiWindowsDurability;
1948
1966
  #pendingWindowsAclFiles;
1967
+ #productionFs;
1949
1968
  #paths;
1950
1969
  #random;
1951
1970
  #secure;
@@ -2011,6 +2030,7 @@ export class EvolutionLedger {
2011
2030
  this.#localUiWindowsDurability =
2012
2031
  process.platform === "win32" && isLocalUiEvolutionFileSystem(fsImpl);
2013
2032
  this.#pendingWindowsAclFiles = new Map();
2033
+ this.#productionFs = isProductionEvolutionFileSystem(fsImpl);
2014
2034
  this.#fs = captureFs(fsImpl);
2015
2035
  // Identity helpers only open parent/volume directories through this port.
2016
2036
  this.#identityFs = Object.freeze({
@@ -2069,22 +2089,51 @@ export class EvolutionLedger {
2069
2089
  requestedPaths.anchorDir,
2070
2090
  ];
2071
2091
  if (this.#secure && this.#localUiWindowsDurability) {
2072
- const roots = [
2073
- requestedPaths.rootDir,
2074
- requestedPaths.authorityRootDir,
2075
- ];
2076
- const children = [
2077
- requestedPaths.segmentDir,
2078
- requestedPaths.anchorDir,
2079
- ];
2080
- // Secure each parent before creating children so inherited Windows
2081
- // ACLs are private throughout setup. Batch only the child repair.
2092
+ const roots = [requestedPaths.rootDir, requestedPaths.authorityRootDir];
2093
+ const children = [requestedPaths.segmentDir, requestedPaths.anchorDir];
2094
+ // Prepare the independent roots without creating descendants or ledger
2095
+ // objects. Secure both roots in one native ACL operation before any
2096
+ // children can inherit their permissions.
2082
2097
  for (const directory of roots) {
2083
2098
  ensurePrivateDirectory(directory, {
2084
- applyWindowsAcl: true,
2099
+ applyWindowsAcl: false,
2085
2100
  failIfUnavailable: true,
2086
2101
  });
2087
2102
  }
2103
+ const rootIdentities = roots.map((directory) => {
2104
+ const stat = this.#fs.lstatSync(directory, { bigint: true });
2105
+ const identity = physicalDirectoryIdentity(stat);
2106
+ if (typeof stat.birthtimeNs !== "bigint") {
2107
+ throw new Error(
2108
+ "Private ledger root requires full-precision creation time",
2109
+ );
2110
+ }
2111
+ return { identity, birthtimeNs: stat.birthtimeNs };
2112
+ });
2113
+ const repairedRoots = repairPrivatePaths(roots);
2114
+ if (
2115
+ repairedRoots.length !== roots.length ||
2116
+ repairedRoots.some(
2117
+ (entry, index) =>
2118
+ entry.target !== roots[index] ||
2119
+ entry.ok !== true ||
2120
+ entry.exists === false,
2121
+ )
2122
+ ) {
2123
+ throw new Error("Could not verify private ledger roots");
2124
+ }
2125
+ for (const [index, directory] of roots.entries()) {
2126
+ const stat = this.#fs.lstatSync(directory, { bigint: true });
2127
+ const identity = physicalDirectoryIdentity(stat);
2128
+ const expected = rootIdentities[index];
2129
+ if (
2130
+ identity.dev !== expected.identity.dev ||
2131
+ identity.ino !== expected.identity.ino ||
2132
+ stat.birthtimeNs !== expected.birthtimeNs
2133
+ ) {
2134
+ throw new Error("Private ledger root changed during ACL setup");
2135
+ }
2136
+ }
2088
2137
  for (const directory of children) {
2089
2138
  ensurePrivateDirectory(directory, {
2090
2139
  applyWindowsAcl: false,
@@ -2275,6 +2324,34 @@ export class EvolutionLedger {
2275
2324
  recheck: Object.freeze(recheck),
2276
2325
  }),
2277
2326
  );
2327
+ if (new.target === EvolutionLedger)
2328
+ VERIFIED_HISTORY_READERS.set(
2329
+ this,
2330
+ Object.freeze((...args) => {
2331
+ if (args.length)
2332
+ throw new TypeError(
2333
+ "verified history takes no replacement context",
2334
+ );
2335
+ return this.#withLock(() => {
2336
+ const state = this.#loadState({
2337
+ allowInitialize: false,
2338
+ incremental: true,
2339
+ });
2340
+ return deepFreeze({
2341
+ authority: this.#authorityProjection(state),
2342
+ events: state.events.slice(0, 10_000),
2343
+ });
2344
+ });
2345
+ }),
2346
+ );
2347
+ if (
2348
+ new.target === EvolutionLedger &&
2349
+ this.#productionFs &&
2350
+ lock === withFileLock &&
2351
+ crashHook == null
2352
+ ) {
2353
+ DEFAULT_APPEND_PORTS.add(this);
2354
+ }
2278
2355
  Object.freeze(this);
2279
2356
  }
2280
2357
 
@@ -3063,7 +3140,7 @@ export class EvolutionLedger {
3063
3140
  label,
3064
3141
  allowMissing,
3065
3142
  samePathHandle,
3066
- { trustedParentPath = null } = {},
3143
+ { trustedParentPath = null, legacyFingerprint = true } = {},
3067
3144
  ) {
3068
3145
  const heldParent =
3069
3146
  trustedParentPath !== null &&
@@ -3091,19 +3168,24 @@ export class EvolutionLedger {
3091
3168
  // Preserve the exact legacy Number fingerprint already signed into the
3092
3169
  // store marker binding. It is sampled inside a separate BigInt window and
3093
3170
  // is never used as the authority for a physical file/handle comparison.
3094
- const legacyBefore = this.#fs.lstatSync(filePath);
3095
- const sampled = this.#fs.lstatSync(filePath, { bigint: true });
3096
- assertPhysicalFile(sampled, maximum, label);
3097
- if (
3098
- !samePhysicalFile(before, sampled) ||
3099
- (!heldParent && !samePath(realpath(this.#fs, filePath), filePath))
3100
- ) {
3171
+ let fingerprint = null;
3172
+ if (legacyFingerprint) {
3173
+ const legacyBefore = this.#fs.lstatSync(filePath);
3174
+ const sampled = this.#fs.lstatSync(filePath, { bigint: true });
3175
+ assertPhysicalFile(sampled, maximum, label);
3176
+ if (!samePhysicalFile(before, sampled)) {
3177
+ throw ledgerError(
3178
+ "CC_EVOLUTION_LEDGER_CORRUPT",
3179
+ `${label} changed while its fingerprint was sampled`,
3180
+ );
3181
+ }
3182
+ fingerprint = fileFingerprint(legacyBefore);
3183
+ }
3184
+ if (!heldParent && !samePath(realpath(this.#fs, filePath), filePath))
3101
3185
  throw ledgerError(
3102
3186
  "CC_EVOLUTION_LEDGER_CORRUPT",
3103
3187
  `${label} changed while its fingerprint was sampled`,
3104
3188
  );
3105
- }
3106
- const fingerprint = fileFingerprint(legacyBefore);
3107
3189
  descriptor = this.#fs.openSync(
3108
3190
  filePath,
3109
3191
  this.#fs.constants.O_RDONLY |
@@ -3137,7 +3219,9 @@ export class EvolutionLedger {
3137
3219
  );
3138
3220
  }
3139
3221
  const after = this.#fs.fstatSync(descriptor, { bigint: true });
3140
- const legacyAfter = this.#fs.lstatSync(filePath);
3222
+ const legacyAfter = legacyFingerprint
3223
+ ? this.#fs.lstatSync(filePath)
3224
+ : null;
3141
3225
  const afterPath = this.#fs.lstatSync(filePath, { bigint: true });
3142
3226
  assertPhysicalFile(after, maximum, label);
3143
3227
  assertPhysicalFile(afterPath, maximum, label);
@@ -3154,7 +3238,7 @@ export class EvolutionLedger {
3154
3238
  !samePhysicalFile(before, afterPath) ||
3155
3239
  !samePathHandle(afterPath, after) ||
3156
3240
  !samePhysicalOwner(afterPath, after) ||
3157
- fileFingerprint(legacyAfter) !== fingerprint ||
3241
+ (legacyFingerprint && fileFingerprint(legacyAfter) !== fingerprint) ||
3158
3242
  (!heldParent && !samePath(realpath(this.#fs, filePath), filePath))
3159
3243
  ) {
3160
3244
  throw ledgerError(
@@ -3162,7 +3246,13 @@ export class EvolutionLedger {
3162
3246
  `${label} pathname changed during bounded read`,
3163
3247
  );
3164
3248
  }
3165
- return { bytes, fingerprint };
3249
+ return {
3250
+ bytes,
3251
+ fingerprint,
3252
+ physicalFingerprint: this.#productionFs
3253
+ ? physicalFileFingerprint(before)
3254
+ : null,
3255
+ };
3166
3256
  } catch (cause) {
3167
3257
  if (cause instanceof EvolutionLedgerError) throw cause;
3168
3258
  throw ledgerError(
@@ -3193,7 +3283,7 @@ export class EvolutionLedger {
3193
3283
  { trustedParentPath },
3194
3284
  );
3195
3285
  if (file === null) return null;
3196
- const { bytes, fingerprint } = file;
3286
+ const { bytes } = file;
3197
3287
  if (expectedBytes !== null) {
3198
3288
  if (!Buffer.isBuffer(expectedBytes) || !bytes.equals(expectedBytes)) {
3199
3289
  throw ledgerError(
@@ -3201,7 +3291,7 @@ export class EvolutionLedger {
3201
3291
  `${label} differs from its signed snapshot bytes`,
3202
3292
  );
3203
3293
  }
3204
- return { bytes, contentDigest: sha256(bytes), fingerprint, record: null };
3294
+ return { ...file, contentDigest: sha256(bytes), record: null };
3205
3295
  }
3206
3296
  let text;
3207
3297
  try {
@@ -3235,7 +3325,7 @@ export class EvolutionLedger {
3235
3325
  `${label} bytes are not canonical`,
3236
3326
  );
3237
3327
  }
3238
- return { bytes, contentDigest: sha256(bytes), fingerprint, record };
3328
+ return { ...file, contentDigest: sha256(bytes), record };
3239
3329
  }
3240
3330
 
3241
3331
  #writeImmutable(filePath, bytes, label, onPublished = null) {
@@ -3418,9 +3508,27 @@ export class EvolutionLedger {
3418
3508
  #securePublishedFile(filePath, stat) {
3419
3509
  if (!this.#secure) return;
3420
3510
  if (this.#localUiWindowsDurability) {
3511
+ const physical = this.#fs.lstatSync(filePath, { bigint: true });
3512
+ assertWindowsAclPhysicalFile(physical, "published ledger file");
3513
+ // Keep the publication sample consistent, then retain the full-precision
3514
+ // path identity for all ACL checks (the signed legacy binding is unchanged).
3515
+ if (
3516
+ ["dev", "ino", "mode", "size"].some(
3517
+ (field) => Number(physical[field]) !== stat[field],
3518
+ ) ||
3519
+ Number(physical.birthtimeNs / 1_000_000_000n) * 1000 +
3520
+ Number(physical.birthtimeNs % 1_000_000_000n) / 1_000_000 !==
3521
+ stat.birthtimeMs
3522
+ ) {
3523
+ throw ledgerError(
3524
+ "CC_EVOLUTION_LEDGER_STORE_UNSAFE",
3525
+ "published ledger file changed before Windows ACL verification",
3526
+ );
3527
+ }
3421
3528
  this.#pendingWindowsAclFiles.set(path.resolve(filePath), {
3422
- identity: artifactPhysicalIdentity(stat),
3423
- size: stat.size,
3529
+ identity: artifactPhysicalIdentity(physical),
3530
+ birthtimeNs: physical.birthtimeNs,
3531
+ size: physical.size,
3424
3532
  });
3425
3533
  return;
3426
3534
  }
@@ -3431,12 +3539,13 @@ export class EvolutionLedger {
3431
3539
  }
3432
3540
 
3433
3541
  #assertPendingWindowsAclFile(filePath, expected) {
3434
- const stat = this.#fs.lstatSync(filePath);
3542
+ const stat = this.#fs.lstatSync(filePath, { bigint: true });
3435
3543
  if (
3436
3544
  !stat.isFile() ||
3437
3545
  stat.isSymbolicLink() ||
3438
- stat.nlink !== 1 ||
3546
+ stat.nlink !== 1n ||
3439
3547
  stat.size !== expected.size ||
3548
+ stat.birthtimeNs !== expected.birthtimeNs ||
3440
3549
  !sameArtifactIdentity(stat, expected.identity)
3441
3550
  ) {
3442
3551
  throw ledgerError(
@@ -3456,7 +3565,9 @@ export class EvolutionLedger {
3456
3565
  }
3457
3566
  const entries = [...this.#pendingWindowsAclFiles.entries()];
3458
3567
  const files = entries.map(([filePath]) => filePath);
3459
- const directories = [...new Set(files.map((filePath) => path.dirname(filePath)))];
3568
+ const directories = [
3569
+ ...new Set(files.map((filePath) => path.dirname(filePath))),
3570
+ ];
3460
3571
  try {
3461
3572
  this.#assertBoundaries();
3462
3573
  for (const [filePath, expected] of entries) {
@@ -3475,31 +3586,73 @@ export class EvolutionLedger {
3475
3586
  throw new Error("Windows ACL batch did not verify every ledger file");
3476
3587
  }
3477
3588
  for (const [filePath, expected] of entries) {
3478
- this.#assertPendingWindowsAclFile(filePath, expected);
3479
- const descriptor = this.#fs.openSync(
3589
+ // Affected libuv path stats project dev differently from fstat. Bind
3590
+ // the handle to a separately held parent volume without relaxing the
3591
+ // inode, owner, creation time, or mutation metadata checks.
3592
+ withEvolutionFileIdentity(
3593
+ this.#identityFs,
3480
3594
  filePath,
3481
- this.#fs.constants.O_RDWR | (this.#fs.constants.O_NOFOLLOW || 0),
3482
- );
3483
- try {
3484
- const opened = this.#fs.fstatSync(descriptor);
3485
- if (
3486
- !opened.isFile() ||
3487
- opened.nlink !== 1 ||
3488
- opened.size !== expected.size ||
3489
- !sameArtifactIdentity(opened, expected.identity)
3490
- ) {
3491
- throw ledgerError(
3492
- "CC_EVOLUTION_LEDGER_STORE_UNSAFE",
3493
- "ledger file identity changed during Windows ACL verification",
3595
+ (samePathHandle) => {
3596
+ const before = this.#assertPendingWindowsAclFile(
3597
+ filePath,
3598
+ expected,
3494
3599
  );
3495
- }
3496
- this.#fs.fsyncSync(descriptor);
3497
- } finally {
3498
- this.#fs.closeSync(descriptor);
3499
- }
3600
+ assertWindowsAclPhysicalFile(before, "published ledger file");
3601
+ const descriptor = this.#fs.openSync(
3602
+ filePath,
3603
+ this.#fs.constants.O_RDWR | (this.#fs.constants.O_NOFOLLOW || 0),
3604
+ );
3605
+ try {
3606
+ const opened = this.#fs.fstatSync(descriptor, { bigint: true });
3607
+ assertWindowsAclPhysicalFile(
3608
+ opened,
3609
+ "published ledger descriptor",
3610
+ );
3611
+ if (
3612
+ !opened.isFile() ||
3613
+ opened.nlink !== 1n ||
3614
+ opened.size !== expected.size ||
3615
+ opened.birthtimeNs !== before.birthtimeNs ||
3616
+ !samePathHandle(before, opened) ||
3617
+ !samePhysicalOwner(before, opened)
3618
+ ) {
3619
+ throw ledgerError(
3620
+ "CC_EVOLUTION_LEDGER_STORE_UNSAFE",
3621
+ "ledger file identity changed during Windows ACL verification",
3622
+ );
3623
+ }
3624
+ this.#fs.fsyncSync(descriptor);
3625
+ const after = this.#fs.fstatSync(descriptor, { bigint: true });
3626
+ assertWindowsAclPhysicalFile(
3627
+ after,
3628
+ "published ledger descriptor",
3629
+ );
3630
+ const afterPath = this.#assertPendingWindowsAclFile(
3631
+ filePath,
3632
+ expected,
3633
+ );
3634
+ if (
3635
+ !samePhysicalFile(opened, after) ||
3636
+ opened.birthtimeNs !== after.birthtimeNs ||
3637
+ !samePhysicalFile(before, afterPath) ||
3638
+ afterPath.birthtimeNs !== after.birthtimeNs ||
3639
+ !samePathHandle(afterPath, after) ||
3640
+ !samePhysicalOwner(afterPath, after)
3641
+ ) {
3642
+ throw ledgerError(
3643
+ "CC_EVOLUTION_LEDGER_STORE_UNSAFE",
3644
+ "ledger file identity changed during Windows ACL verification",
3645
+ );
3646
+ }
3647
+ } finally {
3648
+ this.#fs.closeSync(descriptor);
3649
+ }
3650
+ },
3651
+ );
3500
3652
  }
3501
3653
  this.#assertBoundaries();
3502
- for (const filePath of files) this.#pendingWindowsAclFiles.delete(filePath);
3654
+ for (const filePath of files)
3655
+ this.#pendingWindowsAclFiles.delete(filePath);
3503
3656
  return directories;
3504
3657
  } catch (cause) {
3505
3658
  if (cause instanceof EvolutionLedgerError) throw cause;
@@ -3832,10 +3985,12 @@ export class EvolutionLedger {
3832
3985
  "cached ledger file",
3833
3986
  false,
3834
3987
  samePathHandle,
3835
- { trustedParentPath },
3988
+ { trustedParentPath, legacyFingerprint: !this.#productionFs },
3836
3989
  );
3837
3990
  return (
3838
- file.fingerprint === expected.fingerprint &&
3991
+ (this.#productionFs
3992
+ ? file.physicalFingerprint === expected.physicalFingerprint
3993
+ : file.fingerprint === expected.fingerprint) &&
3839
3994
  sha256(file.bytes) === expected.contentDigest
3840
3995
  );
3841
3996
  }
@@ -4055,6 +4210,7 @@ export class EvolutionLedger {
4055
4210
  anchorFingerprints[entry.name] = Object.freeze({
4056
4211
  contentDigest: file.contentDigest,
4057
4212
  fingerprint: file.fingerprint,
4213
+ physicalFingerprint: file.physicalFingerprint,
4058
4214
  });
4059
4215
  }
4060
4216
  },
@@ -4093,6 +4249,7 @@ export class EvolutionLedger {
4093
4249
  segmentFingerprints[entry.name] = Object.freeze({
4094
4250
  contentDigest: file.contentDigest,
4095
4251
  fingerprint: file.fingerprint,
4252
+ physicalFingerprint: file.physicalFingerprint,
4096
4253
  });
4097
4254
  }
4098
4255
  },
@@ -4453,6 +4610,7 @@ export class EvolutionLedger {
4453
4610
  anchorFingerprints[name] = Object.freeze({
4454
4611
  contentDigest: anchorFile.contentDigest,
4455
4612
  fingerprint: anchorFile.fingerprint,
4613
+ physicalFingerprint: anchorFile.physicalFingerprint,
4456
4614
  });
4457
4615
  anchors.push(anchor);
4458
4616
  if (index === 0) continue;
@@ -4485,6 +4643,7 @@ export class EvolutionLedger {
4485
4643
  segmentFingerprints[segmentName] = Object.freeze({
4486
4644
  contentDigest: segmentFile.contentDigest,
4487
4645
  fingerprint: segmentFile.fingerprint,
4646
+ physicalFingerprint: segmentFile.physicalFingerprint,
4488
4647
  });
4489
4648
  eventIds.add(event.eventId);
4490
4649
  events.push(event);
@@ -5642,6 +5801,18 @@ export class EvolutionLedger {
5642
5801
  }
5643
5802
  }
5644
5803
 
5804
+ /** One authenticated state supplies both history and its exact frontier. */
5805
+ export function getEvolutionLedgerVerifiedHistoryReader(ledger) {
5806
+ if (arguments.length !== 1)
5807
+ throw new TypeError("verified history capture takes one original ledger");
5808
+ return VERIFIED_HISTORY_READERS.get(ledger) ?? null;
5809
+ }
5810
+
5811
+ /** Construction identity only: custom filesystem/lock/crash ports keep phases. */
5812
+ export function hasEvolutionLedgerDefaultAppendPorts(ledger) {
5813
+ return DEFAULT_APPEND_PORTS.has(ledger);
5814
+ }
5815
+
5645
5816
  // Trusted composition port; consumers receive the journal wrapper, never this
5646
5817
  // capability. WeakMap identity excludes structural or prototype impersonation.
5647
5818
  export function captureEvolutionLedgerMigrationSource(ledger) {
@@ -0,0 +1,20 @@
1
+ import fs from "node:fs";
2
+ import { isUnmodifiedLocalUiEvolutionFileSystem } from "./evolution-windows-directory-durability.js";
3
+
4
+ export function isProductionEvolutionFileSystem(fsImpl) {
5
+ return fsImpl === fs || isUnmodifiedLocalUiEvolutionFileSystem(fsImpl);
6
+ }
7
+
8
+ export function evolutionPrivateStorageOptions(fsImpl, { file = false } = {}) {
9
+ // The production adapter only adds directory flushing; ACL operations still
10
+ // use Node's original fs. Preserve explicit dependencies for custom ports.
11
+ const production = isProductionEvolutionFileSystem(fsImpl);
12
+ return {
13
+ ...(production ? {} : { deps: { fs: fsImpl } }),
14
+ // An elevated Windows token can give a new file its administrator-group
15
+ // owner even when its DACL inherits only the user's private directory rule.
16
+ // Explicit repair binds both the file owner and ACL to the current user.
17
+ ...(file ? { applyWindowsAcl: true } : {}),
18
+ failIfUnavailable: true,
19
+ };
20
+ }