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