chainlesschain 0.166.130 → 0.166.132
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 +30 -4
- 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/.build-hash +1 -1
- package/src/assets/web-panel/assets/AIOps-CHItp4vg.js +1 -0
- package/src/assets/web-panel/assets/AIOps-Cchx1iXI.css +1 -0
- package/src/assets/web-panel/assets/{ActionButton-Dzv1ReHF.js → ActionButton-nhMNWW_d.js} +1 -1
- package/src/assets/web-panel/assets/Analytics-DRc81BBI.js +3 -0
- package/src/assets/web-panel/assets/Analytics-Dr-1kvaM.css +1 -0
- package/src/assets/web-panel/assets/AppLayout-BTBIIl1e.css +1 -0
- package/src/assets/web-panel/assets/AppLayout-CVt7HMkp.js +3 -0
- package/src/assets/web-panel/assets/Artifacts-BuJgG5jf.js +1 -0
- package/src/assets/web-panel/assets/Artifacts-Dohtjyfl.css +1 -0
- package/src/assets/web-panel/assets/Audit-DDnViLtj.css +1 -0
- package/src/assets/web-panel/assets/Audit-msNg0aH-.js +1 -0
- package/src/assets/web-panel/assets/BackgroundAgents-BpcV8yWC.js +1 -0
- package/src/assets/web-panel/assets/BackgroundAgents-CH3Uc9sF.css +1 -0
- package/src/assets/web-panel/assets/Backup-CYh10zO3.css +1 -0
- package/src/assets/web-panel/assets/Backup-P53DADwG.js +1 -0
- package/src/assets/web-panel/assets/BaseInput-DFxT2yWN.js +1 -0
- package/src/assets/web-panel/assets/Chat-B5JvvQJb.css +1 -0
- package/src/assets/web-panel/assets/Chat-BXoHisHW.js +7 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CO908iBt.css +1 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DMGtSdDx.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-B5uzaLLP.js → Checkbox-B4g_ckJq.js} +1 -1
- package/src/assets/web-panel/assets/Codegen-BLP7id2a.css +1 -0
- package/src/assets/web-panel/assets/Codegen-C6SSSOfp.js +1 -0
- package/src/assets/web-panel/assets/{Col-D3I2kUGu.js → Col-IO1NEUYL.js} +1 -1
- package/src/assets/web-panel/assets/Community-C2RejeOY.css +1 -0
- package/src/assets/web-panel/assets/Community-CdEBl93F.js +1 -0
- package/src/assets/web-panel/assets/{Compact-5GigOmb8.js → Compact-DYs0a9k7.js} +1 -1
- package/src/assets/web-panel/assets/Compliance-BPnk7948.js +1 -0
- package/src/assets/web-panel/assets/Compliance-DOys4Ov1.css +1 -0
- package/src/assets/web-panel/assets/Cowork-DsOst4XK.css +1 -0
- package/src/assets/web-panel/assets/Cowork-VLOTGbza.js +6 -0
- package/src/assets/web-panel/assets/Cron-_9GgQLJo.js +2 -0
- package/src/assets/web-panel/assets/Crosschain-B21yn0qy.js +1 -0
- package/src/assets/web-panel/assets/Crosschain-C7Le4Pte.css +1 -0
- package/src/assets/web-panel/assets/DID-BX6k3jZi.css +1 -0
- package/src/assets/web-panel/assets/DID-mBeDgRZ7.js +2 -0
- package/src/assets/web-panel/assets/Dashboard-BckYYzhP.js +3 -0
- package/src/assets/web-panel/assets/Dashboard-MFDcsVcM.css +1 -0
- package/src/assets/web-panel/assets/Dropdown-DEedqFiE.js +1 -0
- package/src/assets/web-panel/assets/EmailListRenderer-CMs0k9TB.js +1 -0
- package/src/assets/web-panel/assets/EmailListRenderer-CVJ1j3Ll.css +1 -0
- package/src/assets/web-panel/assets/EvolutionSettings-B00Qd0fN.js +1 -0
- package/src/assets/web-panel/assets/EvolutionSettings-BnQ91YHJ.css +1 -0
- package/src/assets/web-panel/assets/FamilyGuardDashboard-Df-D09Q4.css +1 -0
- package/src/assets/web-panel/assets/FamilyGuardDashboard-DxMTAMa8.js +1 -0
- package/src/assets/web-panel/assets/Federation-B-UZw0LO.js +1 -0
- package/src/assets/web-panel/assets/Federation-CgmfLbx1.css +1 -0
- package/src/assets/web-panel/assets/FormItemContext-CkafazEw.js +1 -0
- package/src/assets/web-panel/assets/GenericCardRenderer-DEUG25ZJ.js +1 -0
- package/src/assets/web-panel/assets/GenericCardRenderer-DtJFcJYl.css +1 -0
- package/src/assets/web-panel/assets/Git-D7dr9oz9.js +2 -0
- package/src/assets/web-panel/assets/{Git-BdHhxBWR.css → Git-DPuaGtg7.css} +1 -1
- package/src/assets/web-panel/assets/Governance-BoipmXaM.css +1 -0
- package/src/assets/web-panel/assets/Governance-DKlUJ1wg.js +1 -0
- package/src/assets/web-panel/assets/Inference-BJKqplap.js +1 -0
- package/src/assets/web-panel/assets/Inference-BWxYJF9-.css +1 -0
- package/src/assets/web-panel/assets/KnowledgeGraph-B78fB-bz.js +1 -0
- package/src/assets/web-panel/assets/KnowledgeGraph-CztPDA96.css +1 -0
- package/src/assets/web-panel/assets/Logs-DJGcHYH_.js +2 -0
- package/src/assets/web-panel/assets/Logs-Gf_Mv9Nx.css +1 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-BAxj61I3.css +1 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-DkcG_MxW.js +1 -0
- package/src/assets/web-panel/assets/Marketplace-Djp5q9dS.css +1 -0
- package/src/assets/web-panel/assets/Marketplace-ucTbwByD.js +1 -0
- package/src/assets/web-panel/assets/McpTools-Cu1xZYYk.js +2 -0
- package/src/assets/web-panel/assets/McpTools-DSGHWYS_.css +1 -0
- package/src/assets/web-panel/assets/Memory-Bcc2hxOA.css +1 -0
- package/src/assets/web-panel/assets/Memory-DCGpXmi-.js +2 -0
- package/src/assets/web-panel/assets/MobileBridge-BQ-Uwwg7.css +1 -0
- package/src/assets/web-panel/assets/MobileBridge-BnKr0aAS.js +1 -0
- package/src/assets/web-panel/assets/MobileProjects-C5UvYJTP.js +1 -0
- package/src/assets/web-panel/assets/MobileProjects-Ceaxrqzc.css +1 -0
- package/src/assets/web-panel/assets/Mtc-D1UUl4WH.js +6 -0
- package/src/assets/web-panel/assets/Mtc-DHwbdUqA.css +1 -0
- package/src/assets/web-panel/assets/MtcAudit-B0x8gahq.css +1 -0
- package/src/assets/web-panel/assets/MtcAudit-D3aa8XP4.js +19 -0
- package/src/assets/web-panel/assets/Multisig-DiXdfJjO.js +7 -0
- package/src/assets/web-panel/assets/Multisig-kwPDnXnl.css +1 -0
- package/src/assets/web-panel/assets/NLProgramming-CLOvy-35.css +1 -0
- package/src/assets/web-panel/assets/NLProgramming-DbWABgSE.js +1 -0
- package/src/assets/web-panel/assets/Notes-BP1DPl-R.js +7 -0
- package/src/assets/web-panel/assets/Notes-COE2q2gD.css +1 -0
- package/src/assets/web-panel/assets/NotificationSettings-Co0e0uEO.css +1 -0
- package/src/assets/web-panel/assets/NotificationSettings-xaB6ONe7.js +1 -0
- package/src/assets/web-panel/assets/OrderTableRenderer-BnOISpKI.css +1 -0
- package/src/assets/web-panel/assets/OrderTableRenderer-D1uNcz3b.js +1 -0
- package/src/assets/web-panel/assets/Organization-BM3Lh8Q8.css +1 -0
- package/src/assets/web-panel/assets/Organization-DMLDGaf1.js +4 -0
- package/src/assets/web-panel/assets/{Overflow-ky9UfGv4.js → Overflow-DH4QPEoI.js} +1 -1
- package/src/assets/web-panel/assets/{OverrideContext-C0w0P4A3.js → OverrideContext-DLR1AtLy.js} +1 -1
- package/src/assets/web-panel/assets/P2P-Bl4OS10o.js +2 -0
- package/src/assets/web-panel/assets/P2P-Cx88UaiD.css +1 -0
- package/src/assets/web-panel/assets/PdhVaultBrowser-B9ZGFpn4.css +1 -0
- package/src/assets/web-panel/assets/PdhVaultBrowser-D9XSE2YI.js +7 -0
- package/src/assets/web-panel/assets/Permissions-CUaPlr6d.js +4 -0
- package/src/assets/web-panel/assets/Permissions-Diejgkbs.css +1 -0
- package/src/assets/web-panel/assets/PersonalDataHub-Ba92dZk-.js +3 -0
- package/src/assets/web-panel/assets/PersonalDataHub-C_xhspRy.css +1 -0
- package/src/assets/web-panel/assets/Pipeline-Bh2okm-8.js +1 -0
- package/src/assets/web-panel/assets/Pipeline-DxkXqrH2.css +1 -0
- package/src/assets/web-panel/assets/Privacy-Bmq3p4gC.js +1 -0
- package/src/assets/web-panel/assets/Privacy-CrsfSFKd.css +1 -0
- package/src/assets/web-panel/assets/ProjectInit-BPu2fdKR.js +2 -0
- package/src/assets/web-panel/assets/ProjectInit-CteEo-wF.css +1 -0
- package/src/assets/web-panel/assets/ProjectSettings-D6ABLpmt.js +2 -0
- package/src/assets/web-panel/assets/ProjectSettings-pLSae-wy.css +1 -0
- package/src/assets/web-panel/assets/Projects-BX-SG9R4.css +1 -0
- package/src/assets/web-panel/assets/Projects-qWHEve0z.js +1 -0
- package/src/assets/web-panel/assets/Providers-CpAXh_6c.css +1 -0
- package/src/assets/web-panel/assets/Providers-D9DI-2hc.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-er_HkLCI.js → QrScannerModal-CxifoeD5.js} +1 -1
- package/src/assets/web-panel/assets/QrScannerModal-DFrn7rxS.css +1 -0
- package/src/assets/web-panel/assets/QuickAsk-DC1BvwR7.js +1 -0
- package/src/assets/web-panel/assets/Recommend-CH6wKzGo.css +1 -0
- package/src/assets/web-panel/assets/Recommend-CKqbMB5o.js +1 -0
- package/src/assets/web-panel/assets/RemoteSession-BGGzPdS5.js +5 -0
- package/src/assets/web-panel/assets/Reputation-D6VPNEd0.css +1 -0
- package/src/assets/web-panel/assets/Reputation-DH90O9-5.js +1 -0
- package/src/assets/web-panel/assets/Row-h7ovueJc.js +1 -0
- package/src/assets/web-panel/assets/RssFeed-Cze7YLaG.css +1 -0
- package/src/assets/web-panel/assets/RssFeed-DaHxXTZg.js +3 -0
- package/src/assets/web-panel/assets/Search-B6RalzTB.css +1 -0
- package/src/assets/web-panel/assets/Search-Bn6Nqpn4.js +1 -0
- package/src/assets/web-panel/assets/Security-13K57V_v.css +1 -0
- package/src/assets/web-panel/assets/Security-ClbBmPJi.js +4 -0
- package/src/assets/web-panel/assets/Services-C8Qs6KXv.css +1 -0
- package/src/assets/web-panel/assets/Services-ChHLQwRn.js +2 -0
- package/src/assets/web-panel/assets/{Skeleton-CrFs6rUL.js → Skeleton-DfN6BFzt.js} +1 -1
- package/src/assets/web-panel/assets/Skills-BdjRyorN.css +1 -0
- package/src/assets/web-panel/assets/Skills-C926wDev.js +1 -0
- package/src/assets/web-panel/assets/Sla-DJzi1l1M.js +1 -0
- package/src/assets/web-panel/assets/Sla-K19oOyQc.css +1 -0
- package/src/assets/web-panel/assets/SpeechSettings-DYPJTDKz.css +1 -0
- package/src/assets/web-panel/assets/SpeechSettings-_GSyVjm_.js +1 -0
- package/src/assets/web-panel/assets/SyncSettings-B67xnERe.js +1 -0
- package/src/assets/web-panel/assets/SyncSettings-C6cDrwDR.css +1 -0
- package/src/assets/web-panel/assets/Tasks-BJjN_YEm.css +1 -0
- package/src/assets/web-panel/assets/Tasks-BaYZadcG.js +1 -0
- package/src/assets/web-panel/assets/Templates-BsMmCdZI.css +1 -0
- package/src/assets/web-panel/assets/Templates-Bu8kN1Xt.js +1 -0
- package/src/assets/web-panel/assets/Tenant-BM9qufw1.js +1 -0
- package/src/assets/web-panel/assets/Tenant-D3zkSAV0.css +1 -0
- package/src/assets/web-panel/assets/Terminal-MEdd5DjB.js +3 -0
- package/src/assets/web-panel/assets/Terminal-qPp9MaPu.css +1 -0
- package/src/assets/web-panel/assets/TimelineRenderer-C27kL2oU.js +1 -0
- package/src/assets/web-panel/assets/TimelineRenderer-DmztdsbF.css +1 -0
- package/src/assets/web-panel/assets/Tokens-BBOdNRHQ.css +1 -0
- package/src/assets/web-panel/assets/Tokens-Cvjd98VC.js +1 -0
- package/src/assets/web-panel/assets/{Trigger-CXrW4Nry.js → Trigger-CLym84HI.js} +1 -1
- package/src/assets/web-panel/assets/Trust-Bv2JTaNN.js +1 -0
- package/src/assets/web-panel/assets/Trust-DeOo0xAh.css +1 -0
- package/src/assets/web-panel/assets/UkeySign-CSCkNbtm.js +1 -0
- package/src/assets/web-panel/assets/VideoEditing-BFDXB4xh.js +1 -0
- package/src/assets/web-panel/assets/VideoEditing-DksiizfS.css +1 -0
- package/src/assets/web-panel/assets/Wallet-CMEFrG_b.js +4 -0
- package/src/assets/web-panel/assets/Wallet-Dw8uV4Ug.css +1 -0
- package/src/assets/web-panel/assets/WebAuthn-DKx6xPPl.css +1 -0
- package/src/assets/web-panel/assets/WebAuthn-x4eO_Q4y.js +5 -0
- package/src/assets/web-panel/assets/WorkflowEditor-ClWEPgV1.js +1 -0
- package/src/assets/web-panel/assets/WorkflowEditor-IiwsD8Kh.css +1 -0
- package/src/assets/web-panel/assets/{_getTag-DnrRH4E6.js → _getTag-BVc6NQ_K.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BpJsXlTK.js → chat-BdYOI4gM.js} +1 -1
- package/src/assets/web-panel/assets/{collapseMotion-CqM1QOwM.js → collapseMotion-B4IZiILV.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CUNg0-fh.js → colors-DcTBrGvS.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-C3tFHnhu.js → compact-item-Dn2ktVuj.js} +1 -1
- package/src/assets/web-panel/assets/createContext-XTreuyqp.js +1 -0
- package/src/assets/web-panel/assets/{debounce-CFGTTtN3.js → debounce-D9xTw4Sx.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CNIS3FrJ.js +1 -0
- package/src/assets/web-panel/assets/echarts-CDp6K7pj.js +19 -0
- package/src/assets/web-panel/assets/{hasIn-CU6RIciB.js → hasIn-CFRNsYQd.js} +1 -1
- package/src/assets/web-panel/assets/{icons-DG5UD-6K.js → icons-DlxlFL4g.js} +4 -4
- package/src/assets/web-panel/assets/index-3RqDry-K.js +71 -0
- package/src/assets/web-panel/assets/{index-BPWJw4Ji.js → index-8METW_Wr.js} +1 -1
- package/src/assets/web-panel/assets/index-BBd64wj8.js +31 -0
- package/src/assets/web-panel/assets/index-BEyVNbNE.js +3 -0
- package/src/assets/web-panel/assets/index-BMLpP8QQ.js +1 -0
- package/src/assets/web-panel/assets/{index-BzhobTgZ.js → index-BSqydcDa.js} +1 -1
- package/src/assets/web-panel/assets/index-BV6LojRv.js +21 -0
- package/src/assets/web-panel/assets/index-BbMWvjLZ.js +1 -0
- package/src/assets/web-panel/assets/{index-KgR1f2Gq.js → index-Brc0BF-k.js} +2 -2
- package/src/assets/web-panel/assets/{index-D4njcYFw.js → index-CG9YLDmI.js} +1 -1
- package/src/assets/web-panel/assets/{index-6EwPIfXu.js → index-CNHWMMDX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEIoRm_c.js → index-COuEJdmr.js} +3 -3
- package/src/assets/web-panel/assets/{index-BG4zuFf0.js → index-CRW3AWdS.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOlAutGy.js → index-CUT4h5JB.js} +2 -2
- package/src/assets/web-panel/assets/index-CXMa7Z-S.js +1 -0
- package/src/assets/web-panel/assets/index-CbaPXyNc.js +19 -0
- package/src/assets/web-panel/assets/{index-Cq93VfoF.css → index-CfX1DEtk.css} +1 -1
- package/src/assets/web-panel/assets/{index-X6e0cGRU.js → index-CjHA_Q7s.js} +1 -1
- package/src/assets/web-panel/assets/index-CsnYp4qF.js +1 -0
- package/src/assets/web-panel/assets/index-D45vulkq.js +12 -0
- package/src/assets/web-panel/assets/index-D9kPBEqD.js +55 -0
- package/src/assets/web-panel/assets/index-DDTSgpXz.js +1 -0
- package/src/assets/web-panel/assets/index-DFl_a0n5.js +1 -0
- package/src/assets/web-panel/assets/index-DNdiAymC.js +1 -0
- package/src/assets/web-panel/assets/{index-BJjEAoDb.js → index-DQEu7uW0.js} +1 -1
- package/src/assets/web-panel/assets/index-DW9XncMy.js +21 -0
- package/src/assets/web-panel/assets/index-Daa1yCt_.js +1 -0
- package/src/assets/web-panel/assets/index-DdVpoNEQ.js +12 -0
- package/src/assets/web-panel/assets/index-Dhi4Oybt.js +1 -0
- package/src/assets/web-panel/assets/index-DoVoNjtJ.js +1 -0
- package/src/assets/web-panel/assets/{index-111hR8WZ.js → index-Vo7A4aiN.js} +4 -4
- package/src/assets/web-panel/assets/{index-lo9rgpyj.js → index-XdlYkgCa.js} +1 -1
- package/src/assets/web-panel/assets/{index-1L0tt7G2.js → index-ir2ZwWz5.js} +2 -2
- package/src/assets/web-panel/assets/index-kzyCd8a0.js +3 -0
- package/src/assets/web-panel/assets/{index-CyyhilXV.js → index-lnTt0Jps.js} +2 -2
- package/src/assets/web-panel/assets/{index-CLQjdKmE.js → index-ma-rJkfE.js} +1 -1
- package/src/assets/web-panel/assets/index-oE4jTpHK.js +13 -0
- package/src/assets/web-panel/assets/{index-K2Uqqkr1.js → index-r5sNECM5.js} +1 -1
- package/src/assets/web-panel/assets/index-uT4fRDzU.js +1 -0
- package/src/assets/web-panel/assets/index-xlS8pDS2.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-FI8D7E2x.js → initDefaultProps-mdL0oeZa.js} +1 -1
- package/src/assets/web-panel/assets/{isPlainObject-BWRMT62c.js → isPlainObject-_gz-soRW.js} +1 -1
- package/src/assets/web-panel/assets/isSymbol-DAy2hlR5.js +1 -0
- package/src/assets/web-panel/assets/motion-ZgVCKcEX.js +11 -0
- package/src/assets/web-panel/assets/{move-Vl1vUReW.js → move-A_28O5T2.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-6Cu2aFME.js → mtc-parser-0zlMjabo.js} +1 -1
- package/src/assets/web-panel/assets/{omit-VRKL8iSO.js → omit-DF7mU3yG.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DZfWsOe0.js → pickAttrs-Cmt8liJP.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-qmcOUc4W.js → placementArrow-DaMDC57b.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BLB6SsSw.js → responsiveObserve-CHw_f2d3.js} +1 -1
- package/src/assets/web-panel/assets/{slide-41jdYeSH.js → slide-DJS9fFQq.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Yn8OQ5ey.js → statusUtils-Bk3XdZwh.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-4CEwz9Zd.js → styleChecker-DMybAFsA.js} +1 -1
- package/src/assets/web-panel/assets/useFlexGapSupport-_tbIIFMu.js +1 -0
- package/src/assets/web-panel/assets/{useFs-Bugo8HuF.js → useFs-KPklVptS.js} +1 -1
- package/src/assets/web-panel/assets/{useMergedState-DXbJa_zE.js → useMergedState-d-EXs3xd.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-B-q2ElB0.js → usePersonalDataHub-C7FrKDhD.js} +1 -1
- package/src/assets/web-panel/assets/{useRefs-BrCfMLMc.js → useRefs-DHeCQehi.js} +1 -1
- package/src/assets/web-panel/assets/{useState-CnxtbLoC.js → useState-Dlgl7fUg.js} +1 -1
- package/src/assets/web-panel/assets/vendor-BXcBOG8b.js +1 -0
- package/src/assets/web-panel/assets/vnode-DB3JBusp.js +1 -0
- package/src/assets/web-panel/assets/warning-Pq00owYb.js +1 -0
- package/src/assets/web-panel/assets/{zoom-DM1y_KKP.js → zoom-C8rAdf81.js} +1 -1
- package/src/assets/web-panel/index.html +4 -4
- package/src/command-help-index.json +1 -1
- package/src/commands/agent.js +1 -1
- package/src/commands/governed-skill-marketplace.js +24 -10
- package/src/commands/llm.js +4 -3
- package/src/data/changelog.json +27 -1
- package/src/harness/worktree-isolator.js +4 -1
- package/src/lib/compaction-host-provenance.js +24 -0
- package/src/lib/context-memory-kernel/durable-memory-port.js +46 -34
- package/src/lib/context-memory-kernel/live-compaction.js +12 -3
- package/src/lib/context-memory-kernel/memory-query-bundle.js +375 -0
- package/src/lib/context-memory-kernel/memory-query-control.js +28 -0
- package/src/lib/context-memory-kernel/memory-service.js +30 -16
- package/src/lib/context-memory-kernel/memory-shard-snapshots.js +63 -0
- package/src/lib/context-memory-kernel/message-adapter.js +27 -6
- package/src/lib/context-memory-kernel/provider-context.js +103 -27
- package/src/lib/context-memory-kernel/segmented-memory-port.js +347 -138
- package/src/lib/cost-budget.js +2 -0
- package/src/lib/ephemeral-worktree-scope.js +24 -0
- package/src/lib/evolution/evolution-deployment-loader.js +6 -4
- package/src/lib/evolution/governed-skill-marketplace-abort.js +14 -0
- package/src/lib/evolution/governed-skill-marketplace-candidate.js +10 -2
- package/src/lib/evolution/governed-skill-marketplace-cli-host.js +47 -20
- package/src/lib/evolution/governed-skill-marketplace.js +47 -24
- package/src/lib/goal-condition-engine.js +20 -3
- package/src/lib/goal-verification-command.js +221 -0
- package/src/lib/goal-verification-plan.js +372 -0
- package/src/lib/llm-connection-probe.js +12 -5
- package/src/lib/llm-onboarding-catalog.json +1 -1
- package/src/lib/llm-pricing.js +34 -8
- package/src/lib/mcp-tool-catalog-authority.js +244 -0
- package/src/lib/model-capabilities.js +6 -0
- package/src/lib/model-catalog-review.js +3 -0
- package/src/lib/model-context-catalog.js +44 -2
- package/src/lib/openai-responses.js +35 -6
- package/src/lib/sub-agent-context.js +12 -4
- package/src/lib/subagent-inheritance.js +162 -2
- package/src/lib/usage-pricing-context.js +34 -17
- package/src/repl/agent-repl.js +34 -2
- package/src/runtime/agent-core.js +335 -18
- package/src/runtime/compaction-host-context.js +72 -0
- package/src/runtime/headless-runner.js +133 -37
- package/src/runtime/headless-stream.js +38 -21
- package/src/runtime/mcp-agent-catalog.js +257 -0
- package/src/runtime/mcp-config.js +18 -69
- package/src/runtime/mcp-tool-search.js +16 -1
- package/src/runtime/message-roles.js +67 -3
- package/src/runtime/provider-stream-state.js +35 -1
- package/src/runtime/system-prompt.js +9 -0
- package/src/assets/web-panel/assets/AIOps-CSpp7iGY.css +0 -1
- package/src/assets/web-panel/assets/AIOps-o-rFKEYL.js +0 -1
- package/src/assets/web-panel/assets/Analytics-Bt7H_jrh.js +0 -3
- package/src/assets/web-panel/assets/Analytics-DJcHjy5J.css +0 -1
- package/src/assets/web-panel/assets/AppLayout-CgynsRFP.js +0 -9
- package/src/assets/web-panel/assets/AppLayout-VlanTjPw.css +0 -1
- package/src/assets/web-panel/assets/Artifacts-CTVt96zW.css +0 -1
- package/src/assets/web-panel/assets/Artifacts-gghOGDyE.js +0 -1
- package/src/assets/web-panel/assets/Audit-D8oxP0wr.css +0 -1
- package/src/assets/web-panel/assets/Audit-DBXn-AZ6.js +0 -1
- package/src/assets/web-panel/assets/BackgroundAgents--dxPftKa.js +0 -1
- package/src/assets/web-panel/assets/BackgroundAgents-Dq2340Kl.css +0 -1
- package/src/assets/web-panel/assets/Backup-D9Zf_2tH.js +0 -1
- package/src/assets/web-panel/assets/Backup-Wi9CaP3d.css +0 -1
- package/src/assets/web-panel/assets/BaseInput-DDTOjovq.js +0 -1
- package/src/assets/web-panel/assets/Chat-2ETqdBLn.js +0 -8
- package/src/assets/web-panel/assets/Chat-KSGPtU0L.css +0 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DSg2Xs8G.js +0 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-gy5SDGw2.css +0 -1
- package/src/assets/web-panel/assets/Codegen-4ieEEIwt.js +0 -1
- package/src/assets/web-panel/assets/Codegen-BB08p1fn.css +0 -1
- package/src/assets/web-panel/assets/Community-Cbq1nrpo.css +0 -1
- package/src/assets/web-panel/assets/Community-DeYxFMJb.js +0 -1
- package/src/assets/web-panel/assets/Compliance-DLVjbVUh.js +0 -1
- package/src/assets/web-panel/assets/Compliance-NoXr2Vof.css +0 -1
- package/src/assets/web-panel/assets/Cowork-BlXJRu6L.css +0 -1
- package/src/assets/web-panel/assets/Cowork-DfUKa0T5.js +0 -6
- package/src/assets/web-panel/assets/Cron-_RpktpO5.js +0 -2
- package/src/assets/web-panel/assets/Crosschain-7x6xdbwH.js +0 -1
- package/src/assets/web-panel/assets/Crosschain-CgRAecoR.css +0 -1
- package/src/assets/web-panel/assets/DID-DVsYcgvs.css +0 -1
- package/src/assets/web-panel/assets/DID-ccVhToC1.js +0 -2
- package/src/assets/web-panel/assets/Dashboard-CAPSdFR4.css +0 -1
- package/src/assets/web-panel/assets/Dashboard-DhygcaoK.js +0 -3
- package/src/assets/web-panel/assets/Dropdown-DFplwXK7.js +0 -1
- package/src/assets/web-panel/assets/EmailListRenderer-Bm01soCN.js +0 -1
- package/src/assets/web-panel/assets/EmailListRenderer-DTPZPx_S.css +0 -1
- package/src/assets/web-panel/assets/EvolutionSettings-Bdw8ApoT.css +0 -1
- package/src/assets/web-panel/assets/EvolutionSettings-C4v--DkD.js +0 -1
- package/src/assets/web-panel/assets/FamilyGuardDashboard-ChQXDBA3.js +0 -1
- package/src/assets/web-panel/assets/FamilyGuardDashboard-nd3idUVb.css +0 -1
- package/src/assets/web-panel/assets/Federation-C0yomE-M.js +0 -1
- package/src/assets/web-panel/assets/Federation-fGN6iMX_.css +0 -1
- package/src/assets/web-panel/assets/FormItemContext-DtT3ZEZK.js +0 -2
- package/src/assets/web-panel/assets/GenericCardRenderer-DgITtFRv.js +0 -1
- package/src/assets/web-panel/assets/GenericCardRenderer-o85VDYQS.css +0 -1
- package/src/assets/web-panel/assets/Git-CCY42R8S.js +0 -2
- package/src/assets/web-panel/assets/Governance-DtCS4NDm.css +0 -1
- package/src/assets/web-panel/assets/Governance-N66Bwvqg.js +0 -1
- package/src/assets/web-panel/assets/Inference-BkbPuR_2.js +0 -1
- package/src/assets/web-panel/assets/Inference-t-w0NgIS.css +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-4NU1S2Xm.css +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-B3PibXdA.js +0 -1
- package/src/assets/web-panel/assets/Logs-CUtNB_N6.js +0 -2
- package/src/assets/web-panel/assets/Logs-DQbCaYhL.css +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-D-V4dOe3.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-DbzhFwvz.css +0 -1
- package/src/assets/web-panel/assets/Marketplace-Bvo5cuGa.css +0 -1
- package/src/assets/web-panel/assets/Marketplace-DLNJb6Nr.js +0 -1
- package/src/assets/web-panel/assets/McpTools-2zGjJb5K.js +0 -4
- package/src/assets/web-panel/assets/McpTools-534Q95Mx.css +0 -1
- package/src/assets/web-panel/assets/Memory-9rNZ1EvR.js +0 -2
- package/src/assets/web-panel/assets/Memory-CleW_R6V.css +0 -1
- package/src/assets/web-panel/assets/MobileBridge-Cw7sAAgn.js +0 -1
- package/src/assets/web-panel/assets/MobileBridge-D3Arxfeg.css +0 -1
- package/src/assets/web-panel/assets/MobileProjects-8XACrqqy.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-BD4alw6-.css +0 -1
- package/src/assets/web-panel/assets/Mtc-CXZGO9Sh.css +0 -1
- package/src/assets/web-panel/assets/Mtc-mg02JNy-.js +0 -6
- package/src/assets/web-panel/assets/MtcAudit-B1Vkhj2l.js +0 -19
- package/src/assets/web-panel/assets/MtcAudit-C1JM8esp.css +0 -1
- package/src/assets/web-panel/assets/Multisig-BQEeA7GG.js +0 -13
- package/src/assets/web-panel/assets/Multisig-BryR2Jpr.css +0 -1
- package/src/assets/web-panel/assets/NLProgramming-BIbkjZV3.js +0 -1
- package/src/assets/web-panel/assets/NLProgramming-DGDHq6Z9.css +0 -1
- package/src/assets/web-panel/assets/Notes-BKKmMtqV.css +0 -1
- package/src/assets/web-panel/assets/Notes-DIwhkZNY.js +0 -7
- package/src/assets/web-panel/assets/NotificationSettings-CG3Kfuef.css +0 -1
- package/src/assets/web-panel/assets/NotificationSettings-Cj9175ce.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CfrDjSHT.css +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-IfNpXT2R.js +0 -1
- package/src/assets/web-panel/assets/Organization-DPFp6G9o.js +0 -4
- package/src/assets/web-panel/assets/Organization-LVvqwG0D.css +0 -1
- package/src/assets/web-panel/assets/P2P-DcFvP7F-.css +0 -1
- package/src/assets/web-panel/assets/P2P-tXck8GLq.js +0 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-DSvpQl9k.js +0 -7
- package/src/assets/web-panel/assets/PdhVaultBrowser-DZZrUOr1.css +0 -1
- package/src/assets/web-panel/assets/Permissions-CKPkdLj-.js +0 -4
- package/src/assets/web-panel/assets/Permissions-DsPE_IQy.css +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-BhpRlh9D.css +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-DnqXc12l.js +0 -9
- package/src/assets/web-panel/assets/Pipeline-BItr5CyP.css +0 -1
- package/src/assets/web-panel/assets/Pipeline-BKjFU_kd.js +0 -1
- package/src/assets/web-panel/assets/Privacy-ChC-J5Tn.js +0 -1
- package/src/assets/web-panel/assets/Privacy-F_ENsxZk.css +0 -1
- package/src/assets/web-panel/assets/ProjectInit-B86LEzDL.css +0 -1
- package/src/assets/web-panel/assets/ProjectInit-ByFZG9sY.js +0 -2
- package/src/assets/web-panel/assets/ProjectSettings-Bbv1Kiw-.js +0 -2
- package/src/assets/web-panel/assets/ProjectSettings-DK7KA_iX.css +0 -1
- package/src/assets/web-panel/assets/Projects-CmJeUDBW.css +0 -1
- package/src/assets/web-panel/assets/Projects-QYyGW31-.js +0 -1
- package/src/assets/web-panel/assets/Providers-C6q_fvea.css +0 -1
- package/src/assets/web-panel/assets/Providers-CJLnWw0r.js +0 -1
- package/src/assets/web-panel/assets/QrScannerModal-NwAHNfiJ.css +0 -1
- package/src/assets/web-panel/assets/QuickAsk-DoXU0np9.js +0 -1
- package/src/assets/web-panel/assets/Recommend-DCo_vuaf.js +0 -1
- package/src/assets/web-panel/assets/Recommend-D_bf91K6.css +0 -1
- package/src/assets/web-panel/assets/RemoteSession-CLuL925Z.js +0 -5
- package/src/assets/web-panel/assets/Reputation-CNNCA_-M.js +0 -1
- package/src/assets/web-panel/assets/Reputation-DiOsOleI.css +0 -1
- package/src/assets/web-panel/assets/Row-Vu4j631i.js +0 -1
- package/src/assets/web-panel/assets/RssFeed-C18B4xiy.js +0 -3
- package/src/assets/web-panel/assets/RssFeed-CjcbkyUb.css +0 -1
- package/src/assets/web-panel/assets/Search-DxiqccE2.js +0 -1
- package/src/assets/web-panel/assets/Search-Klk29S7C.css +0 -1
- package/src/assets/web-panel/assets/Security-BmrukMHn.css +0 -1
- package/src/assets/web-panel/assets/Security-Droe_hHI.js +0 -4
- package/src/assets/web-panel/assets/Services-CwmmyXzq.js +0 -2
- package/src/assets/web-panel/assets/Services-DAnVNhUG.css +0 -1
- package/src/assets/web-panel/assets/Skills-BUu9owbR.css +0 -1
- package/src/assets/web-panel/assets/Skills-Dp-d2miK.js +0 -1
- package/src/assets/web-panel/assets/Sla-2DFXVbK4.js +0 -1
- package/src/assets/web-panel/assets/Sla-sodqCU4a.css +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-Cdd9lCoy.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-CgB9nFyq.css +0 -1
- package/src/assets/web-panel/assets/SyncSettings-B3hJqmBP.css +0 -1
- package/src/assets/web-panel/assets/SyncSettings-CxQhcYSk.js +0 -2
- package/src/assets/web-panel/assets/Tasks-BHWVRfXx.js +0 -1
- package/src/assets/web-panel/assets/Tasks-nbTUVXvt.css +0 -1
- package/src/assets/web-panel/assets/Templates-CpFsKk_l.css +0 -1
- package/src/assets/web-panel/assets/Templates-DNFk3a5_.js +0 -1
- package/src/assets/web-panel/assets/Tenant-B6X6dPo8.js +0 -1
- package/src/assets/web-panel/assets/Tenant-MuPJnOjk.css +0 -1
- package/src/assets/web-panel/assets/Terminal-BuUNoLGM.js +0 -3
- package/src/assets/web-panel/assets/Terminal-DHoveJwj.css +0 -1
- package/src/assets/web-panel/assets/TimelineRenderer-BlTAtkOc.css +0 -1
- package/src/assets/web-panel/assets/TimelineRenderer-DThrBYj8.js +0 -1
- package/src/assets/web-panel/assets/Tokens-CA_u4Blu.js +0 -1
- package/src/assets/web-panel/assets/Tokens-CynVae-o.css +0 -1
- package/src/assets/web-panel/assets/Trust-C-WrW0Fj.css +0 -1
- package/src/assets/web-panel/assets/Trust-DHcLpNy3.js +0 -1
- package/src/assets/web-panel/assets/UkeySign-B_fni4C2.js +0 -1
- package/src/assets/web-panel/assets/VideoEditing-BDFghpzP.css +0 -1
- package/src/assets/web-panel/assets/VideoEditing-g9nf2EhS.js +0 -1
- package/src/assets/web-panel/assets/Wallet-C8pOjIve.js +0 -4
- package/src/assets/web-panel/assets/Wallet-DUbpTRcg.css +0 -1
- package/src/assets/web-panel/assets/WebAuthn-BaKNjxZt.js +0 -5
- package/src/assets/web-panel/assets/WebAuthn-CVAFRfCQ.css +0 -1
- package/src/assets/web-panel/assets/WorkflowEditor-429lPWYk.css +0 -1
- package/src/assets/web-panel/assets/WorkflowEditor-CX030Wb1.js +0 -1
- package/src/assets/web-panel/assets/createContext-B8rTvO61.js +0 -1
- package/src/assets/web-panel/assets/devWarning-B4_IVU_n.js +0 -1
- package/src/assets/web-panel/assets/echarts-C61Vn3mP.js +0 -25
- package/src/assets/web-panel/assets/index--6BUI55w.js +0 -1
- package/src/assets/web-panel/assets/index-5Q1bepcM.js +0 -1
- package/src/assets/web-panel/assets/index-B10Ia2KL.js +0 -21
- package/src/assets/web-panel/assets/index-B1SLBLli.js +0 -3
- package/src/assets/web-panel/assets/index-B8_VQAav.js +0 -1
- package/src/assets/web-panel/assets/index-BMuPJra-.js +0 -1
- package/src/assets/web-panel/assets/index-BOCjph-k.js +0 -12
- package/src/assets/web-panel/assets/index-BpBaOWmV.js +0 -1
- package/src/assets/web-panel/assets/index-CDlHvQtw.js +0 -1
- package/src/assets/web-panel/assets/index-CPF7Vqri.js +0 -55
- package/src/assets/web-panel/assets/index-CPmgKQcl.js +0 -1
- package/src/assets/web-panel/assets/index-CcpMHPWd.js +0 -21
- package/src/assets/web-panel/assets/index-Cyksnofp.js +0 -1
- package/src/assets/web-panel/assets/index-Dc9pcin6.js +0 -1
- package/src/assets/web-panel/assets/index-DfAC55QA.js +0 -19
- package/src/assets/web-panel/assets/index-DgNCfwvg.js +0 -1
- package/src/assets/web-panel/assets/index-DvfhIBNZ.js +0 -1
- package/src/assets/web-panel/assets/index-Hbzd9WeI.js +0 -1
- package/src/assets/web-panel/assets/index-IiS7WoUl.js +0 -13
- package/src/assets/web-panel/assets/index-Xa6TlaD7.js +0 -31
- package/src/assets/web-panel/assets/index-YczWc2_0.js +0 -12
- package/src/assets/web-panel/assets/index-h_ANnbR8.js +0 -3
- package/src/assets/web-panel/assets/index-k7QsBwyo.js +0 -75
- package/src/assets/web-panel/assets/isSymbol-S5WZT7lS.js +0 -1
- package/src/assets/web-panel/assets/motion-B1hpJYSD.js +0 -11
- package/src/assets/web-panel/assets/useFlexGapSupport-BClv53kR.js +0 -1
- package/src/assets/web-panel/assets/vendor-Bn1JzzAn.js +0 -42
- package/src/assets/web-panel/assets/vnode-ejVeFJ0x.js +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { projectMessagesWithTaskBinding } from "./message-roles.js";
|
|
1
2
|
import {
|
|
2
3
|
providerFetch,
|
|
3
4
|
requireUnscopedToolExecution,
|
|
@@ -28,6 +29,7 @@ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
|
|
|
28
29
|
*/
|
|
29
30
|
|
|
30
31
|
import fs from "fs";
|
|
32
|
+
import { isDeepStrictEqual } from "node:util";
|
|
31
33
|
import { isUtf8 } from "node:buffer";
|
|
32
34
|
import {
|
|
33
35
|
_isNonNegativeSafeInteger,
|
|
@@ -216,6 +218,19 @@ import {
|
|
|
216
218
|
buildToolAttribution,
|
|
217
219
|
} from "../lib/agent-tool-admission.js";
|
|
218
220
|
import { captureAgentExecutionPolicy } from "../lib/agent-execution-policy.js";
|
|
221
|
+
import { ephemeralWorktreeConsumerRefusal } from "../lib/ephemeral-worktree-scope.js";
|
|
222
|
+
import {
|
|
223
|
+
COMPACTION_CONTEXT_REFRESH_ERROR,
|
|
224
|
+
refreshCompactionHostContext,
|
|
225
|
+
} from "./compaction-host-context.js";
|
|
226
|
+
import {
|
|
227
|
+
assertMcpCatalogBinding,
|
|
228
|
+
captureMcpToolCatalog,
|
|
229
|
+
mergeMcpToolCatalog,
|
|
230
|
+
projectMcpToolCatalog,
|
|
231
|
+
readMcpToolCatalog,
|
|
232
|
+
restrictMcpToolCatalog,
|
|
233
|
+
} from "../lib/mcp-tool-catalog-authority.js";
|
|
219
234
|
import {
|
|
220
235
|
evaluateUnattendedToolAction,
|
|
221
236
|
evaluateUnattendedGitAction,
|
|
@@ -259,6 +274,8 @@ import { isMcpRpcError } from "../harness/mcp-client.js";
|
|
|
259
274
|
import {
|
|
260
275
|
projectCanonicalResumeMessages,
|
|
261
276
|
markRuntimeOnlySessionMessage,
|
|
277
|
+
isRuntimeOnlySessionMessage,
|
|
278
|
+
encodePersistedMessage,
|
|
262
279
|
} from "../lib/session-message-provenance.js";
|
|
263
280
|
import { releaseOldLiveSessionResults } from "../lib/session-runtime-retention.js";
|
|
264
281
|
import {
|
|
@@ -4040,6 +4057,8 @@ export async function executeTool(name, args, context = {}) {
|
|
|
4040
4057
|
externalToolDescriptors: context.externalToolDescriptors || null,
|
|
4041
4058
|
externalToolExecutors: context.externalToolExecutors || null,
|
|
4042
4059
|
mcpClient: context.mcpClient || null,
|
|
4060
|
+
mcpToolCatalog: context.mcpToolCatalog || null,
|
|
4061
|
+
mcpCatalogBinding: context.mcpCatalogBinding || null,
|
|
4043
4062
|
mcpHostClient: context.mcpHostClient || context.mcpClient || null,
|
|
4044
4063
|
mcpCallLedger: context.mcpCallLedger || null,
|
|
4045
4064
|
mcpConflictScheduler: context.mcpConflictScheduler || null,
|
|
@@ -5656,6 +5675,8 @@ async function executeToolInner(
|
|
|
5656
5675
|
externalToolExecutors,
|
|
5657
5676
|
extraToolDefinitions = null,
|
|
5658
5677
|
mcpClient,
|
|
5678
|
+
mcpToolCatalog = null,
|
|
5679
|
+
mcpCatalogBinding = null,
|
|
5659
5680
|
mcpHostClient = mcpClient,
|
|
5660
5681
|
mcpCallLedger = null,
|
|
5661
5682
|
mcpConflictScheduler = null,
|
|
@@ -6221,6 +6242,10 @@ async function executeToolInner(
|
|
|
6221
6242
|
// Bound the declared run_shell data once. Approval and dispatch never
|
|
6222
6243
|
// observe later mutation of the caller-owned tool arguments.
|
|
6223
6244
|
args = Object.isFrozen(args) ? args : snapshotShellExecutionArgs(args);
|
|
6245
|
+
if (args.run_in_background === true) {
|
|
6246
|
+
const refusal = ephemeralWorktreeConsumerRefusal("Background shell");
|
|
6247
|
+
if (refusal) return attachDescriptor(refusal);
|
|
6248
|
+
}
|
|
6224
6249
|
if (unattendedActionPolicy?.unattended === true) {
|
|
6225
6250
|
const unattendedVerdict = evaluateUnattendedShellAction(args.command, {
|
|
6226
6251
|
...unattendedActionPolicy,
|
|
@@ -7888,6 +7913,8 @@ async function executeToolInner(
|
|
|
7888
7913
|
// filtered by the resolved contract's mcpServers allow-list.
|
|
7889
7914
|
mcpClient,
|
|
7890
7915
|
mcpHostClient,
|
|
7916
|
+
mcpToolCatalog,
|
|
7917
|
+
mcpCatalogBinding,
|
|
7891
7918
|
mcpCallLedger,
|
|
7892
7919
|
mcpConflictScheduler,
|
|
7893
7920
|
mcpDispatchAdmission,
|
|
@@ -8243,6 +8270,14 @@ async function executeToolInner(
|
|
|
8243
8270
|
}
|
|
8244
8271
|
|
|
8245
8272
|
case "schedule": {
|
|
8273
|
+
if (
|
|
8274
|
+
["wakeup", "cron", "monitor"].includes(
|
|
8275
|
+
String(args.action || "").toLowerCase(),
|
|
8276
|
+
)
|
|
8277
|
+
) {
|
|
8278
|
+
const refusal = ephemeralWorktreeConsumerRefusal("Deferred schedule");
|
|
8279
|
+
if (refusal) return attachDescriptor(refusal);
|
|
8280
|
+
}
|
|
8246
8281
|
try {
|
|
8247
8282
|
const { AgentScheduleStore } = await import(
|
|
8248
8283
|
"../lib/agent-schedule-store.js"
|
|
@@ -8992,6 +9027,16 @@ async function executeToolInner(
|
|
|
8992
9027
|
});
|
|
8993
9028
|
}
|
|
8994
9029
|
|
|
9030
|
+
if (match.isolation === true) {
|
|
9031
|
+
const refusal = ephemeralWorktreeConsumerRefusal(
|
|
9032
|
+
"Isolated skill child",
|
|
9033
|
+
);
|
|
9034
|
+
if (refusal) {
|
|
9035
|
+
skillExecutionLease?.release?.();
|
|
9036
|
+
return attachDescriptor(refusal);
|
|
9037
|
+
}
|
|
9038
|
+
}
|
|
9039
|
+
|
|
8995
9040
|
const selectedSkillDigest =
|
|
8996
9041
|
match.executionIdentity?.contentDigest ||
|
|
8997
9042
|
`sha256:${createHash("sha256").update(admittedSkillBody).digest("hex")}`;
|
|
@@ -9676,6 +9721,11 @@ async function executeToolInner(
|
|
|
9676
9721
|
// MCP tool schemas from the registry attached at setup time. Read-only,
|
|
9677
9722
|
// local — same risk class as list_skills, so no approval gate.
|
|
9678
9723
|
if (localToolExecutor?.kind === "tool-search") {
|
|
9724
|
+
try {
|
|
9725
|
+
assertMcpCatalogBinding(mcpCatalogBinding, name);
|
|
9726
|
+
} catch (error) {
|
|
9727
|
+
return attachDescriptor({ error: error.message, code: error.code });
|
|
9728
|
+
}
|
|
9679
9729
|
return attachDescriptor(
|
|
9680
9730
|
executeToolSearch(localToolExecutor.registry, args || {}, {
|
|
9681
9731
|
allowedToolNames: effectiveAllowedToolNames,
|
|
@@ -9722,6 +9772,11 @@ async function executeToolInner(
|
|
|
9722
9772
|
}
|
|
9723
9773
|
|
|
9724
9774
|
if (localToolExecutor?.kind === "mcp") {
|
|
9775
|
+
try {
|
|
9776
|
+
assertMcpCatalogBinding(mcpCatalogBinding, name);
|
|
9777
|
+
} catch (error) {
|
|
9778
|
+
return attachDescriptor({ error: error.message, code: error.code });
|
|
9779
|
+
}
|
|
9725
9780
|
if (!mcpClient || typeof mcpClient.callTool !== "function") {
|
|
9726
9781
|
return attachDescriptor({
|
|
9727
9782
|
error: `MCP client is unavailable for tool: ${name}`,
|
|
@@ -9757,6 +9812,18 @@ async function executeToolInner(
|
|
|
9757
9812
|
}
|
|
9758
9813
|
|
|
9759
9814
|
const schedulerScopes = mcpLedgerScopes(mcpWireInput);
|
|
9815
|
+
const catalogDispatchAdmission = mcpCatalogBinding
|
|
9816
|
+
? (metadata, dispatch) => {
|
|
9817
|
+
assertMcpCatalogBinding(mcpCatalogBinding, name);
|
|
9818
|
+
const admittedDispatch = () => {
|
|
9819
|
+
assertMcpCatalogBinding(mcpCatalogBinding, name);
|
|
9820
|
+
return dispatch();
|
|
9821
|
+
};
|
|
9822
|
+
return mcpDispatchAdmission
|
|
9823
|
+
? mcpDispatchAdmission(metadata, admittedDispatch)
|
|
9824
|
+
: admittedDispatch();
|
|
9825
|
+
}
|
|
9826
|
+
: mcpDispatchAdmission;
|
|
9760
9827
|
const ledgerEffectContract = mcpLedgerEffectContract(
|
|
9761
9828
|
localToolDescriptor,
|
|
9762
9829
|
hostToolPolicy,
|
|
@@ -9869,16 +9936,17 @@ async function executeToolInner(
|
|
|
9869
9936
|
|
|
9870
9937
|
let pendingResult;
|
|
9871
9938
|
try {
|
|
9939
|
+
assertMcpCatalogBinding(mcpCatalogBinding, name);
|
|
9872
9940
|
const callArguments = [
|
|
9873
9941
|
localToolExecutor.serverName,
|
|
9874
9942
|
localToolExecutor.toolName,
|
|
9875
9943
|
mcpWireInput,
|
|
9876
9944
|
];
|
|
9877
|
-
if (signal ||
|
|
9945
|
+
if (signal || catalogDispatchAdmission || workflowEffectId) {
|
|
9878
9946
|
callArguments.push({
|
|
9879
9947
|
...(signal ? { signal } : {}),
|
|
9880
|
-
...(
|
|
9881
|
-
? { dispatchAdmission:
|
|
9948
|
+
...(catalogDispatchAdmission
|
|
9949
|
+
? { dispatchAdmission: catalogDispatchAdmission }
|
|
9882
9950
|
: {}),
|
|
9883
9951
|
...(workflowEffectId
|
|
9884
9952
|
? {
|
|
@@ -11164,6 +11232,13 @@ async function _executeSpawnSubAgent(args, ctx) {
|
|
|
11164
11232
|
};
|
|
11165
11233
|
}
|
|
11166
11234
|
|
|
11235
|
+
const wantsBackground =
|
|
11236
|
+
args.background === true || effectiveContract?.background === true;
|
|
11237
|
+
if (wantsBackground) {
|
|
11238
|
+
const refusal = ephemeralWorktreeConsumerRefusal("Background sub-agent");
|
|
11239
|
+
if (refusal) return refusal;
|
|
11240
|
+
}
|
|
11241
|
+
|
|
11167
11242
|
// Filter the parent loop's live MCP plumbing + settings hooks down to what the
|
|
11168
11243
|
// child may inherit. Default `[]` → null → the spawn passes nothing, so a plain
|
|
11169
11244
|
// sub-agent is byte-identical to before.
|
|
@@ -11262,6 +11337,9 @@ async function _executeSpawnSubAgent(args, ctx) {
|
|
|
11262
11337
|
|
|
11263
11338
|
// A child can never regain a tool omitted from the parent's effective schema.
|
|
11264
11339
|
// `[]` remains deny-all all the way into the child's execution-time fence.
|
|
11340
|
+
let requestedMcpTools = Array.isArray(allowedTools)
|
|
11341
|
+
? Object.freeze([...allowedTools])
|
|
11342
|
+
: null;
|
|
11265
11343
|
if (Array.isArray(ctx.effectiveAllowedToolNames)) {
|
|
11266
11344
|
const parentCeiling = new Set(ctx.effectiveAllowedToolNames);
|
|
11267
11345
|
const requested = Array.isArray(allowedTools)
|
|
@@ -11302,6 +11380,7 @@ async function _executeSpawnSubAgent(args, ctx) {
|
|
|
11302
11380
|
const perm = resolvePermissionMode(effectiveContract.permissionMode);
|
|
11303
11381
|
if (perm.readOnly) {
|
|
11304
11382
|
allowedTools = resolveEnabledTools({ allowedTools, readOnly: true });
|
|
11383
|
+
requestedMcpTools = allowedTools;
|
|
11305
11384
|
}
|
|
11306
11385
|
// autopilot ⟺ bypassPermissions — the only mode whose headless confirmer
|
|
11307
11386
|
// ALLOWS. Threading a deny confirmer would needlessly disable the child's
|
|
@@ -11326,6 +11405,29 @@ async function _executeSpawnSubAgent(args, ctx) {
|
|
|
11326
11405
|
}
|
|
11327
11406
|
}
|
|
11328
11407
|
|
|
11408
|
+
let childMcpCatalog = null;
|
|
11409
|
+
if (
|
|
11410
|
+
ctx.mcpToolCatalog &&
|
|
11411
|
+
!(Array.isArray(mcpAllow) && mcpAllow.length === 0)
|
|
11412
|
+
) {
|
|
11413
|
+
try {
|
|
11414
|
+
const { createInheritedMcpToolCatalog } = await import(
|
|
11415
|
+
"../lib/subagent-inheritance.js"
|
|
11416
|
+
);
|
|
11417
|
+
childMcpCatalog = createInheritedMcpToolCatalog(
|
|
11418
|
+
ctx,
|
|
11419
|
+
mcpAllow,
|
|
11420
|
+
requestedMcpTools,
|
|
11421
|
+
allowedTools,
|
|
11422
|
+
);
|
|
11423
|
+
inheritedMcp = readMcpToolCatalog(childMcpCatalog);
|
|
11424
|
+
} catch (error) {
|
|
11425
|
+
return {
|
|
11426
|
+
error: `spawn_sub_agent: live MCP inheritance failed closed (${error.message}).`,
|
|
11427
|
+
};
|
|
11428
|
+
}
|
|
11429
|
+
}
|
|
11430
|
+
|
|
11329
11431
|
// Build a structured parent handoff if the caller did not provide explicit
|
|
11330
11432
|
// An explicit `contextMode: fresh` contract suppresses this inheritance (the
|
|
11331
11433
|
// child starts clean); `fork` / unset keep deterministic auto-inheritance.
|
|
@@ -11589,6 +11691,7 @@ async function _executeSpawnSubAgent(args, ctx) {
|
|
|
11589
11691
|
const subCtx = SubAgentContext.create({
|
|
11590
11692
|
role,
|
|
11591
11693
|
task,
|
|
11694
|
+
signal: ctx.signal || null,
|
|
11592
11695
|
parentId: parentSessionId,
|
|
11593
11696
|
// Hook-envelope tracing: the child loop stamps its own runId as trace_id
|
|
11594
11697
|
// and THIS run's id as parent_id on every settings-hook payload it fires.
|
|
@@ -11659,6 +11762,7 @@ async function _executeSpawnSubAgent(args, ctx) {
|
|
|
11659
11762
|
...(inheritedMcp
|
|
11660
11763
|
? {
|
|
11661
11764
|
extraToolDefinitions: inheritedMcp.extraToolDefinitions,
|
|
11765
|
+
mcpToolCatalog: childMcpCatalog,
|
|
11662
11766
|
externalToolDescriptors: inheritedMcp.externalToolDescriptors,
|
|
11663
11767
|
externalToolExecutors: inheritedMcp.externalToolExecutors,
|
|
11664
11768
|
mcpClient: inheritedMcp.mcpClient,
|
|
@@ -11788,8 +11892,6 @@ async function _executeSpawnSubAgent(args, ctx) {
|
|
|
11788
11892
|
// detached without the caller passing it. `effectiveContract.background`
|
|
11789
11893
|
// already folds in `args.background`; the explicit OR keeps the path
|
|
11790
11894
|
// byte-identical if contract resolution was skipped (effectiveContract null).
|
|
11791
|
-
const wantsBackground =
|
|
11792
|
-
args.background === true || effectiveContract?.background === true;
|
|
11793
11895
|
if (wantsBackground && ctx.backgroundSubAgents instanceof Map) {
|
|
11794
11896
|
// Cancel with the parent: forward the loop's abort signal so killing the
|
|
11795
11897
|
// run doesn't orphan a detached child mid-LLM-call.
|
|
@@ -12650,6 +12752,10 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
12650
12752
|
message.tool_calls = providerMessage.tool_calls;
|
|
12651
12753
|
}
|
|
12652
12754
|
const out = { message };
|
|
12755
|
+
if (choice.finish_reason != null) {
|
|
12756
|
+
out.finishReason = choice.finish_reason;
|
|
12757
|
+
out.providerTerminationComplete = data.choices.length === 1;
|
|
12758
|
+
}
|
|
12653
12759
|
const providerReceipt = supportsOpenAIRequestIdentity
|
|
12654
12760
|
? _openAIProviderRequestReceipt(response, data, providerRequestId)
|
|
12655
12761
|
: null;
|
|
@@ -14702,6 +14808,30 @@ function permissionDecision(callId, tool, result) {
|
|
|
14702
14808
|
}
|
|
14703
14809
|
|
|
14704
14810
|
export async function* agentLoop(messages, options) {
|
|
14811
|
+
// Bind the actual task before compaction, runtime nudges or provider projection.
|
|
14812
|
+
// A new host-admitted user turn starts a new loop and receives its own binding.
|
|
14813
|
+
const currentUserTask = messages.findLast(
|
|
14814
|
+
(message) =>
|
|
14815
|
+
message?.role === "user" && !isRuntimeOnlySessionMessage(message),
|
|
14816
|
+
);
|
|
14817
|
+
const currentUserTaskSnapshot = currentUserTask
|
|
14818
|
+
? encodePersistedMessage(currentUserTask)
|
|
14819
|
+
: null;
|
|
14820
|
+
const currentUserTaskBinding = currentUserTaskSnapshot
|
|
14821
|
+
? {
|
|
14822
|
+
message: currentUserTaskSnapshot,
|
|
14823
|
+
original: currentUserTask,
|
|
14824
|
+
allowContentRelocation:
|
|
14825
|
+
messages.filter(
|
|
14826
|
+
(message) =>
|
|
14827
|
+
message?.role === "user" &&
|
|
14828
|
+
isDeepStrictEqual(
|
|
14829
|
+
encodePersistedMessage(message),
|
|
14830
|
+
currentUserTaskSnapshot,
|
|
14831
|
+
),
|
|
14832
|
+
).length === 1,
|
|
14833
|
+
}
|
|
14834
|
+
: null;
|
|
14705
14835
|
if (options.serviceTier != null) {
|
|
14706
14836
|
resolveModelServiceTier(
|
|
14707
14837
|
resolveModelCapabilityProfile(options),
|
|
@@ -14715,6 +14845,20 @@ export async function* agentLoop(messages, options) {
|
|
|
14715
14845
|
...options,
|
|
14716
14846
|
...executionPolicy,
|
|
14717
14847
|
};
|
|
14848
|
+
if (options.mcpToolCatalog != null) {
|
|
14849
|
+
captureMcpToolCatalog(options.mcpToolCatalog);
|
|
14850
|
+
// Host publication is the only live extension path. Do not let unrelated
|
|
14851
|
+
// caller-owned startup arrays acquire new authority during a refresh.
|
|
14852
|
+
options.extraToolDefinitions = Object.freeze([
|
|
14853
|
+
...(options.extraToolDefinitions || []),
|
|
14854
|
+
]);
|
|
14855
|
+
options.externalToolDescriptors = Object.freeze({
|
|
14856
|
+
...options.externalToolDescriptors,
|
|
14857
|
+
});
|
|
14858
|
+
options.externalToolExecutors = Object.freeze({
|
|
14859
|
+
...options.externalToolExecutors,
|
|
14860
|
+
});
|
|
14861
|
+
}
|
|
14718
14862
|
const configuredChatFn = options.chatFn;
|
|
14719
14863
|
const evolutionIngress =
|
|
14720
14864
|
options.evolutionIngress == null
|
|
@@ -14857,19 +15001,36 @@ export async function* agentLoop(messages, options) {
|
|
|
14857
15001
|
);
|
|
14858
15002
|
}
|
|
14859
15003
|
|
|
14860
|
-
const
|
|
15004
|
+
const mcpToolCatalog = hermeticExecution
|
|
15005
|
+
? null
|
|
15006
|
+
: captureMcpToolCatalog(options.mcpToolCatalog);
|
|
15007
|
+
const loopMcpCatalog = mcpToolCatalog
|
|
15008
|
+
? projectMcpToolCatalog(mcpToolCatalog, (snapshot) =>
|
|
15009
|
+
restrictMcpToolCatalog(
|
|
15010
|
+
snapshot,
|
|
15011
|
+
getEffectiveToolDefinitions(
|
|
15012
|
+
mergeMcpToolCatalog(options, snapshot, mcpToolCatalog),
|
|
15013
|
+
).map((tool) => tool.function.name),
|
|
15014
|
+
),
|
|
15015
|
+
)
|
|
15016
|
+
: null;
|
|
15017
|
+
let currentMcpSnapshot = readMcpToolCatalog(loopMcpCatalog);
|
|
15018
|
+
let effectiveToolOptions = hermeticExecution
|
|
14861
15019
|
? {
|
|
14862
15020
|
...options,
|
|
14863
15021
|
hostManagedToolPolicy: null,
|
|
14864
15022
|
hostManagedToolPolicyAuthority: null,
|
|
14865
15023
|
extraToolDefinitions: [],
|
|
14866
15024
|
}
|
|
14867
|
-
:
|
|
14868
|
-
|
|
15025
|
+
: currentMcpSnapshot
|
|
15026
|
+
? mergeMcpToolCatalog(options, currentMcpSnapshot, mcpToolCatalog)
|
|
15027
|
+
: options;
|
|
15028
|
+
let effectiveAllowedToolNames = Object.freeze(
|
|
14869
15029
|
getEffectiveToolDefinitions(effectiveToolOptions).map(
|
|
14870
15030
|
(tool) => tool.function.name,
|
|
14871
15031
|
),
|
|
14872
15032
|
);
|
|
15033
|
+
const startupToolNames = new Set(effectiveAllowedToolNames);
|
|
14873
15034
|
if (
|
|
14874
15035
|
fileMutationScope &&
|
|
14875
15036
|
effectiveAllowedToolNames.some(
|
|
@@ -14951,6 +15112,10 @@ export async function* agentLoop(messages, options) {
|
|
|
14951
15112
|
? null
|
|
14952
15113
|
: options.extraToolDefinitions || null,
|
|
14953
15114
|
mcpClient: hermeticExecution ? null : options.mcpClient || null,
|
|
15115
|
+
mcpToolCatalog: loopMcpCatalog,
|
|
15116
|
+
mcpCatalogBinding: loopMcpCatalog
|
|
15117
|
+
? { authority: loopMcpCatalog, snapshot: currentMcpSnapshot }
|
|
15118
|
+
: null,
|
|
14954
15119
|
mcpHostClient: hermeticExecution
|
|
14955
15120
|
? null
|
|
14956
15121
|
: options.mcpHostClient || options.mcpClient || null,
|
|
@@ -15251,6 +15416,8 @@ export async function* agentLoop(messages, options) {
|
|
|
15251
15416
|
// one-shot guard means a model that keeps returning empty turns completes
|
|
15252
15417
|
// rather than looping forever (the iteration budget is the hard backstop).
|
|
15253
15418
|
let emptyThinkingReprompted = false;
|
|
15419
|
+
let outputLimitRecoveryUsed = false;
|
|
15420
|
+
let outputLimitRecoveryPending = null;
|
|
15254
15421
|
let readFileLoopGuard = new ReadFileLoopGuard();
|
|
15255
15422
|
let remoteReadLoopGuard = new RemoteReadLoopGuard();
|
|
15256
15423
|
const prActionTask = isPrActionRequest(messages);
|
|
@@ -15267,6 +15434,39 @@ export async function* agentLoop(messages, options) {
|
|
|
15267
15434
|
let lastTaskProgressIntervention = null;
|
|
15268
15435
|
|
|
15269
15436
|
while (budget.hasRemaining()) {
|
|
15437
|
+
if (loopMcpCatalog) {
|
|
15438
|
+
currentMcpSnapshot = readMcpToolCatalog(loopMcpCatalog);
|
|
15439
|
+
effectiveToolOptions = mergeMcpToolCatalog(
|
|
15440
|
+
options,
|
|
15441
|
+
currentMcpSnapshot,
|
|
15442
|
+
mcpToolCatalog,
|
|
15443
|
+
);
|
|
15444
|
+
effectiveAllowedToolNames = Object.freeze(
|
|
15445
|
+
getEffectiveToolDefinitions(effectiveToolOptions)
|
|
15446
|
+
.map((tool) => tool.function.name)
|
|
15447
|
+
.filter(
|
|
15448
|
+
(name) =>
|
|
15449
|
+
startupToolNames.has(name) ||
|
|
15450
|
+
currentMcpSnapshot.identities.has(name),
|
|
15451
|
+
),
|
|
15452
|
+
);
|
|
15453
|
+
effectiveToolOptions = {
|
|
15454
|
+
...effectiveToolOptions,
|
|
15455
|
+
enabledToolNames: effectiveAllowedToolNames,
|
|
15456
|
+
exactToolNames: true,
|
|
15457
|
+
};
|
|
15458
|
+
Object.assign(toolContext, {
|
|
15459
|
+
extraToolDefinitions: effectiveToolOptions.extraToolDefinitions,
|
|
15460
|
+
externalToolDescriptors: effectiveToolOptions.externalToolDescriptors,
|
|
15461
|
+
externalToolExecutors: effectiveToolOptions.externalToolExecutors,
|
|
15462
|
+
mcpClient: effectiveToolOptions.mcpClient,
|
|
15463
|
+
effectiveAllowedToolNames,
|
|
15464
|
+
mcpCatalogBinding: {
|
|
15465
|
+
authority: loopMcpCatalog,
|
|
15466
|
+
snapshot: currentMcpSnapshot,
|
|
15467
|
+
},
|
|
15468
|
+
});
|
|
15469
|
+
}
|
|
15270
15470
|
// Yield only between complete tool batches. Keep all completed tool results
|
|
15271
15471
|
// and settle child usage before the host accepts queued user steering.
|
|
15272
15472
|
if (options.shouldYieldToUser?.() === true) {
|
|
@@ -15433,6 +15633,7 @@ export async function* agentLoop(messages, options) {
|
|
|
15433
15633
|
// its full tool_call→tool_result cycle before we loop, so `messages` has no
|
|
15434
15634
|
// dangling call; `preserveToolPairs` then guarantees compaction never
|
|
15435
15635
|
// orphans a tool result. Best-effort — a failure never aborts the run.
|
|
15636
|
+
let compactionHostContextRefreshed = false;
|
|
15436
15637
|
if (
|
|
15437
15638
|
!independentReviewContext?.active &&
|
|
15438
15639
|
options.autoCompact !== false &&
|
|
@@ -15453,7 +15654,7 @@ export async function* agentLoop(messages, options) {
|
|
|
15453
15654
|
// micro-compact may change the working input, but the durable CAS must
|
|
15454
15655
|
// still compare against the transcript state that existed before any
|
|
15455
15656
|
// in-memory compaction happened.
|
|
15456
|
-
|
|
15657
|
+
let authorityExpectedMessages = [...messages];
|
|
15457
15658
|
let workingMessages = messages;
|
|
15458
15659
|
let microStats = null;
|
|
15459
15660
|
// Cheap surgical pre-pass (Claude-Code microcompact parity): build a
|
|
@@ -15516,6 +15717,22 @@ export async function* agentLoop(messages, options) {
|
|
|
15516
15717
|
reason: preCompactReason,
|
|
15517
15718
|
};
|
|
15518
15719
|
}
|
|
15720
|
+
if (!hermeticExecution && options.refreshCompactionContext != null) {
|
|
15721
|
+
// Hooks may update project files. Preserve the original transcript
|
|
15722
|
+
// comparison before replacing only the host-owned live system base.
|
|
15723
|
+
if (!_sameMessageSnapshot(messages, authorityExpectedMessages)) {
|
|
15724
|
+
throw _compactionSettlementError(
|
|
15725
|
+
COMPACTION_CONTEXT_REFRESH_ERROR,
|
|
15726
|
+
"Session messages changed before project context refresh",
|
|
15727
|
+
);
|
|
15728
|
+
}
|
|
15729
|
+
workingMessages = refreshCompactionHostContext(
|
|
15730
|
+
options.refreshCompactionContext,
|
|
15731
|
+
workingMessages,
|
|
15732
|
+
);
|
|
15733
|
+
authorityExpectedMessages = [...messages];
|
|
15734
|
+
compactionHostContextRefreshed = true;
|
|
15735
|
+
}
|
|
15519
15736
|
// Auto-pin (OPT-IN): when enabled, the original task (first user turn)
|
|
15520
15737
|
// is pinned so compaction can't drop it. Off by default → no predicate
|
|
15521
15738
|
// is passed and compaction is byte-identical to before.
|
|
@@ -15815,6 +16032,7 @@ export async function* agentLoop(messages, options) {
|
|
|
15815
16032
|
}
|
|
15816
16033
|
}
|
|
15817
16034
|
} catch (_e) {
|
|
16035
|
+
if (_e?.code === COMPACTION_CONTEXT_REFRESH_ERROR) throw _e;
|
|
15818
16036
|
if (isAbortError(_e) || signal?.aborted) throw _e;
|
|
15819
16037
|
if (isFormalBudgetError(_e)) throw _e;
|
|
15820
16038
|
if (_e?.runtimeLedgerPersistence === true) throw _e;
|
|
@@ -15948,6 +16166,12 @@ export async function* agentLoop(messages, options) {
|
|
|
15948
16166
|
}
|
|
15949
16167
|
}
|
|
15950
16168
|
|
|
16169
|
+
if (compactionHostContextRefreshed) {
|
|
16170
|
+
// A source file can change while the summary provider is running, or
|
|
16171
|
+
// while a failed summary is falling back to the original transcript.
|
|
16172
|
+
refreshCompactionHostContext(options.refreshCompactionContext, messages);
|
|
16173
|
+
}
|
|
16174
|
+
|
|
15951
16175
|
// Deliver background sub-agent results that settled since the last turn:
|
|
15952
16176
|
// inject them as user-role context so THIS LLM call sees them. (There is
|
|
15953
16177
|
// no open tool_call to attach a late result to — the spawn call already
|
|
@@ -16126,27 +16350,43 @@ export async function* agentLoop(messages, options) {
|
|
|
16126
16350
|
index === resultIndex ? { ...result, content } : message,
|
|
16127
16351
|
);
|
|
16128
16352
|
} else {
|
|
16129
|
-
// Full compaction can leave only the pinned request.
|
|
16130
|
-
//
|
|
16131
|
-
const
|
|
16353
|
+
// Full compaction can leave only the pinned request. Move that same
|
|
16354
|
+
// message after the source data, preserving its metadata and identity.
|
|
16355
|
+
const requestIndex = requestMessages.findLastIndex(
|
|
16132
16356
|
(message) => message.role === "user",
|
|
16133
16357
|
);
|
|
16358
|
+
const request = requestMessages[requestIndex];
|
|
16134
16359
|
callMessages = [
|
|
16135
|
-
...requestMessages,
|
|
16360
|
+
...requestMessages.filter((_, index) => index !== requestIndex),
|
|
16136
16361
|
...readContext.map((content) => ({ role: "assistant", content })),
|
|
16137
|
-
|
|
16138
|
-
role: "user",
|
|
16139
|
-
content: request?.content || "Continue the original user task.",
|
|
16140
|
-
},
|
|
16362
|
+
...(request ? [request] : []),
|
|
16141
16363
|
];
|
|
16142
16364
|
}
|
|
16143
16365
|
}
|
|
16144
16366
|
// Role normalization is request-only: durable history remains unchanged
|
|
16145
16367
|
// for tool settlement and canonical compaction authority comparisons.
|
|
16368
|
+
let projectedUserTaskBinding = currentUserTaskBinding;
|
|
16146
16369
|
if (typeof options.projectProviderMessages === "function") {
|
|
16147
|
-
|
|
16370
|
+
const projected = projectMessagesWithTaskBinding(
|
|
16371
|
+
options.projectProviderMessages,
|
|
16372
|
+
callMessages,
|
|
16373
|
+
currentUserTaskBinding,
|
|
16374
|
+
);
|
|
16375
|
+
callMessages = projected.messages;
|
|
16376
|
+
projectedUserTaskBinding = projected.taskBinding;
|
|
16148
16377
|
}
|
|
16149
16378
|
const contextMemoryTrustedSystemIndexes = [];
|
|
16379
|
+
if (outputLimitRecoveryPending !== null) {
|
|
16380
|
+
// A synthetic user turn would replace the protected real task under
|
|
16381
|
+
// canonical context pressure. Keep this one-request hint out of history
|
|
16382
|
+
// and explicitly admit it as trusted system policy in the next plan.
|
|
16383
|
+
callMessages = [
|
|
16384
|
+
...callMessages,
|
|
16385
|
+
{ role: "system", content: outputLimitRecoveryPending },
|
|
16386
|
+
];
|
|
16387
|
+
contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
|
|
16388
|
+
outputLimitRecoveryPending = null;
|
|
16389
|
+
}
|
|
16150
16390
|
if (Number.isFinite(budget.limit)) {
|
|
16151
16391
|
// consume() already charged this dispatch. The current request may still
|
|
16152
16392
|
// act even when no further provider request remains. Rebuild this hint
|
|
@@ -16306,6 +16546,11 @@ export async function* agentLoop(messages, options) {
|
|
|
16306
16546
|
contextMemoryToolDefinitions:
|
|
16307
16547
|
getProviderToolDefinitions(iterationToolOptions),
|
|
16308
16548
|
contextMemoryTrustedSystemIndexes,
|
|
16549
|
+
// Independent review uses its existing merged requirement journal and
|
|
16550
|
+
// validates every original requirement after planning below.
|
|
16551
|
+
contextMemoryRequiredUserBinding: independentReviewContext?.active
|
|
16552
|
+
? null
|
|
16553
|
+
: projectedUserTaskBinding,
|
|
16309
16554
|
},
|
|
16310
16555
|
);
|
|
16311
16556
|
if (canonicalProviderContext.plan) {
|
|
@@ -16571,6 +16816,78 @@ export async function* agentLoop(messages, options) {
|
|
|
16571
16816
|
throw error;
|
|
16572
16817
|
}
|
|
16573
16818
|
|
|
16819
|
+
if (result?.finishReason === "content_filter") {
|
|
16820
|
+
// Usage has settled above. A provider-filtered round is never a complete
|
|
16821
|
+
// answer or an executable tool batch, and must not trigger a fresh call.
|
|
16822
|
+
await _awaitBackgroundUsageSettlement(
|
|
16823
|
+
backgroundSubAgents,
|
|
16824
|
+
backgroundUsageFailureState,
|
|
16825
|
+
);
|
|
16826
|
+
const error = new Error(
|
|
16827
|
+
"The provider filtered this response. No tools from that response were executed; the task remains incomplete.",
|
|
16828
|
+
);
|
|
16829
|
+
error.code = "CC_MODEL_CONTENT_FILTER";
|
|
16830
|
+
throw error;
|
|
16831
|
+
}
|
|
16832
|
+
|
|
16833
|
+
if (
|
|
16834
|
+
result?.providerTerminationComplete === false &&
|
|
16835
|
+
result.finishReason != null &&
|
|
16836
|
+
result.finishReason !== "length"
|
|
16837
|
+
) {
|
|
16838
|
+
// Explicit ambiguity is not an executable or final provider round.
|
|
16839
|
+
// Keep absent-reason compatibility and the separate length policy.
|
|
16840
|
+
await _awaitBackgroundUsageSettlement(
|
|
16841
|
+
backgroundSubAgents,
|
|
16842
|
+
backgroundUsageFailureState,
|
|
16843
|
+
);
|
|
16844
|
+
const error = new Error(
|
|
16845
|
+
"The provider response has an incomplete or ambiguous termination. No tools from that response were executed; the task remains incomplete.",
|
|
16846
|
+
);
|
|
16847
|
+
error.code = "CC_MODEL_TERMINATION_INCOMPLETE";
|
|
16848
|
+
throw error;
|
|
16849
|
+
}
|
|
16850
|
+
|
|
16851
|
+
if (result?.finishReason === "length") {
|
|
16852
|
+
// Settle the completed physical request above before any decision. Never
|
|
16853
|
+
// execute even syntactically valid calls from an incomplete generation,
|
|
16854
|
+
// and never insert its partial assistant/tool group into canonical history.
|
|
16855
|
+
const canRecover =
|
|
16856
|
+
result.providerTerminationComplete === true &&
|
|
16857
|
+
!msg?._truncated &&
|
|
16858
|
+
_hasCompleteProviderUsage(result.usage) &&
|
|
16859
|
+
!outputLimitRecoveryUsed &&
|
|
16860
|
+
budget.hasRemaining() &&
|
|
16861
|
+
!prInvestigationExhausted &&
|
|
16862
|
+
!inspectionSynthesisRequired;
|
|
16863
|
+
if (!canRecover) {
|
|
16864
|
+
await _awaitBackgroundUsageSettlement(
|
|
16865
|
+
backgroundSubAgents,
|
|
16866
|
+
backgroundUsageFailureState,
|
|
16867
|
+
);
|
|
16868
|
+
const error = new Error(
|
|
16869
|
+
"Model output reached its token limit. No tools from that response were executed; the task remains incomplete.",
|
|
16870
|
+
);
|
|
16871
|
+
error.code = "CC_MODEL_OUTPUT_LIMIT";
|
|
16872
|
+
throw error;
|
|
16873
|
+
}
|
|
16874
|
+
outputLimitRecoveryUsed = true;
|
|
16875
|
+
outputLimitRecoveryPending =
|
|
16876
|
+
"The previous model response reached its output token limit and was discarded. " +
|
|
16877
|
+
"None of its tool calls were executed. Continue from the last confirmed tool results. " +
|
|
16878
|
+
"Produce one small, complete operation per response. For large files, write a minimal " +
|
|
16879
|
+
"complete scaffold first, then use separate small edit_file calls to add sections. " +
|
|
16880
|
+
"Do not resend the entire large file or continue an unfinished JSON fragment. " +
|
|
16881
|
+
"If no tools are needed, give a shorter complete answer.";
|
|
16882
|
+
yield {
|
|
16883
|
+
type: "iteration-warning",
|
|
16884
|
+
message:
|
|
16885
|
+
"Model output was truncated; requesting one smaller complete step within the remaining budget.",
|
|
16886
|
+
};
|
|
16887
|
+
// This is a fresh budgeted iteration with new input, never a transport retry.
|
|
16888
|
+
continue;
|
|
16889
|
+
}
|
|
16890
|
+
|
|
16574
16891
|
if (!msg) {
|
|
16575
16892
|
await _awaitBackgroundUsageSettlement(
|
|
16576
16893
|
backgroundSubAgents,
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { getDurableSystemMessageProvenance } from "../lib/session-message-provenance.js";
|
|
2
|
+
import { markCompactionHostBase } from "../lib/compaction-host-provenance.js";
|
|
3
|
+
|
|
4
|
+
export const COMPACTION_CONTEXT_REFRESH_ERROR =
|
|
5
|
+
"CC_COMPACTION_CONTEXT_REFRESH_FAILED";
|
|
6
|
+
|
|
7
|
+
/** Refresh only the base system message owned by this live host. */
|
|
8
|
+
export function createCompactionHostContextRefresher({
|
|
9
|
+
messages,
|
|
10
|
+
render,
|
|
11
|
+
onUpdated,
|
|
12
|
+
}) {
|
|
13
|
+
return (candidate = messages) => {
|
|
14
|
+
const current = messages[0];
|
|
15
|
+
if (
|
|
16
|
+
!current ||
|
|
17
|
+
current.role !== "system" ||
|
|
18
|
+
getDurableSystemMessageProvenance(current)
|
|
19
|
+
)
|
|
20
|
+
throw new Error("Live host base context is unavailable");
|
|
21
|
+
if (!Array.isArray(candidate) || !candidate.includes(current))
|
|
22
|
+
throw new Error(
|
|
23
|
+
"Compaction candidate does not contain the live host base context",
|
|
24
|
+
);
|
|
25
|
+
const content = render();
|
|
26
|
+
if (content && typeof content.then === "function") {
|
|
27
|
+
Promise.resolve(content).catch(() => {});
|
|
28
|
+
throw new TypeError("Host context rendering must be synchronous");
|
|
29
|
+
}
|
|
30
|
+
if (typeof content !== "string" || !content.trim())
|
|
31
|
+
throw new TypeError(
|
|
32
|
+
"Host context rendering must return a non-empty string",
|
|
33
|
+
);
|
|
34
|
+
if (messages[0] !== current)
|
|
35
|
+
throw new Error("Host base context changed during rendering");
|
|
36
|
+
if (content === current.content) {
|
|
37
|
+
markCompactionHostBase(current);
|
|
38
|
+
return candidate;
|
|
39
|
+
}
|
|
40
|
+
const replacement = markCompactionHostBase({ ...current, content });
|
|
41
|
+
const projected = candidate.map((message) =>
|
|
42
|
+
message === current ? replacement : message,
|
|
43
|
+
);
|
|
44
|
+
messages[0] = replacement;
|
|
45
|
+
onUpdated?.(replacement);
|
|
46
|
+
return candidate === messages ? messages : projected;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** A failed refresh must not fall through to a model with obsolete rules. */
|
|
51
|
+
export function refreshCompactionHostContext(refresh, messages) {
|
|
52
|
+
if (refresh == null) return messages;
|
|
53
|
+
try {
|
|
54
|
+
if (typeof refresh !== "function")
|
|
55
|
+
throw new TypeError("Invalid host context refresher");
|
|
56
|
+
const result = refresh(messages);
|
|
57
|
+
if (result && typeof result.then === "function") {
|
|
58
|
+
Promise.resolve(result).catch(() => {});
|
|
59
|
+
throw new TypeError("Host context refresh must be synchronous");
|
|
60
|
+
}
|
|
61
|
+
if (!Array.isArray(result))
|
|
62
|
+
throw new TypeError("Host context refresh must return messages");
|
|
63
|
+
return result;
|
|
64
|
+
} catch (cause) {
|
|
65
|
+
const error = new Error(
|
|
66
|
+
"Current project context could not be refreshed before continuing",
|
|
67
|
+
{ cause },
|
|
68
|
+
);
|
|
69
|
+
error.code = COMPACTION_CONTEXT_REFRESH_ERROR;
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|