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
@@ -11,6 +11,7 @@
11
11
 
12
12
  import { createHash } from "node:crypto";
13
13
  import { feature, featureVariant } from "../lib/feature-flags.js";
14
+ import { isAbortError } from "../lib/abort-utils.js";
14
15
  import {
15
16
  DURABLE_SYSTEM_MESSAGE_KINDS,
16
17
  getDurableSystemMessageProvenance,
@@ -566,6 +567,8 @@ export class PromptCompressor {
566
567
  let degradedReason = null;
567
568
  let rawSummary;
568
569
  let summaryUsage = null;
570
+ let summaryUsageUnknown = false;
571
+ let summaryUsageUnknownReason = null;
569
572
  let summaryProvider = null;
570
573
  let summaryModel = null;
571
574
  try {
@@ -592,6 +595,12 @@ export class PromptCompressor {
592
595
  usage.cache_creation_tokens,
593
596
  ) || 0,
594
597
  };
598
+ } else if (queryResult.usageOutcome !== "not-billable") {
599
+ // Standard provider adapters return an explicit `usage` field. A
600
+ // successful response without it is still a paid call whose amount
601
+ // is unknown; never let a hard budget silently count it as zero.
602
+ summaryUsageUnknown = true;
603
+ summaryUsageUnknownReason = "provider_usage_not_reported";
595
604
  }
596
605
  summaryProvider = queryResult.provider || null;
597
606
  summaryModel = queryResult.model || null;
@@ -599,9 +608,18 @@ export class PromptCompressor {
599
608
  rawSummary = queryResult;
600
609
  }
601
610
  } catch (error) {
611
+ // Cancellation is authoritative. Treating AbortError as an ordinary
612
+ // provider failure would manufacture an extractive summary after Stop and
613
+ // let callers apply/persist it even though the operation was cancelled.
614
+ if (isAbortError(error)) throw error;
602
615
  degraded = true;
603
616
  summaryMode = "extractive-fallback";
604
617
  degradedReason = `llm_query_failed:${boundedFailureMessage(error)}`;
618
+ // A transport exception does not prove that the provider rejected the
619
+ // request before billing it. Keep that uncertainty explicit so a hard
620
+ // budget can latch instead of silently accounting the call as $0.
621
+ summaryUsageUnknown = true;
622
+ summaryUsageUnknownReason = "provider_transport_outcome_unknown";
605
623
  }
606
624
  if (!degraded) {
607
625
  try {
@@ -644,6 +662,12 @@ export class PromptCompressor {
644
662
  summaryInputChars: prompt.length,
645
663
  summaryInputLimit: this.summaryInputMaxChars,
646
664
  ...(summaryUsage ? { summaryUsage } : {}),
665
+ ...(summaryUsageUnknown
666
+ ? {
667
+ summaryUsageUnknown: true,
668
+ summaryUsageUnknownReason,
669
+ }
670
+ : {}),
647
671
  ...(summaryProvider ? { summaryProvider } : {}),
648
672
  ...(summaryModel ? { summaryModel } : {}),
649
673
  },
@@ -0,0 +1,205 @@
1
+ import {
2
+ estimateMessagesTokens,
3
+ PromptCompressor,
4
+ sanitizeToolPairs,
5
+ } from "./prompt-compressor.js";
6
+
7
+ const DEFAULT_MAX_OUTPUT_TOKENS = 2048;
8
+ const MIN_MAX_OUTPUT_TOKENS = 256;
9
+ const MAX_MAX_OUTPUT_TOKENS = 4096;
10
+ const MANUAL_MAX_MESSAGES = 4;
11
+
12
+ function boundedMaxOutputTokens(value) {
13
+ const parsed = Math.trunc(Number(value));
14
+ if (!Number.isFinite(parsed) || parsed <= 0) {
15
+ return DEFAULT_MAX_OUTPUT_TOKENS;
16
+ }
17
+ return Math.min(
18
+ MAX_MAX_OUTPUT_TOKENS,
19
+ Math.max(MIN_MAX_OUTPUT_TOKENS, parsed),
20
+ );
21
+ }
22
+
23
+ function tokenCount(value) {
24
+ const parsed = Number(value);
25
+ return Number.isFinite(parsed) && parsed > 0 ? Math.trunc(parsed) : 0;
26
+ }
27
+
28
+ function responseSummary(response) {
29
+ if (typeof response === "string") return response;
30
+ return response?.message?.content ?? response?.content ?? "";
31
+ }
32
+
33
+ function preserveCompletedExchange(originalMessages, compactedMessages) {
34
+ if (originalMessages.at(-1)?.role === "user") return compactedMessages;
35
+ let lastUserIndex = -1;
36
+ for (let index = originalMessages.length - 1; index >= 0; index -= 1) {
37
+ if (originalMessages[index]?.role === "user") {
38
+ lastUserIndex = index;
39
+ break;
40
+ }
41
+ }
42
+ if (lastUserIndex < 0) return compactedMessages;
43
+
44
+ const completedExchange = originalMessages.slice(lastUserIndex);
45
+ const exchangeMessages = new Set(completedExchange);
46
+ const prefix = compactedMessages.filter(
47
+ (message) => !exchangeMessages.has(message),
48
+ );
49
+ return sanitizeToolPairs([...prefix, ...completedExchange]);
50
+ }
51
+
52
+ /**
53
+ * Convert PromptCompressor's provider-neutral summary accounting into the
54
+ * token-usage wire shape shared by the agent hosts.
55
+ */
56
+ export function compactionTokenUsage(stats) {
57
+ const usage = stats?.summaryUsage;
58
+ if (!usage || typeof usage !== "object") return null;
59
+ return {
60
+ input_tokens: tokenCount(usage.inputTokens),
61
+ output_tokens: tokenCount(usage.outputTokens),
62
+ cache_read_input_tokens: tokenCount(usage.cacheReadTokens),
63
+ cache_creation_input_tokens: tokenCount(usage.cacheCreationTokens),
64
+ };
65
+ }
66
+
67
+ /**
68
+ * Build one provider-backed semantic compaction operation.
69
+ *
70
+ * The provider request is deliberately tool-free. A missing provider adapter,
71
+ * transport error, or malformed summary is handled by PromptCompressor's
72
+ * structured extractive handoff, so every host gets the same safe degradation
73
+ * contract instead of falling back to positional truncation.
74
+ */
75
+ export async function compactConversationWithProvider(messages, options = {}) {
76
+ const originalMessages = Array.isArray(messages) ? [...messages] : [];
77
+ const provider = options.provider || null;
78
+ const model = options.model || null;
79
+ const maxOutputTokens = boundedMaxOutputTokens(options.maxOutputTokens);
80
+ const chatFn = options.chatFn;
81
+ const llmQuery =
82
+ typeof options.llmQuery === "function"
83
+ ? options.llmQuery
84
+ : async (prompt) => {
85
+ if (typeof chatFn !== "function") {
86
+ throw new Error("provider adapter unavailable");
87
+ }
88
+ const response = await chatFn([{ role: "user", content: prompt }], {
89
+ ...(options.chatOptions || {}),
90
+ provider,
91
+ model,
92
+ baseUrl: options.baseUrl,
93
+ apiKey: options.apiKey,
94
+ signal: options.signal,
95
+ contextEngine: null,
96
+ enabledToolNames: [],
97
+ extraToolDefinitions: [],
98
+ hostManagedToolPolicy: null,
99
+ onToken: undefined,
100
+ onStall: undefined,
101
+ onStreamRetry: undefined,
102
+ maxOutputTokens,
103
+ });
104
+ return {
105
+ summary: responseSummary(response),
106
+ usage: response?.usage || null,
107
+ provider,
108
+ model,
109
+ };
110
+ };
111
+
112
+ const compressor =
113
+ options.compressor ||
114
+ new PromptCompressor({
115
+ model,
116
+ provider,
117
+ llmQuery,
118
+ ...(options.force === true
119
+ ? { maxMessages: options.maxMessages || MANUAL_MAX_MESSAGES }
120
+ : options.maxMessages
121
+ ? { maxMessages: options.maxMessages }
122
+ : {}),
123
+ ...(options.maxTokens ? { maxTokens: options.maxTokens } : {}),
124
+ summaryInputMaxChars: options.summaryInputMaxChars,
125
+ });
126
+ if (
127
+ options.onlyIfNeeded === true &&
128
+ !compressor.shouldAutoCompact(originalMessages)
129
+ ) {
130
+ const originalTokens = estimateMessagesTokens(originalMessages);
131
+ return {
132
+ messages: originalMessages,
133
+ stats: {
134
+ strategy: "none",
135
+ originalMessages: originalMessages.length,
136
+ compressedMessages: originalMessages.length,
137
+ originalTokens,
138
+ compressedTokens: originalTokens,
139
+ saved: 0,
140
+ ratio: 1,
141
+ trimmed: 0,
142
+ },
143
+ degradedEvent: null,
144
+ usageEvent: null,
145
+ usageUnknownEvent: null,
146
+ };
147
+ }
148
+ const result = await compressor.compress(originalMessages, {
149
+ preserveToolPairs: true,
150
+ ...(typeof options.isPinned === "function"
151
+ ? { isPinned: options.isPinned }
152
+ : {}),
153
+ });
154
+ const compactedMessages =
155
+ options.preserveCompletedExchange === true
156
+ ? preserveCompletedExchange(originalMessages, result.messages)
157
+ : result.messages;
158
+ const originalTokens = estimateMessagesTokens(originalMessages);
159
+ const compressedTokens = estimateMessagesTokens(compactedMessages);
160
+ const stats = {
161
+ ...result.stats,
162
+ originalMessages: originalMessages.length,
163
+ compressedMessages: compactedMessages.length,
164
+ originalTokens,
165
+ compressedTokens,
166
+ saved: originalTokens - compressedTokens,
167
+ ratio: originalTokens > 0 ? compressedTokens / originalTokens : 1,
168
+ trimmed: Math.max(0, originalMessages.length - compactedMessages.length),
169
+ };
170
+ const usage = compactionTokenUsage(stats);
171
+ const usageUnknownEvent =
172
+ stats.summaryUsageUnknown === true
173
+ ? {
174
+ provider: stats.summaryProvider || provider,
175
+ model: stats.summaryModel || model,
176
+ source: "semantic-compaction",
177
+ reason:
178
+ stats.summaryUsageUnknownReason ||
179
+ "provider_transport_outcome_unknown",
180
+ usageOutcome: "unknown",
181
+ }
182
+ : null;
183
+
184
+ return {
185
+ messages: compactedMessages,
186
+ stats,
187
+ degradedEvent:
188
+ stats.degraded === true
189
+ ? {
190
+ reason: stats.degradedReason || "semantic-summary-degraded",
191
+ summaryMode: stats.summaryMode || "extractive-fallback",
192
+ stats,
193
+ }
194
+ : null,
195
+ usageEvent: usage
196
+ ? {
197
+ provider: stats.summaryProvider || provider,
198
+ model: stats.summaryModel || model,
199
+ usage,
200
+ source: "semantic-compaction",
201
+ }
202
+ : null,
203
+ usageUnknownEvent,
204
+ };
205
+ }
@@ -9,7 +9,9 @@
9
9
 
10
10
  import {
11
11
  existsSync,
12
+ appendFileSync,
12
13
  lstatSync,
14
+ readFileSync,
13
15
  realpathSync,
14
16
  rmdirSync,
15
17
  symlinkSync,
@@ -97,17 +99,36 @@ function gitRepositoryIdentity(repoDir) {
97
99
  const absoluteCommonDir = isAbsolute(commonDir)
98
100
  ? commonDir
99
101
  : resolve(repoDir, commonDir);
102
+ const commonDirPath = canonicalExistingPrefixPath(absoluteCommonDir);
100
103
  return {
101
104
  topLevel,
102
105
  topLevelIdentity: normalizeFilesystemPath(
103
106
  canonicalExistingPrefixPath(topLevel),
104
107
  ),
105
- commonDirIdentity: normalizeFilesystemPath(
106
- canonicalExistingPrefixPath(absoluteCommonDir),
107
- ),
108
+ commonDirPath,
109
+ commonDirIdentity: normalizeFilesystemPath(commonDirPath),
108
110
  };
109
111
  }
110
112
 
113
+ function ensureManagedWorktreeExcluded(context) {
114
+ const infoDir = resolve(context.repository.commonDirPath, "info");
115
+ const excludeFile = resolve(infoDir, "exclude");
116
+ mkdirSync(infoDir, { recursive: true });
117
+ try {
118
+ assertNotSymlink(infoDir, "git info directory");
119
+ assertNotSymlink(excludeFile, "git exclude file");
120
+ } catch (error) {
121
+ if (error?.code !== "ENOENT") throw error;
122
+ }
123
+ const pattern = `/${WORKTREE_DIR}/`;
124
+ const current = existsSync(excludeFile)
125
+ ? readFileSync(excludeFile, "utf8")
126
+ : "";
127
+ if (current.split(/\r?\n/).includes(pattern)) return;
128
+ const separator = current.length > 0 && !/\r?\n$/.test(current) ? "\n" : "";
129
+ appendFileSync(excludeFile, `${separator}${pattern}\n`, "utf8");
130
+ }
131
+
111
132
  function assertSameGitRepository(repoDir, expectedCommonDir, expectedRoot) {
112
133
  const identity = gitRepositoryIdentity(repoDir);
113
134
  if (
@@ -381,6 +402,8 @@ export function createWorktree(repoDir, branchName, baseBranch, options = {}) {
381
402
  throw new Error("Not a git repository");
382
403
  }
383
404
 
405
+ const context = repositoryManagementContext(repoDir);
406
+ ensureManagedWorktreeExcluded(context);
384
407
  const worktreePath = assertManagedWorktreePath(
385
408
  repoDir,
386
409
  managedWorktreePath(repoDir, branchName),
@@ -164,18 +164,57 @@ function removeVerifiedAgentWorktree(info, deps, expectedBranchOid) {
164
164
  export function setupAgentWorktree({
165
165
  cwd = process.cwd(),
166
166
  now = new Date(),
167
+ requireCleanSource = false,
167
168
  deps = _deps,
168
169
  } = {}) {
169
170
  const repoRoot = findProjectRoot(cwd);
170
171
  if (!repoRoot) {
171
172
  throw new Error("--worktree requires running inside a git repository");
172
173
  }
174
+ if (requireCleanSource) {
175
+ const status = git(
176
+ [
177
+ "status",
178
+ "--porcelain=v1",
179
+ "--untracked-files=all",
180
+ "--ignore-submodules=none",
181
+ "--",
182
+ ".",
183
+ ":(exclude).worktrees",
184
+ ],
185
+ repoRoot,
186
+ deps,
187
+ ).trim();
188
+ if (status) {
189
+ throw new Error(
190
+ "Background worktree isolation requires a clean source checkout; commit/stash the current changes or pass --no-worktree explicitly.",
191
+ );
192
+ }
193
+ }
173
194
  const stamp = now.toISOString().slice(0, 19).replace(/[-:T]/g, "");
174
195
  const suffix = Math.random().toString(36).slice(2, 6);
175
196
  const branch = `cc-agent-${stamp}-${suffix}`;
176
197
  const info = (deps.createWorktree || createWorktree)(repoRoot, branch);
177
- const baseSha = git(["rev-parse", "HEAD"], info.path, deps).trim();
178
- return { ...info, repoRoot, baseSha };
198
+ try {
199
+ const baseSha = git(["rev-parse", "HEAD"], info.path, deps).trim();
200
+ return { ...info, repoRoot, baseSha };
201
+ } catch (error) {
202
+ // createWorktree is transactional internally, but ownership has already
203
+ // transferred to this wrapper when the follow-up base-SHA query runs. Roll
204
+ // that partial setup back here so callers never receive `_worktree = null`
205
+ // while a branch and linked checkout have already been created.
206
+ try {
207
+ (deps.removeWorktree || removeWorktree)(repoRoot, info.path, {
208
+ deleteBranch: true,
209
+ branchName: branch,
210
+ force: false,
211
+ });
212
+ } catch (cleanupError) {
213
+ error.retainedWorktree = { ...info, repoRoot, branch };
214
+ error.worktreeCleanupError = cleanupError;
215
+ }
216
+ throw error;
217
+ }
179
218
  }
180
219
 
181
220
  /**
@@ -311,6 +311,9 @@ export function buildEvidenceArtifact(kind, data = {}) {
311
311
  ...base,
312
312
  // The image bytes/path are opaque to this layer; only metadata here.
313
313
  ref: d.ref == null ? null : String(d.ref),
314
+ digest: /^sha256:[0-9a-f]{64}$/iu.test(String(d.digest || ""))
315
+ ? String(d.digest).toLowerCase()
316
+ : null,
314
317
  width: Number.isFinite(Number(d.width)) ? Number(d.width) : null,
315
318
  height: Number.isFinite(Number(d.height)) ? Number(d.height) : null,
316
319
  };