chainlesschain 0.165.5 → 0.165.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/src/assets/web-panel/assets/{AIOps-CEeYTeDB.js → AIOps-B3gWmXjo.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BeRUQ3V2.js → ActionButton-G9pdT-0e.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DrV718XF.js → Analytics-Ca30J7m2.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-Cd2Frt7Q.js → AppLayout-BtVTm8PU.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CUJMlORU.js → Artifacts-BhViNa6u.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CXJcfT6p.js → Audit-DhKq-FnY.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DOv6Z7H9.js → BackgroundAgents-BL0SVbnE.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BwdDyBI0.js → Backup-BWkblnFi.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BmLn4kYH.js → BaseInput-ClaRNrF8.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-COg8pAW2.js → Chat-sZE2Z77o.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BAfKOnRe.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-BCP4uoU8.js → Checkbox-Cvhay5WM.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-pRt6Y9JI.js → Codegen-BpejL-4N.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DLaprKhS.js → Col-g2Ki6g_1.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DyATsz5f.js → Community-D2xKbNo9.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BXAaupZK.js → Compact-DbL1Pds3.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DpcJBELr.js → Compliance-DGtZCV4c.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DG4EFWyd.js → Cowork-4kQpoNsI.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-F6Oy5n2P.js → Cron-BxTYXXAN.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BOdgtalX.js → Crosschain-k0J0LT2N.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DT1dSkjH.js → DID-BaqhoPgN.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-NBUIqWzC.js → Dashboard-T4RVPIM1.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CSpHeMYB.js → Dropdown-DszOToWq.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CEG0xISr.js → EmailListRenderer-C9KJU7HF.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BTZ0BZna.js → FamilyGuardDashboard-Cmr0JnsA.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BuuCTn2V.js → Federation-BI-_2xZX.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-KAVceevk.js → FormItemContext-DsnDEPsl.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DnHpcQvW.js → GenericCardRenderer-BLncAKKK.js} +1 -1
- package/src/assets/web-panel/assets/{Git-C_B_0HwB.js → Git-BPQhGXDn.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DPSZuzuu.js → Governance-CyElbUQW.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BV-06V7q.js → Inference-CcSntBQD.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-wpDuupn6.js → KnowledgeGraph-p6e7HZ2r.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Bseca1_I.js → Logs-CNEtr-wz.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-Bj9xI0YH.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-d3kM4DDL.js → Marketplace-Dd2notAJ.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DQ_xZ23i.js → McpTools-BBsN2CSW.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-CRIeYO4L.js → Memory-Dg2uTvwx.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BsllIa9l.js → MobileBridge-r1YMRiJV.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BUuQy30X.js → MobileProjects-C-89kSm4.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BOFDIzrC.js → Mtc-CrPZcVgf.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BQg-vyvG.js → MtcAudit-sxi7hqJb.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-Bo1jrPdN.js → Multisig-CAgOMfF1.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Bmod8alw.js → NLProgramming-DafaPts3.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CGGFL8w-.js → Notes-CJM-xUW_.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BsZvCJxC.js → NotificationSettings-L0ZjfAh_.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-C1-Quo_h.js → OrderTableRenderer-BB1CvCK0.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BjOeDYOi.js → Organization-DeLtgAD8.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DwVV3l5A.js → Overflow-CKC2b10z.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Cu3DQT9W.js → P2P-eyf2rzY1.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Cg0gR7dH.js → PdhVaultBrowser-5upNIOW8.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CsAXxRN5.js → Permissions-B8p3W6JK.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-C-nNmnYp.js → PersonalDataHub-BnRMxTq3.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-BOnW7nNc.js → Pipeline-DjCNI1li.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-ClLSyGKt.js → Privacy-u6gXLbWT.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DuLvjjq7.js → ProjectInit-BZAw4tkM.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DQYYbDD9.js → ProjectSettings-B1Tr72q7.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Drw8MBGK.js → Projects-DO7HFuBQ.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-ckqHQe6K.js → Providers-BjCztyhj.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DW5BXk-G.js → QrScannerModal-ZWyCUbR1.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DDLnhNTp.js → QuickAsk-DhDjeW4G.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-PJQ2C91U.js → Recommend-R_CN2MuU.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-s6wmda34.js → RemoteSession-uxFcujeu.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DC2sb-I3.js → Reputation-DX8D7rks.js} +1 -1
- package/src/assets/web-panel/assets/{Row-hPGk1eGj.js → Row-BYahQILD.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-RIvfZql0.js → RssFeed-CUSQ2tm-.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DFg1G1eR.js → Search-CnN_S8Cs.js} +1 -1
- package/src/assets/web-panel/assets/{Security-D6H5p8Dp.js → Security-DcZlh-O4.js} +4 -4
- package/src/assets/web-panel/assets/{Services-nxYiFV_w.js → Services-ZhBOjzIX.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BmgFNAdB.js → Skeleton-D5Qnq_lI.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CsaaD2av.js → Skills-BC9cZ3Be.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-yM5y9yvK.js → Sla-DauJ3E8_.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-DbNeZ_fh.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-CFVhEyyr.js → SyncSettings-DUvJbSct.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DdO02Inn.js → Tasks-BXa-5noQ.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Eo2d8Llu.js → Templates-JxaiUt_3.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-ChESOXgy.js → Tenant-BW4ERQN8.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BJ7oDxTI.js → Terminal-DltUbdtv.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-hWX0fUvz.js → TimelineRenderer-CMoZz0Tc.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DVBZQnd-.js → Tokens-D_VEV60K.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-D89cQfVq.js → Trigger-CCXTCs0R.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BIVSb4-V.js → Trust-lkGRIPcG.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B58gWopl.js → UkeySign-BfGeQ9HX.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DhHI7bmG.js → VideoEditing-BEC7pYvc.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-C4FheWS_.js → Wallet-BZdG24o0.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DnPRq-Bx.js → WebAuthn-yoEddedp.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-BerRPjpJ.js → WorkflowEditor-BXZEprOW.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BzZ52iKr.js → chat-gg0bzZal.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BI_E4BAn.js → colors-DjRVRuin.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-d50mr3yk.js → compact-item-su-dieAc.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-C6FsQ1IH.js → createContext-Ci3S8oKF.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CxbFX9uH.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DLZEMgLP.js → hasIn-D8F10heH.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-aBumtY.js → index-11wtYQiF.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjuKZBqJ.js → index-1IgxgALJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-9H_M2jju.js → index-1agckWSq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE0V6cp-.js → index-5JqhujnR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Y2-q7QLm.js → index-6Tniqk1s.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoFtCVZ7.js → index-8Z-8BIlN.js} +1 -1
- package/src/assets/web-panel/assets/{index-KNGgO4Wm.js → index-BCI5v0yB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DY4j5zkF.js → index-BDJntYmJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZjjdQ62.js → index-BGzixOGZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTpIOTfR.js → index-BMMOVoLD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BB9SqVSt.js → index-BTFpdBtt.js} +1 -1
- package/src/assets/web-panel/assets/{index-AHr7ryWf.js → index-Ba_HyPnE.js} +1 -1
- package/src/assets/web-panel/assets/{index-Pvf30m8Q.js → index-BbF1IHof.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRN5TRTQ.js → index-BgT9su_e.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUaEHfQ0.js → index-BzPB6kGZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdKt9fOd.js → index-C6ygzplr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dec0Kf_Z.js → index-CC3ZDjzY.js} +1 -1
- package/src/assets/web-panel/assets/{index-IPkwSAW_.js → index-CEmXRhAE.js} +1 -1
- package/src/assets/web-panel/assets/index-CJGOlduY.js +1 -0
- package/src/assets/web-panel/assets/{index-C3k8kevG.js → index-CMPqd5Cv.js} +1 -1
- package/src/assets/web-panel/assets/{index-A5CDWP7y.js → index-COWd8uGx.js} +1 -1
- package/src/assets/web-panel/assets/{index-CO8DAF7U.js → index-CPIYSp4H.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVzuawCX.js → index-CR0h6seT.js} +1 -1
- package/src/assets/web-panel/assets/{index-Co7s9LsB.js → index-CUmDhC4j.js} +1 -1
- package/src/assets/web-panel/assets/index-CkBCN5yH.js +1 -0
- package/src/assets/web-panel/assets/{index-CLoTQr0W.js → index-CusgZPtc.js} +1 -1
- package/src/assets/web-panel/assets/{index-B81mo1Et.js → index-DBAETXft.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcSUl9fA.js → index-DIJ2qFOC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Q5Tn735s.js → index-Dbq4NMET.js} +1 -1
- package/src/assets/web-panel/assets/{index-GXE0D8Nx.js → index-DkMEF5VT.js} +1 -1
- package/src/assets/web-panel/assets/{index-TWG-_D1M.js → index-DkfQR3hM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAE3hwev.js → index-DnLucOn9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgkoH3_g.js → index-DugB_aKa.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRGx3w6T.js → index-DyLUarhZ.js} +3 -3
- package/src/assets/web-panel/assets/{index-BeM4hfht.js → index-T6_6ygJZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsscwxPE.js → index-Tu8eWqh-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bmr_vxXD.js → index-W7XUgdVL.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoNZlzhQ.js → index-dHZinfko.js} +1 -1
- package/src/assets/web-panel/assets/{index-DqkbHHg8.js → index-jyNgp5FI.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D-4Hzgej.js → initDefaultProps-Cv4p8e4w.js} +1 -1
- package/src/assets/web-panel/assets/{motion-D4Wl4xU7.js → motion-B8EwmMOw.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cd5eQvL0.js → move-B8R9F8TK.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-B4ilslCW.js → mtc-parser-DoFYz5Bp.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Ckarx-tf.js → omit-CHWYLBjI.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-QJ0bpCmc.js → pickAttrs-CXuPDO77.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CKHm-tq8.js → placementArrow-BaAtUUon.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CV6a_w_Y.js → responsiveObserve-DCc4zcDD.js} +1 -1
- package/src/assets/web-panel/assets/{slide-mHpeQFgk.js → slide-B_lx89oZ.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DIaQNQWA.js → statusUtils-DE8DPmR0.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-PJpzavV8.js → styleChecker-1ktXOsL_.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BH7zTw8S.js → useFlexGapSupport-xH89-wjh.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BDNG3JDd.js → useFs-DscvfW5p.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CY2VWdUg.js → usePersonalDataHub-RdMKQta7.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D0kw9jhz.js → vnode-Z3wTni2T.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B5g7TN7r.js → zoom-B0iChCsm.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +105 -62
- package/src/commands/background-session.js +100 -10
- package/src/commands/git.js +39 -0
- package/src/commands/mcp.js +5 -0
- package/src/commands/plugin.js +160 -29
- package/src/commands/remote-control.js +295 -110
- package/src/commands/session-group.js +131 -0
- package/src/commands/session-location.js +48 -0
- package/src/commands/session-message.js +171 -0
- package/src/commands/session.js +22 -0
- package/src/commands/sync-providers.js +4 -1
- package/src/commands/update.js +1 -0
- package/src/data/changelog.json +41 -2
- package/src/gateways/ws/ws-agent-handler.js +20 -12
- package/src/harness/jsonl-session-store.js +279 -37
- package/src/harness/mcp-client.js +832 -91
- package/src/harness/session-index.js +15 -4
- package/src/lib/agent-worktree.js +8 -1
- package/src/lib/auto-mode-safety-classifier.js +3 -17
- package/src/lib/background-agent-keeper-protocol.js +26 -6
- package/src/lib/background-agent-supervisor.js +17 -1
- package/src/lib/background-session-transport.js +153 -27
- package/src/lib/browser-evidence.js +1405 -0
- package/src/lib/chrome-connector.js +465 -79
- package/src/lib/claude-project-auto-memory.js +481 -0
- package/src/lib/claude-project-storage-layout.js +104 -0
- package/src/lib/cloud/cloud-client.js +40 -0
- package/src/lib/execution-location-local-supervisor.mjs +226 -0
- package/src/lib/execution-location-runner-lifecycle.js +991 -0
- package/src/lib/execution-location-target-preflight.js +333 -0
- package/src/lib/execution-location-target.js +783 -13
- package/src/lib/file-lines.js +6 -1
- package/src/lib/gateway-client-resilience.js +571 -0
- package/src/lib/gitlab-mr-worktree.js +176 -0
- package/src/lib/hooks-v2-producers.js +119 -15
- package/src/lib/hooks-v2-workspace-context.js +44 -1
- package/src/lib/host-resource-budget.js +295 -0
- package/src/lib/ide-context.js +15 -2
- package/src/lib/llm-config-defaults.js +43 -0
- package/src/lib/mcp-client.js +2 -0
- package/src/lib/mcp-headers-helper.js +47 -5
- package/src/lib/mcp-lifecycle-authority.js +887 -0
- package/src/lib/mcp-oauth.js +156 -26
- package/src/lib/mcp-tls.js +330 -0
- package/src/lib/output-styles.js +12 -0
- package/src/lib/paths.js +260 -32
- package/src/lib/permission-request.js +48 -0
- package/src/lib/plugin-runtime/bin.js +3 -1
- package/src/lib/plugin-runtime/hooks.js +3 -1
- package/src/lib/plugin-runtime/install.js +730 -71
- package/src/lib/plugin-runtime/lsp.js +4 -4
- package/src/lib/plugin-runtime/marketplace-archive-source.js +366 -0
- package/src/lib/plugin-runtime/marketplace-catalog.js +63 -6
- package/src/lib/plugin-runtime/marketplace-command-descriptor.js +343 -0
- package/src/lib/plugin-runtime/marketplace-command-source.js +580 -0
- package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1 -0
- package/src/lib/plugin-runtime/marketplace-source-adapter.js +188 -0
- package/src/lib/plugin-runtime/marketplace-source-cache.js +11 -1
- package/src/lib/plugin-runtime/mcp.js +3 -1
- package/src/lib/plugin-runtime/monitors.js +3 -1
- package/src/lib/plugin-runtime/remote-source.js +583 -58
- package/src/lib/plugin-runtime/settings.js +3 -1
- package/src/lib/plugin-runtime/trust.js +274 -13
- package/src/lib/plugin-security.js +393 -41
- package/src/lib/plugin-source-identity.js +850 -0
- package/src/lib/process-execution-broker/credential-agent.js +210 -41
- package/src/lib/process-execution-broker/index.js +15 -1
- package/src/lib/process-execution-broker/linux-cgroup-v2.js +391 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +50 -28
- package/src/lib/project-mcp-trust.js +165 -10
- package/src/lib/remote-approval-bridge.js +136 -46
- package/src/lib/remote-control.js +217 -31
- package/src/lib/resume-session.js +9 -6
- package/src/lib/session-core-singletons.js +26 -11
- package/src/lib/session-host-lease.js +52 -16
- package/src/lib/session-lifecycle-scope.js +153 -0
- package/src/lib/session-message-fabric.js +1252 -0
- package/src/lib/session-projection.js +286 -3
- package/src/lib/session-runtime-retention.js +155 -0
- package/src/lib/session-store-guard.js +3 -1
- package/src/lib/session-workbench-store.js +466 -0
- package/src/lib/settings-loader.cjs +29 -0
- package/src/lib/spellcheck.js +211 -0
- package/src/lib/sub-agent-context.js +9 -9
- package/src/lib/sync-cli-db.js +485 -129
- package/src/lib/sync-credentials.js +31 -20
- package/src/lib/web-fetch.js +112 -40
- package/src/lib/web-search.js +127 -61
- package/src/lib/workspace-trust.js +793 -0
- package/src/repl/agent-repl.js +175 -19
- package/src/repl/permission-prompt.js +29 -8
- package/src/repl/repl-keybindings.js +55 -0
- package/src/runtime/agent-core.js +362 -20
- package/src/runtime/bootstrap.js +37 -13
- package/src/runtime/coding-agent-contract-shared.cjs +11 -4
- package/src/runtime/headless-runner.js +281 -102
- package/src/runtime/headless-stream.js +199 -30
- package/src/runtime/mcp-config.js +298 -6
- package/src/runtime/policies/agent-policy.js +10 -0
- package/src/runtime/status-diagnostics-lite.js +9 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-4gGkdGgA.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-B4RLp2zs.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-DPy1XMYh.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CagEcIex.js +0 -1
- package/src/assets/web-panel/assets/index-pzT9PpOU.js +0 -1
- package/src/assets/web-panel/assets/index-z1kFadaX.js +0 -1
|
@@ -61,6 +61,11 @@ import {
|
|
|
61
61
|
verifyExecutionLocationResultApplySourceGit,
|
|
62
62
|
} from "../lib/execution-location-result-apply.js";
|
|
63
63
|
import { executionBroker } from "../lib/process-execution-broker/index.js";
|
|
64
|
+
import {
|
|
65
|
+
projectExecutionLocationTargetSigtermProbe,
|
|
66
|
+
projectExecutionLocationTargetPreflight,
|
|
67
|
+
runExecutionLocationTargetResourceProbe,
|
|
68
|
+
} from "../lib/execution-location-target-preflight.js";
|
|
64
69
|
import {
|
|
65
70
|
sameFileStatIdentity,
|
|
66
71
|
samePathHandleFileIdentity,
|
|
@@ -1134,6 +1139,17 @@ function runPreviewAction(action, deps = {}) {
|
|
|
1134
1139
|
}
|
|
1135
1140
|
}
|
|
1136
1141
|
|
|
1142
|
+
async function runAsyncAction(action, options = {}) {
|
|
1143
|
+
try {
|
|
1144
|
+
const projection = await action();
|
|
1145
|
+
writeProjection(projection, options);
|
|
1146
|
+
return projection.allowed === false ? 2 : 0;
|
|
1147
|
+
} catch (error) {
|
|
1148
|
+
process.stderr.write(`Execution location failed: ${error.message}\n`);
|
|
1149
|
+
return 1;
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1137
1153
|
export function registerSessionLocationSubcommands(session, deps = {}) {
|
|
1138
1154
|
const location = session
|
|
1139
1155
|
.command("location")
|
|
@@ -1152,6 +1168,38 @@ export function registerSessionLocationSubcommands(session, deps = {}) {
|
|
|
1152
1168
|
);
|
|
1153
1169
|
});
|
|
1154
1170
|
|
|
1171
|
+
location
|
|
1172
|
+
.command("target-preflight", { hidden: true })
|
|
1173
|
+
.description("Verify target-local runner fences and resource limits")
|
|
1174
|
+
.option("--json", "Machine-readable JSON output")
|
|
1175
|
+
.action((options) => {
|
|
1176
|
+
process.exitCode = runAction(
|
|
1177
|
+
() => projectExecutionLocationTargetPreflight({}, deps),
|
|
1178
|
+
options,
|
|
1179
|
+
);
|
|
1180
|
+
});
|
|
1181
|
+
|
|
1182
|
+
location
|
|
1183
|
+
.command("resource-probe <kind>", { hidden: true })
|
|
1184
|
+
.description("Exercise a target-local cpu or memory enforcement boundary")
|
|
1185
|
+
.action((kind) => {
|
|
1186
|
+
process.exitCode = runAction(
|
|
1187
|
+
() => runExecutionLocationTargetResourceProbe(kind),
|
|
1188
|
+
{},
|
|
1189
|
+
);
|
|
1190
|
+
});
|
|
1191
|
+
|
|
1192
|
+
location
|
|
1193
|
+
.command("sigterm-drain-probe", { hidden: true })
|
|
1194
|
+
.description("Exercise the target-local SIGTERM drain transition")
|
|
1195
|
+
.option("--json", "Machine-readable JSON output")
|
|
1196
|
+
.action(async (options) => {
|
|
1197
|
+
process.exitCode = await runAsyncAction(
|
|
1198
|
+
() => projectExecutionLocationTargetSigtermProbe({}, deps),
|
|
1199
|
+
options,
|
|
1200
|
+
);
|
|
1201
|
+
});
|
|
1202
|
+
|
|
1155
1203
|
location
|
|
1156
1204
|
.command("show <id>")
|
|
1157
1205
|
.description("Show the execution location anchored by session_start")
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { logger } from "../lib/logger.js";
|
|
2
|
+
import { SessionMessageFabric } from "../lib/session-message-fabric.js";
|
|
3
|
+
|
|
4
|
+
function output(value, options = {}) {
|
|
5
|
+
if (options.json) {
|
|
6
|
+
logger.log(JSON.stringify(value, null, 2));
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
if (Array.isArray(value)) {
|
|
10
|
+
if (value.length === 0) {
|
|
11
|
+
logger.log("No session messages.");
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
for (const item of value) logger.log(JSON.stringify(item));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
logger.log(JSON.stringify(value, null, 2));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function numericOption(value) {
|
|
21
|
+
if (value == null) return null;
|
|
22
|
+
const number = Number(value);
|
|
23
|
+
return Number.isSafeInteger(number) && number > 0 ? number : value;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function fabric() {
|
|
27
|
+
return new SessionMessageFabric();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function registerSessionMessageCommands(session) {
|
|
31
|
+
const message = session
|
|
32
|
+
.command("message")
|
|
33
|
+
.description(
|
|
34
|
+
"Durable cross-session inbox, addressing, policy and receipts",
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
message
|
|
38
|
+
.command("register <session-id>")
|
|
39
|
+
.description("Register or reconnect a uniquely named session endpoint")
|
|
40
|
+
.option("--name <name>", "Unique @name (defaults to session id)")
|
|
41
|
+
.option("--machine <id>", "Stable machine identity", "local")
|
|
42
|
+
.option(
|
|
43
|
+
"--policy <policy>",
|
|
44
|
+
"Inbound policy: accept | hold | refuse",
|
|
45
|
+
"accept",
|
|
46
|
+
)
|
|
47
|
+
.option("--busy", "Register as busy instead of idle")
|
|
48
|
+
.option("--json", "Output as JSON")
|
|
49
|
+
.action((sessionId, options) => {
|
|
50
|
+
output(
|
|
51
|
+
fabric().register({
|
|
52
|
+
sessionId,
|
|
53
|
+
name: options.name || sessionId,
|
|
54
|
+
machineId: options.machine,
|
|
55
|
+
policy: options.policy,
|
|
56
|
+
idle: options.busy !== true,
|
|
57
|
+
}),
|
|
58
|
+
options,
|
|
59
|
+
);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
message
|
|
63
|
+
.command("unregister <endpoint>")
|
|
64
|
+
.description("Retire an endpoint epoch without leaking its inbox to reuse")
|
|
65
|
+
.option("--json", "Output as JSON")
|
|
66
|
+
.action((endpoint, options) => {
|
|
67
|
+
output(
|
|
68
|
+
{ unregistered: fabric().unregister(endpoint), endpoint },
|
|
69
|
+
options,
|
|
70
|
+
);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
message
|
|
74
|
+
.command("send <from> <to> <body...>")
|
|
75
|
+
.description("Send one bounded, idempotent message and print its receipt")
|
|
76
|
+
.option("--subject <text>", "Optional bounded subject")
|
|
77
|
+
.option("--message-id <id>", "Stable idempotency key")
|
|
78
|
+
.option("--sequence <n>", "Per sender/recipient ordering sequence")
|
|
79
|
+
.option("--ttl-ms <n>", "Message expiry in milliseconds")
|
|
80
|
+
.option(
|
|
81
|
+
"--notify-when-idle",
|
|
82
|
+
"Emit one receipt update when target becomes idle",
|
|
83
|
+
)
|
|
84
|
+
.option("--json", "Output as JSON")
|
|
85
|
+
.action((from, to, body, options) => {
|
|
86
|
+
output(
|
|
87
|
+
fabric().send({
|
|
88
|
+
from,
|
|
89
|
+
to,
|
|
90
|
+
body: body.join(" "),
|
|
91
|
+
subject: options.subject,
|
|
92
|
+
messageId: options.messageId,
|
|
93
|
+
sequence: numericOption(options.sequence),
|
|
94
|
+
ttlMs: numericOption(options.ttlMs),
|
|
95
|
+
notifyWhenIdle: options.notifyWhenIdle === true,
|
|
96
|
+
}),
|
|
97
|
+
options,
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
message
|
|
102
|
+
.command("inbox <endpoint>")
|
|
103
|
+
.description("Read an endpoint inbox in sender sequence order")
|
|
104
|
+
.option("--ack", "Acknowledge and release returned live message bodies")
|
|
105
|
+
.option("--json", "Output as JSON")
|
|
106
|
+
.action((endpoint, options) => {
|
|
107
|
+
output(fabric().inbox(endpoint, { acknowledge: options.ack }), options);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
message
|
|
111
|
+
.command("receipts <endpoint>")
|
|
112
|
+
.description("List durable delivered/refused/full/expired receipts")
|
|
113
|
+
.option("--json", "Output as JSON")
|
|
114
|
+
.action((endpoint, options) => {
|
|
115
|
+
output(fabric().receipts(endpoint), options);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
message
|
|
119
|
+
.command("policy <endpoint> <policy>")
|
|
120
|
+
.description("Set accept, hold or refuse with optional revision CAS")
|
|
121
|
+
.option("--expected-revision <n>", "Reject a stale rendered policy action")
|
|
122
|
+
.option("--json", "Output as JSON")
|
|
123
|
+
.action((endpoint, policy, options) => {
|
|
124
|
+
output(
|
|
125
|
+
fabric().setPolicy(endpoint, policy, {
|
|
126
|
+
expectedRevision: numericOption(options.expectedRevision),
|
|
127
|
+
}),
|
|
128
|
+
options,
|
|
129
|
+
);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
message
|
|
133
|
+
.command("idle <endpoint> <state>")
|
|
134
|
+
.description("Set idle/busy and deliver notify_when_idle exactly once")
|
|
135
|
+
.option("--expected-revision <n>", "Reject a stale rendered idle action")
|
|
136
|
+
.option("--json", "Output as JSON")
|
|
137
|
+
.action((endpoint, state, options) => {
|
|
138
|
+
const normalized = String(state).trim().toLowerCase();
|
|
139
|
+
if (!["idle", "busy", "true", "false"].includes(normalized)) {
|
|
140
|
+
const error = new Error("state must be idle, busy, true or false");
|
|
141
|
+
error.code = "SESSION_MESSAGE_INVALID_ARGUMENT";
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
output(
|
|
145
|
+
fabric().setIdle(endpoint, ["idle", "true"].includes(normalized), {
|
|
146
|
+
expectedRevision: numericOption(options.expectedRevision),
|
|
147
|
+
}),
|
|
148
|
+
options,
|
|
149
|
+
);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
for (const action of ["disconnect", "reconnect"]) {
|
|
153
|
+
message
|
|
154
|
+
.command(`${action} <endpoint>`)
|
|
155
|
+
.description(
|
|
156
|
+
action === "disconnect"
|
|
157
|
+
? "Mark transport offline while retaining its durable inbox"
|
|
158
|
+
: "Mark a durable endpoint transport online again",
|
|
159
|
+
)
|
|
160
|
+
.option("--json", "Output as JSON")
|
|
161
|
+
.action((endpoint, options) => {
|
|
162
|
+
output({ endpoint, [action]: fabric()[action](endpoint) }, options);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
message
|
|
167
|
+
.command("status")
|
|
168
|
+
.description("Emit the bounded CLI-owned message projection")
|
|
169
|
+
.option("--json", "Output as JSON")
|
|
170
|
+
.action((options) => output(fabric().projection(), options));
|
|
171
|
+
}
|
package/src/commands/session.js
CHANGED
|
@@ -68,6 +68,8 @@ import { registerSessionShowSubcommand } from "./session-show.js";
|
|
|
68
68
|
import { registerSessionObservabilitySubcommand } from "./session-observability.js";
|
|
69
69
|
import { registerSessionLocationSubcommands } from "./session-location.js";
|
|
70
70
|
import { registerSessionBudgetCommands } from "./session-budget.js";
|
|
71
|
+
import { registerSessionMessageCommands } from "./session-message.js";
|
|
72
|
+
import { registerSessionGroupCommands } from "./session-group.js";
|
|
71
73
|
|
|
72
74
|
export const _deps = {
|
|
73
75
|
execFileSync: (...args) => executionBroker.execFileSync(...args),
|
|
@@ -226,6 +228,8 @@ export function registerSessionCommand(program) {
|
|
|
226
228
|
registerSessionMcpRecoveryCommands(session);
|
|
227
229
|
registerSessionLocationSubcommands(session);
|
|
228
230
|
registerSessionBudgetCommands(session);
|
|
231
|
+
registerSessionMessageCommands(session);
|
|
232
|
+
registerSessionGroupCommands(session);
|
|
229
233
|
|
|
230
234
|
// session list
|
|
231
235
|
session
|
|
@@ -321,6 +325,8 @@ export function registerSessionCommand(program) {
|
|
|
321
325
|
let team = [];
|
|
322
326
|
let workflow = [];
|
|
323
327
|
let dynamicWorkflow = [];
|
|
328
|
+
let sessionMessageFabric = null;
|
|
329
|
+
let sessionWorkbench = null;
|
|
324
330
|
let artifacts = [];
|
|
325
331
|
let prLinks = {};
|
|
326
332
|
|
|
@@ -462,6 +468,20 @@ export function registerSessionCommand(program) {
|
|
|
462
468
|
} catch {
|
|
463
469
|
// Summaries are optional; absence never removes a session.
|
|
464
470
|
}
|
|
471
|
+
try {
|
|
472
|
+
const { SessionMessageFabric } =
|
|
473
|
+
await import("../lib/session-message-fabric.js");
|
|
474
|
+
sessionMessageFabric = new SessionMessageFabric().projection();
|
|
475
|
+
} catch (error) {
|
|
476
|
+
sourceErrors.sessionMessageFabric = error?.message || String(error);
|
|
477
|
+
}
|
|
478
|
+
try {
|
|
479
|
+
const { SessionWorkbenchStore } =
|
|
480
|
+
await import("../lib/session-workbench-store.js");
|
|
481
|
+
sessionWorkbench = new SessionWorkbenchStore().projection();
|
|
482
|
+
} catch (error) {
|
|
483
|
+
sourceErrors.sessionWorkbench = error?.message || String(error);
|
|
484
|
+
}
|
|
465
485
|
|
|
466
486
|
const { buildSessionProjection } =
|
|
467
487
|
await import("../lib/session-projection.js");
|
|
@@ -474,6 +494,8 @@ export function registerSessionCommand(program) {
|
|
|
474
494
|
dynamicWorkflow,
|
|
475
495
|
artifacts,
|
|
476
496
|
prLinks,
|
|
497
|
+
sessionMessageFabric,
|
|
498
|
+
sessionWorkbench,
|
|
477
499
|
sourceErrors,
|
|
478
500
|
});
|
|
479
501
|
if (options.json) {
|
|
@@ -188,7 +188,10 @@ async function _runProvider(providerId, opts = {}) {
|
|
|
188
188
|
try {
|
|
189
189
|
vault = await openCliVault();
|
|
190
190
|
} catch (err) {
|
|
191
|
-
if (
|
|
191
|
+
if (
|
|
192
|
+
err?.code === "BETTER_SQLITE3_MISSING" ||
|
|
193
|
+
String(err?.code || "").startsWith("CLI_VAULT_")
|
|
194
|
+
) {
|
|
192
195
|
console.error(chalk.red(`✗ ${err.message}`));
|
|
193
196
|
process.exitCode = 2;
|
|
194
197
|
return;
|
package/src/commands/update.js
CHANGED
package/src/data/changelog.json
CHANGED
|
@@ -1,16 +1,55 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "CHANGELOG.md",
|
|
3
3
|
"releases": [
|
|
4
|
+
{
|
|
5
|
+
"productVersion": null,
|
|
6
|
+
"cliVersion": "0.165.8",
|
|
7
|
+
"cliVersions": ["0.165.7", "0.165.8"],
|
|
8
|
+
"date": "2026-08-23",
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Fixed - cc CLI 0.165.8: release-gate home isolation",
|
|
13
|
+
"body": "> `chainlesschain` **0.165.7 -> 0.165.8** (source candidate; not yet\n> published, 2026-08-23).\n> CLI-only candidate; `@chainlesschain/personal-data-hub` remains **0.4.59**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Agent SDK release-gate isolation**: the real-CLI SDK test now keeps its\n simulated operating-system home separate from `CHAINLESSCHAIN_HOME`, while\n retaining separate workspace and rollback-resistant security-anchor roots.\n This exercises the production fail-closed layout without asking the CLI to\n repair owner-only permissions on a broad user-home directory.\n- **Candidate continuity**: exact SHA `350fb4ce71` passed the complete Linux,\n Windows, and macOS `CLI CI` (`32612516841`) and `CLI Strict Sandbox`\n (`32612516696`) matrices. Its immutable `v-npm-0-165-7` release run\n (`32613795671`) stopped in the Agent SDK test before package, dry-run, or npm\n publish jobs; `0.165.7` was therefore never published and the fix advances\n to a new immutable version/tag rather than moving the existing tag.\n- **Release status**: publication requires this candidate's exact commit to\n pass the complete Linux, Windows, and macOS `CLI CI` and `CLI Strict Sandbox`\n matrices. Tag, provenance, registry readback, and publication evidence must\n be recorded only after those exact-SHA gates succeed."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"productVersion": null,
|
|
19
|
+
"cliVersion": "0.165.7",
|
|
20
|
+
"cliVersions": ["0.165.6", "0.165.7"],
|
|
21
|
+
"date": "2026-08-23",
|
|
22
|
+
"title": "",
|
|
23
|
+
"sections": [
|
|
24
|
+
{
|
|
25
|
+
"heading": "Fixed - cc CLI 0.165.7: merged-session and evidence stability",
|
|
26
|
+
"body": "> `chainlesschain` **0.165.6 -> 0.165.7** (unpublished immutable-tag candidate,\n> 2026-08-23; superseded by `0.165.8` after a pre-package release-gate failure).\n> CLI-only candidate; `@chainlesschain/personal-data-hub` remains **0.4.59**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Durable session stability**: bound headless event backlogs, scoped session\n sidecars, routed Claude project storage through canonical path authority,\n and prevented Windows append-writer starvation under concurrent session\n activity.\n- **Execution-location convergence**: local and remote replicas now bootstrap\n isolated target state, preserve replica identity and witnesses, forward\n staged input through the target supervisor, and retain CPU-limit evidence.\n- **Browser evidence reliability**: two-origin browser evidence installs its\n complete driver and aggregate dependency closure, preserves detached\n baselines, stabilizes Windows tabs, and retries bounded profile cleanup.\n- **Merged test-contract repair**: real-spawn fixtures keep workspace and\n application data as siblings, while path-module mocks inherit the production\n API before overriding isolated test roots. The bundled offline changelog is\n regenerated from this canonical record.\n- **Release status**: publication requires this candidate's exact commit to\n pass the complete Linux, Windows, and macOS `CLI CI` and `CLI Strict Sandbox`\n matrices. Tag, provenance, registry readback, and publication evidence must\n be recorded only after those exact-SHA gates succeed."
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"productVersion": null,
|
|
32
|
+
"cliVersion": "0.165.6",
|
|
33
|
+
"cliVersions": ["0.165.5", "0.165.6"],
|
|
34
|
+
"date": "2026-08-21",
|
|
35
|
+
"title": "",
|
|
36
|
+
"sections": [
|
|
37
|
+
{
|
|
38
|
+
"heading": "Added - cc CLI 0.165.6: safer remote sessions and governed plugin sources",
|
|
39
|
+
"body": "> `chainlesschain` **0.165.5 -> 0.165.6** (published from exact SHA\n> `ef4324349f272f5ec6af9a6ab80110e814122dae`, 2026-08-21).\n> CLI-only release; `@chainlesschain/personal-data-hub` remains **0.4.59**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Remote Control safe defaults**: direct sessions bind to loopback by\n default. Trusted-LAN exposure requires explicit command authority, preserves\n the selected bind address, fails closed on relay/direct fallback, and keeps\n IDE pairing surfaces from presenting loopback endpoints as phone-ready QR\n links.\n- **Governed plugin source identity**: managed Marketplace policy now evaluates\n canonical Git, registry, file, alias, ref, path, host, port, principal, and\n registry-resolution identities before target I/O or process spawn. Clone\n execution is isolated from ambient Git/SSH configuration, and cache\n provenance remains bound to the approved source and registry document.\n- **Digest-pinned Marketplace archives**: registry install and update can\n materialize same-origin, catalog-bound `tgz`/`tar.gz` sources only after\n candidate preflight. SHA-256 verification and bounded extraction reject\n traversal, links, special entries, case collisions, and expansion bombs;\n archive and extracted-payload digest authority are revalidated for offline\n cache replay. Dynamic command and headers-helper sources remain disabled by\n product policy.\n- **Cross-platform policy enforcement**: Windows runner temporary roots are\n canonicalized without probing caller-controlled targets. Other existing 8.3\n spellings resolve to their long-path authority, while unresolved or forged\n aliases remain rejected. Linux, Windows, and macOS Marketplace campaigns\n exercise air-gapped cache, proxy, PAC, and private-registry boundaries.\n- **Durable session and MCP lifecycle**: cross-session messaging, bounded\n long-running live state, MCP reconnect subscription recovery, lifecycle\n compatibility, and structured headless observability now share explicit\n identity, cleanup, and backpressure contracts.\n- **Focused terminal ergonomics**: the `concise` output style and persisted\n `classic`/`readline` keybinding flavor extend interactive use without\n changing existing default behavior.\n- **Published release evidence**: immutable tag `v-npm-0-165-6`, three-OS\n `CLI CI` (`32483224738`), `CLI Strict Sandbox` (`32483224517`), npm release\n (`32486454203`), and independent registry/provenance readback\n (`32488130856`) all bind exact SHA `ef4324349f`. npm reports\n `latest=0.165.6`; the public tarball SHA-1 is\n `d0dc65bdf34d0afe8e8db4492a1ddc72d63ee260`."
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
4
43
|
{
|
|
5
44
|
"productVersion": null,
|
|
6
45
|
"cliVersion": "0.165.5",
|
|
7
46
|
"cliVersions": ["0.165.4", "0.165.5"],
|
|
8
|
-
"date": "2026-08-
|
|
47
|
+
"date": "2026-08-21",
|
|
9
48
|
"title": "",
|
|
10
49
|
"sections": [
|
|
11
50
|
{
|
|
12
51
|
"heading": "Added - cc CLI 0.165.5: governed recovery and native add-on policy",
|
|
13
|
-
"body": "> `chainlesschain` **0.165.4 -> 0.165.5** (
|
|
52
|
+
"body": "> `chainlesschain` **0.165.4 -> 0.165.5** (published from exact SHA\n> `11aef634aa3ab88994698eca0ce2f5cfa65faf48`, 2026-08-21).\n> CLI-only release; `@chainlesschain/personal-data-hub` remains **0.4.59**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Recoverable Artifact workflows**: inspect and settle orphaned Artifact\n writes through a bounded CLI-owned recovery projection, retain exact\n access/deletion evidence, and surface workbench state without letting IDE\n clients derive storage mutations.\n- **Durable workflow recovery**: plan and resume interrupted workflow stages\n through persisted authority and checkpoint evidence, with tighter session\n and execution-location projections for CLI, WebSocket, and IDE consumers.\n- **Native MCP add-on policy**: admit only supported native loader shapes and\n validated executable/package identities. Unsupported or ambiguous native\n add-ons now return typed fail-closed rejections instead of crossing the\n strict process boundary.\n- **Release gates**: add cross-host Marketplace, accessibility,\n execution-location, context/permission, and live-provider campaigns while\n keeping CI dependency installation clean and deterministic.\n- **Published release evidence**: immutable tag `v-npm-0-165-5`, three-OS\n `CLI CI` (`32413582642`), `CLI Strict Sandbox` (`32413582490`), npm release\n (`32428314006`), and independent registry/provenance readback\n (`32429710720`) all bind exact SHA `11aef634aa`. npm reports\n `latest=0.165.5`; the public tarball SHA-1 is\n `c2cc7fb18ea572749d747de02355c6a0a5aef357`."
|
|
14
53
|
}
|
|
15
54
|
]
|
|
16
55
|
},
|
|
@@ -69,6 +69,7 @@ import {
|
|
|
69
69
|
recordSessionBudgetUsage,
|
|
70
70
|
rejectSessionBudgetUsageUnknown,
|
|
71
71
|
} from "../../lib/session-budget-usage.js";
|
|
72
|
+
import { HostResourceBudget } from "../../lib/host-resource-budget.js";
|
|
72
73
|
|
|
73
74
|
const CANONICAL_WS_TURN_QUEUES = new Map();
|
|
74
75
|
const CANONICAL_WS_CLAIM_CAS_ATTEMPTS = 4;
|
|
@@ -163,6 +164,7 @@ export class WSAgentHandler {
|
|
|
163
164
|
canonicalSessionStore,
|
|
164
165
|
sessionHostLease = null,
|
|
165
166
|
sessionBudgetRoot = null,
|
|
167
|
+
hostResourceBudget = null,
|
|
166
168
|
}) {
|
|
167
169
|
this.session = session;
|
|
168
170
|
this.interaction = interaction;
|
|
@@ -173,6 +175,9 @@ export class WSAgentHandler {
|
|
|
173
175
|
this._sessionHostLease = sessionHostLease;
|
|
174
176
|
this._sessionBudgetRoot = sessionBudgetRoot;
|
|
175
177
|
this._sessionBudget = sessionBudgetRoot?.budget || null;
|
|
178
|
+
// session-protocol keeps one handler alive across reconnects and incoming
|
|
179
|
+
// requests, making this authority session-scoped rather than turn-scoped.
|
|
180
|
+
this._hostResourceBudget = hostResourceBudget || new HostResourceBudget();
|
|
176
181
|
this._onSessionHostLeaseAbort = null;
|
|
177
182
|
if (sessionHostLease?.signal) {
|
|
178
183
|
this._onSessionHostLeaseAbort = () => {
|
|
@@ -642,7 +647,8 @@ export class WSAgentHandler {
|
|
|
642
647
|
model: session.model,
|
|
643
648
|
baseUrl: session.baseUrl,
|
|
644
649
|
apiKey: session.apiKey,
|
|
645
|
-
signal:
|
|
650
|
+
signal:
|
|
651
|
+
signal || this._sessionBudgetSignal || this._sessionHostLease?.signal,
|
|
646
652
|
onlyIfNeeded: true,
|
|
647
653
|
preserveCompletedExchange: true,
|
|
648
654
|
llmQuery: this._compactionLlmQuery,
|
|
@@ -1152,11 +1158,10 @@ export class WSAgentHandler {
|
|
|
1152
1158
|
strictUsageTelemetry =
|
|
1153
1159
|
this._resolveCanonicalUsageProtocol() === "call-ledger";
|
|
1154
1160
|
if (strictUsageTelemetry) this._assertUsageLedgerWritable();
|
|
1155
|
-
const compacted =
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
);
|
|
1161
|
+
const compacted = await this._compactCanonicalHistoryBeforeClaim(
|
|
1162
|
+
requestId,
|
|
1163
|
+
turnSignal,
|
|
1164
|
+
);
|
|
1160
1165
|
if (!compacted) return;
|
|
1161
1166
|
}
|
|
1162
1167
|
canonicalTurn ||= this._claimCanonicalTurn(userMessage, requestId);
|
|
@@ -1240,6 +1245,7 @@ export class WSAgentHandler {
|
|
|
1240
1245
|
cwd: session.projectRoot,
|
|
1241
1246
|
sessionId: session.id,
|
|
1242
1247
|
planManager: session.planManager,
|
|
1248
|
+
hostResourceBudget: this._hostResourceBudget,
|
|
1243
1249
|
enabledToolNames: session.enabledToolNames || null,
|
|
1244
1250
|
hostManagedToolPolicy: session.hostManagedToolPolicy || null,
|
|
1245
1251
|
extraToolDefinitions: session.externalToolDefinitions || [],
|
|
@@ -1507,7 +1513,10 @@ export class WSAgentHandler {
|
|
|
1507
1513
|
this._persistCanonicalUsageBoundary(event, "unknown");
|
|
1508
1514
|
}
|
|
1509
1515
|
if (this._markSessionBudgetUsageUnknown(event)) {
|
|
1510
|
-
rejectSessionBudgetUsageUnknown(
|
|
1516
|
+
rejectSessionBudgetUsageUnknown(
|
|
1517
|
+
event,
|
|
1518
|
+
"WebSocket provider call",
|
|
1519
|
+
);
|
|
1511
1520
|
}
|
|
1512
1521
|
break;
|
|
1513
1522
|
|
|
@@ -1624,9 +1633,9 @@ export class WSAgentHandler {
|
|
|
1624
1633
|
? surfacedError?.code || "CC_SESSION_BUDGET_EXHAUSTED"
|
|
1625
1634
|
: isAbortError(err)
|
|
1626
1635
|
? "CC_WS_TURN_INTERRUPTED"
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1636
|
+
: err?.code === "CC_WS_EMPTY_ASSISTANT_RESPONSE"
|
|
1637
|
+
? "CC_WS_EMPTY_ASSISTANT_RESPONSE"
|
|
1638
|
+
: "CC_WS_TURN_FAILED";
|
|
1630
1639
|
try {
|
|
1631
1640
|
this._settleCanonicalFailure(canonicalTurn, failureCode);
|
|
1632
1641
|
} catch (settlementError) {
|
|
@@ -1917,8 +1926,7 @@ export class WSAgentHandler {
|
|
|
1917
1926
|
model: session.model,
|
|
1918
1927
|
baseUrl: session.baseUrl,
|
|
1919
1928
|
apiKey: session.apiKey,
|
|
1920
|
-
signal:
|
|
1921
|
-
this._sessionBudgetSignal || this._sessionHostLease?.signal,
|
|
1929
|
+
signal: this._sessionBudgetSignal || this._sessionHostLease?.signal,
|
|
1922
1930
|
force: true,
|
|
1923
1931
|
preserveCompletedExchange: true,
|
|
1924
1932
|
llmQuery: this._compactionLlmQuery,
|