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
@@ -12,6 +12,7 @@ import {
12
12
  } from "./message-adapter.js";
13
13
  import { JsonlSessionContextPort } from "./jsonl-session-context-port.js";
14
14
  import { createCliContextMemoryRuntime } from "./runtime.js";
15
+ import { imageTransportEstimate } from "../image-token-estimate.js";
15
16
  import { projectRuntimeTokenUsage } from "../runtime-usage-ledger.js";
16
17
  import {
17
18
  projectCanonicalResumeMessages,
@@ -37,8 +38,14 @@ function estimatedTokens(messages) {
37
38
  typeof message?.content === "string"
38
39
  ? message.content
39
40
  : JSON.stringify(message?.content ?? "");
41
+ const image = imageTransportEstimate([message]);
40
42
  return (
41
- total + Math.max(1, Math.ceil(Buffer.byteLength(content, "utf8") / 4))
43
+ total +
44
+ Math.max(
45
+ 1,
46
+ Math.ceil((Buffer.byteLength(content, "utf8") - image.bytes) / 4) +
47
+ image.tokens,
48
+ )
42
49
  );
43
50
  }, 0),
44
51
  );
@@ -75,6 +82,7 @@ class CallbackSessionContextPort extends InMemorySessionContextPort {
75
82
  summaryStats,
76
83
  head,
77
84
  physicalAuthority,
85
+ allowExternalization = false,
78
86
  }) {
79
87
  const initialHead =
80
88
  head ||
@@ -87,10 +95,14 @@ class CallbackSessionContextPort extends InMemorySessionContextPort {
87
95
  sessionId,
88
96
  head: initialHead,
89
97
  memoryRevision,
90
- items: messagesToContextItems(messages, { sessionId }),
98
+ items: messagesToContextItems(messages, {
99
+ sessionId,
100
+ allowExternalization,
101
+ }),
91
102
  },
92
103
  ]);
93
104
  this.commit = commit;
105
+ this.sessionId = sessionId;
94
106
  this.expectedMessages = [...messages];
95
107
  this.trigger = trigger;
96
108
  this.summaryStats = summaryStats;
@@ -102,7 +114,9 @@ class CallbackSessionContextPort extends InMemorySessionContextPort {
102
114
  if (!snapshot || snapshot.head !== expectedHead) {
103
115
  return { ok: false, currentHead: snapshot?.head || null };
104
116
  }
105
- const outputMessages = contextItemsToMessages(event.outputItems);
117
+ const outputMessages = contextItemsToMessages(event.outputItems, {
118
+ sessionId: this.sessionId,
119
+ });
106
120
  const stats = compactionStats(
107
121
  event,
108
122
  outputMessages,
@@ -143,10 +157,15 @@ class CallbackSessionContextPort extends InMemorySessionContextPort {
143
157
  }
144
158
  }
145
159
 
146
- function kernelBudget(compressor, ephemeralTokens = 0) {
160
+ function kernelBudget(compressor, ephemeralTokens = 0, messages = []) {
147
161
  const inputBudget = Math.max(
148
162
  256,
149
- Math.trunc(Number(compressor?.maxTokens)) || 16_384,
163
+ Math.trunc(
164
+ Number(
165
+ compressor?.getCompactionTokenBudget?.(messages) ??
166
+ compressor?.maxTokens,
167
+ ),
168
+ ) || 16_384,
150
169
  );
151
170
  const reservedOutputTokens = Math.max(
152
171
  1,
@@ -269,6 +288,7 @@ export async function compactLiveMessagesCanonical(
269
288
  commit: options.commit,
270
289
  trigger,
271
290
  summaryStats: () => summaryStats,
291
+ allowExternalization: persistentSession,
272
292
  ...(verifiedAuthoritySnapshot?.head
273
293
  ? { head: verifiedAuthoritySnapshot.head, physicalAuthority: true }
274
294
  : {}),
@@ -304,7 +324,10 @@ export async function compactLiveMessagesCanonical(
304
324
  "chainlesschain.cli-live-session-head/v1",
305
325
  ),
306
326
  memoryRevision: await bootstrapRuntime.memoryPort.getRevision(),
307
- items: messagesToContextItems(messages, { sessionId }),
327
+ items: messagesToContextItems(messages, {
328
+ sessionId,
329
+ allowExternalization: false,
330
+ }),
308
331
  },
309
332
  ]);
310
333
  runtime = createCliContextMemoryRuntime({
@@ -327,7 +350,10 @@ export async function compactLiveMessagesCanonical(
327
350
  const authority =
328
351
  verifiedAuthoritySnapshot ||
329
352
  (await runtime.sessionPort.readSnapshot(sessionId));
330
- const inputItems = messagesToContextItems(messages, { sessionId });
353
+ const inputItems = messagesToContextItems(messages, {
354
+ sessionId,
355
+ allowExternalization: true,
356
+ });
331
357
  const inputDigest = canonicalDigest(
332
358
  inputItems.map((item) => item.digest),
333
359
  "chainlesschain.cli-live-message-set/v1",
@@ -368,8 +394,9 @@ export async function compactLiveMessagesCanonical(
368
394
  compressor,
369
395
  messagesToContextItems(
370
396
  ephemeralMessages.map(({ message }) => message),
371
- { sessionId },
397
+ { sessionId, allowExternalization: false },
372
398
  ).reduce((total, item) => total + item.tokenEstimate, 0),
399
+ messages,
373
400
  ),
374
401
  sink: provider,
375
402
  scopeAdmissions: [{ scope: "session", scopeId: sessionId }],
@@ -386,7 +413,9 @@ export async function compactLiveMessagesCanonical(
386
413
  model,
387
414
  },
388
415
  summarizer: async (droppedItems, context) => {
389
- const droppedMessages = contextItemsToMessages(droppedItems);
416
+ const droppedMessages = contextItemsToMessages(droppedItems, {
417
+ sessionId,
418
+ });
390
419
  const result = await compressor.compress(droppedMessages, {
391
420
  preserveToolPairs: true,
392
421
  ...(options.compressOptions || {}),
@@ -402,6 +431,7 @@ export async function compactLiveMessagesCanonical(
402
431
  parents: droppedItems,
403
432
  operationId: context.operationId,
404
433
  now: operationNow,
434
+ allowExternalization: persistentSession,
405
435
  })
406
436
  : null;
407
437
  return {
@@ -492,7 +522,7 @@ export async function compactLiveMessagesCanonical(
492
522
  ephemeralMessages[ephemeralIndex].sequence <= sequence
493
523
  )
494
524
  restoredMessages.push(ephemeralMessages[ephemeralIndex++].message);
495
- restoredMessages.push(...contextItemsToMessages([item]));
525
+ restoredMessages.push(...contextItemsToMessages([item], { sessionId }));
496
526
  }
497
527
  restoredMessages.push(
498
528
  ...ephemeralMessages.slice(ephemeralIndex).map(({ message }) => message),
@@ -7,6 +7,12 @@ import {
7
7
  getDurableSystemMessageProvenance,
8
8
  markDurableSystemMessage,
9
9
  } from "../session-message-provenance.js";
10
+ import { imageTransportEstimate } from "../image-token-estimate.js";
11
+ import {
12
+ SESSION_MESSAGE_BUNDLE_MAX_INLINE_BYTES,
13
+ readSessionMessageBundle,
14
+ storeSessionMessageBundle,
15
+ } from "./message-bundle-store.js";
10
16
 
11
17
  const MESSAGE_BUNDLE_SCHEMA = "chainlesschain.cli-context-message-bundle/v1";
12
18
  const DEFAULT_ALLOWED_SINKS = Object.freeze(["*"]);
@@ -102,6 +108,27 @@ function priorityForBundle(messages, sequence, pendingTool) {
102
108
  return Math.min(999_999, rolePriority + Math.min(sequence, 99_999));
103
109
  }
104
110
 
111
+ function contentStorageFields(
112
+ content,
113
+ sessionId,
114
+ allowExternalization = false,
115
+ ) {
116
+ if (
117
+ Buffer.byteLength(content, "utf8") <=
118
+ SESSION_MESSAGE_BUNDLE_MAX_INLINE_BYTES
119
+ ) {
120
+ return { content };
121
+ }
122
+ if (allowExternalization !== true) {
123
+ const error = new Error(
124
+ "Large image context bundles require an explicitly saved session",
125
+ );
126
+ error.code = "CC_CONTEXT_IMAGE_TRANSPORT_INVALID";
127
+ throw error;
128
+ }
129
+ return { contentRef: storeSessionMessageBundle({ sessionId, content }) };
130
+ }
131
+
105
132
  function createItem({
106
133
  sessionId,
107
134
  messages,
@@ -110,9 +137,11 @@ function createItem({
110
137
  toolGroupId = null,
111
138
  allowedSinks,
112
139
  trustedSystemPolicy = false,
140
+ allowExternalization = false,
113
141
  }) {
114
142
  const payload = bundlePayload(messages);
115
143
  const content = canonicalJson(payload);
144
+ const image = imageTransportEstimate(messages);
116
145
  const sourceDigest = canonicalDigest(
117
146
  { sessionId, sequence, content },
118
147
  "chainlesschain.cli-context-source/v1",
@@ -142,12 +171,13 @@ function createItem({
142
171
  allowedSinks: allowedSinks || DEFAULT_ALLOWED_SINKS,
143
172
  tokenEstimate: Math.max(
144
173
  1,
145
- Math.ceil(Buffer.byteLength(content, "utf8") / 4),
174
+ Math.ceil((Buffer.byteLength(content, "utf8") - image.bytes) / 4) +
175
+ image.tokens,
146
176
  ),
147
177
  priority: priorityForBundle(messages, sequence, pendingTool),
148
178
  pinned: false,
149
179
  createdAt: new Date(sequence).toISOString(),
150
- content,
180
+ ...contentStorageFields(content, sessionId, allowExternalization),
151
181
  ...(pendingTool
152
182
  ? {
153
183
  binding: {
@@ -212,6 +242,7 @@ export function messagesToContextItems(messagesInput, options = {}) {
212
242
  pendingTool: pending,
213
243
  toolGroupId: `tool-group-${groupDigest.slice(7, 39)}`,
214
244
  allowedSinks,
245
+ allowExternalization: options.allowExternalization === true,
215
246
  }),
216
247
  );
217
248
  index = cursor - 1;
@@ -231,6 +262,7 @@ export function messagesToContextItems(messagesInput, options = {}) {
231
262
  pendingTool: true,
232
263
  toolGroupId: `tool-orphan-${orphanDigest.slice(7, 39)}`,
233
264
  allowedSinks,
265
+ allowExternalization: options.allowExternalization === true,
234
266
  }),
235
267
  );
236
268
  continue;
@@ -242,6 +274,7 @@ export function messagesToContextItems(messagesInput, options = {}) {
242
274
  messages: [message],
243
275
  sequence: index,
244
276
  allowedSinks,
277
+ allowExternalization: options.allowExternalization === true,
245
278
  trustedSystemPolicy:
246
279
  (options.trustCurrentSystemPolicy === true && index === 0) ||
247
280
  trustedSystemIndexes.has(index),
@@ -258,7 +291,7 @@ export function messagesToContextItems(messagesInput, options = {}) {
258
291
  );
259
292
  const last = items[lastIndex];
260
293
  if (last) {
261
- const payload = JSON.parse(last.content);
294
+ const payload = JSON.parse(loadBundleContent(last, sessionId));
262
295
  if (payload.messages.at(-1)?.role === "user") {
263
296
  const protectedItem = { ...last };
264
297
  delete protectedItem.digest;
@@ -326,13 +359,34 @@ export function memoryRecordsToContextItems(recordsInput, options = {}) {
326
359
  });
327
360
  }
328
361
 
329
- function decodeBundle(item) {
330
- if (typeof item?.content !== "string") {
362
+ function loadBundleContent(item, expectedSessionId) {
363
+ let content = item?.content;
364
+ if (item?.contentRef !== undefined) {
365
+ if (
366
+ item.scope !== "session" ||
367
+ typeof item.scopeId !== "string" ||
368
+ (expectedSessionId !== undefined && expectedSessionId !== item.scopeId)
369
+ ) {
370
+ throw new TypeError(
371
+ `ContextItem ${item?.itemId || "unknown"} contentRef is outside its session scope`,
372
+ );
373
+ }
374
+ content = readSessionMessageBundle(
375
+ item.contentRef,
376
+ expectedSessionId || item.scopeId,
377
+ );
378
+ }
379
+ if (typeof content !== "string") {
331
380
  throw new TypeError(
332
381
  `ContextItem ${item?.itemId || "unknown"} has no inline content`,
333
382
  );
334
383
  }
335
- const payload = JSON.parse(item.content);
384
+ return content;
385
+ }
386
+
387
+ function decodeBundle(item, expectedSessionId) {
388
+ const content = loadBundleContent(item, expectedSessionId);
389
+ const payload = JSON.parse(content);
336
390
  if (
337
391
  !payload ||
338
392
  payload.schema !== MESSAGE_BUNDLE_SCHEMA ||
@@ -357,8 +411,10 @@ function decodeBundle(item) {
357
411
  }
358
412
 
359
413
  /** Restore replay messages in transcript order, independent of planner rank. */
360
- export function contextItemsToMessages(itemsInput) {
414
+ export function contextItemsToMessages(itemsInput, options = {}) {
361
415
  if (!Array.isArray(itemsInput)) throw new TypeError("items must be an array");
416
+ const expectedSessionId =
417
+ options.sessionId == null ? undefined : String(options.sessionId);
362
418
  return [...itemsInput]
363
419
  .map(normalizeContextItem)
364
420
  .sort(
@@ -367,7 +423,7 @@ export function contextItemsToMessages(itemsInput) {
367
423
  (right.sourceRef.eventSequence ?? Number.MAX_SAFE_INTEGER) ||
368
424
  left.itemId.localeCompare(right.itemId, "en"),
369
425
  )
370
- .flatMap(decodeBundle);
426
+ .flatMap((item) => decodeBundle(item, expectedSessionId));
371
427
  }
372
428
 
373
429
  function intersectAllowedSinks(items) {
@@ -386,6 +442,7 @@ export function createSummaryContextItem({
386
442
  parents: parentInput,
387
443
  operationId,
388
444
  now,
445
+ allowExternalization = false,
389
446
  }) {
390
447
  const parents = parentInput.map(normalizeContextItem);
391
448
  if (parents.length === 0) throw new TypeError("summary parents are required");
@@ -410,6 +467,17 @@ export function createSummaryContextItem({
410
467
  );
411
468
  if (summaryMessages.length === 0) return null;
412
469
  const content = canonicalJson(bundlePayload(summaryMessages));
470
+ const contentFields =
471
+ scope === "session" && scopeId
472
+ ? contentStorageFields(content, scopeId, allowExternalization)
473
+ : Buffer.byteLength(content, "utf8") <=
474
+ SESSION_MESSAGE_BUNDLE_MAX_INLINE_BYTES
475
+ ? { content }
476
+ : (() => {
477
+ throw new TypeError(
478
+ "Large compaction summary content is supported only for a session-scoped canonical image bundle",
479
+ );
480
+ })();
413
481
  const parentDigests = parents.map((item) => item.digest).sort();
414
482
  const digest = canonicalDigest(
415
483
  { operationId, parentDigests, content },
@@ -434,6 +502,7 @@ export function createSummaryContextItem({
434
502
  (item) => item.sourceRef.eventSequence ?? Number.MAX_SAFE_INTEGER,
435
503
  ),
436
504
  );
505
+ const image = imageTransportEstimate(summaryMessages);
437
506
  return normalizeContextItem({
438
507
  schemaVersion: 1,
439
508
  itemId: `cli-summary-${digest.slice(7, 39)}`,
@@ -456,12 +525,13 @@ export function createSummaryContextItem({
456
525
  allowedSinks,
457
526
  tokenEstimate: Math.max(
458
527
  1,
459
- Math.ceil(Buffer.byteLength(content, "utf8") / 4),
528
+ Math.ceil((Buffer.byteLength(content, "utf8") - image.bytes) / 4) +
529
+ image.tokens,
460
530
  ),
461
531
  priority: Math.max(...parents.map((item) => item.priority)),
462
532
  pinned: false,
463
533
  createdAt: new Date(now).toISOString(),
464
- content,
534
+ ...contentFields,
465
535
  });
466
536
  }
467
537