chainlesschain 0.163.5 → 0.163.7

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 (236) hide show
  1. package/completions/_cc +1 -1
  2. package/completions/cc.bash +1 -1
  3. package/completions/cc.fish +1 -1
  4. package/completions/cc.ps1 +1 -1
  5. package/package.json +1 -1
  6. package/src/assets/web-panel/assets/{AIOps-Cv2EE1Zy.js → AIOps-axqQfwv8.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-CcpxMLuW.js → ActionButton-DV-Ro0By.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-DE8mJoMI.js → Analytics-Bt72WEVu.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-DKn9dk9L.js → AppLayout-BtepG55E.js} +5 -5
  10. package/src/assets/web-panel/assets/{Artifacts-Cp3mG3Py.js → Artifacts-B7KaJ7S_.js} +1 -1
  11. package/src/assets/web-panel/assets/{Audit-zvsQfF2C.js → Audit-FNFaUg7A.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-Bi85SsjN.js → BackgroundAgents-DFb6J2wQ.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-Cw47Dj6s.js → Backup-CC7YBhyj.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-C5Ip2afH.js → BaseInput-RkgTNVtj.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-C0iAFkJv.js → Chat-hHEmGZy-.js} +5 -5
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BV9Wv7wO.js → ChatBubbleRenderer-CAP9YhHv.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-3KZZCiAF.js → Checkbox-z5wXOQP1.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-C8OMbBAz.js → Codegen-DVaDJnxy.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-B-MB84LJ.js → Col-CJmaRDR5.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-DpR7Dxao.js → Community-DF29_2bI.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-CyDtz0OS.js → Compact-DtkQkBzn.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-5tiRa2An.js → Compliance-xoHDxp7I.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-DnQaKZ5x.js → Cowork-BUm-R7ht.js} +4 -4
  24. package/src/assets/web-panel/assets/{Cron-BaWfoEDf.js → Cron-Cgl14ZkB.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-Bu0HoHhb.js → Crosschain-BNcbmoqh.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-31zk8upX.js → DID-Bwja0Zo9.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-BmVne-e2.js → Dashboard-Bk5XjEdJ.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-B4PkoOWd.js → Dropdown-Ci36Oitq.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-BZ6tyFtI.js → EmailListRenderer--U04ZN4q.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Osozn4Ds.js → FamilyGuardDashboard-B2gNPR2s.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-DaH8TOAP.js → Federation-C4KghYn7.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-tbU0uwis.js → FormItemContext-QL7x_Q_0.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-Df8LQBrL.js → GenericCardRenderer-F3Ryltwm.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-DsMB6-14.js → Git-2HassK5k.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-BnH0dZzd.js → Governance-DoBIp7oe.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-DhnN1N_P.js → Inference--W01QhZ-.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-DnNshAgn.js → KnowledgeGraph-DmvwqGpT.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-BmBFX3_N.js → Logs-BBJ4yAel.js} +2 -2
  39. package/src/assets/web-panel/assets/{MarkdownRenderer-DCslfQU3.js → MarkdownRenderer-BLCZMzhJ.js} +1 -1
  40. package/src/assets/web-panel/assets/{Marketplace-CPEgWDc3.js → Marketplace-D5lNngSI.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-C36qjgF9.js → McpTools-CkEVOMKH.js} +5 -5
  42. package/src/assets/web-panel/assets/{Memory-tNHvrgqN.js → Memory-B1Ow1xVE.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-Xaf6cKjc.js → MobileBridge-SgYbUfb6.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-D2E5TTeO.js → MobileProjects-BWdOvQAj.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-D4AJ2dwV.js → Mtc-DcTXSSma.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-Df-gtn2_.js → MtcAudit-Dt3WG4oj.js} +4 -4
  47. package/src/assets/web-panel/assets/{Multisig-DTCHLWld.js → Multisig-B9B38UZx.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-DruZ_1Jb.js → NLProgramming-B0S4GGvG.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-Dx3pdGDs.js → Notes-DZ5U58Ng.js} +4 -4
  50. package/src/assets/web-panel/assets/{NotificationSettings-Bi3L69oL.js → NotificationSettings-PjL5ZW34.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-BHY33m7C.js → OrderTableRenderer-DrAX2ESt.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-BG2ZVEV-.js → Organization-Cv1GYs-c.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-Viwtg4Mn.js → Overflow-Bbkp_PL3.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-Clm_yc1Z.js → P2P-BD8QUgoZ.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-NKmmDiOw.js → PdhVaultBrowser-BO-2PeaB.js} +5 -5
  56. package/src/assets/web-panel/assets/{Permissions-DIL8u9Nk.js → Permissions-D_OPVa02.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-B-jM4wt-.js → PersonalDataHub-mh-pEmaB.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-627I__H5.js → Pipeline-6JC2EDdb.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-2DN2qrkW.js → Privacy-CUshzUAG.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-CN4wC0sF.js → ProjectInit-Cs2Aalri.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-K35vsh5H.js → ProjectSettings-1ak49tcj.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-B_wQadhX.js → Projects-BV4oApsm.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-MckaQUhQ.js → Providers-CXXxvafH.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-BS3mtA_O.js → QrScannerModal-PTcDsF58.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-BHp_nofL.js → QuickAsk-CDwucrJw.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-DlmnPuZj.js → Recommend-CJlLVRXR.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-tsyFbvpy.js → RemoteSession-DlN-ETsO.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-Ba1iWv2D.js → Reputation-DI23LR6m.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-NnlGC--f.js → Row-Cl7UQMrM.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-CjThSIRv.js → RssFeed-CexHNfh8.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-CojUyC5x.js → Search-BneBWvRN.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-c-sxeJEc.js → Security-DX7Phgrp.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-CtcKEEmF.js → Services-BWXO8Mte.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-CIBBXflN.js → Skeleton-DCyOjKPJ.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-D1XOOK9n.js → Skills-CXqERsTB.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-hRfEp5Sn.js → Sla-bhbrbz8E.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-Dexb1f_6.js → SpeechSettings-3IPU0HBZ.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-BJsSFGYy.js → SyncSettings-DBNTQLbM.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-CfSZ8A1L.js → Tasks-quP0bkN-.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-idDf47W-.js → Templates-BouWmgho.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-C-UsX6w6.js → Tenant-qv0D9s7z.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-BgJtX5n1.js → Terminal-BxvbE8BB.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-DP0BLKTl.js → TimelineRenderer-D-IeLnJ2.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-LwCzqETp.js → Tokens-CFMKKyVG.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-D_9tVch0.js → Trigger-L8as3UuJ.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-BH2UlEWh.js → Trust-MxmA4VZG.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CIpD0nYb.js → UkeySign-C0VvJYRi.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-9ShhYxK_.js → VideoEditing-Bf5QZj8N.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-C7afGNIG.js → Wallet-BIJ9riRz.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-bUKn6i5R.js → WebAuthn-B8p9Mhkw.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-CxgQaGyp.js → WorkflowEditor-BVsuaPen.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-DMVkmJwx.js → chat-BfkjoKpV.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-CDzQh5nS.js → colors-DeAlsWK8.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-C51kEF4D.js → compact-item-Cs97bz5j.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-BTk9bXBn.js → createContext-BqbG60LH.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-DPty0mGN.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-CMje33rb.js → hasIn-i_RY0b1X.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DpcrFxMI.js → index-0-agYlWL.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BW4F5YDF.js → index-79V_zv1s.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DRG-aqOs.js → index-B-3tEpTc.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BCRvG9lq.js → index-B-JVTrpr.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DgivOKHA.js → index-B1CbOH1i.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BzCkNylB.js → index-B5UkyA3c.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-x53Vf7la.js → index-BESLFt4q.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CCLj9hcD.js → index-BOVkf1K3.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CypsfcEq.js → index-BYUVuwKt.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BtlEqHLP.js → index-BcUXAB2s.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Ld_4mFmC.js → index-BkBi5TmC.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DqU9njjT.js → index-Bm7lLR4c.js} +1 -1
  110. package/src/assets/web-panel/assets/index-Bt7g0Vq_.js +1 -0
  111. package/src/assets/web-panel/assets/{index-CwGPwjUu.js → index-BuLQobzW.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C5IWTMVl.js → index-CE2VtTlp.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DJfnCuMq.js → index-CED2PL_y.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-hg_emBsi.js → index-CG3PRyAL.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-togc_uYn.js → index-CIG8fQ2_.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-C4rQCS8T.js → index-COdGA-8n.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-0Auljb10.js → index-CeWoNHau.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Cd0hmPxD.js → index-Cf3WCLmy.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BXQBPLyE.js → index-CgsqdnRV.js} +1 -1
  120. package/src/assets/web-panel/assets/index-ChVT0p9u.js +1 -0
  121. package/src/assets/web-panel/assets/{index-h31MwrME.js → index-D2B4VPyP.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-C1oZReaY.js → index-D9evtvg2.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CfC-piWZ.js → index-DUUrv141.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-D9rC-fGW.js → index-DiSkx4UB.js} +3 -3
  125. package/src/assets/web-panel/assets/{index-CvSeVzqe.js → index-Dk2qouAz.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CtM8OT_7.js → index-Dk7-v4hP.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BBz9LIMS.js → index-DmbfhJUP.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BAfY7m7i.js → index-DqBgBpgp.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BVePe_Rf.js → index-PT_5sBMA.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CDLkNkLj.js → index-U4f5izHz.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BTlsE8Df.js → index-YXgLng0K.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BeEaAEIp.js → index-ZxO_-E8a.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-B0-zMtKA.js → index-dIHr4B_u.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-C1oZQmAA.js → index-gyFpvL7l.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-DRLQyp2A.js → index-s1opAL-M.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-OS-vfbTA.js → index-yObj1O4n.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-vrA8K-ac.js → initDefaultProps-C9h9yKL3.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-ByEzwIAl.js → motion-BvmLsPdu.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-Ck4AWjw-.js → move-CoL4ekU1.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-6p0l9SrB.js → mtc-parser-C4pMy6xV.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-B1CUPQ6R.js → omit-DPuJfNxx.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-B1STg1iW.js → pickAttrs-D0KEeaK2.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-DTTllkBV.js → placementArrow-BpkyINxt.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-AIrrCfBb.js → responsiveObserve-DQI_wOq8.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-C_fPMjdR.js → slide-DYfdDiRg.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-D5ow2yIP.js → statusUtils-B5dtvb0D.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-Dy3hEA--.js → styleChecker-CF310mSj.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-WfzcfSh4.js → useFlexGapSupport-D1Qp4BLp.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-CKSejfas.js → useFs-C7_iyvJK.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-od3zpPBN.js → usePersonalDataHub-DZUt_fIm.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-DRD_2DFA.js → vnode-D3dsi0lZ.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-DmNrEtgf.js → zoom-WdbOlvdQ.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +5 -5
  155. package/src/command-manifest.json +1 -1
  156. package/src/commands/agenda.js +76 -4
  157. package/src/commands/agent.js +90 -1
  158. package/src/commands/automation.js +462 -3
  159. package/src/commands/background-session.js +102 -1
  160. package/src/commands/chat.js +11 -2
  161. package/src/commands/compact.js +106 -23
  162. package/src/commands/cowork.js +6 -1
  163. package/src/commands/loop.js +187 -38
  164. package/src/commands/routine.js +12 -5
  165. package/src/commands/scheduler-daemon.js +807 -0
  166. package/src/commands/session-observability.js +305 -0
  167. package/src/commands/session.js +38 -0
  168. package/src/data/changelog.json +28 -2
  169. package/src/gateways/ws/ws-agent-handler.js +439 -5
  170. package/src/harness/jsonl-session-store.js +463 -125
  171. package/src/harness/prompt-compressor.js +86 -13
  172. package/src/harness/provider-backed-compaction.js +100 -27
  173. package/src/lib/advisor-runtime.js +3 -1
  174. package/src/lib/agent-schedule-store.js +737 -47
  175. package/src/lib/agent-team/team-adjudication.js +40 -1
  176. package/src/lib/automation-center-routines.js +363 -0
  177. package/src/lib/automation-center.js +435 -0
  178. package/src/lib/automation-engine.js +568 -19
  179. package/src/lib/automation-execution-authority.js +736 -0
  180. package/src/lib/background-agent-supervisor.js +871 -215
  181. package/src/lib/background-command-argv.js +24 -0
  182. package/src/lib/background-interaction-journal.js +361 -52
  183. package/src/lib/background-interaction-resolver.js +32 -0
  184. package/src/lib/background-launch-profile.js +2 -0
  185. package/src/lib/background-needs-input-incident.js +221 -0
  186. package/src/lib/causal-observability.js +2661 -0
  187. package/src/lib/chat-session-admission.js +76 -0
  188. package/src/lib/cost-budget.js +5 -7
  189. package/src/lib/cowork/ab-comparator-cli.js +11 -0
  190. package/src/lib/cowork/debate-review-cli.js +12 -0
  191. package/src/lib/cowork-adapter.js +159 -38
  192. package/src/lib/cowork-cron.js +673 -19
  193. package/src/lib/cowork-observe.js +5 -1
  194. package/src/lib/cowork-task-runner.js +112 -17
  195. package/src/lib/delivery-coordinator.js +142 -0
  196. package/src/lib/direct-model-usage.js +121 -0
  197. package/src/lib/file-lines.js +183 -47
  198. package/src/lib/llm-pricing.js +12 -17
  199. package/src/lib/loop.js +62 -3
  200. package/src/lib/permission-engine.js +14 -7
  201. package/src/lib/public-ide-capability-manifest.js +2 -0
  202. package/src/lib/routine-store.js +546 -86
  203. package/src/lib/runtime-usage-ledger.js +182 -0
  204. package/src/lib/scheduler-kernel/agenda-adapter.js +604 -29
  205. package/src/lib/scheduler-kernel/authority-resolver.js +163 -0
  206. package/src/lib/scheduler-kernel/automation-adapter.js +994 -0
  207. package/src/lib/scheduler-kernel/automation-event-adapter.js +757 -0
  208. package/src/lib/scheduler-kernel/contract.js +11 -3
  209. package/src/lib/scheduler-kernel/cowork-cron-adapter.js +343 -15
  210. package/src/lib/scheduler-kernel/loop-adapter.js +913 -0
  211. package/src/lib/scheduler-kernel/migration-admin.js +346 -0
  212. package/src/lib/scheduler-kernel/migration-rollback-admin.js +932 -0
  213. package/src/lib/scheduler-kernel/routine-adapter.js +691 -22
  214. package/src/lib/scheduler-kernel/runtime.js +63 -1
  215. package/src/lib/scheduler-kernel/service.js +328 -0
  216. package/src/lib/scheduler-kernel/source-locator-path.js +142 -0
  217. package/src/lib/scheduler-kernel/store.js +3439 -206
  218. package/src/lib/session-host-lease.js +171 -2
  219. package/src/lib/session-host-snapshot.js +14 -3
  220. package/src/lib/session-persistence-failure.js +1 -0
  221. package/src/lib/session-tail.js +179 -34
  222. package/src/lib/session-transcript-structure.js +96 -0
  223. package/src/lib/sub-agent-context.js +328 -22
  224. package/src/lib/ws-agent-handler.js +4 -1
  225. package/src/repl/agent-repl.js +732 -91
  226. package/src/repl/chat-repl.js +5 -1
  227. package/src/runtime/agent-core.js +1274 -208
  228. package/src/runtime/coding-agent-contract-shared.cjs +5 -0
  229. package/src/runtime/fallback-model.js +5 -0
  230. package/src/runtime/headless-runner.js +324 -82
  231. package/src/runtime/headless-stream.js +232 -26
  232. package/src/runtime/policies/agent-policy.js +4 -0
  233. package/src/workers/background-agent-worker.js +468 -98
  234. package/src/assets/web-panel/assets/devWarning-CdwPwYj8.js +0 -1
  235. package/src/assets/web-panel/assets/index-BEeOdfEe.js +0 -1
  236. package/src/assets/web-panel/assets/index-BTe0TOu6.js +0 -1
@@ -90,6 +90,7 @@ import {
90
90
  startSession as jsonlStartSession,
91
91
  appendUserMessage as jsonlAppendUserMessage,
92
92
  appendAssistantMessage as jsonlAppendAssistantMessage,
93
+ appendTokenUsage as jsonlAppendTokenUsage,
93
94
  appendToolCallCompact as jsonlAppendToolCallCompact,
94
95
  appendLlmRetryCompact as jsonlAppendLlmRetryCompact,
95
96
  appendCompactEventIfMessagesMatch as jsonlAppendCompactEventIfMessagesMatch,
@@ -142,6 +143,12 @@ import {
142
143
  createSessionPersistenceFailure,
143
144
  projectSessionPersistenceFailure,
144
145
  } from "../lib/session-persistence-failure.js";
146
+ import {
147
+ projectRuntimeTokenUsage,
148
+ projectRuntimeUsageBoundary,
149
+ runtimeUsageEventType,
150
+ markRuntimeLedgerPersistenceError,
151
+ } from "../lib/runtime-usage-ledger.js";
145
152
 
146
153
  function invalidMcpRecoveryTransaction(capability, expected) {
147
154
  const error = new TypeError(
@@ -798,6 +805,8 @@ async function runTurn(
798
805
  turnNumber,
799
806
  turnBindingFeed,
800
807
  waitForOutput,
808
+ persistUsageEvent,
809
+ persistToolEvent,
801
810
  now = Date.now,
802
811
  },
803
812
  ) {
@@ -817,10 +826,10 @@ async function runTurn(
817
826
  // tools serially). Non-null only between a dangerous tool's tool-executing
818
827
  // and its tool-result.
819
828
  let currentSideEffectOpId = null;
820
- // Precise tool telemetry is normally carried by tool-result. Keep a private
821
- // event-boundary fallback for denials/early throws that settle before the
822
- // core can create that record.
823
- let currentToolStartedAt = null;
829
+ // Precise tool telemetry is normally carried by tool-result. Keep private
830
+ // event-boundary fallbacks keyed by call id because read-only batches can run
831
+ // concurrently after every start boundary is persisted.
832
+ const toolStartedAt = new Map();
824
833
  const diffReviewFollowUps = new DiffReviewFollowUpTracker(
825
834
  sideEffects?.ledger,
826
835
  );
@@ -851,7 +860,6 @@ async function runTurn(
851
860
  turnBindingFeed?.handleEvent(event);
852
861
  switch (event.type) {
853
862
  case "tool-executing": {
854
- currentToolStartedAt = now();
855
863
  // Additive protocol-v1 correlation id ("tu-<n>", session-scoped —
856
864
  // agent-sdk docs/PROTOCOL.md §1.2.1): the matching tool_result below
857
865
  // echoes the same id so UIs can pair calls without adjacency.
@@ -868,6 +876,8 @@ async function runTurn(
868
876
  args: event.args,
869
877
  planItemId: planItem?.id || null,
870
878
  });
879
+ toolStartedAt.set(toolUseId, now());
880
+ persistToolEvent?.("started", toolCalls[toolCalls.length - 1]);
871
881
  emit({
872
882
  type: "tool_use",
873
883
  ...(toolUseId ? { id: toolUseId } : {}),
@@ -950,12 +960,13 @@ async function runTurn(
950
960
  lastCall.is_error = Boolean(err);
951
961
  lastCall.durationMs =
952
962
  event.result?.toolTelemetryRecord?.durationMs ??
953
- (currentToolStartedAt === null
963
+ (toolStartedAt.get(lastCall.id) === undefined
954
964
  ? undefined
955
- : Math.max(0, now() - currentToolStartedAt));
965
+ : Math.max(0, now() - toolStartedAt.get(lastCall.id)));
956
966
  Object.assign(lastCall, extractPluginUsageAttribution(event.result));
967
+ persistToolEvent?.("settled", lastCall);
957
968
  }
958
- currentToolStartedAt = null;
969
+ if (lastCall) toolStartedAt.delete(lastCall.id);
959
970
  const pm = getPlanModeManager();
960
971
  const settledItem = lastCall?.planItemId
961
972
  ? pm.settlePlanItem(lastCall.planItemId, {
@@ -988,6 +999,7 @@ async function runTurn(
988
999
  break;
989
1000
  }
990
1001
  case "token-usage":
1002
+ if (event.ledgerPersisted !== true) persistUsageEvent?.(event);
991
1003
  // 用量归因: attributed child-loop usage (sub-agent / isolated skill)
992
1004
  // is forwarded on the stream (same wire shape) and counted toward the
993
1005
  // cost budget, but stays out of the turn's `usage` envelope, which
@@ -1021,7 +1033,18 @@ async function runTurn(
1021
1033
  }
1022
1034
  }
1023
1035
  break;
1036
+ case "model-usage-started":
1037
+ case "model-usage-unknown":
1038
+ if (event.ledgerPersisted !== true) persistUsageEvent?.(event);
1039
+ break;
1024
1040
  case "compaction-usage-unknown":
1041
+ if (event.ledgerPersisted !== true) {
1042
+ persistUsageEvent?.({
1043
+ ...event,
1044
+ type: "model-usage-unknown",
1045
+ code: event.code || "provider_transport_outcome_unknown",
1046
+ });
1047
+ }
1025
1048
  emit({
1026
1049
  type: "compaction_usage_unknown",
1027
1050
  provider: event.provider,
@@ -1195,9 +1218,16 @@ const STREAM_SESSION_ID = Symbol("streamSessionId");
1195
1218
  const STREAM_SESSION_HOST_LEASE = Symbol("streamSessionHostLease");
1196
1219
 
1197
1220
  async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
1221
+ if (options.observabilityScope != null && options.ephemeral === true) {
1222
+ throw new Error(
1223
+ "observability scope requires durable session persistence and cannot be combined with ephemeral mode",
1224
+ );
1225
+ }
1198
1226
  const sessionId =
1199
1227
  options.sessionId || `headless-stream-${Date.now()}-${process.pid}`;
1200
- const persist = Boolean(options.sessionId) && options.ephemeral !== true;
1228
+ const persist =
1229
+ (Boolean(options.sessionId) || options.observabilityScope != null) &&
1230
+ options.ephemeral !== true;
1201
1231
  const hasInjectedSessionStore =
1202
1232
  typeof deps.sessionHasPersistedEvidence === "function" ||
1203
1233
  typeof deps.sessionExists === "function" ||
@@ -1377,7 +1407,9 @@ async function runAgentHeadlessStreamInWorkspace(
1377
1407
  deps[STREAM_SESSION_ID] ||
1378
1408
  options.sessionId ||
1379
1409
  `headless-stream-${Date.now()}-${process.pid}`;
1380
- const persist = Boolean(options.sessionId) && options.ephemeral !== true;
1410
+ const persist =
1411
+ (Boolean(options.sessionId) || options.observabilityScope != null) &&
1412
+ options.ephemeral !== true;
1381
1413
  const sessionHostLease = deps[STREAM_SESSION_HOST_LEASE] || null;
1382
1414
  const traceId = resolveTraceId(options, process.env, deps);
1383
1415
  const fieldGate = {
@@ -1467,6 +1499,21 @@ async function runAgentHeadlessStreamInWorkspace(
1467
1499
  "return a boolean",
1468
1500
  );
1469
1501
  }
1502
+ if (options.observabilityScope != null && existingSession) {
1503
+ const code = "CC_OBSERVABILITY_SCOPE_IMMUTABLE";
1504
+ const error =
1505
+ "An existing stream session scope cannot be overwritten; create a new scoped session";
1506
+ emit({
1507
+ type: "result",
1508
+ subtype: "error_session_resume",
1509
+ is_error: true,
1510
+ code,
1511
+ error,
1512
+ session_id: sessionId,
1513
+ });
1514
+ writeErr(`${code}: ${error}\n`);
1515
+ return { exitCode: 1, turns: 0 };
1516
+ }
1470
1517
  canonicalResume = existingSession
1471
1518
  ? requireSynchronousRecoveryResult(
1472
1519
  readResumeState(sessionId, {
@@ -1756,6 +1803,7 @@ async function runAgentHeadlessStreamInWorkspace(
1756
1803
  appendUserMessage: deps.appendUserMessage || jsonlAppendUserMessage,
1757
1804
  appendAssistantMessage:
1758
1805
  deps.appendAssistantMessage || jsonlAppendAssistantMessage,
1806
+ appendTokenUsage: deps.appendTokenUsage || jsonlAppendTokenUsage,
1759
1807
  appendToolCallCompact:
1760
1808
  deps.appendToolCallCompact ||
1761
1809
  (hasInjectedSessionStore ? () => true : jsonlAppendToolCallCompact),
@@ -2314,14 +2362,23 @@ async function runAgentHeadlessStreamInWorkspace(
2314
2362
  ).length;
2315
2363
  } else {
2316
2364
  try {
2317
- requireSynchronousRecoveryResult(
2365
+ const startedSessionId = requireSynchronousRecoveryResult(
2318
2366
  store.startSession(sessionId, {
2319
2367
  title: "stream session",
2320
2368
  provider,
2321
2369
  model,
2370
+ observabilityScope: options.observabilityScope,
2322
2371
  }),
2323
2372
  "startSession",
2324
2373
  );
2374
+ if (
2375
+ options.observabilityScope != null &&
2376
+ startedSessionId !== sessionId
2377
+ ) {
2378
+ throw new Error(
2379
+ "Scoped stream session creation did not confirm the requested durable session id",
2380
+ );
2381
+ }
2325
2382
  } catch (error) {
2326
2383
  const code = "CC_SESSION_PERSISTENCE_START_FAILED";
2327
2384
  const persistenceError = createSessionPersistenceFailure(error, {
@@ -2812,11 +2869,12 @@ async function runAgentHeadlessStreamInWorkspace(
2812
2869
  model: telemetry.model || model,
2813
2870
  reason: classifyStreamRetryReason(error),
2814
2871
  });
2815
- } catch {
2816
- /* usage telemetry is best-effort */
2872
+ } catch (persistenceError) {
2873
+ throw markRuntimeLedgerPersistenceError(persistenceError);
2817
2874
  }
2818
2875
  }
2819
2876
  },
2877
+ strictUsageTelemetry: persist,
2820
2878
  // Visible cross-vendor fallback notice: when the configured provider hits an
2821
2879
  // auth error and the loop falls back to another vendor (or relabels via
2822
2880
  // baseUrl), surface it as a `raw` info line the panel renders instead of a
@@ -2845,6 +2903,84 @@ async function runAgentHeadlessStreamInWorkspace(
2845
2903
 
2846
2904
  let sawError = false;
2847
2905
  let terminalPersistenceFailure = null;
2906
+ const persistUsageEvent = persist
2907
+ ? (event) => {
2908
+ try {
2909
+ if (event.type === "token-usage") {
2910
+ store.appendTokenUsage(sessionId, projectRuntimeTokenUsage(event));
2911
+ return;
2912
+ }
2913
+ const outcome =
2914
+ event.type === "model-usage-started" ? "started" : "unknown";
2915
+ store.appendEvent(
2916
+ sessionId,
2917
+ runtimeUsageEventType(outcome),
2918
+ projectRuntimeUsageBoundary(event, outcome),
2919
+ );
2920
+ } catch (error) {
2921
+ throw markRuntimeLedgerPersistenceError(error);
2922
+ }
2923
+ }
2924
+ : null;
2925
+ const persistToolEvent = persist
2926
+ ? (outcome, call) => {
2927
+ try {
2928
+ const id = call?.id || `tool-${toolUseCounter + 1}`;
2929
+ if (outcome === "started") {
2930
+ store.appendEvent(sessionId, "tool_call_started", {
2931
+ id,
2932
+ tool: call.tool,
2933
+ });
2934
+ return;
2935
+ }
2936
+ store.appendToolCallCompact(sessionId, {
2937
+ id,
2938
+ tool: call.tool,
2939
+ isError: Boolean(call.is_error),
2940
+ skill:
2941
+ call.skill ||
2942
+ (call.tool === "run_skill"
2943
+ ? call.args?.skill_name || null
2944
+ : undefined),
2945
+ plugin: call.plugin || undefined,
2946
+ pluginVersion: call.pluginVersion || undefined,
2947
+ durationMs: call.durationMs,
2948
+ });
2949
+ } catch (error) {
2950
+ throw markRuntimeLedgerPersistenceError(error);
2951
+ }
2952
+ }
2953
+ : null;
2954
+ const childToolExecs = new Map();
2955
+ const persistChildToolBoundary = persistToolEvent
2956
+ ? (event) => {
2957
+ const id = event?.tool_use_id;
2958
+ childToolExecs.set(id, {
2959
+ tool: event?.tool || "?",
2960
+ startedAt: deps.now ? deps.now() : Date.now(),
2961
+ });
2962
+ persistToolEvent("started", { id, tool: event?.tool || "?" });
2963
+ }
2964
+ : undefined;
2965
+ const persistChildToolSettlement = persistToolEvent
2966
+ ? (event) => {
2967
+ const id = event?.tool_use_id;
2968
+ const started = childToolExecs.get(id);
2969
+ childToolExecs.delete(id);
2970
+ persistToolEvent("settled", {
2971
+ id,
2972
+ tool: event?.tool || started?.tool || "?",
2973
+ is_error: Boolean(event?.error || event?.result?.error),
2974
+ skill: event?.attribution?.skill,
2975
+ durationMs: started
2976
+ ? Math.max(
2977
+ 0,
2978
+ (deps.now ? deps.now() : Date.now()) - started.startedAt,
2979
+ )
2980
+ : undefined,
2981
+ });
2982
+ }
2983
+ : undefined;
2848
2984
  // Session-scoped tool-call correlation ids ("tu-<n>", additive protocol-v1
2849
2985
  // field): one counter across ALL turns so ids never repeat within a session.
2850
2986
  // Gated by the capability handshake (docs/PROTOCOL.md §1.3): a client that
@@ -3095,6 +3231,8 @@ async function runAgentHeadlessStreamInWorkspace(
3095
3231
  let degradedEvent;
3096
3232
  let usageEvent;
3097
3233
  let usageUnknownEvent;
3234
+ const compactionCallId = `compact-${++slashRequestSeq}`;
3235
+ let compactionProviderStarted = false;
3098
3236
  try {
3099
3237
  ({
3100
3238
  messages: compacted,
@@ -3119,9 +3257,31 @@ async function runAgentHeadlessStreamInWorkspace(
3119
3257
  chatOptions: { cwd, sessionId },
3120
3258
  maxOutputTokens: options.compactionMaxOutputTokens,
3121
3259
  summaryInputMaxChars: options.compactionInputMaxChars,
3260
+ onProviderCallStart: () => {
3261
+ persistUsageEvent?.({
3262
+ type: "model-usage-started",
3263
+ callId: compactionCallId,
3264
+ provider,
3265
+ model,
3266
+ source: "semantic-compaction",
3267
+ });
3268
+ compactionProviderStarted = true;
3269
+ return compactionCallId;
3270
+ },
3122
3271
  }));
3123
3272
  } catch (error) {
3124
3273
  if (isAbortError(error) || options.signal?.aborted) throw error;
3274
+ if (error?.runtimeLedgerPersistence === true) throw error;
3275
+ if (compactionProviderStarted) {
3276
+ persistUsageEvent?.({
3277
+ type: "model-usage-unknown",
3278
+ callId: compactionCallId,
3279
+ provider,
3280
+ model,
3281
+ source: "semantic-compaction",
3282
+ code: "provider_call_failed",
3283
+ });
3284
+ }
3125
3285
  emit({
3126
3286
  type: "compaction-degraded",
3127
3287
  reason: `compaction_failed:${String(error?.message || error).slice(0, 240)}`,
@@ -3133,6 +3293,14 @@ async function runAgentHeadlessStreamInWorkspace(
3133
3293
  emit({ type: "compaction-degraded", ...degradedEvent });
3134
3294
  }
3135
3295
  if (usageUnknownEvent) {
3296
+ persistUsageEvent?.({
3297
+ type: "model-usage-unknown",
3298
+ callId: compactionCallId,
3299
+ provider: usageUnknownEvent.provider || provider,
3300
+ model: usageUnknownEvent.model || model,
3301
+ source: "semantic-compaction",
3302
+ code: "provider_transport_outcome_unknown",
3303
+ });
3136
3304
  emit({
3137
3305
  type: "compaction_usage_unknown",
3138
3306
  ...usageUnknownEvent,
@@ -3153,6 +3321,12 @@ async function runAgentHeadlessStreamInWorkspace(
3153
3321
  }
3154
3322
  let costExceeded = false;
3155
3323
  if (usageEvent) {
3324
+ persistUsageEvent?.({
3325
+ type: "token-usage",
3326
+ callId: compactionCallId,
3327
+ ...usageEvent,
3328
+ source: "semantic-compaction",
3329
+ });
3156
3330
  emit({ type: "token_usage", ...usageEvent });
3157
3331
  if (costBudget) {
3158
3332
  costBudget.add(usageEvent);
@@ -3742,6 +3916,10 @@ async function runAgentHeadlessStreamInWorkspace(
3742
3916
  : {}),
3743
3917
  iterationBudget: budget,
3744
3918
  signal: turnSignal,
3919
+ onUsageBoundary: persistUsageEvent,
3920
+ onUsageSettlement: persistUsageEvent,
3921
+ onToolCallBoundary: persistChildToolBoundary,
3922
+ onToolCallSettlement: persistChildToolSettlement,
3745
3923
  // Resume-degenerate role merge for the first live model call only.
3746
3924
  mergeRoles: mergeRolesThisTurn,
3747
3925
  },
@@ -3755,10 +3933,51 @@ async function runAgentHeadlessStreamInWorkspace(
3755
3933
  turnBindingFeed,
3756
3934
  waitForOutput: deps.outputFlow?.wait,
3757
3935
  now: deps.now || Date.now,
3936
+ persistUsageEvent,
3937
+ persistToolEvent,
3758
3938
  },
3759
3939
  );
3760
3940
  } catch (err) {
3761
3941
  currentAbort = null;
3942
+ if (persist) {
3943
+ const normalized = createSessionPersistenceFailure(err, {
3944
+ sessionId,
3945
+ operation: "append-event",
3946
+ });
3947
+ const telemetryPersistence = projectSessionPersistenceFailure(
3948
+ normalized,
3949
+ { phase: "after-model" },
3950
+ );
3951
+ if (telemetryPersistence) {
3952
+ terminalPersistenceFailure = telemetryPersistence;
3953
+ try {
3954
+ deps.onPersistenceFailure?.(telemetryPersistence);
3955
+ } catch {
3956
+ // Observability cannot change persistence semantics.
3957
+ }
3958
+ emit({
3959
+ type: "result",
3960
+ subtype: "error_persistence",
3961
+ is_error: true,
3962
+ code: telemetryPersistence.code,
3963
+ persistence: telemetryPersistence,
3964
+ turn: turns,
3965
+ });
3966
+ sawError = true;
3967
+ break;
3968
+ }
3969
+ if (err?.runtimeLedgerPersistence === true) {
3970
+ emit({
3971
+ type: "result",
3972
+ subtype: "error_persistence",
3973
+ is_error: true,
3974
+ code: "CC_RUNTIME_LEDGER_PERSISTENCE_FAILED",
3975
+ turn: turns,
3976
+ });
3977
+ sawError = true;
3978
+ break;
3979
+ }
3980
+ }
3762
3981
  const isAbort =
3763
3982
  err?.name === "AbortError" || /abort/i.test(err?.message || "");
3764
3983
  if (isAbort && !options.signal?.aborted) {
@@ -3862,19 +4081,6 @@ async function runAgentHeadlessStreamInWorkspace(
3862
4081
  if (persist) {
3863
4082
  try {
3864
4083
  store.appendAssistantMessage(sessionId, outcome.finalText);
3865
- for (const call of outcome.toolCalls || []) {
3866
- store.appendToolCallCompact(sessionId, {
3867
- tool: call.tool,
3868
- isError: Boolean(call.is_error),
3869
- skill:
3870
- call.tool === "run_skill"
3871
- ? call.args?.skill_name || null
3872
- : undefined,
3873
- plugin: call.plugin || undefined,
3874
- pluginVersion: call.pluginVersion || undefined,
3875
- durationMs: call.durationMs,
3876
- });
3877
- }
3878
4084
  } catch (error) {
3879
4085
  const persistenceError = createSessionPersistenceFailure(error, {
3880
4086
  sessionId,
@@ -49,6 +49,10 @@ export function resolveAgentPolicy({
49
49
  : [],
50
50
  worktreeId:
51
51
  overrides.worktreeId == null ? null : String(overrides.worktreeId),
52
+ ...(overrides.observabilityScope &&
53
+ typeof overrides.observabilityScope === "object"
54
+ ? { observabilityScope: { ...overrides.observabilityScope } }
55
+ : {}),
52
56
  systemPrompt: overrides.systemPrompt || null,
53
57
  appendSystemPrompt: overrides.appendSystemPrompt || null,
54
58
  fallbackModel: overrides.fallbackModel || null,