chainlesschain 0.163.6 → 0.163.8

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 (234) hide show
  1. package/package.json +2 -1
  2. package/src/assets/web-panel/assets/{AIOps-DDIUofA8.js → AIOps-CavM7W3k.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-Bm-5xYRn.js → ActionButton-CUvZGabQ.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-D5UH4ljI.js → Analytics-DeBnWnbe.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-D_ifjOOP.js → AppLayout-DbI5kxvd.js} +4 -4
  6. package/src/assets/web-panel/assets/{Artifacts-BY1mXdC7.js → Artifacts-D93bigKm.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-Bujr4Ml3.js → Audit-CBNvfUZa.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-sioKSTcC.js → BackgroundAgents-CJLyh_YU.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-DDOAK8RK.js → Backup-D_0yoehD.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-CtCsVVke.js → BaseInput-TJxmbObW.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-DpNj0vnd.js → Chat-CE0dto1q.js} +5 -5
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZta3Ftr.js → ChatBubbleRenderer-CZ5-yYiD.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-DoHVNSXq.js → Checkbox-Ck1RVIVo.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DlVl7Qmv.js → Codegen-qpoyf6DK.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-GIqoPYty.js → Col-DUyPWjIE.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-CIAPEVji.js → Community-D_S1BemS.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-BN7JiI_h.js → Compact-BjxeK-Gc.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-CqUWCM9B.js → Compliance-Dd3CEJsu.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-A4iPp7A4.js → Cowork-B4QG7-ad.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-B2zeXXWb.js → Cron-BtZnids5.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BR2xmWr8.js → Crosschain-CHPfCBFD.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-BzFDjrIv.js → DID-DT8DCEOK.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-DKtDo3yA.js → Dashboard-COQab5_U.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-RNx43_YG.js → Dropdown-BY1PsQuU.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-SwMt4Rcy.js → EmailListRenderer-CsuAuaq3.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CsYebZ4X.js → FamilyGuardDashboard-BqpinD-j.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-BmRKvBTy.js → Federation-D0gkfQFv.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-CVxGTA-0.js → FormItemContext-BqgE-axK.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-x2iXpyB7.js → GenericCardRenderer-D0hJ2KvC.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-DfqbkiOP.js → Git-CmMB0uPY.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-RuHyyj5O.js → Governance-BnVEI0Dk.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-Bn7uZ7rI.js → Inference-YTAMihRP.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DlP7XefZ.js → KnowledgeGraph-0ax7VHop.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-BYNdOiCd.js → Logs-B9TRcokL.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-yySN5YNM.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-JQYmDqM8.js → Marketplace-B6CSuD_H.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-Cyx4yZ-9.js → McpTools-CjMXvOVU.js} +4 -4
  38. package/src/assets/web-panel/assets/{Memory-VDuGZTN2.js → Memory-CXRF71U3.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-_yKo97gi.js → MobileBridge-DQgNp_oS.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-CXRXW3q7.js → MobileProjects-DlPwcCbq.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-acTGtfLH.js → Mtc-6hDTRPe1.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-ClpjXfkY.js → MtcAudit-BlVHU1DS.js} +4 -4
  43. package/src/assets/web-panel/assets/{Multisig-_6Tn3o96.js → Multisig-DP9pzEbV.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-CK7pbZzP.js → NLProgramming-Djorh8EV.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-Czy6V_P8.js → Notes-oLZ-JkUg.js} +4 -4
  46. package/src/assets/web-panel/assets/{NotificationSettings-Cqx-UVv3.js → NotificationSettings-Cg288VH3.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-C69WDxGy.js → OrderTableRenderer-Bb1O3Ofr.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-DFnA9vLQ.js → Organization-CBdo-bHs.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-ReZkk2yT.js → Overflow-qZdnVumx.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-DzjSI0aI.js → P2P-D4kNfGNQ.js} +2 -2
  51. package/src/assets/web-panel/assets/PdhVaultBrowser-DnlMemM7.js +7 -0
  52. package/src/assets/web-panel/assets/{Permissions-DhQ5klhR.js → Permissions-DHucHFBJ.js} +3 -3
  53. package/src/assets/web-panel/assets/{PersonalDataHub-CUL1iHrW.js → PersonalDataHub-BovlOIPR.js} +4 -4
  54. package/src/assets/web-panel/assets/{Pipeline-DU88iu4N.js → Pipeline-Deru3CQY.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-Bw-sYfyK.js → Privacy-Bq5oTTbU.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-Bq3Q5y0z.js → ProjectInit-BfzxVWAz.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-C8spzpho.js → ProjectSettings-CKC6XBtH.js} +2 -2
  58. package/src/assets/web-panel/assets/Projects-CMolGhae.js +1 -0
  59. package/src/assets/web-panel/assets/{Providers-Bf4eTP9W.js → Providers-C_jx4TWX.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-Dme9BDU1.js → QrScannerModal-BdIHeVGC.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-CIXfv1rE.js → QuickAsk-BwZwAcPD.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-CIxvdeZ-.js → Recommend-BNTt0L-m.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-C6k7MExI.js → RemoteSession-Biyn2-Ro.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-CISDz2bl.js → Reputation-D6VpG32B.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-CdnDxXyf.js → Row-D_74OvQQ.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-C-QpRHsl.js → RssFeed-BTr0a-BQ.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-DBjaGzSn.js → Search-C3MCFoNU.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CQKukOeE.js → Security-CqW9aJ6s.js} +3 -3
  69. package/src/assets/web-panel/assets/{Services-DZz86jWb.js → Services-Cw5GNaHF.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-jb8RMK0d.js → Skeleton-DZps5qeY.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-CdY76fZG.js → Skills-C6NQ1znT.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-C_CSiZX9.js → Sla-DFP8G2Sh.js} +1 -1
  73. package/src/assets/web-panel/assets/SpeechSettings-ESt6MB6v.js +1 -0
  74. package/src/assets/web-panel/assets/{SyncSettings-qvimGO0O.js → SyncSettings-BHnN98aM.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-Dng5LPJC.js → Tasks-NiSCaOf-.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-Bwqq5Wll.js → Templates-DsKFhW2C.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-DNWuwP7Z.js → Tenant-CQ0E0ze5.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-B-6Othpp.js → Terminal-D_rBu_by.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-DKpKZfzx.js → TimelineRenderer-D3Vm4Po4.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-DzfGMd2J.js → Tokens-DNTxRH6q.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-BXwUi74J.js → Trigger-Dgprz1ms.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-BNzUq4ui.js → Trust-B2rUnVBD.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-BYugxww4.js → UkeySign-DEGQNc6_.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-DdauhtSJ.js → VideoEditing-jlsAx3Eh.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-CSC9bCe_.js → Wallet-8jQih1ij.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-Q8AN3bTO.js → WebAuthn-XLeO6xIB.js} +5 -5
  87. package/src/assets/web-panel/assets/{WorkflowEditor-d-LBGCuA.js → WorkflowEditor-De_dgDAG.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-BLVDCgsZ.js → chat-CI19R_Sk.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-BZlPSEHl.js → colors-DsYTOYN3.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-IWseP6R6.js → compact-item-CM3-t_Qr.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DnVRV3Ao.js → createContext-BjxlBRZv.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-S1ld2LwU.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-DLQZA_Wn.js → hasIn-RDaWX_4i.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-BSjilZ9L.js → index-9R6BxAr0.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-B_N4-Gq9.js → index-B-Z8eFUJ.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Dy0R5ZED.js → index-B0PMlbMs.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-C1ifZtXo.js → index-B5REnKt8.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CINJQEj6.js → index-B7WBt_4T.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DocEhinm.js → index-B9O9YyWE.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DjWnONdy.js → index-BCnZyIMA.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-hwVDeoC0.js → index-BGqqJfL0.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Bbj2NS_I.js → index-BHNYPO0b.js} +3 -3
  103. package/src/assets/web-panel/assets/{index-C5dgnilC.js → index-BKJr-TZp.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CT9vVN-X.js → index-BN6UPD2E.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DpVrK6fr.js → index-Bi46Xu4u.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CpBaJ3TD.js → index-BlT2VAEK.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-1jeAudHd.js → index-C0yx-jtQ.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DOoQpuQY.js → index-C4gkzxkw.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DZpYeqrh.js → index-CVQMeiwH.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BhA3QEni.js → index-Cd3euP_4.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-N_GoWZX4.js → index-Cd9OJhHG.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BOZJBTWZ.js → index-CiECJi-Q.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CarMTIyQ.js → index-CjTrRt13.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CZDekj7T.js → index-CnHH7bnD.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-M7wxfAbm.js → index-Cpqm1qfU.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Bxp7uDD8.js → index-CyOGN6a5.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DalA0TKC.js → index-D0zcy54x.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-COev0W2g.js → index-D6sm5-Xq.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DUq0c7gq.js → index-DIUnNOjG.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BZs5bBnk.js → index-DX7tuWVJ.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CbQNL0ue.js → index-DXXtGMUJ.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DTbxp4UH.js → index-DcPFB8qJ.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-YSw_gxlZ.js → index-DoQA0-52.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-D_LQodeJ.js → index-Drlnwr8F.js} +1 -1
  125. package/src/assets/web-panel/assets/index-Drz6yq0m.js +1 -0
  126. package/src/assets/web-panel/assets/{index-jWb70ZgZ.js → index-Dsij_KsN.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DB0MJgF_.js → index-Dxge-xWl.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BEu2lMBy.js → index-DyIWssPC.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-C2FqfMvU.js → index-IeiL9RKc.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Dkwsi1Kn.js → index-nAH87mQP.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-gt8bNefW.js → index-pPL66J85.js} +1 -1
  132. package/src/assets/web-panel/assets/index-uWiUs7S_.js +1 -0
  133. package/src/assets/web-panel/assets/{initDefaultProps-Co67Kqmb.js → initDefaultProps-BTL88of4.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-BMOxQSF_.js → motion-BUB2pXwB.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-C5fWDw-N.js → move-egCkkOMm.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-BJevpL0e.js → mtc-parser-DAWhZC8c.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-BCzNU8s6.js → omit-CvOxe_6d.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-CybWvDPk.js → pickAttrs-DZUSLZ5Z.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-BMWS9HnW.js → placementArrow-BERxGNMY.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-BoL2UnGY.js → responsiveObserve-DZuDfZ9n.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-DWNfXraU.js → slide-DO756sgI.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-BquTM3tX.js → statusUtils-BRQlIz28.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-BEkCleim.js → styleChecker-DCSfdybl.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-Oecnq7EA.js → useFlexGapSupport-LD8dWVve.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-CkDffJ4F.js → useFs-BX9uW2LK.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-qbvKXesB.js → usePersonalDataHub-BPSlPuHU.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-C6v8n6mA.js → vnode-BmOILC9V.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-4CTeFILV.js → zoom-1iKowKGg.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +5 -5
  151. package/src/commands/agent.js +90 -1
  152. package/src/commands/automation.js +103 -1
  153. package/src/commands/chat.js +11 -2
  154. package/src/commands/compact.js +106 -23
  155. package/src/commands/loop.js +28 -10
  156. package/src/commands/routine.js +1 -1
  157. package/src/commands/scheduler-daemon.js +359 -2
  158. package/src/commands/session-observability.js +305 -0
  159. package/src/commands/session.js +38 -0
  160. package/src/commands/team-merge-review.js +937 -0
  161. package/src/commands/team.js +2 -0
  162. package/src/data/changelog.json +27 -1
  163. package/src/gateways/ws/ws-agent-handler.js +439 -5
  164. package/src/harness/jsonl-session-store.js +463 -125
  165. package/src/harness/prompt-compressor.js +86 -13
  166. package/src/harness/provider-backed-compaction.js +100 -27
  167. package/src/lib/advisor-runtime.js +3 -1
  168. package/src/lib/agent-schedule-store.js +549 -28
  169. package/src/lib/agent-team/team-adjudication.js +40 -1
  170. package/src/lib/agent-team/team-merge-review-store.js +765 -0
  171. package/src/lib/agent-team/team-merge-review-transaction.js +1223 -0
  172. package/src/lib/agent-team/team-merge-review.js +1847 -0
  173. package/src/lib/automation-center-incidents.js +314 -0
  174. package/src/lib/automation-center-runtime.js +448 -0
  175. package/src/lib/automation-center.js +182 -38
  176. package/src/lib/automation-engine.js +535 -0
  177. package/src/lib/automation-execution-authority.js +241 -12
  178. package/src/lib/automation-execution-incident.js +737 -0
  179. package/src/lib/background-agent-supervisor.js +793 -215
  180. package/src/lib/background-command-argv.js +24 -0
  181. package/src/lib/background-interaction-journal.js +361 -52
  182. package/src/lib/background-interaction-resolver.js +32 -0
  183. package/src/lib/background-launch-profile.js +2 -0
  184. package/src/lib/causal-observability.js +2661 -0
  185. package/src/lib/chat-session-admission.js +76 -0
  186. package/src/lib/cost-budget.js +5 -7
  187. package/src/lib/cowork/ab-comparator-cli.js +11 -0
  188. package/src/lib/cowork/debate-review-cli.js +12 -0
  189. package/src/lib/cowork-adapter.js +159 -38
  190. package/src/lib/cowork-cron.js +442 -15
  191. package/src/lib/cowork-task-runner.js +112 -17
  192. package/src/lib/delivery-coordinator.js +142 -0
  193. package/src/lib/direct-model-usage.js +121 -0
  194. package/src/lib/file-lines.js +183 -47
  195. package/src/lib/llm-pricing.js +12 -17
  196. package/src/lib/loop.js +26 -2
  197. package/src/lib/routine-store.js +380 -21
  198. package/src/lib/runtime-usage-ledger.js +182 -0
  199. package/src/lib/scheduler-kernel/agenda-adapter.js +325 -10
  200. package/src/lib/scheduler-kernel/automation-adapter.js +514 -18
  201. package/src/lib/scheduler-kernel/automation-event-adapter.js +123 -11
  202. package/src/lib/scheduler-kernel/contract.js +91 -0
  203. package/src/lib/scheduler-kernel/cowork-cron-adapter.js +297 -4
  204. package/src/lib/scheduler-kernel/loop-adapter.js +547 -6
  205. package/src/lib/scheduler-kernel/migration-admin.js +346 -0
  206. package/src/lib/scheduler-kernel/migration-rollback-admin.js +932 -0
  207. package/src/lib/scheduler-kernel/routine-adapter.js +400 -20
  208. package/src/lib/scheduler-kernel/runtime-control-capabilities.js +31 -0
  209. package/src/lib/scheduler-kernel/runtime.js +237 -2
  210. package/src/lib/scheduler-kernel/source-locator-path.js +142 -0
  211. package/src/lib/scheduler-kernel/store.js +3957 -248
  212. package/src/lib/session-host-lease.js +171 -2
  213. package/src/lib/session-host-snapshot.js +14 -3
  214. package/src/lib/session-persistence-failure.js +1 -0
  215. package/src/lib/session-tail.js +179 -34
  216. package/src/lib/session-transcript-structure.js +96 -0
  217. package/src/lib/sub-agent-context.js +328 -22
  218. package/src/lib/ws-agent-handler.js +4 -1
  219. package/src/repl/agent-repl.js +732 -91
  220. package/src/repl/chat-repl.js +5 -1
  221. package/src/runtime/agent-core.js +1282 -207
  222. package/src/runtime/fallback-model.js +5 -0
  223. package/src/runtime/headless-runner.js +324 -82
  224. package/src/runtime/headless-stream.js +232 -26
  225. package/src/runtime/mcp-config.js +81 -10
  226. package/src/runtime/policies/agent-policy.js +4 -0
  227. package/src/workers/background-agent-worker.js +403 -96
  228. package/src/assets/web-panel/assets/MarkdownRenderer-aMtgN-R6.js +0 -1
  229. package/src/assets/web-panel/assets/PdhVaultBrowser-DKTf5xIP.js +0 -7
  230. package/src/assets/web-panel/assets/Projects-Dd-xuPIc.js +0 -1
  231. package/src/assets/web-panel/assets/SpeechSettings-C7tT9iad.js +0 -1
  232. package/src/assets/web-panel/assets/devWarning-Jzu62CLC.js +0 -1
  233. package/src/assets/web-panel/assets/index-Zb2MeDSy.js +0 -1
  234. package/src/assets/web-panel/assets/index-fikqml4k.js +0 -1
@@ -36,6 +36,7 @@ import {
36
36
  isUnsafeSessionId,
37
37
  readVerifiedEvents as readVerifiedSessionEvents,
38
38
  readVerifiedProjection as readVerifiedSessionProjection,
39
+ sessionHasPersistedEvidence,
39
40
  } from "../harness/jsonl-session-store.js";
40
41
 
41
42
  // ─── Dependencies (overridable for testing) ──────────────────────────────────
@@ -49,6 +50,7 @@ export const _deps = {
49
50
  appendSessionEventIfHead,
50
51
  readVerifiedSessionEvents,
51
52
  readVerifiedSessionProjection,
53
+ sessionHasPersistedEvidence,
52
54
  randomUUID,
53
55
  };
54
56
 
@@ -56,6 +58,91 @@ export const _deps = {
56
58
 
57
59
  const DEFAULT_MAX_ITERATIONS = 50;
58
60
  const DEFAULT_TOKEN_BUDGET = 100_000;
61
+ const COWORK_MCP_CALL_LEDGER_UNSUPPORTED =
62
+ "CC_COWORK_MCP_CALL_LEDGER_UNSUPPORTED";
63
+ const COWORK_MCP_SESSION_UNVERIFIED = "CC_COWORK_MCP_SESSION_UNVERIFIED";
64
+ const PROTECTED_USAGE_FIELDS = Object.freeze([
65
+ "observabilityScope",
66
+ "usageTelemetryProtocol",
67
+ "usageTelemetryVersion",
68
+ ]);
69
+
70
+ function coworkMcpAdmissionError(code, message, sessionId, cause = null) {
71
+ const error = new Error(message, cause ? { cause } : undefined);
72
+ error.code = code;
73
+ error.sessionId = sessionId;
74
+ return error;
75
+ }
76
+
77
+ function assertCoworkMcpEventUsageAdmission(event, sessionId) {
78
+ if (event?.type !== "session_start") return;
79
+ const data =
80
+ event.data && typeof event.data === "object" && !Array.isArray(event.data)
81
+ ? event.data
82
+ : {};
83
+ if (!PROTECTED_USAGE_FIELDS.some((field) => Object.hasOwn(data, field))) {
84
+ return;
85
+ }
86
+ throw coworkMcpAdmissionError(
87
+ COWORK_MCP_CALL_LEDGER_UNSUPPORTED,
88
+ "Scoped call-ledger sessions are not supported by Cowork MCP tasks; use agent mode or an IDE host with usage-ledger support",
89
+ sessionId,
90
+ );
91
+ }
92
+
93
+ function readCoworkMcpUsageAdmission(sessionId) {
94
+ return _deps.readVerifiedSessionProjection(sessionId, () => ({
95
+ accept(event) {
96
+ assertCoworkMcpEventUsageAdmission(event, sessionId);
97
+ },
98
+ finish() {
99
+ return true;
100
+ },
101
+ }));
102
+ }
103
+
104
+ /**
105
+ * An explicitly supplied MCP session can name an existing canonical JSONL
106
+ * authority. Verify it before mounting servers or starting a child model, and
107
+ * refuse protected usage transcripts until Cowork persists the call ledger.
108
+ */
109
+ export function assertCoworkMcpSessionUsageAdmission(sessionId) {
110
+ if (sessionId == null) return;
111
+ if (typeof sessionId !== "string" || isUnsafeSessionId(sessionId)) {
112
+ throw coworkMcpAdmissionError(
113
+ "CC_COWORK_MCP_SESSION_INVALID",
114
+ "Cowork MCP session id is invalid",
115
+ sessionId,
116
+ );
117
+ }
118
+
119
+ let hasEvidence;
120
+ try {
121
+ hasEvidence = _deps.sessionHasPersistedEvidence(sessionId);
122
+ } catch (cause) {
123
+ throw coworkMcpAdmissionError(
124
+ COWORK_MCP_SESSION_UNVERIFIED,
125
+ "Cowork MCP session authority could not be inspected; refusing to start a model or tool",
126
+ sessionId,
127
+ cause,
128
+ );
129
+ }
130
+ if (!hasEvidence) return;
131
+
132
+ try {
133
+ if (readCoworkMcpUsageAdmission(sessionId) !== true) {
134
+ throw new Error("verified usage-admission projection was bypassed");
135
+ }
136
+ } catch (cause) {
137
+ if (cause?.code === COWORK_MCP_CALL_LEDGER_UNSUPPORTED) throw cause;
138
+ throw coworkMcpAdmissionError(
139
+ COWORK_MCP_SESSION_UNVERIFIED,
140
+ "Cowork MCP session authority could not be verified; refusing to start a model or tool",
141
+ sessionId,
142
+ cause,
143
+ );
144
+ }
145
+ }
59
146
 
60
147
  function resolveCoworkMcpSessionId(requested) {
61
148
  if (requested != null) {
@@ -152,6 +239,7 @@ function createCoworkMcpRecoveryProjection(sessionId, templateId, onFinish) {
152
239
  throw error;
153
240
  }
154
241
  acceptedCount += 1;
242
+ assertCoworkMcpEventUsageAdmission(event, sessionId);
155
243
  assertCoworkMcpSessionBindingEvent(event, templateId);
156
244
  ledger.accept(event);
157
245
  },
@@ -343,24 +431,13 @@ export function prepareCoworkMcpRuntime(mcp, options = {}) {
343
431
  });
344
432
  }
345
433
  } catch (error) {
346
- recoveryNotice =
347
- "MCP recovery notice — the durable Cowork MCP ledger could not be read. " +
348
- "Do not execute or retry MCP tools until the session transcript has " +
349
- `been inspected (${error?.code || "CC_MCP_LEDGER_EVENT_READ_FAILED"}).`;
350
- recoveryState = publicMcpRecoveryState(
351
- null,
352
- "all",
353
- error?.code || "CC_MCP_LEDGER_EVENT_READ_FAILED",
434
+ if (error?.code === COWORK_MCP_CALL_LEDGER_UNSUPPORTED) throw error;
435
+ throw coworkMcpAdmissionError(
436
+ COWORK_MCP_SESSION_UNVERIFIED,
437
+ "Cowork MCP session authority could not be verified; refusing to start a model or tool",
438
+ sessionId,
439
+ error,
354
440
  );
355
- if (typeof options.onProgress === "function") {
356
- options.onProgress({
357
- type: "mcp-recovery",
358
- sessionId,
359
- unsettled: 0,
360
- incidents: 1,
361
- recovery: recoveryState,
362
- });
363
- }
364
441
  }
365
442
 
366
443
  const sink = createSessionMcpLedgerSink(
@@ -423,6 +500,10 @@ export async function runCoworkTask(options = {}) {
423
500
  throw new Error("userMessage is required");
424
501
  }
425
502
 
503
+ // An explicit canonical authority must be admitted before mounting local MCP
504
+ // servers, constructing a child context, or making any provider call.
505
+ assertCoworkMcpSessionUsageAdmission(mcpSessionId);
506
+
426
507
  // Validate file paths before starting
427
508
  if (files.length > 0) {
428
509
  const missing = files.filter((f) => !_deps.existsSync(f));
@@ -586,6 +667,7 @@ export async function runCoworkTask(options = {}) {
586
667
  * @param {object} options - Same as runCoworkTask, plus:
587
668
  * @param {number} [options.agents] - Number of parallel agents (default 3, max 10)
588
669
  * @param {string} [options.strategy] - Routing strategy (default "round-robin")
670
+ * @param {string} [options.mcpSessionId] - Canonical session authority to admit
589
671
  * @param {function} [options.onProgress] - Progress callback
590
672
  * @param {AbortSignal} [options.signal] - Cancellation signal
591
673
  * @returns {Promise<{ taskId: string, status: string, result: object }>}
@@ -600,12 +682,18 @@ export async function runCoworkTaskParallel(options = {}) {
600
682
  strategy,
601
683
  onProgress = null,
602
684
  signal = null,
685
+ mcpSessionId = null,
603
686
  } = options;
604
687
 
605
688
  if (!userMessage || typeof userMessage !== "string") {
606
689
  throw new Error("userMessage is required");
607
690
  }
608
691
 
692
+ // Parallel orchestration can make provider calls while decomposing and
693
+ // dispatching work. Apply the same canonical authority gate as sequential
694
+ // Cowork before constructing the orchestrator or starting any provider.
695
+ assertCoworkMcpSessionUsageAdmission(mcpSessionId);
696
+
609
697
  if (files.length > 0) {
610
698
  const missing = files.filter((f) => !_deps.existsSync(f));
611
699
  if (missing.length > 0) {
@@ -742,6 +830,7 @@ export async function runCoworkTaskParallel(options = {}) {
742
830
  * @param {string[]} [options.perspectives] - Override template perspectives
743
831
  * @param {string} [options.cwd] - Working directory for history
744
832
  * @param {object} [options.llmOptions] - LLM provider/model/key
833
+ * @param {string} [options.mcpSessionId] - Canonical session authority to admit
745
834
  * @param {function} [options.onProgress] - Progress callback
746
835
  * @returns {Promise<{ taskId, status, result }>}
747
836
  */
@@ -754,12 +843,18 @@ export async function runCoworkDebate(options = {}) {
754
843
  cwd = process.cwd(),
755
844
  llmOptions = {},
756
845
  onProgress = null,
846
+ mcpSessionId = null,
757
847
  } = options;
758
848
 
759
849
  if (!userMessage || typeof userMessage !== "string") {
760
850
  throw new Error("userMessage is required");
761
851
  }
762
852
 
853
+ // Debate performs multiple reviewer calls plus moderator synthesis. Refuse a
854
+ // protected or unverifiable authority before emitting progress or invoking
855
+ // the first reviewer, matching sequential and parallel Cowork admission.
856
+ assertCoworkMcpSessionUsageAdmission(mcpSessionId);
857
+
763
858
  if (files.length > 0) {
764
859
  const missing = files.filter((f) => !_deps.existsSync(f));
765
860
  if (missing.length > 0) {
@@ -66,7 +66,10 @@ const ACTION_TO_METHOD = Object.freeze({
66
66
 
67
67
  const EXACT_COMMIT_RE = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/i;
68
68
  const SHA256_RE = /^sha256:[0-9a-f]{64}$/i;
69
+ const TRANSCRIPT_HEAD_RE = /^[0-9a-f]{64}$/i;
69
70
  const DEFAULT_BLOCKING_SEVERITIES = Object.freeze(["Critical", "High"]);
71
+ const MAX_CAUSAL_ID_LENGTH = 256;
72
+ const MAX_CAUSAL_SESSIONS = 128;
70
73
 
71
74
  function hash(value) {
72
75
  return `sha256:${crypto
@@ -104,6 +107,126 @@ function boundedInteger(value, fallback, min, max) {
104
107
  : fallback;
105
108
  }
106
109
 
110
+ function hasAsciiControlCharacter(value) {
111
+ for (let index = 0; index < value.length; index++) {
112
+ const code = value.charCodeAt(index);
113
+ if (code <= 0x1f || code === 0x7f) return true;
114
+ }
115
+ return false;
116
+ }
117
+
118
+ function compareCodeUnits(left, right) {
119
+ return left < right ? -1 : left > right ? 1 : 0;
120
+ }
121
+
122
+ function normalizeCausalId(value, field, { required = false } = {}) {
123
+ if (value == null) {
124
+ if (required) throw new Error(`${field} is required`);
125
+ return null;
126
+ }
127
+ if (typeof value !== "string") throw new Error(`${field} must be a string`);
128
+ const normalized = value.trim();
129
+ if (!normalized) {
130
+ if (required) throw new Error(`${field} is required`);
131
+ throw new Error(`${field} must not be blank`);
132
+ }
133
+ if (
134
+ normalized.length > MAX_CAUSAL_ID_LENGTH ||
135
+ hasAsciiControlCharacter(normalized)
136
+ ) {
137
+ throw new Error(`${field} is invalid`);
138
+ }
139
+ return normalized;
140
+ }
141
+
142
+ function normalizeCausality(value) {
143
+ if (value != null && (typeof value !== "object" || Array.isArray(value))) {
144
+ throw new Error("causality must be an object");
145
+ }
146
+ const source = value || {};
147
+ if (Object.hasOwn(source, "sessionIds")) {
148
+ throw new Error(
149
+ "causality.sessionIds is unsupported; bind sessions with headHash and eventCount",
150
+ );
151
+ }
152
+ if (
153
+ source.scope != null &&
154
+ (typeof source.scope !== "object" || Array.isArray(source.scope))
155
+ ) {
156
+ throw new Error("causality.scope must be an object");
157
+ }
158
+ if (source.sessions != null && !Array.isArray(source.sessions)) {
159
+ throw new Error("causality.sessions must be an array");
160
+ }
161
+ const scope = source.scope || {};
162
+ if ((source.sessions || []).length > MAX_CAUSAL_SESSIONS) {
163
+ throw new Error(
164
+ `causality.sessions exceeds the ${MAX_CAUSAL_SESSIONS} session limit`,
165
+ );
166
+ }
167
+ const sessions = (source.sessions || [])
168
+ .map((binding) => {
169
+ if (!binding || typeof binding !== "object" || Array.isArray(binding)) {
170
+ throw new Error("causality.sessions entries must be objects");
171
+ }
172
+ const sessionId = normalizeCausalId(
173
+ binding.sessionId,
174
+ "causality.sessions.sessionId",
175
+ { required: true },
176
+ );
177
+ if (
178
+ sessionId.includes("/") ||
179
+ sessionId.includes("\\") ||
180
+ sessionId.includes("..")
181
+ ) {
182
+ throw new Error("causality.sessions.sessionId is unsafe");
183
+ }
184
+ const headHash = String(binding.headHash || "").toLowerCase();
185
+ if (!TRANSCRIPT_HEAD_RE.test(headHash)) {
186
+ throw new Error("causality.sessions.headHash is invalid");
187
+ }
188
+ const eventCount = Number(binding.eventCount);
189
+ if (!Number.isSafeInteger(eventCount) || eventCount <= 0) {
190
+ throw new Error(
191
+ "causality.sessions.eventCount must be a positive safe integer",
192
+ );
193
+ }
194
+ return { sessionId, headHash, eventCount };
195
+ })
196
+ .sort((a, b) => compareCodeUnits(a.sessionId, b.sessionId));
197
+ if (
198
+ new Set(sessions.map((binding) => binding.sessionId)).size !==
199
+ sessions.length
200
+ ) {
201
+ throw new Error("causality.sessions contains duplicate sessionId values");
202
+ }
203
+ const normalizedScope = {
204
+ workspaceId: normalizeCausalId(
205
+ scope.workspaceId,
206
+ "causality.scope.workspaceId",
207
+ ),
208
+ teamId: normalizeCausalId(scope.teamId, "causality.scope.teamId"),
209
+ policyId: normalizeCausalId(scope.policyId, "causality.scope.policyId"),
210
+ };
211
+ if (
212
+ sessions.length > 0 &&
213
+ !Object.values(normalizedScope).some((scopeId) => scopeId != null)
214
+ ) {
215
+ throw new Error(
216
+ "causality.scope requires at least one dimension when sessions are bound",
217
+ );
218
+ }
219
+ return { scope: normalizedScope, sessions };
220
+ }
221
+
222
+ function hasCausality(causality) {
223
+ return Boolean(
224
+ causality &&
225
+ (causality.sessions.length > 0 ||
226
+ Object.values(causality.scope).some((value) => value != null)),
227
+ );
228
+ }
229
+
107
230
  function stateMaterial(state) {
108
231
  const material = jsonClone(state);
109
232
  delete material.stateDigest;
@@ -533,6 +656,19 @@ export function verifyDeliveryFlowState(snapshot) {
533
656
  unmet.push("schema-unsupported");
534
657
  if (snapshot.version !== DELIVERY_FLOW_VERSION)
535
658
  unmet.push("version-unsupported");
659
+ if (Object.hasOwn(snapshot, "causality")) {
660
+ try {
661
+ const normalized = normalizeCausality(snapshot.causality);
662
+ if (
663
+ canonicalDeliveryJson(normalized) !==
664
+ canonicalDeliveryJson(snapshot.causality)
665
+ ) {
666
+ unmet.push("causality-noncanonical");
667
+ }
668
+ } catch {
669
+ unmet.push("causality-invalid");
670
+ }
671
+ }
536
672
  const actualDigest = String(snapshot.stateDigest || "");
537
673
  const expectedDigest = hash(stateMaterial(snapshot));
538
674
  if (!actualDigest || actualDigest !== expectedDigest) {
@@ -580,6 +716,10 @@ export function restoreDeliveryFlow(snapshot) {
580
716
  export function createDeliveryFlow(config = {}, { now } = {}) {
581
717
  const createdAt = isoNow(now);
582
718
  const requiredGates = normalizeGateDefinitions(config.requiredGates);
719
+ const normalizedCausality = normalizeCausality(config.causality);
720
+ const causality = hasCausality(normalizedCausality)
721
+ ? normalizedCausality
722
+ : null;
583
723
  const gateSelection = selectImpactedGates({
584
724
  changedFiles: config.diff?.changedFiles || config.changedFiles,
585
725
  requiredGates: requiredGates.map((gate) => ({
@@ -646,6 +786,7 @@ export function createDeliveryFlow(config = {}, { now } = {}) {
646
786
  commitSha: config.commitSha,
647
787
  diff: config.diff,
648
788
  requiredGateIds: requiredGates.map((gate) => gate.id),
789
+ ...(causality ? { causality } : {}),
649
790
  };
650
791
  const state = {
651
792
  schema: DELIVERY_FLOW_SCHEMA,
@@ -661,6 +802,7 @@ export function createDeliveryFlow(config = {}, { now } = {}) {
661
802
  stopReason: preflightReason,
662
803
  preflightUnmet,
663
804
  commitSha,
805
+ ...(causality ? { causality } : {}),
664
806
  diff: jsonClone(config.diff || {}),
665
807
  environment: jsonClone(config.environment || {}),
666
808
  requiredGates,
@@ -0,0 +1,121 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import {
3
+ markRuntimeLedgerPersistenceError,
4
+ projectRuntimeTokenUsage,
5
+ projectRuntimeUsageBoundary,
6
+ runtimeUsageEventType,
7
+ } from "./runtime-usage-ledger.js";
8
+
9
+ function asRuntimeLedgerPersistenceError(error) {
10
+ if (error && (typeof error === "object" || typeof error === "function")) {
11
+ try {
12
+ const marked = markRuntimeLedgerPersistenceError(error);
13
+ if (marked?.runtimeLedgerPersistence === true) return marked;
14
+ } catch {
15
+ // Frozen/non-extensible errors are wrapped below.
16
+ }
17
+ }
18
+ const wrapped = new Error("runtime usage ledger persistence failed", {
19
+ cause: error,
20
+ });
21
+ return markRuntimeLedgerPersistenceError(wrapped);
22
+ }
23
+
24
+ async function persistUsageEvent(persist, type, event) {
25
+ try {
26
+ await persist(type, event);
27
+ } catch (error) {
28
+ throw asRuntimeLedgerPersistenceError(error);
29
+ }
30
+ }
31
+
32
+ function unknownUsageEvent({ callId, provider, model, source, code }) {
33
+ return projectRuntimeUsageBoundary(
34
+ { callId, provider, model, source, code },
35
+ "unknown",
36
+ );
37
+ }
38
+
39
+ /**
40
+ * Meter one direct provider call that runs outside agentLoop. The started row is
41
+ * durable before the callback resumes into provider work; every outcome then
42
+ * settles known or unknown without persisting prompts, responses, or errors.
43
+ */
44
+ export async function runMeteredDirectModelCall({
45
+ sessionId,
46
+ persist,
47
+ provider,
48
+ model,
49
+ source = "model",
50
+ call,
51
+ }) {
52
+ if (typeof call !== "function") {
53
+ throw new TypeError("metered direct model call requires a callback");
54
+ }
55
+ if (!sessionId) return call();
56
+ if (typeof persist !== "function") {
57
+ throw new TypeError("metered direct model call requires persistence");
58
+ }
59
+ const callId = `direct-${randomUUID()}`;
60
+ await persistUsageEvent(
61
+ persist,
62
+ runtimeUsageEventType("started"),
63
+ projectRuntimeUsageBoundary({ callId, provider, model, source }, "started"),
64
+ );
65
+ let result;
66
+ try {
67
+ result = await call();
68
+ } catch (error) {
69
+ await persistUsageEvent(
70
+ persist,
71
+ runtimeUsageEventType("unknown"),
72
+ unknownUsageEvent({
73
+ callId,
74
+ provider,
75
+ model,
76
+ source,
77
+ code: "provider_call_failed",
78
+ }),
79
+ );
80
+ throw error;
81
+ }
82
+ if (result?.usage && typeof result.usage === "object") {
83
+ let event;
84
+ try {
85
+ event = projectRuntimeTokenUsage({
86
+ callId,
87
+ provider,
88
+ model,
89
+ source,
90
+ usage: result.usage,
91
+ });
92
+ } catch {
93
+ await persistUsageEvent(
94
+ persist,
95
+ runtimeUsageEventType("unknown"),
96
+ unknownUsageEvent({
97
+ callId,
98
+ provider,
99
+ model,
100
+ source,
101
+ code: "provider_usage_missing",
102
+ }),
103
+ );
104
+ return result;
105
+ }
106
+ await persistUsageEvent(persist, "token_usage", event);
107
+ } else {
108
+ await persistUsageEvent(
109
+ persist,
110
+ runtimeUsageEventType("unknown"),
111
+ unknownUsageEvent({
112
+ callId,
113
+ provider,
114
+ model,
115
+ source,
116
+ code: "provider_usage_missing",
117
+ }),
118
+ );
119
+ }
120
+ return result;
121
+ }