chainlesschain 0.166.106 → 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 +187 -8
- package/package.json +2 -2
- 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-CKwEku2e.js → AIOps-B5HWUFaS.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BSUOuTpW.js → ActionButton-DCIKpxoQ.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CGxvL_FI.js → Analytics-dsgvjCEQ.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-bCPwz-5w.js → AppLayout-DWDH5Qbm.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-2_BOWo6e.js → Artifacts-BD8S8kzU.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CBOruzgW.js → Audit-CDXv4Aoj.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-lg0IU5HN.js → BackgroundAgents-BLAQ5Uy0.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-OspCi452.js → Backup-moPac6tF.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BMkliqlz.js → BaseInput-C_6nzsLU.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BfoiUZwp.js → Chat-cYuslkFG.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BjnfMwep.js → ChatBubbleRenderer-Ceh3MG6M.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-jTMlkNQZ.js → Checkbox-Qjb-XOX_.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CycyJcnU.js → Codegen-IYRWXlMA.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BVWlReQj.js → Col-CsQ9jv8M.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CKRHl4xK.js → Community-BbNmfTwe.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BtpfMdhT.js → Compact-SShDx-nr.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DtHB1Ct1.js → Compliance-CLWhKIJp.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-D_8X7-RK.js → Cowork-D4tK9_s3.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DMCOyvEa.js → Cron-D7GnfQ1z.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CeHdsu7m.js → Crosschain-TG86SH3X.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CL6mR6zX.js → DID-6pue0NCO.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-oz9n6DC7.js → Dashboard-BwkJ29du.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CbWm8mWu.js → Dropdown-DEvpYDof.js} +1 -1
- package/src/assets/web-panel/assets/EmailListRenderer-CQj7UlKJ.js +1 -0
- package/src/assets/web-panel/assets/{EvolutionSettings-DPwqgRYm.js → EvolutionSettings-tpvPMM9W.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DkV4YMFj.js → FamilyGuardDashboard-CWYFW75O.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CpUKHIOH.js → Federation-gRIi96rM.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C6KXRgjR.js → FormItemContext-B7Nr3YkV.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-C5Y4L5E3.js → GenericCardRenderer-b1BgGgLT.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CBwKdF8s.js → Git-Dis1jjO7.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-Dt-OR7Aa.js → Governance-C4Yg99Am.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Czkl-Lhl.js → Inference-D4UQRbGu.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-C7NE4949.js → KnowledgeGraph-Co_kLMAq.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CoAuZiMG.js → Logs-D4BRp7bg.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-DTkjTwGI.js → MarkdownRenderer-Dgy8arQI.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-IzrV-7zH.js → Marketplace-ys0j1vr9.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DYEea7aS.js → McpTools-B3ZvRZe_.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-Uqe7ZrV6.js → Memory-BOa0jbr-.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-D092EGyM.js → MobileBridge-CWJRmUbj.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-7ty8vTpj.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-gg4jzfB-.js → Mtc-CCcOk5m5.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BibGfs71.js → MtcAudit-vlrrScbQ.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-BmB5yRXP.js → Multisig-C8K59S_8.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BBSlPDyY.js → NLProgramming-oTpFYVme.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Bui3-KiC.js → Notes-BhqAJWiz.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-ovXtbHe5.js → NotificationSettings-DCnV1CJM.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Bq-qD7eG.js → OrderTableRenderer-CZGnsrVW.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DacIY9oJ.js → Organization-DX1LuQlJ.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CX8osheZ.js → Overflow-CbfKrFdT.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-1lnikqVp.js → P2P-BEwYZuHL.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DCrU-V6A.js → PdhVaultBrowser-YNmWbwd7.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-Dfcb6kM2.js → Permissions-DyZ18LiA.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-dvgai4hf.js → PersonalDataHub-B2J3aw2g.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-nymAEtnK.js → Pipeline-CXl2ZlhQ.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-D0Vd91oM.js → Privacy-I5SDmgAp.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BpUBcu7o.js → ProjectInit-Crl9tXw3.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DIzwTT-M.js → ProjectSettings-DCFtFlSK.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Den4RUw6.js → Projects-Do5BQq1i.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Cq8p-M0d.js → Providers-Cb7OWa3y.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DSmqOfYk.js → QrScannerModal-CJmhAU-s.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BDHCeSnA.js → QuickAsk-Cu6lEWou.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-B_9M8oF4.js → Recommend-Crip3jLB.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-5ot4leHy.js → RemoteSession-KxYY-2CB.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-B3F013PY.js → Reputation-D0vN-htI.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BMyBJnZw.js → Row-wqzd_xCD.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-WmV0l52g.js → RssFeed-8lsPfb0a.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Wl80yXnR.js → Search-C-e8qAeU.js} +1 -1
- package/src/assets/web-panel/assets/{Security-gbDMKb5m.js → Security-CMM9WgFy.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Bx2Bjhah.js → Services-CZdxjN2B.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BvJNybjV.js → Skeleton-BI3XNk35.js} +1 -1
- package/src/assets/web-panel/assets/Skills-DMlsh9It.js +1 -0
- package/src/assets/web-panel/assets/{Sla-BM9gyZwc.js → Sla-HQruznKY.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Bu9FL9Tz.js → SpeechSettings-Dl-MFq3w.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-D8ICJsMt.js → SyncSettings-BU224vDm.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-DESg3yCs.js +1 -0
- package/src/assets/web-panel/assets/{Templates-BJzpTD0W.js → Templates-Jb3TPz4Q.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BN8eX4R2.js → Tenant-CQ-GTrfa.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CjtP9bpq.js → Terminal-BbMl3Rue.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CpNRa4XW.js → TimelineRenderer-CS_vstKF.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-2lNNvNAH.js → Tokens-BaopVl1f.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DxtxXyPg.js → Trigger-DtnD4WUN.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CakzGeF9.js → Trust-CsvG4Tmf.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CvJeRXwV.js → UkeySign-C1-A-cOV.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D80pMzcO.js → VideoEditing-CNgJPdSL.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BF-VOBmZ.js → Wallet-CdF41501.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DXyoAzE_.js → WebAuthn-D-JmxD5g.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-X6CDxzrF.js → WorkflowEditor-C0XunR13.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BcUhqjeA.js → chat-BBAZpD_G.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Dw4bKaCm.js → colors-BxSxO5BX.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BWhu5Eri.js → compact-item-BoxL8pg5.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BLJ9JKoN.js → createContext-W5JAyZmY.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BI5TZ7EX.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DIkCiJbt.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-BAwcMKaD.js → index-9caMEwQ-.js} +1 -1
- package/src/assets/web-panel/assets/{index-0mHbawfQ.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-D3wp_jgy.js → index-B9VxE1C-.js} +1 -1
- package/src/assets/web-panel/assets/{index-BotMuGS2.js → index-BA3WWQAT.js} +1 -1
- package/src/assets/web-panel/assets/{index-LOsZYbic.js → index-BSJ0cAle.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5qms36i.js → index-BW4PP5GN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CDfB6hWf.js → index-BZAbaY64.js} +1 -1
- package/src/assets/web-panel/assets/{index-BipG-tDs.js → index-Ba4usRFM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgsVg5Up.js → index-BgMViZIY.js} +1 -1
- package/src/assets/web-panel/assets/{index-CTPoBbIR.js → index-BtFAEG08.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKzG3kBM.js → index-Bwn6k_qw.js} +1 -1
- package/src/assets/web-panel/assets/{index-PRYboDFm.js → index-C4uI7WCB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DQbWGvE4.js → index-C5kqii-G.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1fufz1A.js → index-C7GIUWWF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjEP26Te.js → index-CM_gdohF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcTch6Fp.js → index-CRg3aOoj.js} +1 -1
- package/src/assets/web-panel/assets/{index-04SKBH8l.js → index-CcyzZloJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHLW27Je.js → index-CehxfRUR.js} +1 -1
- package/src/assets/web-panel/assets/{index-5vzPcr1g.js → index-D6m6B4Wy.js} +1 -1
- package/src/assets/web-panel/assets/{index-DV4FSjmI.js → index-DSyfxxQS.js} +3 -3
- package/src/assets/web-panel/assets/{index-D5vFJmmX.js → index-DaJk9U9V.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxLDNxEQ.js → index-DcmAiq_Y.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-Erv8A9.js → index-DdEcQ1rp.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqGqoID5.js → index-DinY7IQa.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGMzh2oj.js → index-DkSnlgK_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxfimJOH.js → index-DlPvZgv8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DOjQi7oU.js → index-DuM9I1If.js} +1 -1
- package/src/assets/web-panel/assets/{index-uMtx6e3D.js → index-DwidpDEE.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXJ8t1hK.js → index-IO2I7nzu.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cmc7qH2C.js → index-JrMBRi62.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaStonJm.js → index-QzlEbtRL.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cr05twNa.js → index-V6VIJe2N.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGFqk1-E.js → index-_38IJqoP.js} +1 -1
- package/src/assets/web-panel/assets/{index-u0tqS0iq.js → index-_p4e3KfB.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1r2R4a-.js → index-gvfIRZxJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFGOV-YT.js → index-ooP1pQCt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUC4TZWg.js → index-p6rNtYud.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Bx6Hj_FG.js → initDefaultProps-Dfn6M05J.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BSWivB70.js → motion-BRRwFqGO.js} +1 -1
- package/src/assets/web-panel/assets/{move-Dv1Pg9R7.js → move-DpDPN6zR.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-Bqtl8fsk.js → mtc-parser-BHlSE87F.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DpOBjOSQ.js → omit-CEOri_L5.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D-M-dz48.js → pickAttrs-DqICh-ad.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DsTLAifk.js → placementArrow-DQizFFiV.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BVTetMpc.js → responsiveObserve-DmFHPdvC.js} +1 -1
- package/src/assets/web-panel/assets/{slide-abEcz-Cv.js → slide-s2s1XS3T.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CBhrdU2G.js → statusUtils-IwEIbBan.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CFq8ZCKa.js → styleChecker-CIFLlbXH.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-o4eE7fDV.js → useFlexGapSupport-CFkN2Cgh.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Hs9W8ihi.js → useFs-BSY6O48s.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-Bnet5Jho.js → usePersonalDataHub-iJl3VnU0.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DJfN4kWs.js → vnode-vu8ReMs7.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BzV-2e7X.js → zoom-CeSrYAHp.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/commands/agent.js +20 -20
- package/src/commands/goal.js +299 -1
- package/src/commands/plugin.js +129 -68
- package/src/constants.js +2 -2
- package/src/data/changelog.json +29 -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/cli-goal-catalog.js +129 -0
- package/src/lib/cli-goal-source.js +119 -0
- package/src/lib/coding-task-guidance.js +2 -1
- package/src/lib/config-schema.js +1 -1
- package/src/lib/context-memory-kernel/live-compaction.js +75 -12
- package/src/lib/eval/stream-terminal.js +27 -2
- package/src/lib/evolution/evolution-artifact-ports.js +22 -11
- package/src/lib/evolution/evolution-file-witness.js +86 -63
- package/src/lib/evolution/evolution-ledger-file-backend.js +22 -0
- package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +34 -35
- package/src/lib/evolution/evolution-ledger-file-manifest-head-store.js +32 -39
- package/src/lib/evolution/evolution-ledger.js +367 -169
- package/src/lib/evolution/evolution-manifest-state-reader.js +58 -0
- package/src/lib/evolution/evolution-physical-state-reader.js +308 -0
- package/src/lib/evolution/evolution-witness-segments.js +12 -13
- package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +82 -56
- package/src/lib/evolution/rrsi-observed-text-index.js +17 -1
- package/src/lib/evolution/rrsi-tenant-index-anchor-history.js +5 -0
- package/src/lib/execution-location-failure-site.js +20 -3
- package/src/lib/goal-store.js +8 -1
- package/src/lib/image-input.js +43 -14
- package/src/lib/llm-providers.js +1 -0
- package/src/lib/plugin-runtime/capabilities.js +10 -0
- package/src/lib/plugin-runtime/cli-goal-draft-request.js +138 -0
- package/src/lib/plugin-runtime/cli-goal-drafts.js +413 -0
- package/src/lib/plugin-runtime/cli-goal-extension-host.js +234 -0
- package/src/lib/plugin-runtime/examples/goal-description-drafter/plugin.json +17 -0
- package/src/lib/plugin-runtime/examples/goal-evidence-viewer/plugin.json +25 -0
- package/src/lib/plugin-runtime/examples/goal-progress-viewer/plugin.json +21 -0
- package/src/lib/plugin-runtime/examples/project-delivery-assistant/plugin.json +38 -0
- package/src/lib/plugin-runtime/goal-extension-contract.js +190 -0
- package/src/lib/plugin-runtime/goal-extensions.js +277 -0
- package/src/lib/plugin-runtime/install.js +40 -40
- package/src/lib/plugin-runtime/manifest.js +12 -0
- package/src/lib/plugin-runtime/policy.js +1 -0
- package/src/lib/project-goal-connection.js +225 -0
- package/src/lib/project-goal-draft-connection.js +217 -0
- 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/lib/task-model-selector.js +1 -1
- package/src/repl/agent-repl.js +14 -7
- package/src/repl/config-summary.js +1 -1
- package/src/runtime/__tests__/message-roles.test.js +29 -0
- package/src/runtime/agent-core.js +116 -44
- package/src/runtime/headless-runner.js +191 -34
- package/src/runtime/headless-stream.js +144 -48
- package/src/runtime/message-roles.js +43 -0
- package/src/runtime/policies/agent-policy.js +1 -0
- package/src/workers/background-agent-worker.js +146 -47
- package/src/assets/web-panel/assets/EmailListRenderer-DXlmbC45.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-CwA1VoVJ.js +0 -1
- package/src/assets/web-panel/assets/Skills-Tz4rQcDp.js +0 -1
- package/src/assets/web-panel/assets/Tasks-B6MowBDo.js +0 -1
- package/src/assets/web-panel/assets/devWarning-D_MJgDGJ.js +0 -1
- package/src/assets/web-panel/assets/index-BP8log78.js +0 -1
- package/src/assets/web-panel/assets/index-PexF9zYf.js +0 -1
|
@@ -26,6 +26,7 @@ export const DURABLE_SYSTEM_MESSAGE_KINDS = Object.freeze({
|
|
|
26
26
|
|
|
27
27
|
const DURABLE_KINDS = new Set(Object.values(DURABLE_SYSTEM_MESSAGE_KINDS));
|
|
28
28
|
const RUNTIME_PROVENANCE = new WeakMap();
|
|
29
|
+
const RUNTIME_ONLY_MESSAGES = new WeakSet();
|
|
29
30
|
const INVALID_DATA = Symbol("invalid-session-message-data");
|
|
30
31
|
const MAX_DATA_DEPTH = 100;
|
|
31
32
|
const MAX_DATA_NODES = 100_000;
|
|
@@ -227,11 +228,11 @@ function validWireTag(value) {
|
|
|
227
228
|
const snapshot = plainDataSnapshot(value);
|
|
228
229
|
return Boolean(
|
|
229
230
|
snapshot &&
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
231
|
+
snapshot.keys.length === 2 &&
|
|
232
|
+
snapshot.keys.includes("schema") &&
|
|
233
|
+
snapshot.keys.includes("kind") &&
|
|
234
|
+
dataValue(snapshot, "schema") === SESSION_MESSAGE_PROVENANCE_SCHEMA &&
|
|
235
|
+
DURABLE_KINDS.has(dataValue(snapshot, "kind")),
|
|
235
236
|
);
|
|
236
237
|
}
|
|
237
238
|
|
|
@@ -248,6 +249,23 @@ export function markDurableSystemMessage(message, kind) {
|
|
|
248
249
|
return attachRuntimeTag(message, canonicalTag(kind));
|
|
249
250
|
}
|
|
250
251
|
|
|
252
|
+
// Only host-created retry/result-delivery messages can be excluded from replay.
|
|
253
|
+
// There is deliberately no wire tag: a provider field or a serialized copy
|
|
254
|
+
// cannot suppress a real user message from authority comparison.
|
|
255
|
+
export function markRuntimeOnlySessionMessage(message) {
|
|
256
|
+
const snapshot = plainDataSnapshot(message);
|
|
257
|
+
if (!snapshot || !["user", "assistant"].includes(dataValue(snapshot, "role")))
|
|
258
|
+
throw new TypeError(
|
|
259
|
+
"Runtime-only nudges must be user or assistant messages",
|
|
260
|
+
);
|
|
261
|
+
RUNTIME_ONLY_MESSAGES.add(message);
|
|
262
|
+
return message;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export function isRuntimeOnlySessionMessage(message) {
|
|
266
|
+
return RUNTIME_ONLY_MESSAGES.has(message);
|
|
267
|
+
}
|
|
268
|
+
|
|
251
269
|
export function getDurableSystemMessageProvenance(message) {
|
|
252
270
|
const snapshot = plainDataSnapshot(message);
|
|
253
271
|
if (!snapshot || dataValue(snapshot, "role") !== "system") return null;
|
|
@@ -422,6 +440,7 @@ export function projectCanonicalResumeMessages(messages, options = {}) {
|
|
|
422
440
|
invalid("Canonical resume message must contain JSON-safe data");
|
|
423
441
|
continue;
|
|
424
442
|
}
|
|
443
|
+
if (isRuntimeOnlySessionMessage(raw)) continue;
|
|
425
444
|
if (role !== "system") {
|
|
426
445
|
projected.push(clean);
|
|
427
446
|
} else if (runtimeTag) {
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Append-only, complete provider assistant/tool exchanges. No policy or user
|
|
2
|
+
* messages may enter durable replay through this event. */
|
|
3
|
+
export const TOOL_ROUND_EVENT = "tool_round";
|
|
4
|
+
export const TOOL_ROUND_SCHEMA = "chainlesschain.session-tool-round/v1";
|
|
5
|
+
|
|
6
|
+
export function assertCompleteToolRounds(messages) {
|
|
7
|
+
if (!Array.isArray(messages) || messages.length === 0)
|
|
8
|
+
throw new TypeError("Tool rounds require a non-empty message array");
|
|
9
|
+
const pending = new Set();
|
|
10
|
+
for (const message of messages) {
|
|
11
|
+
if (message?.role === "assistant" && pending.size === 0) {
|
|
12
|
+
if (!Array.isArray(message.tool_calls) || message.tool_calls.length === 0)
|
|
13
|
+
throw new TypeError("Tool round assistant must contain tool calls");
|
|
14
|
+
for (const call of message.tool_calls) {
|
|
15
|
+
if (typeof call?.id !== "string" || !call.id || pending.has(call.id))
|
|
16
|
+
throw new TypeError("Malformed or duplicate tool call");
|
|
17
|
+
pending.add(call.id);
|
|
18
|
+
}
|
|
19
|
+
} else if (
|
|
20
|
+
message?.role === "tool" &&
|
|
21
|
+
pending.delete(message.tool_call_id)
|
|
22
|
+
) {
|
|
23
|
+
// Every result settles exactly one call in the immediately preceding round.
|
|
24
|
+
} else {
|
|
25
|
+
throw new TypeError(
|
|
26
|
+
"Tool round contains an orphan result or forbidden message",
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (pending.size) throw new TypeError("Tool round is incomplete");
|
|
31
|
+
return messages;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function projectToolRoundMessages(event) {
|
|
35
|
+
if (event?.type !== TOOL_ROUND_EVENT) return null;
|
|
36
|
+
if (event.data?.schema !== TOOL_ROUND_SCHEMA)
|
|
37
|
+
throw new TypeError("Unsupported session tool round schema");
|
|
38
|
+
return assertCompleteToolRounds(event.data.messages);
|
|
39
|
+
}
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
} from "./session-transcript-page.js";
|
|
12
12
|
import { createSessionHistoryOrigins } from "./session-history-origins.js";
|
|
13
13
|
import { getDurableSystemMessageProvenance } from "./session-message-provenance.js";
|
|
14
|
+
import { projectToolRoundMessages } from "./session-tool-round.js";
|
|
14
15
|
import {
|
|
15
16
|
BRANCH_HISTORY_SCHEMA,
|
|
16
17
|
BRANCH_HISTORY_SYSTEM_ORIGINS_SCHEMA,
|
|
@@ -29,6 +30,7 @@ const MAX_HISTORY_RANGES = 16384;
|
|
|
29
30
|
// Enumerate all possible display sources, including replacement snapshots.
|
|
30
31
|
// Their physical sequence never changes when the selected history rewinds.
|
|
31
32
|
function eventMessages(event, imported = null) {
|
|
33
|
+
if (event.type === "tool_round") return projectToolRoundMessages(event);
|
|
32
34
|
if (event.type === BRANCH_HISTORY_MESSAGE)
|
|
33
35
|
return imported?.kind === "archive" ? [imported.message] : [];
|
|
34
36
|
if (
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { projectToolRoundMessages } from "./session-tool-round.js";
|
|
1
2
|
import { createHash } from "node:crypto";
|
|
2
3
|
import {
|
|
3
4
|
readVerifiedProjection,
|
|
@@ -120,7 +121,9 @@ export function createSessionTranscriptPageProjection(
|
|
|
120
121
|
["user_message", "assistant_message", "system"].includes(event.type)
|
|
121
122
|
)
|
|
122
123
|
append(event.data);
|
|
123
|
-
else if (event.type === "
|
|
124
|
+
else if (event.type === "tool_round") {
|
|
125
|
+
for (const message of projectToolRoundMessages(event)) append(message);
|
|
126
|
+
} else if (event.type === "ws_turn") {
|
|
124
127
|
const pair = projectWsTurnMessages(event);
|
|
125
128
|
if (pair) {
|
|
126
129
|
append(pair.user);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { projectToolRoundMessages } from "./session-tool-round.js";
|
|
1
2
|
/**
|
|
2
3
|
* Streaming structural authority for canonical session transcripts.
|
|
3
4
|
*
|
|
@@ -72,6 +73,9 @@ export function createSessionTranscriptStructureProjection(
|
|
|
72
73
|
|
|
73
74
|
return Object.freeze({
|
|
74
75
|
accept(event) {
|
|
76
|
+
// Unknown versions and malformed/orphan results fail closed at every
|
|
77
|
+
// verified projection, even if that projection does not display tools.
|
|
78
|
+
if (event?.type === "tool_round") projectToolRoundMessages(event);
|
|
75
79
|
const index = eventCount;
|
|
76
80
|
eventCount += 1;
|
|
77
81
|
if (event?.type === "session_start") {
|
|
@@ -24,7 +24,7 @@ export const TaskType = {
|
|
|
24
24
|
*/
|
|
25
25
|
const TASK_MODEL_MAP = {
|
|
26
26
|
[TaskType.CHAT]: {
|
|
27
|
-
volcengine: "deepseek-v4-flash-
|
|
27
|
+
volcengine: "deepseek-v4-1-flash-260910",
|
|
28
28
|
openai: "gpt-4o-mini",
|
|
29
29
|
anthropic: "claude-sonnet-4-6",
|
|
30
30
|
deepseek: "deepseek-chat",
|
package/src/repl/agent-repl.js
CHANGED
|
@@ -9504,12 +9504,18 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
9504
9504
|
let _userMessageContent = userContent;
|
|
9505
9505
|
if (process.env.CC_AUTO_IMAGE !== "0") {
|
|
9506
9506
|
try {
|
|
9507
|
-
const turn = prepareVisionTurn(
|
|
9508
|
-
|
|
9509
|
-
|
|
9510
|
-
|
|
9511
|
-
|
|
9512
|
-
|
|
9507
|
+
const turn = prepareVisionTurn(
|
|
9508
|
+
userContent,
|
|
9509
|
+
{
|
|
9510
|
+
provider,
|
|
9511
|
+
model,
|
|
9512
|
+
baseUrl,
|
|
9513
|
+
apiKey,
|
|
9514
|
+
visionModel: _visionModel,
|
|
9515
|
+
},
|
|
9516
|
+
{},
|
|
9517
|
+
{ visionModel: options.visionModel },
|
|
9518
|
+
);
|
|
9513
9519
|
if (turn.visionLlm) {
|
|
9514
9520
|
_userMessageContent = turn.content;
|
|
9515
9521
|
_visionLlm = turn.visionLlm;
|
|
@@ -9549,9 +9555,10 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
9549
9555
|
if (!_visionLlm) {
|
|
9550
9556
|
_visionLlm = resolveVisionLlm({
|
|
9551
9557
|
hasImage: true,
|
|
9552
|
-
flags: {},
|
|
9558
|
+
flags: { visionModel: options.visionModel },
|
|
9553
9559
|
llm: {
|
|
9554
9560
|
provider,
|
|
9561
|
+
model,
|
|
9555
9562
|
baseUrl,
|
|
9556
9563
|
apiKey,
|
|
9557
9564
|
visionModel: _visionModel,
|
|
@@ -34,7 +34,7 @@ export function parseConfigCommand(argStr) {
|
|
|
34
34
|
export const COMMON_CONFIG_KEYS = Object.freeze([
|
|
35
35
|
["llm.provider", "LLM provider id"],
|
|
36
36
|
["llm.model", "default text model id"],
|
|
37
|
-
["llm.visionModel", "
|
|
37
|
+
["llm.visionModel", "image fallback for a main model without vision"],
|
|
38
38
|
["llm.baseUrl", "provider API base URL"],
|
|
39
39
|
["llm.apiKey", "provider API key (use cc config set-secret)"],
|
|
40
40
|
["webSearch.provider", "web-search backend"],
|
|
@@ -2,9 +2,38 @@ import { describe, it, expect } from "vitest";
|
|
|
2
2
|
import {
|
|
3
3
|
mergeConsecutiveMessages,
|
|
4
4
|
collapseConsecutiveMessagesInPlace,
|
|
5
|
+
createResumeRoleProjection,
|
|
5
6
|
_internal,
|
|
6
7
|
} from "../message-roles.js";
|
|
7
8
|
|
|
9
|
+
describe("createResumeRoleProjection", () => {
|
|
10
|
+
it("normalizes retained resume pairs across clones without folding later feedback", () => {
|
|
11
|
+
const initial = [
|
|
12
|
+
{ role: "system", content: "policy" },
|
|
13
|
+
{ role: "user", content: "unanswered" },
|
|
14
|
+
{ role: "user", content: "resume" },
|
|
15
|
+
];
|
|
16
|
+
const project = createResumeRoleProjection(initial);
|
|
17
|
+
const request = [
|
|
18
|
+
...structuredClone(initial),
|
|
19
|
+
{ role: "assistant", content: "reply" },
|
|
20
|
+
{ role: "user", content: "feedback" },
|
|
21
|
+
{ role: "user", content: "next input" },
|
|
22
|
+
];
|
|
23
|
+
const before = structuredClone(request);
|
|
24
|
+
const projected = project(request);
|
|
25
|
+
expect(request).toEqual(before);
|
|
26
|
+
expect(initial).toHaveLength(3);
|
|
27
|
+
expect(
|
|
28
|
+
projected
|
|
29
|
+
.filter((message) => message.role === "user")
|
|
30
|
+
.map((message) => message.content),
|
|
31
|
+
).toEqual(["unanswered\n\nresume", "feedback", "next input"]);
|
|
32
|
+
expect(projected.at(-1)).toBe(request.at(-1));
|
|
33
|
+
expect(project(request)).toEqual(projected);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
8
37
|
describe("mergeConsecutiveMessages", () => {
|
|
9
38
|
it("is a no-op on a healthy alternating transcript", () => {
|
|
10
39
|
const msgs = [
|
|
@@ -46,6 +46,7 @@ import {
|
|
|
46
46
|
buildReadFileOutline,
|
|
47
47
|
} from "../lib/read-file-page.js";
|
|
48
48
|
import { ReadFileLoopGuard } from "../lib/read-file-loop-guard.js";
|
|
49
|
+
const READ_FILE_REQUEST_CONTEXT = Symbol("read-file-request-context");
|
|
49
50
|
import { gitToolInputError } from "../lib/git-tool-input.js";
|
|
50
51
|
import { shellOutputPage, shellOutputPreview } from "../lib/shell-output.js";
|
|
51
52
|
import { DIAGNOSTIC_WORKFLOW_GUIDANCE } from "../lib/diagnostic-workflow.js";
|
|
@@ -232,7 +233,10 @@ import {
|
|
|
232
233
|
formatStructuredHandoff,
|
|
233
234
|
} from "../harness/structured-handoff.js";
|
|
234
235
|
import { isMcpRpcError } from "../harness/mcp-client.js";
|
|
235
|
-
import {
|
|
236
|
+
import {
|
|
237
|
+
projectCanonicalResumeMessages,
|
|
238
|
+
markRuntimeOnlySessionMessage,
|
|
239
|
+
} from "../lib/session-message-provenance.js";
|
|
236
240
|
import { releaseOldLiveSessionResults } from "../lib/session-runtime-retention.js";
|
|
237
241
|
import {
|
|
238
242
|
pathMatchesOpenedFileIdentitySync,
|
|
@@ -4935,7 +4939,19 @@ export async function _withPostEditDiagnostics(
|
|
|
4935
4939
|
// Parsing the bytes we just wrote is safe even when starting a language
|
|
4936
4940
|
// server is forbidden. Feed definite local import mistakes back in the same
|
|
4937
4941
|
// tool result; a successful write still means persistence, not test success.
|
|
4938
|
-
let enriched =
|
|
4942
|
+
let enriched =
|
|
4943
|
+
result?.success === true && typeof writtenContent === "string"
|
|
4944
|
+
? {
|
|
4945
|
+
...result,
|
|
4946
|
+
validation: {
|
|
4947
|
+
persisted: true,
|
|
4948
|
+
testsExecuted: false,
|
|
4949
|
+
relativeImports: "not-checked",
|
|
4950
|
+
message:
|
|
4951
|
+
"File saved. This file operation did not run tests. Any import feedback checks explicit JavaScript relative references only and does not establish test or task acceptance.",
|
|
4952
|
+
},
|
|
4953
|
+
}
|
|
4954
|
+
: result;
|
|
4939
4955
|
if (
|
|
4940
4956
|
result?.success === true &&
|
|
4941
4957
|
typeof writtenContent === "string" &&
|
|
@@ -4956,9 +4972,21 @@ export async function _withPostEditDiagnostics(
|
|
|
4956
4972
|
content: writtenContent,
|
|
4957
4973
|
workspaceRoot: root,
|
|
4958
4974
|
});
|
|
4975
|
+
enriched = {
|
|
4976
|
+
...enriched,
|
|
4977
|
+
validation: {
|
|
4978
|
+
...enriched.validation,
|
|
4979
|
+
relativeImports: checked.status,
|
|
4980
|
+
checkedReferences: checked.checkedReferences,
|
|
4981
|
+
uncheckedReferences: checked.uncheckedReferences.length,
|
|
4982
|
+
truncated: checked.truncated,
|
|
4983
|
+
diagnosticsTruncated: checked.diagnostics.length > 8,
|
|
4984
|
+
...(checked.reason ? { skipReason: checked.reason } : {}),
|
|
4985
|
+
},
|
|
4986
|
+
};
|
|
4959
4987
|
if (checked.diagnostics.length) {
|
|
4960
4988
|
enriched = {
|
|
4961
|
-
...
|
|
4989
|
+
...enriched,
|
|
4962
4990
|
newDiagnostics: [
|
|
4963
4991
|
...(result.newDiagnostics || []),
|
|
4964
4992
|
...checked.diagnostics.slice(0, 8),
|
|
@@ -12103,6 +12131,10 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
12103
12131
|
tools = projected.tools;
|
|
12104
12132
|
}
|
|
12105
12133
|
|
|
12134
|
+
if (options[READ_FILE_REQUEST_CONTEXT]) {
|
|
12135
|
+
options[READ_FILE_REQUEST_CONTEXT].messages = messages;
|
|
12136
|
+
}
|
|
12137
|
+
|
|
12106
12138
|
throwIfAborted(signal);
|
|
12107
12139
|
|
|
12108
12140
|
// Host accounting starts only after request admission. A rejected model
|
|
@@ -12412,7 +12444,7 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
12412
12444
|
dashscope: "qwen-turbo",
|
|
12413
12445
|
mistral: "mistral-large-latest",
|
|
12414
12446
|
gemini: "gemini-2.0-flash",
|
|
12415
|
-
volcengine: "deepseek-v4-flash-
|
|
12447
|
+
volcengine: "deepseek-v4-1-flash-260910",
|
|
12416
12448
|
};
|
|
12417
12449
|
const effectiveModel = model || defaultModels[provider] || "gpt-4o-mini";
|
|
12418
12450
|
const modelProfile = resolveModelCapabilityProfile({
|
|
@@ -14697,7 +14729,9 @@ export async function* agentLoop(messages, options) {
|
|
|
14697
14729
|
// These tools are alternative ways to deliver content to the same target.
|
|
14698
14730
|
// A successful explicit replacement must settle a deferred edit (and vice
|
|
14699
14731
|
// versa); move/delete/notebook effects retain their distinct obligations.
|
|
14700
|
-
const effect = ["write_file", "edit_file", "edit_file_hashed"].includes(
|
|
14732
|
+
const effect = ["write_file", "edit_file", "edit_file_hashed"].includes(
|
|
14733
|
+
tool,
|
|
14734
|
+
)
|
|
14701
14735
|
? "file-content"
|
|
14702
14736
|
: tool;
|
|
14703
14737
|
const key = JSON.stringify([effect, targets]);
|
|
@@ -15850,10 +15884,12 @@ export async function* agentLoop(messages, options) {
|
|
|
15850
15884
|
// SubagentStop hooks are best-effort
|
|
15851
15885
|
}
|
|
15852
15886
|
}
|
|
15853
|
-
messages.push(
|
|
15854
|
-
|
|
15855
|
-
|
|
15856
|
-
|
|
15887
|
+
messages.push(
|
|
15888
|
+
markRuntimeOnlySessionMessage({
|
|
15889
|
+
role: "user",
|
|
15890
|
+
content: _backgroundSubAgentResultText(entry),
|
|
15891
|
+
}),
|
|
15892
|
+
);
|
|
15857
15893
|
taskProgressTracker.retainChildResult(
|
|
15858
15894
|
entry.id,
|
|
15859
15895
|
{
|
|
@@ -16002,6 +16038,11 @@ export async function* agentLoop(messages, options) {
|
|
|
16002
16038
|
];
|
|
16003
16039
|
}
|
|
16004
16040
|
}
|
|
16041
|
+
// Role normalization is request-only: durable history remains unchanged
|
|
16042
|
+
// for tool settlement and canonical compaction authority comparisons.
|
|
16043
|
+
if (typeof options.projectProviderMessages === "function") {
|
|
16044
|
+
callMessages = options.projectProviderMessages(callMessages);
|
|
16045
|
+
}
|
|
16005
16046
|
const contextMemoryTrustedSystemIndexes = [];
|
|
16006
16047
|
if (Number.isFinite(budget.limit)) {
|
|
16007
16048
|
// consume() already charged this dispatch. The current request may still
|
|
@@ -16197,10 +16238,15 @@ export async function* agentLoop(messages, options) {
|
|
|
16197
16238
|
const requestOptions = providerRequestId
|
|
16198
16239
|
? { ...plannedProviderOptions, providerRequestId }
|
|
16199
16240
|
: plannedProviderOptions;
|
|
16200
|
-
|
|
16201
|
-
|
|
16241
|
+
// Capture the custom adapter's input or the built-in adapter's final
|
|
16242
|
+
// projection. Commit visibility only after a successful model response.
|
|
16243
|
+
const readFileRequestContext = { messages: callMessages };
|
|
16244
|
+
const providerCallOptions = {
|
|
16245
|
+
[READ_FILE_REQUEST_CONTEXT]: readFileRequestContext,
|
|
16246
|
+
...(evolutionIngress !== null
|
|
16202
16247
|
? { ...requestOptions, evolutionIngress }
|
|
16203
|
-
: requestOptions
|
|
16248
|
+
: requestOptions),
|
|
16249
|
+
};
|
|
16204
16250
|
const modelUsageCall = {
|
|
16205
16251
|
type: "model-usage-started",
|
|
16206
16252
|
callId: _newModelUsageCallId("model"),
|
|
@@ -16302,6 +16348,7 @@ export async function* agentLoop(messages, options) {
|
|
|
16302
16348
|
},
|
|
16303
16349
|
"model_error",
|
|
16304
16350
|
);
|
|
16351
|
+
readFileLoopGuard.observeVisibleMessages(readFileRequestContext.messages);
|
|
16305
16352
|
providerReceipt = providerRequestId
|
|
16306
16353
|
? _snapshotProviderRequestReceipt(
|
|
16307
16354
|
result?.providerReceipt,
|
|
@@ -16463,17 +16510,24 @@ export async function* agentLoop(messages, options) {
|
|
|
16463
16510
|
);
|
|
16464
16511
|
_throwBackgroundUsageFailureState(backgroundUsageFailureState);
|
|
16465
16512
|
throwIfAborted(signal);
|
|
16466
|
-
messages.push(
|
|
16513
|
+
messages.push(
|
|
16514
|
+
markRuntimeOnlySessionMessage({
|
|
16515
|
+
role: "assistant",
|
|
16516
|
+
content: msg.content || "",
|
|
16517
|
+
}),
|
|
16518
|
+
);
|
|
16467
16519
|
for (const entry of _takeSettledBackgroundSubAgents(
|
|
16468
16520
|
backgroundSubAgents,
|
|
16469
16521
|
)) {
|
|
16470
16522
|
_throwBackgroundSubAgentUsageFailure(entry);
|
|
16471
|
-
messages.push(
|
|
16472
|
-
|
|
16473
|
-
|
|
16474
|
-
|
|
16475
|
-
|
|
16476
|
-
|
|
16523
|
+
messages.push(
|
|
16524
|
+
markRuntimeOnlySessionMessage({
|
|
16525
|
+
role: "user",
|
|
16526
|
+
content:
|
|
16527
|
+
_backgroundSubAgentResultText(entry) +
|
|
16528
|
+
"\n\nAll background sub-agents have finished. Incorporate their results and give your final answer.",
|
|
16529
|
+
}),
|
|
16530
|
+
);
|
|
16477
16531
|
taskProgressTracker.retainChildResult(
|
|
16478
16532
|
entry.id,
|
|
16479
16533
|
{
|
|
@@ -16498,17 +16552,24 @@ export async function* agentLoop(messages, options) {
|
|
|
16498
16552
|
const pending = [...pendingSubtreeMutations.values()];
|
|
16499
16553
|
if (!subtreeMutationReprompted && budget.remaining() > 0) {
|
|
16500
16554
|
subtreeMutationReprompted = true;
|
|
16501
|
-
messages.push(
|
|
16502
|
-
|
|
16503
|
-
|
|
16504
|
-
|
|
16505
|
-
|
|
16506
|
-
|
|
16507
|
-
|
|
16508
|
-
|
|
16509
|
-
|
|
16510
|
-
|
|
16511
|
-
|
|
16555
|
+
messages.push(
|
|
16556
|
+
markRuntimeOnlySessionMessage({
|
|
16557
|
+
role: "assistant",
|
|
16558
|
+
content: msg.content || "",
|
|
16559
|
+
}),
|
|
16560
|
+
);
|
|
16561
|
+
messages.push(
|
|
16562
|
+
markRuntimeOnlySessionMessage({
|
|
16563
|
+
role: "user",
|
|
16564
|
+
content:
|
|
16565
|
+
"Runtime status: these mutations were deferred before any effect: " +
|
|
16566
|
+
JSON.stringify(pending) +
|
|
16567
|
+
". Review the authoritative subtree instructions already returned. " +
|
|
16568
|
+
"If still authorized and appropriate, explicitly issue the required tool call. " +
|
|
16569
|
+
"Do not bypass rules or perform a prohibited write. Otherwise report the unfinished work and its blocker. " +
|
|
16570
|
+
"A promise to retry does not execute the mutation.",
|
|
16571
|
+
}),
|
|
16572
|
+
);
|
|
16512
16573
|
yield {
|
|
16513
16574
|
type: "iteration-warning",
|
|
16514
16575
|
message:
|
|
@@ -16551,13 +16612,17 @@ export async function* agentLoop(messages, options) {
|
|
|
16551
16612
|
const _contentEmpty = !String(msg.content || "").trim();
|
|
16552
16613
|
if (_contentEmpty && _thinking && !emptyThinkingReprompted) {
|
|
16553
16614
|
emptyThinkingReprompted = true;
|
|
16554
|
-
messages.push(
|
|
16555
|
-
|
|
16556
|
-
|
|
16557
|
-
|
|
16558
|
-
|
|
16559
|
-
|
|
16560
|
-
|
|
16615
|
+
messages.push(
|
|
16616
|
+
markRuntimeOnlySessionMessage({ role: "assistant", content: "" }),
|
|
16617
|
+
);
|
|
16618
|
+
messages.push(
|
|
16619
|
+
markRuntimeOnlySessionMessage({
|
|
16620
|
+
role: "user",
|
|
16621
|
+
content:
|
|
16622
|
+
"You ended your turn with only internal reasoning and no visible " +
|
|
16623
|
+
"response. Please provide your actual answer now.",
|
|
16624
|
+
}),
|
|
16625
|
+
);
|
|
16561
16626
|
yield { type: "empty-thinking-reprompt", runId };
|
|
16562
16627
|
continue;
|
|
16563
16628
|
}
|
|
@@ -16614,13 +16679,20 @@ export async function* agentLoop(messages, options) {
|
|
|
16614
16679
|
}
|
|
16615
16680
|
if (stopOutcome && stopOutcome.decision === "block") {
|
|
16616
16681
|
stopHookActive = true;
|
|
16617
|
-
messages.push(
|
|
16618
|
-
|
|
16619
|
-
|
|
16620
|
-
|
|
16621
|
-
|
|
16622
|
-
|
|
16623
|
-
|
|
16682
|
+
messages.push(
|
|
16683
|
+
markRuntimeOnlySessionMessage({
|
|
16684
|
+
role: "assistant",
|
|
16685
|
+
content: msg.content || "",
|
|
16686
|
+
}),
|
|
16687
|
+
);
|
|
16688
|
+
messages.push(
|
|
16689
|
+
markRuntimeOnlySessionMessage({
|
|
16690
|
+
role: "user",
|
|
16691
|
+
content:
|
|
16692
|
+
stopOutcome.reason ||
|
|
16693
|
+
"A Stop hook requested that you keep working.",
|
|
16694
|
+
}),
|
|
16695
|
+
);
|
|
16624
16696
|
yield {
|
|
16625
16697
|
type: "stop-hook-continue",
|
|
16626
16698
|
runId,
|