chainlesschain 0.163.6 → 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 (218) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-DDIUofA8.js → AIOps-axqQfwv8.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-Bm-5xYRn.js → ActionButton-DV-Ro0By.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-D5UH4ljI.js → Analytics-Bt72WEVu.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-D_ifjOOP.js → AppLayout-BtepG55E.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-BY1mXdC7.js → Artifacts-B7KaJ7S_.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-Bujr4Ml3.js → Audit-FNFaUg7A.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-sioKSTcC.js → BackgroundAgents-DFb6J2wQ.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-DDOAK8RK.js → Backup-CC7YBhyj.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-CtCsVVke.js → BaseInput-RkgTNVtj.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-DpNj0vnd.js → Chat-hHEmGZy-.js} +4 -4
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZta3Ftr.js → ChatBubbleRenderer-CAP9YhHv.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-DoHVNSXq.js → Checkbox-z5wXOQP1.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DlVl7Qmv.js → Codegen-DVaDJnxy.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-GIqoPYty.js → Col-CJmaRDR5.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-CIAPEVji.js → Community-DF29_2bI.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-BN7JiI_h.js → Compact-DtkQkBzn.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-CqUWCM9B.js → Compliance-xoHDxp7I.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-A4iPp7A4.js → Cowork-BUm-R7ht.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-B2zeXXWb.js → Cron-Cgl14ZkB.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BR2xmWr8.js → Crosschain-BNcbmoqh.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-BzFDjrIv.js → DID-Bwja0Zo9.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-DKtDo3yA.js → Dashboard-Bk5XjEdJ.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-RNx43_YG.js → Dropdown-Ci36Oitq.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-SwMt4Rcy.js → EmailListRenderer--U04ZN4q.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CsYebZ4X.js → FamilyGuardDashboard-B2gNPR2s.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-BmRKvBTy.js → Federation-C4KghYn7.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-CVxGTA-0.js → FormItemContext-QL7x_Q_0.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-x2iXpyB7.js → GenericCardRenderer-F3Ryltwm.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-DfqbkiOP.js → Git-2HassK5k.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-RuHyyj5O.js → Governance-DoBIp7oe.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-Bn7uZ7rI.js → Inference--W01QhZ-.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DlP7XefZ.js → KnowledgeGraph-DmvwqGpT.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-BYNdOiCd.js → Logs-BBJ4yAel.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-aMtgN-R6.js → MarkdownRenderer-BLCZMzhJ.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-JQYmDqM8.js → Marketplace-D5lNngSI.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-Cyx4yZ-9.js → McpTools-CkEVOMKH.js} +4 -4
  38. package/src/assets/web-panel/assets/{Memory-VDuGZTN2.js → Memory-B1Ow1xVE.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-_yKo97gi.js → MobileBridge-SgYbUfb6.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-CXRXW3q7.js → MobileProjects-BWdOvQAj.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-acTGtfLH.js → Mtc-DcTXSSma.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-ClpjXfkY.js → MtcAudit-Dt3WG4oj.js} +4 -4
  43. package/src/assets/web-panel/assets/{Multisig-_6Tn3o96.js → Multisig-B9B38UZx.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-CK7pbZzP.js → NLProgramming-B0S4GGvG.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-Czy6V_P8.js → Notes-DZ5U58Ng.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-Cqx-UVv3.js → NotificationSettings-PjL5ZW34.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-C69WDxGy.js → OrderTableRenderer-DrAX2ESt.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-DFnA9vLQ.js → Organization-Cv1GYs-c.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-ReZkk2yT.js → Overflow-Bbkp_PL3.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-DzjSI0aI.js → P2P-BD8QUgoZ.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-DKTf5xIP.js → PdhVaultBrowser-BO-2PeaB.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-DhQ5klhR.js → Permissions-D_OPVa02.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-CUL1iHrW.js → PersonalDataHub-mh-pEmaB.js} +4 -4
  54. package/src/assets/web-panel/assets/{Pipeline-DU88iu4N.js → Pipeline-6JC2EDdb.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-Bw-sYfyK.js → Privacy-CUshzUAG.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-Bq3Q5y0z.js → ProjectInit-Cs2Aalri.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-C8spzpho.js → ProjectSettings-1ak49tcj.js} +2 -2
  58. package/src/assets/web-panel/assets/Projects-BV4oApsm.js +1 -0
  59. package/src/assets/web-panel/assets/{Providers-Bf4eTP9W.js → Providers-CXXxvafH.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-Dme9BDU1.js → QrScannerModal-PTcDsF58.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-CIXfv1rE.js → QuickAsk-CDwucrJw.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-CIxvdeZ-.js → Recommend-CJlLVRXR.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-C6k7MExI.js → RemoteSession-DlN-ETsO.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-CISDz2bl.js → Reputation-DI23LR6m.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-CdnDxXyf.js → Row-Cl7UQMrM.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-C-QpRHsl.js → RssFeed-CexHNfh8.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-DBjaGzSn.js → Search-BneBWvRN.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CQKukOeE.js → Security-DX7Phgrp.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-DZz86jWb.js → Services-BWXO8Mte.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-jb8RMK0d.js → Skeleton-DCyOjKPJ.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-CdY76fZG.js → Skills-CXqERsTB.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-C_CSiZX9.js → Sla-bhbrbz8E.js} +1 -1
  73. package/src/assets/web-panel/assets/SpeechSettings-3IPU0HBZ.js +1 -0
  74. package/src/assets/web-panel/assets/{SyncSettings-qvimGO0O.js → SyncSettings-DBNTQLbM.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-Dng5LPJC.js → Tasks-quP0bkN-.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-Bwqq5Wll.js → Templates-BouWmgho.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-DNWuwP7Z.js → Tenant-qv0D9s7z.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-B-6Othpp.js → Terminal-BxvbE8BB.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-DKpKZfzx.js → TimelineRenderer-D-IeLnJ2.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-DzfGMd2J.js → Tokens-CFMKKyVG.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-BXwUi74J.js → Trigger-L8as3UuJ.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-BNzUq4ui.js → Trust-MxmA4VZG.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-BYugxww4.js → UkeySign-C0VvJYRi.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-DdauhtSJ.js → VideoEditing-Bf5QZj8N.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-CSC9bCe_.js → Wallet-BIJ9riRz.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-Q8AN3bTO.js → WebAuthn-B8p9Mhkw.js} +5 -5
  87. package/src/assets/web-panel/assets/{WorkflowEditor-d-LBGCuA.js → WorkflowEditor-BVsuaPen.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-BLVDCgsZ.js → chat-BfkjoKpV.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-BZlPSEHl.js → colors-DeAlsWK8.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-IWseP6R6.js → compact-item-Cs97bz5j.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DnVRV3Ao.js → createContext-BqbG60LH.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-DPty0mGN.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-DLQZA_Wn.js → hasIn-i_RY0b1X.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-B_N4-Gq9.js → index-0-agYlWL.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-DB0MJgF_.js → index-79V_zv1s.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BOZJBTWZ.js → index-B-3tEpTc.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DUq0c7gq.js → index-B-JVTrpr.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Dy0R5ZED.js → index-B1CbOH1i.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-Bxp7uDD8.js → index-B5UkyA3c.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DpVrK6fr.js → index-BESLFt4q.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CT9vVN-X.js → index-BOVkf1K3.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DOoQpuQY.js → index-BYUVuwKt.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CINJQEj6.js → index-BcUXAB2s.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CarMTIyQ.js → index-BkBi5TmC.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C5dgnilC.js → index-Bm7lLR4c.js} +1 -1
  106. package/src/assets/web-panel/assets/index-Bt7g0Vq_.js +1 -0
  107. package/src/assets/web-panel/assets/{index-CbQNL0ue.js → index-BuLQobzW.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CpBaJ3TD.js → index-CE2VtTlp.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-jWb70ZgZ.js → index-CED2PL_y.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BEu2lMBy.js → index-CG3PRyAL.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DocEhinm.js → index-CIG8fQ2_.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D_LQodeJ.js → index-COdGA-8n.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DZpYeqrh.js → index-CeWoNHau.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-gt8bNefW.js → index-Cf3WCLmy.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-N_GoWZX4.js → index-CgsqdnRV.js} +1 -1
  116. package/src/assets/web-panel/assets/index-ChVT0p9u.js +1 -0
  117. package/src/assets/web-panel/assets/{index-CZDekj7T.js → index-D2B4VPyP.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-YSw_gxlZ.js → index-D9evtvg2.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DTbxp4UH.js → index-DUUrv141.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Bbj2NS_I.js → index-DiSkx4UB.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-BZs5bBnk.js → index-Dk2qouAz.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DalA0TKC.js → index-Dk7-v4hP.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-1jeAudHd.js → index-DmbfhJUP.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C1ifZtXo.js → index-DqBgBpgp.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BhA3QEni.js → index-PT_5sBMA.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BSjilZ9L.js → index-U4f5izHz.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-C2FqfMvU.js → index-YXgLng0K.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-COev0W2g.js → index-ZxO_-E8a.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-M7wxfAbm.js → index-dIHr4B_u.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DjWnONdy.js → index-gyFpvL7l.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Dkwsi1Kn.js → index-s1opAL-M.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-hwVDeoC0.js → index-yObj1O4n.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-Co67Kqmb.js → initDefaultProps-C9h9yKL3.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-BMOxQSF_.js → motion-BvmLsPdu.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-C5fWDw-N.js → move-CoL4ekU1.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-BJevpL0e.js → mtc-parser-C4pMy6xV.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-BCzNU8s6.js → omit-DPuJfNxx.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-CybWvDPk.js → pickAttrs-D0KEeaK2.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-BMWS9HnW.js → placementArrow-BpkyINxt.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-BoL2UnGY.js → responsiveObserve-DQI_wOq8.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-DWNfXraU.js → slide-DYfdDiRg.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-BquTM3tX.js → statusUtils-B5dtvb0D.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-BEkCleim.js → styleChecker-CF310mSj.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-Oecnq7EA.js → useFlexGapSupport-D1Qp4BLp.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-CkDffJ4F.js → useFs-C7_iyvJK.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-qbvKXesB.js → usePersonalDataHub-DZUt_fIm.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-C6v8n6mA.js → vnode-D3dsi0lZ.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-4CTeFILV.js → zoom-WdbOlvdQ.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +2 -2
  151. package/src/commands/agent.js +90 -1
  152. package/src/commands/chat.js +11 -2
  153. package/src/commands/compact.js +106 -23
  154. package/src/commands/loop.js +28 -10
  155. package/src/commands/routine.js +1 -1
  156. package/src/commands/scheduler-daemon.js +359 -2
  157. package/src/commands/session-observability.js +305 -0
  158. package/src/commands/session.js +38 -0
  159. package/src/data/changelog.json +14 -1
  160. package/src/gateways/ws/ws-agent-handler.js +439 -5
  161. package/src/harness/jsonl-session-store.js +463 -125
  162. package/src/harness/prompt-compressor.js +86 -13
  163. package/src/harness/provider-backed-compaction.js +100 -27
  164. package/src/lib/advisor-runtime.js +3 -1
  165. package/src/lib/agent-schedule-store.js +414 -4
  166. package/src/lib/agent-team/team-adjudication.js +40 -1
  167. package/src/lib/automation-engine.js +494 -0
  168. package/src/lib/background-agent-supervisor.js +793 -215
  169. package/src/lib/background-command-argv.js +24 -0
  170. package/src/lib/background-interaction-journal.js +361 -52
  171. package/src/lib/background-interaction-resolver.js +32 -0
  172. package/src/lib/background-launch-profile.js +2 -0
  173. package/src/lib/causal-observability.js +2661 -0
  174. package/src/lib/chat-session-admission.js +76 -0
  175. package/src/lib/cost-budget.js +5 -7
  176. package/src/lib/cowork/ab-comparator-cli.js +11 -0
  177. package/src/lib/cowork/debate-review-cli.js +12 -0
  178. package/src/lib/cowork-adapter.js +159 -38
  179. package/src/lib/cowork-cron.js +357 -1
  180. package/src/lib/cowork-task-runner.js +112 -17
  181. package/src/lib/delivery-coordinator.js +142 -0
  182. package/src/lib/direct-model-usage.js +121 -0
  183. package/src/lib/file-lines.js +183 -47
  184. package/src/lib/llm-pricing.js +12 -17
  185. package/src/lib/loop.js +26 -2
  186. package/src/lib/routine-store.js +380 -21
  187. package/src/lib/runtime-usage-ledger.js +182 -0
  188. package/src/lib/scheduler-kernel/agenda-adapter.js +308 -3
  189. package/src/lib/scheduler-kernel/automation-adapter.js +410 -8
  190. package/src/lib/scheduler-kernel/automation-event-adapter.js +36 -0
  191. package/src/lib/scheduler-kernel/cowork-cron-adapter.js +285 -3
  192. package/src/lib/scheduler-kernel/loop-adapter.js +541 -6
  193. package/src/lib/scheduler-kernel/migration-admin.js +346 -0
  194. package/src/lib/scheduler-kernel/migration-rollback-admin.js +932 -0
  195. package/src/lib/scheduler-kernel/routine-adapter.js +394 -20
  196. package/src/lib/scheduler-kernel/runtime.js +63 -1
  197. package/src/lib/scheduler-kernel/source-locator-path.js +142 -0
  198. package/src/lib/scheduler-kernel/store.js +2586 -85
  199. package/src/lib/session-host-lease.js +171 -2
  200. package/src/lib/session-host-snapshot.js +14 -3
  201. package/src/lib/session-persistence-failure.js +1 -0
  202. package/src/lib/session-tail.js +179 -34
  203. package/src/lib/session-transcript-structure.js +96 -0
  204. package/src/lib/sub-agent-context.js +328 -22
  205. package/src/lib/ws-agent-handler.js +4 -1
  206. package/src/repl/agent-repl.js +732 -91
  207. package/src/repl/chat-repl.js +5 -1
  208. package/src/runtime/agent-core.js +1272 -207
  209. package/src/runtime/fallback-model.js +5 -0
  210. package/src/runtime/headless-runner.js +324 -82
  211. package/src/runtime/headless-stream.js +232 -26
  212. package/src/runtime/policies/agent-policy.js +4 -0
  213. package/src/workers/background-agent-worker.js +403 -96
  214. package/src/assets/web-panel/assets/Projects-Dd-xuPIc.js +0 -1
  215. package/src/assets/web-panel/assets/SpeechSettings-C7tT9iad.js +0 -1
  216. package/src/assets/web-panel/assets/devWarning-Jzu62CLC.js +0 -1
  217. package/src/assets/web-panel/assets/index-Zb2MeDSy.js +0 -1
  218. package/src/assets/web-panel/assets/index-fikqml4k.js +0 -1
@@ -32,6 +32,7 @@ export * from "./structured-handoff.js";
32
32
  // a long, tool-heavy history stays sub-second instead of O(n²·content).
33
33
  const DEDUP_JACCARD_MAX_CHARS = 4000;
34
34
  const DEDUP_FUZZY_WINDOW = 100;
35
+ const SUMMARY_CALL_ID_MAX_CHARS = 128;
35
36
  export const SUMMARY_INPUT_DEFAULT_MAX_CHARS = 24000;
36
37
  export const SUMMARY_INPUT_HARD_MAX_CHARS = 32000;
37
38
  const SUMMARY_INPUT_MIN_CHARS = 1024;
@@ -123,6 +124,31 @@ function boundedFailureMessage(error) {
123
124
  .slice(0, 240);
124
125
  }
125
126
 
127
+ function safeSummaryCallId(value) {
128
+ if (
129
+ typeof value !== "string" ||
130
+ !value.trim() ||
131
+ value.length > SUMMARY_CALL_ID_MAX_CHARS ||
132
+ /\p{Cc}/u.test(value)
133
+ ) {
134
+ return null;
135
+ }
136
+ return value.trim();
137
+ }
138
+
139
+ function summaryUsageCount(usage, canonical, alias, { required = false } = {}) {
140
+ const hasCanonical = Object.hasOwn(usage, canonical);
141
+ const hasAlias = Object.hasOwn(usage, alias);
142
+ if (!hasCanonical && !hasAlias) return required ? null : 0;
143
+ if (hasCanonical && hasAlias && usage[canonical] !== usage[alias]) {
144
+ return null;
145
+ }
146
+ const value = hasCanonical ? usage[canonical] : usage[alias];
147
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0
148
+ ? value
149
+ : null;
150
+ }
151
+
126
152
  export function estimateTokens(text) {
127
153
  if (!text) return 0;
128
154
  const chineseChars = (text.match(/[\u4e00-\u9fa5]/g) || []).length;
@@ -571,8 +597,18 @@ export class PromptCompressor {
571
597
  let summaryUsageUnknownReason = null;
572
598
  let summaryProvider = null;
573
599
  let summaryModel = null;
600
+ let summaryCallId = null;
601
+ let summaryUsageLedgerSettled = false;
574
602
  try {
575
603
  const queryResult = await this.llmQuery(prompt);
604
+ if (
605
+ queryResult &&
606
+ typeof queryResult === "object" &&
607
+ !Array.isArray(queryResult)
608
+ ) {
609
+ summaryCallId = safeSummaryCallId(queryResult.callId);
610
+ summaryUsageLedgerSettled = queryResult.usageLedgerSettled === true;
611
+ }
576
612
  if (
577
613
  queryResult &&
578
614
  typeof queryResult === "object" &&
@@ -580,20 +616,46 @@ export class PromptCompressor {
580
616
  ) {
581
617
  rawSummary = queryResult.summary;
582
618
  const usage = queryResult.usage;
583
- if (usage && typeof usage === "object") {
619
+ const inputTokens = usage
620
+ ? summaryUsageCount(usage, "input_tokens", "prompt_tokens", {
621
+ required: true,
622
+ })
623
+ : null;
624
+ const outputTokens = usage
625
+ ? summaryUsageCount(usage, "output_tokens", "completion_tokens", {
626
+ required: true,
627
+ })
628
+ : null;
629
+ const cacheReadTokens = usage
630
+ ? summaryUsageCount(
631
+ usage,
632
+ "cache_read_input_tokens",
633
+ "cache_read_tokens",
634
+ )
635
+ : null;
636
+ const cacheCreationTokens = usage
637
+ ? summaryUsageCount(
638
+ usage,
639
+ "cache_creation_input_tokens",
640
+ "cache_creation_tokens",
641
+ )
642
+ : null;
643
+ if (
644
+ usage &&
645
+ typeof usage === "object" &&
646
+ !Array.isArray(usage) &&
647
+ Number.isSafeInteger(inputTokens) &&
648
+ inputTokens >= 0 &&
649
+ Number.isSafeInteger(outputTokens) &&
650
+ outputTokens >= 0 &&
651
+ cacheReadTokens != null &&
652
+ cacheCreationTokens != null
653
+ ) {
584
654
  summaryUsage = {
585
- inputTokens: Number(usage.input_tokens ?? usage.prompt_tokens) || 0,
586
- outputTokens:
587
- Number(usage.output_tokens ?? usage.completion_tokens) || 0,
588
- cacheReadTokens:
589
- Number(
590
- usage.cache_read_input_tokens ?? usage.cache_read_tokens,
591
- ) || 0,
592
- cacheCreationTokens:
593
- Number(
594
- usage.cache_creation_input_tokens ??
595
- usage.cache_creation_tokens,
596
- ) || 0,
655
+ inputTokens,
656
+ outputTokens,
657
+ cacheReadTokens,
658
+ cacheCreationTokens,
597
659
  };
598
660
  } else if (queryResult.usageOutcome !== "not-billable") {
599
661
  // Standard provider adapters return an explicit `usage` field. A
@@ -612,6 +674,13 @@ export class PromptCompressor {
612
674
  // provider failure would manufacture an extractive summary after Stop and
613
675
  // let callers apply/persist it even though the operation was cancelled.
614
676
  if (isAbortError(error)) throw error;
677
+ // A durable-ledger write failure is authoritative too. Falling back here
678
+ // would let the host continue after losing the model-call boundary.
679
+ if (error?.runtimeLedgerPersistence === true) throw error;
680
+ summaryCallId = safeSummaryCallId(
681
+ error?.compactionCallId ?? error?.callId,
682
+ );
683
+ summaryUsageLedgerSettled = error?.usageLedgerSettled === true;
615
684
  degraded = true;
616
685
  summaryMode = "extractive-fallback";
617
686
  degradedReason = `llm_query_failed:${boundedFailureMessage(error)}`;
@@ -670,6 +739,10 @@ export class PromptCompressor {
670
739
  : {}),
671
740
  ...(summaryProvider ? { summaryProvider } : {}),
672
741
  ...(summaryModel ? { summaryModel } : {}),
742
+ ...(summaryCallId ? { summaryCallId } : {}),
743
+ ...(summaryUsageLedgerSettled
744
+ ? { summaryUsageLedgerSettled: true }
745
+ : {}),
673
746
  },
674
747
  };
675
748
  }
@@ -8,6 +8,49 @@ const DEFAULT_MAX_OUTPUT_TOKENS = 2048;
8
8
  const MIN_MAX_OUTPUT_TOKENS = 256;
9
9
  const MAX_MAX_OUTPUT_TOKENS = 4096;
10
10
  const MANUAL_MAX_MESSAGES = 4;
11
+ const MAX_USAGE_CALL_ID_CHARS = 128;
12
+
13
+ function safeUsageCallId(value) {
14
+ if (
15
+ typeof value !== "string" ||
16
+ !value.trim() ||
17
+ value.length > MAX_USAGE_CALL_ID_CHARS ||
18
+ /\p{Cc}/u.test(value)
19
+ ) {
20
+ return null;
21
+ }
22
+ return value.trim();
23
+ }
24
+
25
+ function attachProviderCallId(result, startedCallId) {
26
+ const callId =
27
+ safeUsageCallId(startedCallId) || safeUsageCallId(result?.callId);
28
+ if (!callId) return result;
29
+ if (result && typeof result === "object" && !Array.isArray(result)) {
30
+ return { ...result, callId };
31
+ }
32
+ return { summary: result, callId };
33
+ }
34
+
35
+ function attachProviderCallIdToError(error, callId) {
36
+ const safeCallId = safeUsageCallId(callId);
37
+ if (
38
+ !safeCallId ||
39
+ !error ||
40
+ (typeof error !== "object" && typeof error !== "function")
41
+ ) {
42
+ return;
43
+ }
44
+ try {
45
+ Object.defineProperty(error, "compactionCallId", {
46
+ configurable: true,
47
+ value: safeCallId,
48
+ });
49
+ } catch {
50
+ // Frozen provider errors still propagate; their call remains conservative
51
+ // because no unsafe metadata is manufactured here.
52
+ }
53
+ }
11
54
 
12
55
  function boundedMaxOutputTokens(value) {
13
56
  const parsed = Math.trunc(Number(value));
@@ -20,9 +63,11 @@ function boundedMaxOutputTokens(value) {
20
63
  );
21
64
  }
22
65
 
23
- function tokenCount(value) {
24
- const parsed = Number(value);
25
- return Number.isFinite(parsed) && parsed > 0 ? Math.trunc(parsed) : 0;
66
+ function tokenCount(value, { required = false } = {}) {
67
+ if (typeof value === "number" && Number.isSafeInteger(value) && value >= 0) {
68
+ return value;
69
+ }
70
+ return required ? null : 0;
26
71
  }
27
72
 
28
73
  function responseSummary(response) {
@@ -56,9 +101,12 @@ function preserveCompletedExchange(originalMessages, compactedMessages) {
56
101
  export function compactionTokenUsage(stats) {
57
102
  const usage = stats?.summaryUsage;
58
103
  if (!usage || typeof usage !== "object") return null;
104
+ const inputTokens = tokenCount(usage.inputTokens, { required: true });
105
+ const outputTokens = tokenCount(usage.outputTokens, { required: true });
106
+ if (inputTokens == null || outputTokens == null) return null;
59
107
  return {
60
- input_tokens: tokenCount(usage.inputTokens),
61
- output_tokens: tokenCount(usage.outputTokens),
108
+ input_tokens: inputTokens,
109
+ output_tokens: outputTokens,
62
110
  cache_read_input_tokens: tokenCount(usage.cacheReadTokens),
63
111
  cache_creation_input_tokens: tokenCount(usage.cacheCreationTokens),
64
112
  };
@@ -78,35 +126,52 @@ export async function compactConversationWithProvider(messages, options = {}) {
78
126
  const model = options.model || null;
79
127
  const maxOutputTokens = boundedMaxOutputTokens(options.maxOutputTokens);
80
128
  const chatFn = options.chatFn;
129
+ const invokeProviderCall = async (call) => {
130
+ const callId = safeUsageCallId(await options.onProviderCallStart?.());
131
+ try {
132
+ return attachProviderCallId(await call(), callId);
133
+ } catch (error) {
134
+ attachProviderCallIdToError(error, callId);
135
+ throw error;
136
+ }
137
+ };
81
138
  const llmQuery =
82
139
  typeof options.llmQuery === "function"
83
- ? options.llmQuery
140
+ ? async (prompt) => invokeProviderCall(() => options.llmQuery(prompt))
84
141
  : async (prompt) => {
85
142
  if (typeof chatFn !== "function") {
86
143
  throw new Error("provider adapter unavailable");
87
144
  }
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,
145
+ return invokeProviderCall(async () => {
146
+ const response = await chatFn([{ role: "user", content: prompt }], {
147
+ ...(options.chatOptions || {}),
148
+ provider,
149
+ model,
150
+ baseUrl: options.baseUrl,
151
+ apiKey: options.apiKey,
152
+ signal: options.signal,
153
+ contextEngine: null,
154
+ enabledToolNames: [],
155
+ extraToolDefinitions: [],
156
+ hostManagedToolPolicy: null,
157
+ onToken: undefined,
158
+ onStall: undefined,
159
+ onStreamRetry: undefined,
160
+ maxOutputTokens,
161
+ });
162
+ return {
163
+ summary: responseSummary(response),
164
+ usage: response?.usage || null,
165
+ provider,
166
+ model,
167
+ ...(safeUsageCallId(response?.callId)
168
+ ? { callId: safeUsageCallId(response.callId) }
169
+ : {}),
170
+ ...(response?.usageLedgerSettled === true
171
+ ? { usageLedgerSettled: true }
172
+ : {}),
173
+ };
103
174
  });
104
- return {
105
- summary: responseSummary(response),
106
- usage: response?.usage || null,
107
- provider,
108
- model,
109
- };
110
175
  };
111
176
 
112
177
  const compressor =
@@ -178,6 +243,10 @@ export async function compactConversationWithProvider(messages, options = {}) {
178
243
  stats.summaryUsageUnknownReason ||
179
244
  "provider_transport_outcome_unknown",
180
245
  usageOutcome: "unknown",
246
+ ...(stats.summaryCallId ? { callId: stats.summaryCallId } : {}),
247
+ ...(stats.summaryUsageLedgerSettled === true
248
+ ? { usageLedgerSettled: true }
249
+ : {}),
181
250
  }
182
251
  : null;
183
252
 
@@ -198,6 +267,10 @@ export async function compactConversationWithProvider(messages, options = {}) {
198
267
  model: stats.summaryModel || model,
199
268
  usage,
200
269
  source: "semantic-compaction",
270
+ ...(stats.summaryCallId ? { callId: stats.summaryCallId } : {}),
271
+ ...(stats.summaryUsageLedgerSettled === true
272
+ ? { usageLedgerSettled: true }
273
+ : {}),
201
274
  }
202
275
  : null,
203
276
  usageUnknownEvent,
@@ -888,6 +888,7 @@ export class AdvisorRuntime {
888
888
  guidance: buildAdvisorGuidance({ ok: true, advice }),
889
889
  };
890
890
  } catch (error) {
891
+ if (error?.runtimeLedgerPersistence === true) throw error;
891
892
  const failure = {
892
893
  callId,
893
894
  trigger,
@@ -994,7 +995,8 @@ export class AdvisorRuntime {
994
995
  });
995
996
  try {
996
997
  await onAdvice?.(result, selected);
997
- } catch {
998
+ } catch (error) {
999
+ if (error?.runtimeLedgerPersistence === true) throw error;
998
1000
  // Rendering/telemetry callbacks are advisory only.
999
1001
  }
1000
1002
  if (!result.ok || !result.guidance) {