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
@@ -1,7 +1,64 @@
1
1
  import { closeSync, fstatSync, openSync, readSync } from "node:fs";
2
- import { StringDecoder } from "node:string_decoder";
3
2
 
4
3
  const DEFAULT_CHUNK_SIZE = 64 * 1024;
4
+ export const DEFAULT_MAX_FILE_LINE_BYTES = 16 * 1024 * 1024;
5
+ export const FILE_LINE_TOO_LARGE_CODE = "CC_FILE_LINE_TOO_LARGE";
6
+
7
+ function normalizeMaxLineBytes(value) {
8
+ const parsed = Number(value);
9
+ if (!Number.isSafeInteger(parsed) || parsed <= 0) {
10
+ throw new TypeError("maxLineBytes must be a positive safe integer");
11
+ }
12
+ return parsed;
13
+ }
14
+
15
+ function normalizeChunkSize(value) {
16
+ const parsed = Number(value);
17
+ if (!Number.isSafeInteger(parsed) || parsed <= 0) {
18
+ throw new TypeError("chunkSize must be a positive safe integer");
19
+ }
20
+ return parsed;
21
+ }
22
+
23
+ export function assertFileLineByteLength(
24
+ byteLength,
25
+ {
26
+ maxLineBytes = DEFAULT_MAX_FILE_LINE_BYTES,
27
+ code = FILE_LINE_TOO_LARGE_CODE,
28
+ lineNo = null,
29
+ direction = null,
30
+ label = "File line",
31
+ } = {},
32
+ ) {
33
+ const actualBytes = Number(byteLength);
34
+ const maxBytes = normalizeMaxLineBytes(maxLineBytes);
35
+ if (!Number.isSafeInteger(actualBytes) || actualBytes < 0) {
36
+ throw new TypeError("byteLength must be a non-negative safe integer");
37
+ }
38
+ if (actualBytes <= maxBytes) return actualBytes;
39
+ const error = new Error(`${label} exceeded the ${maxBytes}-byte limit`);
40
+ error.code = code;
41
+ error.actualBytes = actualBytes;
42
+ error.maxBytes = maxBytes;
43
+ if (Number.isSafeInteger(lineNo) && lineNo > 0) error.lineNo = lineNo;
44
+ if (direction) error.direction = direction;
45
+ throw error;
46
+ }
47
+
48
+ function assertLineByteLength(byteLength, options, details) {
49
+ return assertFileLineByteLength(byteLength, {
50
+ maxLineBytes: options.maxLineBytes,
51
+ code: options.lineTooLargeCode,
52
+ label: options.lineLabel,
53
+ ...details,
54
+ });
55
+ }
56
+
57
+ function joinedLineBuffer(parts, byteLength) {
58
+ if (parts.length === 0) return Buffer.alloc(0);
59
+ if (parts.length === 1) return parts[0];
60
+ return Buffer.concat(parts, byteLength);
61
+ }
5
62
 
6
63
  function recordRead(ioMetrics, bytes) {
7
64
  if (!ioMetrics || typeof ioMetrics !== "object") return;
@@ -13,7 +70,8 @@ function recordRead(ioMetrics, bytes) {
13
70
  /**
14
71
  * Stream UTF-8 lines from a file without loading the whole file. The final
15
72
  * unterminated fragment is yielded with `terminated:false`, which lets callers
16
- * distinguish a crash tail from a normal record.
73
+ * distinguish a crash tail from a normal record. Records are assembled as raw
74
+ * byte slices and checked before any Buffer.concat or UTF-8 decode.
17
75
  */
18
76
  export function* iterateFileLinesSync(
19
77
  filePath,
@@ -21,35 +79,81 @@ export function* iterateFileLinesSync(
21
79
  chunkSize = DEFAULT_CHUNK_SIZE,
22
80
  includeEmpty = false,
23
81
  ioMetrics = null,
82
+ maxLineBytes = DEFAULT_MAX_FILE_LINE_BYTES,
83
+ lineTooLargeCode = FILE_LINE_TOO_LARGE_CODE,
84
+ lineLabel = "File line",
24
85
  } = {},
25
86
  ) {
87
+ const lineOptions = {
88
+ maxLineBytes: normalizeMaxLineBytes(maxLineBytes),
89
+ lineTooLargeCode,
90
+ lineLabel,
91
+ };
92
+ const buffer = Buffer.allocUnsafe(
93
+ Math.min(normalizeChunkSize(chunkSize), lineOptions.maxLineBytes),
94
+ );
26
95
  const fd = openSync(filePath, "r");
27
- const decoder = new StringDecoder("utf8");
28
- const buffer = Buffer.allocUnsafe(Math.max(1024, chunkSize));
29
- let pending = "";
96
+ let pendingParts = [];
97
+ let pendingBytes = 0;
30
98
  let lineNo = 0;
31
99
  try {
32
100
  for (;;) {
33
- const bytes = readSync(fd, buffer, 0, buffer.length, null);
34
- if (bytes === 0) break;
35
- recordRead(ioMetrics, bytes);
36
- pending += decoder.write(buffer.subarray(0, bytes));
37
- let newline;
38
- while ((newline = pending.indexOf("\n")) >= 0) {
39
- let line = pending.slice(0, newline);
40
- if (line.endsWith("\r")) line = line.slice(0, -1);
41
- pending = pending.slice(newline + 1);
101
+ const bytesRead = readSync(fd, buffer, 0, buffer.length, null);
102
+ if (bytesRead === 0) break;
103
+ recordRead(ioMetrics, bytesRead);
104
+ let start = 0;
105
+ let newline = buffer.indexOf(0x0a, start);
106
+ while (newline >= 0 && newline < bytesRead) {
107
+ const segment = buffer.subarray(start, newline);
108
+ const lineByteLength = pendingBytes + segment.length;
42
109
  lineNo += 1;
43
- if (includeEmpty || line.length > 0) {
44
- yield { line, lineNo, terminated: true };
110
+ assertLineByteLength(lineByteLength, lineOptions, {
111
+ lineNo,
112
+ direction: "forward",
113
+ });
114
+ let lineBytes = joinedLineBuffer(
115
+ segment.length > 0 ? [...pendingParts, segment] : pendingParts,
116
+ lineByteLength,
117
+ );
118
+ if (lineBytes.length > 0 && lineBytes[lineBytes.length - 1] === 0x0d) {
119
+ lineBytes = lineBytes.subarray(0, lineBytes.length - 1);
120
+ }
121
+ if (includeEmpty || lineBytes.length > 0) {
122
+ yield {
123
+ line: lineBytes.toString("utf8"),
124
+ lineNo,
125
+ terminated: true,
126
+ };
45
127
  }
128
+ pendingParts = [];
129
+ pendingBytes = 0;
130
+ start = newline + 1;
131
+ newline = buffer.indexOf(0x0a, start);
46
132
  }
133
+
134
+ const trailing = buffer.subarray(start, bytesRead);
135
+ const nextPendingBytes = pendingBytes + trailing.length;
136
+ assertLineByteLength(nextPendingBytes, lineOptions, {
137
+ lineNo: lineNo + 1,
138
+ direction: "forward",
139
+ });
140
+ if (trailing.length > 0) pendingParts.push(Buffer.from(trailing));
141
+ pendingBytes = nextPendingBytes;
47
142
  }
48
- pending += decoder.end();
49
- if (pending.length > 0 || includeEmpty) {
143
+
144
+ if (pendingBytes > 0 || includeEmpty) {
50
145
  lineNo += 1;
51
- if (includeEmpty || pending.length > 0) {
52
- yield { line: pending, lineNo, terminated: false };
146
+ assertLineByteLength(pendingBytes, lineOptions, {
147
+ lineNo,
148
+ direction: "forward",
149
+ });
150
+ if (includeEmpty || pendingBytes > 0) {
151
+ const pending = joinedLineBuffer(pendingParts, pendingBytes);
152
+ yield {
153
+ line: pending.toString("utf8"),
154
+ lineNo,
155
+ terminated: false,
156
+ };
53
157
  }
54
158
  }
55
159
  } finally {
@@ -68,36 +172,57 @@ export function* iterateFileLinesReverseSync(
68
172
  chunkSize = DEFAULT_CHUNK_SIZE,
69
173
  includeEmpty = false,
70
174
  ioMetrics = null,
175
+ maxLineBytes = DEFAULT_MAX_FILE_LINE_BYTES,
176
+ lineTooLargeCode = FILE_LINE_TOO_LARGE_CODE,
177
+ lineLabel = "File line",
71
178
  } = {},
72
179
  ) {
180
+ const lineOptions = {
181
+ maxLineBytes: normalizeMaxLineBytes(maxLineBytes),
182
+ lineTooLargeCode,
183
+ lineLabel,
184
+ };
185
+ const readChunkSize = Math.min(
186
+ normalizeChunkSize(chunkSize),
187
+ lineOptions.maxLineBytes,
188
+ );
73
189
  const fd = openSync(filePath, "r");
74
- const size = fstatSync(fd).size;
75
- let endsWithNewline = false;
76
- if (size > 0) {
77
- const last = Buffer.allocUnsafe(1);
78
- const bytes = readSync(fd, last, 0, 1, size - 1);
79
- recordRead(ioMetrics, bytes);
80
- endsWithNewline = last[0] === 0x0a;
81
- }
82
- let position = size;
83
- let carry = Buffer.alloc(0);
190
+ let carryParts = [];
191
+ let carryBytes = 0;
84
192
  let isPhysicalTail = true;
85
193
  try {
194
+ const size = fstatSync(fd).size;
195
+ let endsWithNewline = false;
196
+ if (size > 0) {
197
+ const last = Buffer.allocUnsafe(1);
198
+ const bytesRead = readSync(fd, last, 0, 1, size - 1);
199
+ recordRead(ioMetrics, bytesRead);
200
+ endsWithNewline = last[0] === 0x0a;
201
+ }
202
+
203
+ let position = size;
86
204
  while (position > 0) {
87
- const length = Math.min(Math.max(1024, chunkSize), position);
205
+ const length = Math.min(readChunkSize, position);
88
206
  position -= length;
89
207
  const chunk = Buffer.allocUnsafe(length);
90
- const bytes = readSync(fd, chunk, 0, length, position);
91
- recordRead(ioMetrics, bytes);
92
- const combined = Buffer.concat([chunk, carry]);
93
- let end = combined.length;
94
- for (let index = combined.length - 1; index >= 0; index -= 1) {
95
- if (combined[index] !== 0x0a) continue;
96
- let bytes = combined.subarray(index + 1, end);
97
- if (bytes.length > 0 && bytes[bytes.length - 1] === 0x0d) {
98
- bytes = bytes.subarray(0, bytes.length - 1);
208
+ const bytesRead = readSync(fd, chunk, 0, length, position);
209
+ recordRead(ioMetrics, bytesRead);
210
+ let end = bytesRead;
211
+ for (let index = bytesRead - 1; index >= 0; index -= 1) {
212
+ if (chunk[index] !== 0x0a) continue;
213
+ const segment = chunk.subarray(index + 1, end);
214
+ const lineByteLength = segment.length + carryBytes;
215
+ assertLineByteLength(lineByteLength, lineOptions, {
216
+ direction: "reverse",
217
+ });
218
+ let lineBytes = joinedLineBuffer(
219
+ segment.length > 0 ? [segment, ...carryParts] : carryParts,
220
+ lineByteLength,
221
+ );
222
+ if (lineBytes.length > 0 && lineBytes[lineBytes.length - 1] === 0x0d) {
223
+ lineBytes = lineBytes.subarray(0, lineBytes.length - 1);
99
224
  }
100
- const line = bytes.toString("utf8");
225
+ const line = lineBytes.toString("utf8");
101
226
  const terminated = isPhysicalTail ? endsWithNewline : true;
102
227
  // A file ending in "\n" produces one empty physical-tail slice. Skip
103
228
  // it without changing the termination status of the real last line.
@@ -105,16 +230,27 @@ export function* iterateFileLinesReverseSync(
105
230
  yield { line, terminated };
106
231
  isPhysicalTail = false;
107
232
  }
233
+ carryParts = [];
234
+ carryBytes = 0;
108
235
  end = index;
109
236
  }
110
- carry = combined.subarray(0, end);
237
+
238
+ const prefix = chunk.subarray(0, end);
239
+ const nextCarryBytes = prefix.length + carryBytes;
240
+ assertLineByteLength(nextCarryBytes, lineOptions, {
241
+ direction: "reverse",
242
+ });
243
+ if (prefix.length > 0) carryParts.unshift(Buffer.from(prefix));
244
+ carryBytes = nextCarryBytes;
111
245
  }
112
- if (carry.length > 0 || includeEmpty) {
113
- let bytes = carry;
114
- if (bytes.length > 0 && bytes[bytes.length - 1] === 0x0d) {
115
- bytes = bytes.subarray(0, bytes.length - 1);
246
+
247
+ if (carryBytes > 0 || includeEmpty) {
248
+ assertLineByteLength(carryBytes, lineOptions, { direction: "reverse" });
249
+ let lineBytes = joinedLineBuffer(carryParts, carryBytes);
250
+ if (lineBytes.length > 0 && lineBytes[lineBytes.length - 1] === 0x0d) {
251
+ lineBytes = lineBytes.subarray(0, lineBytes.length - 1);
116
252
  }
117
- const line = bytes.toString("utf8");
253
+ const line = lineBytes.toString("utf8");
118
254
  if (includeEmpty || line.length > 0) {
119
255
  yield { line, terminated: !isPhysicalTail };
120
256
  }
@@ -84,11 +84,6 @@ export const PRICE_TABLE = Object.freeze({
84
84
  ],
85
85
  });
86
86
 
87
- const round = (n, dp = 6) => {
88
- const f = Math.pow(10, dp);
89
- return Math.round((Number(n) + Number.EPSILON) * f) / f;
90
- };
91
-
92
87
  /**
93
88
  * Merge user-supplied price overrides (typically `config.llm.pricing`) onto the
94
89
  * built-in table. Override shape mirrors PRICE_TABLE:
@@ -221,22 +216,22 @@ export function estimateCost({
221
216
  rate: null,
222
217
  };
223
218
  }
224
- const inputCost = round((Number(inputTokens) / 1e6) * rate.in);
225
- const outputCost = round((Number(outputTokens) / 1e6) * rate.out);
226
- const cacheReadCost = round(
227
- (Number(cacheReadTokens) / 1e6) * rate.in * cacheReadMultiplier(provider),
228
- );
229
- const cacheCreationCost = round(
230
- (Number(cacheCreationTokens) / 1e6) * rate.in * CACHE_WRITE_MULTIPLIER,
231
- );
219
+ // Keep full IEEE-754 precision throughout authority and budget arithmetic.
220
+ // Rounding each component to six decimals lets a real sub-microdollar call
221
+ // become zero and can make a hard `maxUsd` gate pass incorrectly. Display
222
+ // surfaces may format these values, but safety decisions consume the raw sum.
223
+ const inputCost = (Number(inputTokens) / 1e6) * rate.in;
224
+ const outputCost = (Number(outputTokens) / 1e6) * rate.out;
225
+ const cacheReadCost =
226
+ (Number(cacheReadTokens) / 1e6) * rate.in * cacheReadMultiplier(provider);
227
+ const cacheCreationCost =
228
+ (Number(cacheCreationTokens) / 1e6) * rate.in * CACHE_WRITE_MULTIPLIER;
232
229
  return {
233
230
  inputCost,
234
231
  outputCost,
235
232
  cacheReadCost,
236
233
  cacheCreationCost,
237
- totalCost: round(
238
- inputCost + outputCost + cacheReadCost + cacheCreationCost,
239
- ),
234
+ totalCost: inputCost + outputCost + cacheReadCost + cacheCreationCost,
240
235
  currency: "USD",
241
236
  matched: true,
242
237
  free: rate.pattern === "free",
@@ -280,7 +275,7 @@ export function priceRollup(aggregate, { table } = {}) {
280
275
  const unpriced = [];
281
276
  for (const row of byModel) {
282
277
  if (row.matched) {
283
- totalCost = round(totalCost + row.cost);
278
+ totalCost += row.cost;
284
279
  } else if (row.totalTokens > 0) {
285
280
  unpriced.push({
286
281
  provider: row.provider,
package/src/lib/loop.js CHANGED
@@ -88,9 +88,25 @@ export function summarizeLoopEvents(events) {
88
88
  let lastExitCode = null;
89
89
  const scheduled = new Map();
90
90
  const completed = new Set();
91
+ let schedulerMigration = null;
91
92
  for (const e of events || []) {
92
93
  if (e?.type === "loop_config") {
93
- config = e.data || null;
94
+ const migrationFence = e.data?.schedulerMigrationFence;
95
+ if (
96
+ migrationFence?.schemaVersion === 1 &&
97
+ migrationFence.state === "retired" &&
98
+ migrationFence.originalConfig &&
99
+ typeof migrationFence.originalConfig === "object" &&
100
+ !Array.isArray(migrationFence.originalConfig)
101
+ ) {
102
+ // New clients recover the original definition from the fence while an
103
+ // older client sees the intentionally empty operands and refuses to
104
+ // start. The source is restored by appending the original loop_config.
105
+ config = migrationFence.originalConfig;
106
+ schedulerMigration = migrationFence;
107
+ } else {
108
+ config = e.data || null;
109
+ }
94
110
  } else if (
95
111
  e?.type === "loop_iteration_scheduled" &&
96
112
  Number.isSafeInteger(e.data?.n) &&
@@ -110,13 +126,21 @@ export function summarizeLoopEvents(events) {
110
126
  if (e.data && typeof e.data.exitCode !== "undefined") {
111
127
  lastExitCode = e.data.exitCode;
112
128
  }
129
+ } else if (e?.type === "loop_scheduler_migration") {
130
+ schedulerMigration = e.data || null;
113
131
  }
114
132
  }
115
133
  const pendingIteration =
116
134
  [...scheduled.values()]
117
135
  .filter((entry) => !completed.has(entry.n))
118
136
  .sort((a, b) => a.n - b.n)[0] || null;
119
- return { config, completedIterations, lastExitCode, pendingIteration };
137
+ return {
138
+ config,
139
+ completedIterations,
140
+ lastExitCode,
141
+ pendingIteration,
142
+ schedulerMigration,
143
+ };
120
144
  }
121
145
 
122
146
  /** Return durable terminal data for one loop iteration, if already recorded. */