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.
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DDIUofA8.js → AIOps-axqQfwv8.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Bm-5xYRn.js → ActionButton-DV-Ro0By.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D5UH4ljI.js → Analytics-Bt72WEVu.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-D_ifjOOP.js → AppLayout-BtepG55E.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BY1mXdC7.js → Artifacts-B7KaJ7S_.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bujr4Ml3.js → Audit-FNFaUg7A.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-sioKSTcC.js → BackgroundAgents-DFb6J2wQ.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DDOAK8RK.js → Backup-CC7YBhyj.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CtCsVVke.js → BaseInput-RkgTNVtj.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DpNj0vnd.js → Chat-hHEmGZy-.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZta3Ftr.js → ChatBubbleRenderer-CAP9YhHv.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DoHVNSXq.js → Checkbox-z5wXOQP1.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DlVl7Qmv.js → Codegen-DVaDJnxy.js} +1 -1
- package/src/assets/web-panel/assets/{Col-GIqoPYty.js → Col-CJmaRDR5.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CIAPEVji.js → Community-DF29_2bI.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BN7JiI_h.js → Compact-DtkQkBzn.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CqUWCM9B.js → Compliance-xoHDxp7I.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-A4iPp7A4.js → Cowork-BUm-R7ht.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-B2zeXXWb.js → Cron-Cgl14ZkB.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BR2xmWr8.js → Crosschain-BNcbmoqh.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BzFDjrIv.js → DID-Bwja0Zo9.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DKtDo3yA.js → Dashboard-Bk5XjEdJ.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-RNx43_YG.js → Dropdown-Ci36Oitq.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-SwMt4Rcy.js → EmailListRenderer--U04ZN4q.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CsYebZ4X.js → FamilyGuardDashboard-B2gNPR2s.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BmRKvBTy.js → Federation-C4KghYn7.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CVxGTA-0.js → FormItemContext-QL7x_Q_0.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-x2iXpyB7.js → GenericCardRenderer-F3Ryltwm.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DfqbkiOP.js → Git-2HassK5k.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-RuHyyj5O.js → Governance-DoBIp7oe.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Bn7uZ7rI.js → Inference--W01QhZ-.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DlP7XefZ.js → KnowledgeGraph-DmvwqGpT.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BYNdOiCd.js → Logs-BBJ4yAel.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-aMtgN-R6.js → MarkdownRenderer-BLCZMzhJ.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-JQYmDqM8.js → Marketplace-D5lNngSI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Cyx4yZ-9.js → McpTools-CkEVOMKH.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-VDuGZTN2.js → Memory-B1Ow1xVE.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-_yKo97gi.js → MobileBridge-SgYbUfb6.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CXRXW3q7.js → MobileProjects-BWdOvQAj.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-acTGtfLH.js → Mtc-DcTXSSma.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-ClpjXfkY.js → MtcAudit-Dt3WG4oj.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-_6Tn3o96.js → Multisig-B9B38UZx.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CK7pbZzP.js → NLProgramming-B0S4GGvG.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Czy6V_P8.js → Notes-DZ5U58Ng.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-Cqx-UVv3.js → NotificationSettings-PjL5ZW34.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-C69WDxGy.js → OrderTableRenderer-DrAX2ESt.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DFnA9vLQ.js → Organization-Cv1GYs-c.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-ReZkk2yT.js → Overflow-Bbkp_PL3.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DzjSI0aI.js → P2P-BD8QUgoZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DKTf5xIP.js → PdhVaultBrowser-BO-2PeaB.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DhQ5klhR.js → Permissions-D_OPVa02.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CUL1iHrW.js → PersonalDataHub-mh-pEmaB.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DU88iu4N.js → Pipeline-6JC2EDdb.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Bw-sYfyK.js → Privacy-CUshzUAG.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Bq3Q5y0z.js → ProjectInit-Cs2Aalri.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C8spzpho.js → ProjectSettings-1ak49tcj.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BV4oApsm.js +1 -0
- package/src/assets/web-panel/assets/{Providers-Bf4eTP9W.js → Providers-CXXxvafH.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Dme9BDU1.js → QrScannerModal-PTcDsF58.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CIXfv1rE.js → QuickAsk-CDwucrJw.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CIxvdeZ-.js → Recommend-CJlLVRXR.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C6k7MExI.js → RemoteSession-DlN-ETsO.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CISDz2bl.js → Reputation-DI23LR6m.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CdnDxXyf.js → Row-Cl7UQMrM.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C-QpRHsl.js → RssFeed-CexHNfh8.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DBjaGzSn.js → Search-BneBWvRN.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CQKukOeE.js → Security-DX7Phgrp.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DZz86jWb.js → Services-BWXO8Mte.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-jb8RMK0d.js → Skeleton-DCyOjKPJ.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CdY76fZG.js → Skills-CXqERsTB.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-C_CSiZX9.js → Sla-bhbrbz8E.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-3IPU0HBZ.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-qvimGO0O.js → SyncSettings-DBNTQLbM.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Dng5LPJC.js → Tasks-quP0bkN-.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Bwqq5Wll.js → Templates-BouWmgho.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DNWuwP7Z.js → Tenant-qv0D9s7z.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B-6Othpp.js → Terminal-BxvbE8BB.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DKpKZfzx.js → TimelineRenderer-D-IeLnJ2.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DzfGMd2J.js → Tokens-CFMKKyVG.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BXwUi74J.js → Trigger-L8as3UuJ.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BNzUq4ui.js → Trust-MxmA4VZG.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BYugxww4.js → UkeySign-C0VvJYRi.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DdauhtSJ.js → VideoEditing-Bf5QZj8N.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CSC9bCe_.js → Wallet-BIJ9riRz.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Q8AN3bTO.js → WebAuthn-B8p9Mhkw.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-d-LBGCuA.js → WorkflowEditor-BVsuaPen.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BLVDCgsZ.js → chat-BfkjoKpV.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BZlPSEHl.js → colors-DeAlsWK8.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-IWseP6R6.js → compact-item-Cs97bz5j.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DnVRV3Ao.js → createContext-BqbG60LH.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DPty0mGN.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DLQZA_Wn.js → hasIn-i_RY0b1X.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_N4-Gq9.js → index-0-agYlWL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DB0MJgF_.js → index-79V_zv1s.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOZJBTWZ.js → index-B-3tEpTc.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUq0c7gq.js → index-B-JVTrpr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dy0R5ZED.js → index-B1CbOH1i.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bxp7uDD8.js → index-B5UkyA3c.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpVrK6fr.js → index-BESLFt4q.js} +1 -1
- package/src/assets/web-panel/assets/{index-CT9vVN-X.js → index-BOVkf1K3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DOoQpuQY.js → index-BYUVuwKt.js} +1 -1
- package/src/assets/web-panel/assets/{index-CINJQEj6.js → index-BcUXAB2s.js} +1 -1
- package/src/assets/web-panel/assets/{index-CarMTIyQ.js → index-BkBi5TmC.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5dgnilC.js → index-Bm7lLR4c.js} +1 -1
- package/src/assets/web-panel/assets/index-Bt7g0Vq_.js +1 -0
- package/src/assets/web-panel/assets/{index-CbQNL0ue.js → index-BuLQobzW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpBaJ3TD.js → index-CE2VtTlp.js} +1 -1
- package/src/assets/web-panel/assets/{index-jWb70ZgZ.js → index-CED2PL_y.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEu2lMBy.js → index-CG3PRyAL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DocEhinm.js → index-CIG8fQ2_.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_LQodeJ.js → index-COdGA-8n.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZpYeqrh.js → index-CeWoNHau.js} +1 -1
- package/src/assets/web-panel/assets/{index-gt8bNefW.js → index-Cf3WCLmy.js} +1 -1
- package/src/assets/web-panel/assets/{index-N_GoWZX4.js → index-CgsqdnRV.js} +1 -1
- package/src/assets/web-panel/assets/index-ChVT0p9u.js +1 -0
- package/src/assets/web-panel/assets/{index-CZDekj7T.js → index-D2B4VPyP.js} +1 -1
- package/src/assets/web-panel/assets/{index-YSw_gxlZ.js → index-D9evtvg2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTbxp4UH.js → index-DUUrv141.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bbj2NS_I.js → index-DiSkx4UB.js} +3 -3
- package/src/assets/web-panel/assets/{index-BZs5bBnk.js → index-Dk2qouAz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DalA0TKC.js → index-Dk7-v4hP.js} +1 -1
- package/src/assets/web-panel/assets/{index-1jeAudHd.js → index-DmbfhJUP.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1ifZtXo.js → index-DqBgBpgp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhA3QEni.js → index-PT_5sBMA.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSjilZ9L.js → index-U4f5izHz.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2FqfMvU.js → index-YXgLng0K.js} +1 -1
- package/src/assets/web-panel/assets/{index-COev0W2g.js → index-ZxO_-E8a.js} +1 -1
- package/src/assets/web-panel/assets/{index-M7wxfAbm.js → index-dIHr4B_u.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjWnONdy.js → index-gyFpvL7l.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dkwsi1Kn.js → index-s1opAL-M.js} +1 -1
- package/src/assets/web-panel/assets/{index-hwVDeoC0.js → index-yObj1O4n.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Co67Kqmb.js → initDefaultProps-C9h9yKL3.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BMOxQSF_.js → motion-BvmLsPdu.js} +1 -1
- package/src/assets/web-panel/assets/{move-C5fWDw-N.js → move-CoL4ekU1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BJevpL0e.js → mtc-parser-C4pMy6xV.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BCzNU8s6.js → omit-DPuJfNxx.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CybWvDPk.js → pickAttrs-D0KEeaK2.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BMWS9HnW.js → placementArrow-BpkyINxt.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BoL2UnGY.js → responsiveObserve-DQI_wOq8.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DWNfXraU.js → slide-DYfdDiRg.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BquTM3tX.js → statusUtils-B5dtvb0D.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BEkCleim.js → styleChecker-CF310mSj.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Oecnq7EA.js → useFlexGapSupport-D1Qp4BLp.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CkDffJ4F.js → useFs-C7_iyvJK.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-qbvKXesB.js → usePersonalDataHub-DZUt_fIm.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-C6v8n6mA.js → vnode-D3dsi0lZ.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-4CTeFILV.js → zoom-WdbOlvdQ.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/commands/agent.js +90 -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/data/changelog.json +14 -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 +414 -4
- package/src/lib/agent-team/team-adjudication.js +40 -1
- package/src/lib/automation-engine.js +494 -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 +357 -1
- 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 +308 -3
- package/src/lib/scheduler-kernel/automation-adapter.js +410 -8
- package/src/lib/scheduler-kernel/automation-event-adapter.js +36 -0
- package/src/lib/scheduler-kernel/cowork-cron-adapter.js +285 -3
- package/src/lib/scheduler-kernel/loop-adapter.js +541 -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 +394 -20
- package/src/lib/scheduler-kernel/runtime.js +63 -1
- package/src/lib/scheduler-kernel/source-locator-path.js +142 -0
- package/src/lib/scheduler-kernel/store.js +2586 -85
- 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 +1272 -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/policies/agent-policy.js +4 -0
- package/src/workers/background-agent-worker.js +403 -96
- 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
|
@@ -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
|
-
|
|
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
|
|
586
|
-
outputTokens
|
|
587
|
-
|
|
588
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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:
|
|
61
|
-
output_tokens:
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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) {
|