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
@@ -0,0 +1,449 @@
1
+ import { types } from "node:util";
2
+
3
+ // Fixed identifiers only. An error's text, stack, paths and arbitrary code
4
+ // strings are never retained by this diagnostic projection.
5
+ const CODES = new Map(
6
+ [
7
+ "CC_ARTIFACT_BOUNDED_READ_FAILED",
8
+ "SECURE_FILE_IDENTITY_INVALID_PARENT",
9
+ "SECURE_FILE_IDENTITY_PARENT_RACE",
10
+ "CC_EVOLUTION_ARTIFACT_AUTHORITY_DENIED",
11
+ "CC_EVOLUTION_ARTIFACT_EXPIRED",
12
+ "CC_EVOLUTION_ARTIFACT_INTEGRITY_FAILED",
13
+ "CC_EVOLUTION_ARTIFACT_INVALID",
14
+ "CC_EVOLUTION_ARTIFACT_NOT_FOUND",
15
+ "CC_EVOLUTION_ARTIFACT_SIGNATURE_INVALID",
16
+ "CC_EVOLUTION_ARTIFACT_STORE_FAILED",
17
+ "CC_EVOLUTION_ARTIFACT_TYPE_DENIED",
18
+ "CC_EVOLUTION_LEDGER_ARTIFACT_INVALID",
19
+ "CC_EVOLUTION_LEDGER_ARTIFACT_UNAVAILABLE",
20
+ "CC_EVOLUTION_LEDGER_AUDIT_INVALID",
21
+ "CC_EVOLUTION_LEDGER_CAPACITY_EXCEEDED",
22
+ "CC_EVOLUTION_LEDGER_CLOCK_FAILED",
23
+ "CC_EVOLUTION_LEDGER_COMMIT_UNKNOWN",
24
+ "CC_EVOLUTION_LEDGER_CORRUPT",
25
+ "CC_EVOLUTION_LEDGER_CRASH_HOOK_INVALID",
26
+ "CC_EVOLUTION_LEDGER_DURABILITY_UNAVAILABLE",
27
+ "CC_EVOLUTION_LEDGER_EVENT_CONFLICT",
28
+ "CC_EVOLUTION_LEDGER_HEAD_CONFLICT",
29
+ "CC_EVOLUTION_LEDGER_LOCK_UNAVAILABLE",
30
+ "CC_EVOLUTION_LEDGER_PREFIX_READER_FAILED",
31
+ "CC_EVOLUTION_LEDGER_RANDOM_FAILED",
32
+ "CC_EVOLUTION_LEDGER_RECEIPT_INVALID",
33
+ "CC_EVOLUTION_LEDGER_SCHEMA_INVALID",
34
+ "CC_EVOLUTION_LEDGER_SIGNATURE_INVALID",
35
+ "CC_EVOLUTION_LEDGER_SIGNING_FAILED",
36
+ "CC_EVOLUTION_LEDGER_STORE_UNSAFE",
37
+ "CC_EVOLUTION_LEDGER_TRUST_INVALID",
38
+ "CC_EVOLUTION_LEDGER_TRUST_MISMATCH",
39
+ "CC_EVOLUTION_LEDGER_TRUST_PORT_REQUIRED",
40
+ "CC_EVOLUTION_LEDGER_V2_REQUIRED",
41
+ "CC_EVOLUTION_LEDGER_WITNESS_CONFLICT",
42
+ "CC_EVOLUTION_LEDGER_WITNESS_INVALID",
43
+ "CC_EVOLUTION_LEDGER_WITNESS_REQUIRED",
44
+ "CC_EVOLUTION_LEDGER_WITNESS_UNAVAILABLE",
45
+ "CC_EVOLUTION_LEDGER_WRITE_FAILED",
46
+ "CC_EVOLUTION_RUN_LEDGER_CONFLICT",
47
+ "CC_EVOLUTION_RUN_LEDGER_CORRUPT",
48
+ "CONFIG_HOME_UNSAFE",
49
+ "EACCES",
50
+ "EBUSY",
51
+ "EEXIST",
52
+ "EIO",
53
+ "EISDIR",
54
+ "EMFILE",
55
+ "ENFILE",
56
+ "ENOENT",
57
+ "ENOSPC",
58
+ "ENOTDIR",
59
+ "EPERM",
60
+ "EROFS",
61
+ "ETIMEDOUT",
62
+ ].map((code) => [code, code]),
63
+ );
64
+ const MAX_CAUSES = 6;
65
+ // Match only fixed source literals paired with their own error code. These
66
+ // tokens identify guard blocks; composite guards do not identify a field or
67
+ // prove clock rollback. Observed messages are never retained by diagnostics.
68
+ const REASONS = new Map([
69
+ [
70
+ "CC_ARTIFACT_BOUNDED_READ_FAILED",
71
+ new Map([
72
+ ["artifact path and descriptor identities differ", "bounded-path-handle"],
73
+ [
74
+ "artifact descriptor changed during bounded read",
75
+ "bounded-descriptor-changed",
76
+ ],
77
+ [
78
+ "artifact pathname changed during bounded read",
79
+ "bounded-pathname-changed",
80
+ ],
81
+ ["artifact path is not physically canonical", "bounded-path-canonical"],
82
+ ]),
83
+ ],
84
+ [
85
+ "CC_EVOLUTION_ARTIFACT_INTEGRITY_FAILED",
86
+ new Map([
87
+ ["ArtifactStore root physical identity changed", "store-root-identity"],
88
+ [
89
+ "ArtifactStore files root physical identity changed",
90
+ "store-files-identity",
91
+ ],
92
+ [
93
+ "ArtifactStore sealed directory identity or reader changed",
94
+ "sealed-directory-or-reader",
95
+ ],
96
+ [
97
+ "stored artifact history directory identity changed",
98
+ "history-directory-identity",
99
+ ],
100
+ [
101
+ "ArtifactStore index physical identity changed",
102
+ "index-physical-changed",
103
+ ],
104
+ [
105
+ "ArtifactStore index realpath changed or escaped its root",
106
+ "index-realpath-changed",
107
+ ],
108
+ [
109
+ "ArtifactStore index descriptor is replaced or oversized",
110
+ "index-path-handle",
111
+ ],
112
+ [
113
+ "ArtifactStore index changed while its descriptor was read",
114
+ "index-descriptor-changed",
115
+ ],
116
+ [
117
+ "ArtifactStore index pathname changed during descriptor read",
118
+ "index-pathname-changed",
119
+ ],
120
+ [
121
+ "ArtifactStore index generation changed during readback",
122
+ "index-generation-changed",
123
+ ],
124
+ [
125
+ "ArtifactStore.get is not bound to the trusted index snapshot",
126
+ "index-get-unbound",
127
+ ],
128
+ [
129
+ "ArtifactStore index entry was replaced during readback",
130
+ "index-entry-changed",
131
+ ],
132
+ [
133
+ "ArtifactStore index entry was replaced during ledger readback",
134
+ "index-ledger-entry-changed",
135
+ ],
136
+ [
137
+ "ArtifactStore index changed during ledger batch readback",
138
+ "index-batch-changed",
139
+ ],
140
+ [
141
+ "ArtifactStore index changed during ledger history readback",
142
+ "index-history-changed",
143
+ ],
144
+ [
145
+ "ArtifactStore post-read integrity verification threw",
146
+ "artifact-post-read-hook",
147
+ ],
148
+ [
149
+ "stored artifact bytes do not match the signed recordDigest",
150
+ "artifact-record-digest",
151
+ ],
152
+ ]),
153
+ ],
154
+ [
155
+ "CC_EVOLUTION_ARTIFACT_EXPIRED",
156
+ new Map([
157
+ [
158
+ "evolution artifact envelope is not currently valid",
159
+ "envelope-validity-window",
160
+ ],
161
+ [
162
+ "artifact authority expired before envelope authentication completed",
163
+ "authentication-clock-window",
164
+ ],
165
+ [
166
+ "artifact authority expired before canonical bytes could be released",
167
+ "release-clock-window",
168
+ ],
169
+ [
170
+ "artifact publish authority expired before envelope signing completed",
171
+ "signing-clock-window",
172
+ ],
173
+ [
174
+ "artifact authority expired before ledger batch release",
175
+ "batch-clock-window",
176
+ ],
177
+ [
178
+ "artifact authority expired before ledger history release",
179
+ "history-clock-window",
180
+ ],
181
+ ]),
182
+ ],
183
+ [
184
+ "CC_EVOLUTION_ARTIFACT_AUTHORITY_DENIED",
185
+ new Map([
186
+ ["artifact authority clock moved backwards", "authority-clock-backward"],
187
+ [
188
+ "current artifact authority denied or returned an unbound decision",
189
+ "authority-decision-unbound",
190
+ ],
191
+ [
192
+ "artifact envelope is stale under current policy or revocation authority",
193
+ "authority-policy-stale",
194
+ ],
195
+ ]),
196
+ ],
197
+ ]);
198
+ const TAGGED_REASON_CODES = new Map(
199
+ [
200
+ "auth-clock-backward",
201
+ "auth-envelope-expired",
202
+ "auth-authority-lease-expired",
203
+ "release-clock-backward",
204
+ "release-envelope-expired",
205
+ "release-authority-lease-expired",
206
+ ].map((reason) => [reason, "CC_EVOLUTION_ARTIFACT_EXPIRED"]),
207
+ );
208
+ const FAILURE_REASONS = new WeakMap();
209
+ const REASON_CODES = new Map([
210
+ ...[...REASONS].flatMap(([code, messages]) =>
211
+ [...messages.values()].map((reason) => [reason, code]),
212
+ ),
213
+ ...TAGGED_REASON_CODES,
214
+ ]);
215
+ const REASON_MARKER = " [storage_reason: ";
216
+ const MARKER = " [storage_cause_codes: ";
217
+ const STAGE_MARKER = " [storage_stage: ";
218
+ const FAILURE_STAGES = new WeakMap();
219
+ const ARTIFACT_TYPES = new Set([
220
+ "source-evidence",
221
+ "model-projection",
222
+ "trusted-projection",
223
+ "receipt",
224
+ "evidence",
225
+ "other",
226
+ ]);
227
+ const PHASES = new Set([
228
+ "validate",
229
+ "pre-index",
230
+ "authority",
231
+ "sign",
232
+ "publish",
233
+ "post-index",
234
+ "authentication",
235
+ "read-bytes",
236
+ "final-lease",
237
+ "receipt",
238
+ ]);
239
+
240
+ /** Error-path observation only: preserve the original error and its causes. */
241
+ export function recordStorageFailureStage(error, artifactType, phase) {
242
+ try {
243
+ if (
244
+ error !== null &&
245
+ typeof error === "object" &&
246
+ !types.isProxy(error) &&
247
+ typeof artifactType === "string" &&
248
+ PHASES.has(phase)
249
+ ) {
250
+ FAILURE_STAGES.set(
251
+ error,
252
+ Object.freeze({
253
+ artifactType: ARTIFACT_TYPES.has(artifactType)
254
+ ? artifactType
255
+ : "other",
256
+ phase,
257
+ }),
258
+ );
259
+ }
260
+ } catch {
261
+ // Diagnostics cannot replace the original exception.
262
+ }
263
+ return error;
264
+ }
265
+
266
+ export function storageFailureStage(error) {
267
+ try {
268
+ const seen = new Set();
269
+ let current = error;
270
+ for (let depth = 0; depth < MAX_CAUSES && current; depth++) {
271
+ if (seen.has(current)) break;
272
+ seen.add(current);
273
+ const stage = FAILURE_STAGES.get(current);
274
+ if (stage) return stage;
275
+ current = data(current, "cause");
276
+ }
277
+ } catch {
278
+ // Observation must never change the original error or exit outcome.
279
+ }
280
+ return null;
281
+ }
282
+
283
+ function data(value, key) {
284
+ for (let depth = 0; depth < 4 && value !== null; depth++) {
285
+ if (typeof value !== "object" || types.isProxy(value)) return undefined;
286
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
287
+ if (descriptor) return "value" in descriptor ? descriptor.value : undefined;
288
+ value = Object.getPrototypeOf(value);
289
+ }
290
+ return undefined;
291
+ }
292
+
293
+ /** Optional diagnostics; this never adjudicates a failure or grants a retry. */
294
+ export function storageFailureCauseCodes(error) {
295
+ const codes = [];
296
+ try {
297
+ const seen = new Set();
298
+ let current = error;
299
+ for (let depth = 0; depth < MAX_CAUSES && current; depth++) {
300
+ if (seen.has(current)) break;
301
+ seen.add(current);
302
+ const known = CODES.get(data(current, "code"));
303
+ if (known && !codes.includes(known)) codes.push(known);
304
+ current = data(current, "cause");
305
+ }
306
+ } catch {
307
+ // Observation must never change the original error or exit outcome.
308
+ }
309
+ return Object.freeze(codes);
310
+ }
311
+
312
+ export function storageFailureCauseSuffix(error) {
313
+ const codes = storageFailureCauseCodes(error);
314
+ const stage = storageFailureStage(error);
315
+ const reason = storageFailureReason(error);
316
+ return (
317
+ (reason && codes.includes(REASON_CODES.get(reason))
318
+ ? `${REASON_MARKER}${reason}]`
319
+ : "") +
320
+ (stage ? `${STAGE_MARKER}${stage.artifactType}/${stage.phase}]` : "") +
321
+ (codes.length ? `${MARKER}${codes.join(" -> ")}]` : "")
322
+ );
323
+ }
324
+
325
+ // Unlike legacy cause-code projection, reasons require own data properties.
326
+ // Callers reject proxies before this helper; no prototype traversal or getters.
327
+ function ownData(value, key) {
328
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
329
+ return descriptor && "value" in descriptor ? descriptor.value : undefined;
330
+ }
331
+
332
+ /** Preserve the original error; retain only an allow-listed branch token. */
333
+ export function recordStorageFailureReason(error, reason) {
334
+ try {
335
+ if (
336
+ error !== null &&
337
+ typeof error === "object" &&
338
+ !types.isProxy(error) &&
339
+ TAGGED_REASON_CODES.has(reason) &&
340
+ ownData(error, "code") === TAGGED_REASON_CODES.get(reason)
341
+ )
342
+ FAILURE_REASONS.set(error, reason);
343
+ } catch {
344
+ // Diagnostics cannot replace the original exception.
345
+ }
346
+ return error;
347
+ }
348
+
349
+ /** Prefer a fixed branch tag; otherwise keep the deepest exact-message match. */
350
+ export function storageFailureReason(error) {
351
+ let reason = null;
352
+ let taggedReason = null;
353
+ try {
354
+ const seen = new Set();
355
+ let current = error;
356
+ for (let depth = 0; depth < MAX_CAUSES; depth++) {
357
+ if (
358
+ current === null ||
359
+ typeof current !== "object" ||
360
+ types.isProxy(current) ||
361
+ seen.has(current)
362
+ )
363
+ break;
364
+ seen.add(current);
365
+ const code = ownData(current, "code");
366
+ const tagged = FAILURE_REASONS.get(current);
367
+ if (tagged && TAGGED_REASON_CODES.get(tagged) === code)
368
+ taggedReason = tagged;
369
+ const messages = typeof code === "string" ? REASONS.get(code) : undefined;
370
+ if (messages) {
371
+ const message = ownData(current, "message");
372
+ const matched =
373
+ typeof message === "string" ? messages.get(message) : undefined;
374
+ if (matched) reason = matched;
375
+ }
376
+ current = ownData(current, "cause");
377
+ }
378
+ } catch {
379
+ // Observation must never change the original error or exit outcome.
380
+ }
381
+ return taggedReason ?? reason;
382
+ }
383
+
384
+ /** Accept only a fixed reason followed by the complete legacy suffix. */
385
+ export function storageFailureReasonFromMessage(message) {
386
+ if (typeof message !== "string") return null;
387
+ const tail = message.slice(-1024);
388
+ const offset = tail.lastIndexOf(REASON_MARKER);
389
+ if (offset < 0) return null;
390
+ const end = tail.indexOf("]", offset + REASON_MARKER.length);
391
+ if (end < 0) return null;
392
+ const candidate = tail.slice(offset + REASON_MARKER.length, end);
393
+ const code = REASON_CODES.get(candidate);
394
+ if (!code) return null;
395
+ const remainder = tail.slice(end + 1);
396
+ const codes = storageFailureCodesFromMessage(remainder);
397
+ if (!codes.includes(code)) return null;
398
+ const stage = storageFailureStageFromMessage(remainder);
399
+ const expected =
400
+ (stage ? `${STAGE_MARKER}${stage.artifactType}/${stage.phase}]` : "") +
401
+ `${MARKER}${codes.join(" -> ")}]`;
402
+ if (remainder !== expected) return null;
403
+ // Return the table-owned token rather than retaining untrusted message text.
404
+ for (const reason of REASON_CODES.keys()) {
405
+ if (reason === candidate) return reason;
406
+ }
407
+ return null;
408
+ }
409
+
410
+ /** Fixed stage identifiers only; accept a complete marker at the suffix. */
411
+ export function storageFailureStageFromMessage(message) {
412
+ if (typeof message !== "string") return null;
413
+ const tail = message.slice(-1024);
414
+ const offset = tail.lastIndexOf(STAGE_MARKER);
415
+ if (offset < 0) return null;
416
+ const end = tail.indexOf("]", offset + STAGE_MARKER.length);
417
+ if (end < 0) return null;
418
+ const remainder = tail.slice(end + 1);
419
+ if (remainder !== "") {
420
+ const codes = storageFailureCodesFromMessage(remainder);
421
+ if (!codes.length || remainder !== `${MARKER}${codes.join(" -> ")}]`)
422
+ return null;
423
+ }
424
+ const identifiers = tail.slice(offset + STAGE_MARKER.length, end).split("/");
425
+ if (
426
+ identifiers.length !== 2 ||
427
+ !ARTIFACT_TYPES.has(identifiers[0]) ||
428
+ !PHASES.has(identifiers[1])
429
+ )
430
+ return null;
431
+ return Object.freeze({ artifactType: identifiers[0], phase: identifiers[1] });
432
+ }
433
+
434
+ /** Re-project the bounded marker without retaining any preceding error text. */
435
+ export function storageFailureCodesFromMessage(message) {
436
+ if (typeof message !== "string") return Object.freeze([]);
437
+ const tail = message.slice(-1024);
438
+ const offset = tail.lastIndexOf(MARKER);
439
+ if (offset < 0 || !tail.endsWith("]")) return Object.freeze([]);
440
+ const values = tail.slice(offset + MARKER.length, -1).split(" -> ");
441
+ if (values.length < 1 || values.length > MAX_CAUSES) return Object.freeze([]);
442
+ const result = [];
443
+ for (const value of values) {
444
+ const known = CODES.get(value);
445
+ if (!known) return Object.freeze([]);
446
+ if (!result.includes(known)) result.push(known);
447
+ }
448
+ return Object.freeze(result);
449
+ }
@@ -4,6 +4,7 @@ import {
4
4
  } from "../lib/formal-budget-provider-scope.js";
5
5
  import { isFormalBudgetError } from "../lib/formal-budget-errors.js";
6
6
  import { normalizeOllamaBaseUrl } from "../lib/ollama-base-url.js";
7
+ import { ollamaProviderFetch } from "../lib/ollama-provider-fetch.js";
7
8
  import {
8
9
  normalizeProviderBaseUrl,
9
10
  openAICompatibleBaseUrl,
@@ -12213,7 +12214,7 @@ export async function chatWithTools(rawMessages, options) {
12213
12214
  },
12214
12215
  );
12215
12216
  }
12216
- const response = await providerFetch(apiUrl, {
12217
+ const response = await ollamaProviderFetch(apiUrl, {
12217
12218
  method: "POST",
12218
12219
  headers: { "Content-Type": "application/json" },
12219
12220
  signal,
@@ -12622,7 +12623,12 @@ export async function chatWithTools(rawMessages, options) {
12622
12623
  throw new TypeError("Invalid API response: unsupported assistant message");
12623
12624
  }
12624
12625
  // Provider reasoning text is not part of the governed replay protocol.
12625
- const message = { role: "assistant", content: providerMessage.content };
12626
+ // Tool-only responses may omit content. Keep the live message JSON-safe for
12627
+ // canonical tool-round settlement instead of introducing an undefined field.
12628
+ const message = {
12629
+ role: "assistant",
12630
+ content: providerMessage.content ?? null,
12631
+ };
12626
12632
  if (Object.hasOwn(providerMessage, "tool_calls")) {
12627
12633
  message.tool_calls = providerMessage.tool_calls;
12628
12634
  }
@@ -13053,7 +13059,7 @@ async function _chatOllamaStreaming(
13053
13059
  stallMs,
13054
13060
  stallTimeoutMs,
13055
13061
  ) {
13056
- const response = await providerFetch(apiUrl, {
13062
+ const response = await ollamaProviderFetch(apiUrl, {
13057
13063
  method: "POST",
13058
13064
  headers: { "Content-Type": "application/json" },
13059
13065
  signal,
@@ -15282,38 +15288,53 @@ export async function* agentLoop(messages, options) {
15282
15288
  typeof options.runtimeResultRetention === "object"
15283
15289
  ? options.runtimeResultRetention
15284
15290
  : options.runtimeResultRetentionOptions;
15285
- const retained = releaseOldLiveSessionResults(messages, retentionConfig);
15291
+ const candidate = releaseOldLiveSessionResults(messages, retentionConfig);
15286
15292
  if (
15287
- retained.stats.released > 0 &&
15288
- !_sameMessageSnapshot(retained.messages, messages)
15293
+ candidate.stats.released > 0 &&
15294
+ !_sameMessageSnapshot(candidate.messages, messages)
15289
15295
  ) {
15290
- const authorityExpectedMessages = [...messages];
15291
- const liveExpectedMessages = [...messages];
15292
- try {
15293
- await _settleAutomaticCompaction({
15294
- messages,
15295
- liveExpectedMessages,
15296
- authorityExpectedMessages,
15297
- compacted: retained.messages,
15298
- stats: retained.stats,
15299
- options,
15300
- trigger: "runtime-retention",
15301
- });
15302
- yield {
15303
- type: "session-runtime-retention",
15304
- runId,
15305
- stats: retained.stats,
15306
- };
15307
- } catch (error) {
15308
- yield {
15309
- type: "session-runtime-retention-degraded",
15310
- runId,
15311
- reason:
15312
- error?.code === "SESSION_REVISION_STALE"
15313
- ? "session_messages_changed_during_retention"
15314
- : "canonical_retention_settlement_failed",
15315
- code: error?.code || "CC_SESSION_RETENTION_SETTLEMENT_FAILED",
15316
- };
15296
+ // Complete tool effects must be durable before a retention checkpoint
15297
+ // can compare against them. Let a host settlement failure propagate
15298
+ // before another provider call, just as semantic compaction does.
15299
+ options.onBeforeCompaction?.();
15300
+ // The host hook may update live context. Derive both the candidate and
15301
+ // the expected snapshots from the state after that boundary.
15302
+ const retained = releaseOldLiveSessionResults(
15303
+ messages,
15304
+ retentionConfig,
15305
+ );
15306
+ if (
15307
+ retained.stats.released > 0 &&
15308
+ !_sameMessageSnapshot(retained.messages, messages)
15309
+ ) {
15310
+ const authorityExpectedMessages = [...messages];
15311
+ const liveExpectedMessages = [...messages];
15312
+ try {
15313
+ await _settleAutomaticCompaction({
15314
+ messages,
15315
+ liveExpectedMessages,
15316
+ authorityExpectedMessages,
15317
+ compacted: retained.messages,
15318
+ stats: retained.stats,
15319
+ options,
15320
+ trigger: "runtime-retention",
15321
+ });
15322
+ yield {
15323
+ type: "session-runtime-retention",
15324
+ runId,
15325
+ stats: retained.stats,
15326
+ };
15327
+ } catch (error) {
15328
+ yield {
15329
+ type: "session-runtime-retention-degraded",
15330
+ runId,
15331
+ reason:
15332
+ error?.code === "SESSION_REVISION_STALE"
15333
+ ? "session_messages_changed_during_retention"
15334
+ : "canonical_retention_settlement_failed",
15335
+ code: error?.code || "CC_SESSION_RETENTION_SETTLEMENT_FAILED",
15336
+ };
15337
+ }
15317
15338
  }
15318
15339
  }
15319
15340
  }