chainlesschain 0.166.115 → 0.166.118

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 (207) hide show
  1. package/README.md +43 -5
  2. package/package.json +4 -4
  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-BsoSoDNb.js → AIOps-BGySwMIP.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-Dcx7Gm5t.js → ActionButton-Chn7fBLr.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-S1hsBIz3.js → Analytics-ORH7UkGa.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-B2j067qM.js → AppLayout-8xV4jWjP.js} +5 -5
  10. package/src/assets/web-panel/assets/{Artifacts-D5iGV9ic.js → Artifacts-26SBK-x-.js} +1 -1
  11. package/src/assets/web-panel/assets/{Audit-C8ChVvXu.js → Audit-CtXpqbXg.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-Cg97AAJS.js → BackgroundAgents-C5zLvQis.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-CyxU9IUg.js → Backup-C93xY4vO.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-CKlWjA8I.js → BaseInput-DpVCHfAn.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-C-EqZza6.js → Chat-DM0LblR2.js} +5 -5
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BRFiXKPX.js → ChatBubbleRenderer-unlQUF1T.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-kkI13tSJ.js → Checkbox-BsAt3cKR.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-NlqEDwHK.js → Codegen-E_kp4KFd.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-CfepEu79.js → Col-6msR3T6I.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-BRo0qLXM.js → Community-PyX9c5D-.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-BMu8TP0E.js → Compact-7G1bVDSH.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-B7Q3Moef.js → Compliance-DcHN7GlD.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-BVwt7Xmc.js → Cowork-WUIHJYDx.js} +3 -3
  24. package/src/assets/web-panel/assets/{Cron-CgBv20Qy.js → Cron-CWgCbptg.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-CwcSBJk2.js → Crosschain-BzKZ6roD.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-d20rCiIm.js → DID-r7zxeItn.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-PpZaUYpS.js → Dashboard-D3pBiN2H.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-DjsLdX_Z.js → Dropdown-C4otRJlZ.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-CaPkrtxn.js → EmailListRenderer-CzDTC8lm.js} +1 -1
  30. package/src/assets/web-panel/assets/{EvolutionSettings-DDY8cQnE.js → EvolutionSettings-DGkXiIs-.js} +1 -1
  31. package/src/assets/web-panel/assets/{FamilyGuardDashboard-VQavMjyj.js → FamilyGuardDashboard-BKdEyuiR.js} +1 -1
  32. package/src/assets/web-panel/assets/{Federation-D0GvKQgI.js → Federation-dsI-xcpf.js} +1 -1
  33. package/src/assets/web-panel/assets/{FormItemContext-Dl_TWHmb.js → FormItemContext-CEEb1fMR.js} +1 -1
  34. package/src/assets/web-panel/assets/{GenericCardRenderer-Bny2uagG.js → GenericCardRenderer-D_mfO3Ts.js} +1 -1
  35. package/src/assets/web-panel/assets/{Git-B01KXq47.js → Git-CBwr2ZI3.js} +2 -2
  36. package/src/assets/web-panel/assets/{Governance-F4c4Vwo1.js → Governance-D-Wy2Jjr.js} +1 -1
  37. package/src/assets/web-panel/assets/{Inference-_025Q-8K.js → Inference-B4Yk_IRx.js} +1 -1
  38. package/src/assets/web-panel/assets/{KnowledgeGraph-DwbTmQb1.js → KnowledgeGraph-DoI7bi6m.js} +1 -1
  39. package/src/assets/web-panel/assets/{Logs-CnNo0hCm.js → Logs-Ce1IiKAj.js} +2 -2
  40. package/src/assets/web-panel/assets/MarkdownRenderer-GND_8y0V.js +1 -0
  41. package/src/assets/web-panel/assets/{Marketplace-Dkz5bv7F.js → Marketplace-CsIEByzK.js} +1 -1
  42. package/src/assets/web-panel/assets/{McpTools-CBtRwDW_.js → McpTools-_DRzjcIn.js} +3 -3
  43. package/src/assets/web-panel/assets/{Memory-Y9jnyTb7.js → Memory-zvLpyi__.js} +2 -2
  44. package/src/assets/web-panel/assets/{MobileBridge-Br1urkOz.js → MobileBridge-DXd1ik2Z.js} +1 -1
  45. package/src/assets/web-panel/assets/{MobileProjects-DnsyuerX.js → MobileProjects-DKh2q-Y9.js} +1 -1
  46. package/src/assets/web-panel/assets/{Mtc-he3ZzieF.js → Mtc-Ct-fhtIx.js} +4 -4
  47. package/src/assets/web-panel/assets/{MtcAudit-BadphAuN.js → MtcAudit-J4zY3Oqk.js} +2 -2
  48. package/src/assets/web-panel/assets/{Multisig-3_pVLymK.js → Multisig-B2HJMCKe.js} +3 -3
  49. package/src/assets/web-panel/assets/{NLProgramming-DmtmHfsI.js → NLProgramming-CwcSmU4q.js} +1 -1
  50. package/src/assets/web-panel/assets/{Notes-CE4L2O55.js → Notes-Da53L6wb.js} +4 -4
  51. package/src/assets/web-panel/assets/{NotificationSettings-B7QmfJn9.js → NotificationSettings-BxhufdrA.js} +1 -1
  52. package/src/assets/web-panel/assets/{OrderTableRenderer-O0wRSyJ0.js → OrderTableRenderer-BoFwohAi.js} +1 -1
  53. package/src/assets/web-panel/assets/{Organization-BrlMSsyT.js → Organization-MIsMrUes.js} +4 -4
  54. package/src/assets/web-panel/assets/{Overflow-CY4ULPrZ.js → Overflow-Dy2P4v3q.js} +1 -1
  55. package/src/assets/web-panel/assets/{P2P-kIANZYKd.js → P2P-CD9Sxn2y.js} +2 -2
  56. package/src/assets/web-panel/assets/{PdhVaultBrowser-DEgB4rvF.js → PdhVaultBrowser-BvBWgfG0.js} +5 -5
  57. package/src/assets/web-panel/assets/{Permissions-CWxywRp5.js → Permissions-CwOlDRis.js} +4 -4
  58. package/src/assets/web-panel/assets/{PersonalDataHub-DAg7iCbr.js → PersonalDataHub-CZYaxEpv.js} +4 -4
  59. package/src/assets/web-panel/assets/{Pipeline-Brc6ONnR.js → Pipeline-kLU7PUbB.js} +1 -1
  60. package/src/assets/web-panel/assets/{Privacy-CcinYTL8.js → Privacy-BVRycSiI.js} +1 -1
  61. package/src/assets/web-panel/assets/{ProjectInit-Bz8XEsom.js → ProjectInit-DP3pr7uJ.js} +2 -2
  62. package/src/assets/web-panel/assets/{ProjectSettings-CsOMlSTZ.js → ProjectSettings-CACaDYjs.js} +2 -2
  63. package/src/assets/web-panel/assets/Projects-CB1k4zTC.js +1 -0
  64. package/src/assets/web-panel/assets/{Providers-CeunOQiH.js → Providers-D7Y9WHRE.js} +1 -1
  65. package/src/assets/web-panel/assets/{QrScannerModal-CN2a2_Fb.js → QrScannerModal-CeP8xzs1.js} +1 -1
  66. package/src/assets/web-panel/assets/{QuickAsk-CVeLif3e.js → QuickAsk-iJVFrhZ2.js} +1 -1
  67. package/src/assets/web-panel/assets/{Recommend-1k9WOEGM.js → Recommend-DmTpnagw.js} +1 -1
  68. package/src/assets/web-panel/assets/{RemoteSession-Q8UCqIMw.js → RemoteSession-C6ek8Uni.js} +2 -2
  69. package/src/assets/web-panel/assets/{Reputation-CkrCgXKM.js → Reputation-CPfwc9de.js} +1 -1
  70. package/src/assets/web-panel/assets/{Row-JFdvuTzi.js → Row-C1wwtSMJ.js} +1 -1
  71. package/src/assets/web-panel/assets/{RssFeed-C74JHCmk.js → RssFeed-BiDJsqaH.js} +3 -3
  72. package/src/assets/web-panel/assets/{Search-DrJiVO1T.js → Search-BF6Aon95.js} +1 -1
  73. package/src/assets/web-panel/assets/{Security-BJzNlSJq.js → Security-Bps0XnV4.js} +3 -3
  74. package/src/assets/web-panel/assets/{Services-D4TLMnJm.js → Services-uf92smGR.js} +2 -2
  75. package/src/assets/web-panel/assets/{Skeleton-cswTDqhh.js → Skeleton-DQd4eVWW.js} +1 -1
  76. package/src/assets/web-panel/assets/{Skills-Bv0rM1BS.js → Skills-DgamiYa5.js} +1 -1
  77. package/src/assets/web-panel/assets/{Sla-D9rE7hNh.js → Sla-CF1IVIrm.js} +1 -1
  78. package/src/assets/web-panel/assets/SpeechSettings-Bzxmjbpc.js +1 -0
  79. package/src/assets/web-panel/assets/{SyncSettings-BwnMG8kq.js → SyncSettings-B8zKauiq.js} +2 -2
  80. package/src/assets/web-panel/assets/{Tasks-wJvU24cB.js → Tasks-DPKV_xSt.js} +1 -1
  81. package/src/assets/web-panel/assets/{Templates-CZbRU3tN.js → Templates-BikeSZIF.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tenant-_jbpFJPZ.js → Tenant-CEaUaDkJ.js} +1 -1
  83. package/src/assets/web-panel/assets/{Terminal-BzNm5WKZ.js → Terminal-ZPgOSQ_q.js} +3 -3
  84. package/src/assets/web-panel/assets/{TimelineRenderer-bmybWjuS.js → TimelineRenderer-DmyB4Udk.js} +1 -1
  85. package/src/assets/web-panel/assets/{Tokens-o1WDcqVQ.js → Tokens-g85Pm5TO.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trigger-BB1D6sIB.js → Trigger-D202hx9a.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trust-CLxdCfy2.js → Trust-DzvQYVFy.js} +1 -1
  88. package/src/assets/web-panel/assets/{UkeySign-B9LS6vS0.js → UkeySign-KRzwddVg.js} +1 -1
  89. package/src/assets/web-panel/assets/{VideoEditing-Bg0-wxjz.js → VideoEditing-IRBXLO2z.js} +1 -1
  90. package/src/assets/web-panel/assets/{Wallet-Bw0G2F6P.js → Wallet-DSf5KPgQ.js} +4 -4
  91. package/src/assets/web-panel/assets/{WebAuthn-irEiNY9b.js → WebAuthn-DNPxLTCc.js} +5 -5
  92. package/src/assets/web-panel/assets/{WorkflowEditor-Bh08FbJs.js → WorkflowEditor-C3wAtVcK.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-De-FPjVT.js → chat-q3XXUtv2.js} +1 -1
  95. package/src/assets/web-panel/assets/{colors-ygdyvinU.js → colors-CF54SNei.js} +1 -1
  96. package/src/assets/web-panel/assets/{compact-item-BQ9jH9KV.js → compact-item-BaRkvZuT.js} +1 -1
  97. package/src/assets/web-panel/assets/{createContext-BFuVSyox.js → createContext-CDR9hsfs.js} +1 -1
  98. package/src/assets/web-panel/assets/devWarning-1LO-NplX.js +1 -0
  99. package/src/assets/web-panel/assets/{hasIn-i19GtR1P.js → hasIn-DlC--S8R.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DS1IwwGL.js → index-B0Ptc7yu.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-B1IsP_JO.js → index-B0V9rgdu.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CWfgeaG4.js → index-BEiUlFKb.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DTY20pWu.js → index-BJO0n1LQ.js} +1 -1
  104. package/src/assets/web-panel/assets/index-BLaJsev4.js +1 -0
  105. package/src/assets/web-panel/assets/index-BLmviChG.js +1 -0
  106. package/src/assets/web-panel/assets/{index-IXkif6J_.js → index-BU5DJqk7.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BVhtukYX.js → index-BY-Tf3OM.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BKlU5VZy.js → index-BZrE0Go8.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Bw5pTpnI.js → index-BizdX2X5.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BGMxK155.js → index-C87Yr3h1.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DVnFgasM.js → index-C9Wypz9e.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C61w3omz.js → index-CAoG_E-q.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-l5-J0jHx.js → index-CAxSyMrF.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-28DjsABm.js → index-CC5HjNM6.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BPUCvc8i.js → index-CNZQEZ9g.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CpdXhhMY.js → index-CPvIhha6.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DAboGZTw.js → index-CR_wqMGy.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DL7ewjD2.js → index-CSClXoB3.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Bhf-MuUh.js → index-CZ8azVgB.js} +3 -3
  120. package/src/assets/web-panel/assets/{index-BaaydJcC.js → index-Ccc5z8eJ.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-B2LieObB.js → index-CeiKbM3a.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-We2nK3ju.js → index-Cl6av3X7.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-m8waSAyv.js → index-CtGfeD7E.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-cDJsyAkI.js → index-Ctid12Gq.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DlwxUZQL.js → index-D0H-N0uG.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BBYiCI1d.js → index-D0vIgprF.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-_9tUBcLm.js → index-D4wUDFRg.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-4HoFz1MA.js → index-DJFipyK7.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Cq9k4-Ws.js → index-DX2REKNp.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DuuOX5u3.js → index-Dc3gD0cw.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DgjLaB7k.js → index-DiQzer2R.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CMNjaSir.js → index-DntKLOs9.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-vXtH3o6O.js → index-Dplhl6gh.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BLMtCKAY.js → index-Dq8q_PWB.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CXrk8OYO.js → index-IVQdOBNN.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-CBVcGaxk.js → index-Kerduyao.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-BKblSCL9.js → index-W6cLGjpW.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-CgoSgmjK.js → index-qZDNFll9.js} +1 -1
  139. package/src/assets/web-panel/assets/{initDefaultProps-B_EZHeqN.js → initDefaultProps-Ccz7v71u.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-BrVb_Gy1.js → motion-BlCLpVDp.js} +1 -1
  143. package/src/assets/web-panel/assets/{move-CKxVRL_J.js → move-B80G7fLU.js} +1 -1
  144. package/src/assets/web-panel/assets/{mtc-parser-C80rvQ1J.js → mtc-parser-Djw08NJh.js} +1 -1
  145. package/src/assets/web-panel/assets/{omit-De5vD7BR.js → omit-Bg_G1eUr.js} +1 -1
  146. package/src/assets/web-panel/assets/{pickAttrs-BTyEDjth.js → pickAttrs-Df9zYUg2.js} +1 -1
  147. package/src/assets/web-panel/assets/{placementArrow-BWR94AjR.js → placementArrow-DjCDLhJ4.js} +1 -1
  148. package/src/assets/web-panel/assets/{responsiveObserve-1g-Vnibk.js → responsiveObserve--Naz7NgY.js} +1 -1
  149. package/src/assets/web-panel/assets/{slide-Dmg6dYuF.js → slide-CHn3ald-.js} +1 -1
  150. package/src/assets/web-panel/assets/{statusUtils-Ddj6rSab.js → statusUtils-BiGwoIK_.js} +1 -1
  151. package/src/assets/web-panel/assets/{styleChecker-DyP1mPDf.js → styleChecker-Zf2dQx1j.js} +1 -1
  152. package/src/assets/web-panel/assets/{useFlexGapSupport-D3d_0YuY.js → useFlexGapSupport-sLES8nyD.js} +1 -1
  153. package/src/assets/web-panel/assets/{useFs-M3vq-gE2.js → useFs-DV1Hl4qu.js} +1 -1
  154. package/src/assets/web-panel/assets/{usePersonalDataHub-GtP2TgtK.js → usePersonalDataHub-CZXr2Qxg.js} +1 -1
  155. package/src/assets/web-panel/assets/{vnode-BurE2ATQ.js → vnode-e8Eo3Oyl.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-Ch-ViiDe.js → zoom-B8A6xKMF.js} +1 -1
  158. package/src/assets/web-panel/index.html +1 -1
  159. package/src/commands/compact.js +7 -2
  160. package/src/data/changelog.json +27 -1
  161. package/src/harness/jsonl-session-store.js +80 -74
  162. package/src/harness/prompt-compressor.js +57 -3
  163. package/src/lib/artifact-store.js +129 -20
  164. package/src/lib/bounded-artifact-file-read.js +128 -46
  165. package/src/lib/context-memory-kernel/context-image-transport.js +248 -0
  166. package/src/lib/context-memory-kernel/jsonl-session-context-port.js +4 -1
  167. package/src/lib/context-memory-kernel/live-compaction.js +40 -10
  168. package/src/lib/context-memory-kernel/message-adapter.js +80 -10
  169. package/src/lib/context-memory-kernel/message-bundle-store.js +1140 -0
  170. package/src/lib/context-memory-kernel/provider-context.js +23 -8
  171. package/src/lib/evolution/agent-evolution-ingress.js +103 -19
  172. package/src/lib/evolution/agent-evolution-runtime-composition.js +65 -27
  173. package/src/lib/evolution/agent-model-projection.js +90 -18
  174. package/src/lib/evolution/evidence-json-text.js +341 -42
  175. package/src/lib/evolution/evolution-artifact-ports.js +1005 -83
  176. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +59 -15
  177. package/src/lib/evolution/evolution-evidence-projector.js +153 -16
  178. package/src/lib/evolution/evolution-evidence-storage-layout.js +115 -0
  179. package/src/lib/evolution/evolution-file-witness.js +7 -3
  180. package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +6 -2
  181. package/src/lib/evolution/evolution-ledger-file-manifest-head-store.js +6 -2
  182. package/src/lib/evolution/evolution-ledger.js +226 -55
  183. package/src/lib/evolution/evolution-private-storage.js +20 -0
  184. package/src/lib/evolution/evolution-run-ledger-adapter.js +298 -11
  185. package/src/lib/evolution/evolution-windows-directory-durability.js +215 -32
  186. package/src/lib/evolution/local-ui-evolution-runtime.js +3 -38
  187. package/src/lib/evolution/local-ui-signing-authority.js +69 -0
  188. package/src/lib/image-token-estimate.js +59 -0
  189. package/src/lib/ollama-provider-fetch.js +33 -0
  190. package/src/lib/provider-stream.js +14 -13
  191. package/src/lib/read-file-loop-guard.js +7 -4
  192. package/src/lib/session-history-origins.js +94 -35
  193. package/src/lib/session-message-provenance.js +26 -2
  194. package/src/lib/session-runtime-retention.js +10 -1
  195. package/src/lib/session-transcript-history.js +5 -1
  196. package/src/lib/session-transcript-migration.js +67 -12
  197. package/src/lib/storage-failure-cause-codes.js +449 -0
  198. package/src/lib/tool-result-preview.js +276 -0
  199. package/src/runtime/agent-core.js +111 -92
  200. package/src/runtime/headless-stream.js +121 -27
  201. package/src/assets/web-panel/assets/MarkdownRenderer-D8_iZief.js +0 -1
  202. package/src/assets/web-panel/assets/Projects-BeSOM6wi.js +0 -1
  203. package/src/assets/web-panel/assets/SpeechSettings-Bfhvin8B.js +0 -1
  204. package/src/assets/web-panel/assets/devWarning-c2I2Rn4_.js +0 -1
  205. package/src/assets/web-panel/assets/index-CTs4dYcV.js +0 -1
  206. package/src/assets/web-panel/assets/index-DeuvaW15.js +0 -1
  207. package/src/assets/web-panel/assets/markdown-CsiA8-E5.js +0 -50
@@ -1,12 +1,20 @@
1
1
  import evolutionRun from "@chainlesschain/session-core/evolution-run";
2
+ import { types } from "node:util";
2
3
 
3
4
  import {
4
5
  EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
6
+ EvolutionArtifactPorts,
7
+ captureEvolutionLedgerArtifactResolverBinding,
8
+ captureEvolutionLedgerBatchReadWindow,
9
+ captureEvolutionLedgerWholeHistoryReader,
10
+ hasEvolutionLedgerDefaultPublication,
5
11
  isEvolutionLedgerArtifactResolver,
6
12
  } from "./evolution-artifact-ports.js";
7
13
  import {
8
14
  EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
9
15
  EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
16
+ hasEvolutionLedgerDefaultAppendPorts,
17
+ getEvolutionLedgerVerifiedHistoryReader,
10
18
  } from "./evolution-ledger.js";
11
19
 
12
20
  const { EVENT_TYPES, projectEvolutionRun } = evolutionRun;
@@ -20,6 +28,7 @@ export const EVOLUTION_RUN_LEDGER_CORRUPT_CODE =
20
28
  const ARTIFACT_TYPE = "evolution-run-event";
21
29
  const DIGEST = /^sha256:[a-f0-9]{64}$/u;
22
30
  const EVIDENCE_READERS = new WeakMap();
31
+ const APPEND_NEXT = new WeakMap();
23
32
  const EVENT_KEYS = new Set([
24
33
  "schema",
25
34
  "tenantId",
@@ -117,6 +126,80 @@ function normalizeEvent(input, descriptor) {
117
126
  return Object.freeze(event);
118
127
  }
119
128
 
129
+ // The new composition port accepts data only, never a sequence or a callback.
130
+ // Capture all nested values before any current-authority port can run.
131
+ function captureNextEventData(value, seen = new Set()) {
132
+ if (value === null || typeof value === "string" || typeof value === "boolean")
133
+ return value;
134
+ if (typeof value === "number" && Number.isFinite(value)) return value;
135
+ if (
136
+ !value ||
137
+ typeof value !== "object" ||
138
+ types.isProxy(value) ||
139
+ seen.has(value)
140
+ )
141
+ throw new TypeError("append-next event must contain acyclic plain data");
142
+ const array = Array.isArray(value);
143
+ const prototype = Object.getPrototypeOf(value);
144
+ if (!array && prototype !== Object.prototype && prototype !== null)
145
+ throw new TypeError("append-next event must contain plain objects");
146
+ const keys = Reflect.ownKeys(value).filter(
147
+ (key) => !(array && key === "length"),
148
+ );
149
+ if (
150
+ array &&
151
+ (keys.length !== value.length ||
152
+ keys.some((key, index) => key !== String(index)))
153
+ )
154
+ throw new TypeError("append-next event arrays must contain dense data");
155
+ const captured = array ? [] : Object.create(null);
156
+ seen.add(value);
157
+ try {
158
+ for (const key of keys) {
159
+ const property = Object.getOwnPropertyDescriptor(value, key);
160
+ if (
161
+ typeof key !== "string" ||
162
+ !property?.enumerable ||
163
+ !("value" in property)
164
+ )
165
+ throw new TypeError(
166
+ "append-next event cannot contain accessors or symbols",
167
+ );
168
+ captured[key] = captureNextEventData(property.value, seen);
169
+ }
170
+ } finally {
171
+ seen.delete(value);
172
+ }
173
+ return captured;
174
+ }
175
+
176
+ function normalizeNextEvent(input, descriptor) {
177
+ const captured = captureNextEventData(input);
178
+ if (
179
+ !captured ||
180
+ Array.isArray(captured) ||
181
+ Reflect.ownKeys(captured).length !== EVENT_KEYS.size - 1 ||
182
+ Reflect.ownKeys(captured).some(
183
+ (key) => key === "sequence" || !EVENT_KEYS.has(key),
184
+ )
185
+ )
186
+ throw new TypeError(
187
+ "append-next event requires event fields without sequence",
188
+ );
189
+ const { sequence: _temporary, ...event } = normalizeEvent(
190
+ { ...captured, sequence: 1 },
191
+ descriptor,
192
+ );
193
+ return freeze(event);
194
+ }
195
+
196
+ function hasOriginalMethods(prototype, methods) {
197
+ return Object.entries(methods).every(
198
+ ([name, method]) =>
199
+ Object.getOwnPropertyDescriptor(prototype, name)?.value === method,
200
+ );
201
+ }
202
+
120
203
  function parseRecord(resolution, descriptor) {
121
204
  if (
122
205
  resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
@@ -157,6 +240,12 @@ function parseRecord(resolution, descriptor) {
157
240
  }
158
241
 
159
242
  export class EvolutionRunLedgerAdapter {
243
+ #readBatches;
244
+ #verifiedHistory;
245
+ #originalRead;
246
+ #originalVerify;
247
+ #appendNextEligible;
248
+
160
249
  constructor({
161
250
  descriptor: input,
162
251
  artifactPorts,
@@ -169,6 +258,12 @@ export class EvolutionRunLedgerAdapter {
169
258
  this._read = capture(ledger, "read", "ledger");
170
259
  this._verify = capture(ledger, "verify", "ledger");
171
260
  this._append = capture(ledger, "appendDomainEvent", "ledger");
261
+ this.#originalRead = this._read;
262
+ this.#originalVerify = this._verify;
263
+ this.#verifiedHistory =
264
+ new.target === EvolutionRunLedgerAdapter
265
+ ? getEvolutionLedgerVerifiedHistoryReader(ledger)
266
+ : null;
172
267
  if (!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver)) {
173
268
  throw new TypeError(
174
269
  "a branded EvolutionArtifactPorts ledger resolver is required",
@@ -177,7 +272,38 @@ export class EvolutionRunLedgerAdapter {
177
272
  if (typeof now !== "function")
178
273
  throw new TypeError("now must be a function");
179
274
  this._resolve = ledgerArtifactResolver;
275
+ this.#readBatches = captureEvolutionLedgerBatchReadWindow(
276
+ ledgerArtifactResolver,
277
+ );
180
278
  this._now = now;
279
+ const binding = captureEvolutionLedgerArtifactResolverBinding(
280
+ ledgerArtifactResolver,
281
+ );
282
+ this.#appendNextEligible = () =>
283
+ this.#verifiedHistory !== null &&
284
+ hasEvolutionLedgerDefaultAppendPorts(ledger) &&
285
+ Object.getPrototypeOf(this) === EvolutionRunLedgerAdapter.prototype &&
286
+ binding.matchesArtifactPorts(artifactPorts) &&
287
+ hasEvolutionLedgerDefaultPublication(this._resolve) &&
288
+ Object.getPrototypeOf(artifactPorts) ===
289
+ EvolutionArtifactPorts.prototype &&
290
+ hasOriginalMethods(
291
+ EvolutionRunLedgerAdapter.prototype,
292
+ ORIGINAL_RUN_METHODS,
293
+ ) &&
294
+ captureEvolutionLedgerWholeHistoryReader(this._resolve) !== null;
295
+ if (
296
+ new.target === EvolutionRunLedgerAdapter &&
297
+ this.#appendNextEligible()
298
+ ) {
299
+ APPEND_NEXT.set(
300
+ this,
301
+ Object.freeze({
302
+ eligible: this.#appendNextEligible,
303
+ append: Object.freeze((input) => this.#appendNext(input)),
304
+ }),
305
+ );
306
+ }
181
307
  const load = this.load.bind(this);
182
308
  const verify = this._verify;
183
309
  const checkpoints = new WeakSet();
@@ -258,7 +384,10 @@ export class EvolutionRunLedgerAdapter {
258
384
  }
259
385
 
260
386
  _domainEvents() {
261
- const events = this._read();
387
+ return this.#filterDomainEvents(this._read());
388
+ }
389
+
390
+ #filterDomainEvents(events) {
262
391
  if (!Array.isArray(events)) {
263
392
  fail(
264
393
  EVOLUTION_RUN_LEDGER_CORRUPT_CODE,
@@ -275,6 +404,17 @@ export class EvolutionRunLedgerAdapter {
275
404
  }
276
405
 
277
406
  _resolveEvent(domainEvent) {
407
+ return this.#resolveEventWithIdentity(domainEvent, this._verify());
408
+ }
409
+
410
+ #resolveEventWithIdentity(domainEvent, identity) {
411
+ return this.#parseResolvedEvent(
412
+ domainEvent,
413
+ this._resolve(this.#eventRequest(domainEvent, identity)),
414
+ );
415
+ }
416
+
417
+ #eventRequest(domainEvent, identity) {
278
418
  if (
279
419
  !domainEvent?.subjectRef ||
280
420
  typeof domainEvent.subjectRef.ref !== "string" ||
@@ -285,13 +425,15 @@ export class EvolutionRunLedgerAdapter {
285
425
  "EvolutionRun ledger subject reference is invalid",
286
426
  );
287
427
  }
288
- const identity = this._verify();
289
- const resolution = this._resolve({
428
+ return {
290
429
  epoch: identity.epoch,
291
430
  ledgerId: identity.ledgerId,
292
431
  ref: domainEvent.subjectRef,
293
432
  tenantId: this.descriptor.artifactTenantId,
294
- });
433
+ };
434
+ }
435
+
436
+ #parseResolvedEvent(domainEvent, resolution) {
295
437
  if (
296
438
  resolution?.ref !== domainEvent.subjectRef.ref ||
297
439
  resolution.digest !== domainEvent.subjectRef.digest
@@ -305,10 +447,106 @@ export class EvolutionRunLedgerAdapter {
305
447
  }
306
448
 
307
449
  _entries() {
308
- const entries = this._domainEvents().map((domainEvent) => ({
309
- domainEvent,
310
- event: this._resolveEvent(domainEvent),
311
- }));
450
+ return this.#readEntriesWithAuthority().entries;
451
+ }
452
+
453
+ #readEntriesWithAuthority() {
454
+ // Authenticate one frontier around the complete synchronous read. Verifying
455
+ // the full ledger once for every Run event made each load quadratic in its
456
+ // history. Artifact bytes and current authority are still checked for each
457
+ // item; the identity is scoped to this read and is never caller supplied.
458
+ // Original ledgers can supply authority and events from one locked load.
459
+ // Custom/subclass ports keep their established calls and override behavior.
460
+ const history =
461
+ this.#verifiedHistory &&
462
+ this._read === this.#originalRead &&
463
+ this._verify === this.#originalVerify &&
464
+ this._domainEvents === ORIGINAL_DOMAIN_EVENTS
465
+ ? this.#verifiedHistory()
466
+ : null;
467
+ const { verifiedAt: _beforeObservation, ...before } = clone(
468
+ history === null ? this._verify() : history.authority,
469
+ );
470
+ const domainEvents =
471
+ history === null
472
+ ? this._domainEvents()
473
+ : this.#filterDomainEvents(history.events);
474
+ const entries = [];
475
+ try {
476
+ // Original ports can seal the complete history between two index reads.
477
+ // Custom ports retain their established chunk callback window. Both
478
+ // paths freshly authenticate each payload and its current authority.
479
+ const readWholeHistory =
480
+ history !== null
481
+ ? captureEvolutionLedgerWholeHistoryReader(this._resolve)
482
+ : null;
483
+ if (domainEvents.length > 0 && readWholeHistory !== null) {
484
+ const resolutions = readWholeHistory(
485
+ domainEvents.map((event) => this.#eventRequest(event, before)),
486
+ );
487
+ if (
488
+ !Array.isArray(resolutions) ||
489
+ resolutions.length !== domainEvents.length
490
+ ) {
491
+ fail(
492
+ EVOLUTION_RUN_LEDGER_CORRUPT_CODE,
493
+ "EvolutionRun artifact history is incomplete",
494
+ );
495
+ }
496
+ for (let index = 0; index < domainEvents.length; index += 1) {
497
+ const domainEvent = domainEvents[index];
498
+ entries.push({
499
+ domainEvent,
500
+ event: this.#parseResolvedEvent(domainEvent, resolutions[index]),
501
+ });
502
+ }
503
+ } else if (domainEvents.length > 0)
504
+ this.#readBatches((resolveBatch) => {
505
+ for (let offset = 0; offset < domainEvents.length; offset += 128) {
506
+ const batch = domainEvents.slice(offset, offset + 128);
507
+ const resolutions = resolveBatch(
508
+ batch.map((event) => this.#eventRequest(event, before)),
509
+ );
510
+ if (
511
+ !Array.isArray(resolutions) ||
512
+ resolutions.length !== batch.length
513
+ ) {
514
+ fail(
515
+ EVOLUTION_RUN_LEDGER_CORRUPT_CODE,
516
+ "EvolutionRun artifact batch is incomplete",
517
+ );
518
+ }
519
+ entries.push(
520
+ ...batch.map((domainEvent, index) => ({
521
+ domainEvent,
522
+ event: this.#parseResolvedEvent(
523
+ domainEvent,
524
+ resolutions[index],
525
+ ),
526
+ })),
527
+ );
528
+ }
529
+ });
530
+ } catch (cause) {
531
+ // A concurrent append can invalidate the batch index before the normal
532
+ // final frontier check. Preserve the established conflict classification
533
+ // only when a fresh successful verification proves that frontier changed.
534
+ let afterFailure = null;
535
+ try {
536
+ const { verifiedAt: _observation, ...identity } = clone(this._verify());
537
+ afterFailure = identity;
538
+ } catch {
539
+ /* Unverified state must not reclassify an artifact failure. */
540
+ }
541
+ if (afterFailure !== null && !same(before, afterFailure)) {
542
+ fail(
543
+ EVOLUTION_RUN_LEDGER_CONFLICT_CODE,
544
+ "EvolutionRun ledger frontier changed during recovery",
545
+ { cause },
546
+ );
547
+ }
548
+ throw cause;
549
+ }
312
550
  entries.sort((left, right) => left.event.sequence - right.event.sequence);
313
551
  for (let index = 0; index < entries.length; index += 1) {
314
552
  const entry = entries[index];
@@ -353,7 +591,14 @@ export class EvolutionRunLedgerAdapter {
353
591
  runId: this.descriptor.runId,
354
592
  });
355
593
  }
356
- return entries;
594
+ const { verifiedAt: _afterObservation, ...after } = clone(this._verify());
595
+ if (!same(before, after)) {
596
+ fail(
597
+ EVOLUTION_RUN_LEDGER_CONFLICT_CODE,
598
+ "EvolutionRun ledger frontier changed during recovery",
599
+ );
600
+ }
601
+ return { entries, authority: after };
357
602
  }
358
603
 
359
604
  load() {
@@ -374,6 +619,24 @@ export class EvolutionRunLedgerAdapter {
374
619
  appendEvent(input) {
375
620
  const event = normalizeEvent(input, this.descriptor);
376
621
  const before = this._entries();
622
+ return this.#appendPrepared(event, before, false);
623
+ }
624
+
625
+ #appendNext(input) {
626
+ const captured = normalizeNextEvent(input, this.descriptor);
627
+ if (!this.#appendNextEligible()) {
628
+ const current = this.load();
629
+ return this.appendEvent({
630
+ ...captured,
631
+ sequence: current.events.length + 1,
632
+ });
633
+ }
634
+ const before = this._entries();
635
+ const event = Object.freeze({ ...captured, sequence: before.length + 1 });
636
+ return this.#appendPrepared(event, before, true);
637
+ }
638
+
639
+ #appendPrepared(event, before, allowPrivateHeadProof) {
377
640
  const duplicate = before.find(
378
641
  ({ event: stored }) => stored.eventId === event.eventId,
379
642
  );
@@ -419,8 +682,17 @@ export class EvolutionRunLedgerAdapter {
419
682
  "EvolutionRun event persistence was not durably confirmed",
420
683
  );
421
684
  }
422
- const head = this._verify();
423
- const currentBeforeAppend = this._entries();
685
+ let head, currentBeforeAppend;
686
+ if (allowPrivateHeadProof && this.#appendNextEligible()) {
687
+ // This authority comes from the same complete post-publication read,
688
+ // including its final frontier comparison. It never survives this call.
689
+ const current = this.#readEntriesWithAuthority();
690
+ head = current.authority;
691
+ currentBeforeAppend = current.entries;
692
+ } else {
693
+ head = this._verify();
694
+ currentBeforeAppend = this._entries();
695
+ }
424
696
  if (
425
697
  currentBeforeAppend.length !== before.length ||
426
698
  currentBeforeAppend.some(
@@ -493,6 +765,21 @@ export class EvolutionRunLedgerAdapter {
493
765
  }
494
766
  }
495
767
 
768
+ const ORIGINAL_DOMAIN_EVENTS =
769
+ EvolutionRunLedgerAdapter.prototype._domainEvents;
770
+ const ORIGINAL_RUN_METHODS = Object.freeze({
771
+ load: EvolutionRunLedgerAdapter.prototype.load,
772
+ appendEvent: EvolutionRunLedgerAdapter.prototype.appendEvent,
773
+ _entries: EvolutionRunLedgerAdapter.prototype._entries,
774
+ _domainEvents: ORIGINAL_DOMAIN_EVENTS,
775
+ });
776
+
777
+ /** Optional original-port composition; no caller sequence or authority input. */
778
+ export function captureEvolutionRunAppendNext(adapter) {
779
+ const capability = APPEND_NEXT.get(adapter);
780
+ return capability?.eligible() ? capability.append : null;
781
+ }
782
+
496
783
  /** Read-only capability registered only by the real Run adapter constructor. */
497
784
  export function captureEvolutionRunEvidenceReader(adapter) {
498
785
  const reader = EVIDENCE_READERS.get(adapter);