chainlesschain 0.166.115 → 0.166.117

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 (180) hide show
  1. package/README.md +20 -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/assets/{AIOps-BsoSoDNb.js → AIOps-C9tSCImB.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-Dcx7Gm5t.js → ActionButton-CXKExmT_.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-S1hsBIz3.js → Analytics-DE8WBWHo.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-B2j067qM.js → AppLayout-BdpwNM08.js} +5 -5
  9. package/src/assets/web-panel/assets/{Artifacts-D5iGV9ic.js → Artifacts-94TQpe38.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-C8ChVvXu.js → Audit-DdDEv5Ej.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-Cg97AAJS.js → BackgroundAgents-TU9nlV7j.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-CyxU9IUg.js → Backup-C0GPoUUq.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-CKlWjA8I.js → BaseInput-iyrVn2I6.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-C-EqZza6.js → Chat-Dqo8spwp.js} +5 -5
  15. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BRFiXKPX.js → ChatBubbleRenderer-CDqHSzc4.js} +1 -1
  16. package/src/assets/web-panel/assets/{Checkbox-kkI13tSJ.js → Checkbox-BF_XJvQi.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-NlqEDwHK.js → Codegen-5tUWoOa9.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-CfepEu79.js → Col-BQxSeRvG.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-BRo0qLXM.js → Community-B2Ra7w-J.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-BMu8TP0E.js → Compact-GjxJwlr0.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-B7Q3Moef.js → Compliance-BTUP6RTA.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-BVwt7Xmc.js → Cowork-DiwfL16s.js} +3 -3
  23. package/src/assets/web-panel/assets/{Cron-CgBv20Qy.js → Cron-1ceOo5ux.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-CwcSBJk2.js → Crosschain-aHYxLu0u.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-d20rCiIm.js → DID-eeTjzOLV.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-PpZaUYpS.js → Dashboard-CT3fpkvX.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-DjsLdX_Z.js → Dropdown-B3UpOy-N.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-CaPkrtxn.js → EmailListRenderer-Ba2Rvoru.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-DDY8cQnE.js → EvolutionSettings-CGtn93on.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-VQavMjyj.js → FamilyGuardDashboard-C0IUdHQt.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-D0GvKQgI.js → Federation-1QIDwemn.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-Dl_TWHmb.js → FormItemContext-NGbSsdje.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-Bny2uagG.js → GenericCardRenderer-DzVZc2Ba.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-B01KXq47.js → Git-B_1TDbSr.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-F4c4Vwo1.js → Governance-BDl_ySyI.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-_025Q-8K.js → Inference-CAp-wcCK.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-DwbTmQb1.js → KnowledgeGraph-DRjRcxul.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-CnNo0hCm.js → Logs-qSuwMwk7.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-BgnYTegK.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-Dkz5bv7F.js → Marketplace-DfiXL6UO.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-CBtRwDW_.js → McpTools-D9rIvFjN.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-Y9jnyTb7.js → Memory-D-p7yDzj.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-Br1urkOz.js → MobileBridge-D0XT5B6m.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-DnsyuerX.js → MobileProjects-CL9cHVIk.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-he3ZzieF.js → Mtc-CME4kDmC.js} +4 -4
  46. package/src/assets/web-panel/assets/{MtcAudit-BadphAuN.js → MtcAudit-BjGOXFnn.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-3_pVLymK.js → Multisig-CSzc53e0.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-DmtmHfsI.js → NLProgramming-BYjZnaH8.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-CE4L2O55.js → Notes-BUPOYE0C.js} +4 -4
  50. package/src/assets/web-panel/assets/{NotificationSettings-B7QmfJn9.js → NotificationSettings-BK8YADru.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-O0wRSyJ0.js → OrderTableRenderer-B5F8bnWt.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-BrlMSsyT.js → Organization-B0WNlhMd.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-CY4ULPrZ.js → Overflow-CED6ZO87.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-kIANZYKd.js → P2P-CBdc8fkP.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-DEgB4rvF.js → PdhVaultBrowser-DuauYi03.js} +5 -5
  56. package/src/assets/web-panel/assets/{Permissions-CWxywRp5.js → Permissions-kfgY0ukN.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-DAg7iCbr.js → PersonalDataHub-CDY3I1Do.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-Brc6ONnR.js → Pipeline-B9x0wKSK.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-CcinYTL8.js → Privacy-Cqhcr_Qv.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-Bz8XEsom.js → ProjectInit-CFhoyo57.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-CsOMlSTZ.js → ProjectSettings-DCBjV2Hm.js} +2 -2
  62. package/src/assets/web-panel/assets/Projects-C51w0LnM.js +1 -0
  63. package/src/assets/web-panel/assets/{Providers-CeunOQiH.js → Providers-BuCIWZY1.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-CN2a2_Fb.js → QrScannerModal-CEXNL5CB.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-CVeLif3e.js → QuickAsk-DgK8aLAU.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-1k9WOEGM.js → Recommend-BxEYQRAs.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-Q8UCqIMw.js → RemoteSession-PRsxNsYU.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-CkrCgXKM.js → Reputation-S-tQH70r.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-JFdvuTzi.js → Row-U1Ws3CJl.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-C74JHCmk.js → RssFeed-BftCyeii.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-DrJiVO1T.js → Search-o4gK0cPy.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-BJzNlSJq.js → Security-U2ZRpsbA.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-D4TLMnJm.js → Services-D0tRjWl_.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-cswTDqhh.js → Skeleton-DzZ8TFsB.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-Bv0rM1BS.js → Skills-B1cC7rju.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-D9rE7hNh.js → Sla-CtIHOR0J.js} +1 -1
  77. package/src/assets/web-panel/assets/SpeechSettings-CD8ZlQpW.js +1 -0
  78. package/src/assets/web-panel/assets/{SyncSettings-BwnMG8kq.js → SyncSettings-BilFQWQk.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-wJvU24cB.js → Tasks-Bmg2qLXl.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-CZbRU3tN.js → Templates-D6yofyC1.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-_jbpFJPZ.js → Tenant-BzttD-Gp.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-BzNm5WKZ.js → Terminal-DyRXeYuH.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-bmybWjuS.js → TimelineRenderer-Bdmkx-Tr.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-o1WDcqVQ.js → Tokens-10RcVAVJ.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-BB1D6sIB.js → Trigger-CKV-9DdV.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-CLxdCfy2.js → Trust-BEc-sW1q.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-B9LS6vS0.js → UkeySign-BSql8piX.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-Bg0-wxjz.js → VideoEditing-C4OH2f4s.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-Bw0G2F6P.js → Wallet-BSSvWKmv.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-irEiNY9b.js → WebAuthn-LxIzXo9d.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-Bh08FbJs.js → WorkflowEditor-DWwdfcte.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-De-FPjVT.js → chat-DWxYYLD5.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-ygdyvinU.js → colors-BxEcQqtg.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-BQ9jH9KV.js → compact-item-DNbezFOJ.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-BFuVSyox.js → createContext-DaJXc5nx.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-CRyXoGo9.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-i19GtR1P.js → hasIn-BMrw3sg3.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-IXkif6J_.js → index-2c0bL3SE.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-cDJsyAkI.js → index-6W0V5G2t.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-B2LieObB.js → index-7zzLqfvI.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BGMxK155.js → index-B9b6UaZl.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DVnFgasM.js → index-BAV07GDK.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BBYiCI1d.js → index-BCCd8Rj6.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-m8waSAyv.js → index-BNZDGV2q.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CpdXhhMY.js → index-BR4nWOmR.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-C61w3omz.js → index-B_b9_6wQ.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DlwxUZQL.js → index-BaByEdBj.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Cq9k4-Ws.js → index-BcuytRTa.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BPUCvc8i.js → index-Bs2QyMPQ.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DgjLaB7k.js → index-Bum_aSyd.js} +1 -1
  111. package/src/assets/web-panel/assets/index-C-W0Ntk_.js +1 -0
  112. package/src/assets/web-panel/assets/{index-BaaydJcC.js → index-C25ig6EV.js} +1 -1
  113. package/src/assets/web-panel/assets/index-CCk_qhBx.js +1 -0
  114. package/src/assets/web-panel/assets/{index-_9tUBcLm.js → index-CL-36X3A.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BLMtCKAY.js → index-Ca2hwPMo.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CMNjaSir.js → index-CaxzeSIM.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CgoSgmjK.js → index-CiEdfbB9.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DuuOX5u3.js → index-Cm9DYzhC.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-We2nK3ju.js → index-CpwgF7vh.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CWfgeaG4.js → index-DEvdSKT4.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-4HoFz1MA.js → index-DL0k35f0.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CXrk8OYO.js → index-DarVV5yG.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DS1IwwGL.js → index-DpSp97J8.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BVhtukYX.js → index-Dr18agDl.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-28DjsABm.js → index-Dwg38xTG.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-B1IsP_JO.js → index-DzZHBzCb.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DL7ewjD2.js → index-IX0g0s2t.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Bw5pTpnI.js → index-LRb0QX6S.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-l5-J0jHx.js → index-NEW5EN2w.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BKlU5VZy.js → index-T4T84G6X.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BKblSCL9.js → index-VD-dTYQE.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Bhf-MuUh.js → index-cCqCEa9X.js} +3 -3
  133. package/src/assets/web-panel/assets/{index-vXtH3o6O.js → index-cKBpcInt.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-DAboGZTw.js → index-hPy_f08G.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-DTY20pWu.js → index-pzYLf5qu.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-CBVcGaxk.js → index-rFaCnjXi.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-B_EZHeqN.js → initDefaultProps-BWVLgWhF.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BrVb_Gy1.js → motion-KJZ1xfDE.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-CKxVRL_J.js → move-DGqU6H7M.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-C80rvQ1J.js → mtc-parser-Dg0xkI5J.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-De5vD7BR.js → omit-B6RnMJAQ.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-BTyEDjth.js → pickAttrs-Ctw2i3jb.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-BWR94AjR.js → placementArrow-D3F3x8Jm.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-1g-Vnibk.js → responsiveObserve-W6eHE0nM.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-Dmg6dYuF.js → slide-BlFf8sY5.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-Ddj6rSab.js → statusUtils-Cd6LMwmy.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-DyP1mPDf.js → styleChecker-Bg5-U4Y1.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-D3d_0YuY.js → useFlexGapSupport-DTkLS3tn.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-M3vq-gE2.js → useFs-CwYGzoBt.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-GtP2TgtK.js → usePersonalDataHub-PCgFQXZP.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-BurE2ATQ.js → vnode-CJM7MkrB.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-Ch-ViiDe.js → zoom-CP0mgaFi.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/commands/compact.js +7 -2
  155. package/src/data/changelog.json +14 -1
  156. package/src/harness/jsonl-session-store.js +78 -73
  157. package/src/harness/prompt-compressor.js +57 -3
  158. package/src/lib/context-memory-kernel/context-image-transport.js +248 -0
  159. package/src/lib/context-memory-kernel/jsonl-session-context-port.js +4 -1
  160. package/src/lib/context-memory-kernel/live-compaction.js +40 -10
  161. package/src/lib/context-memory-kernel/message-adapter.js +80 -10
  162. package/src/lib/context-memory-kernel/message-bundle-store.js +1140 -0
  163. package/src/lib/context-memory-kernel/provider-context.js +23 -8
  164. package/src/lib/evolution/agent-evolution-ingress.js +62 -12
  165. package/src/lib/evolution/agent-model-projection.js +90 -18
  166. package/src/lib/evolution/evidence-json-text.js +279 -42
  167. package/src/lib/evolution/evolution-evidence-projector.js +121 -16
  168. package/src/lib/image-token-estimate.js +59 -0
  169. package/src/lib/read-file-loop-guard.js +7 -4
  170. package/src/lib/session-history-origins.js +25 -5
  171. package/src/lib/session-transcript-history.js +5 -1
  172. package/src/lib/tool-result-preview.js +276 -0
  173. package/src/runtime/agent-core.js +57 -59
  174. package/src/runtime/headless-stream.js +32 -17
  175. package/src/assets/web-panel/assets/MarkdownRenderer-D8_iZief.js +0 -1
  176. package/src/assets/web-panel/assets/Projects-BeSOM6wi.js +0 -1
  177. package/src/assets/web-panel/assets/SpeechSettings-Bfhvin8B.js +0 -1
  178. package/src/assets/web-panel/assets/devWarning-c2I2Rn4_.js +0 -1
  179. package/src/assets/web-panel/assets/index-CTs4dYcV.js +0 -1
  180. package/src/assets/web-panel/assets/index-DeuvaW15.js +0 -1
@@ -11,12 +11,15 @@
11
11
 
12
12
  import { createHash, randomBytes } from "node:crypto";
13
13
  import {
14
+ AGENT_MODEL_REQUEST_LIMITS,
15
+ AGENT_MODEL_IMAGE_LIMITS,
14
16
  projectAgentOpaqueTransportBlock,
15
17
  snapshotAgentModelRequest,
16
18
  } from "./agent-model-projection.js";
17
19
  import { snapshotSkillDecisionPayload } from "./skill-decision-projection.js";
18
20
  import {
19
21
  createEvidenceJsonTextBoundary,
22
+ AGENT_CODE_TEXT_RESULT_TOOLS,
20
23
  EVIDENCE_JSON_POLICY,
21
24
  isAgentToolArgumentsPath,
22
25
  } from "./evidence-json-text.js";
@@ -515,13 +518,41 @@ export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V2_DIGEST = `sha256:${crea
515
518
  "utf8",
516
519
  )
517
520
  .digest("hex")}`;
518
- const AGENT_MODEL_RULESET = Object.freeze({
521
+ const AGENT_MODEL_RULESET_V3 = Object.freeze({
519
522
  ...AGENT_MODEL_RULESET_V2,
520
523
  schema: "chainlesschain.evolution-agent-model-projection-rules/v3",
521
524
  version: 3,
522
525
  opaqueTransportPolicy:
523
526
  "digest-bound-base64-image-and-signed-thinking-no-plaintext-projection-v1",
524
527
  });
528
+ export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V3_DIGEST = `sha256:${createHash(
529
+ "sha256",
530
+ )
531
+ .update(
532
+ `${AGENT_MODEL_RULESET_V3.schema}\0${JSON.stringify(AGENT_MODEL_RULESET_V3)}`,
533
+ "utf8",
534
+ )
535
+ .digest("hex")}`;
536
+ const AGENT_MODEL_RULESET = Object.freeze({
537
+ ...AGENT_MODEL_RULESET_V3,
538
+ schema: "chainlesschain.evolution-agent-model-projection-rules/v4",
539
+ version: 4,
540
+ codeTextPolicy: "paired-code-source-and-result-literal-scan-v1",
541
+ codeTextResultTools: AGENT_CODE_TEXT_RESULT_TOOLS,
542
+ // ArtifactPorts caps the complete durable record at 1 MiB. Reserve room for
543
+ // provenance/findings and the record envelope; no storage limit is relaxed.
544
+ maxModelBytes: AGENT_MODEL_REQUEST_LIMITS.maxBytes - 128 * 1024,
545
+ maxStringChars: AGENT_MODEL_REQUEST_LIMITS.maxBytes - 128 * 1024,
546
+ maxNodes: AGENT_MODEL_REQUEST_LIMITS.maxNodes,
547
+ maxDepth: AGENT_MODEL_REQUEST_LIMITS.maxDepth,
548
+ decodedDepthPolicy: "independent-bounded-json-depth-v1",
549
+ imageBudget: AGENT_MODEL_IMAGE_LIMITS,
550
+ jsonTextPolicy: Object.freeze({
551
+ ...EVIDENCE_JSON_POLICY,
552
+ version: 2,
553
+ maxNodes: AGENT_MODEL_REQUEST_LIMITS.maxNodes,
554
+ }),
555
+ });
525
556
  export const EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_DIGEST = `sha256:${createHash(
526
557
  "sha256",
527
558
  )
@@ -552,6 +583,7 @@ const SUPPORTED_RULESETS = new Map([
552
583
  [RAW_RULESET_V3_DIGEST, RAW_RULESET_V3],
553
584
  [AGENT_MODEL_RULESET_V1_DIGEST, AGENT_MODEL_RULESET_V1],
554
585
  [EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V2_DIGEST, AGENT_MODEL_RULESET_V2],
586
+ [EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_V3_DIGEST, AGENT_MODEL_RULESET_V3],
555
587
  [EVOLUTION_AGENT_MODEL_PROJECTION_RULESET_DIGEST, AGENT_MODEL_RULESET],
556
588
  ]);
557
589
 
@@ -627,6 +659,7 @@ const AGENT_VALUE_PATTERNS = Object.freeze([
627
659
  function valuePatterns(ruleset) {
628
660
  return ruleset === SKILL_DECISION_RULESET ||
629
661
  ruleset === AGENT_MODEL_RULESET ||
662
+ ruleset === AGENT_MODEL_RULESET_V3 ||
630
663
  ruleset === AGENT_MODEL_RULESET_V2 ||
631
664
  ruleset === AGENT_MODEL_RULESET_V1
632
665
  ? AGENT_VALUE_PATTERNS
@@ -690,7 +723,12 @@ function assertExactRecord(
690
723
  }
691
724
  }
692
725
 
693
- function canonicalJson(value, seen = new Set(), depth = 0) {
726
+ function canonicalJson(
727
+ value,
728
+ seen = new Set(),
729
+ depth = 0,
730
+ maximumBytes = 2 * 1024 * 1024,
731
+ ) {
694
732
  if (depth > 32) {
695
733
  throw projectionError(
696
734
  EVOLUTION_PROJECTION_INVALID_CODE,
@@ -712,10 +750,12 @@ function canonicalJson(value, seen = new Set(), depth = 0) {
712
750
  output = JSON.stringify(value);
713
751
  }
714
752
  if (output !== undefined) {
715
- if (Buffer.byteLength(output, "utf8") > 2 * 1024 * 1024) {
753
+ if (Buffer.byteLength(output, "utf8") > maximumBytes) {
716
754
  throw projectionError(
717
755
  EVOLUTION_PROJECTION_INVALID_CODE,
718
- "projection exceeds the 2 MiB admission limit",
756
+ maximumBytes === 2 * 1024 * 1024
757
+ ? "projection exceeds the 2 MiB admission limit"
758
+ : "Agent image transport exceeds its canonical byte budget",
719
759
  );
720
760
  }
721
761
  return output;
@@ -757,7 +797,9 @@ function canonicalJson(value, seen = new Set(), depth = 0) {
757
797
  "projection arrays must use enumerable own data entries",
758
798
  );
759
799
  }
760
- entries.push(canonicalJson(descriptor.value, seen, depth + 1));
800
+ entries.push(
801
+ canonicalJson(descriptor.value, seen, depth + 1, maximumBytes),
802
+ );
761
803
  }
762
804
  output = `[${entries.join(",")}]`;
763
805
  } else {
@@ -784,24 +826,29 @@ function canonicalJson(value, seen = new Set(), depth = 0) {
784
826
  );
785
827
  }
786
828
  fields.push(
787
- `${JSON.stringify(key)}:${canonicalJson(descriptor.value, seen, depth + 1)}`,
829
+ `${JSON.stringify(key)}:${canonicalJson(descriptor.value, seen, depth + 1, maximumBytes)}`,
788
830
  );
789
831
  }
790
832
  output = `{${fields.join(",")}}`;
791
833
  }
792
834
  seen.delete(value);
793
- if (Buffer.byteLength(output, "utf8") > 2 * 1024 * 1024) {
835
+ if (Buffer.byteLength(output, "utf8") > maximumBytes) {
794
836
  throw projectionError(
795
837
  EVOLUTION_PROJECTION_INVALID_CODE,
796
- "projection exceeds the 2 MiB admission limit",
838
+ maximumBytes === 2 * 1024 * 1024
839
+ ? "projection exceeds the 2 MiB admission limit"
840
+ : "Agent image transport exceeds its canonical byte budget",
797
841
  );
798
842
  }
799
843
  return output;
800
844
  }
801
845
 
802
- function digest(value, domain) {
846
+ function digest(value, domain, maximumBytes) {
803
847
  return `sha256:${createHash("sha256")
804
- .update(`${domain}\0${canonicalJson(value)}`, "utf8")
848
+ .update(
849
+ `${domain}\0${canonicalJson(value, new Set(), 0, maximumBytes)}`,
850
+ "utf8",
851
+ )
805
852
  .digest("hex")}`;
806
853
  }
807
854
 
@@ -1296,6 +1343,43 @@ function sanitizeString(value, path, findings, injections, ruleset, patterns) {
1296
1343
  return output;
1297
1344
  }
1298
1345
 
1346
+ function isAgentCodeTextPath(payload, path, resultToolNames) {
1347
+ if (
1348
+ path[0] !== "messages" ||
1349
+ !/^\d+$/u.test(path[1] ?? "") ||
1350
+ !Array.isArray(payload?.messages)
1351
+ ) {
1352
+ return false;
1353
+ }
1354
+ const message = payload.messages[Number(path[1])];
1355
+ if (!message || typeof message !== "object") return false;
1356
+ if (
1357
+ path[2] === "tool_calls" &&
1358
+ /^\d+$/u.test(path[3] ?? "") &&
1359
+ path[4] === "function" &&
1360
+ path[5] === "arguments"
1361
+ ) {
1362
+ const call = message.tool_calls?.[Number(path[3])];
1363
+ const fields = path.slice(6);
1364
+ if (fields[0] === "$json") fields.shift();
1365
+ return call?.function?.name === "run_code" && fields[0] === "code";
1366
+ }
1367
+ if (path[2] === "content" && message.role === "tool") {
1368
+ const callId = message.tool_call_id;
1369
+ return payload.messages.some(
1370
+ (candidate) =>
1371
+ candidate?.role === "assistant" &&
1372
+ Array.isArray(candidate.tool_calls) &&
1373
+ candidate.tool_calls.some(
1374
+ (call) =>
1375
+ call?.id === callId &&
1376
+ resultToolNames.includes(call?.function?.name),
1377
+ ),
1378
+ );
1379
+ }
1380
+ return false;
1381
+ }
1382
+
1299
1383
  function sanitizePayload(
1300
1384
  payload,
1301
1385
  ruleset = RULESET,
@@ -1306,8 +1390,10 @@ function sanitizePayload(
1306
1390
  let nodes = 0;
1307
1391
  let truncated = false;
1308
1392
  const jsonText = ruleset.jsonTextPolicy
1309
- ? createEvidenceJsonTextBoundary((message) =>
1310
- projectionError(EVOLUTION_PROJECTION_INVALID_CODE, message),
1393
+ ? createEvidenceJsonTextBoundary(
1394
+ (message) =>
1395
+ projectionError(EVOLUTION_PROJECTION_INVALID_CODE, message),
1396
+ ruleset.jsonTextPolicy,
1311
1397
  )
1312
1398
  : null;
1313
1399
  const visit = (value, path, depth, layer = 0) => {
@@ -1323,7 +1409,7 @@ function sanitizePayload(
1323
1409
  }
1324
1410
  const toolArguments = jsonText && isAgentToolArgumentsPath(path);
1325
1411
  const opaqueTransportBlock =
1326
- ruleset === AGENT_MODEL_RULESET
1412
+ ruleset === AGENT_MODEL_RULESET || ruleset === AGENT_MODEL_RULESET_V3
1327
1413
  ? projectAgentOpaqueTransportBlock(value, path.join("."))
1328
1414
  : null;
1329
1415
  if (opaqueTransportBlock !== null) return opaqueTransportBlock;
@@ -1337,11 +1423,25 @@ function sanitizePayload(
1337
1423
  const plain = (text) =>
1338
1424
  sanitizeString(text, path, findings, injections, ruleset, patterns);
1339
1425
  if (!jsonText) return plain(value);
1426
+ const codeText =
1427
+ ruleset.codeTextPolicy ===
1428
+ "paired-code-source-and-result-literal-scan-v1" &&
1429
+ isAgentCodeTextPath(payload, path, ruleset.codeTextResultTools);
1340
1430
  const output = jsonText(value, {
1341
1431
  layer,
1342
1432
  objectOnly: toolArguments,
1433
+ codeText,
1343
1434
  visit: (decoded, nextLayer) =>
1344
- visit(decoded, [...path, "$json"], depth + 1, nextLayer),
1435
+ visit(
1436
+ decoded,
1437
+ [...path, "$json"],
1438
+ // Serialized JSON has its own unchanged depth/layer limits. Its
1439
+ // traversal must not charge protocol nesting as decoded depth.
1440
+ ruleset.decodedDepthPolicy === "independent-bounded-json-depth-v1"
1441
+ ? 0
1442
+ : depth + 1,
1443
+ nextLayer,
1444
+ ),
1345
1445
  plain,
1346
1446
  equal: (left, right) => canonicalJson(left) === canonicalJson(right),
1347
1447
  });
@@ -3045,7 +3145,7 @@ function validateBundleIntegrity(bundle) {
3045
3145
  validateRedactionSummary(model.redactionSummary);
3046
3146
  if (
3047
3147
  !Array.isArray(model.injectionFindings) ||
3048
- model.injectionFindings.length > RULESET.maxNodes * 2
3148
+ model.injectionFindings.length > ruleset.maxNodes * 2
3049
3149
  ) {
3050
3150
  throw projectionError(
3051
3151
  EVOLUTION_PROJECTION_INVALID_CODE,
@@ -3187,12 +3287,14 @@ function validateBundleIntegrity(bundle) {
3187
3287
  }
3188
3288
  if (
3189
3289
  ruleset === AGENT_MODEL_RULESET ||
3290
+ ruleset === AGENT_MODEL_RULESET_V3 ||
3190
3291
  ruleset === AGENT_MODEL_RULESET_V2 ||
3191
3292
  ruleset === AGENT_MODEL_RULESET_V1
3192
3293
  ) {
3193
3294
  snapshotAgentModelRequest(model.content, {
3194
3295
  allowStructuredArgumentText: ruleset !== AGENT_MODEL_RULESET_V1,
3195
- allowOpaqueTransportBlocks: ruleset === AGENT_MODEL_RULESET,
3296
+ allowOpaqueTransportBlocks:
3297
+ ruleset === AGENT_MODEL_RULESET || ruleset === AGENT_MODEL_RULESET_V3,
3196
3298
  });
3197
3299
  if (
3198
3300
  model.truncated ||
@@ -3477,6 +3579,9 @@ export class EvolutionEvidenceProjector {
3477
3579
  const sourceInputDigest = digest(
3478
3580
  payload,
3479
3581
  "chainlesschain.evolution-raw-plaintext/v2",
3582
+ ruleset === AGENT_MODEL_RULESET
3583
+ ? AGENT_MODEL_IMAGE_LIMITS.maxCanonicalRequestBytes
3584
+ : undefined,
3480
3585
  );
3481
3586
  const sourceEnvelopeDigest = digest(
3482
3587
  input.sourceEnvelope,
@@ -0,0 +1,59 @@
1
+ // Context planning estimates vision work separately from base64 transport.
2
+ // Providers and models meter images differently. These are planning reserves;
3
+ // provider usage receipts remain authoritative for token and cost settlement.
4
+ export const IMAGE_TOKEN_RESERVE = 8192;
5
+ export const LOW_DETAIL_IMAGE_TOKEN_RESERVE = 1024;
6
+ const BASE64_ALPHABET =
7
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
8
+
9
+ export function inspectCanonicalImageDataUrl(url) {
10
+ if (typeof url !== "string") return null;
11
+ const match =
12
+ /^data:image\/(?:png|jpeg|gif|webp);base64,([A-Za-z0-9+/]+={0,2})$/u.exec(
13
+ url,
14
+ );
15
+ if (!match || match[1].length % 4 !== 0) return null;
16
+ const data = match[1];
17
+ const padding = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0;
18
+ const finalValue = BASE64_ALPHABET.indexOf(data[data.length - padding - 1]);
19
+ if (
20
+ (padding === 2 && finalValue % 16 !== 0) ||
21
+ (padding === 1 && finalValue % 4 !== 0)
22
+ )
23
+ return null;
24
+ return {
25
+ decodedBytes: (data.length / 4) * 3 - padding,
26
+ encodedBytes: data.length,
27
+ };
28
+ }
29
+
30
+ export function imageTransportEstimate(messages) {
31
+ let bytes = 0;
32
+ let tokens = 0;
33
+ for (const message of messages) {
34
+ if (message?.role !== "user" || !Array.isArray(message.content)) continue;
35
+ for (const block of message.content) {
36
+ if (
37
+ block?.type !== "image_url" ||
38
+ Object.keys(block).sort().join() !== "image_url,type" ||
39
+ !block.image_url ||
40
+ Object.keys(block.image_url).some(
41
+ (key) => !["url", "detail"].includes(key),
42
+ )
43
+ )
44
+ continue;
45
+ const { url, detail } = block.image_url;
46
+ if (
47
+ typeof url !== "string" ||
48
+ (detail !== undefined && !["auto", "low", "high"].includes(detail)) ||
49
+ !inspectCanonicalImageDataUrl(url)
50
+ )
51
+ continue;
52
+ // Canonical base64 data URLs are ASCII and need no JSON escaping.
53
+ bytes += url.length;
54
+ tokens +=
55
+ detail === "low" ? LOW_DETAIL_IMAGE_TOKEN_RESERVE : IMAGE_TOKEN_RESERVE;
56
+ }
57
+ }
58
+ return { bytes, tokens };
59
+ }
@@ -1,6 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { EXPLORATION_TOOLS } from "./task-progress-tracker.js";
3
3
  import { isToolRecoveryPaused } from "./tool-recovery-result.js";
4
+ import { hostToolOutputIdentity } from "./tool-result-preview.js";
4
5
  const MAX_FILES = 12;
5
6
 
6
7
  function keyFor(filePath, args) {
@@ -353,14 +354,16 @@ export class ReadFileLoopGuard {
353
354
  } else if (
354
355
  (tool === "run_code" || tool === "run_shell") &&
355
356
  typeof result?.output === "string" &&
356
- result.output.length >= 8000
357
+ (result.output.length >= 8000 ||
358
+ hostToolOutputIdentity(result)?.chars >= 8000)
357
359
  ) {
358
360
  // Arbitrary code may just dump the same file again. Compare returned
359
361
  // evidence, not code spelling or timings. Never cache/skip execution:
360
362
  // identical stdout does not imply identical filesystem side effects.
361
- const fingerprint = createHash("sha256")
362
- .update(result.output)
363
- .digest("hex");
363
+ const identity = hostToolOutputIdentity(result);
364
+ const fingerprint = identity
365
+ ? `${identity.chars}:${identity.digest}`
366
+ : createHash("sha256").update(result.output).digest("hex");
364
367
  if (this.largeOutputs.has(fingerprint)) this.batch.duplicates++;
365
368
  else {
366
369
  this.largeOutputs.add(fingerprint);
@@ -1,4 +1,7 @@
1
- import { canonicalDigest } from "@chainlesschain/context-memory-kernel";
1
+ import {
2
+ canonicalDigest,
3
+ canonicalJson,
4
+ } from "@chainlesschain/context-memory-kernel";
2
5
  import {
3
6
  contextItemsToMessages,
4
7
  messagesToContextItems,
@@ -33,6 +36,19 @@ const historyBearing = (entry) =>
33
36
  );
34
37
  const fingerprint = (messages) =>
35
38
  canonicalDigest(messages.map(encodePersistedMessage));
39
+ const sameContextItemContent = (left, right) => {
40
+ if (typeof left?.content === "string" || typeof right?.content === "string") {
41
+ return (
42
+ typeof left?.content === "string" &&
43
+ typeof right?.content === "string" &&
44
+ left.content === right.content
45
+ );
46
+ }
47
+ if (left?.contentRef === undefined || right?.contentRef === undefined) {
48
+ return false;
49
+ }
50
+ return canonicalJson(left.contentRef) === canonicalJson(right.contentRef);
51
+ };
36
52
 
37
53
  /**
38
54
  * Origins belong to positions in the current display history, never to equal
@@ -128,7 +144,7 @@ export function createSessionHistoryOrigins() {
128
144
  if (context) {
129
145
  const originals = messagesToContextItems(
130
146
  context.map((entry) => entry.message),
131
- { sessionId: canonical.sessionId },
147
+ { sessionId: canonical.sessionId, allowExternalization: true },
132
148
  );
133
149
  const byDigest = new Map(
134
150
  originals.map((item) => [item.digest, item]),
@@ -140,7 +156,9 @@ export function createSessionHistoryOrigins() {
140
156
  context.slice(
141
157
  item.sourceRef.eventSequence,
142
158
  item.sourceRef.eventSequence +
143
- contextItemsToMessages([item]).length,
159
+ contextItemsToMessages([item], {
160
+ sessionId: canonical.sessionId,
161
+ }).length,
144
162
  );
145
163
  entries = [...canonical.outputItems]
146
164
  .sort(
@@ -150,12 +168,14 @@ export function createSessionHistoryOrigins() {
150
168
  left.itemId.localeCompare(right.itemId, "en"),
151
169
  )
152
170
  .flatMap((item) => {
153
- const messages = contextItemsToMessages([item]);
171
+ const messages = contextItemsToMessages([item], {
172
+ sessionId: canonical.sessionId,
173
+ });
154
174
  const source = bySequence.get(item.sourceRef.eventSequence);
155
175
  if (
156
176
  item.sourceRef.store === "cli-jsonl-session" &&
157
177
  source?.sourceRef.digest === item.sourceRef.digest &&
158
- source.content === item.content
178
+ sameContextItemContent(source, item)
159
179
  ) {
160
180
  return itemEntries(source);
161
181
  }
@@ -77,7 +77,11 @@ function isContextCompaction(data) {
77
77
  }));
78
78
  return (
79
79
  canonicalDigest(
80
- content(contextItemsToMessages(canonical.outputItems)),
80
+ content(
81
+ contextItemsToMessages(canonical.outputItems, {
82
+ sessionId: canonical.sessionId,
83
+ }),
84
+ ),
81
85
  ) === canonicalDigest(content(data.messages))
82
86
  );
83
87
  } catch {