chainlesschain 0.163.2 → 0.163.4
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 +3 -2
- package/scripts/command-lifecycle-report.mjs +330 -38
- package/src/assets/web-panel/assets/{AIOps-DnGsmsqJ.js → AIOps-DB5X7qqV.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CrO6fcQ7.js → ActionButton-DxHRtKLk.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DsBdOaP2.js → Analytics-DIH5QrxT.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DmQslKUB.js → AppLayout-uu0oxVz7.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BvyrT_QQ.js → Artifacts-BNSMiW9Y.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-prndoLiC.js → Audit-DcAzB4_x.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DOTFyA55.js → BackgroundAgents-ClSsvjIc.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-9zOnPp_8.js → Backup-BMciY0js.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C4PC6sAG.js → BaseInput-Hn3b57Sh.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BBAF-W9v.js → Chat-CoSlC53V.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CWhvvloO.js → ChatBubbleRenderer-CFevJ3So.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BI9iculd.js → Checkbox-B4L4Eu4w.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-3DP9BCKb.js → Codegen-C77FgRxF.js} +1 -1
- package/src/assets/web-panel/assets/{Col-df-2TnJX.js → Col-BrLtJLH3.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CHs8gG_A.js → Community-Be7pXXhA.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CDfF6q7V.js → Compact-DuGPecjo.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CthrDnO7.js → Compliance-CzS66mjP.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-HjIqsWJw.js → Cowork-CEhjCoyK.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BKc196fb.js → Cron-D7ir8Vja.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CJnjdc8W.js → Crosschain-BcXmuLxf.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BHUy-8Q2.js → DID-Cto1dtBy.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-QDB7sKeY.js → Dashboard-B7KjgwOX.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DStcVK11.js → Dropdown-COMqxijg.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BwSUskMJ.js → EmailListRenderer-BZrya-nf.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgF_kurT.js → FamilyGuardDashboard-AmVeMq0J.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-k8wvv-wN.js → Federation-kZU8c-27.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C11qoq2r.js → FormItemContext-sOV22v2-.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BIIpr9kg.js → GenericCardRenderer-BUuLtGCz.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BlA1exTe.js → Git-K-ZxsLsH.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CYa1ZYM4.js → Governance-D3OEnawI.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-6_kKVIt6.js → Inference-Bll0gRmP.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CB4AwxYy.js → KnowledgeGraph-DBXwjr53.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-xf7nHFAe.js → Logs-CEzPwEfP.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-Bf3DEqP6.js → MarkdownRenderer-CLmCbHx6.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-aPg8e4Jt.js → Marketplace-BYyRyOPz.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C-TNlVUf.js → McpTools-DVu8w_rM.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DMTPIpGa.js → Memory-tenuZ_hO.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BxyvveRq.js → MobileBridge-Bxgy4ozS.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DyPCrAyQ.js → MobileProjects-Dgx1D6sc.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BdhqNXp6.js → Mtc-CRfJ8r8j.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-Cz-HFxzW.js → MtcAudit-BBJq4Aiz.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CIUaFNsx.js → Multisig-B3ii9lai.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CWe6-J17.js → NLProgramming-FIi-Cubv.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-vYAKeviU.js → Notes-DIq8MPf1.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DQL9-2d7.js → NotificationSettings-BFOD9eGd.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DnXj1jBn.js → OrderTableRenderer--41u7vre.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B3spU8AN.js → Organization-B_0AWztW.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-DgEwo7vm.js → Overflow-B6I7TuXv.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-hujMRH8X.js → P2P-Cdf6qens.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-C_qhdg9h.js → PdhVaultBrowser-B_0FcQJY.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-vp7LMcSf.js → Permissions-6nFBjsQp.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dxr5Hgnq.js → PersonalDataHub-nQYV7xpn.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-DEPZqqH4.js → Pipeline-CBVod5jm.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DTpDiKPe.js → Privacy-D52jW1Nt.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-jDJsRWmF.js → ProjectInit-Bdx3BYhf.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Dhor5RWH.js → ProjectSettings-b7xr4DUa.js} +2 -2
- package/src/assets/web-panel/assets/Projects-DhfifCKx.js +1 -0
- package/src/assets/web-panel/assets/Providers-Dy_PgDMr.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-CjIw-wIb.js → QrScannerModal-FQKSmc3e.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DX6jcqoi.js → QuickAsk-CSTrhzcF.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DopXkhar.js → Recommend-CxMABOUh.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BLvqJE9c.js → RemoteSession-Cv2T8yRa.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DhRj2Me7.js → Reputation-CE1k4Vvu.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DQ53vuPq.js → Row-BNgNcAV_.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BslvwiBD.js → RssFeed-5ZiBZ3ph.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DJKBDNKZ.js → Search-mDOIF1UV.js} +1 -1
- package/src/assets/web-panel/assets/{Security-COhpxHER.js → Security-CtuCTC-e.js} +3 -3
- package/src/assets/web-panel/assets/{Services-dbulD6cI.js → Services-DxFO2Zg7.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-ciIVNfhC.js → Skeleton-CKmKkH9y.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-AiRTkTCk.js → Skills-Bmzl9qkk.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DDMcWYBc.js → Sla-9RqaWHOC.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BPxWbpXO.js → SpeechSettings-CGdzFIYw.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BoEOXCyg.js → SyncSettings-CvNuCeBT.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-B_sLdcnw.js +1 -0
- package/src/assets/web-panel/assets/{Templates-UowY8Ixe.js → Templates-D9_YijdK.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DauSLQXN.js → Tenant-Cuc7BUSP.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DBj7Jneq.js → Terminal-6VYRnJgd.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-UMrPwoZC.js → TimelineRenderer-GtK8xd8Y.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-4ea96-bn.js → Tokens-BZ94Lt5W.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger--ISCqt4b.js → Trigger-DEcZgDaX.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D4GVimRJ.js → Trust-CC3z9THe.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Ci-nXRQc.js → UkeySign-Cvtw8cV3.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Cjk7mKPw.js → VideoEditing-CL4e6Bn3.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BgOLOO3Z.js → Wallet-ycEemP27.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-CCX0K29i.js → WebAuthn-DgZ4X_aw.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-Ch3zgIsE.js → WorkflowEditor-D0qMhSv7.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DKOU_2Vb.js → chat-DsAg01Zn.js} +1 -1
- package/src/assets/web-panel/assets/{colors-6OVo4u3C.js → colors-B0oqAhrQ.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BH78Hlsq.js → compact-item-CmX0Rabz.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CFRpSbbC.js → createContext-Be4cn1Ub.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CP2qzG6D.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DNQhgcVi.js → hasIn-D5v12kVq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkN3iTTp.js → index-0eWLkQKT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkNEMANR.js → index-301ogenv.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3RtTT4K.js → index-5LGY0JbG.js} +1 -1
- package/src/assets/web-panel/assets/{index-dDkoL4Pe.js → index-7VKDn-t1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHa4WyTZ.js → index-8WvYGnON.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaYqY35Z.js → index-B1YGjOWC.js} +1 -1
- package/src/assets/web-panel/assets/{index-bKm3TUDp.js → index-B3mUHuVc.js} +1 -1
- package/src/assets/web-panel/assets/{index--rq90rL9.js → index-BA4oulaP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaDgdJYj.js → index-BBREnn1V.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_Z-YoxX.js → index-BBvyHguy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkqHgG-b.js → index-BKmsS2jj.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrcLHN2F.js → index-BRIqLy1m.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaVE6E8y.js → index-BXGSbelg.js} +3 -3
- package/src/assets/web-panel/assets/{index-BYrnm5Ob.js → index-BaE0Ui07.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDSR7ecX.js → index-BoAIAZ5C.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNuCHHQT.js → index-BqltWojQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Eag8e_mA.js → index-CGiIyTZw.js} +1 -1
- package/src/assets/web-panel/assets/index-CKB0vbJU.js +1 -0
- package/src/assets/web-panel/assets/{index-BepBTpa8.js → index-CZ2wUEgr.js} +1 -1
- package/src/assets/web-panel/assets/{index-HNGGVF6o.js → index-CZpfzcuy.js} +1 -1
- package/src/assets/web-panel/assets/{index-AuBhLqOm.js → index-Ckrk3pIV.js} +1 -1
- package/src/assets/web-panel/assets/{index-7TC3S8SN.js → index-CqoCZ5vR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFPJ8yzF.js → index-CyWBir7N.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bb6kDrUx.js → index-CyyGTMKd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKN2noIF.js → index-D0BSkxYQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Du0rnksC.js → index-D5YVopyr.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxRy5LPR.js → index-DKUBj36_.js} +1 -1
- package/src/assets/web-panel/assets/{index-sm7W8AXy.js → index-DM724NgU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BujsOZfc.js → index-DQRsQen0.js} +1 -1
- package/src/assets/web-panel/assets/index-DgoXmwqB.js +1 -0
- package/src/assets/web-panel/assets/{index-Y9MJv28e.js → index-DikJ0Qqe.js} +1 -1
- package/src/assets/web-panel/assets/{index-caye7AOE.js → index-Dn2dSdXx.js} +1 -1
- package/src/assets/web-panel/assets/{index-cdf7fd7d.js → index-DyUaFWEk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnnXQot_.js → index-Hfe_dEGx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvHGtNnF.js → index-_JjRLSD0.js} +1 -1
- package/src/assets/web-panel/assets/{index-nbfHl1oV.js → index-frSojpHj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cu3L4r5l.js → index-jK3ax6Z6.js} +1 -1
- package/src/assets/web-panel/assets/{index-D84id2Y4.js → index-qMuZ-NRR.js} +1 -1
- package/src/assets/web-panel/assets/{index-hPY0fFrd.js → index-q_fQ94SE.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BZ9w6jPL.js → initDefaultProps-D4VdhJ9_.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BnwUiOho.js → motion-CZJA0MQW.js} +1 -1
- package/src/assets/web-panel/assets/{move-ByUKJnNm.js → move-BqEs7Sb1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-V7yK1KEl.js → mtc-parser-BpHEtsu1.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BEXBBt4j.js → omit-BW94tY9W.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-qDm_46Gi.js → pickAttrs-BnBjPWP9.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BIbhEo_0.js → placementArrow-uUkjQ_hu.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-NbPbDgA_.js → responsiveObserve-B-klUqXK.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BnUWglZ0.js → slide-CvY1cNAs.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BX8_wZI5.js → statusUtils-Ix5sEDT2.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BV4OycQX.js → styleChecker-C8qcXOne.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Od_H5llY.js → useFlexGapSupport-KNF6Kj8f.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BWI-PyiX.js → useFs-DGJr345n.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BqMuhG3g.js → usePersonalDataHub-BboN99rI.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DNd23z6f.js → vnode-Bgt8Vgte.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Cjaxnm7l.js → zoom-BhJtErgt.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/commands/agenda.js +6 -5
- package/src/commands/agent.js +237 -75
- package/src/commands/agents.js +6 -0
- package/src/commands/artifacts.js +98 -0
- package/src/commands/background-session.js +11 -1
- package/src/commands/mcp.js +218 -31
- package/src/commands/review.js +221 -22
- package/src/commands/session-mcp-recovery.js +5 -5
- package/src/data/changelog.json +27 -1
- package/src/gateways/ws/ws-agent-handler.js +492 -14
- package/src/harness/jsonl-session-store.js +39 -1
- package/src/harness/mcp-client.js +414 -71
- package/src/harness/prompt-compressor.js +24 -0
- package/src/harness/provider-backed-compaction.js +205 -0
- package/src/harness/worktree-isolator.js +26 -3
- package/src/lib/agent-worktree.js +41 -2
- package/src/lib/app-preview.js +3 -0
- package/src/lib/background-agent-supervisor.js +790 -186
- package/src/lib/background-command-argv.js +318 -0
- package/src/lib/background-launch-profile.js +1 -0
- package/src/lib/background-phase-reporter.js +22 -2
- package/src/lib/background-worktree-policy.js +109 -0
- package/src/lib/command-lifecycle-report.js +1340 -145
- package/src/lib/cowork-mcp-tools.js +51 -6
- package/src/lib/cowork-task-runner.js +1 -0
- package/src/lib/delivery-coordinator.js +30 -5
- package/src/lib/delivery-production-adapter.js +1777 -0
- package/src/lib/delivery-production-runner.js +240 -0
- package/src/lib/durable-security-store.js +29 -17
- package/src/lib/execution-trace/trace-context.cjs +179 -0
- package/src/lib/execution-trace/trace-context.js +8 -175
- package/src/lib/mcp-call-ledger-store.js +58 -6
- package/src/lib/mcp-headers-helper.js +76 -8
- package/src/lib/mcp-host-recovery-runtime.js +2 -0
- package/src/lib/mcp-ledger-recovery-admission.js +39 -3
- package/src/lib/mcp-recovery-adjudication.js +256 -19
- package/src/lib/mcp-sandbox-policy.js +184 -0
- package/src/lib/mcp-stdio-capsule-builder-worker.cjs +495 -0
- package/src/lib/mcp-stdio-executable-identity.js +33 -2
- package/src/lib/mcp-stdio-execution-authority.js +163 -0
- package/src/lib/mcp-stdio-immutable-vfs-resolver.cjs +830 -0
- package/src/lib/mcp-stdio-package-materialization.js +721 -333
- package/src/lib/mcp-stdio-workspace-authority.js +252 -0
- package/src/lib/observability/index.js +2 -0
- package/src/lib/observability/otlp-exporter.js +2 -2
- package/src/lib/packer/pack-update-applier.js +8 -1
- package/src/lib/packer/pkg-config-generator.js +34 -0
- package/src/lib/plugin-runtime/sandbox-policy.js +42 -2
- package/src/lib/process-execution-broker/index.js +213 -109
- package/src/lib/process-execution-broker/platform-sandbox.js +1024 -169
- package/src/lib/process-tree-termination.js +17 -1
- package/src/lib/scheduler-kernel/contract.js +315 -0
- package/src/lib/scheduler-kernel/store.js +1345 -0
- package/src/lib/session-host-lease.js +403 -30
- package/src/lib/session-persistence-failure.js +4 -1
- package/src/lib/skill-mcp.js +65 -4
- package/src/lib/sub-agent-context.js +8 -0
- package/src/lib/web-fetch.js +4 -4
- package/src/repl/agent-repl.js +285 -38
- package/src/runtime/agent-core.js +1044 -90
- package/src/runtime/agent-runtime.js +61 -8
- package/src/runtime/headless-runner.js +260 -166
- package/src/runtime/headless-stream.js +254 -25
- package/src/runtime/mcp-config.js +235 -28
- package/src/workers/background-agent-worker.js +492 -71
- package/src/assets/web-panel/assets/Projects-08xUDZGt.js +0 -1
- package/src/assets/web-panel/assets/Providers-BGs47s1a.js +0 -1
- package/src/assets/web-panel/assets/Tasks-CEYFJwmr.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DEMblAIm.js +0 -1
- package/src/assets/web-panel/assets/index-BTvq-36D.js +0 -1
- package/src/assets/web-panel/assets/index-hUpvk6Jl.js +0 -1
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
import { createHash } from "node:crypto";
|
|
13
13
|
import { feature, featureVariant } from "../lib/feature-flags.js";
|
|
14
|
+
import { isAbortError } from "../lib/abort-utils.js";
|
|
14
15
|
import {
|
|
15
16
|
DURABLE_SYSTEM_MESSAGE_KINDS,
|
|
16
17
|
getDurableSystemMessageProvenance,
|
|
@@ -566,6 +567,8 @@ export class PromptCompressor {
|
|
|
566
567
|
let degradedReason = null;
|
|
567
568
|
let rawSummary;
|
|
568
569
|
let summaryUsage = null;
|
|
570
|
+
let summaryUsageUnknown = false;
|
|
571
|
+
let summaryUsageUnknownReason = null;
|
|
569
572
|
let summaryProvider = null;
|
|
570
573
|
let summaryModel = null;
|
|
571
574
|
try {
|
|
@@ -592,6 +595,12 @@ export class PromptCompressor {
|
|
|
592
595
|
usage.cache_creation_tokens,
|
|
593
596
|
) || 0,
|
|
594
597
|
};
|
|
598
|
+
} else if (queryResult.usageOutcome !== "not-billable") {
|
|
599
|
+
// Standard provider adapters return an explicit `usage` field. A
|
|
600
|
+
// successful response without it is still a paid call whose amount
|
|
601
|
+
// is unknown; never let a hard budget silently count it as zero.
|
|
602
|
+
summaryUsageUnknown = true;
|
|
603
|
+
summaryUsageUnknownReason = "provider_usage_not_reported";
|
|
595
604
|
}
|
|
596
605
|
summaryProvider = queryResult.provider || null;
|
|
597
606
|
summaryModel = queryResult.model || null;
|
|
@@ -599,9 +608,18 @@ export class PromptCompressor {
|
|
|
599
608
|
rawSummary = queryResult;
|
|
600
609
|
}
|
|
601
610
|
} catch (error) {
|
|
611
|
+
// Cancellation is authoritative. Treating AbortError as an ordinary
|
|
612
|
+
// provider failure would manufacture an extractive summary after Stop and
|
|
613
|
+
// let callers apply/persist it even though the operation was cancelled.
|
|
614
|
+
if (isAbortError(error)) throw error;
|
|
602
615
|
degraded = true;
|
|
603
616
|
summaryMode = "extractive-fallback";
|
|
604
617
|
degradedReason = `llm_query_failed:${boundedFailureMessage(error)}`;
|
|
618
|
+
// A transport exception does not prove that the provider rejected the
|
|
619
|
+
// request before billing it. Keep that uncertainty explicit so a hard
|
|
620
|
+
// budget can latch instead of silently accounting the call as $0.
|
|
621
|
+
summaryUsageUnknown = true;
|
|
622
|
+
summaryUsageUnknownReason = "provider_transport_outcome_unknown";
|
|
605
623
|
}
|
|
606
624
|
if (!degraded) {
|
|
607
625
|
try {
|
|
@@ -644,6 +662,12 @@ export class PromptCompressor {
|
|
|
644
662
|
summaryInputChars: prompt.length,
|
|
645
663
|
summaryInputLimit: this.summaryInputMaxChars,
|
|
646
664
|
...(summaryUsage ? { summaryUsage } : {}),
|
|
665
|
+
...(summaryUsageUnknown
|
|
666
|
+
? {
|
|
667
|
+
summaryUsageUnknown: true,
|
|
668
|
+
summaryUsageUnknownReason,
|
|
669
|
+
}
|
|
670
|
+
: {}),
|
|
647
671
|
...(summaryProvider ? { summaryProvider } : {}),
|
|
648
672
|
...(summaryModel ? { summaryModel } : {}),
|
|
649
673
|
},
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import {
|
|
2
|
+
estimateMessagesTokens,
|
|
3
|
+
PromptCompressor,
|
|
4
|
+
sanitizeToolPairs,
|
|
5
|
+
} from "./prompt-compressor.js";
|
|
6
|
+
|
|
7
|
+
const DEFAULT_MAX_OUTPUT_TOKENS = 2048;
|
|
8
|
+
const MIN_MAX_OUTPUT_TOKENS = 256;
|
|
9
|
+
const MAX_MAX_OUTPUT_TOKENS = 4096;
|
|
10
|
+
const MANUAL_MAX_MESSAGES = 4;
|
|
11
|
+
|
|
12
|
+
function boundedMaxOutputTokens(value) {
|
|
13
|
+
const parsed = Math.trunc(Number(value));
|
|
14
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
15
|
+
return DEFAULT_MAX_OUTPUT_TOKENS;
|
|
16
|
+
}
|
|
17
|
+
return Math.min(
|
|
18
|
+
MAX_MAX_OUTPUT_TOKENS,
|
|
19
|
+
Math.max(MIN_MAX_OUTPUT_TOKENS, parsed),
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function tokenCount(value) {
|
|
24
|
+
const parsed = Number(value);
|
|
25
|
+
return Number.isFinite(parsed) && parsed > 0 ? Math.trunc(parsed) : 0;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function responseSummary(response) {
|
|
29
|
+
if (typeof response === "string") return response;
|
|
30
|
+
return response?.message?.content ?? response?.content ?? "";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function preserveCompletedExchange(originalMessages, compactedMessages) {
|
|
34
|
+
if (originalMessages.at(-1)?.role === "user") return compactedMessages;
|
|
35
|
+
let lastUserIndex = -1;
|
|
36
|
+
for (let index = originalMessages.length - 1; index >= 0; index -= 1) {
|
|
37
|
+
if (originalMessages[index]?.role === "user") {
|
|
38
|
+
lastUserIndex = index;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (lastUserIndex < 0) return compactedMessages;
|
|
43
|
+
|
|
44
|
+
const completedExchange = originalMessages.slice(lastUserIndex);
|
|
45
|
+
const exchangeMessages = new Set(completedExchange);
|
|
46
|
+
const prefix = compactedMessages.filter(
|
|
47
|
+
(message) => !exchangeMessages.has(message),
|
|
48
|
+
);
|
|
49
|
+
return sanitizeToolPairs([...prefix, ...completedExchange]);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Convert PromptCompressor's provider-neutral summary accounting into the
|
|
54
|
+
* token-usage wire shape shared by the agent hosts.
|
|
55
|
+
*/
|
|
56
|
+
export function compactionTokenUsage(stats) {
|
|
57
|
+
const usage = stats?.summaryUsage;
|
|
58
|
+
if (!usage || typeof usage !== "object") return null;
|
|
59
|
+
return {
|
|
60
|
+
input_tokens: tokenCount(usage.inputTokens),
|
|
61
|
+
output_tokens: tokenCount(usage.outputTokens),
|
|
62
|
+
cache_read_input_tokens: tokenCount(usage.cacheReadTokens),
|
|
63
|
+
cache_creation_input_tokens: tokenCount(usage.cacheCreationTokens),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Build one provider-backed semantic compaction operation.
|
|
69
|
+
*
|
|
70
|
+
* The provider request is deliberately tool-free. A missing provider adapter,
|
|
71
|
+
* transport error, or malformed summary is handled by PromptCompressor's
|
|
72
|
+
* structured extractive handoff, so every host gets the same safe degradation
|
|
73
|
+
* contract instead of falling back to positional truncation.
|
|
74
|
+
*/
|
|
75
|
+
export async function compactConversationWithProvider(messages, options = {}) {
|
|
76
|
+
const originalMessages = Array.isArray(messages) ? [...messages] : [];
|
|
77
|
+
const provider = options.provider || null;
|
|
78
|
+
const model = options.model || null;
|
|
79
|
+
const maxOutputTokens = boundedMaxOutputTokens(options.maxOutputTokens);
|
|
80
|
+
const chatFn = options.chatFn;
|
|
81
|
+
const llmQuery =
|
|
82
|
+
typeof options.llmQuery === "function"
|
|
83
|
+
? options.llmQuery
|
|
84
|
+
: async (prompt) => {
|
|
85
|
+
if (typeof chatFn !== "function") {
|
|
86
|
+
throw new Error("provider adapter unavailable");
|
|
87
|
+
}
|
|
88
|
+
const response = await chatFn([{ role: "user", content: prompt }], {
|
|
89
|
+
...(options.chatOptions || {}),
|
|
90
|
+
provider,
|
|
91
|
+
model,
|
|
92
|
+
baseUrl: options.baseUrl,
|
|
93
|
+
apiKey: options.apiKey,
|
|
94
|
+
signal: options.signal,
|
|
95
|
+
contextEngine: null,
|
|
96
|
+
enabledToolNames: [],
|
|
97
|
+
extraToolDefinitions: [],
|
|
98
|
+
hostManagedToolPolicy: null,
|
|
99
|
+
onToken: undefined,
|
|
100
|
+
onStall: undefined,
|
|
101
|
+
onStreamRetry: undefined,
|
|
102
|
+
maxOutputTokens,
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
summary: responseSummary(response),
|
|
106
|
+
usage: response?.usage || null,
|
|
107
|
+
provider,
|
|
108
|
+
model,
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const compressor =
|
|
113
|
+
options.compressor ||
|
|
114
|
+
new PromptCompressor({
|
|
115
|
+
model,
|
|
116
|
+
provider,
|
|
117
|
+
llmQuery,
|
|
118
|
+
...(options.force === true
|
|
119
|
+
? { maxMessages: options.maxMessages || MANUAL_MAX_MESSAGES }
|
|
120
|
+
: options.maxMessages
|
|
121
|
+
? { maxMessages: options.maxMessages }
|
|
122
|
+
: {}),
|
|
123
|
+
...(options.maxTokens ? { maxTokens: options.maxTokens } : {}),
|
|
124
|
+
summaryInputMaxChars: options.summaryInputMaxChars,
|
|
125
|
+
});
|
|
126
|
+
if (
|
|
127
|
+
options.onlyIfNeeded === true &&
|
|
128
|
+
!compressor.shouldAutoCompact(originalMessages)
|
|
129
|
+
) {
|
|
130
|
+
const originalTokens = estimateMessagesTokens(originalMessages);
|
|
131
|
+
return {
|
|
132
|
+
messages: originalMessages,
|
|
133
|
+
stats: {
|
|
134
|
+
strategy: "none",
|
|
135
|
+
originalMessages: originalMessages.length,
|
|
136
|
+
compressedMessages: originalMessages.length,
|
|
137
|
+
originalTokens,
|
|
138
|
+
compressedTokens: originalTokens,
|
|
139
|
+
saved: 0,
|
|
140
|
+
ratio: 1,
|
|
141
|
+
trimmed: 0,
|
|
142
|
+
},
|
|
143
|
+
degradedEvent: null,
|
|
144
|
+
usageEvent: null,
|
|
145
|
+
usageUnknownEvent: null,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const result = await compressor.compress(originalMessages, {
|
|
149
|
+
preserveToolPairs: true,
|
|
150
|
+
...(typeof options.isPinned === "function"
|
|
151
|
+
? { isPinned: options.isPinned }
|
|
152
|
+
: {}),
|
|
153
|
+
});
|
|
154
|
+
const compactedMessages =
|
|
155
|
+
options.preserveCompletedExchange === true
|
|
156
|
+
? preserveCompletedExchange(originalMessages, result.messages)
|
|
157
|
+
: result.messages;
|
|
158
|
+
const originalTokens = estimateMessagesTokens(originalMessages);
|
|
159
|
+
const compressedTokens = estimateMessagesTokens(compactedMessages);
|
|
160
|
+
const stats = {
|
|
161
|
+
...result.stats,
|
|
162
|
+
originalMessages: originalMessages.length,
|
|
163
|
+
compressedMessages: compactedMessages.length,
|
|
164
|
+
originalTokens,
|
|
165
|
+
compressedTokens,
|
|
166
|
+
saved: originalTokens - compressedTokens,
|
|
167
|
+
ratio: originalTokens > 0 ? compressedTokens / originalTokens : 1,
|
|
168
|
+
trimmed: Math.max(0, originalMessages.length - compactedMessages.length),
|
|
169
|
+
};
|
|
170
|
+
const usage = compactionTokenUsage(stats);
|
|
171
|
+
const usageUnknownEvent =
|
|
172
|
+
stats.summaryUsageUnknown === true
|
|
173
|
+
? {
|
|
174
|
+
provider: stats.summaryProvider || provider,
|
|
175
|
+
model: stats.summaryModel || model,
|
|
176
|
+
source: "semantic-compaction",
|
|
177
|
+
reason:
|
|
178
|
+
stats.summaryUsageUnknownReason ||
|
|
179
|
+
"provider_transport_outcome_unknown",
|
|
180
|
+
usageOutcome: "unknown",
|
|
181
|
+
}
|
|
182
|
+
: null;
|
|
183
|
+
|
|
184
|
+
return {
|
|
185
|
+
messages: compactedMessages,
|
|
186
|
+
stats,
|
|
187
|
+
degradedEvent:
|
|
188
|
+
stats.degraded === true
|
|
189
|
+
? {
|
|
190
|
+
reason: stats.degradedReason || "semantic-summary-degraded",
|
|
191
|
+
summaryMode: stats.summaryMode || "extractive-fallback",
|
|
192
|
+
stats,
|
|
193
|
+
}
|
|
194
|
+
: null,
|
|
195
|
+
usageEvent: usage
|
|
196
|
+
? {
|
|
197
|
+
provider: stats.summaryProvider || provider,
|
|
198
|
+
model: stats.summaryModel || model,
|
|
199
|
+
usage,
|
|
200
|
+
source: "semantic-compaction",
|
|
201
|
+
}
|
|
202
|
+
: null,
|
|
203
|
+
usageUnknownEvent,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
@@ -9,7 +9,9 @@
|
|
|
9
9
|
|
|
10
10
|
import {
|
|
11
11
|
existsSync,
|
|
12
|
+
appendFileSync,
|
|
12
13
|
lstatSync,
|
|
14
|
+
readFileSync,
|
|
13
15
|
realpathSync,
|
|
14
16
|
rmdirSync,
|
|
15
17
|
symlinkSync,
|
|
@@ -97,17 +99,36 @@ function gitRepositoryIdentity(repoDir) {
|
|
|
97
99
|
const absoluteCommonDir = isAbsolute(commonDir)
|
|
98
100
|
? commonDir
|
|
99
101
|
: resolve(repoDir, commonDir);
|
|
102
|
+
const commonDirPath = canonicalExistingPrefixPath(absoluteCommonDir);
|
|
100
103
|
return {
|
|
101
104
|
topLevel,
|
|
102
105
|
topLevelIdentity: normalizeFilesystemPath(
|
|
103
106
|
canonicalExistingPrefixPath(topLevel),
|
|
104
107
|
),
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
),
|
|
108
|
+
commonDirPath,
|
|
109
|
+
commonDirIdentity: normalizeFilesystemPath(commonDirPath),
|
|
108
110
|
};
|
|
109
111
|
}
|
|
110
112
|
|
|
113
|
+
function ensureManagedWorktreeExcluded(context) {
|
|
114
|
+
const infoDir = resolve(context.repository.commonDirPath, "info");
|
|
115
|
+
const excludeFile = resolve(infoDir, "exclude");
|
|
116
|
+
mkdirSync(infoDir, { recursive: true });
|
|
117
|
+
try {
|
|
118
|
+
assertNotSymlink(infoDir, "git info directory");
|
|
119
|
+
assertNotSymlink(excludeFile, "git exclude file");
|
|
120
|
+
} catch (error) {
|
|
121
|
+
if (error?.code !== "ENOENT") throw error;
|
|
122
|
+
}
|
|
123
|
+
const pattern = `/${WORKTREE_DIR}/`;
|
|
124
|
+
const current = existsSync(excludeFile)
|
|
125
|
+
? readFileSync(excludeFile, "utf8")
|
|
126
|
+
: "";
|
|
127
|
+
if (current.split(/\r?\n/).includes(pattern)) return;
|
|
128
|
+
const separator = current.length > 0 && !/\r?\n$/.test(current) ? "\n" : "";
|
|
129
|
+
appendFileSync(excludeFile, `${separator}${pattern}\n`, "utf8");
|
|
130
|
+
}
|
|
131
|
+
|
|
111
132
|
function assertSameGitRepository(repoDir, expectedCommonDir, expectedRoot) {
|
|
112
133
|
const identity = gitRepositoryIdentity(repoDir);
|
|
113
134
|
if (
|
|
@@ -381,6 +402,8 @@ export function createWorktree(repoDir, branchName, baseBranch, options = {}) {
|
|
|
381
402
|
throw new Error("Not a git repository");
|
|
382
403
|
}
|
|
383
404
|
|
|
405
|
+
const context = repositoryManagementContext(repoDir);
|
|
406
|
+
ensureManagedWorktreeExcluded(context);
|
|
384
407
|
const worktreePath = assertManagedWorktreePath(
|
|
385
408
|
repoDir,
|
|
386
409
|
managedWorktreePath(repoDir, branchName),
|
|
@@ -164,18 +164,57 @@ function removeVerifiedAgentWorktree(info, deps, expectedBranchOid) {
|
|
|
164
164
|
export function setupAgentWorktree({
|
|
165
165
|
cwd = process.cwd(),
|
|
166
166
|
now = new Date(),
|
|
167
|
+
requireCleanSource = false,
|
|
167
168
|
deps = _deps,
|
|
168
169
|
} = {}) {
|
|
169
170
|
const repoRoot = findProjectRoot(cwd);
|
|
170
171
|
if (!repoRoot) {
|
|
171
172
|
throw new Error("--worktree requires running inside a git repository");
|
|
172
173
|
}
|
|
174
|
+
if (requireCleanSource) {
|
|
175
|
+
const status = git(
|
|
176
|
+
[
|
|
177
|
+
"status",
|
|
178
|
+
"--porcelain=v1",
|
|
179
|
+
"--untracked-files=all",
|
|
180
|
+
"--ignore-submodules=none",
|
|
181
|
+
"--",
|
|
182
|
+
".",
|
|
183
|
+
":(exclude).worktrees",
|
|
184
|
+
],
|
|
185
|
+
repoRoot,
|
|
186
|
+
deps,
|
|
187
|
+
).trim();
|
|
188
|
+
if (status) {
|
|
189
|
+
throw new Error(
|
|
190
|
+
"Background worktree isolation requires a clean source checkout; commit/stash the current changes or pass --no-worktree explicitly.",
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
173
194
|
const stamp = now.toISOString().slice(0, 19).replace(/[-:T]/g, "");
|
|
174
195
|
const suffix = Math.random().toString(36).slice(2, 6);
|
|
175
196
|
const branch = `cc-agent-${stamp}-${suffix}`;
|
|
176
197
|
const info = (deps.createWorktree || createWorktree)(repoRoot, branch);
|
|
177
|
-
|
|
178
|
-
|
|
198
|
+
try {
|
|
199
|
+
const baseSha = git(["rev-parse", "HEAD"], info.path, deps).trim();
|
|
200
|
+
return { ...info, repoRoot, baseSha };
|
|
201
|
+
} catch (error) {
|
|
202
|
+
// createWorktree is transactional internally, but ownership has already
|
|
203
|
+
// transferred to this wrapper when the follow-up base-SHA query runs. Roll
|
|
204
|
+
// that partial setup back here so callers never receive `_worktree = null`
|
|
205
|
+
// while a branch and linked checkout have already been created.
|
|
206
|
+
try {
|
|
207
|
+
(deps.removeWorktree || removeWorktree)(repoRoot, info.path, {
|
|
208
|
+
deleteBranch: true,
|
|
209
|
+
branchName: branch,
|
|
210
|
+
force: false,
|
|
211
|
+
});
|
|
212
|
+
} catch (cleanupError) {
|
|
213
|
+
error.retainedWorktree = { ...info, repoRoot, branch };
|
|
214
|
+
error.worktreeCleanupError = cleanupError;
|
|
215
|
+
}
|
|
216
|
+
throw error;
|
|
217
|
+
}
|
|
179
218
|
}
|
|
180
219
|
|
|
181
220
|
/**
|
package/src/lib/app-preview.js
CHANGED
|
@@ -311,6 +311,9 @@ export function buildEvidenceArtifact(kind, data = {}) {
|
|
|
311
311
|
...base,
|
|
312
312
|
// The image bytes/path are opaque to this layer; only metadata here.
|
|
313
313
|
ref: d.ref == null ? null : String(d.ref),
|
|
314
|
+
digest: /^sha256:[0-9a-f]{64}$/iu.test(String(d.digest || ""))
|
|
315
|
+
? String(d.digest).toLowerCase()
|
|
316
|
+
: null,
|
|
314
317
|
width: Number.isFinite(Number(d.width)) ? Number(d.width) : null,
|
|
315
318
|
height: Number.isFinite(Number(d.height)) ? Number(d.height) : null,
|
|
316
319
|
};
|