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
@@ -15,7 +15,9 @@ import {
15
15
  EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
16
16
  EVOLUTION_ARTIFACT_DEFAULT_TTL_MS,
17
17
  EVOLUTION_ARTIFACT_MAX_TTL_MS,
18
+ captureEvolutionArtifactStoreDirectoryBoundary,
18
19
  } from "./evolution-artifact-ports.js";
20
+ import { EVOLUTION_EVIDENCE_STORAGE_TYPES } from "./evolution-evidence-storage-layout.js";
19
21
  import { EVOLUTION_ARTIFACT_REF_SCHEMA } from "./evolution-ledger.js";
20
22
  import {
21
23
  EVOLUTION_RAW_STORAGE_RECEIPT_SCHEMA,
@@ -353,6 +355,7 @@ export class EvolutionEvidenceArtifactAdapter {
353
355
  projector,
354
356
  bundleVerifier,
355
357
  artifactPorts,
358
+ typedArtifactPorts,
356
359
  } = {}) {
357
360
  this.#tenantId = normalizeId(tenantId, "evidence adapter tenantId");
358
361
  this.#audience = normalizeId(audience, "evidence adapter audience");
@@ -374,11 +377,50 @@ export class EvolutionEvidenceArtifactAdapter {
374
377
  EvolutionEvidenceBundleVerifier.prototype,
375
378
  "bundleVerifier",
376
379
  );
377
- assertInstance(
378
- artifactPorts,
379
- EvolutionArtifactPorts.prototype,
380
- "artifactPorts",
381
- );
380
+ if (typedArtifactPorts !== undefined) {
381
+ if (artifactPorts !== undefined)
382
+ throw new TypeError(
383
+ "Evidence adapter requires exactly one storage layout",
384
+ );
385
+ assertPlainExact(
386
+ typedArtifactPorts,
387
+ new Set(EVOLUTION_EVIDENCE_STORAGE_TYPES),
388
+ "typedArtifactPorts",
389
+ );
390
+ const captured = {};
391
+ const identities = new Set();
392
+ for (const type of EVOLUTION_EVIDENCE_STORAGE_TYPES) {
393
+ const port = typedArtifactPorts[type];
394
+ const boundary =
395
+ captureEvolutionArtifactStoreDirectoryBoundary(port).descriptor;
396
+ if (
397
+ boundary.artifactTenantId !== this.#tenantId ||
398
+ boundary.audience !== this.#audience
399
+ )
400
+ throw new TypeError(
401
+ "Typed Evidence store scope does not match its adapter",
402
+ );
403
+ for (const directory of [boundary.root, boundary.files]) {
404
+ const identity = `${directory.identity.dev}:${directory.identity.ino}`;
405
+ if (identities.has(identity))
406
+ throw new TypeError("Typed Evidence stores must be distinct");
407
+ identities.add(identity);
408
+ }
409
+ captured[type] = port;
410
+ }
411
+ this.#ports = Object.freeze(captured);
412
+ } else {
413
+ assertInstance(
414
+ artifactPorts,
415
+ EvolutionArtifactPorts.prototype,
416
+ "artifactPorts",
417
+ );
418
+ this.#ports = Object.freeze(
419
+ Object.fromEntries(
420
+ EVOLUTION_EVIDENCE_STORAGE_TYPES.map((type) => [type, artifactPorts]),
421
+ ),
422
+ );
423
+ }
382
424
  this.#ttlMs = ttlMs;
383
425
  this.#project = captureMethod(projector, "project", "projector");
384
426
  this.#projectAgentModel = captureMethod(
@@ -392,16 +434,15 @@ export class EvolutionEvidenceArtifactAdapter {
392
434
  "projector",
393
435
  );
394
436
  this.#verify = captureMethod(bundleVerifier, "verify", "bundleVerifier");
395
- this.#ports = artifactPorts;
396
437
  this.#resolveManifestRef =
397
- artifactPorts.createEvolutionLedgerArtifactResolver({
438
+ this.#ports.evidence.createEvolutionLedgerArtifactResolver({
398
439
  purpose: this.#purpose,
399
440
  });
400
441
  Object.freeze(this);
401
442
  }
402
443
 
403
444
  #put(type, value) {
404
- return this.#ports.putCanonical(type, value, {
445
+ return this.#ports[type].putCanonical(type, value, {
405
446
  audience: this.#audience,
406
447
  purpose: this.#purpose,
407
448
  retention: "ttl",
@@ -479,12 +520,15 @@ export class EvolutionEvidenceArtifactAdapter {
479
520
  if (result.manifest.type !== "evidence") {
480
521
  throw new TypeError("evidence manifest descriptor type is invalid");
481
522
  }
482
- const manifestResolved = this.#ports.resolve(result.manifest.envelope, {
483
- expectedDigest: result.manifest.digest,
484
- expectedType: "evidence",
485
- purpose: this.#purpose,
486
- tenantId: this.#tenantId,
487
- });
523
+ const manifestResolved = this.#ports.evidence.resolve(
524
+ result.manifest.envelope,
525
+ {
526
+ expectedDigest: result.manifest.digest,
527
+ expectedType: "evidence",
528
+ purpose: this.#purpose,
529
+ tenantId: this.#tenantId,
530
+ },
531
+ );
488
532
  return this.#resolveManifest(manifestResolved.value, result.evidenceId);
489
533
  }
490
534
 
@@ -553,7 +597,7 @@ export class EvolutionEvidenceArtifactAdapter {
553
597
  if (!descriptor || descriptor.type !== type) {
554
598
  throw new Error("evidence derivation component type is invalid");
555
599
  }
556
- bundle[field] = this.#ports.resolve(descriptor.envelope, {
600
+ bundle[field] = this.#ports[type].resolve(descriptor.envelope, {
557
601
  expectedDigest: descriptor.digest,
558
602
  expectedType: type,
559
603
  purpose: this.#purpose,
@@ -19,6 +19,7 @@ import {
19
19
  import { snapshotSkillDecisionPayload } from "./skill-decision-projection.js";
20
20
  import {
21
21
  createEvidenceJsonTextBoundary,
22
+ AGENT_FENCED_CODE_LANGUAGES,
22
23
  AGENT_CODE_TEXT_RESULT_TOOLS,
23
24
  EVIDENCE_JSON_POLICY,
24
25
  isAgentToolArgumentsPath,
@@ -533,7 +534,7 @@ export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V3_DIGEST = `sha256:${crea
533
534
  "utf8",
534
535
  )
535
536
  .digest("hex")}`;
536
- const AGENT_MODEL_RULESET = Object.freeze({
537
+ const AGENT_MODEL_RULESET_V4 = Object.freeze({
537
538
  ...AGENT_MODEL_RULESET_V3,
538
539
  schema: "chainlesschain.evolution-agent-model-projection-rules/v4",
539
540
  version: 4,
@@ -553,6 +554,40 @@ const AGENT_MODEL_RULESET = Object.freeze({
553
554
  maxNodes: AGENT_MODEL_REQUEST_LIMITS.maxNodes,
554
555
  }),
555
556
  });
557
+ export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V4_DIGEST = `sha256:${createHash(
558
+ "sha256",
559
+ )
560
+ .update(
561
+ `${AGENT_MODEL_RULESET_V4.schema}\0${JSON.stringify(AGENT_MODEL_RULESET_V4)}`,
562
+ "utf8",
563
+ )
564
+ .digest("hex")}`;
565
+ const AGENT_MODEL_RULESET_V5 = Object.freeze({
566
+ ...AGENT_MODEL_RULESET_V4,
567
+ schema: "chainlesschain.evolution-agent-model-projection-rules/v5",
568
+ version: 5,
569
+ fencedCodePolicy: "closed-message-code-fence-literal-scan-v1",
570
+ fencedCodeLanguages: AGENT_FENCED_CODE_LANGUAGES,
571
+ });
572
+ export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V5_DIGEST = `sha256:${createHash(
573
+ "sha256",
574
+ )
575
+ .update(
576
+ `${AGENT_MODEL_RULESET_V5.schema}\0${JSON.stringify(AGENT_MODEL_RULESET_V5)}`,
577
+ "utf8",
578
+ )
579
+ .digest("hex")}`;
580
+ const AGENT_MODEL_RULESET = Object.freeze({
581
+ ...AGENT_MODEL_RULESET_V5,
582
+ schema: "chainlesschain.evolution-agent-model-projection-rules/v6",
583
+ version: 6,
584
+ jsonTextPolicy: Object.freeze({
585
+ ...AGENT_MODEL_RULESET_V5.jsonTextPolicy,
586
+ version: 3,
587
+ bracketMarkerPolicy: "bounded-display-markers-v1",
588
+ proseQuotedPairPolicy: "non-sensitive-top-level-expression-v1",
589
+ }),
590
+ });
556
591
  export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_DIGEST = `sha256:${createHash(
557
592
  "sha256",
558
593
  )
@@ -584,6 +619,8 @@ const SUPPORTED_RULESETS = new Map([
584
619
  [AGENT_MODEL_RULESET_V1_DIGEST, AGENT_MODEL_RULESET_V1],
585
620
  [EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V2_DIGEST, AGENT_MODEL_RULESET_V2],
586
621
  [EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V3_DIGEST, AGENT_MODEL_RULESET_V3],
622
+ [EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V4_DIGEST, AGENT_MODEL_RULESET_V4],
623
+ [EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V5_DIGEST, AGENT_MODEL_RULESET_V5],
587
624
  [EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_DIGEST, AGENT_MODEL_RULESET],
588
625
  ]);
589
626
 
@@ -659,6 +696,8 @@ const AGENT_VALUE_PATTERNS = Object.freeze([
659
696
  function valuePatterns(ruleset) {
660
697
  return ruleset === SKILL_DECISION_RULESET ||
661
698
  ruleset === AGENT_MODEL_RULESET ||
699
+ ruleset === AGENT_MODEL_RULESET_V5 ||
700
+ ruleset === AGENT_MODEL_RULESET_V4 ||
662
701
  ruleset === AGENT_MODEL_RULESET_V3 ||
663
702
  ruleset === AGENT_MODEL_RULESET_V2 ||
664
703
  ruleset === AGENT_MODEL_RULESET_V1
@@ -1409,7 +1448,10 @@ function sanitizePayload(
1409
1448
  }
1410
1449
  const toolArguments = jsonText && isAgentToolArgumentsPath(path);
1411
1450
  const opaqueTransportBlock =
1412
- ruleset === AGENT_MODEL_RULESET || ruleset === AGENT_MODEL_RULESET_V3
1451
+ ruleset === AGENT_MODEL_RULESET ||
1452
+ ruleset === AGENT_MODEL_RULESET_V5 ||
1453
+ ruleset === AGENT_MODEL_RULESET_V4 ||
1454
+ ruleset === AGENT_MODEL_RULESET_V3
1413
1455
  ? projectAgentOpaqueTransportBlock(value, path.join("."))
1414
1456
  : null;
1415
1457
  if (opaqueTransportBlock !== null) return opaqueTransportBlock;
@@ -1431,6 +1473,15 @@ function sanitizePayload(
1431
1473
  layer,
1432
1474
  objectOnly: toolArguments,
1433
1475
  codeText,
1476
+ // Only direct message text can contain Markdown code examples. Tool
1477
+ // arguments and recursively decoded strings keep their existing rules.
1478
+ fencedCodeLanguages:
1479
+ path[0] === "messages" &&
1480
+ /^\d+$/u.test(path[1] ?? "") &&
1481
+ path[2] === "content" &&
1482
+ (path.length === 3 || (path.length === 5 && path[4] === "text"))
1483
+ ? ruleset.fencedCodeLanguages
1484
+ : null,
1434
1485
  visit: (decoded, nextLayer) =>
1435
1486
  visit(
1436
1487
  decoded,
@@ -3287,6 +3338,8 @@ function validateBundleIntegrity(bundle) {
3287
3338
  }
3288
3339
  if (
3289
3340
  ruleset === AGENT_MODEL_RULESET ||
3341
+ ruleset === AGENT_MODEL_RULESET_V5 ||
3342
+ ruleset === AGENT_MODEL_RULESET_V4 ||
3290
3343
  ruleset === AGENT_MODEL_RULESET_V3 ||
3291
3344
  ruleset === AGENT_MODEL_RULESET_V2 ||
3292
3345
  ruleset === AGENT_MODEL_RULESET_V1
@@ -3294,7 +3347,10 @@ function validateBundleIntegrity(bundle) {
3294
3347
  snapshotAgentModelRequest(model.content, {
3295
3348
  allowStructuredArgumentText: ruleset !== AGENT_MODEL_RULESET_V1,
3296
3349
  allowOpaqueTransportBlocks:
3297
- ruleset === AGENT_MODEL_RULESET || ruleset === AGENT_MODEL_RULESET_V3,
3350
+ ruleset === AGENT_MODEL_RULESET ||
3351
+ ruleset === AGENT_MODEL_RULESET_V5 ||
3352
+ ruleset === AGENT_MODEL_RULESET_V4 ||
3353
+ ruleset === AGENT_MODEL_RULESET_V3,
3298
3354
  });
3299
3355
  if (
3300
3356
  model.truncated ||
@@ -0,0 +1,115 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+
4
+ import { ArtifactStore } from "../artifact-store.js";
5
+ import {
6
+ EvolutionArtifactPorts,
7
+ captureEvolutionArtifactStoreDirectoryBoundary,
8
+ captureEvolutionLedgerBatchReadWindow,
9
+ } from "./evolution-artifact-ports.js";
10
+
11
+ export const EVOLUTION_TYPED_EVIDENCE_LAYOUT = "typed-evidence-v1";
12
+ export const EVOLUTION_EVIDENCE_STORAGE_TYPES = Object.freeze([
13
+ "source-evidence",
14
+ "model-projection",
15
+ "trusted-projection",
16
+ "receipt",
17
+ "evidence",
18
+ ]);
19
+
20
+ export function validateEvidenceStorageLayout(value) {
21
+ if (value !== "legacy" && value !== EVOLUTION_TYPED_EVIDENCE_LAYOUT)
22
+ throw new TypeError("Unsupported Evidence storage layout");
23
+ return value;
24
+ }
25
+
26
+ // Callers must supply events freshly authenticated by the genuine Run adapter.
27
+ // A later event, projection, or sidecar is never a layout authority.
28
+ export function evidenceStorageLayoutForRun(events, emptyLayout = "legacy") {
29
+ validateEvidenceStorageLayout(emptyLayout);
30
+ if (events.length === 0) return emptyLayout;
31
+ const data = events[0].data;
32
+ if (!data || !Object.hasOwn(data, "evidenceStorageLayout")) return "legacy";
33
+ if (data.evidenceStorageLayout !== EVOLUTION_TYPED_EVIDENCE_LAYOUT)
34
+ throw new TypeError("Unsupported authenticated Evidence storage layout");
35
+ return EVOLUTION_TYPED_EVIDENCE_LAYOUT;
36
+ }
37
+
38
+ function physicalStore(directory) {
39
+ return [
40
+ directory,
41
+ path.join(directory, "files"),
42
+ path.join(directory, "index.jsonl"),
43
+ ].map((location, index) => {
44
+ const stat = fs.lstatSync(location, { bigint: true });
45
+ if (
46
+ stat.isSymbolicLink() ||
47
+ (index < 2 ? !stat.isDirectory() : !stat.isFile() || stat.nlink !== 1n)
48
+ )
49
+ throw new Error(
50
+ "Typed Evidence store must retain physical directories and a single-link index",
51
+ );
52
+ return {
53
+ location,
54
+ dev: stat.dev,
55
+ ino: stat.ino,
56
+ birthtimeNs: stat.birthtimeNs,
57
+ };
58
+ });
59
+ }
60
+
61
+ /** Separate genuine stores; no change to artifact locators or ledger authority. */
62
+ export function createTypedEvidenceArtifactPorts({
63
+ rootDir,
64
+ tenantId,
65
+ audience,
66
+ artifactAuthority,
67
+ now,
68
+ existingRun,
69
+ }) {
70
+ const directories = EVOLUTION_EVIDENCE_STORAGE_TYPES.map((type) =>
71
+ path.join(rootDir, type),
72
+ );
73
+ // Preflight every shard before any constructor can recreate a missing one.
74
+ const before = existingRun ? directories.map(physicalStore) : null;
75
+ const result = {};
76
+ const identities = new Set();
77
+ for (const [index, type] of EVOLUTION_EVIDENCE_STORAGE_TYPES.entries()) {
78
+ const port = new EvolutionArtifactPorts({
79
+ tenantId,
80
+ audience,
81
+ artifactStore: new ArtifactStore({ dir: directories[index], now }),
82
+ allowedTypes: [type],
83
+ envelopeSigner: artifactAuthority.envelopeSigner,
84
+ envelopeVerifier: artifactAuthority.envelopeVerifier,
85
+ currentAuthorityResolver: artifactAuthority.currentAuthorityResolver,
86
+ now,
87
+ });
88
+ const boundary = captureEvolutionArtifactStoreDirectoryBoundary(port);
89
+ const after = physicalStore(directories[index]);
90
+ for (const [entryIndex, entry] of after.entries()) {
91
+ const previous = before?.[index][entryIndex];
92
+ if (
93
+ previous &&
94
+ ["dev", "ino", "birthtimeNs"].some(
95
+ (key) => previous[key] !== entry[key],
96
+ )
97
+ )
98
+ throw new Error("Typed Evidence store identity changed during reopen");
99
+ const identity = `${entry.dev}:${entry.ino}`;
100
+ if (identities.has(identity))
101
+ throw new Error("Typed Evidence stores must be distinct");
102
+ identities.add(identity);
103
+ }
104
+ boundary.recheck();
105
+ // Authenticate bounded index structure through the original port reader.
106
+ // Payloads and current authority remain freshly checked on actual reads.
107
+ captureEvolutionLedgerBatchReadWindow(
108
+ port.createEvolutionLedgerArtifactResolver({
109
+ purpose: "evidence-projection",
110
+ }),
111
+ )(() => undefined);
112
+ result[type] = port;
113
+ }
114
+ return Object.freeze(result);
115
+ }
@@ -4,6 +4,7 @@ import path from "node:path";
4
4
  import { types } from "node:util";
5
5
  import { ensurePrivateDirectory, ensurePrivateFile } from "../secure-fs.js";
6
6
  import { withFileLock } from "../with-file-lock.js";
7
+ import { evolutionPrivateStorageOptions } from "./evolution-private-storage.js";
7
8
  import { createEvolutionPhysicalStateReader } from "./evolution-physical-state-reader.js";
8
9
  import {
9
10
  createEvolutionWitnessSegments,
@@ -246,7 +247,10 @@ export function createEvolutionFileWitness({
246
247
  "maximumHistoryBytes must be a safe integer of at least 4096",
247
248
  );
248
249
  }
249
- const secureOptions = { deps: { fs: fsImpl }, failIfUnavailable: true };
250
+ const secureOptions = evolutionPrivateStorageOptions(fsImpl);
251
+ const secureFileOptions = evolutionPrivateStorageOptions(fsImpl, {
252
+ file: true,
253
+ });
250
254
  ensurePrivateDirectory(directory, secureOptions);
251
255
  const readerOptions = {
252
256
  fsImpl,
@@ -651,7 +655,7 @@ export function createEvolutionFileWitness({
651
655
  const bytes = reader.read(file, {
652
656
  maximumBytes: byteLimit,
653
657
  allowAbsent,
654
- prepareFile: (name) => ensurePrivateFile(name, secureOptions),
658
+ prepareFile: (name) => ensurePrivateFile(name, secureFileOptions),
655
659
  });
656
660
  recheckStorage();
657
661
  return bytes;
@@ -723,7 +727,7 @@ export function createEvolutionFileWitness({
723
727
  fsImpl.closeSync(descriptor);
724
728
  descriptor = undefined;
725
729
  fsImpl.renameSync(temporary, file);
726
- ensurePrivateFile(file, secureOptions);
730
+ ensurePrivateFile(file, secureFileOptions);
727
731
  descriptor = fsImpl.openSync(file, "r+");
728
732
  fsImpl.fsyncSync(descriptor);
729
733
  fsImpl.closeSync(descriptor);
@@ -5,6 +5,7 @@ import { types as utilTypes } from "node:util";
5
5
 
6
6
  import { ensurePrivateDirectory, ensurePrivateFile } from "../secure-fs.js";
7
7
  import { withFileLock } from "../with-file-lock.js";
8
+ import { evolutionPrivateStorageOptions } from "./evolution-private-storage.js";
8
9
  import {
9
10
  createEvolutionManifestStateReader,
10
11
  captureEvolutionManifestStateReaderDirectoryBoundary,
@@ -76,7 +77,10 @@ export function createEvolutionLedgerFileManifestCatalogBackend({
76
77
  }
77
78
  const directory = path.resolve(directoryPath);
78
79
  const file = path.join(directory, "manifest-catalog.json");
79
- const secureOptions = { deps: { fs: fsImpl }, failIfUnavailable: true };
80
+ const secureOptions = evolutionPrivateStorageOptions(fsImpl);
81
+ const secureFileOptions = evolutionPrivateStorageOptions(fsImpl, {
82
+ file: true,
83
+ });
80
84
  ensurePrivateDirectory(directory, secureOptions);
81
85
 
82
86
  const stateReader = createEvolutionManifestStateReader({
@@ -131,7 +135,7 @@ export function createEvolutionLedgerFileManifestCatalogBackend({
131
135
  fsImpl.closeSync(descriptor);
132
136
  descriptor = undefined;
133
137
  fsImpl.renameSync(temporary, file);
134
- ensurePrivateFile(file, secureOptions);
138
+ ensurePrivateFile(file, secureFileOptions);
135
139
  descriptor = fsImpl.openSync(file, "r+");
136
140
  fsImpl.fsyncSync(descriptor);
137
141
  fsImpl.closeSync(descriptor);
@@ -5,6 +5,7 @@ import { types as utilTypes } from "node:util";
5
5
 
6
6
  import { ensurePrivateDirectory, ensurePrivateFile } from "../secure-fs.js";
7
7
  import { withFileLock } from "../with-file-lock.js";
8
+ import { evolutionPrivateStorageOptions } from "./evolution-private-storage.js";
8
9
  import {
9
10
  createEvolutionManifestStateReader,
10
11
  captureEvolutionManifestStateReaderDirectoryBoundary,
@@ -96,7 +97,10 @@ export function createEvolutionLedgerFileManifestHeadBackend({
96
97
  throw new TypeError("manifest head maximumBytes must be at least 4096");
97
98
  }
98
99
  const file = path.join(directory, "manifest-head.json");
99
- const secureOptions = { deps: { fs: fsImpl }, failIfUnavailable: true };
100
+ const secureOptions = evolutionPrivateStorageOptions(fsImpl);
101
+ const secureFileOptions = evolutionPrivateStorageOptions(fsImpl, {
102
+ file: true,
103
+ });
100
104
  ensurePrivateDirectory(directory, secureOptions);
101
105
 
102
106
  const invokeCrashHook = (phase, details) => {
@@ -158,7 +162,7 @@ export function createEvolutionLedgerFileManifestHeadBackend({
158
162
  descriptor = undefined;
159
163
  invokeCrashHook("after-stage", { file, temporary });
160
164
  fsImpl.renameSync(temporary, file);
161
- ensurePrivateFile(file, secureOptions);
165
+ ensurePrivateFile(file, secureFileOptions);
162
166
  descriptor = fsImpl.openSync(file, "r+");
163
167
  fsImpl.fsyncSync(descriptor);
164
168
  fsImpl.closeSync(descriptor);