chainlesschain 0.166.76 → 0.166.78
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/README.md +19 -8
- 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/linux-subreaper/linux-arm64/manifest.json +10 -0
- package/src/assets/linux-subreaper/linux-arm64/supervisor +0 -0
- package/src/assets/linux-subreaper/linux-x64/manifest.json +10 -0
- package/src/assets/linux-subreaper/linux-x64/supervisor +0 -0
- package/src/assets/web-panel/assets/{AIOps-CNaejClV.js → AIOps-DSyZEY2G.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CF_CVKT_.js → ActionButton-DhNyZ577.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-a3Z6J7gv.js → Analytics-HMMpxmyi.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BFtWEnct.js → AppLayout-CwKMM5Ie.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BQ8oeMvX.js → Artifacts-CNzDmph7.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-NOo9bmgk.js → Audit-DxWpUW3V.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-QRc7F3Tp.js → BackgroundAgents-C1R2ST-P.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-UlVgLn2P.js → Backup-B6biTaEV.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BER9LJAr.js → BaseInput-CVnkD2Z5.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Z8z2Fdfz.js → Chat-Dbewl4Je.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DdmuBrdQ.js → ChatBubbleRenderer-DVZ6SwC5.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CXPgyB8L.js → Checkbox-BqqiF1JE.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-D1vOsLJ7.js → Codegen-BVMkGumc.js} +1 -1
- package/src/assets/web-panel/assets/{Col-ucLnUJC7.js → Col-DmiRHy96.js} +1 -1
- package/src/assets/web-panel/assets/{Community-COsV9n9t.js → Community-BDlpygqA.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-D0EkBEYh.js → Compact-B2NME_m-.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-C8w9SUjt.js → Compliance-BlzDLE-R.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CmVaKEJS.js → Cowork-C8raPybB.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-B_FiMMV2.js → Cron-DA8Py0zP.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-ByO3YL8N.js → Crosschain-DU2XyHqB.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DwpsLM9r.js → DID-Df098fT_.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-B_8IUvM_.js → Dashboard-D1rT702x.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Bo6WQkuX.js → Dropdown-BweXGo1O.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-C9LiQesx.js → EmailListRenderer-B9ShbgJH.js} +1 -1
- package/src/assets/web-panel/assets/EvolutionSettings-D75_iBoc.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dst6VUnO.js → FamilyGuardDashboard-DrznZFVs.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Ci7CoLkJ.js → Federation-DQZ2adIA.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-bdDyUhUM.js → FormItemContext-DN30Dowh.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CrRwOUVi.js → GenericCardRenderer-DRdt0j1e.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Dis8h-Z-.js → Git-wwRgStzk.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DX7OH5w2.js → Governance-CI4Uw0Nh.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Cavv_Q_Z.js → Inference-5TuE2AJI.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Cck8tnZn.js → KnowledgeGraph-oXyvmFSR.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BQt3aGMu.js → Logs-ewudSWuv.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-Cz5nyufm.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CdmAKNSN.js → Marketplace-DcZeWFrs.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BUlJdyPY.js → McpTools-BcV9p1RS.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DQRTQDr-.js → Memory-CMhYvugt.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-C0dnxgsl.js → MobileBridge-5RP2uwvT.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DQ5Gy7fa.js → MobileProjects-BIuM9Ze4.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Xl7u2isS.js → Mtc-DmBszTDe.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-C3KX0574.js → MtcAudit-Czdp5ZGt.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-CHEhfkn8.js → Multisig-DRWUuNr-.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Ce38mH-8.js → NLProgramming-IRQQN0-c.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-C7nuTd7c.js → Notes-CGhD1lW9.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-BcoEcyq8.js → NotificationSettings-BtyPgQAh.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-D-t5hKkx.js → OrderTableRenderer-yUaqwCty.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-C_BGi4xi.js → Organization-C3kTVn5i.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BodhraDq.js → Overflow-C2-0iZhq.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BTa3sAIy.js → P2P-CISoEUxA.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BjZslP9T.js → PdhVaultBrowser-NfTVtvKQ.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-u3UDzGef.js → Permissions-CfK0jJhm.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-Cb7ybv65.js → PersonalDataHub-OsVxxh_j.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-CS24k-P7.js → Pipeline-DEmK_Ch2.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Ddj6Kqs7.js → Privacy-D61s73b0.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Bg5uQIgg.js → ProjectInit-DkLF5gHb.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-AmPR8T12.js → ProjectSettings-BA7odTrI.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DGSbAyTK.js → Projects-CdI1GcAG.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Dc1C3lbB.js → Providers-D9BYyP1r.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Cv3HXpce.js → QrScannerModal-CXMItUDD.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-3dpbXARb.js → QuickAsk-8-tF9ffZ.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-5aGRVnJK.js → Recommend-C2QGWOSi.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-CTS2jx0p.js → RemoteSession-B1M_v1lx.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BxaKI0hY.js → Reputation-D0WZHgv1.js} +1 -1
- package/src/assets/web-panel/assets/{Row-C23uQdwd.js → Row-D6nf9-c-.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-ssX9YOhm.js → RssFeed-ClZ6M-mN.js} +3 -3
- package/src/assets/web-panel/assets/{Search-C24GogII.js → Search-ZWkt8vuO.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DdAcGKkk.js → Security-BUlQut2m.js} +3 -3
- package/src/assets/web-panel/assets/{Services-D0dCiEuq.js → Services-Cd_3xJOc.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DEY44o0v.js → Skeleton-C8e2-cHW.js} +1 -1
- package/src/assets/web-panel/assets/Skills-DucVRJp1.js +1 -0
- package/src/assets/web-panel/assets/{Sla-B_bbo2vB.js → Sla-Csr5pUwI.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-CXvyaRAT.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-CpIXql0Z.js → SyncSettings-KdsIcV5h.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-B-eHmJm9.js +1 -0
- package/src/assets/web-panel/assets/{Templates-C_44nVPq.js → Templates-BglVeaLK.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CyZ2ey2P.js → Tenant-BBbQ8qan.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DwGNHWnp.js → Terminal-Ca_pCVBi.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BTAHNkqU.js → TimelineRenderer-YD6XG_vZ.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DCJWkUwc.js → Tokens-2lRoeVli.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BCjDO9-E.js → Trigger-C-3XNAU9.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-_YS8WbRb.js → Trust-k-1PxdLG.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-m6R8xGq7.js → UkeySign-FG-qW646.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-xOfk29c4.js → VideoEditing-BNOe1cmd.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-B1Gw0awc.js → Wallet-D5C3i2Kw.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CHK5ft18.js → WebAuthn-BOpztqd3.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-DEp1ukQQ.js → WorkflowEditor-BpVrpUEv.js} +1 -1
- package/src/assets/web-panel/assets/{chat-B2sFizun.js → chat-DIuMHb38.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DJ17YV1E.js → colors-CTFJPyzQ.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CBhJJgEC.js → compact-item-CONfmJcW.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BZkpvNJy.js → createContext-RkW5CRrz.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DaEBln_q.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-C0ZKo6Ei.js → hasIn-CW4XOjDC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bc3vVG2X.js → index-7wMSBCU7.js} +1 -1
- package/src/assets/web-panel/assets/{index-vFMwiAN4.js → index-Akmg1WdH.js} +1 -1
- package/src/assets/web-panel/assets/{index-DOBXNMdh.js → index-B54qoVff.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLo8Ls9u.js → index-B8r2t0Ch.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7gv9dvb.js → index-B9XoBoty.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHtpMr1G.js → index-B9aS2VLu.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dxe0YlZe.js → index-BFs1Tznc.js} +1 -1
- package/src/assets/web-panel/assets/{index-DumLgj1t.js → index-BKgaRT0b.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNp6HKFh.js → index-BM7bOUvu.js} +1 -1
- package/src/assets/web-panel/assets/{index-DM0rWF6z.js → index-BMg2JFmW.js} +1 -1
- package/src/assets/web-panel/assets/{index-4oULtRqE.js → index-BRZsPxNn.js} +1 -1
- package/src/assets/web-panel/assets/{index-LPPe0val.js → index-Bf19fKef.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ctguam0K.js → index-BkAbfBF-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrU5xVpF.js → index-CBjb2A5R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCOr6Q27.js → index-CEZWQthY.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9gYiACH.js → index-CFGLf88d.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZW84cEf.js → index-CLUa68JH.js} +3 -3
- package/src/assets/web-panel/assets/{index-BoDUYyuo.js → index-CM2X25Er.js} +1 -1
- package/src/assets/web-panel/assets/{index-DyiCbHeL.js → index-CX4T2uKN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CW5o1Gar.js → index-CixqfdRk.js} +1 -1
- package/src/assets/web-panel/assets/{index-5K2z_tgO.js → index-CkRojEip.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOfPp5OV.js → index-Cvmc3f25.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdxJm-HB.js → index-D-lpTPS8.js} +1 -1
- package/src/assets/web-panel/assets/{index-8ueG48gl.js → index-D59GbWCN.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMxOoITz.js → index-DAESljiJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLMr5KMd.js → index-DDHUx4Yz.js} +1 -1
- package/src/assets/web-panel/assets/index-DG1mcYTa.js +1 -0
- package/src/assets/web-panel/assets/{index-BGIvhCPl.js → index-DP5pPedy.js} +1 -1
- package/src/assets/web-panel/assets/index-DRs5Pe8u.js +1 -0
- package/src/assets/web-panel/assets/{index-DjdSFO0d.js → index-DSlXL6Ju.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cn5UzvgR.js → index-DWCJnn2O.js} +1 -1
- package/src/assets/web-panel/assets/{index-Chct9tL8.js → index-DWY7YwDu.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEnd5fiz.js → index-DZTwP364.js} +1 -1
- package/src/assets/web-panel/assets/{index-KzNhWykP.js → index-DidrMvOx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpyrhOeh.js → index-Dj3K5kHs.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZlkPrxb.js → index-YaeGscSw.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dfgxe-fw.js → index-YlMnFNOi.js} +1 -1
- package/src/assets/web-panel/assets/{index-IHgzfc1u.js → index-asWsB34i.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJkoJzTU.js → index-gkjiFjQd.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Cqfoq0TJ.js → initDefaultProps-BOr4igh3.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CIiVJHNu.js → motion-CK469n2j.js} +1 -1
- package/src/assets/web-panel/assets/{move-CFl1o_A8.js → move-DzjudlYQ.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DYoCxcZ1.js → mtc-parser-BQaKUxC6.js} +1 -1
- package/src/assets/web-panel/assets/{omit-C1P2q5TY.js → omit-MciovCFD.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BtTRpJtC.js → pickAttrs-DDPJ4zAz.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Cst2PcNM.js → placementArrow-Cznyb-jI.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CF5kalV2.js → responsiveObserve-AJK3SLzJ.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CtHGqpXN.js → slide-CPQ28wu7.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-N__biHXf.js → statusUtils-CFjzvqf_.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DR8V_H-i.js → styleChecker-BPyFfTuR.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-D274dqun.js → useFlexGapSupport-Dq7N6R05.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BwHLYU5b.js → useFs-C3GS0uTc.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BiA-hVqt.js → usePersonalDataHub-BhgIVzP_.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Bugl94dy.js → vnode-4ZD9-MDr.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DEFl8GCu.js → zoom-Bx4MRVNW.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/command-manifest.json +1 -1
- package/src/commands/checkpoint.js +42 -7
- package/src/commands/orchestrate.js +85 -25
- package/src/commands/session-location.js +5 -0
- package/src/commands/session-show.js +109 -1
- package/src/commands/session.js +26 -2
- package/src/commands/tokens.js +9 -4
- package/src/data/changelog.json +26 -0
- package/src/generated/cc-agent-protocol.schema.json +71 -0
- package/src/harness/jsonl-session-store.js +357 -114
- package/src/harness/mcp-client.js +44 -1
- package/src/lib/agent-router.js +35 -7
- package/src/lib/app-server/server.js +14 -0
- package/src/lib/background-agent-supervisor.js +14 -4
- package/src/lib/causal-observability.js +64 -1
- package/src/lib/checkpoint-summary-projection.js +98 -0
- package/src/lib/checkpoint-timeline-authority.js +15 -51
- package/src/lib/claude-code-bridge.js +302 -60
- package/src/lib/codex-app-server-adapter.js +161 -35
- package/src/lib/cost-budget.js +4 -0
- package/src/lib/decision-layer/providers.js +84 -9
- package/src/lib/decision-layer/runtime.js +86 -49
- package/src/lib/direct-model-usage.js +14 -3
- package/src/lib/doctor-checkup.js +31 -2
- package/src/lib/durable-security-store.js +6 -1
- package/src/lib/evolution/evolution-artifact-identity.js +21 -0
- package/src/lib/evolution/evolution-artifact-ports.js +5 -11
- package/src/lib/evolution/evolution-eval-cohort-receipt-reconciliation.js +389 -0
- package/src/lib/execution-location-failure-site.js +63 -0
- package/src/lib/execution-location-target.js +102 -8
- package/src/lib/external-agent-adapters.js +2 -0
- package/src/lib/image-file-boundary.js +154 -0
- package/src/lib/image-input.js +16 -3
- package/src/lib/llm-pricing.js +114 -8
- package/src/lib/mcp-call-ledger-store.js +7 -2
- package/src/lib/model-capabilities.js +21 -10
- package/src/lib/model-context-catalog.js +60 -1
- package/src/lib/openai-responses.js +7 -1
- package/src/lib/orchestrator.js +8 -2
- package/src/lib/process-execution-broker/index.js +93 -1
- package/src/lib/process-execution-broker/linux-subreaper-artifact.js +120 -0
- package/src/lib/process-execution-broker/linux-subreaper-helper.js +344 -0
- package/src/lib/process-execution-broker/linux-subreaper-process.js +326 -0
- package/src/lib/process-execution-broker/linux-subreaper-supervisor.c +360 -0
- package/src/lib/process-execution-broker/owned-posix-process-group-worker.mjs +131 -0
- package/src/lib/process-execution-broker/owned-posix-process-group.js +267 -0
- package/src/lib/process-execution-broker/process-ownership-journal.js +297 -0
- package/src/lib/process-execution-broker/process-ownership-quarantine.js +91 -0
- package/src/lib/runtime-usage-ledger.js +3 -0
- package/src/lib/secure-fs.js +158 -42
- package/src/lib/session-branch-history.js +240 -0
- package/src/lib/session-history-origins.js +285 -0
- package/src/lib/session-input-receipt.js +110 -0
- package/src/lib/session-resource-budget.js +8 -8
- package/src/lib/session-transcript-history.js +456 -0
- package/src/lib/session-transcript-page.js +164 -0
- package/src/lib/session-transcript-reference.js +38 -0
- package/src/lib/session-usage.js +8 -0
- package/src/lib/token-tracker.js +32 -54
- package/src/lib/usage-pricing-context.js +93 -0
- package/src/runtime/headless-runner.js +8 -0
- package/src/runtime/headless-stream.js +202 -4
- package/src/assets/web-panel/assets/EvolutionSettings-Pc1IpRfk.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-BIUeeiVA.js +0 -1
- package/src/assets/web-panel/assets/Skills-CYt0Mu2W.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-a2BBjtTL.js +0 -1
- package/src/assets/web-panel/assets/Tasks-BYQKU-GL.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DZhu13vj.js +0 -1
- package/src/assets/web-panel/assets/index-C6iFyQYz.js +0 -1
- package/src/assets/web-panel/assets/index-CztThH9f.js +0 -1
package/src/lib/agent-router.js
CHANGED
|
@@ -228,12 +228,14 @@ export class AgentRouter extends EventEmitter {
|
|
|
228
228
|
*/
|
|
229
229
|
static autoDetect(options = {}) {
|
|
230
230
|
const backends = [];
|
|
231
|
+
const claude = options.cliDetections?.claude || detectClaudeCode();
|
|
232
|
+
const codex = options.cliDetections?.codex || detectCodex();
|
|
231
233
|
|
|
232
|
-
if (
|
|
233
|
-
backends.push({ type: BACKEND_TYPE.CLAUDE, weight: 3 });
|
|
234
|
+
if (claude.found) {
|
|
235
|
+
backends.push({ type: BACKEND_TYPE.CLAUDE, weight: 3, installed: true });
|
|
234
236
|
}
|
|
235
|
-
if (
|
|
236
|
-
backends.push({ type: BACKEND_TYPE.CODEX, weight: 2 });
|
|
237
|
+
if (codex.found) {
|
|
238
|
+
backends.push({ type: BACKEND_TYPE.CODEX, weight: 2, installed: true });
|
|
237
239
|
}
|
|
238
240
|
if (process.env.GEMINI_API_KEY) {
|
|
239
241
|
backends.push({ type: BACKEND_TYPE.GEMINI, weight: 2 });
|
|
@@ -263,7 +265,7 @@ export class AgentRouter extends EventEmitter {
|
|
|
263
265
|
const { cwd = process.cwd() } = options;
|
|
264
266
|
if (this._backends.length === 0) {
|
|
265
267
|
throw new Error(
|
|
266
|
-
"No agent backends available.
|
|
268
|
+
"No agent backends available. Use cc agent for tool execution; orchestrate API backends produce text only.",
|
|
267
269
|
);
|
|
268
270
|
}
|
|
269
271
|
const evolutionIngress =
|
|
@@ -277,8 +279,7 @@ export class AgentRouter extends EventEmitter {
|
|
|
277
279
|
error.code = "CC_AGENT_EVOLUTION_INGRESS_FAILED";
|
|
278
280
|
throw error;
|
|
279
281
|
}
|
|
280
|
-
const backends =
|
|
281
|
-
this._backends.filter((backend) => !backend.isCLI);
|
|
282
|
+
const backends = this._backends.filter((backend) => !backend.isCLI);
|
|
282
283
|
|
|
283
284
|
if (backends.length === 0) {
|
|
284
285
|
const error = new Error(
|
|
@@ -475,6 +476,7 @@ export class AgentRouter extends EventEmitter {
|
|
|
475
476
|
return {
|
|
476
477
|
type,
|
|
477
478
|
isCLI: true,
|
|
479
|
+
installed: cfg.installed ?? null,
|
|
478
480
|
weight: cfg.weight || 1,
|
|
479
481
|
_pool: pool,
|
|
480
482
|
timeout: cfg.timeout || 300_000,
|
|
@@ -530,8 +532,34 @@ export class AgentRouter extends EventEmitter {
|
|
|
530
532
|
kind: b.isCLI ? "cli" : "api",
|
|
531
533
|
provider: b.provider || b.type,
|
|
532
534
|
weight: b.weight,
|
|
535
|
+
installed: b.isCLI ? (b.installed ?? null) : null,
|
|
536
|
+
configured: true,
|
|
537
|
+
governanceAdmitted: b.isCLI ? false : null,
|
|
538
|
+
requiresAuthenticatedRun: true,
|
|
539
|
+
dispatchable: !b.isCLI,
|
|
540
|
+
runnable: false,
|
|
541
|
+
executionMode: b.isCLI ? "blocked" : "text-only",
|
|
542
|
+
blockedReason: b.isCLI
|
|
543
|
+
? AGENT_ROUTER_ERROR.EXTERNAL_MODEL_INGRESS_UNATTESTED
|
|
544
|
+
: "API_TEXT_ONLY_NO_TOOL_EXECUTION",
|
|
545
|
+
alternative: "cc agent",
|
|
533
546
|
}));
|
|
534
547
|
}
|
|
548
|
+
|
|
549
|
+
/** Configuration preflight only; dispatch still authenticates each Run. */
|
|
550
|
+
assertDispatchAvailable() {
|
|
551
|
+
if (this._backends.some((backend) => !backend.isCLI)) return;
|
|
552
|
+
const error = new Error(
|
|
553
|
+
this._backends.length
|
|
554
|
+
? "External Claude/Codex CLIs are blocked: per-request model governance is unattested. Use cc agent for tool execution."
|
|
555
|
+
: "No agent backends available. Use cc agent for tool execution.",
|
|
556
|
+
);
|
|
557
|
+
error.code = this._backends.length
|
|
558
|
+
? AGENT_ROUTER_ERROR.EXTERNAL_MODEL_INGRESS_UNATTESTED
|
|
559
|
+
: "AGENT_ROUTER_NO_BACKENDS";
|
|
560
|
+
error.backends = this.summary();
|
|
561
|
+
throw error;
|
|
562
|
+
}
|
|
535
563
|
}
|
|
536
564
|
|
|
537
565
|
// ===== V2 Surface: Agent Router governance overlay (CLI v0.132.0) =====
|
|
@@ -1463,6 +1463,20 @@ export class CcAppServer {
|
|
|
1463
1463
|
contextRevision: Number.isSafeInteger(event.context_revision)
|
|
1464
1464
|
? event.context_revision
|
|
1465
1465
|
: null,
|
|
1466
|
+
// Preserve the MCP form/URL vocabulary for native host review. This is
|
|
1467
|
+
// question metadata, not an approval decision or host execution authority.
|
|
1468
|
+
...(event.metadata?.kind === "mcp_elicitation"
|
|
1469
|
+
? {
|
|
1470
|
+
metadata: {
|
|
1471
|
+
kind: "mcp_elicitation",
|
|
1472
|
+
mode: event.metadata.mode || "form",
|
|
1473
|
+
server: event.metadata.server ?? null,
|
|
1474
|
+
requestedSchema: event.metadata.requestedSchema ?? null,
|
|
1475
|
+
url: event.metadata.url ?? null,
|
|
1476
|
+
elicitationId: event.metadata.elicitationId ?? null,
|
|
1477
|
+
},
|
|
1478
|
+
}
|
|
1479
|
+
: {}),
|
|
1466
1480
|
expiresAt: new Date(this.now() + this.requestTimeoutMs).toISOString(),
|
|
1467
1481
|
};
|
|
1468
1482
|
}
|
|
@@ -2174,14 +2174,22 @@ function isBackgroundAgentAfterCursor(state, cursor) {
|
|
|
2174
2174
|
return String(state.id).localeCompare(cursor.id) > 0;
|
|
2175
2175
|
}
|
|
2176
2176
|
|
|
2177
|
+
function observeBackgroundAgentList(options, source, entryCount) {
|
|
2178
|
+
// Optional in-process measurement only; telemetry failures cannot change a read.
|
|
2179
|
+
try {
|
|
2180
|
+
options.indexObserver?.(Object.freeze({ source, entryCount }));
|
|
2181
|
+
} catch {
|
|
2182
|
+
// Keep observers outside the authoritative result.
|
|
2183
|
+
}
|
|
2184
|
+
}
|
|
2185
|
+
|
|
2177
2186
|
/**
|
|
2178
2187
|
* Return one stable, bounded page from the newest-first background session
|
|
2179
2188
|
* feed. The cursor is an opaque ordering fence, not an authority token.
|
|
2180
2189
|
*
|
|
2181
|
-
*
|
|
2182
|
-
*
|
|
2183
|
-
*
|
|
2184
|
-
* caller.
|
|
2190
|
+
* The index still enumerates and stats every authority file; selected rows are
|
|
2191
|
+
* read again for lifecycle reconciliation. It reduces content reads, not the
|
|
2192
|
+
* O(N) inventory fence. indexObserver receives the chosen read path and count.
|
|
2185
2193
|
*/
|
|
2186
2194
|
export function listBackgroundAgentsPage(options = {}) {
|
|
2187
2195
|
const limit = normalizeBackgroundAgentPageLimit(options.limit);
|
|
@@ -2223,6 +2231,7 @@ export function listBackgroundAgentsPage(options = {}) {
|
|
|
2223
2231
|
projected.length > sessions.length
|
|
2224
2232
|
? encodeBackgroundAgentPageCursor(sessions.at(-1), options.all)
|
|
2225
2233
|
: null;
|
|
2234
|
+
observeBackgroundAgentList(options, indexed.source, indexed.entries.length);
|
|
2226
2235
|
return Object.freeze({
|
|
2227
2236
|
sessions: Object.freeze(sessions),
|
|
2228
2237
|
nextCursor,
|
|
@@ -2238,6 +2247,7 @@ export function listBackgroundAgentsPage(options = {}) {
|
|
|
2238
2247
|
eligible.length > sessions.length
|
|
2239
2248
|
? encodeBackgroundAgentPageCursor(sessions.at(-1), options.all)
|
|
2240
2249
|
: null;
|
|
2250
|
+
observeBackgroundAgentList(options, "full-scan", eligible.length);
|
|
2241
2251
|
return Object.freeze({
|
|
2242
2252
|
sessions: Object.freeze(sessions),
|
|
2243
2253
|
nextCursor,
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
|
|
9
9
|
import crypto from "node:crypto";
|
|
10
10
|
import { PRICE_TABLE, priceRollup } from "./llm-pricing.js";
|
|
11
|
+
import {
|
|
12
|
+
projectUsagePricingContext,
|
|
13
|
+
mergeUsagePricingBucket,
|
|
14
|
+
} from "./usage-pricing-context.js";
|
|
11
15
|
import { canonicalDeliveryJson } from "./delivery-evidence.js";
|
|
12
16
|
import { createSessionTranscriptStructureProjection } from "./session-transcript-structure.js";
|
|
13
17
|
|
|
@@ -251,7 +255,64 @@ function normalizePricingTable(table = PRICE_TABLE) {
|
|
|
251
255
|
) {
|
|
252
256
|
throw new Error("pricing rates must be finite non-negative numbers");
|
|
253
257
|
}
|
|
254
|
-
|
|
258
|
+
const result = { match, in: input, out: output };
|
|
259
|
+
if (Object.hasOwn(entry, "explicitOverride")) {
|
|
260
|
+
if (typeof entry.explicitOverride !== "boolean")
|
|
261
|
+
throw new Error("pricing explicitOverride must be boolean");
|
|
262
|
+
result.explicitOverride = entry.explicitOverride;
|
|
263
|
+
}
|
|
264
|
+
if (Object.hasOwn(entry, "exact")) {
|
|
265
|
+
if (typeof entry.exact !== "boolean")
|
|
266
|
+
throw new Error("pricing exact must be boolean");
|
|
267
|
+
result.exact = entry.exact;
|
|
268
|
+
}
|
|
269
|
+
if (Object.hasOwn(entry, "terms")) {
|
|
270
|
+
const terms = entry.terms;
|
|
271
|
+
const nonNegative = (value) => {
|
|
272
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
|
|
273
|
+
throw new Error("invalid pricing multiplier");
|
|
274
|
+
return value;
|
|
275
|
+
};
|
|
276
|
+
assertKnownOwnKeys(
|
|
277
|
+
terms,
|
|
278
|
+
new Set([
|
|
279
|
+
"cacheReadMultiplier",
|
|
280
|
+
"cacheWriteMultiplier",
|
|
281
|
+
"longContext",
|
|
282
|
+
"serviceMultipliers",
|
|
283
|
+
]),
|
|
284
|
+
"pricing terms",
|
|
285
|
+
);
|
|
286
|
+
assertKnownOwnKeys(
|
|
287
|
+
terms.longContext,
|
|
288
|
+
new Set(["threshold", "inputMultiplier", "outputMultiplier"]),
|
|
289
|
+
"pricing long context",
|
|
290
|
+
);
|
|
291
|
+
const threshold = nonNegative(terms.longContext.threshold);
|
|
292
|
+
if (!Number.isSafeInteger(threshold))
|
|
293
|
+
throw new Error("invalid pricing threshold");
|
|
294
|
+
assertKnownOwnKeys(
|
|
295
|
+
terms.serviceMultipliers,
|
|
296
|
+
new Set(["standard", "default", "auto", "batch", "flex", "fast"]),
|
|
297
|
+
"pricing service multipliers",
|
|
298
|
+
);
|
|
299
|
+
result.terms = {
|
|
300
|
+
cacheReadMultiplier: nonNegative(terms.cacheReadMultiplier),
|
|
301
|
+
cacheWriteMultiplier: nonNegative(terms.cacheWriteMultiplier),
|
|
302
|
+
longContext: {
|
|
303
|
+
threshold,
|
|
304
|
+
inputMultiplier: nonNegative(terms.longContext.inputMultiplier),
|
|
305
|
+
outputMultiplier: nonNegative(terms.longContext.outputMultiplier),
|
|
306
|
+
},
|
|
307
|
+
serviceMultipliers: Object.fromEntries(
|
|
308
|
+
Object.entries(terms.serviceMultipliers).map(([key, value]) => [
|
|
309
|
+
key,
|
|
310
|
+
nonNegative(value),
|
|
311
|
+
]),
|
|
312
|
+
),
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
return result;
|
|
255
316
|
});
|
|
256
317
|
normalized.set(providerKey, normalizedEntries);
|
|
257
318
|
}
|
|
@@ -672,6 +733,7 @@ function strictUsage(event) {
|
|
|
672
733
|
totalTokens: expectedTotal,
|
|
673
734
|
cacheReadTokens,
|
|
674
735
|
cacheCreationTokens,
|
|
736
|
+
...projectUsagePricingContext(raw),
|
|
675
737
|
};
|
|
676
738
|
}
|
|
677
739
|
|
|
@@ -1101,6 +1163,7 @@ export function createVerifiedSessionObservabilityProjection(
|
|
|
1101
1163
|
}),
|
|
1102
1164
|
);
|
|
1103
1165
|
addUsageSums(row, usage, "session usage model");
|
|
1166
|
+
mergeUsagePricingBucket(row, usage);
|
|
1104
1167
|
}
|
|
1105
1168
|
|
|
1106
1169
|
if (event?.type === "tool_call") {
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildExtractiveHandoff,
|
|
3
|
+
formatStructuredHandoff,
|
|
4
|
+
} from "../harness/structured-handoff.js";
|
|
5
|
+
import {
|
|
6
|
+
DURABLE_SYSTEM_MESSAGE_KINDS,
|
|
7
|
+
getDurableSystemMessageProvenance,
|
|
8
|
+
markDurableSystemMessage,
|
|
9
|
+
projectCanonicalResumeMessages,
|
|
10
|
+
} from "./session-message-provenance.js";
|
|
11
|
+
|
|
12
|
+
export const HISTORY_SUMMARY_SCHEMA =
|
|
13
|
+
"chainlesschain.session-history-summary/v1";
|
|
14
|
+
|
|
15
|
+
function summaryMessage(messages, action, turnId) {
|
|
16
|
+
const handoff = buildExtractiveHandoff(messages, {
|
|
17
|
+
maxFallbackSourceChars: 24_000,
|
|
18
|
+
});
|
|
19
|
+
return markDurableSystemMessage(
|
|
20
|
+
{
|
|
21
|
+
role: "system",
|
|
22
|
+
content:
|
|
23
|
+
`[Conversation Summary: ${action} ${turnId}]\n` +
|
|
24
|
+
formatStructuredHandoff(handoff),
|
|
25
|
+
},
|
|
26
|
+
DURABLE_SYSTEM_MESSAGE_KINDS.CHECKPOINT_SUMMARY,
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Deterministic v1 rewrite shared by the planner and verified history reader.
|
|
32
|
+
* Source indexes describe the conservative dependency of each output, not a
|
|
33
|
+
* claim that the bounded extractive summary quotes every source. Changes to
|
|
34
|
+
* this transform/formatter require a new history schema or a v1 reader.
|
|
35
|
+
*/
|
|
36
|
+
export function projectCheckpointSummary({
|
|
37
|
+
messages,
|
|
38
|
+
action,
|
|
39
|
+
turnId,
|
|
40
|
+
start,
|
|
41
|
+
end,
|
|
42
|
+
}) {
|
|
43
|
+
if (
|
|
44
|
+
!Array.isArray(messages) ||
|
|
45
|
+
typeof turnId !== "string" ||
|
|
46
|
+
!turnId ||
|
|
47
|
+
!Number.isSafeInteger(start) ||
|
|
48
|
+
!Number.isSafeInteger(end) ||
|
|
49
|
+
start < 0 ||
|
|
50
|
+
start >= end ||
|
|
51
|
+
end > messages.length ||
|
|
52
|
+
!["summary-from", "summary-to"].includes(action)
|
|
53
|
+
)
|
|
54
|
+
throw new TypeError("Invalid checkpoint summary source range");
|
|
55
|
+
const copied = (begin, finish) =>
|
|
56
|
+
messages.slice(begin, finish).map((message, index) => ({
|
|
57
|
+
message,
|
|
58
|
+
sourceIndexes: [begin + index],
|
|
59
|
+
}));
|
|
60
|
+
const summarized = (entries) => ({
|
|
61
|
+
message: summaryMessage(
|
|
62
|
+
entries.map((entry) => entry.message),
|
|
63
|
+
action,
|
|
64
|
+
turnId,
|
|
65
|
+
),
|
|
66
|
+
sourceIndexes: entries.flatMap((entry) => entry.sourceIndexes),
|
|
67
|
+
});
|
|
68
|
+
if (action === "summary-from") {
|
|
69
|
+
if (end !== messages.length || messages[start]?.role !== "user")
|
|
70
|
+
throw new TypeError("Invalid checkpoint summary suffix");
|
|
71
|
+
return [...copied(0, start), summarized(copied(start, end))];
|
|
72
|
+
}
|
|
73
|
+
if (
|
|
74
|
+
start !== (messages[0]?.role === "system" ? 1 : 0) ||
|
|
75
|
+
(end < messages.length && messages[end]?.role !== "user")
|
|
76
|
+
)
|
|
77
|
+
throw new TypeError("Invalid checkpoint summary prefix");
|
|
78
|
+
|
|
79
|
+
const prefix = messages.slice(start, end);
|
|
80
|
+
// Validate/sanitize before inspecting roles. Unmarked systems must neither
|
|
81
|
+
// survive the rewrite nor be quoted into a newly authorized summary.
|
|
82
|
+
const canonical = projectCanonicalResumeMessages(prefix, { strict: true });
|
|
83
|
+
const indexes = prefix.flatMap((message, index) =>
|
|
84
|
+
message.role !== "system" || getDurableSystemMessageProvenance(message)
|
|
85
|
+
? [start + index]
|
|
86
|
+
: [],
|
|
87
|
+
);
|
|
88
|
+
const entries = canonical.map((message, index) => ({
|
|
89
|
+
message,
|
|
90
|
+
sourceIndexes: [indexes[index]],
|
|
91
|
+
}));
|
|
92
|
+
return [
|
|
93
|
+
...copied(0, start),
|
|
94
|
+
...entries.filter((entry) => entry.message.role === "system"),
|
|
95
|
+
summarized(entries.filter((entry) => entry.message.role !== "system")),
|
|
96
|
+
...copied(end, messages.length),
|
|
97
|
+
];
|
|
98
|
+
}
|
|
@@ -11,16 +11,7 @@ import {
|
|
|
11
11
|
resolveCheckpointTimelineAction,
|
|
12
12
|
} from "./checkpoint-timeline.js";
|
|
13
13
|
import { planSessionBranch } from "./session-branch.js";
|
|
14
|
-
import {
|
|
15
|
-
buildExtractiveHandoff,
|
|
16
|
-
formatStructuredHandoff,
|
|
17
|
-
} from "../harness/structured-handoff.js";
|
|
18
|
-
import {
|
|
19
|
-
DURABLE_SYSTEM_MESSAGE_KINDS,
|
|
20
|
-
getDurableSystemMessageProvenance,
|
|
21
|
-
markDurableSystemMessage,
|
|
22
|
-
projectCanonicalResumeMessages,
|
|
23
|
-
} from "./session-message-provenance.js";
|
|
14
|
+
import { projectCheckpointSummary } from "./checkpoint-summary-projection.js";
|
|
24
15
|
|
|
25
16
|
export const CHECKPOINT_TIMELINE_RESULT_SCHEMA =
|
|
26
17
|
"cc-checkpoint-timeline-result/v1";
|
|
@@ -243,21 +234,6 @@ function userAnchor(messages, offset) {
|
|
|
243
234
|
return null;
|
|
244
235
|
}
|
|
245
236
|
|
|
246
|
-
function summaryMessage(messages, action, turnId) {
|
|
247
|
-
const handoff = buildExtractiveHandoff(messages, {
|
|
248
|
-
maxFallbackSourceChars: 24_000,
|
|
249
|
-
});
|
|
250
|
-
return markDurableSystemMessage(
|
|
251
|
-
{
|
|
252
|
-
role: "system",
|
|
253
|
-
content:
|
|
254
|
-
`[Conversation Summary: ${action} ${turnId}]\n` +
|
|
255
|
-
formatStructuredHandoff(handoff),
|
|
256
|
-
},
|
|
257
|
-
DURABLE_SYSTEM_MESSAGE_KINDS.CHECKPOINT_SUMMARY,
|
|
258
|
-
);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
237
|
function codePreviewShape(value, checkpointId) {
|
|
262
238
|
const data = value && typeof value === "object" ? value : {};
|
|
263
239
|
const source = (key) => (Array.isArray(data[key]) ? data[key] : []);
|
|
@@ -348,11 +324,13 @@ export function planCheckpointTimelineAction({
|
|
|
348
324
|
commit.messages = messages.slice(0, anchor);
|
|
349
325
|
commit.bindingPruneOffset = submission.conversationOffset;
|
|
350
326
|
} else if (action === CHECKPOINT_TIMELINE_ACTIONS.SUMMARY_FROM) {
|
|
351
|
-
|
|
352
|
-
commit.messages =
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
327
|
+
commit.summaryRange = { start: anchor, end: messages.length };
|
|
328
|
+
commit.messages = projectCheckpointSummary({
|
|
329
|
+
messages,
|
|
330
|
+
action,
|
|
331
|
+
turnId: entry.turnId,
|
|
332
|
+
...commit.summaryRange,
|
|
333
|
+
}).map((entry) => entry.message);
|
|
356
334
|
commit.bindingPruneOffset = submission.conversationOffset;
|
|
357
335
|
} else if (action === CHECKPOINT_TIMELINE_ACTIONS.SUMMARY_TO) {
|
|
358
336
|
const entryIndex = timeline.entries.indexOf(entry);
|
|
@@ -364,31 +342,17 @@ export function planCheckpointTimelineAction({
|
|
|
364
342
|
return { ok: false, code: "TIMELINE_CONVERSATION_ANCHOR_STALE" };
|
|
365
343
|
}
|
|
366
344
|
const systemCount = messages[0]?.role === "system" ? 1 : 0;
|
|
367
|
-
|
|
368
|
-
let canonicalPrefix;
|
|
345
|
+
commit.summaryRange = { start: systemCount, end: nextAnchor };
|
|
369
346
|
try {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
347
|
+
commit.messages = projectCheckpointSummary({
|
|
348
|
+
messages,
|
|
349
|
+
action,
|
|
350
|
+
turnId: entry.turnId,
|
|
351
|
+
...commit.summaryRange,
|
|
352
|
+
}).map((entry) => entry.message);
|
|
373
353
|
} catch {
|
|
374
354
|
return { ok: false, code: "TIMELINE_CONVERSATION_INVALID" };
|
|
375
355
|
}
|
|
376
|
-
const durableSystems = canonicalPrefix.filter((message) =>
|
|
377
|
-
Boolean(getDurableSystemMessageProvenance(message)),
|
|
378
|
-
);
|
|
379
|
-
// The first system is the current host-owned prompt and stays in place.
|
|
380
|
-
// Other systems survive the rewrite only with runtime provenance. An
|
|
381
|
-
// unmarked verified event must neither survive nor be quoted into the new
|
|
382
|
-
// durable summary, otherwise SUMMARY_TO would bless it on persistence.
|
|
383
|
-
const selected = canonicalPrefix.filter(
|
|
384
|
-
(message) => message.role !== "system",
|
|
385
|
-
);
|
|
386
|
-
commit.messages = [
|
|
387
|
-
...messages.slice(0, systemCount),
|
|
388
|
-
...durableSystems,
|
|
389
|
-
summaryMessage(selected, action, entry.turnId),
|
|
390
|
-
...messages.slice(nextAnchor),
|
|
391
|
-
];
|
|
392
356
|
// Every surviving later offset shifts when a prefix is summarized.
|
|
393
357
|
commit.bindingPruneOffset = 0;
|
|
394
358
|
} else if (action === CHECKPOINT_TIMELINE_ACTIONS.BRANCH) {
|