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.
- package/package.json +2 -1
- package/src/assets/web-panel/assets/{AIOps-DDIUofA8.js → AIOps-CavM7W3k.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Bm-5xYRn.js → ActionButton-CUvZGabQ.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D5UH4ljI.js → Analytics-DeBnWnbe.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-D_ifjOOP.js → AppLayout-DbI5kxvd.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-BY1mXdC7.js → Artifacts-D93bigKm.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bujr4Ml3.js → Audit-CBNvfUZa.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-sioKSTcC.js → BackgroundAgents-CJLyh_YU.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DDOAK8RK.js → Backup-D_0yoehD.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CtCsVVke.js → BaseInput-TJxmbObW.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DpNj0vnd.js → Chat-CE0dto1q.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZta3Ftr.js → ChatBubbleRenderer-CZ5-yYiD.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DoHVNSXq.js → Checkbox-Ck1RVIVo.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DlVl7Qmv.js → Codegen-qpoyf6DK.js} +1 -1
- package/src/assets/web-panel/assets/{Col-GIqoPYty.js → Col-DUyPWjIE.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CIAPEVji.js → Community-D_S1BemS.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BN7JiI_h.js → Compact-BjxeK-Gc.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CqUWCM9B.js → Compliance-Dd3CEJsu.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-A4iPp7A4.js → Cowork-B4QG7-ad.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-B2zeXXWb.js → Cron-BtZnids5.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BR2xmWr8.js → Crosschain-CHPfCBFD.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BzFDjrIv.js → DID-DT8DCEOK.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DKtDo3yA.js → Dashboard-COQab5_U.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-RNx43_YG.js → Dropdown-BY1PsQuU.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-SwMt4Rcy.js → EmailListRenderer-CsuAuaq3.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CsYebZ4X.js → FamilyGuardDashboard-BqpinD-j.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BmRKvBTy.js → Federation-D0gkfQFv.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CVxGTA-0.js → FormItemContext-BqgE-axK.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-x2iXpyB7.js → GenericCardRenderer-D0hJ2KvC.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DfqbkiOP.js → Git-CmMB0uPY.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-RuHyyj5O.js → Governance-BnVEI0Dk.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Bn7uZ7rI.js → Inference-YTAMihRP.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DlP7XefZ.js → KnowledgeGraph-0ax7VHop.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BYNdOiCd.js → Logs-B9TRcokL.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-yySN5YNM.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-JQYmDqM8.js → Marketplace-B6CSuD_H.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Cyx4yZ-9.js → McpTools-CjMXvOVU.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-VDuGZTN2.js → Memory-CXRF71U3.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-_yKo97gi.js → MobileBridge-DQgNp_oS.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CXRXW3q7.js → MobileProjects-DlPwcCbq.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-acTGtfLH.js → Mtc-6hDTRPe1.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-ClpjXfkY.js → MtcAudit-BlVHU1DS.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-_6Tn3o96.js → Multisig-DP9pzEbV.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CK7pbZzP.js → NLProgramming-Djorh8EV.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Czy6V_P8.js → Notes-oLZ-JkUg.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-Cqx-UVv3.js → NotificationSettings-Cg288VH3.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-C69WDxGy.js → OrderTableRenderer-Bb1O3Ofr.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DFnA9vLQ.js → Organization-CBdo-bHs.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-ReZkk2yT.js → Overflow-qZdnVumx.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DzjSI0aI.js → P2P-D4kNfGNQ.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-DnlMemM7.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-DhQ5klhR.js → Permissions-DHucHFBJ.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-CUL1iHrW.js → PersonalDataHub-BovlOIPR.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DU88iu4N.js → Pipeline-Deru3CQY.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Bw-sYfyK.js → Privacy-Bq5oTTbU.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Bq3Q5y0z.js → ProjectInit-BfzxVWAz.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C8spzpho.js → ProjectSettings-CKC6XBtH.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CMolGhae.js +1 -0
- package/src/assets/web-panel/assets/{Providers-Bf4eTP9W.js → Providers-C_jx4TWX.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Dme9BDU1.js → QrScannerModal-BdIHeVGC.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CIXfv1rE.js → QuickAsk-BwZwAcPD.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CIxvdeZ-.js → Recommend-BNTt0L-m.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C6k7MExI.js → RemoteSession-Biyn2-Ro.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CISDz2bl.js → Reputation-D6VpG32B.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CdnDxXyf.js → Row-D_74OvQQ.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C-QpRHsl.js → RssFeed-BTr0a-BQ.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DBjaGzSn.js → Search-C3MCFoNU.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CQKukOeE.js → Security-CqW9aJ6s.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DZz86jWb.js → Services-Cw5GNaHF.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-jb8RMK0d.js → Skeleton-DZps5qeY.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CdY76fZG.js → Skills-C6NQ1znT.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-C_CSiZX9.js → Sla-DFP8G2Sh.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-ESt6MB6v.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-qvimGO0O.js → SyncSettings-BHnN98aM.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Dng5LPJC.js → Tasks-NiSCaOf-.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Bwqq5Wll.js → Templates-DsKFhW2C.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DNWuwP7Z.js → Tenant-CQ0E0ze5.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B-6Othpp.js → Terminal-D_rBu_by.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DKpKZfzx.js → TimelineRenderer-D3Vm4Po4.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DzfGMd2J.js → Tokens-DNTxRH6q.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BXwUi74J.js → Trigger-Dgprz1ms.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BNzUq4ui.js → Trust-B2rUnVBD.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BYugxww4.js → UkeySign-DEGQNc6_.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DdauhtSJ.js → VideoEditing-jlsAx3Eh.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CSC9bCe_.js → Wallet-8jQih1ij.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Q8AN3bTO.js → WebAuthn-XLeO6xIB.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-d-LBGCuA.js → WorkflowEditor-De_dgDAG.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BLVDCgsZ.js → chat-CI19R_Sk.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BZlPSEHl.js → colors-DsYTOYN3.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-IWseP6R6.js → compact-item-CM3-t_Qr.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DnVRV3Ao.js → createContext-BjxlBRZv.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-S1ld2LwU.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DLQZA_Wn.js → hasIn-RDaWX_4i.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSjilZ9L.js → index-9R6BxAr0.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_N4-Gq9.js → index-B-Z8eFUJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dy0R5ZED.js → index-B0PMlbMs.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1ifZtXo.js → index-B5REnKt8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CINJQEj6.js → index-B7WBt_4T.js} +1 -1
- package/src/assets/web-panel/assets/{index-DocEhinm.js → index-B9O9YyWE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjWnONdy.js → index-BCnZyIMA.js} +1 -1
- package/src/assets/web-panel/assets/{index-hwVDeoC0.js → index-BGqqJfL0.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bbj2NS_I.js → index-BHNYPO0b.js} +3 -3
- package/src/assets/web-panel/assets/{index-C5dgnilC.js → index-BKJr-TZp.js} +1 -1
- package/src/assets/web-panel/assets/{index-CT9vVN-X.js → index-BN6UPD2E.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpVrK6fr.js → index-Bi46Xu4u.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpBaJ3TD.js → index-BlT2VAEK.js} +1 -1
- package/src/assets/web-panel/assets/{index-1jeAudHd.js → index-C0yx-jtQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DOoQpuQY.js → index-C4gkzxkw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZpYeqrh.js → index-CVQMeiwH.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhA3QEni.js → index-Cd3euP_4.js} +1 -1
- package/src/assets/web-panel/assets/{index-N_GoWZX4.js → index-Cd9OJhHG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOZJBTWZ.js → index-CiECJi-Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-CarMTIyQ.js → index-CjTrRt13.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZDekj7T.js → index-CnHH7bnD.js} +1 -1
- package/src/assets/web-panel/assets/{index-M7wxfAbm.js → index-Cpqm1qfU.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bxp7uDD8.js → index-CyOGN6a5.js} +1 -1
- package/src/assets/web-panel/assets/{index-DalA0TKC.js → index-D0zcy54x.js} +1 -1
- package/src/assets/web-panel/assets/{index-COev0W2g.js → index-D6sm5-Xq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUq0c7gq.js → index-DIUnNOjG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZs5bBnk.js → index-DX7tuWVJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbQNL0ue.js → index-DXXtGMUJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTbxp4UH.js → index-DcPFB8qJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-YSw_gxlZ.js → index-DoQA0-52.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_LQodeJ.js → index-Drlnwr8F.js} +1 -1
- package/src/assets/web-panel/assets/index-Drz6yq0m.js +1 -0
- package/src/assets/web-panel/assets/{index-jWb70ZgZ.js → index-Dsij_KsN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DB0MJgF_.js → index-Dxge-xWl.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEu2lMBy.js → index-DyIWssPC.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2FqfMvU.js → index-IeiL9RKc.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dkwsi1Kn.js → index-nAH87mQP.js} +1 -1
- package/src/assets/web-panel/assets/{index-gt8bNefW.js → index-pPL66J85.js} +1 -1
- package/src/assets/web-panel/assets/index-uWiUs7S_.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-Co67Kqmb.js → initDefaultProps-BTL88of4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BMOxQSF_.js → motion-BUB2pXwB.js} +1 -1
- package/src/assets/web-panel/assets/{move-C5fWDw-N.js → move-egCkkOMm.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BJevpL0e.js → mtc-parser-DAWhZC8c.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BCzNU8s6.js → omit-CvOxe_6d.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CybWvDPk.js → pickAttrs-DZUSLZ5Z.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BMWS9HnW.js → placementArrow-BERxGNMY.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BoL2UnGY.js → responsiveObserve-DZuDfZ9n.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DWNfXraU.js → slide-DO756sgI.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BquTM3tX.js → statusUtils-BRQlIz28.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BEkCleim.js → styleChecker-DCSfdybl.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Oecnq7EA.js → useFlexGapSupport-LD8dWVve.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CkDffJ4F.js → useFs-BX9uW2LK.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-qbvKXesB.js → usePersonalDataHub-BPSlPuHU.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-C6v8n6mA.js → vnode-BmOILC9V.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-4CTeFILV.js → zoom-1iKowKGg.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +5 -5
- package/src/commands/agent.js +90 -1
- package/src/commands/automation.js +103 -1
- package/src/commands/chat.js +11 -2
- package/src/commands/compact.js +106 -23
- package/src/commands/loop.js +28 -10
- package/src/commands/routine.js +1 -1
- package/src/commands/scheduler-daemon.js +359 -2
- package/src/commands/session-observability.js +305 -0
- package/src/commands/session.js +38 -0
- package/src/commands/team-merge-review.js +937 -0
- package/src/commands/team.js +2 -0
- package/src/data/changelog.json +27 -1
- package/src/gateways/ws/ws-agent-handler.js +439 -5
- package/src/harness/jsonl-session-store.js +463 -125
- package/src/harness/prompt-compressor.js +86 -13
- package/src/harness/provider-backed-compaction.js +100 -27
- package/src/lib/advisor-runtime.js +3 -1
- package/src/lib/agent-schedule-store.js +549 -28
- package/src/lib/agent-team/team-adjudication.js +40 -1
- package/src/lib/agent-team/team-merge-review-store.js +765 -0
- package/src/lib/agent-team/team-merge-review-transaction.js +1223 -0
- package/src/lib/agent-team/team-merge-review.js +1847 -0
- package/src/lib/automation-center-incidents.js +314 -0
- package/src/lib/automation-center-runtime.js +448 -0
- package/src/lib/automation-center.js +182 -38
- package/src/lib/automation-engine.js +535 -0
- package/src/lib/automation-execution-authority.js +241 -12
- package/src/lib/automation-execution-incident.js +737 -0
- package/src/lib/background-agent-supervisor.js +793 -215
- package/src/lib/background-command-argv.js +24 -0
- package/src/lib/background-interaction-journal.js +361 -52
- package/src/lib/background-interaction-resolver.js +32 -0
- package/src/lib/background-launch-profile.js +2 -0
- package/src/lib/causal-observability.js +2661 -0
- package/src/lib/chat-session-admission.js +76 -0
- package/src/lib/cost-budget.js +5 -7
- package/src/lib/cowork/ab-comparator-cli.js +11 -0
- package/src/lib/cowork/debate-review-cli.js +12 -0
- package/src/lib/cowork-adapter.js +159 -38
- package/src/lib/cowork-cron.js +442 -15
- package/src/lib/cowork-task-runner.js +112 -17
- package/src/lib/delivery-coordinator.js +142 -0
- package/src/lib/direct-model-usage.js +121 -0
- package/src/lib/file-lines.js +183 -47
- package/src/lib/llm-pricing.js +12 -17
- package/src/lib/loop.js +26 -2
- package/src/lib/routine-store.js +380 -21
- package/src/lib/runtime-usage-ledger.js +182 -0
- package/src/lib/scheduler-kernel/agenda-adapter.js +325 -10
- package/src/lib/scheduler-kernel/automation-adapter.js +514 -18
- package/src/lib/scheduler-kernel/automation-event-adapter.js +123 -11
- package/src/lib/scheduler-kernel/contract.js +91 -0
- package/src/lib/scheduler-kernel/cowork-cron-adapter.js +297 -4
- package/src/lib/scheduler-kernel/loop-adapter.js +547 -6
- package/src/lib/scheduler-kernel/migration-admin.js +346 -0
- package/src/lib/scheduler-kernel/migration-rollback-admin.js +932 -0
- package/src/lib/scheduler-kernel/routine-adapter.js +400 -20
- package/src/lib/scheduler-kernel/runtime-control-capabilities.js +31 -0
- package/src/lib/scheduler-kernel/runtime.js +237 -2
- package/src/lib/scheduler-kernel/source-locator-path.js +142 -0
- package/src/lib/scheduler-kernel/store.js +3957 -248
- package/src/lib/session-host-lease.js +171 -2
- package/src/lib/session-host-snapshot.js +14 -3
- package/src/lib/session-persistence-failure.js +1 -0
- package/src/lib/session-tail.js +179 -34
- package/src/lib/session-transcript-structure.js +96 -0
- package/src/lib/sub-agent-context.js +328 -22
- package/src/lib/ws-agent-handler.js +4 -1
- package/src/repl/agent-repl.js +732 -91
- package/src/repl/chat-repl.js +5 -1
- package/src/runtime/agent-core.js +1282 -207
- package/src/runtime/fallback-model.js +5 -0
- package/src/runtime/headless-runner.js +324 -82
- package/src/runtime/headless-stream.js +232 -26
- package/src/runtime/mcp-config.js +81 -10
- package/src/runtime/policies/agent-policy.js +4 -0
- package/src/workers/background-agent-worker.js +403 -96
- package/src/assets/web-panel/assets/MarkdownRenderer-aMtgN-R6.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-DKTf5xIP.js +0 -7
- package/src/assets/web-panel/assets/Projects-Dd-xuPIc.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-C7tT9iad.js +0 -1
- package/src/assets/web-panel/assets/devWarning-Jzu62CLC.js +0 -1
- package/src/assets/web-panel/assets/index-Zb2MeDSy.js +0 -1
- package/src/assets/web-panel/assets/index-fikqml4k.js +0 -1
package/src/lib/file-lines.js
CHANGED
|
@@ -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
|
-
|
|
28
|
-
|
|
29
|
-
let pending = "";
|
|
96
|
+
let pendingParts = [];
|
|
97
|
+
let pendingBytes = 0;
|
|
30
98
|
let lineNo = 0;
|
|
31
99
|
try {
|
|
32
100
|
for (;;) {
|
|
33
|
-
const
|
|
34
|
-
if (
|
|
35
|
-
recordRead(ioMetrics,
|
|
36
|
-
|
|
37
|
-
let newline;
|
|
38
|
-
while (
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
44
|
-
|
|
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
|
-
|
|
49
|
-
if (
|
|
143
|
+
|
|
144
|
+
if (pendingBytes > 0 || includeEmpty) {
|
|
50
145
|
lineNo += 1;
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
75
|
-
let
|
|
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(
|
|
205
|
+
const length = Math.min(readChunkSize, position);
|
|
88
206
|
position -= length;
|
|
89
207
|
const chunk = Buffer.allocUnsafe(length);
|
|
90
|
-
const
|
|
91
|
-
recordRead(ioMetrics,
|
|
92
|
-
|
|
93
|
-
let
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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 =
|
|
253
|
+
const line = lineBytes.toString("utf8");
|
|
118
254
|
if (includeEmpty || line.length > 0) {
|
|
119
255
|
yield { line, terminated: !isPhysicalTail };
|
|
120
256
|
}
|
package/src/lib/llm-pricing.js
CHANGED
|
@@ -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
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
);
|
|
229
|
-
const
|
|
230
|
-
|
|
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:
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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. */
|