chainlesschain 0.166.107 → 0.166.108
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 +13 -9
- package/package.json +1 -1
- 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-DCx6L_HW.js → AIOps-B5HWUFaS.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DYm1CN3Z.js → ActionButton-DCIKpxoQ.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D5ItUS_y.js → Analytics-dsgvjCEQ.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-Cb7XeRdH.js → AppLayout-DWDH5Qbm.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-DDDeqCDQ.js → Artifacts-BD8S8kzU.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BRt3x13w.js → Audit-CDXv4Aoj.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-C_oNALMd.js → BackgroundAgents-BLAQ5Uy0.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-PSU2p6CR.js → Backup-moPac6tF.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-G3oL4hcX.js → BaseInput-C_6nzsLU.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-C2cLI10b.js → Chat-cYuslkFG.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-KX1OITf8.js → ChatBubbleRenderer-Ceh3MG6M.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CHLnEgFD.js → Checkbox-Qjb-XOX_.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DZm9g_Bc.js → Codegen-IYRWXlMA.js} +1 -1
- package/src/assets/web-panel/assets/{Col-D5Z4zSay.js → Col-CsQ9jv8M.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DHw69NSk.js → Community-BbNmfTwe.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B-vjYNWz.js → Compact-SShDx-nr.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DaIYVZQY.js → Compliance-CLWhKIJp.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CoA9U-gF.js → Cowork-D4tK9_s3.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DXqmxlRC.js → Cron-D7GnfQ1z.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Cdkc3ue1.js → Crosschain-TG86SH3X.js} +1 -1
- package/src/assets/web-panel/assets/{DID-oKfYyNSR.js → DID-6pue0NCO.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-n_ycvgWu.js → Dashboard-BwkJ29du.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-D38rZ8WY.js → Dropdown-DEvpYDof.js} +1 -1
- package/src/assets/web-panel/assets/EmailListRenderer-CQj7UlKJ.js +1 -0
- package/src/assets/web-panel/assets/{EvolutionSettings-CTxA_SIq.js → EvolutionSettings-tpvPMM9W.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DmECNwV5.js → FamilyGuardDashboard-CWYFW75O.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-B2IaaDmQ.js → Federation-gRIi96rM.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DgcgqUIk.js → FormItemContext-B7Nr3YkV.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-B1-du6Qm.js → GenericCardRenderer-b1BgGgLT.js} +1 -1
- package/src/assets/web-panel/assets/{Git-XceM21Il.js → Git-Dis1jjO7.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CV97iz3z.js → Governance-C4Yg99Am.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CI7fj305.js → Inference-D4UQRbGu.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-B5mekWRy.js → KnowledgeGraph-Co_kLMAq.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BlxFA0xY.js → Logs-D4BRp7bg.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-rDE-XyMY.js → MarkdownRenderer-Dgy8arQI.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DL1BVCiX.js → Marketplace-ys0j1vr9.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BPtwrO3c.js → McpTools-B3ZvRZe_.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-DuSNw4E-.js → Memory-BOa0jbr-.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DTgY9ywI.js → MobileBridge-CWJRmUbj.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-7ty8vTpj.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-h4fCLjXw.js → Mtc-CCcOk5m5.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-fqMDY3-w.js → MtcAudit-vlrrScbQ.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-Do3FehBL.js → Multisig-C8K59S_8.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CQVY0kQF.js → NLProgramming-oTpFYVme.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-4c3oNvWh.js → Notes-BhqAJWiz.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BKr2JD4k.js → NotificationSettings-DCnV1CJM.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Bq4jgzRt.js → OrderTableRenderer-CZGnsrVW.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Dy3XidyA.js → Organization-DX1LuQlJ.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DFF0qN5K.js → Overflow-CbfKrFdT.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DAgYYykd.js → P2P-BEwYZuHL.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DgNHa8b1.js → PdhVaultBrowser-YNmWbwd7.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-Cev6uSBc.js → Permissions-DyZ18LiA.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DJzbN06K.js → PersonalDataHub-B2J3aw2g.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-CoJWvbQ5.js → Pipeline-CXl2ZlhQ.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DZxV6etm.js → Privacy-I5SDmgAp.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BFW87JnM.js → ProjectInit-Crl9tXw3.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-LBrRT27p.js → ProjectSettings-DCFtFlSK.js} +2 -2
- package/src/assets/web-panel/assets/Projects-Do5BQq1i.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CnRbjOYk.js → Providers-Cb7OWa3y.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BVFnIS3r.js → QrScannerModal-CJmhAU-s.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DrcHx5f1.js → QuickAsk-Cu6lEWou.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CbRgrSJm.js → Recommend-Crip3jLB.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-B2Uz_ElB.js → RemoteSession-KxYY-2CB.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DS0ljTxL.js → Reputation-D0vN-htI.js} +1 -1
- package/src/assets/web-panel/assets/{Row-ClLobFht.js → Row-wqzd_xCD.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DxxcTD0x.js → RssFeed-8lsPfb0a.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BbHN0Fik.js → Search-C-e8qAeU.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BAVU_EcY.js → Security-CMM9WgFy.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CtqRSVq_.js → Services-CZdxjN2B.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-IJ8ZKdSZ.js → Skeleton-BI3XNk35.js} +1 -1
- package/src/assets/web-panel/assets/Skills-DMlsh9It.js +1 -0
- package/src/assets/web-panel/assets/{Sla-fRkhnA3i.js → Sla-HQruznKY.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Bi8sYJ-I.js → SpeechSettings-Dl-MFq3w.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CjeplUtS.js → SyncSettings-BU224vDm.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-DESg3yCs.js +1 -0
- package/src/assets/web-panel/assets/{Templates-BwVugi8n.js → Templates-Jb3TPz4Q.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CsPuu5xK.js → Tenant-CQ-GTrfa.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DuaeOPjY.js → Terminal-BbMl3Rue.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D-PMrFxO.js → TimelineRenderer-CS_vstKF.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BXZuiQPZ.js → Tokens-BaopVl1f.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DgpTaHL3.js → Trigger-DtnD4WUN.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-Bn7lEGRY.js → Trust-CsvG4Tmf.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-zz-8JAAQ.js → UkeySign-C1-A-cOV.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DCzfQGTc.js → VideoEditing-CNgJPdSL.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BiRHM_zB.js → Wallet-CdF41501.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-QmPo2JwU.js → WebAuthn-D-JmxD5g.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-gL7SsPnY.js → WorkflowEditor-C0XunR13.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BysvK4hk.js → chat-BBAZpD_G.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CQq20vqN.js → colors-BxSxO5BX.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CAHlOf1X.js → compact-item-BoxL8pg5.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BeF3ESj_.js → createContext-W5JAyZmY.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BI5TZ7EX.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CiqnRf-U.js → hasIn-HpiKDPVC.js} +1 -1
- package/src/assets/web-panel/assets/index-9-JLDK5n.js +1 -0
- package/src/assets/web-panel/assets/{index-CCX0daFQ.js → index-9caMEwQ-.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5941vyo.js → index-B05_YRHZ.js} +1 -1
- package/src/assets/web-panel/assets/index-B7m8ioaQ.js +1 -0
- package/src/assets/web-panel/assets/{index-jJhemX1R.js → index-B9VxE1C-.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcVmt6u_.js → index-BA3WWQAT.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZBuJ6O6g.js → index-BSJ0cAle.js} +1 -1
- package/src/assets/web-panel/assets/{index-i9aJV9qk.js → index-BW4PP5GN.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cp3IRTDK.js → index-BZAbaY64.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2xbtl_c.js → index-Ba4usRFM.js} +1 -1
- package/src/assets/web-panel/assets/{index-4a0Lmz_y.js → index-BgMViZIY.js} +1 -1
- package/src/assets/web-panel/assets/{index-CTp89vmg.js → index-BtFAEG08.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTPUVm71.js → index-Bwn6k_qw.js} +1 -1
- package/src/assets/web-panel/assets/{index-xwtRrgVY.js → index-C4uI7WCB.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeIL3-nY.js → index-C5kqii-G.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7q5VH2n.js → index-C7GIUWWF.js} +1 -1
- package/src/assets/web-panel/assets/{index-qjaCk1Mj.js → index-CM_gdohF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfJabF_8.js → index-CRg3aOoj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHGtFwwR.js → index-CcyzZloJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXT7MKkD.js → index-CehxfRUR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CowbNBJs.js → index-D6m6B4Wy.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBmGQHEz.js → index-DSyfxxQS.js} +3 -3
- package/src/assets/web-panel/assets/{index-yFQWSRoW.js → index-DaJk9U9V.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKYbru3i.js → index-DcmAiq_Y.js} +1 -1
- package/src/assets/web-panel/assets/{index-CImCEo8S.js → index-DdEcQ1rp.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcccefJc.js → index-DinY7IQa.js} +1 -1
- package/src/assets/web-panel/assets/{index-zNkw0IY7.js → index-DkSnlgK_.js} +1 -1
- package/src/assets/web-panel/assets/{index-QALafVsT.js → index-DlPvZgv8.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bvkbj3x-.js → index-DuM9I1If.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgkUkmEJ.js → index-DwidpDEE.js} +1 -1
- package/src/assets/web-panel/assets/{index-Br5tGVbC.js → index-IO2I7nzu.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOiyW31p.js → index-JrMBRi62.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHpHGGmB.js → index-QzlEbtRL.js} +1 -1
- package/src/assets/web-panel/assets/{index-TdVEaJfk.js → index-V6VIJe2N.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXsXhR7p.js → index-_38IJqoP.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsnLkZjz.js → index-_p4e3KfB.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtWchYfW.js → index-gvfIRZxJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2AOvjgR.js → index-ooP1pQCt.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dqkls2_6.js → index-p6rNtYud.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BQR2HnKb.js → initDefaultProps-Dfn6M05J.js} +1 -1
- package/src/assets/web-panel/assets/{motion-gAz6l-nZ.js → motion-BRRwFqGO.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cy5TN856.js → move-DpDPN6zR.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BeT7VrGi.js → mtc-parser-BHlSE87F.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BLN3mlgK.js → omit-CEOri_L5.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DtwZ8u2d.js → pickAttrs-DqICh-ad.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-ViMwQSa-.js → placementArrow-DQizFFiV.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-dEL3u4E7.js → responsiveObserve-DmFHPdvC.js} +1 -1
- package/src/assets/web-panel/assets/{slide-l05us-Gz.js → slide-s2s1XS3T.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Bk-Qn2Og.js → statusUtils-IwEIbBan.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Bn186qeY.js → styleChecker-CIFLlbXH.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-WP-ugR3H.js → useFlexGapSupport-CFkN2Cgh.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-1SvoeSCL.js → useFs-BSY6O48s.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CfNU8N3z.js → usePersonalDataHub-iJl3VnU0.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Bd2Ya101.js → vnode-vu8ReMs7.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Def_MeZv.js → zoom-CeSrYAHp.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +16 -3
- package/src/harness/jsonl-session-store.js +128 -5
- package/src/harness/prompt-compressor.js +18 -10
- package/src/harness/structured-handoff.js +151 -13
- package/src/lib/agent-session-export.js +20 -0
- package/src/lib/background-agent-supervisor.js +54 -0
- package/src/lib/coding-task-guidance.js +2 -1
- package/src/lib/context-memory-kernel/live-compaction.js +75 -12
- package/src/lib/read-file-loop-guard.js +124 -8
- package/src/lib/session-host-snapshot.js +3 -0
- package/src/lib/session-message-provenance.js +24 -5
- package/src/lib/session-tool-round.js +39 -0
- package/src/lib/session-transcript-history.js +2 -0
- package/src/lib/session-transcript-page.js +4 -1
- package/src/lib/session-transcript-structure.js +4 -0
- package/src/runtime/__tests__/message-roles.test.js +29 -0
- package/src/runtime/agent-core.js +115 -43
- package/src/runtime/headless-runner.js +191 -34
- package/src/runtime/headless-stream.js +140 -42
- package/src/runtime/message-roles.js +43 -0
- package/src/workers/background-agent-worker.js +146 -47
- package/src/assets/web-panel/assets/EmailListRenderer-BjreeBQ1.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-CTpVHJMa.js +0 -1
- package/src/assets/web-panel/assets/Projects-O3uz76R1.js +0 -1
- package/src/assets/web-panel/assets/Skills-DXxcznnO.js +0 -1
- package/src/assets/web-panel/assets/Tasks-D4KB2Hbx.js +0 -1
- package/src/assets/web-panel/assets/devWarning-D-Iugqxv.js +0 -1
- package/src/assets/web-panel/assets/index-B0Oz2_rQ.js +0 -1
- package/src/assets/web-panel/assets/index-DwoycEQa.js +0 -1
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
import { randomUUID } from "node:crypto";
|
|
26
|
+
import { isProxy } from "node:util/types";
|
|
26
27
|
import { transportErrorDetails } from "../lib/transport-error-details.js";
|
|
27
28
|
import { captureAgentExecutionPolicy } from "../lib/agent-execution-policy.js";
|
|
28
29
|
import { HERMETIC_CODING_SYSTEM_PROMPT } from "../lib/coding-task-guidance.js";
|
|
@@ -55,6 +56,8 @@ import {
|
|
|
55
56
|
appendToolCallCompact as jsonlAppendToolCallCompact,
|
|
56
57
|
appendLlmRetryCompact as jsonlAppendLlmRetryCompact,
|
|
57
58
|
appendCompactEvent as jsonlAppendCompactEvent,
|
|
59
|
+
appendCompactEventIfMessagesMatch as jsonlAppendCompactEventIfMessagesMatch,
|
|
60
|
+
appendToolRoundsIfMessagesMatch as jsonlAppendToolRoundsIfMessagesMatch,
|
|
58
61
|
appendEvent as jsonlAppendEvent,
|
|
59
62
|
appendAuthorityEvent as jsonlAppendAuthorityEvent,
|
|
60
63
|
readEvents as jsonlReadEvents,
|
|
@@ -68,6 +71,10 @@ import {
|
|
|
68
71
|
getLastSessionId as jsonlGetLastSessionId,
|
|
69
72
|
verifySession as jsonlVerifySession,
|
|
70
73
|
} from "../harness/jsonl-session-store.js";
|
|
74
|
+
import {
|
|
75
|
+
markRuntimeOnlySessionMessage,
|
|
76
|
+
projectCanonicalResumeMessages,
|
|
77
|
+
} from "../lib/session-message-provenance.js";
|
|
71
78
|
import { classifyStreamRetryReason } from "../lib/stream-retry.js";
|
|
72
79
|
import {
|
|
73
80
|
SideEffectLedger,
|
|
@@ -106,7 +113,7 @@ import { CLISkillLoader } from "../lib/skill-loader.js";
|
|
|
106
113
|
import { expandFileRefsAsync } from "./file-ref-expander.js";
|
|
107
114
|
import { composeSystemPrompt } from "./system-prompt.js";
|
|
108
115
|
import { buildUserContent } from "../lib/image-input.js";
|
|
109
|
-
import {
|
|
116
|
+
import { createResumeRoleProjection } from "./message-roles.js";
|
|
110
117
|
import { isHeadlessConfigCommand } from "../lib/headless-config-command.js";
|
|
111
118
|
import {
|
|
112
119
|
STREAM_PROTOCOL_VERSION,
|
|
@@ -1356,6 +1363,21 @@ async function runAgentHeadlessInWorkspace(
|
|
|
1356
1363
|
? () => null
|
|
1357
1364
|
: jsonlFindLatestEvent);
|
|
1358
1365
|
const store = {
|
|
1366
|
+
appendToolRoundsIfMessagesMatch:
|
|
1367
|
+
deps.appendToolRoundsIfMessagesMatch ||
|
|
1368
|
+
(hasInjectedSessionStore
|
|
1369
|
+
? unavailableAuthorityCapability("appendToolRoundsIfMessagesMatch")
|
|
1370
|
+
: jsonlAppendToolRoundsIfMessagesMatch),
|
|
1371
|
+
appendCompactEventIfMessagesMatch:
|
|
1372
|
+
deps.appendCompactEventIfMessagesMatch ||
|
|
1373
|
+
(hasInjectedSessionStore
|
|
1374
|
+
? unavailableAuthorityCapability("appendCompactEventIfMessagesMatch")
|
|
1375
|
+
: jsonlAppendCompactEventIfMessagesMatch),
|
|
1376
|
+
readVerifiedProjection:
|
|
1377
|
+
deps.readVerifiedProjection ||
|
|
1378
|
+
(hasInjectedSessionStore
|
|
1379
|
+
? unavailableAuthorityCapability("readVerifiedProjection")
|
|
1380
|
+
: jsonlReadVerifiedProjection),
|
|
1359
1381
|
sessionExists: deps.sessionExists || jsonlSessionExists,
|
|
1360
1382
|
rebuildMessages: deps.rebuildMessages || jsonlRebuildMessages,
|
|
1361
1383
|
startSession: deps.startSession || jsonlStartSession,
|
|
@@ -2150,12 +2172,14 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2150
2172
|
// content array (agent-core converts it per-provider for ollama/anthropic).
|
|
2151
2173
|
const userMessageContent = buildUserContent(userContent, options.images);
|
|
2152
2174
|
|
|
2153
|
-
//
|
|
2175
|
+
// Project consecutive same-role turns only at the provider boundary. A
|
|
2176
|
+
// resumed session whose previous run
|
|
2154
2177
|
// produced NO assistant response (history ends with a bare `user` turn) does
|
|
2155
2178
|
// not yield two adjacent `user` messages — which Anthropic/Bedrock reject as
|
|
2156
2179
|
// "roles must alternate", failing the resume (Claude Code 2.1.187 parity).
|
|
2157
2180
|
// No-op on a healthy alternating transcript.
|
|
2158
|
-
|
|
2181
|
+
// Keep the authority array identical to the durable transcript for CAS.
|
|
2182
|
+
const messages = [
|
|
2159
2183
|
{ role: "system", content: systemContent },
|
|
2160
2184
|
...(instructionsLoadedContext
|
|
2161
2185
|
? [{ role: "system", content: instructionsLoadedContext }]
|
|
@@ -2174,7 +2198,7 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2174
2198
|
: []),
|
|
2175
2199
|
...history,
|
|
2176
2200
|
{ role: "user", content: userMessageContent },
|
|
2177
|
-
]
|
|
2201
|
+
];
|
|
2178
2202
|
|
|
2179
2203
|
// Persist the user turn before model/tool side effects. A full or read-only
|
|
2180
2204
|
// session disk is a recoverability contract failure, so it fails closed
|
|
@@ -2199,7 +2223,7 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2199
2223
|
}
|
|
2200
2224
|
// Persist the expanded content so a resumed session faithfully replays
|
|
2201
2225
|
// what the model actually saw (the file snapshot, not just the @token).
|
|
2202
|
-
store.appendUserMessage(sessionId,
|
|
2226
|
+
store.appendUserMessage(sessionId, userMessageContent);
|
|
2203
2227
|
} catch (error) {
|
|
2204
2228
|
const persistenceError = createSessionPersistenceFailure(error, {
|
|
2205
2229
|
sessionId,
|
|
@@ -2393,19 +2417,20 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2393
2417
|
|
|
2394
2418
|
// IDE live context (Claude-Code parity): when an IDE bridge is connected,
|
|
2395
2419
|
// share the editor's selection/active file/open tabs with this turn. Appended
|
|
2396
|
-
//
|
|
2420
|
+
// as private live context only — AFTER persistence — so a resumed
|
|
2397
2421
|
// session replays the prompt, not a stale editor snapshot. Best-effort with
|
|
2398
2422
|
// a short timeout; CC_IDE_CONTEXT=0 disables.
|
|
2399
2423
|
if (!hermeticExecution) {
|
|
2400
2424
|
try {
|
|
2401
|
-
const { buildIdePromptContext,
|
|
2402
|
-
|
|
2403
|
-
|
|
2425
|
+
const { buildIdePromptContext, expandIdeMentions } = await import(
|
|
2426
|
+
"../lib/ide-context.js"
|
|
2427
|
+
);
|
|
2428
|
+
const ideBlocks = [];
|
|
2404
2429
|
const ideCtx = await (
|
|
2405
2430
|
deps.buildIdePromptContext || buildIdePromptContext
|
|
2406
2431
|
)(hostMcp);
|
|
2407
2432
|
if (ideCtx) {
|
|
2408
|
-
|
|
2433
|
+
ideBlocks.push(ideCtx);
|
|
2409
2434
|
}
|
|
2410
2435
|
// Explicit @selection / @diagnostics mentions in the user's prompt
|
|
2411
2436
|
// (Claude-Code parity). Scan the ORIGINAL prompt so injected file-ref
|
|
@@ -2414,7 +2439,15 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2414
2439
|
const mentioned = await expandIdeMentions(prompt, hostMcp);
|
|
2415
2440
|
for (const w of mentioned.warnings) writeErr(` @ide: ${w}\n`);
|
|
2416
2441
|
if (mentioned.block) {
|
|
2417
|
-
|
|
2442
|
+
ideBlocks.push(mentioned.block);
|
|
2443
|
+
}
|
|
2444
|
+
if (ideBlocks.length) {
|
|
2445
|
+
messages.push(
|
|
2446
|
+
markRuntimeOnlySessionMessage({
|
|
2447
|
+
role: "user",
|
|
2448
|
+
content: ideBlocks.join("\n\n"),
|
|
2449
|
+
}),
|
|
2450
|
+
);
|
|
2418
2451
|
}
|
|
2419
2452
|
} catch {
|
|
2420
2453
|
// IDE context is optional polish — never fail the run over it.
|
|
@@ -2811,10 +2844,65 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2811
2844
|
}
|
|
2812
2845
|
|
|
2813
2846
|
const childToolExecs = new Map();
|
|
2847
|
+
const synchronousAuthorityResult = (value, capability) => {
|
|
2848
|
+
if (isProxy(value)) {
|
|
2849
|
+
throw Object.assign(
|
|
2850
|
+
new Error(`${capability} must return non-Proxy authority`),
|
|
2851
|
+
{
|
|
2852
|
+
code: "SESSION_AUTHORITY_CAPABILITY_INVALID",
|
|
2853
|
+
},
|
|
2854
|
+
);
|
|
2855
|
+
}
|
|
2856
|
+
if (value && typeof value.then === "function") {
|
|
2857
|
+
void Promise.resolve(value).catch(() => {});
|
|
2858
|
+
throw Object.assign(
|
|
2859
|
+
new Error(`${capability} must settle synchronously`),
|
|
2860
|
+
{
|
|
2861
|
+
code: "SESSION_AUTHORITY_CAPABILITY_INVALID",
|
|
2862
|
+
},
|
|
2863
|
+
);
|
|
2864
|
+
}
|
|
2865
|
+
return value;
|
|
2866
|
+
};
|
|
2867
|
+
const settleToolRounds = () => {
|
|
2868
|
+
if (
|
|
2869
|
+
!persist ||
|
|
2870
|
+
!messages.some(
|
|
2871
|
+
(message) => message.role === "assistant" && message.tool_calls?.length,
|
|
2872
|
+
)
|
|
2873
|
+
)
|
|
2874
|
+
return;
|
|
2875
|
+
return persistRuntimeLedgerWrite(() => {
|
|
2876
|
+
sessionHostLease?.assert?.();
|
|
2877
|
+
const expected = synchronousAuthorityResult(
|
|
2878
|
+
store.readVerifiedProjection(sessionId, () => ({
|
|
2879
|
+
accept() {},
|
|
2880
|
+
finish(authority) {
|
|
2881
|
+
return authority.readMessages();
|
|
2882
|
+
},
|
|
2883
|
+
})),
|
|
2884
|
+
"readVerifiedProjection",
|
|
2885
|
+
);
|
|
2886
|
+
const appended = synchronousAuthorityResult(
|
|
2887
|
+
store.appendToolRoundsIfMessagesMatch(sessionId, messages, expected),
|
|
2888
|
+
"appendToolRoundsIfMessagesMatch",
|
|
2889
|
+
);
|
|
2890
|
+
if (typeof appended?.hash !== "string" || !appended.hash) {
|
|
2891
|
+
throw Object.assign(
|
|
2892
|
+
new Error("Tool round settlement did not return its durable head"),
|
|
2893
|
+
{
|
|
2894
|
+
code: "CC_SESSION_TOOL_ROUND_SETTLEMENT_HEAD_UNKNOWN",
|
|
2895
|
+
},
|
|
2896
|
+
);
|
|
2897
|
+
}
|
|
2898
|
+
return appended;
|
|
2899
|
+
});
|
|
2900
|
+
};
|
|
2814
2901
|
const loopOptions = {
|
|
2815
2902
|
...(evolutionIngress === null ? {} : { evolutionIngress }),
|
|
2816
2903
|
model,
|
|
2817
2904
|
provider,
|
|
2905
|
+
projectProviderMessages: createResumeRoleProjection(messages),
|
|
2818
2906
|
recorder: _otlpRecorder,
|
|
2819
2907
|
// --otlp-content: opt in to stamping prompt CONTENT onto --otlp spans. Off by
|
|
2820
2908
|
// default → content stays redacted (agent-core omits it entirely, so default
|
|
@@ -2916,6 +3004,28 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2916
3004
|
mcpDispatchAdmission: hermeticExecution
|
|
2917
3005
|
? null
|
|
2918
3006
|
: sessionHostLease?.admitMcpDispatch || null,
|
|
3007
|
+
persistCompaction: persist,
|
|
3008
|
+
onBeforeCompaction: settleToolRounds,
|
|
3009
|
+
onCompaction: persist
|
|
3010
|
+
? (stats, compacted, settlement = {}) =>
|
|
3011
|
+
persistRuntimeLedgerWrite(() => {
|
|
3012
|
+
sessionHostLease?.assert?.();
|
|
3013
|
+
return synchronousAuthorityResult(
|
|
3014
|
+
store.appendCompactEventIfMessagesMatch(
|
|
3015
|
+
sessionId,
|
|
3016
|
+
{
|
|
3017
|
+
...stats,
|
|
3018
|
+
trigger: settlement.trigger || "auto",
|
|
3019
|
+
messages: projectCanonicalResumeMessages(compacted, {
|
|
3020
|
+
strict: true,
|
|
3021
|
+
}),
|
|
3022
|
+
},
|
|
3023
|
+
settlement.expectedMessages,
|
|
3024
|
+
),
|
|
3025
|
+
"appendCompactEventIfMessagesMatch",
|
|
3026
|
+
);
|
|
3027
|
+
})
|
|
3028
|
+
: undefined,
|
|
2919
3029
|
// chatFn passthrough lets tests drive the loop deterministically.
|
|
2920
3030
|
chatFn: deps.chatFn || options.chatFn || undefined,
|
|
2921
3031
|
signal: options.signal || undefined,
|
|
@@ -3870,12 +3980,14 @@ async function runAgentHeadlessInWorkspace(
|
|
|
3870
3980
|
`${rw.error ? `: ${rw.error}` : ""}`,
|
|
3871
3981
|
)
|
|
3872
3982
|
.join("\n");
|
|
3873
|
-
messages.push(
|
|
3874
|
-
|
|
3875
|
-
|
|
3876
|
-
|
|
3877
|
-
|
|
3878
|
-
|
|
3983
|
+
messages.push(
|
|
3984
|
+
markRuntimeOnlySessionMessage({
|
|
3985
|
+
role: "user",
|
|
3986
|
+
content:
|
|
3987
|
+
`A background check flagged a problem after your last turn:\n${detail}\n` +
|
|
3988
|
+
`Investigate and fix it, then confirm it passes.`,
|
|
3989
|
+
}),
|
|
3990
|
+
);
|
|
3879
3991
|
if (isText)
|
|
3880
3992
|
writeErr(
|
|
3881
3993
|
` ↻ async-hook rewake — re-engaging agent (${rewakeBudget} re-drive(s) left)\n`,
|
|
@@ -3983,13 +4095,15 @@ async function runAgentHeadlessInWorkspace(
|
|
|
3983
4095
|
// and the next turn still resumes at the right point.
|
|
3984
4096
|
persistGoalSnapshot();
|
|
3985
4097
|
if (decision === _goalHelpers.GOAL_DECISION.CONTINUE) {
|
|
3986
|
-
messages.push(
|
|
3987
|
-
|
|
3988
|
-
|
|
3989
|
-
|
|
3990
|
-
|
|
3991
|
-
|
|
3992
|
-
|
|
4098
|
+
messages.push(
|
|
4099
|
+
markRuntimeOnlySessionMessage({
|
|
4100
|
+
role: "user",
|
|
4101
|
+
content:
|
|
4102
|
+
`The completion condition is not yet met: ${evaluation.reason}.\n` +
|
|
4103
|
+
`Keep working toward: "${cond.source}". When you believe it is ` +
|
|
4104
|
+
`satisfied, make sure it actually passes.`,
|
|
4105
|
+
}),
|
|
4106
|
+
);
|
|
3993
4107
|
finalText = "";
|
|
3994
4108
|
endReason = "complete";
|
|
3995
4109
|
if (isText)
|
|
@@ -4005,6 +4119,22 @@ async function runAgentHeadlessInWorkspace(
|
|
|
4005
4119
|
} catch (err) {
|
|
4006
4120
|
const runtimeLedgerPersistenceFailed =
|
|
4007
4121
|
err?.runtimeLedgerPersistence === true;
|
|
4122
|
+
const persistence = runtimeLedgerPersistenceFailed
|
|
4123
|
+
? projectSessionPersistenceFailure(
|
|
4124
|
+
createSessionPersistenceFailure(err, {
|
|
4125
|
+
sessionId,
|
|
4126
|
+
operation: "append-event",
|
|
4127
|
+
}),
|
|
4128
|
+
{ phase: "after-model" },
|
|
4129
|
+
)
|
|
4130
|
+
: null;
|
|
4131
|
+
if (persistence) {
|
|
4132
|
+
try {
|
|
4133
|
+
deps.onPersistenceFailure?.(persistence);
|
|
4134
|
+
} catch {
|
|
4135
|
+
// Observability cannot change persistence semantics.
|
|
4136
|
+
}
|
|
4137
|
+
}
|
|
4008
4138
|
const sessionBudgetFailed =
|
|
4009
4139
|
err?.code === "CC_SESSION_BUDGET_EXHAUSTED" ||
|
|
4010
4140
|
err?.code === "CC_SESSION_BUDGET_USAGE_UNKNOWN" ||
|
|
@@ -4028,7 +4158,12 @@ async function runAgentHeadlessInWorkspace(
|
|
|
4028
4158
|
errorSubtype === "error" ? transportErrorDetails(err) : undefined;
|
|
4029
4159
|
const diagnosticFields = transportDetails
|
|
4030
4160
|
? { error_details: transportDetails }
|
|
4031
|
-
: {
|
|
4161
|
+
: {
|
|
4162
|
+
...(runtimeLedgerPersistenceFailed && err.code
|
|
4163
|
+
? { code: err.code }
|
|
4164
|
+
: {}),
|
|
4165
|
+
...(persistence ? { persistence } : {}),
|
|
4166
|
+
};
|
|
4032
4167
|
if (isStream) {
|
|
4033
4168
|
emitStream({
|
|
4034
4169
|
type: "result",
|
|
@@ -4067,6 +4202,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
4067
4202
|
: classifyLoopError(err),
|
|
4068
4203
|
result: message,
|
|
4069
4204
|
isError: true,
|
|
4205
|
+
...(persistence ? { persistence } : {}),
|
|
4206
|
+
...(runtimeLedgerPersistenceFailed && err.code ? { code: err.code } : {}),
|
|
4070
4207
|
};
|
|
4071
4208
|
} finally {
|
|
4072
4209
|
// Capture body-cache hits/misses caused by list_skills/run_skill during the
|
|
@@ -4250,16 +4387,21 @@ async function runAgentHeadlessInWorkspace(
|
|
|
4250
4387
|
: "success";
|
|
4251
4388
|
const durationMs = (deps.now ? deps.now() : Date.now()) - startedAt;
|
|
4252
4389
|
let persistenceFailure = null;
|
|
4390
|
+
let sessionPersistenceCode = null;
|
|
4253
4391
|
|
|
4254
|
-
//
|
|
4255
|
-
//
|
|
4256
|
-
if (persist
|
|
4392
|
+
// Complete tool evidence survives a clean budget stop. Only a successful
|
|
4393
|
+
// run appends a final assistant answer; settlement failure is always terminal.
|
|
4394
|
+
if (persist) {
|
|
4395
|
+
let persistenceOperation = "append-event";
|
|
4257
4396
|
try {
|
|
4258
|
-
|
|
4397
|
+
settleToolRounds();
|
|
4398
|
+
persistenceOperation = "assistant-turn-append";
|
|
4399
|
+
if (!isError && finalText)
|
|
4400
|
+
store.appendAssistantMessage(sessionId, finalText);
|
|
4259
4401
|
} catch (error) {
|
|
4260
4402
|
const persistenceError = createSessionPersistenceFailure(error, {
|
|
4261
4403
|
sessionId,
|
|
4262
|
-
operation:
|
|
4404
|
+
operation: persistenceOperation,
|
|
4263
4405
|
});
|
|
4264
4406
|
persistenceFailure = projectSessionPersistenceFailure(persistenceError, {
|
|
4265
4407
|
phase: "after-model",
|
|
@@ -4277,6 +4419,15 @@ async function runAgentHeadlessInWorkspace(
|
|
|
4277
4419
|
`CC_SESSION_PERSISTENCE_FAILED: assistant turn durability is ${persistenceFailure.commit_state} (${persistenceFailure.fs_code})\n`,
|
|
4278
4420
|
);
|
|
4279
4421
|
}
|
|
4422
|
+
} else if (error?.runtimeLedgerPersistence === true) {
|
|
4423
|
+
isError = true;
|
|
4424
|
+
subtype = "error_session_persistence";
|
|
4425
|
+
sessionPersistenceCode =
|
|
4426
|
+
error.code || "CC_SESSION_TOOL_ROUND_PERSISTENCE_FAILED";
|
|
4427
|
+
if (isText)
|
|
4428
|
+
writeErr(
|
|
4429
|
+
`${sessionPersistenceCode}: completed tool rounds could not be settled; refresh the session before continuing\n`,
|
|
4430
|
+
);
|
|
4280
4431
|
}
|
|
4281
4432
|
// Preserve legacy best-effort handling for errors outside the explicit
|
|
4282
4433
|
// ENOSPC/EROFS durability contract.
|
|
@@ -4416,11 +4567,12 @@ async function runAgentHeadlessInWorkspace(
|
|
|
4416
4567
|
? { compaction_degradations: compactionDegradations }
|
|
4417
4568
|
: {}),
|
|
4418
4569
|
...(persistenceFailure ? { persistence: persistenceFailure } : {}),
|
|
4570
|
+
...(sessionPersistenceCode ? { code: sessionPersistenceCode } : {}),
|
|
4419
4571
|
});
|
|
4420
4572
|
} else if (isJson) {
|
|
4421
4573
|
writeOut(
|
|
4422
|
-
JSON.stringify(
|
|
4423
|
-
buildResultEnvelope({
|
|
4574
|
+
JSON.stringify({
|
|
4575
|
+
...buildResultEnvelope({
|
|
4424
4576
|
subtype,
|
|
4425
4577
|
isError,
|
|
4426
4578
|
result: finalText,
|
|
@@ -4434,7 +4586,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
4434
4586
|
compactionDegradations,
|
|
4435
4587
|
persistence: persistenceFailure,
|
|
4436
4588
|
}),
|
|
4437
|
-
|
|
4589
|
+
...(sessionPersistenceCode ? { code: sessionPersistenceCode } : {}),
|
|
4590
|
+
}) + "\n",
|
|
4438
4591
|
);
|
|
4439
4592
|
} else {
|
|
4440
4593
|
// text: just the final answer on stdout.
|
|
@@ -4475,10 +4628,14 @@ async function runAgentHeadlessInWorkspace(
|
|
|
4475
4628
|
// Exit-code taxonomy: max-turns → 3, cost cap → 4 (both still non-zero, so
|
|
4476
4629
|
// "any failure" checks keep working; scripts can now tell exhaustion apart).
|
|
4477
4630
|
return {
|
|
4478
|
-
exitCode:
|
|
4631
|
+
exitCode:
|
|
4632
|
+
persistenceFailure || sessionPersistenceCode
|
|
4633
|
+
? 1
|
|
4634
|
+
: exitCodeForEndReason(endReason, isError),
|
|
4479
4635
|
result: finalText,
|
|
4480
4636
|
isError,
|
|
4481
4637
|
...(persistenceFailure ? { persistence: persistenceFailure } : {}),
|
|
4638
|
+
...(sessionPersistenceCode ? { code: sessionPersistenceCode } : {}),
|
|
4482
4639
|
};
|
|
4483
4640
|
}
|
|
4484
4641
|
|