chainlesschain 0.163.2 → 0.163.4

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 (222) hide show
  1. package/package.json +3 -2
  2. package/scripts/command-lifecycle-report.mjs +330 -38
  3. package/src/assets/web-panel/assets/{AIOps-DnGsmsqJ.js → AIOps-DB5X7qqV.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-CrO6fcQ7.js → ActionButton-DxHRtKLk.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-DsBdOaP2.js → Analytics-DIH5QrxT.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-DmQslKUB.js → AppLayout-uu0oxVz7.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-BvyrT_QQ.js → Artifacts-BNSMiW9Y.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-prndoLiC.js → Audit-DcAzB4_x.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-DOTFyA55.js → BackgroundAgents-ClSsvjIc.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-9zOnPp_8.js → Backup-BMciY0js.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-C4PC6sAG.js → BaseInput-Hn3b57Sh.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-BBAF-W9v.js → Chat-CoSlC53V.js} +6 -6
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CWhvvloO.js → ChatBubbleRenderer-CFevJ3So.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-BI9iculd.js → Checkbox-B4L4Eu4w.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-3DP9BCKb.js → Codegen-C77FgRxF.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-df-2TnJX.js → Col-BrLtJLH3.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-CHs8gG_A.js → Community-Be7pXXhA.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-CDfF6q7V.js → Compact-DuGPecjo.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-CthrDnO7.js → Compliance-CzS66mjP.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-HjIqsWJw.js → Cowork-CEhjCoyK.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-BKc196fb.js → Cron-D7ir8Vja.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CJnjdc8W.js → Crosschain-BcXmuLxf.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-BHUy-8Q2.js → DID-Cto1dtBy.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-QDB7sKeY.js → Dashboard-B7KjgwOX.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-DStcVK11.js → Dropdown-COMqxijg.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-BwSUskMJ.js → EmailListRenderer-BZrya-nf.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgF_kurT.js → FamilyGuardDashboard-AmVeMq0J.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-k8wvv-wN.js → Federation-kZU8c-27.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-C11qoq2r.js → FormItemContext-sOV22v2-.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-BIIpr9kg.js → GenericCardRenderer-BUuLtGCz.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-BlA1exTe.js → Git-K-ZxsLsH.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CYa1ZYM4.js → Governance-D3OEnawI.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-6_kKVIt6.js → Inference-Bll0gRmP.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-CB4AwxYy.js → KnowledgeGraph-DBXwjr53.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-xf7nHFAe.js → Logs-CEzPwEfP.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-Bf3DEqP6.js → MarkdownRenderer-CLmCbHx6.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-aPg8e4Jt.js → Marketplace-BYyRyOPz.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-C-TNlVUf.js → McpTools-DVu8w_rM.js} +5 -5
  39. package/src/assets/web-panel/assets/{Memory-DMTPIpGa.js → Memory-tenuZ_hO.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-BxyvveRq.js → MobileBridge-Bxgy4ozS.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-DyPCrAyQ.js → MobileProjects-Dgx1D6sc.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-BdhqNXp6.js → Mtc-CRfJ8r8j.js} +5 -5
  43. package/src/assets/web-panel/assets/{MtcAudit-Cz-HFxzW.js → MtcAudit-BBJq4Aiz.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-CIUaFNsx.js → Multisig-B3ii9lai.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-CWe6-J17.js → NLProgramming-FIi-Cubv.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-vYAKeviU.js → Notes-DIq8MPf1.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-DQL9-2d7.js → NotificationSettings-BFOD9eGd.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-DnXj1jBn.js → OrderTableRenderer--41u7vre.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-B3spU8AN.js → Organization-B_0AWztW.js} +2 -2
  50. package/src/assets/web-panel/assets/{Overflow-DgEwo7vm.js → Overflow-B6I7TuXv.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-hujMRH8X.js → P2P-Cdf6qens.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-C_qhdg9h.js → PdhVaultBrowser-B_0FcQJY.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-vp7LMcSf.js → Permissions-6nFBjsQp.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Dxr5Hgnq.js → PersonalDataHub-nQYV7xpn.js} +3 -3
  55. package/src/assets/web-panel/assets/{Pipeline-DEPZqqH4.js → Pipeline-CBVod5jm.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-DTpDiKPe.js → Privacy-D52jW1Nt.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-jDJsRWmF.js → ProjectInit-Bdx3BYhf.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-Dhor5RWH.js → ProjectSettings-b7xr4DUa.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-DhfifCKx.js +1 -0
  60. package/src/assets/web-panel/assets/Providers-Dy_PgDMr.js +1 -0
  61. package/src/assets/web-panel/assets/{QrScannerModal-CjIw-wIb.js → QrScannerModal-FQKSmc3e.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-DX6jcqoi.js → QuickAsk-CSTrhzcF.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-DopXkhar.js → Recommend-CxMABOUh.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-BLvqJE9c.js → RemoteSession-Cv2T8yRa.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-DhRj2Me7.js → Reputation-CE1k4Vvu.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DQ53vuPq.js → Row-BNgNcAV_.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-BslvwiBD.js → RssFeed-5ZiBZ3ph.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DJKBDNKZ.js → Search-mDOIF1UV.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-COhpxHER.js → Security-CtuCTC-e.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-dbulD6cI.js → Services-DxFO2Zg7.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-ciIVNfhC.js → Skeleton-CKmKkH9y.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-AiRTkTCk.js → Skills-Bmzl9qkk.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-DDMcWYBc.js → Sla-9RqaWHOC.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-BPxWbpXO.js → SpeechSettings-CGdzFIYw.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-BoEOXCyg.js → SyncSettings-CvNuCeBT.js} +2 -2
  76. package/src/assets/web-panel/assets/Tasks-B_sLdcnw.js +1 -0
  77. package/src/assets/web-panel/assets/{Templates-UowY8Ixe.js → Templates-D9_YijdK.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-DauSLQXN.js → Tenant-Cuc7BUSP.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-DBj7Jneq.js → Terminal-6VYRnJgd.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-UMrPwoZC.js → TimelineRenderer-GtK8xd8Y.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-4ea96-bn.js → Tokens-BZ94Lt5W.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger--ISCqt4b.js → Trigger-DEcZgDaX.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-D4GVimRJ.js → Trust-CC3z9THe.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-Ci-nXRQc.js → UkeySign-Cvtw8cV3.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-Cjk7mKPw.js → VideoEditing-CL4e6Bn3.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-BgOLOO3Z.js → Wallet-ycEemP27.js} +2 -2
  87. package/src/assets/web-panel/assets/{WebAuthn-CCX0K29i.js → WebAuthn-DgZ4X_aw.js} +5 -5
  88. package/src/assets/web-panel/assets/{WorkflowEditor-Ch3zgIsE.js → WorkflowEditor-D0qMhSv7.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-DKOU_2Vb.js → chat-DsAg01Zn.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-6OVo4u3C.js → colors-B0oqAhrQ.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BH78Hlsq.js → compact-item-CmX0Rabz.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-CFRpSbbC.js → createContext-Be4cn1Ub.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-CP2qzG6D.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DNQhgcVi.js → hasIn-D5v12kVq.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BkN3iTTp.js → index-0eWLkQKT.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CkNEMANR.js → index-301ogenv.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-D3RtTT4K.js → index-5LGY0JbG.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-dDkoL4Pe.js → index-7VKDn-t1.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BHa4WyTZ.js → index-8WvYGnON.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CaYqY35Z.js → index-B1YGjOWC.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-bKm3TUDp.js → index-B3mUHuVc.js} +1 -1
  102. package/src/assets/web-panel/assets/{index--rq90rL9.js → index-BA4oulaP.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DaDgdJYj.js → index-BBREnn1V.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-B_Z-YoxX.js → index-BBvyHguy.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CkqHgG-b.js → index-BKmsS2jj.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CrcLHN2F.js → index-BRIqLy1m.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BaVE6E8y.js → index-BXGSbelg.js} +3 -3
  108. package/src/assets/web-panel/assets/{index-BYrnm5Ob.js → index-BaE0Ui07.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BDSR7ecX.js → index-BoAIAZ5C.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CNuCHHQT.js → index-BqltWojQ.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Eag8e_mA.js → index-CGiIyTZw.js} +1 -1
  112. package/src/assets/web-panel/assets/index-CKB0vbJU.js +1 -0
  113. package/src/assets/web-panel/assets/{index-BepBTpa8.js → index-CZ2wUEgr.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-HNGGVF6o.js → index-CZpfzcuy.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-AuBhLqOm.js → index-Ckrk3pIV.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-7TC3S8SN.js → index-CqoCZ5vR.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CFPJ8yzF.js → index-CyWBir7N.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Bb6kDrUx.js → index-CyyGTMKd.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DKN2noIF.js → index-D0BSkxYQ.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Du0rnksC.js → index-D5YVopyr.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BxRy5LPR.js → index-DKUBj36_.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-sm7W8AXy.js → index-DM724NgU.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BujsOZfc.js → index-DQRsQen0.js} +1 -1
  124. package/src/assets/web-panel/assets/index-DgoXmwqB.js +1 -0
  125. package/src/assets/web-panel/assets/{index-Y9MJv28e.js → index-DikJ0Qqe.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-caye7AOE.js → index-Dn2dSdXx.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-cdf7fd7d.js → index-DyUaFWEk.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BnnXQot_.js → index-Hfe_dEGx.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DvHGtNnF.js → index-_JjRLSD0.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-nbfHl1oV.js → index-frSojpHj.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Cu3L4r5l.js → index-jK3ax6Z6.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D84id2Y4.js → index-qMuZ-NRR.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-hPY0fFrd.js → index-q_fQ94SE.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-BZ9w6jPL.js → initDefaultProps-D4VdhJ9_.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BnwUiOho.js → motion-CZJA0MQW.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-ByUKJnNm.js → move-BqEs7Sb1.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-V7yK1KEl.js → mtc-parser-BpHEtsu1.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-BEXBBt4j.js → omit-BW94tY9W.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-qDm_46Gi.js → pickAttrs-BnBjPWP9.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-BIbhEo_0.js → placementArrow-uUkjQ_hu.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-NbPbDgA_.js → responsiveObserve-B-klUqXK.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-BnUWglZ0.js → slide-CvY1cNAs.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-BX8_wZI5.js → statusUtils-Ix5sEDT2.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-BV4OycQX.js → styleChecker-C8qcXOne.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-Od_H5llY.js → useFlexGapSupport-KNF6Kj8f.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-BWI-PyiX.js → useFs-DGJr345n.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-BqMuhG3g.js → usePersonalDataHub-BboN99rI.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-DNd23z6f.js → vnode-Bgt8Vgte.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-Cjaxnm7l.js → zoom-BhJtErgt.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +2 -2
  152. package/src/commands/agenda.js +6 -5
  153. package/src/commands/agent.js +237 -75
  154. package/src/commands/agents.js +6 -0
  155. package/src/commands/artifacts.js +98 -0
  156. package/src/commands/background-session.js +11 -1
  157. package/src/commands/mcp.js +218 -31
  158. package/src/commands/review.js +221 -22
  159. package/src/commands/session-mcp-recovery.js +5 -5
  160. package/src/data/changelog.json +27 -1
  161. package/src/gateways/ws/ws-agent-handler.js +492 -14
  162. package/src/harness/jsonl-session-store.js +39 -1
  163. package/src/harness/mcp-client.js +414 -71
  164. package/src/harness/prompt-compressor.js +24 -0
  165. package/src/harness/provider-backed-compaction.js +205 -0
  166. package/src/harness/worktree-isolator.js +26 -3
  167. package/src/lib/agent-worktree.js +41 -2
  168. package/src/lib/app-preview.js +3 -0
  169. package/src/lib/background-agent-supervisor.js +790 -186
  170. package/src/lib/background-command-argv.js +318 -0
  171. package/src/lib/background-launch-profile.js +1 -0
  172. package/src/lib/background-phase-reporter.js +22 -2
  173. package/src/lib/background-worktree-policy.js +109 -0
  174. package/src/lib/command-lifecycle-report.js +1340 -145
  175. package/src/lib/cowork-mcp-tools.js +51 -6
  176. package/src/lib/cowork-task-runner.js +1 -0
  177. package/src/lib/delivery-coordinator.js +30 -5
  178. package/src/lib/delivery-production-adapter.js +1777 -0
  179. package/src/lib/delivery-production-runner.js +240 -0
  180. package/src/lib/durable-security-store.js +29 -17
  181. package/src/lib/execution-trace/trace-context.cjs +179 -0
  182. package/src/lib/execution-trace/trace-context.js +8 -175
  183. package/src/lib/mcp-call-ledger-store.js +58 -6
  184. package/src/lib/mcp-headers-helper.js +76 -8
  185. package/src/lib/mcp-host-recovery-runtime.js +2 -0
  186. package/src/lib/mcp-ledger-recovery-admission.js +39 -3
  187. package/src/lib/mcp-recovery-adjudication.js +256 -19
  188. package/src/lib/mcp-sandbox-policy.js +184 -0
  189. package/src/lib/mcp-stdio-capsule-builder-worker.cjs +495 -0
  190. package/src/lib/mcp-stdio-executable-identity.js +33 -2
  191. package/src/lib/mcp-stdio-execution-authority.js +163 -0
  192. package/src/lib/mcp-stdio-immutable-vfs-resolver.cjs +830 -0
  193. package/src/lib/mcp-stdio-package-materialization.js +721 -333
  194. package/src/lib/mcp-stdio-workspace-authority.js +252 -0
  195. package/src/lib/observability/index.js +2 -0
  196. package/src/lib/observability/otlp-exporter.js +2 -2
  197. package/src/lib/packer/pack-update-applier.js +8 -1
  198. package/src/lib/packer/pkg-config-generator.js +34 -0
  199. package/src/lib/plugin-runtime/sandbox-policy.js +42 -2
  200. package/src/lib/process-execution-broker/index.js +213 -109
  201. package/src/lib/process-execution-broker/platform-sandbox.js +1024 -169
  202. package/src/lib/process-tree-termination.js +17 -1
  203. package/src/lib/scheduler-kernel/contract.js +315 -0
  204. package/src/lib/scheduler-kernel/store.js +1345 -0
  205. package/src/lib/session-host-lease.js +403 -30
  206. package/src/lib/session-persistence-failure.js +4 -1
  207. package/src/lib/skill-mcp.js +65 -4
  208. package/src/lib/sub-agent-context.js +8 -0
  209. package/src/lib/web-fetch.js +4 -4
  210. package/src/repl/agent-repl.js +285 -38
  211. package/src/runtime/agent-core.js +1044 -90
  212. package/src/runtime/agent-runtime.js +61 -8
  213. package/src/runtime/headless-runner.js +260 -166
  214. package/src/runtime/headless-stream.js +254 -25
  215. package/src/runtime/mcp-config.js +235 -28
  216. package/src/workers/background-agent-worker.js +492 -71
  217. package/src/assets/web-panel/assets/Projects-08xUDZGt.js +0 -1
  218. package/src/assets/web-panel/assets/Providers-BGs47s1a.js +0 -1
  219. package/src/assets/web-panel/assets/Tasks-CEYFJwmr.js +0 -1
  220. package/src/assets/web-panel/assets/devWarning-DEMblAIm.js +0 -1
  221. package/src/assets/web-panel/assets/index-BTvq-36D.js +0 -1
  222. package/src/assets/web-panel/assets/index-hUpvk6Jl.js +0 -1
@@ -32,6 +32,47 @@ import {
32
32
  issueMcpStdioExecutionAuthority,
33
33
  } from "./mcp-stdio-execution-authority.js";
34
34
  import { MCP_STDIO_RUNTIME_KINDS } from "./mcp-stdio-executable-identity.js";
35
+ import { isProxy } from "node:util/types";
36
+ import {
37
+ MCP_SANDBOX_POLICY_INVALID_CODE,
38
+ normalizeMcpSandboxPolicy,
39
+ readMcpStdioCwd,
40
+ } from "./mcp-sandbox-policy.js";
41
+
42
+ function invalidSandboxPolicy(message) {
43
+ const error = new TypeError(message);
44
+ error.code = MCP_SANDBOX_POLICY_INVALID_CODE;
45
+ return error;
46
+ }
47
+
48
+ function sandboxPolicyFromEntry(entry) {
49
+ if (!entry || typeof entry !== "object" || isProxy(entry)) {
50
+ throw invalidSandboxPolicy(
51
+ "skill MCP server config must be a non-Proxy object",
52
+ );
53
+ }
54
+ const descriptor = Object.getOwnPropertyDescriptor(entry, "sandboxPolicy");
55
+ if (!descriptor) return null;
56
+ if (!("value" in descriptor)) {
57
+ throw invalidSandboxPolicy(
58
+ "skill MCP server sandboxPolicy must be an own data property",
59
+ );
60
+ }
61
+ return normalizeMcpSandboxPolicy(descriptor.value, {
62
+ label: "skill MCP server sandboxPolicy",
63
+ });
64
+ }
65
+
66
+ function safeServerName(entry) {
67
+ if (!entry || typeof entry !== "object" || isProxy(entry)) return "(invalid)";
68
+ const descriptor = Object.getOwnPropertyDescriptor(entry, "name");
69
+ return descriptor &&
70
+ "value" in descriptor &&
71
+ typeof descriptor.value === "string" &&
72
+ descriptor.value.length > 0
73
+ ? descriptor.value
74
+ : "(invalid)";
75
+ }
35
76
 
36
77
  /**
37
78
  * Parse MCP server declarations from a SKILL.md body.
@@ -77,6 +118,10 @@ export function parseSkillMcpServers(body) {
77
118
  */
78
119
  export function validateMcpServerConfig(entry) {
79
120
  if (!entry || typeof entry !== "object") return null;
121
+ const sandboxPolicy = sandboxPolicyFromEntry(entry);
122
+ const { cwd } = readMcpStdioCwd(entry, {
123
+ label: "skill MCP server config",
124
+ });
80
125
  if (typeof entry.name !== "string" || entry.name.trim().length === 0) {
81
126
  return null;
82
127
  }
@@ -102,9 +147,8 @@ export function validateMcpServerConfig(entry) {
102
147
  } else if (entry.runtimeKind !== undefined) {
103
148
  return null;
104
149
  }
105
- if (typeof entry.cwd === "string" && entry.cwd.length > 0) {
106
- normalized.cwd = entry.cwd;
107
- }
150
+ if (cwd) normalized.cwd = cwd;
151
+ if (sandboxPolicy) normalized.sandboxPolicy = sandboxPolicy;
108
152
  return Object.freeze(normalized);
109
153
  }
110
154
 
@@ -131,7 +175,19 @@ export async function mountSkillMcpServers(mcpClient, skill, opts = {}) {
131
175
  }
132
176
 
133
177
  for (const server of declared) {
134
- const normalized = validateMcpServerConfig(server);
178
+ let normalized;
179
+ try {
180
+ normalized = validateMcpServerConfig(server);
181
+ } catch (error) {
182
+ const name = safeServerName(server);
183
+ const message = error?.message || String(error);
184
+ skipped.push({ name, error: message });
185
+ opts.onWarn?.(
186
+ `[skill-mcp] Skipped "${name}" for skill "${skill?.id || skill?.name}": ${message}`,
187
+ error,
188
+ );
189
+ continue;
190
+ }
135
191
  if (!normalized) {
136
192
  const name = server?.name || "(invalid)";
137
193
  skipped.push({ name, error: "invalid config" });
@@ -157,6 +213,7 @@ export async function mountSkillMcpServers(mcpClient, skill, opts = {}) {
157
213
  runtimeKind: normalized.runtimeKind || null,
158
214
  cwd: normalized.cwd || null,
159
215
  envKeys: Object.keys(normalized.env || {}).sort(),
216
+ sandboxPolicy: normalized.sandboxPolicy || null,
160
217
  })) === true;
161
218
  } catch (error) {
162
219
  const message = error?.message || String(error);
@@ -182,6 +239,10 @@ export async function mountSkillMcpServers(mcpClient, skill, opts = {}) {
182
239
  config,
183
240
  approvalKind: "explicit-config",
184
241
  approvalSource: `skill:${skill?.id || skill?.name || "unknown"}:${normalized.name}`,
242
+ workspaceBinding:
243
+ typeof mcpClient.executionWorkspaceBinding === "function"
244
+ ? mcpClient.executionWorkspaceBinding()
245
+ : null,
185
246
  });
186
247
  await mcpClient.connect(normalized.name, config);
187
248
  mounted.push(normalized.name);
@@ -190,8 +190,10 @@ export class SubAgentContext {
190
190
  ? options.externalToolExecutors
191
191
  : {};
192
192
  this._mcpClient = options.mcpClient || null;
193
+ this._mcpHostClient = options.mcpHostClient || this._mcpClient;
193
194
  this._mcpCallLedger = options.mcpCallLedger || null;
194
195
  this._mcpConflictScheduler = options.mcpConflictScheduler || null;
196
+ this._mcpDispatchAdmission = options.mcpDispatchAdmission || null;
195
197
 
196
198
  // Inherited settings hooks (Pre/PostToolUse) for this child loop. null =
197
199
  // no hooks (the spawn default). The spawn path passes the parent's hooks
@@ -549,12 +551,18 @@ export class SubAgentContext {
549
551
  if (this._mcpClient) {
550
552
  options.mcpClient = this._mcpClient;
551
553
  }
554
+ if (this._mcpHostClient) {
555
+ options.mcpHostClient = this._mcpHostClient;
556
+ }
552
557
  if (this._mcpCallLedger) {
553
558
  options.mcpCallLedger = this._mcpCallLedger;
554
559
  }
555
560
  if (this._mcpConflictScheduler) {
556
561
  options.mcpConflictScheduler = this._mcpConflictScheduler;
557
562
  }
563
+ if (this._mcpDispatchAdmission) {
564
+ options.mcpDispatchAdmission = this._mcpDispatchAdmission;
565
+ }
558
566
  // Inherited Pre/PostToolUse hooks (spawn passes the parent's, filtered by
559
567
  // the contract's `hooks` allow-list). Only set when non-null so a plain
560
568
  // sub-agent keeps its no-hooks default.
@@ -5,10 +5,10 @@
5
5
  * private/loopback hosts unless explicitly allowlisted.
6
6
  */
7
7
 
8
- import http from "http";
9
- import https from "https";
10
- import { lookup as dnsLookup } from "dns";
11
- import { URL } from "url";
8
+ import http from "node:http";
9
+ import https from "node:https";
10
+ import { lookup as dnsLookup } from "node:dns";
11
+ import { URL } from "node:url";
12
12
 
13
13
  const DEFAULT_MAX_BYTES = 2_000_000;
14
14
  const DEFAULT_TIMEOUT_MS = 15_000;
@@ -101,10 +101,13 @@ import { runnableTaskModel, hasUsableKey } from "../lib/runnable-provider.js";
101
101
  import { CLIPermanentMemory } from "../lib/permanent-memory.js";
102
102
  import { CLIAutonomousAgent, GoalStatus } from "../lib/autonomous-agent.js";
103
103
  import {
104
+ estimateMessagesTokens,
104
105
  PromptCompressor,
105
106
  estimateTokens,
106
107
  getContextWindow,
107
108
  } from "../harness/prompt-compressor.js";
109
+ import { compactConversationWithProvider } from "../harness/provider-backed-compaction.js";
110
+ import { isAbortError } from "../lib/abort-utils.js";
108
111
  import {
109
112
  buildAutoPinPredicate,
110
113
  resolveAutoPinOption,
@@ -1303,6 +1306,7 @@ export function createReplCompactPersistence(
1303
1306
  canonicalPayload,
1304
1307
  persistedMessages,
1305
1308
  );
1309
+ synchronousReplRecoveryValue(result, "REPL compact settlement result");
1306
1310
  replace(canonicalMessages);
1307
1311
  return result;
1308
1312
  },
@@ -1312,6 +1316,84 @@ export function createReplCompactPersistence(
1312
1316
  });
1313
1317
  }
1314
1318
 
1319
+ /**
1320
+ * Account one provider-backed REPL compaction and settle its canonical message
1321
+ * checkpoint before changing the live array. Provider work must already be
1322
+ * complete when this synchronous boundary is entered.
1323
+ */
1324
+ export function settleReplCompactionCandidate({
1325
+ messages,
1326
+ expectedMessages,
1327
+ compacted,
1328
+ stats,
1329
+ trigger,
1330
+ useJsonl,
1331
+ sessionId,
1332
+ persistence,
1333
+ usageEvent = null,
1334
+ usageUnknownEvent = null,
1335
+ costStore = null,
1336
+ appendUsage = appendTokenUsage,
1337
+ }) {
1338
+ if (usageUnknownEvent) {
1339
+ return {
1340
+ applied: false,
1341
+ block: Object.freeze({
1342
+ code: "CC_COMPACTION_USAGE_UNKNOWN",
1343
+ reason:
1344
+ usageUnknownEvent.reason || "provider_transport_outcome_unknown",
1345
+ commitState: "provider-usage-unknown",
1346
+ usageOutcome: "unknown",
1347
+ }),
1348
+ };
1349
+ }
1350
+
1351
+ let usagePersistenceError = null;
1352
+ if (usageEvent) {
1353
+ addUsage(costStore, [usageEvent]);
1354
+ if (useJsonl && sessionId) {
1355
+ try {
1356
+ appendUsage(sessionId, {
1357
+ provider: usageEvent.provider,
1358
+ model: usageEvent.model,
1359
+ usage: usageEvent.usage,
1360
+ });
1361
+ } catch (error) {
1362
+ // The paid request is accounted in-memory exactly once. Never retry an
1363
+ // append whose durable commit state may be unknown.
1364
+ usagePersistenceError = error;
1365
+ }
1366
+ }
1367
+ }
1368
+
1369
+ const liveChanged =
1370
+ messages.length !== expectedMessages.length ||
1371
+ messages.some((message, index) => message !== expectedMessages[index]);
1372
+ if (liveChanged) {
1373
+ const error = new Error(
1374
+ "REPL messages changed while provider compaction was running",
1375
+ );
1376
+ error.code = "CC_COMPACTION_LOCAL_STATE_CHANGED";
1377
+ return { applied: false, error, usagePersistenceError };
1378
+ }
1379
+
1380
+ if (useJsonl && sessionId && stats?.strategy !== "none") {
1381
+ try {
1382
+ persistence.persist(sessionId, {
1383
+ ...stats,
1384
+ trigger: trigger || "manual",
1385
+ messages: compacted,
1386
+ });
1387
+ } catch (error) {
1388
+ return { applied: false, error, usagePersistenceError };
1389
+ }
1390
+ }
1391
+
1392
+ messages.length = 0;
1393
+ messages.push(...compacted);
1394
+ return { applied: true, usagePersistenceError };
1395
+ }
1396
+
1315
1397
  function validateRawReplReplayMessages(rebuiltMessages) {
1316
1398
  for (let index = 0; index < rebuiltMessages.length; index += 1) {
1317
1399
  const message = rebuiltMessages[index];
@@ -1972,6 +2054,7 @@ export function createReplMcpHostRuntimeManager(dependencies = {}) {
1972
2054
  recovery = null,
1973
2055
  recoveryError = null,
1974
2056
  verifiedRecovery = false,
2057
+ dispatchAdmission = null,
1975
2058
  } = {}) => {
1976
2059
  const bundle = adhocMcp?.mcpClient
1977
2060
  ? adhocMcp
@@ -1988,7 +2071,8 @@ export function createReplMcpHostRuntimeManager(dependencies = {}) {
1988
2071
  current.sessionId === sessionId &&
1989
2072
  current.persistent === persistLedger &&
1990
2073
  current.recovery === recovery &&
1991
- current.recoveryError === recoveryError
2074
+ current.recoveryError === recoveryError &&
2075
+ current.dispatchAdmission === dispatchAdmission
1992
2076
  ) {
1993
2077
  return current;
1994
2078
  }
@@ -2012,6 +2096,7 @@ export function createReplMcpHostRuntimeManager(dependencies = {}) {
2012
2096
  sink,
2013
2097
  recovery,
2014
2098
  recoveryError,
2099
+ ...(dispatchAdmission ? { dispatchAdmission } : {}),
2015
2100
  ...(sharedController ? { controller: sharedController } : {}),
2016
2101
  });
2017
2102
  const candidate = Object.freeze({
@@ -2027,6 +2112,7 @@ export function createReplMcpHostRuntimeManager(dependencies = {}) {
2027
2112
  persistent: persistLedger,
2028
2113
  recovery,
2029
2114
  recoveryError,
2115
+ dispatchAdmission,
2030
2116
  verifiedRecovery: Boolean(verifiedRecovery),
2031
2117
  });
2032
2118
  candidates.add(candidate);
@@ -2417,6 +2503,7 @@ async function startAgentReplInWorkspaceOwned(
2417
2503
  const _replCompactPersistence = createReplCompactPersistence(
2418
2504
  _startupJsonlResume?.ok ? _startupJsonlResume.rebuiltMessages : [],
2419
2505
  );
2506
+ let _compactionUsageBlock = null;
2420
2507
 
2421
2508
  try {
2422
2509
  const ctx = await bootstrap({ verbose: false });
@@ -2438,6 +2525,7 @@ async function startAgentReplInWorkspaceOwned(
2438
2525
  model,
2439
2526
  baseUrl,
2440
2527
  apiKey,
2528
+ signal: _sessionHostLeaseScope?.lease?.signal,
2441
2529
  enabledToolNames: [],
2442
2530
  extraToolDefinitions: [],
2443
2531
  maxOutputTokens: 2048,
@@ -3387,6 +3475,17 @@ async function startAgentReplInWorkspaceOwned(
3387
3475
  _persistReplContextSources();
3388
3476
 
3389
3477
  const _mcpHostRuntimeManager = createReplMcpHostRuntimeManager();
3478
+ const _mcpDispatchAdmission = (metadata, dispatch) => {
3479
+ const lease = _sessionHostLeaseScope?.lease || null;
3480
+ if (!lease || typeof lease.admitMcpDispatch !== "function") {
3481
+ const error = new Error(
3482
+ "REPL session host authority is unavailable for MCP dispatch",
3483
+ );
3484
+ error.code = "CC_SESSION_HOST_LEASE_FENCED";
3485
+ throw error;
3486
+ }
3487
+ return lease.admitMcpDispatch(metadata, dispatch);
3488
+ };
3390
3489
  const _mcpRuntimeInputs = ({
3391
3490
  targetSessionId = sessionId,
3392
3491
  recovery = _mcpLedgerRecovery,
@@ -3398,6 +3497,8 @@ async function startAgentReplInWorkspaceOwned(
3398
3497
  persistent: useJsonl && Boolean(targetSessionId),
3399
3498
  recovery,
3400
3499
  recoveryError,
3500
+ dispatchAdmission:
3501
+ useJsonl && _sessionHostLeaseScope ? _mcpDispatchAdmission : null,
3401
3502
  });
3402
3503
  const _activateMcpHostRuntime = () =>
3403
3504
  _mcpHostRuntimeManager.activate(_mcpRuntimeInputs());
@@ -5960,13 +6061,73 @@ async function startAgentReplInWorkspaceOwned(
5960
6061
  }
5961
6062
 
5962
6063
  if (trimmed === "/compact") {
6064
+ if (_compactionUsageBlock) {
6065
+ logger.error(
6066
+ `Compaction blocked (${_compactionUsageBlock.code}): ${_compactionUsageBlock.reason}`,
6067
+ );
6068
+ prompt();
6069
+ return;
6070
+ }
6071
+
6072
+ const expectedMessages = [...messages];
5963
6073
  if (_compressor && messages.length > 3) {
5964
- const { messages: compacted, stats } = await _compressor.compress(
6074
+ let result;
6075
+ try {
6076
+ result = await compactConversationWithProvider(messages, {
6077
+ compressor: _compressor,
6078
+ preserveCompletedExchange: true,
6079
+ ..._compactOpts(messages),
6080
+ });
6081
+ } catch (error) {
6082
+ if (
6083
+ isAbortError(error) ||
6084
+ _sessionHostLeaseScope?.lease?.signal?.aborted
6085
+ ) {
6086
+ throw error;
6087
+ }
6088
+ logger.error(`Compaction failed: ${error.message}`);
6089
+ prompt();
6090
+ return;
6091
+ }
6092
+ const {
6093
+ messages: compacted,
6094
+ stats,
6095
+ usageEvent,
6096
+ usageUnknownEvent,
6097
+ } = result;
6098
+ const settlement = settleReplCompactionCandidate({
5965
6099
  messages,
5966
- _compactOpts(messages),
5967
- );
5968
- messages.length = 0;
5969
- messages.push(...compacted);
6100
+ expectedMessages,
6101
+ compacted,
6102
+ stats,
6103
+ trigger: "manual",
6104
+ useJsonl,
6105
+ sessionId,
6106
+ persistence: _replCompactPersistence,
6107
+ usageEvent,
6108
+ usageUnknownEvent,
6109
+ costStore: _costStore,
6110
+ });
6111
+ if (settlement.usagePersistenceError) {
6112
+ logger.warn(
6113
+ `Compaction usage was counted locally but not durably persisted: ${settlement.usagePersistenceError.message}`,
6114
+ );
6115
+ }
6116
+ if (settlement.block) {
6117
+ _compactionUsageBlock = settlement.block;
6118
+ logger.error(
6119
+ `Compaction usage is unknown (${settlement.block.code}); the paid compaction will not be retried.`,
6120
+ );
6121
+ prompt();
6122
+ return;
6123
+ }
6124
+ if (!settlement.applied) {
6125
+ logger.warn(
6126
+ `Compaction was not applied: ${settlement.error?.message || "canonical settlement failed"}`,
6127
+ );
6128
+ prompt();
6129
+ return;
6130
+ }
5970
6131
  recordCompressionMetric(stats, {
5971
6132
  source: "manual-compact",
5972
6133
  provider,
@@ -5982,17 +6143,67 @@ async function startAgentReplInWorkspaceOwned(
5982
6143
  }
5983
6144
  } else if (contextEngine && messages.length > 5) {
5984
6145
  const compacted = contextEngine.smartCompact(messages);
5985
- messages.length = 0;
5986
- messages.push(...compacted);
5987
- logger.info(
5988
- `Compacted to ${messages.length} messages (importance-based)`,
5989
- );
6146
+ const originalTokens = estimateMessagesTokens(messages);
6147
+ const compressedTokens = estimateMessagesTokens(compacted);
6148
+ const settlement = settleReplCompactionCandidate({
6149
+ messages,
6150
+ expectedMessages,
6151
+ compacted,
6152
+ stats: {
6153
+ strategy: "importance",
6154
+ originalMessages: messages.length,
6155
+ compressedMessages: compacted.length,
6156
+ originalTokens,
6157
+ compressedTokens,
6158
+ saved: originalTokens - compressedTokens,
6159
+ ratio: originalTokens > 0 ? compressedTokens / originalTokens : 1,
6160
+ },
6161
+ trigger: "manual",
6162
+ useJsonl,
6163
+ sessionId,
6164
+ persistence: _replCompactPersistence,
6165
+ costStore: _costStore,
6166
+ });
6167
+ if (settlement.applied) {
6168
+ logger.info(
6169
+ `Compacted to ${messages.length} messages (importance-based)`,
6170
+ );
6171
+ } else {
6172
+ logger.warn(
6173
+ `Compaction was not applied: ${settlement.error?.message || "canonical settlement failed"}`,
6174
+ );
6175
+ }
5990
6176
  } else if (messages.length > 5) {
5991
6177
  const systemMsg = messages[0];
5992
6178
  const recent = messages.slice(-4);
5993
- messages.length = 0;
5994
- messages.push(systemMsg, ...recent);
5995
- logger.info("Compacted to last 4 messages");
6179
+ const compacted = [systemMsg, ...recent];
6180
+ const originalTokens = estimateMessagesTokens(messages);
6181
+ const compressedTokens = estimateMessagesTokens(compacted);
6182
+ const settlement = settleReplCompactionCandidate({
6183
+ messages,
6184
+ expectedMessages,
6185
+ compacted,
6186
+ stats: {
6187
+ strategy: "truncate",
6188
+ originalMessages: messages.length,
6189
+ compressedMessages: compacted.length,
6190
+ originalTokens,
6191
+ compressedTokens,
6192
+ saved: originalTokens - compressedTokens,
6193
+ ratio: originalTokens > 0 ? compressedTokens / originalTokens : 1,
6194
+ },
6195
+ trigger: "manual",
6196
+ useJsonl,
6197
+ sessionId,
6198
+ persistence: _replCompactPersistence,
6199
+ costStore: _costStore,
6200
+ });
6201
+ if (settlement.applied) logger.info("Compacted to last 4 messages");
6202
+ else {
6203
+ logger.warn(
6204
+ `Compaction was not applied: ${settlement.error?.message || "canonical settlement failed"}`,
6205
+ );
6206
+ }
5996
6207
  }
5997
6208
  prompt();
5998
6209
  return;
@@ -8212,6 +8423,8 @@ async function startAgentReplInWorkspaceOwned(
8212
8423
  // session has no durable sink. Otherwise an outcome-unknown call could
8213
8424
  // be retried in the same process after agent-core creates a plain ledger.
8214
8425
  mcpCallLedger: activeMcpRuntime.runtime.ledger,
8426
+ mcpDispatchAdmission:
8427
+ useJsonl && _sessionHostLeaseScope ? _mcpDispatchAdmission : null,
8215
8428
  chatFn: _fallbackChatFn,
8216
8429
  });
8217
8430
  _persistReplContextSources();
@@ -8427,39 +8640,73 @@ async function startAgentReplInWorkspaceOwned(
8427
8640
  if (
8428
8641
  feature("PROMPT_COMPRESSOR") &&
8429
8642
  _compressor &&
8643
+ !_compactionUsageBlock &&
8430
8644
  _compressor.shouldAutoCompact(messages)
8431
8645
  ) {
8432
8646
  try {
8433
- const { messages: compacted, stats } = await _compressor.compress(
8647
+ const expectedMessages = [...messages];
8648
+ const {
8649
+ messages: compacted,
8650
+ stats,
8651
+ usageEvent,
8652
+ usageUnknownEvent,
8653
+ } = await compactConversationWithProvider(messages, {
8654
+ compressor: _compressor,
8655
+ preserveCompletedExchange: true,
8656
+ ..._compactOpts(messages),
8657
+ });
8658
+ const settlement = settleReplCompactionCandidate({
8434
8659
  messages,
8435
- _compactOpts(messages),
8436
- );
8437
- messages.length = 0;
8438
- messages.push(...compacted);
8439
- recordCompressionMetric(stats, {
8440
- source: "auto-compact",
8441
- provider,
8442
- model: activeModel,
8660
+ expectedMessages,
8661
+ compacted,
8662
+ stats,
8663
+ trigger: "auto",
8664
+ useJsonl,
8665
+ sessionId,
8666
+ persistence: _replCompactPersistence,
8667
+ usageEvent,
8668
+ usageUnknownEvent,
8669
+ costStore: _costStore,
8443
8670
  });
8444
- if (stats.saved > 0) {
8445
- logger.verbose(
8446
- `Auto-compacted: ${stats.strategy} (saved ${stats.saved} tokens)`,
8671
+ if (settlement.usagePersistenceError) {
8672
+ logger.warn(
8673
+ `Auto-compaction usage was counted locally but not durably persisted: ${settlement.usagePersistenceError.message}`,
8447
8674
  );
8448
- if (stats.degraded === true) {
8449
- logger.warn(
8450
- `Auto-compaction degraded to ${stats.summaryMode}: ${stats.degradedReason}`,
8675
+ }
8676
+ if (settlement.block) {
8677
+ _compactionUsageBlock = settlement.block;
8678
+ logger.error(
8679
+ `Auto-compaction usage is unknown (${settlement.block.code}); the paid compaction will not be retried.`,
8680
+ );
8681
+ } else if (!settlement.applied) {
8682
+ logger.warn(
8683
+ `Auto-compaction was not applied: ${settlement.error?.message || "canonical settlement failed"}`,
8684
+ );
8685
+ } else {
8686
+ recordCompressionMetric(stats, {
8687
+ source: "auto-compact",
8688
+ provider,
8689
+ model: activeModel,
8690
+ });
8691
+ if (stats.saved > 0) {
8692
+ logger.verbose(
8693
+ `Auto-compacted: ${stats.strategy} (saved ${stats.saved} tokens)`,
8451
8694
  );
8452
- }
8453
- // Write compact checkpoint to JSONL for crash recovery
8454
- if (useJsonl && sessionId) {
8455
- _replCompactPersistence.persist(sessionId, {
8456
- ...stats,
8457
- messages: compacted,
8458
- });
8695
+ if (stats.degraded === true) {
8696
+ logger.warn(
8697
+ `Auto-compaction degraded to ${stats.summaryMode}: ${stats.degradedReason}`,
8698
+ );
8699
+ }
8459
8700
  }
8460
8701
  }
8461
- } catch (_e) {
8462
- logger.warn(`Auto-compaction failed: ${_e.message}`);
8702
+ } catch (error) {
8703
+ if (
8704
+ isAbortError(error) ||
8705
+ _sessionHostLeaseScope?.lease?.signal?.aborted
8706
+ ) {
8707
+ throw error;
8708
+ }
8709
+ logger.warn(`Auto-compaction failed: ${error.message}`);
8463
8710
  }
8464
8711
  }
8465
8712