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.
- package/README.md +20 -4
- package/package.json +3 -3
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-BsoSoDNb.js → AIOps-C9tSCImB.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Dcx7Gm5t.js → ActionButton-CXKExmT_.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-S1hsBIz3.js → Analytics-DE8WBWHo.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-B2j067qM.js → AppLayout-BdpwNM08.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-D5iGV9ic.js → Artifacts-94TQpe38.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-C8ChVvXu.js → Audit-DdDEv5Ej.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-Cg97AAJS.js → BackgroundAgents-TU9nlV7j.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CyxU9IUg.js → Backup-C0GPoUUq.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CKlWjA8I.js → BaseInput-iyrVn2I6.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-C-EqZza6.js → Chat-Dqo8spwp.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BRFiXKPX.js → ChatBubbleRenderer-CDqHSzc4.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-kkI13tSJ.js → Checkbox-BF_XJvQi.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-NlqEDwHK.js → Codegen-5tUWoOa9.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CfepEu79.js → Col-BQxSeRvG.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BRo0qLXM.js → Community-B2Ra7w-J.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BMu8TP0E.js → Compact-GjxJwlr0.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-B7Q3Moef.js → Compliance-BTUP6RTA.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BVwt7Xmc.js → Cowork-DiwfL16s.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-CgBv20Qy.js → Cron-1ceOo5ux.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CwcSBJk2.js → Crosschain-aHYxLu0u.js} +1 -1
- package/src/assets/web-panel/assets/{DID-d20rCiIm.js → DID-eeTjzOLV.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-PpZaUYpS.js → Dashboard-CT3fpkvX.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DjsLdX_Z.js → Dropdown-B3UpOy-N.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CaPkrtxn.js → EmailListRenderer-Ba2Rvoru.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-DDY8cQnE.js → EvolutionSettings-CGtn93on.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-VQavMjyj.js → FamilyGuardDashboard-C0IUdHQt.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-D0GvKQgI.js → Federation-1QIDwemn.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Dl_TWHmb.js → FormItemContext-NGbSsdje.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-Bny2uagG.js → GenericCardRenderer-DzVZc2Ba.js} +1 -1
- package/src/assets/web-panel/assets/{Git-B01KXq47.js → Git-B_1TDbSr.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-F4c4Vwo1.js → Governance-BDl_ySyI.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-_025Q-8K.js → Inference-CAp-wcCK.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DwbTmQb1.js → KnowledgeGraph-DRjRcxul.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CnNo0hCm.js → Logs-qSuwMwk7.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BgnYTegK.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Dkz5bv7F.js → Marketplace-DfiXL6UO.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CBtRwDW_.js → McpTools-D9rIvFjN.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-Y9jnyTb7.js → Memory-D-p7yDzj.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Br1urkOz.js → MobileBridge-D0XT5B6m.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DnsyuerX.js → MobileProjects-CL9cHVIk.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-he3ZzieF.js → Mtc-CME4kDmC.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-BadphAuN.js → MtcAudit-BjGOXFnn.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-3_pVLymK.js → Multisig-CSzc53e0.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DmtmHfsI.js → NLProgramming-BYjZnaH8.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CE4L2O55.js → Notes-BUPOYE0C.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-B7QmfJn9.js → NotificationSettings-BK8YADru.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-O0wRSyJ0.js → OrderTableRenderer-B5F8bnWt.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BrlMSsyT.js → Organization-B0WNlhMd.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CY4ULPrZ.js → Overflow-CED6ZO87.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-kIANZYKd.js → P2P-CBdc8fkP.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DEgB4rvF.js → PdhVaultBrowser-DuauYi03.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-CWxywRp5.js → Permissions-kfgY0ukN.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DAg7iCbr.js → PersonalDataHub-CDY3I1Do.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-Brc6ONnR.js → Pipeline-B9x0wKSK.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CcinYTL8.js → Privacy-Cqhcr_Qv.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Bz8XEsom.js → ProjectInit-CFhoyo57.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CsOMlSTZ.js → ProjectSettings-DCBjV2Hm.js} +2 -2
- package/src/assets/web-panel/assets/Projects-C51w0LnM.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CeunOQiH.js → Providers-BuCIWZY1.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CN2a2_Fb.js → QrScannerModal-CEXNL5CB.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CVeLif3e.js → QuickAsk-DgK8aLAU.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-1k9WOEGM.js → Recommend-BxEYQRAs.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Q8UCqIMw.js → RemoteSession-PRsxNsYU.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CkrCgXKM.js → Reputation-S-tQH70r.js} +1 -1
- package/src/assets/web-panel/assets/{Row-JFdvuTzi.js → Row-U1Ws3CJl.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C74JHCmk.js → RssFeed-BftCyeii.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DrJiVO1T.js → Search-o4gK0cPy.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BJzNlSJq.js → Security-U2ZRpsbA.js} +3 -3
- package/src/assets/web-panel/assets/{Services-D4TLMnJm.js → Services-D0tRjWl_.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-cswTDqhh.js → Skeleton-DzZ8TFsB.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Bv0rM1BS.js → Skills-B1cC7rju.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-D9rE7hNh.js → Sla-CtIHOR0J.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-CD8ZlQpW.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-BwnMG8kq.js → SyncSettings-BilFQWQk.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-wJvU24cB.js → Tasks-Bmg2qLXl.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CZbRU3tN.js → Templates-D6yofyC1.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-_jbpFJPZ.js → Tenant-BzttD-Gp.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BzNm5WKZ.js → Terminal-DyRXeYuH.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-bmybWjuS.js → TimelineRenderer-Bdmkx-Tr.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-o1WDcqVQ.js → Tokens-10RcVAVJ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BB1D6sIB.js → Trigger-CKV-9DdV.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CLxdCfy2.js → Trust-BEc-sW1q.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B9LS6vS0.js → UkeySign-BSql8piX.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Bg0-wxjz.js → VideoEditing-C4OH2f4s.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Bw0G2F6P.js → Wallet-BSSvWKmv.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-irEiNY9b.js → WebAuthn-LxIzXo9d.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-Bh08FbJs.js → WorkflowEditor-DWwdfcte.js} +1 -1
- package/src/assets/web-panel/assets/{chat-De-FPjVT.js → chat-DWxYYLD5.js} +1 -1
- package/src/assets/web-panel/assets/{colors-ygdyvinU.js → colors-BxEcQqtg.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BQ9jH9KV.js → compact-item-DNbezFOJ.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BFuVSyox.js → createContext-DaJXc5nx.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CRyXoGo9.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-i19GtR1P.js → hasIn-BMrw3sg3.js} +1 -1
- package/src/assets/web-panel/assets/{index-IXkif6J_.js → index-2c0bL3SE.js} +1 -1
- package/src/assets/web-panel/assets/{index-cDJsyAkI.js → index-6W0V5G2t.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2LieObB.js → index-7zzLqfvI.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGMxK155.js → index-B9b6UaZl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVnFgasM.js → index-BAV07GDK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBYiCI1d.js → index-BCCd8Rj6.js} +1 -1
- package/src/assets/web-panel/assets/{index-m8waSAyv.js → index-BNZDGV2q.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpdXhhMY.js → index-BR4nWOmR.js} +1 -1
- package/src/assets/web-panel/assets/{index-C61w3omz.js → index-B_b9_6wQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlwxUZQL.js → index-BaByEdBj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cq9k4-Ws.js → index-BcuytRTa.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPUCvc8i.js → index-Bs2QyMPQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgjLaB7k.js → index-Bum_aSyd.js} +1 -1
- package/src/assets/web-panel/assets/index-C-W0Ntk_.js +1 -0
- package/src/assets/web-panel/assets/{index-BaaydJcC.js → index-C25ig6EV.js} +1 -1
- package/src/assets/web-panel/assets/index-CCk_qhBx.js +1 -0
- package/src/assets/web-panel/assets/{index-_9tUBcLm.js → index-CL-36X3A.js} +1 -1
- package/src/assets/web-panel/assets/{index-BLMtCKAY.js → index-Ca2hwPMo.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMNjaSir.js → index-CaxzeSIM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgoSgmjK.js → index-CiEdfbB9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DuuOX5u3.js → index-Cm9DYzhC.js} +1 -1
- package/src/assets/web-panel/assets/{index-We2nK3ju.js → index-CpwgF7vh.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWfgeaG4.js → index-DEvdSKT4.js} +1 -1
- package/src/assets/web-panel/assets/{index-4HoFz1MA.js → index-DL0k35f0.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXrk8OYO.js → index-DarVV5yG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DS1IwwGL.js → index-DpSp97J8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVhtukYX.js → index-Dr18agDl.js} +1 -1
- package/src/assets/web-panel/assets/{index-28DjsABm.js → index-Dwg38xTG.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1IsP_JO.js → index-DzZHBzCb.js} +1 -1
- package/src/assets/web-panel/assets/{index-DL7ewjD2.js → index-IX0g0s2t.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bw5pTpnI.js → index-LRb0QX6S.js} +1 -1
- package/src/assets/web-panel/assets/{index-l5-J0jHx.js → index-NEW5EN2w.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKlU5VZy.js → index-T4T84G6X.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKblSCL9.js → index-VD-dTYQE.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bhf-MuUh.js → index-cCqCEa9X.js} +3 -3
- package/src/assets/web-panel/assets/{index-vXtH3o6O.js → index-cKBpcInt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAboGZTw.js → index-hPy_f08G.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTY20pWu.js → index-pzYLf5qu.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBVcGaxk.js → index-rFaCnjXi.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-B_EZHeqN.js → initDefaultProps-BWVLgWhF.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BrVb_Gy1.js → motion-KJZ1xfDE.js} +1 -1
- package/src/assets/web-panel/assets/{move-CKxVRL_J.js → move-DGqU6H7M.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-C80rvQ1J.js → mtc-parser-Dg0xkI5J.js} +1 -1
- package/src/assets/web-panel/assets/{omit-De5vD7BR.js → omit-B6RnMJAQ.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BTyEDjth.js → pickAttrs-Ctw2i3jb.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BWR94AjR.js → placementArrow-D3F3x8Jm.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-1g-Vnibk.js → responsiveObserve-W6eHE0nM.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Dmg6dYuF.js → slide-BlFf8sY5.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Ddj6rSab.js → statusUtils-Cd6LMwmy.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DyP1mPDf.js → styleChecker-Bg5-U4Y1.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-D3d_0YuY.js → useFlexGapSupport-DTkLS3tn.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-M3vq-gE2.js → useFs-CwYGzoBt.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-GtP2TgtK.js → usePersonalDataHub-PCgFQXZP.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BurE2ATQ.js → vnode-CJM7MkrB.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Ch-ViiDe.js → zoom-CP0mgaFi.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/compact.js +7 -2
- package/src/data/changelog.json +14 -1
- package/src/harness/jsonl-session-store.js +78 -73
- package/src/harness/prompt-compressor.js +57 -3
- package/src/lib/context-memory-kernel/context-image-transport.js +248 -0
- package/src/lib/context-memory-kernel/jsonl-session-context-port.js +4 -1
- package/src/lib/context-memory-kernel/live-compaction.js +40 -10
- package/src/lib/context-memory-kernel/message-adapter.js +80 -10
- package/src/lib/context-memory-kernel/message-bundle-store.js +1140 -0
- package/src/lib/context-memory-kernel/provider-context.js +23 -8
- package/src/lib/evolution/agent-evolution-ingress.js +62 -12
- package/src/lib/evolution/agent-model-projection.js +90 -18
- package/src/lib/evolution/evidence-json-text.js +279 -42
- package/src/lib/evolution/evolution-evidence-projector.js +121 -16
- package/src/lib/image-token-estimate.js +59 -0
- package/src/lib/read-file-loop-guard.js +7 -4
- package/src/lib/session-history-origins.js +25 -5
- package/src/lib/session-transcript-history.js +5 -1
- package/src/lib/tool-result-preview.js +276 -0
- package/src/runtime/agent-core.js +57 -59
- package/src/runtime/headless-stream.js +32 -17
- package/src/assets/web-panel/assets/MarkdownRenderer-D8_iZief.js +0 -1
- package/src/assets/web-panel/assets/Projects-BeSOM6wi.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-Bfhvin8B.js +0 -1
- package/src/assets/web-panel/assets/devWarning-c2I2Rn4_.js +0 -1
- package/src/assets/web-panel/assets/index-CTs4dYcV.js +0 -1
- 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
|
|
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(
|
|
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") >
|
|
753
|
+
if (Buffer.byteLength(output, "utf8") > maximumBytes) {
|
|
716
754
|
throw projectionError(
|
|
717
755
|
EVOLUTION_PROJECTION_INVALID_CODE,
|
|
718
|
-
|
|
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(
|
|
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") >
|
|
835
|
+
if (Buffer.byteLength(output, "utf8") > maximumBytes) {
|
|
794
836
|
throw projectionError(
|
|
795
837
|
EVOLUTION_PROJECTION_INVALID_CODE,
|
|
796
|
-
|
|
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(
|
|
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(
|
|
1310
|
-
|
|
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(
|
|
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 >
|
|
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:
|
|
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
|
|
362
|
-
|
|
363
|
-
.digest
|
|
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 {
|
|
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]
|
|
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
|
|
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(
|
|
80
|
+
content(
|
|
81
|
+
contextItemsToMessages(canonical.outputItems, {
|
|
82
|
+
sessionId: canonical.sessionId,
|
|
83
|
+
}),
|
|
84
|
+
),
|
|
81
85
|
) === canonicalDigest(content(data.messages))
|
|
82
86
|
);
|
|
83
87
|
} catch {
|