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.
Files changed (469) hide show
  1. package/README.md +30 -4
  2. package/package.json +2 -2
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/.build-hash +1 -1
  6. package/src/assets/web-panel/assets/AIOps-CHItp4vg.js +1 -0
  7. package/src/assets/web-panel/assets/AIOps-Cchx1iXI.css +1 -0
  8. package/src/assets/web-panel/assets/{ActionButton-Dzv1ReHF.js → ActionButton-nhMNWW_d.js} +1 -1
  9. package/src/assets/web-panel/assets/Analytics-DRc81BBI.js +3 -0
  10. package/src/assets/web-panel/assets/Analytics-Dr-1kvaM.css +1 -0
  11. package/src/assets/web-panel/assets/AppLayout-BTBIIl1e.css +1 -0
  12. package/src/assets/web-panel/assets/AppLayout-CVt7HMkp.js +3 -0
  13. package/src/assets/web-panel/assets/Artifacts-BuJgG5jf.js +1 -0
  14. package/src/assets/web-panel/assets/Artifacts-Dohtjyfl.css +1 -0
  15. package/src/assets/web-panel/assets/Audit-DDnViLtj.css +1 -0
  16. package/src/assets/web-panel/assets/Audit-msNg0aH-.js +1 -0
  17. package/src/assets/web-panel/assets/BackgroundAgents-BpcV8yWC.js +1 -0
  18. package/src/assets/web-panel/assets/BackgroundAgents-CH3Uc9sF.css +1 -0
  19. package/src/assets/web-panel/assets/Backup-CYh10zO3.css +1 -0
  20. package/src/assets/web-panel/assets/Backup-P53DADwG.js +1 -0
  21. package/src/assets/web-panel/assets/BaseInput-DFxT2yWN.js +1 -0
  22. package/src/assets/web-panel/assets/Chat-B5JvvQJb.css +1 -0
  23. package/src/assets/web-panel/assets/Chat-BXoHisHW.js +7 -0
  24. package/src/assets/web-panel/assets/ChatBubbleRenderer-CO908iBt.css +1 -0
  25. package/src/assets/web-panel/assets/ChatBubbleRenderer-DMGtSdDx.js +1 -0
  26. package/src/assets/web-panel/assets/{Checkbox-B5uzaLLP.js → Checkbox-B4g_ckJq.js} +1 -1
  27. package/src/assets/web-panel/assets/Codegen-BLP7id2a.css +1 -0
  28. package/src/assets/web-panel/assets/Codegen-C6SSSOfp.js +1 -0
  29. package/src/assets/web-panel/assets/{Col-D3I2kUGu.js → Col-IO1NEUYL.js} +1 -1
  30. package/src/assets/web-panel/assets/Community-C2RejeOY.css +1 -0
  31. package/src/assets/web-panel/assets/Community-CdEBl93F.js +1 -0
  32. package/src/assets/web-panel/assets/{Compact-5GigOmb8.js → Compact-DYs0a9k7.js} +1 -1
  33. package/src/assets/web-panel/assets/Compliance-BPnk7948.js +1 -0
  34. package/src/assets/web-panel/assets/Compliance-DOys4Ov1.css +1 -0
  35. package/src/assets/web-panel/assets/Cowork-DsOst4XK.css +1 -0
  36. package/src/assets/web-panel/assets/Cowork-VLOTGbza.js +6 -0
  37. package/src/assets/web-panel/assets/Cron-_9GgQLJo.js +2 -0
  38. package/src/assets/web-panel/assets/Crosschain-B21yn0qy.js +1 -0
  39. package/src/assets/web-panel/assets/Crosschain-C7Le4Pte.css +1 -0
  40. package/src/assets/web-panel/assets/DID-BX6k3jZi.css +1 -0
  41. package/src/assets/web-panel/assets/DID-mBeDgRZ7.js +2 -0
  42. package/src/assets/web-panel/assets/Dashboard-BckYYzhP.js +3 -0
  43. package/src/assets/web-panel/assets/Dashboard-MFDcsVcM.css +1 -0
  44. package/src/assets/web-panel/assets/Dropdown-DEedqFiE.js +1 -0
  45. package/src/assets/web-panel/assets/EmailListRenderer-CMs0k9TB.js +1 -0
  46. package/src/assets/web-panel/assets/EmailListRenderer-CVJ1j3Ll.css +1 -0
  47. package/src/assets/web-panel/assets/EvolutionSettings-B00Qd0fN.js +1 -0
  48. package/src/assets/web-panel/assets/EvolutionSettings-BnQ91YHJ.css +1 -0
  49. package/src/assets/web-panel/assets/FamilyGuardDashboard-Df-D09Q4.css +1 -0
  50. package/src/assets/web-panel/assets/FamilyGuardDashboard-DxMTAMa8.js +1 -0
  51. package/src/assets/web-panel/assets/Federation-B-UZw0LO.js +1 -0
  52. package/src/assets/web-panel/assets/Federation-CgmfLbx1.css +1 -0
  53. package/src/assets/web-panel/assets/FormItemContext-CkafazEw.js +1 -0
  54. package/src/assets/web-panel/assets/GenericCardRenderer-DEUG25ZJ.js +1 -0
  55. package/src/assets/web-panel/assets/GenericCardRenderer-DtJFcJYl.css +1 -0
  56. package/src/assets/web-panel/assets/Git-D7dr9oz9.js +2 -0
  57. package/src/assets/web-panel/assets/{Git-BdHhxBWR.css → Git-DPuaGtg7.css} +1 -1
  58. package/src/assets/web-panel/assets/Governance-BoipmXaM.css +1 -0
  59. package/src/assets/web-panel/assets/Governance-DKlUJ1wg.js +1 -0
  60. package/src/assets/web-panel/assets/Inference-BJKqplap.js +1 -0
  61. package/src/assets/web-panel/assets/Inference-BWxYJF9-.css +1 -0
  62. package/src/assets/web-panel/assets/KnowledgeGraph-B78fB-bz.js +1 -0
  63. package/src/assets/web-panel/assets/KnowledgeGraph-CztPDA96.css +1 -0
  64. package/src/assets/web-panel/assets/Logs-DJGcHYH_.js +2 -0
  65. package/src/assets/web-panel/assets/Logs-Gf_Mv9Nx.css +1 -0
  66. package/src/assets/web-panel/assets/MarkdownRenderer-BAxj61I3.css +1 -0
  67. package/src/assets/web-panel/assets/MarkdownRenderer-DkcG_MxW.js +1 -0
  68. package/src/assets/web-panel/assets/Marketplace-Djp5q9dS.css +1 -0
  69. package/src/assets/web-panel/assets/Marketplace-ucTbwByD.js +1 -0
  70. package/src/assets/web-panel/assets/McpTools-Cu1xZYYk.js +2 -0
  71. package/src/assets/web-panel/assets/McpTools-DSGHWYS_.css +1 -0
  72. package/src/assets/web-panel/assets/Memory-Bcc2hxOA.css +1 -0
  73. package/src/assets/web-panel/assets/Memory-DCGpXmi-.js +2 -0
  74. package/src/assets/web-panel/assets/MobileBridge-BQ-Uwwg7.css +1 -0
  75. package/src/assets/web-panel/assets/MobileBridge-BnKr0aAS.js +1 -0
  76. package/src/assets/web-panel/assets/MobileProjects-C5UvYJTP.js +1 -0
  77. package/src/assets/web-panel/assets/MobileProjects-Ceaxrqzc.css +1 -0
  78. package/src/assets/web-panel/assets/Mtc-D1UUl4WH.js +6 -0
  79. package/src/assets/web-panel/assets/Mtc-DHwbdUqA.css +1 -0
  80. package/src/assets/web-panel/assets/MtcAudit-B0x8gahq.css +1 -0
  81. package/src/assets/web-panel/assets/MtcAudit-D3aa8XP4.js +19 -0
  82. package/src/assets/web-panel/assets/Multisig-DiXdfJjO.js +7 -0
  83. package/src/assets/web-panel/assets/Multisig-kwPDnXnl.css +1 -0
  84. package/src/assets/web-panel/assets/NLProgramming-CLOvy-35.css +1 -0
  85. package/src/assets/web-panel/assets/NLProgramming-DbWABgSE.js +1 -0
  86. package/src/assets/web-panel/assets/Notes-BP1DPl-R.js +7 -0
  87. package/src/assets/web-panel/assets/Notes-COE2q2gD.css +1 -0
  88. package/src/assets/web-panel/assets/NotificationSettings-Co0e0uEO.css +1 -0
  89. package/src/assets/web-panel/assets/NotificationSettings-xaB6ONe7.js +1 -0
  90. package/src/assets/web-panel/assets/OrderTableRenderer-BnOISpKI.css +1 -0
  91. package/src/assets/web-panel/assets/OrderTableRenderer-D1uNcz3b.js +1 -0
  92. package/src/assets/web-panel/assets/Organization-BM3Lh8Q8.css +1 -0
  93. package/src/assets/web-panel/assets/Organization-DMLDGaf1.js +4 -0
  94. package/src/assets/web-panel/assets/{Overflow-ky9UfGv4.js → Overflow-DH4QPEoI.js} +1 -1
  95. package/src/assets/web-panel/assets/{OverrideContext-C0w0P4A3.js → OverrideContext-DLR1AtLy.js} +1 -1
  96. package/src/assets/web-panel/assets/P2P-Bl4OS10o.js +2 -0
  97. package/src/assets/web-panel/assets/P2P-Cx88UaiD.css +1 -0
  98. package/src/assets/web-panel/assets/PdhVaultBrowser-B9ZGFpn4.css +1 -0
  99. package/src/assets/web-panel/assets/PdhVaultBrowser-D9XSE2YI.js +7 -0
  100. package/src/assets/web-panel/assets/Permissions-CUaPlr6d.js +4 -0
  101. package/src/assets/web-panel/assets/Permissions-Diejgkbs.css +1 -0
  102. package/src/assets/web-panel/assets/PersonalDataHub-Ba92dZk-.js +3 -0
  103. package/src/assets/web-panel/assets/PersonalDataHub-C_xhspRy.css +1 -0
  104. package/src/assets/web-panel/assets/Pipeline-Bh2okm-8.js +1 -0
  105. package/src/assets/web-panel/assets/Pipeline-DxkXqrH2.css +1 -0
  106. package/src/assets/web-panel/assets/Privacy-Bmq3p4gC.js +1 -0
  107. package/src/assets/web-panel/assets/Privacy-CrsfSFKd.css +1 -0
  108. package/src/assets/web-panel/assets/ProjectInit-BPu2fdKR.js +2 -0
  109. package/src/assets/web-panel/assets/ProjectInit-CteEo-wF.css +1 -0
  110. package/src/assets/web-panel/assets/ProjectSettings-D6ABLpmt.js +2 -0
  111. package/src/assets/web-panel/assets/ProjectSettings-pLSae-wy.css +1 -0
  112. package/src/assets/web-panel/assets/Projects-BX-SG9R4.css +1 -0
  113. package/src/assets/web-panel/assets/Projects-qWHEve0z.js +1 -0
  114. package/src/assets/web-panel/assets/Providers-CpAXh_6c.css +1 -0
  115. package/src/assets/web-panel/assets/Providers-D9DI-2hc.js +1 -0
  116. package/src/assets/web-panel/assets/{QrScannerModal-er_HkLCI.js → QrScannerModal-CxifoeD5.js} +1 -1
  117. package/src/assets/web-panel/assets/QrScannerModal-DFrn7rxS.css +1 -0
  118. package/src/assets/web-panel/assets/QuickAsk-DC1BvwR7.js +1 -0
  119. package/src/assets/web-panel/assets/Recommend-CH6wKzGo.css +1 -0
  120. package/src/assets/web-panel/assets/Recommend-CKqbMB5o.js +1 -0
  121. package/src/assets/web-panel/assets/RemoteSession-BGGzPdS5.js +5 -0
  122. package/src/assets/web-panel/assets/Reputation-D6VPNEd0.css +1 -0
  123. package/src/assets/web-panel/assets/Reputation-DH90O9-5.js +1 -0
  124. package/src/assets/web-panel/assets/Row-h7ovueJc.js +1 -0
  125. package/src/assets/web-panel/assets/RssFeed-Cze7YLaG.css +1 -0
  126. package/src/assets/web-panel/assets/RssFeed-DaHxXTZg.js +3 -0
  127. package/src/assets/web-panel/assets/Search-B6RalzTB.css +1 -0
  128. package/src/assets/web-panel/assets/Search-Bn6Nqpn4.js +1 -0
  129. package/src/assets/web-panel/assets/Security-13K57V_v.css +1 -0
  130. package/src/assets/web-panel/assets/Security-ClbBmPJi.js +4 -0
  131. package/src/assets/web-panel/assets/Services-C8Qs6KXv.css +1 -0
  132. package/src/assets/web-panel/assets/Services-ChHLQwRn.js +2 -0
  133. package/src/assets/web-panel/assets/{Skeleton-CrFs6rUL.js → Skeleton-DfN6BFzt.js} +1 -1
  134. package/src/assets/web-panel/assets/Skills-BdjRyorN.css +1 -0
  135. package/src/assets/web-panel/assets/Skills-C926wDev.js +1 -0
  136. package/src/assets/web-panel/assets/Sla-DJzi1l1M.js +1 -0
  137. package/src/assets/web-panel/assets/Sla-K19oOyQc.css +1 -0
  138. package/src/assets/web-panel/assets/SpeechSettings-DYPJTDKz.css +1 -0
  139. package/src/assets/web-panel/assets/SpeechSettings-_GSyVjm_.js +1 -0
  140. package/src/assets/web-panel/assets/SyncSettings-B67xnERe.js +1 -0
  141. package/src/assets/web-panel/assets/SyncSettings-C6cDrwDR.css +1 -0
  142. package/src/assets/web-panel/assets/Tasks-BJjN_YEm.css +1 -0
  143. package/src/assets/web-panel/assets/Tasks-BaYZadcG.js +1 -0
  144. package/src/assets/web-panel/assets/Templates-BsMmCdZI.css +1 -0
  145. package/src/assets/web-panel/assets/Templates-Bu8kN1Xt.js +1 -0
  146. package/src/assets/web-panel/assets/Tenant-BM9qufw1.js +1 -0
  147. package/src/assets/web-panel/assets/Tenant-D3zkSAV0.css +1 -0
  148. package/src/assets/web-panel/assets/Terminal-MEdd5DjB.js +3 -0
  149. package/src/assets/web-panel/assets/Terminal-qPp9MaPu.css +1 -0
  150. package/src/assets/web-panel/assets/TimelineRenderer-C27kL2oU.js +1 -0
  151. package/src/assets/web-panel/assets/TimelineRenderer-DmztdsbF.css +1 -0
  152. package/src/assets/web-panel/assets/Tokens-BBOdNRHQ.css +1 -0
  153. package/src/assets/web-panel/assets/Tokens-Cvjd98VC.js +1 -0
  154. package/src/assets/web-panel/assets/{Trigger-CXrW4Nry.js → Trigger-CLym84HI.js} +1 -1
  155. package/src/assets/web-panel/assets/Trust-Bv2JTaNN.js +1 -0
  156. package/src/assets/web-panel/assets/Trust-DeOo0xAh.css +1 -0
  157. package/src/assets/web-panel/assets/UkeySign-CSCkNbtm.js +1 -0
  158. package/src/assets/web-panel/assets/VideoEditing-BFDXB4xh.js +1 -0
  159. package/src/assets/web-panel/assets/VideoEditing-DksiizfS.css +1 -0
  160. package/src/assets/web-panel/assets/Wallet-CMEFrG_b.js +4 -0
  161. package/src/assets/web-panel/assets/Wallet-Dw8uV4Ug.css +1 -0
  162. package/src/assets/web-panel/assets/WebAuthn-DKx6xPPl.css +1 -0
  163. package/src/assets/web-panel/assets/WebAuthn-x4eO_Q4y.js +5 -0
  164. package/src/assets/web-panel/assets/WorkflowEditor-ClWEPgV1.js +1 -0
  165. package/src/assets/web-panel/assets/WorkflowEditor-IiwsD8Kh.css +1 -0
  166. package/src/assets/web-panel/assets/{_getTag-DnrRH4E6.js → _getTag-BVc6NQ_K.js} +1 -1
  167. package/src/assets/web-panel/assets/{chat-BpJsXlTK.js → chat-BdYOI4gM.js} +1 -1
  168. package/src/assets/web-panel/assets/{collapseMotion-CqM1QOwM.js → collapseMotion-B4IZiILV.js} +1 -1
  169. package/src/assets/web-panel/assets/{colors-CUNg0-fh.js → colors-DcTBrGvS.js} +1 -1
  170. package/src/assets/web-panel/assets/{compact-item-C3tFHnhu.js → compact-item-Dn2ktVuj.js} +1 -1
  171. package/src/assets/web-panel/assets/createContext-XTreuyqp.js +1 -0
  172. package/src/assets/web-panel/assets/{debounce-CFGTTtN3.js → debounce-D9xTw4Sx.js} +1 -1
  173. package/src/assets/web-panel/assets/devWarning-CNIS3FrJ.js +1 -0
  174. package/src/assets/web-panel/assets/echarts-CDp6K7pj.js +19 -0
  175. package/src/assets/web-panel/assets/{hasIn-CU6RIciB.js → hasIn-CFRNsYQd.js} +1 -1
  176. package/src/assets/web-panel/assets/{icons-DG5UD-6K.js → icons-DlxlFL4g.js} +4 -4
  177. package/src/assets/web-panel/assets/index-3RqDry-K.js +71 -0
  178. package/src/assets/web-panel/assets/{index-BPWJw4Ji.js → index-8METW_Wr.js} +1 -1
  179. package/src/assets/web-panel/assets/index-BBd64wj8.js +31 -0
  180. package/src/assets/web-panel/assets/index-BEyVNbNE.js +3 -0
  181. package/src/assets/web-panel/assets/index-BMLpP8QQ.js +1 -0
  182. package/src/assets/web-panel/assets/{index-BzhobTgZ.js → index-BSqydcDa.js} +1 -1
  183. package/src/assets/web-panel/assets/index-BV6LojRv.js +21 -0
  184. package/src/assets/web-panel/assets/index-BbMWvjLZ.js +1 -0
  185. package/src/assets/web-panel/assets/{index-KgR1f2Gq.js → index-Brc0BF-k.js} +2 -2
  186. package/src/assets/web-panel/assets/{index-D4njcYFw.js → index-CG9YLDmI.js} +1 -1
  187. package/src/assets/web-panel/assets/{index-6EwPIfXu.js → index-CNHWMMDX.js} +1 -1
  188. package/src/assets/web-panel/assets/{index-CEIoRm_c.js → index-COuEJdmr.js} +3 -3
  189. package/src/assets/web-panel/assets/{index-BG4zuFf0.js → index-CRW3AWdS.js} +1 -1
  190. package/src/assets/web-panel/assets/{index-BOlAutGy.js → index-CUT4h5JB.js} +2 -2
  191. package/src/assets/web-panel/assets/index-CXMa7Z-S.js +1 -0
  192. package/src/assets/web-panel/assets/index-CbaPXyNc.js +19 -0
  193. package/src/assets/web-panel/assets/{index-Cq93VfoF.css → index-CfX1DEtk.css} +1 -1
  194. package/src/assets/web-panel/assets/{index-X6e0cGRU.js → index-CjHA_Q7s.js} +1 -1
  195. package/src/assets/web-panel/assets/index-CsnYp4qF.js +1 -0
  196. package/src/assets/web-panel/assets/index-D45vulkq.js +12 -0
  197. package/src/assets/web-panel/assets/index-D9kPBEqD.js +55 -0
  198. package/src/assets/web-panel/assets/index-DDTSgpXz.js +1 -0
  199. package/src/assets/web-panel/assets/index-DFl_a0n5.js +1 -0
  200. package/src/assets/web-panel/assets/index-DNdiAymC.js +1 -0
  201. package/src/assets/web-panel/assets/{index-BJjEAoDb.js → index-DQEu7uW0.js} +1 -1
  202. package/src/assets/web-panel/assets/index-DW9XncMy.js +21 -0
  203. package/src/assets/web-panel/assets/index-Daa1yCt_.js +1 -0
  204. package/src/assets/web-panel/assets/index-DdVpoNEQ.js +12 -0
  205. package/src/assets/web-panel/assets/index-Dhi4Oybt.js +1 -0
  206. package/src/assets/web-panel/assets/index-DoVoNjtJ.js +1 -0
  207. package/src/assets/web-panel/assets/{index-111hR8WZ.js → index-Vo7A4aiN.js} +4 -4
  208. package/src/assets/web-panel/assets/{index-lo9rgpyj.js → index-XdlYkgCa.js} +1 -1
  209. package/src/assets/web-panel/assets/{index-1L0tt7G2.js → index-ir2ZwWz5.js} +2 -2
  210. package/src/assets/web-panel/assets/index-kzyCd8a0.js +3 -0
  211. package/src/assets/web-panel/assets/{index-CyyhilXV.js → index-lnTt0Jps.js} +2 -2
  212. package/src/assets/web-panel/assets/{index-CLQjdKmE.js → index-ma-rJkfE.js} +1 -1
  213. package/src/assets/web-panel/assets/index-oE4jTpHK.js +13 -0
  214. package/src/assets/web-panel/assets/{index-K2Uqqkr1.js → index-r5sNECM5.js} +1 -1
  215. package/src/assets/web-panel/assets/index-uT4fRDzU.js +1 -0
  216. package/src/assets/web-panel/assets/index-xlS8pDS2.js +1 -0
  217. package/src/assets/web-panel/assets/{initDefaultProps-FI8D7E2x.js → initDefaultProps-mdL0oeZa.js} +1 -1
  218. package/src/assets/web-panel/assets/{isPlainObject-BWRMT62c.js → isPlainObject-_gz-soRW.js} +1 -1
  219. package/src/assets/web-panel/assets/isSymbol-DAy2hlR5.js +1 -0
  220. package/src/assets/web-panel/assets/motion-ZgVCKcEX.js +11 -0
  221. package/src/assets/web-panel/assets/{move-Vl1vUReW.js → move-A_28O5T2.js} +1 -1
  222. package/src/assets/web-panel/assets/{mtc-parser-6Cu2aFME.js → mtc-parser-0zlMjabo.js} +1 -1
  223. package/src/assets/web-panel/assets/{omit-VRKL8iSO.js → omit-DF7mU3yG.js} +1 -1
  224. package/src/assets/web-panel/assets/{pickAttrs-DZfWsOe0.js → pickAttrs-Cmt8liJP.js} +1 -1
  225. package/src/assets/web-panel/assets/{placementArrow-qmcOUc4W.js → placementArrow-DaMDC57b.js} +1 -1
  226. package/src/assets/web-panel/assets/{responsiveObserve-BLB6SsSw.js → responsiveObserve-CHw_f2d3.js} +1 -1
  227. package/src/assets/web-panel/assets/{slide-41jdYeSH.js → slide-DJS9fFQq.js} +1 -1
  228. package/src/assets/web-panel/assets/{statusUtils-Yn8OQ5ey.js → statusUtils-Bk3XdZwh.js} +1 -1
  229. package/src/assets/web-panel/assets/{styleChecker-4CEwz9Zd.js → styleChecker-DMybAFsA.js} +1 -1
  230. package/src/assets/web-panel/assets/useFlexGapSupport-_tbIIFMu.js +1 -0
  231. package/src/assets/web-panel/assets/{useFs-Bugo8HuF.js → useFs-KPklVptS.js} +1 -1
  232. package/src/assets/web-panel/assets/{useMergedState-DXbJa_zE.js → useMergedState-d-EXs3xd.js} +1 -1
  233. package/src/assets/web-panel/assets/{usePersonalDataHub-B-q2ElB0.js → usePersonalDataHub-C7FrKDhD.js} +1 -1
  234. package/src/assets/web-panel/assets/{useRefs-BrCfMLMc.js → useRefs-DHeCQehi.js} +1 -1
  235. package/src/assets/web-panel/assets/{useState-CnxtbLoC.js → useState-Dlgl7fUg.js} +1 -1
  236. package/src/assets/web-panel/assets/vendor-BXcBOG8b.js +1 -0
  237. package/src/assets/web-panel/assets/vnode-DB3JBusp.js +1 -0
  238. package/src/assets/web-panel/assets/warning-Pq00owYb.js +1 -0
  239. package/src/assets/web-panel/assets/{zoom-DM1y_KKP.js → zoom-C8rAdf81.js} +1 -1
  240. package/src/assets/web-panel/index.html +4 -4
  241. package/src/command-help-index.json +1 -1
  242. package/src/commands/agent.js +1 -1
  243. package/src/commands/governed-skill-marketplace.js +24 -10
  244. package/src/commands/llm.js +4 -3
  245. package/src/data/changelog.json +27 -1
  246. package/src/harness/worktree-isolator.js +4 -1
  247. package/src/lib/compaction-host-provenance.js +24 -0
  248. package/src/lib/context-memory-kernel/durable-memory-port.js +46 -34
  249. package/src/lib/context-memory-kernel/live-compaction.js +12 -3
  250. package/src/lib/context-memory-kernel/memory-query-bundle.js +375 -0
  251. package/src/lib/context-memory-kernel/memory-query-control.js +28 -0
  252. package/src/lib/context-memory-kernel/memory-service.js +30 -16
  253. package/src/lib/context-memory-kernel/memory-shard-snapshots.js +63 -0
  254. package/src/lib/context-memory-kernel/message-adapter.js +27 -6
  255. package/src/lib/context-memory-kernel/provider-context.js +103 -27
  256. package/src/lib/context-memory-kernel/segmented-memory-port.js +347 -138
  257. package/src/lib/cost-budget.js +2 -0
  258. package/src/lib/ephemeral-worktree-scope.js +24 -0
  259. package/src/lib/evolution/evolution-deployment-loader.js +6 -4
  260. package/src/lib/evolution/governed-skill-marketplace-abort.js +14 -0
  261. package/src/lib/evolution/governed-skill-marketplace-candidate.js +10 -2
  262. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +47 -20
  263. package/src/lib/evolution/governed-skill-marketplace.js +47 -24
  264. package/src/lib/goal-condition-engine.js +20 -3
  265. package/src/lib/goal-verification-command.js +221 -0
  266. package/src/lib/goal-verification-plan.js +372 -0
  267. package/src/lib/llm-connection-probe.js +12 -5
  268. package/src/lib/llm-onboarding-catalog.json +1 -1
  269. package/src/lib/llm-pricing.js +34 -8
  270. package/src/lib/mcp-tool-catalog-authority.js +244 -0
  271. package/src/lib/model-capabilities.js +6 -0
  272. package/src/lib/model-catalog-review.js +3 -0
  273. package/src/lib/model-context-catalog.js +44 -2
  274. package/src/lib/openai-responses.js +35 -6
  275. package/src/lib/sub-agent-context.js +12 -4
  276. package/src/lib/subagent-inheritance.js +162 -2
  277. package/src/lib/usage-pricing-context.js +34 -17
  278. package/src/repl/agent-repl.js +34 -2
  279. package/src/runtime/agent-core.js +335 -18
  280. package/src/runtime/compaction-host-context.js +72 -0
  281. package/src/runtime/headless-runner.js +133 -37
  282. package/src/runtime/headless-stream.js +38 -21
  283. package/src/runtime/mcp-agent-catalog.js +257 -0
  284. package/src/runtime/mcp-config.js +18 -69
  285. package/src/runtime/mcp-tool-search.js +16 -1
  286. package/src/runtime/message-roles.js +67 -3
  287. package/src/runtime/provider-stream-state.js +35 -1
  288. package/src/runtime/system-prompt.js +9 -0
  289. package/src/assets/web-panel/assets/AIOps-CSpp7iGY.css +0 -1
  290. package/src/assets/web-panel/assets/AIOps-o-rFKEYL.js +0 -1
  291. package/src/assets/web-panel/assets/Analytics-Bt7H_jrh.js +0 -3
  292. package/src/assets/web-panel/assets/Analytics-DJcHjy5J.css +0 -1
  293. package/src/assets/web-panel/assets/AppLayout-CgynsRFP.js +0 -9
  294. package/src/assets/web-panel/assets/AppLayout-VlanTjPw.css +0 -1
  295. package/src/assets/web-panel/assets/Artifacts-CTVt96zW.css +0 -1
  296. package/src/assets/web-panel/assets/Artifacts-gghOGDyE.js +0 -1
  297. package/src/assets/web-panel/assets/Audit-D8oxP0wr.css +0 -1
  298. package/src/assets/web-panel/assets/Audit-DBXn-AZ6.js +0 -1
  299. package/src/assets/web-panel/assets/BackgroundAgents--dxPftKa.js +0 -1
  300. package/src/assets/web-panel/assets/BackgroundAgents-Dq2340Kl.css +0 -1
  301. package/src/assets/web-panel/assets/Backup-D9Zf_2tH.js +0 -1
  302. package/src/assets/web-panel/assets/Backup-Wi9CaP3d.css +0 -1
  303. package/src/assets/web-panel/assets/BaseInput-DDTOjovq.js +0 -1
  304. package/src/assets/web-panel/assets/Chat-2ETqdBLn.js +0 -8
  305. package/src/assets/web-panel/assets/Chat-KSGPtU0L.css +0 -1
  306. package/src/assets/web-panel/assets/ChatBubbleRenderer-DSg2Xs8G.js +0 -1
  307. package/src/assets/web-panel/assets/ChatBubbleRenderer-gy5SDGw2.css +0 -1
  308. package/src/assets/web-panel/assets/Codegen-4ieEEIwt.js +0 -1
  309. package/src/assets/web-panel/assets/Codegen-BB08p1fn.css +0 -1
  310. package/src/assets/web-panel/assets/Community-Cbq1nrpo.css +0 -1
  311. package/src/assets/web-panel/assets/Community-DeYxFMJb.js +0 -1
  312. package/src/assets/web-panel/assets/Compliance-DLVjbVUh.js +0 -1
  313. package/src/assets/web-panel/assets/Compliance-NoXr2Vof.css +0 -1
  314. package/src/assets/web-panel/assets/Cowork-BlXJRu6L.css +0 -1
  315. package/src/assets/web-panel/assets/Cowork-DfUKa0T5.js +0 -6
  316. package/src/assets/web-panel/assets/Cron-_RpktpO5.js +0 -2
  317. package/src/assets/web-panel/assets/Crosschain-7x6xdbwH.js +0 -1
  318. package/src/assets/web-panel/assets/Crosschain-CgRAecoR.css +0 -1
  319. package/src/assets/web-panel/assets/DID-DVsYcgvs.css +0 -1
  320. package/src/assets/web-panel/assets/DID-ccVhToC1.js +0 -2
  321. package/src/assets/web-panel/assets/Dashboard-CAPSdFR4.css +0 -1
  322. package/src/assets/web-panel/assets/Dashboard-DhygcaoK.js +0 -3
  323. package/src/assets/web-panel/assets/Dropdown-DFplwXK7.js +0 -1
  324. package/src/assets/web-panel/assets/EmailListRenderer-Bm01soCN.js +0 -1
  325. package/src/assets/web-panel/assets/EmailListRenderer-DTPZPx_S.css +0 -1
  326. package/src/assets/web-panel/assets/EvolutionSettings-Bdw8ApoT.css +0 -1
  327. package/src/assets/web-panel/assets/EvolutionSettings-C4v--DkD.js +0 -1
  328. package/src/assets/web-panel/assets/FamilyGuardDashboard-ChQXDBA3.js +0 -1
  329. package/src/assets/web-panel/assets/FamilyGuardDashboard-nd3idUVb.css +0 -1
  330. package/src/assets/web-panel/assets/Federation-C0yomE-M.js +0 -1
  331. package/src/assets/web-panel/assets/Federation-fGN6iMX_.css +0 -1
  332. package/src/assets/web-panel/assets/FormItemContext-DtT3ZEZK.js +0 -2
  333. package/src/assets/web-panel/assets/GenericCardRenderer-DgITtFRv.js +0 -1
  334. package/src/assets/web-panel/assets/GenericCardRenderer-o85VDYQS.css +0 -1
  335. package/src/assets/web-panel/assets/Git-CCY42R8S.js +0 -2
  336. package/src/assets/web-panel/assets/Governance-DtCS4NDm.css +0 -1
  337. package/src/assets/web-panel/assets/Governance-N66Bwvqg.js +0 -1
  338. package/src/assets/web-panel/assets/Inference-BkbPuR_2.js +0 -1
  339. package/src/assets/web-panel/assets/Inference-t-w0NgIS.css +0 -1
  340. package/src/assets/web-panel/assets/KnowledgeGraph-4NU1S2Xm.css +0 -1
  341. package/src/assets/web-panel/assets/KnowledgeGraph-B3PibXdA.js +0 -1
  342. package/src/assets/web-panel/assets/Logs-CUtNB_N6.js +0 -2
  343. package/src/assets/web-panel/assets/Logs-DQbCaYhL.css +0 -1
  344. package/src/assets/web-panel/assets/MarkdownRenderer-D-V4dOe3.js +0 -1
  345. package/src/assets/web-panel/assets/MarkdownRenderer-DbzhFwvz.css +0 -1
  346. package/src/assets/web-panel/assets/Marketplace-Bvo5cuGa.css +0 -1
  347. package/src/assets/web-panel/assets/Marketplace-DLNJb6Nr.js +0 -1
  348. package/src/assets/web-panel/assets/McpTools-2zGjJb5K.js +0 -4
  349. package/src/assets/web-panel/assets/McpTools-534Q95Mx.css +0 -1
  350. package/src/assets/web-panel/assets/Memory-9rNZ1EvR.js +0 -2
  351. package/src/assets/web-panel/assets/Memory-CleW_R6V.css +0 -1
  352. package/src/assets/web-panel/assets/MobileBridge-Cw7sAAgn.js +0 -1
  353. package/src/assets/web-panel/assets/MobileBridge-D3Arxfeg.css +0 -1
  354. package/src/assets/web-panel/assets/MobileProjects-8XACrqqy.js +0 -1
  355. package/src/assets/web-panel/assets/MobileProjects-BD4alw6-.css +0 -1
  356. package/src/assets/web-panel/assets/Mtc-CXZGO9Sh.css +0 -1
  357. package/src/assets/web-panel/assets/Mtc-mg02JNy-.js +0 -6
  358. package/src/assets/web-panel/assets/MtcAudit-B1Vkhj2l.js +0 -19
  359. package/src/assets/web-panel/assets/MtcAudit-C1JM8esp.css +0 -1
  360. package/src/assets/web-panel/assets/Multisig-BQEeA7GG.js +0 -13
  361. package/src/assets/web-panel/assets/Multisig-BryR2Jpr.css +0 -1
  362. package/src/assets/web-panel/assets/NLProgramming-BIbkjZV3.js +0 -1
  363. package/src/assets/web-panel/assets/NLProgramming-DGDHq6Z9.css +0 -1
  364. package/src/assets/web-panel/assets/Notes-BKKmMtqV.css +0 -1
  365. package/src/assets/web-panel/assets/Notes-DIwhkZNY.js +0 -7
  366. package/src/assets/web-panel/assets/NotificationSettings-CG3Kfuef.css +0 -1
  367. package/src/assets/web-panel/assets/NotificationSettings-Cj9175ce.js +0 -1
  368. package/src/assets/web-panel/assets/OrderTableRenderer-CfrDjSHT.css +0 -1
  369. package/src/assets/web-panel/assets/OrderTableRenderer-IfNpXT2R.js +0 -1
  370. package/src/assets/web-panel/assets/Organization-DPFp6G9o.js +0 -4
  371. package/src/assets/web-panel/assets/Organization-LVvqwG0D.css +0 -1
  372. package/src/assets/web-panel/assets/P2P-DcFvP7F-.css +0 -1
  373. package/src/assets/web-panel/assets/P2P-tXck8GLq.js +0 -2
  374. package/src/assets/web-panel/assets/PdhVaultBrowser-DSvpQl9k.js +0 -7
  375. package/src/assets/web-panel/assets/PdhVaultBrowser-DZZrUOr1.css +0 -1
  376. package/src/assets/web-panel/assets/Permissions-CKPkdLj-.js +0 -4
  377. package/src/assets/web-panel/assets/Permissions-DsPE_IQy.css +0 -1
  378. package/src/assets/web-panel/assets/PersonalDataHub-BhpRlh9D.css +0 -1
  379. package/src/assets/web-panel/assets/PersonalDataHub-DnqXc12l.js +0 -9
  380. package/src/assets/web-panel/assets/Pipeline-BItr5CyP.css +0 -1
  381. package/src/assets/web-panel/assets/Pipeline-BKjFU_kd.js +0 -1
  382. package/src/assets/web-panel/assets/Privacy-ChC-J5Tn.js +0 -1
  383. package/src/assets/web-panel/assets/Privacy-F_ENsxZk.css +0 -1
  384. package/src/assets/web-panel/assets/ProjectInit-B86LEzDL.css +0 -1
  385. package/src/assets/web-panel/assets/ProjectInit-ByFZG9sY.js +0 -2
  386. package/src/assets/web-panel/assets/ProjectSettings-Bbv1Kiw-.js +0 -2
  387. package/src/assets/web-panel/assets/ProjectSettings-DK7KA_iX.css +0 -1
  388. package/src/assets/web-panel/assets/Projects-CmJeUDBW.css +0 -1
  389. package/src/assets/web-panel/assets/Projects-QYyGW31-.js +0 -1
  390. package/src/assets/web-panel/assets/Providers-C6q_fvea.css +0 -1
  391. package/src/assets/web-panel/assets/Providers-CJLnWw0r.js +0 -1
  392. package/src/assets/web-panel/assets/QrScannerModal-NwAHNfiJ.css +0 -1
  393. package/src/assets/web-panel/assets/QuickAsk-DoXU0np9.js +0 -1
  394. package/src/assets/web-panel/assets/Recommend-DCo_vuaf.js +0 -1
  395. package/src/assets/web-panel/assets/Recommend-D_bf91K6.css +0 -1
  396. package/src/assets/web-panel/assets/RemoteSession-CLuL925Z.js +0 -5
  397. package/src/assets/web-panel/assets/Reputation-CNNCA_-M.js +0 -1
  398. package/src/assets/web-panel/assets/Reputation-DiOsOleI.css +0 -1
  399. package/src/assets/web-panel/assets/Row-Vu4j631i.js +0 -1
  400. package/src/assets/web-panel/assets/RssFeed-C18B4xiy.js +0 -3
  401. package/src/assets/web-panel/assets/RssFeed-CjcbkyUb.css +0 -1
  402. package/src/assets/web-panel/assets/Search-DxiqccE2.js +0 -1
  403. package/src/assets/web-panel/assets/Search-Klk29S7C.css +0 -1
  404. package/src/assets/web-panel/assets/Security-BmrukMHn.css +0 -1
  405. package/src/assets/web-panel/assets/Security-Droe_hHI.js +0 -4
  406. package/src/assets/web-panel/assets/Services-CwmmyXzq.js +0 -2
  407. package/src/assets/web-panel/assets/Services-DAnVNhUG.css +0 -1
  408. package/src/assets/web-panel/assets/Skills-BUu9owbR.css +0 -1
  409. package/src/assets/web-panel/assets/Skills-Dp-d2miK.js +0 -1
  410. package/src/assets/web-panel/assets/Sla-2DFXVbK4.js +0 -1
  411. package/src/assets/web-panel/assets/Sla-sodqCU4a.css +0 -1
  412. package/src/assets/web-panel/assets/SpeechSettings-Cdd9lCoy.js +0 -1
  413. package/src/assets/web-panel/assets/SpeechSettings-CgB9nFyq.css +0 -1
  414. package/src/assets/web-panel/assets/SyncSettings-B3hJqmBP.css +0 -1
  415. package/src/assets/web-panel/assets/SyncSettings-CxQhcYSk.js +0 -2
  416. package/src/assets/web-panel/assets/Tasks-BHWVRfXx.js +0 -1
  417. package/src/assets/web-panel/assets/Tasks-nbTUVXvt.css +0 -1
  418. package/src/assets/web-panel/assets/Templates-CpFsKk_l.css +0 -1
  419. package/src/assets/web-panel/assets/Templates-DNFk3a5_.js +0 -1
  420. package/src/assets/web-panel/assets/Tenant-B6X6dPo8.js +0 -1
  421. package/src/assets/web-panel/assets/Tenant-MuPJnOjk.css +0 -1
  422. package/src/assets/web-panel/assets/Terminal-BuUNoLGM.js +0 -3
  423. package/src/assets/web-panel/assets/Terminal-DHoveJwj.css +0 -1
  424. package/src/assets/web-panel/assets/TimelineRenderer-BlTAtkOc.css +0 -1
  425. package/src/assets/web-panel/assets/TimelineRenderer-DThrBYj8.js +0 -1
  426. package/src/assets/web-panel/assets/Tokens-CA_u4Blu.js +0 -1
  427. package/src/assets/web-panel/assets/Tokens-CynVae-o.css +0 -1
  428. package/src/assets/web-panel/assets/Trust-C-WrW0Fj.css +0 -1
  429. package/src/assets/web-panel/assets/Trust-DHcLpNy3.js +0 -1
  430. package/src/assets/web-panel/assets/UkeySign-B_fni4C2.js +0 -1
  431. package/src/assets/web-panel/assets/VideoEditing-BDFghpzP.css +0 -1
  432. package/src/assets/web-panel/assets/VideoEditing-g9nf2EhS.js +0 -1
  433. package/src/assets/web-panel/assets/Wallet-C8pOjIve.js +0 -4
  434. package/src/assets/web-panel/assets/Wallet-DUbpTRcg.css +0 -1
  435. package/src/assets/web-panel/assets/WebAuthn-BaKNjxZt.js +0 -5
  436. package/src/assets/web-panel/assets/WebAuthn-CVAFRfCQ.css +0 -1
  437. package/src/assets/web-panel/assets/WorkflowEditor-429lPWYk.css +0 -1
  438. package/src/assets/web-panel/assets/WorkflowEditor-CX030Wb1.js +0 -1
  439. package/src/assets/web-panel/assets/createContext-B8rTvO61.js +0 -1
  440. package/src/assets/web-panel/assets/devWarning-B4_IVU_n.js +0 -1
  441. package/src/assets/web-panel/assets/echarts-C61Vn3mP.js +0 -25
  442. package/src/assets/web-panel/assets/index--6BUI55w.js +0 -1
  443. package/src/assets/web-panel/assets/index-5Q1bepcM.js +0 -1
  444. package/src/assets/web-panel/assets/index-B10Ia2KL.js +0 -21
  445. package/src/assets/web-panel/assets/index-B1SLBLli.js +0 -3
  446. package/src/assets/web-panel/assets/index-B8_VQAav.js +0 -1
  447. package/src/assets/web-panel/assets/index-BMuPJra-.js +0 -1
  448. package/src/assets/web-panel/assets/index-BOCjph-k.js +0 -12
  449. package/src/assets/web-panel/assets/index-BpBaOWmV.js +0 -1
  450. package/src/assets/web-panel/assets/index-CDlHvQtw.js +0 -1
  451. package/src/assets/web-panel/assets/index-CPF7Vqri.js +0 -55
  452. package/src/assets/web-panel/assets/index-CPmgKQcl.js +0 -1
  453. package/src/assets/web-panel/assets/index-CcpMHPWd.js +0 -21
  454. package/src/assets/web-panel/assets/index-Cyksnofp.js +0 -1
  455. package/src/assets/web-panel/assets/index-Dc9pcin6.js +0 -1
  456. package/src/assets/web-panel/assets/index-DfAC55QA.js +0 -19
  457. package/src/assets/web-panel/assets/index-DgNCfwvg.js +0 -1
  458. package/src/assets/web-panel/assets/index-DvfhIBNZ.js +0 -1
  459. package/src/assets/web-panel/assets/index-Hbzd9WeI.js +0 -1
  460. package/src/assets/web-panel/assets/index-IiS7WoUl.js +0 -13
  461. package/src/assets/web-panel/assets/index-Xa6TlaD7.js +0 -31
  462. package/src/assets/web-panel/assets/index-YczWc2_0.js +0 -12
  463. package/src/assets/web-panel/assets/index-h_ANnbR8.js +0 -3
  464. package/src/assets/web-panel/assets/index-k7QsBwyo.js +0 -75
  465. package/src/assets/web-panel/assets/isSymbol-S5WZT7lS.js +0 -1
  466. package/src/assets/web-panel/assets/motion-B1hpJYSD.js +0 -11
  467. package/src/assets/web-panel/assets/useFlexGapSupport-BClv53kR.js +0 -1
  468. package/src/assets/web-panel/assets/vendor-Bn1JzzAn.js +0 -42
  469. 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 || mcpDispatchAdmission || workflowEffectId) {
9945
+ if (signal || catalogDispatchAdmission || workflowEffectId) {
9878
9946
  callArguments.push({
9879
9947
  ...(signal ? { signal } : {}),
9880
- ...(mcpDispatchAdmission
9881
- ? { dispatchAdmission: mcpDispatchAdmission }
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 effectiveToolOptions = hermeticExecution
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
- : options;
14868
- const effectiveAllowedToolNames = Object.freeze(
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
- const authorityExpectedMessages = [...messages];
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. Reiterate that
16130
- // exact request after the source data, not a replacement objective.
16131
- const request = requestMessages.findLast(
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
- callMessages = options.projectProviderMessages(callMessages);
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
+ }