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
|
@@ -51,6 +51,15 @@ import {
|
|
|
51
51
|
normalizeMcpSandboxPolicy,
|
|
52
52
|
readMcpStdioCwd,
|
|
53
53
|
} from "../lib/mcp-sandbox-policy.js";
|
|
54
|
+
import {
|
|
55
|
+
MCP_TLS_MANAGED_SOURCE_REQUIRED_CODE,
|
|
56
|
+
MCP_TLS_MANAGED_SOURCE_REQUIRED_MESSAGE,
|
|
57
|
+
provisionManagedMcpTlsConfig,
|
|
58
|
+
} from "../lib/mcp-tls.js";
|
|
59
|
+
import {
|
|
60
|
+
McpLifecycleAuthority,
|
|
61
|
+
defaultMcpLifecycleAuthorityPath,
|
|
62
|
+
} from "../lib/mcp-lifecycle-authority.js";
|
|
54
63
|
|
|
55
64
|
function invalidSandboxPolicy(message) {
|
|
56
65
|
const error = new TypeError(message);
|
|
@@ -134,12 +143,203 @@ function headersHelperField(value) {
|
|
|
134
143
|
: {};
|
|
135
144
|
}
|
|
136
145
|
|
|
146
|
+
const MCP_CONFIG_ERROR_TYPES = new Set([
|
|
147
|
+
"invalid_config",
|
|
148
|
+
"invalid_name",
|
|
149
|
+
"unknown_type",
|
|
150
|
+
"url_missing_type",
|
|
151
|
+
"reserved_name",
|
|
152
|
+
]);
|
|
153
|
+
|
|
154
|
+
const MCP_CONFIG_TRANSPORT_TYPES = new Set([
|
|
155
|
+
"stdio",
|
|
156
|
+
"http",
|
|
157
|
+
"https",
|
|
158
|
+
"sse",
|
|
159
|
+
"ws",
|
|
160
|
+
"wss",
|
|
161
|
+
]);
|
|
162
|
+
|
|
163
|
+
function mcpConfigError(name, type, message) {
|
|
164
|
+
return {
|
|
165
|
+
// The entry name is intentionally retained: callers need to associate a
|
|
166
|
+
// skipped config with the declaration that supplied it. Keep its size
|
|
167
|
+
// bounded, while all other fields are fixed host-owned strings.
|
|
168
|
+
name: String(name || "<unnamed>").slice(0, 256),
|
|
169
|
+
type: MCP_CONFIG_ERROR_TYPES.has(type) ? type : "invalid_config",
|
|
170
|
+
message,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function mcpConfigEntries(raw) {
|
|
175
|
+
const block =
|
|
176
|
+
raw && typeof raw === "object" && !Array.isArray(raw)
|
|
177
|
+
? raw.mcpServers || raw.servers || raw
|
|
178
|
+
: null;
|
|
179
|
+
return block && typeof block === "object" && !Array.isArray(block)
|
|
180
|
+
? Object.entries(block)
|
|
181
|
+
: [];
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function mcpConfigEntryError(name, config) {
|
|
185
|
+
if (!name || typeof name !== "string" || name.trim().length === 0) {
|
|
186
|
+
return mcpConfigError(
|
|
187
|
+
name,
|
|
188
|
+
"invalid_name",
|
|
189
|
+
"MCP server name must be a non-empty string.",
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
if (!config || typeof config !== "object" || Array.isArray(config)) {
|
|
193
|
+
return mcpConfigError(
|
|
194
|
+
name,
|
|
195
|
+
"invalid_config",
|
|
196
|
+
"MCP server configuration must be an object.",
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const configuredType =
|
|
201
|
+
typeof config.type === "string" && config.type.trim()
|
|
202
|
+
? config.type.trim().toLowerCase()
|
|
203
|
+
: typeof config.transport === "string" && config.transport.trim()
|
|
204
|
+
? config.transport.trim().toLowerCase()
|
|
205
|
+
: null;
|
|
206
|
+
if (configuredType && !MCP_CONFIG_TRANSPORT_TYPES.has(configuredType)) {
|
|
207
|
+
return mcpConfigError(
|
|
208
|
+
name,
|
|
209
|
+
"unknown_type",
|
|
210
|
+
"MCP server transport type is not supported.",
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const hasCommand =
|
|
215
|
+
typeof config.command === "string" && config.command.trim().length > 0;
|
|
216
|
+
const hasUrl = typeof config.url === "string" && config.url.trim().length > 0;
|
|
217
|
+
if (hasCommand && hasUrl) {
|
|
218
|
+
return mcpConfigError(
|
|
219
|
+
name,
|
|
220
|
+
"invalid_config",
|
|
221
|
+
"MCP server configuration must specify one transport endpoint.",
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
if (
|
|
225
|
+
configuredType === "stdio" &&
|
|
226
|
+
!hasCommand &&
|
|
227
|
+
config.disabled !== true &&
|
|
228
|
+
config.enabled !== false
|
|
229
|
+
) {
|
|
230
|
+
return mcpConfigError(
|
|
231
|
+
name,
|
|
232
|
+
"invalid_config",
|
|
233
|
+
"Stdio MCP server configuration requires a command.",
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
if (
|
|
237
|
+
configuredType &&
|
|
238
|
+
configuredType !== "stdio" &&
|
|
239
|
+
!hasUrl &&
|
|
240
|
+
config.disabled !== true &&
|
|
241
|
+
config.enabled !== false
|
|
242
|
+
) {
|
|
243
|
+
return mcpConfigError(
|
|
244
|
+
name,
|
|
245
|
+
"invalid_config",
|
|
246
|
+
"Remote MCP server configuration requires a URL.",
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
if (
|
|
250
|
+
!hasCommand &&
|
|
251
|
+
!hasUrl &&
|
|
252
|
+
config.disabled !== true &&
|
|
253
|
+
config.enabled !== false
|
|
254
|
+
) {
|
|
255
|
+
return mcpConfigError(
|
|
256
|
+
name,
|
|
257
|
+
"invalid_config",
|
|
258
|
+
"MCP server configuration requires a command or URL.",
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Validate one explicit `--mcp-config` document without connecting to any
|
|
266
|
+
* server. Invalid entries are independently skipped; the fixed diagnostic
|
|
267
|
+
* shape is safe to expose in headless `system:init` output.
|
|
268
|
+
*
|
|
269
|
+
* This intentionally retains ChainlessChain's legacy URL inference when no
|
|
270
|
+
* `type`/`transport` is given. Explicit, unknown transport types are rejected
|
|
271
|
+
* before any DNS, process spawn, or transport construction.
|
|
272
|
+
*/
|
|
273
|
+
export function parseHeadlessMcpConfig(raw) {
|
|
274
|
+
const servers = {};
|
|
275
|
+
const errors = [];
|
|
276
|
+
for (const [name, config] of mcpConfigEntries(raw)) {
|
|
277
|
+
const entryError = mcpConfigEntryError(name, config);
|
|
278
|
+
if (entryError) {
|
|
279
|
+
errors.push(entryError);
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
try {
|
|
283
|
+
// Claude-style config calls the field `type`; the established cc shape
|
|
284
|
+
// calls it `transport`. Preserve an explicit transport when both exist.
|
|
285
|
+
const normalizedConfig =
|
|
286
|
+
config.transport == null && typeof config.type === "string"
|
|
287
|
+
? { ...config, transport: config.type }
|
|
288
|
+
: config;
|
|
289
|
+
const parsed = parseMcpServers({
|
|
290
|
+
mcpServers: { [name]: normalizedConfig },
|
|
291
|
+
});
|
|
292
|
+
if (!parsed[name]) {
|
|
293
|
+
errors.push(
|
|
294
|
+
mcpConfigError(
|
|
295
|
+
name,
|
|
296
|
+
"invalid_config",
|
|
297
|
+
"MCP server configuration is invalid.",
|
|
298
|
+
),
|
|
299
|
+
);
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
servers[name] = parsed[name];
|
|
303
|
+
} catch (error) {
|
|
304
|
+
if (error?.code === MCP_SANDBOX_POLICY_INVALID_CODE) {
|
|
305
|
+
throw error;
|
|
306
|
+
}
|
|
307
|
+
// Non-authority config parsers can still reject malformed nested values.
|
|
308
|
+
// Do not reflect their raw message into NDJSON because it may contain a
|
|
309
|
+
// filesystem path or user-supplied secret.
|
|
310
|
+
errors.push(
|
|
311
|
+
mcpConfigError(
|
|
312
|
+
name,
|
|
313
|
+
"invalid_config",
|
|
314
|
+
"MCP server configuration is invalid.",
|
|
315
|
+
),
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return { servers, errors };
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/** Read just the safe validation projection for a `--mcp-config` file. */
|
|
323
|
+
export function readHeadlessMcpConfigErrors(filePath, deps = {}) {
|
|
324
|
+
const readFile = deps.readFile || ((p) => fs.readFileSync(p, "utf-8"));
|
|
325
|
+
const raw = JSON.parse(readFile(filePath));
|
|
326
|
+
return parseHeadlessMcpConfig(raw).errors;
|
|
327
|
+
}
|
|
328
|
+
|
|
137
329
|
/**
|
|
138
330
|
* Normalize a parsed config object into a `{ name: serverConfig }` map.
|
|
139
331
|
* Accepts the Claude-Code shape `{ "mcpServers": { ... } }`, the bundle shape
|
|
140
332
|
* `{ "servers": { ... } }`, or a bare `{ name: cfg }` map.
|
|
141
333
|
*/
|
|
142
|
-
|
|
334
|
+
function unmanagedMcpTlsConfigError() {
|
|
335
|
+
// Configuration parsing errors are surfaced in headless diagnostics. Keep
|
|
336
|
+
// this entirely host-owned: do not disclose source paths or any TLS field.
|
|
337
|
+
const error = new Error(MCP_TLS_MANAGED_SOURCE_REQUIRED_MESSAGE);
|
|
338
|
+
error.code = MCP_TLS_MANAGED_SOURCE_REQUIRED_CODE;
|
|
339
|
+
return error;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function parseMcpServersForSource(raw, { provisionManagedTls = false } = {}) {
|
|
143
343
|
const block =
|
|
144
344
|
(raw && typeof raw === "object" && (raw.mcpServers || raw.servers)) ||
|
|
145
345
|
raw ||
|
|
@@ -207,21 +407,50 @@ export function parseMcpServers(raw) {
|
|
|
207
407
|
...(Number.isFinite(cfg.maxToolResultNodes)
|
|
208
408
|
? { maxToolResultNodes: cfg.maxToolResultNodes }
|
|
209
409
|
: {}),
|
|
410
|
+
...(Number.isFinite(cfg.toolIdleTimeoutMs)
|
|
411
|
+
? { toolIdleTimeoutMs: cfg.toolIdleTimeoutMs }
|
|
412
|
+
: {}),
|
|
413
|
+
...(cfg.discoveryCache === true ||
|
|
414
|
+
(cfg.discoveryCache && typeof cfg.discoveryCache === "object")
|
|
415
|
+
? { discoveryCache: cfg.discoveryCache }
|
|
416
|
+
: {}),
|
|
210
417
|
...headersHelperField(cfg.headersHelper),
|
|
211
418
|
...(cfg.configScope ? { configScope: cfg.configScope } : {}),
|
|
212
419
|
...(cfg.configSource ? { configSource: cfg.configSource } : {}),
|
|
420
|
+
...(cfg.tls != null
|
|
421
|
+
? provisionManagedTls
|
|
422
|
+
? { tls: provisionManagedMcpTlsConfig(cfg.tls) }
|
|
423
|
+
: (() => {
|
|
424
|
+
throw unmanagedMcpTlsConfigError();
|
|
425
|
+
})()
|
|
426
|
+
: {}),
|
|
427
|
+
...(cfg.disabled === true || cfg.enabled === false
|
|
428
|
+
? { disabled: true }
|
|
429
|
+
: {}),
|
|
213
430
|
};
|
|
214
431
|
}
|
|
215
432
|
return out;
|
|
216
433
|
}
|
|
217
434
|
|
|
435
|
+
/**
|
|
436
|
+
* Parse an unprivileged MCP configuration source. TLS material is deliberately
|
|
437
|
+
* rejected here; only `loadManagedMcp` invokes the source-specific parser that
|
|
438
|
+
* can mint the opaque managed TLS provenance.
|
|
439
|
+
*/
|
|
440
|
+
export function parseMcpServers(raw) {
|
|
441
|
+
return parseMcpServersForSource(raw);
|
|
442
|
+
}
|
|
443
|
+
|
|
218
444
|
/** Load organization-provisioned MCP servers as the highest-precedence layer. */
|
|
219
445
|
export async function loadManagedMcp(settings, deps = {}) {
|
|
220
446
|
const block = settings?.managedMcpServers || settings?.mcpServers;
|
|
221
447
|
if (!block || typeof block !== "object" || Array.isArray(block)) {
|
|
222
448
|
return deps.into || null;
|
|
223
449
|
}
|
|
224
|
-
const servers =
|
|
450
|
+
const servers = parseMcpServersForSource(
|
|
451
|
+
{ mcpServers: block },
|
|
452
|
+
{ provisionManagedTls: true },
|
|
453
|
+
);
|
|
225
454
|
const nameReservations = mcpServerNameReservations(deps);
|
|
226
455
|
for (const config of Object.values(servers)) {
|
|
227
456
|
config.configScope = "managed";
|
|
@@ -337,11 +566,30 @@ export function mcpAuthHint(url, errMessage) {
|
|
|
337
566
|
*/
|
|
338
567
|
export async function setupMcpFromConfig(servers, deps = {}) {
|
|
339
568
|
const writeErr = deps.writeErr || (() => {});
|
|
569
|
+
const mcpLifecycleAuthority =
|
|
570
|
+
deps.mcpLifecycleAuthority || new McpLifecycleAuthority();
|
|
340
571
|
const createClient =
|
|
341
572
|
deps.createClient ||
|
|
342
573
|
(() =>
|
|
343
|
-
new MCPClient({
|
|
574
|
+
new MCPClient({
|
|
575
|
+
eventRuntimeStore: deps.eventRuntimeStore || null,
|
|
576
|
+
lifecycleAuthority: mcpLifecycleAuthority,
|
|
577
|
+
sessionId: deps.sessionId,
|
|
578
|
+
}));
|
|
344
579
|
servers = filterMcpServersByPolicy(servers, deps.mcpPolicy, writeErr);
|
|
580
|
+
const enabledServers = {};
|
|
581
|
+
for (const [name, config] of Object.entries(servers)) {
|
|
582
|
+
if (config?.disabled === true || config?.enabled === false) {
|
|
583
|
+
mcpLifecycleAuthority.markDisabled({
|
|
584
|
+
name,
|
|
585
|
+
sessionId: deps.sessionId || "default",
|
|
586
|
+
config,
|
|
587
|
+
});
|
|
588
|
+
} else {
|
|
589
|
+
enabledServers[name] = config;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
servers = enabledServers;
|
|
345
593
|
const nameReservations = mcpServerNameReservations(deps);
|
|
346
594
|
const previouslyReservedNames = new Set(nameReservations);
|
|
347
595
|
|
|
@@ -371,6 +619,29 @@ export async function setupMcpFromConfig(servers, deps = {}) {
|
|
|
371
619
|
result.resourceTemplates = [];
|
|
372
620
|
}
|
|
373
621
|
if (!Array.isArray(result.prompts)) result.prompts = [];
|
|
622
|
+
if (!Array.isArray(result.mcpServerErrors)) {
|
|
623
|
+
result.mcpServerErrors = [];
|
|
624
|
+
}
|
|
625
|
+
if (Array.isArray(deps.mcpServerErrors)) {
|
|
626
|
+
for (const error of deps.mcpServerErrors) {
|
|
627
|
+
if (!error || typeof error !== "object") continue;
|
|
628
|
+
const normalized = mcpConfigError(
|
|
629
|
+
error.name,
|
|
630
|
+
error.type,
|
|
631
|
+
error.message || "MCP server configuration is invalid.",
|
|
632
|
+
);
|
|
633
|
+
if (
|
|
634
|
+
!result.mcpServerErrors.some(
|
|
635
|
+
(current) =>
|
|
636
|
+
current.name === normalized.name &&
|
|
637
|
+
current.type === normalized.type &&
|
|
638
|
+
current.message === normalized.message,
|
|
639
|
+
)
|
|
640
|
+
) {
|
|
641
|
+
result.mcpServerErrors.push(normalized);
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
374
645
|
// Per-server usage instructions from the MCP initialize response (surfaced
|
|
375
646
|
// by tool search; absent for servers that send none).
|
|
376
647
|
if (
|
|
@@ -777,20 +1048,31 @@ export async function loadMcpConfig(filePath, deps = {}) {
|
|
|
777
1048
|
`--mcp-config: cannot read/parse "${filePath}": ${err.message}`,
|
|
778
1049
|
);
|
|
779
1050
|
}
|
|
780
|
-
const servers =
|
|
781
|
-
if (Object.keys(servers).length === 0) {
|
|
1051
|
+
const { servers, errors } = parseHeadlessMcpConfig(raw);
|
|
1052
|
+
if (Object.keys(servers).length === 0 && errors.length === 0) {
|
|
782
1053
|
throw new Error(
|
|
783
1054
|
`--mcp-config: no servers found in "${filePath}" ` +
|
|
784
1055
|
`(expected {"mcpServers": {"name": {"command": "..."}}}).`,
|
|
785
1056
|
);
|
|
786
1057
|
}
|
|
1058
|
+
if (errors.length > 0 && deps.mcpConfigWarnings !== false) {
|
|
1059
|
+
const count = errors.length;
|
|
1060
|
+
const noun = count === 1 ? "server" : "servers";
|
|
1061
|
+
deps.writeErr?.(
|
|
1062
|
+
`Warning: ${count} MCP ${noun} skipped due to invalid config:\n` +
|
|
1063
|
+
errors.map((error) => ` ${error.name}: ${error.message}\n`).join(""),
|
|
1064
|
+
);
|
|
1065
|
+
}
|
|
787
1066
|
authorizeStdioServers(
|
|
788
1067
|
servers,
|
|
789
1068
|
"explicit-config",
|
|
790
1069
|
() => path.resolve(filePath),
|
|
791
1070
|
{ failFast: true },
|
|
792
1071
|
);
|
|
793
|
-
return setupMcpFromConfig(servers,
|
|
1072
|
+
return setupMcpFromConfig(servers, {
|
|
1073
|
+
...deps,
|
|
1074
|
+
mcpServerErrors: errors,
|
|
1075
|
+
});
|
|
794
1076
|
}
|
|
795
1077
|
|
|
796
1078
|
/**
|
|
@@ -1315,6 +1597,15 @@ export async function resolveAgentMcp(args = {}, deps = {}) {
|
|
|
1315
1597
|
(runtimeEnv.CC_EVENT_RUNTIME_DURABLE === "1"
|
|
1316
1598
|
? new EventRuntimeStore()
|
|
1317
1599
|
: null);
|
|
1600
|
+
const mcpLifecycleAuthority =
|
|
1601
|
+
deps.mcpLifecycleAuthority ||
|
|
1602
|
+
args.mcpLifecycleAuthority ||
|
|
1603
|
+
new McpLifecycleAuthority({
|
|
1604
|
+
statePath:
|
|
1605
|
+
deps.mcpLifecycleStatePath ||
|
|
1606
|
+
args.mcpLifecycleStatePath ||
|
|
1607
|
+
defaultMcpLifecycleAuthorityPath(),
|
|
1608
|
+
});
|
|
1318
1609
|
const serverNameReservations =
|
|
1319
1610
|
deps.mcpServerNameReservations instanceof Set
|
|
1320
1611
|
? deps.mcpServerNameReservations
|
|
@@ -1339,6 +1630,7 @@ export async function resolveAgentMcp(args = {}, deps = {}) {
|
|
|
1339
1630
|
cwd: args.cwd || deps.cwd || process.cwd(),
|
|
1340
1631
|
...(args.sessionId != null ? { sessionId: args.sessionId } : {}),
|
|
1341
1632
|
...(eventRuntimeStore ? { eventRuntimeStore } : {}),
|
|
1633
|
+
mcpLifecycleAuthority,
|
|
1342
1634
|
mcpPolicy,
|
|
1343
1635
|
mcpServerNameReservations: serverNameReservations,
|
|
1344
1636
|
};
|
|
@@ -90,10 +90,20 @@ export function resolveAgentPolicy({
|
|
|
90
90
|
fallbackModels: overrides.fallbackModels,
|
|
91
91
|
pdh: overrides.pdh,
|
|
92
92
|
outputStyle: overrides.outputStyle,
|
|
93
|
+
settingsFile: overrides.settingsFile || null,
|
|
94
|
+
// Captured before settings-file env overrides. The REPL consumes this
|
|
95
|
+
// immutable launch snapshot for Claude-compatible project storage so a
|
|
96
|
+
// checked-in settings file cannot redirect transcripts or auto memory.
|
|
97
|
+
claudeStorageLaunchEnv:
|
|
98
|
+
overrides.claudeStorageLaunchEnv &&
|
|
99
|
+
typeof overrides.claudeStorageLaunchEnv === "object"
|
|
100
|
+
? Object.freeze({ ...overrides.claudeStorageLaunchEnv })
|
|
101
|
+
: null,
|
|
93
102
|
disableSlashCommands: overrides.disableSlashCommands === true,
|
|
94
103
|
// --remote-control also applies interactively: the REPL starts the
|
|
95
104
|
// paired-device approval bridge at startup (批26).
|
|
96
105
|
remoteControl: overrides.remoteControl === true,
|
|
106
|
+
remoteControlAllowLan: overrides.remoteControlAllowLan === true,
|
|
97
107
|
// --channels: inbound channel listeners (webhook/telegram) whose events
|
|
98
108
|
// become user turns in the interactive session (gap-2026-07-11 P0#5).
|
|
99
109
|
channels: overrides.channels || null,
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
VERSION,
|
|
11
11
|
} from "../constants.js";
|
|
12
12
|
import { isExecutableOnPath } from "../lib/executable-path.js";
|
|
13
|
+
import { resolveConfigDataRoot } from "../lib/paths.js";
|
|
13
14
|
|
|
14
15
|
function checkPort(port, host, timeoutMs, connect = createConnection) {
|
|
15
16
|
return new Promise((resolve) => {
|
|
@@ -82,7 +83,14 @@ export async function collectQuickStatusReport(options = {}) {
|
|
|
82
83
|
executableCheck: options.executableCheck || isExecutableOnPath,
|
|
83
84
|
connect: options.connect || createConnection,
|
|
84
85
|
};
|
|
85
|
-
const
|
|
86
|
+
const configuredRoot = resolveConfigDataRoot({ env, cwd });
|
|
87
|
+
// Retain the injected-home seam for default-root unit callers, while every
|
|
88
|
+
// explicit native/Claude root uses the same validated resolver as runtime
|
|
89
|
+
// persistence.
|
|
90
|
+
const home =
|
|
91
|
+
configuredRoot.source === "default" && options.home
|
|
92
|
+
? join(deps.home(), CONFIG_DIR_NAME)
|
|
93
|
+
: configuredRoot.path;
|
|
86
94
|
const config = readJson(join(home, "config.json"), deps) || {};
|
|
87
95
|
const llm = { ...DEFAULT_CONFIG.llm, ...(config.llm || {}) };
|
|
88
96
|
const setupCompleted = config.setupCompleted === true;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as v,P as u,J as y,U as s,R as a,S,K as C,Q as x,V as w,_ as B,b as n}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-BRGx3w6T.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=n(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=n(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=n(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=n(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=n(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:n};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},R={class:"bubble"},T={class:"meta"},D={class:"actor"},M={class:"time"},V={class:"body"};function q(c,d,t,r,i,l){const o=v("a-tag");return u(),y("div",{class:B(["chat-row",{mine:r.isMine}])},[s("div",R,[s("div",T,[s("span",D,a(r.actorLabel),1),s("span",M,a(r.formattedTime),1)]),s("div",V,a(r.messageText),1),t.event.source.adapter?(u(),S(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(N,[["render",q],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-Rpy4Dn/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-BRGx3w6T.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-Rpy4Dn/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as u,J as j,U as b,R as c,c as a,K as i,a as R,r as k,o as F,b as E,P as O,Q as p,S as z,V as C}from"./vendor-Bn1JzzAn.js";import{t as M,_ as Q,b as K,u as T,d as S}from"./index-BRGx3w6T.js";import{i as q,R as X}from"./icons-DG5UD-6K.js";const v=Object.freeze({defaultEngine:"webspeech",webSpeech:{lang:"zh-CN"},whisperAPI:{apiKey:"",baseURL:"https://api.openai.com/v1",model:"whisper-1",language:"zh",timeout:6e4},whisperLocal:{serverUrl:"http://localhost:8002",modelSize:"base",device:"auto",timeout:12e4}}),Y=["webspeech","whisper-api","whisper-local"];function D(g,t){if(typeof g=="number"&&Number.isFinite(g))return g;const s=parseFloat(g);return Number.isFinite(s)?s:t}function Z(g){return JSON.parse(JSON.stringify(g))}function B(g){const t=Z(v);if(!g)return t;const s=g.trim();if(!s||/key not found/i.test(s))return t;const e=M(s);if(!e||typeof e!="object"||Array.isArray(e))return t;if(typeof e.defaultEngine=="string"&&Y.includes(e.defaultEngine)&&(t.defaultEngine=e.defaultEngine),e.webSpeech&&typeof e.webSpeech=="object"&&typeof e.webSpeech.lang=="string"&&e.webSpeech.lang&&(t.webSpeech.lang=e.webSpeech.lang),e.whisperAPI&&typeof e.whisperAPI=="object"){const l=e.whisperAPI;typeof l.apiKey=="string"&&(t.whisperAPI.apiKey=l.apiKey),typeof l.baseURL=="string"&&l.baseURL&&(t.whisperAPI.baseURL=l.baseURL),typeof l.model=="string"&&l.model&&(t.whisperAPI.model=l.model),typeof l.language=="string"&&l.language&&(t.whisperAPI.language=l.language),l.timeout!==void 0&&(t.whisperAPI.timeout=D(l.timeout,v.whisperAPI.timeout))}if(e.whisperLocal&&typeof e.whisperLocal=="object"){const l=e.whisperLocal;typeof l.serverUrl=="string"&&l.serverUrl&&(t.whisperLocal.serverUrl=l.serverUrl),typeof l.modelSize=="string"&&l.modelSize&&(t.whisperLocal.modelSize=l.modelSize),typeof l.device=="string"&&l.device&&(t.whisperLocal.device=l.device),l.timeout!==void 0&&(t.whisperLocal.timeout=D(l.timeout,v.whisperLocal.timeout))}return t}function J(g,t){const s={};g.defaultEngine!==t.defaultEngine&&(s.defaultEngine=t.defaultEngine);for(const e of["webSpeech","whisperAPI","whisperLocal"]){const l=g[e]||{},w=t[e]||{};for(const o of Object.keys(v[e]))l[o]!==w[o]&&(s[`${e}.${o}`]=w[o])}return s}const $={__name:"SpeechSettings",setup(g,{expose:t}){t();const{t:s}=K(),e=T(),l=k(!1),w=k(!1),o=R(JSON.parse(JSON.stringify(v))),h=k(JSON.parse(JSON.stringify(v))),y=E(()=>[{value:"webspeech",label:s("speechSettings.engineOptions.webspeech")},{value:"whisper-api",label:s("speechSettings.engineOptions.whisper-api")},{value:"whisper-local",label:s("speechSettings.engineOptions.whisper-local")}]),f=E(()=>{const d=`speechSettings.engineHint.${o.defaultEngine}`,n=s(d);return n===d?"":n}),_=E(()=>Object.keys(J(h.value,o)).length>0);function m(d){o.defaultEngine=d.defaultEngine,Object.assign(o.webSpeech,d.webSpeech),Object.assign(o.whisperAPI,d.whisperAPI),Object.assign(o.whisperLocal,d.whisperLocal),h.value=JSON.parse(JSON.stringify(d))}async function r(){l.value=!0;try{const{output:d}=await e.execute("config get speech",1e4);m(B(d))}catch(d){/key not found/i.test(d.message)?m(JSON.parse(JSON.stringify(v))):S.error(s("speechSettings.messages.loadFailed",{err:d.message}))}finally{l.value=!1}}function N(){m(h.value)}async function L(){const d=J(h.value,o),n=Object.keys(d);if(n.length===0){S.info(s("speechSettings.messages.noChanges"));return}w.value=!0;let P=0,I=0;for(const A of n){const H=d[A],V=String(H).replace(/"/g,'\\"'),W=`config set speech.${A} "${V}"`;try{const{output:U,exitCode:G}=await e.execute(W,1e4);G!==0||/error|failed|失败/i.test(U)?(I++,S.error(s("speechSettings.messages.saveItemFailed",{key:A,err:U.slice(0,80)}))):P++}catch(U){I++,S.error(s("speechSettings.messages.saveItemFailed",{key:A,err:U.message}))}}w.value=!1,I===0?(S.success(s("speechSettings.messages.saveOk",{count:P})),h.value=JSON.parse(JSON.stringify(o))):P>0&&(S.warning(s("speechSettings.messages.savePartial",{ok:P,fail:I})),await r())}F(()=>{r()});const x={t:s,ws:e,loading:l,saving:w,form:o,baseline:h,engineOptions:y,engineHint:f,isDirty:_,applyConfig:m,loadConfig:r,resetForm:N,saveConfig:L,reactive:R,ref:k,computed:E,onMounted:F,get useI18n(){return K},get ReloadOutlined(){return X},get SoundOutlined(){return q},get message(){return S},get useWsStore(){return T},get parseSpeechConfig(){return B},get diffSpeechConfig(){return J},get SPEECH_DEFAULTS(){return v}};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},ee={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},te={class:"page-title"},ae={class:"page-sub"},ie={style:{color:"var(--text-primary)"}},le={style:{color:"var(--text-muted)","font-size":"11px"}},ne={style:{color:"var(--text-primary)"}},se={style:{color:"var(--text-primary)"}},oe={style:{color:"var(--text-primary)"}},re={style:{display:"flex",gap:"12px","align-items":"center"}},de={key:0,style:{color:"#faad14","font-size":"12px"}};function pe(g,t,s,e,l,w){const o=u("a-button"),h=u("a-alert"),y=u("a-select"),f=u("a-form-item"),_=u("a-form"),m=u("a-card"),r=u("a-select-option"),N=u("a-input-password"),L=u("a-input"),x=u("a-input-number"),d=u("a-spin");return O(),j("div",null,[b("div",ee,[b("div",null,[b("h2",te,c(e.t("speechSettings.title")),1),b("p",ae,c(e.t("speechSettings.subtitle")),1)]),a(o,{loading:e.loading,onClick:e.loadConfig},{icon:i(()=>[a(e.ReloadOutlined)]),default:i(()=>[p(" "+c(e.t("speechSettings.refresh")),1)]),_:1},8,["loading"])]),a(h,{message:e.t("speechSettings.alert.message"),description:e.t("speechSettings.alert.description"),type:"info","show-icon":"",closable:"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),a(d,{spinning:e.loading},{default:i(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:i(()=>[b("span",ie,[a(e.SoundOutlined,{style:{"margin-right":"8px"}}),p(c(e.t("speechSettings.engineCardTitle")),1)])]),default:i(()=>[a(_,{"label-col":{span:6},"wrapper-col":{span:18},style:{"max-width":"720px"}},{default:i(()=>[a(f,{label:e.t("speechSettings.engineLabel")},{extra:i(()=>[b("span",le,c(e.engineHint),1)]),default:i(()=>[a(y,{value:e.form.defaultEngine,"onUpdate:value":t[0]||(t[0]=n=>e.form.defaultEngine=n),style:{width:"320px"},disabled:e.saving,options:e.engineOptions},null,8,["value","disabled","options"])]),_:1},8,["label"])]),_:1})]),_:1}),e.form.defaultEngine==="webspeech"?(O(),z(m,{key:0,style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:i(()=>[b("span",ne,c(e.t("speechSettings.webSpeech.cardTitle")),1)]),default:i(()=>[a(_,{"label-col":{span:6},"wrapper-col":{span:18},style:{"max-width":"720px"}},{default:i(()=>[a(f,{label:e.t("speechSettings.webSpeech.langLabel")},{default:i(()=>[a(y,{value:e.form.webSpeech.lang,"onUpdate:value":t[1]||(t[1]=n=>e.form.webSpeech.lang=n),style:{width:"240px"},disabled:e.saving},{default:i(()=>[a(r,{value:"zh-CN"},{default:i(()=>[p(c(e.t("speechSettings.webSpeech.langOptions.zh-CN")),1)]),_:1}),a(r,{value:"zh-TW"},{default:i(()=>[p(c(e.t("speechSettings.webSpeech.langOptions.zh-TW")),1)]),_:1}),a(r,{value:"en-US"},{default:i(()=>[p(c(e.t("speechSettings.webSpeech.langOptions.en-US")),1)]),_:1}),a(r,{value:"en-GB"},{default:i(()=>[p(c(e.t("speechSettings.webSpeech.langOptions.en-GB")),1)]),_:1}),a(r,{value:"ja-JP"},{default:i(()=>[p(c(e.t("speechSettings.webSpeech.langOptions.ja-JP")),1)]),_:1}),a(r,{value:"ko-KR"},{default:i(()=>[p(c(e.t("speechSettings.webSpeech.langOptions.ko-KR")),1)]),_:1})]),_:1},8,["value","disabled"])]),_:1},8,["label"])]),_:1})]),_:1})):C("v-if",!0),e.form.defaultEngine==="whisper-api"?(O(),z(m,{key:1,style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:i(()=>[b("span",se,c(e.t("speechSettings.whisperAPI.cardTitle")),1)]),default:i(()=>[a(_,{"label-col":{span:6},"wrapper-col":{span:18},style:{"max-width":"720px"}},{default:i(()=>[a(f,{label:e.t("speechSettings.whisperAPI.apiKeyLabel")},{default:i(()=>[a(N,{value:e.form.whisperAPI.apiKey,"onUpdate:value":t[2]||(t[2]=n=>e.form.whisperAPI.apiKey=n),placeholder:"sk-...",disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperAPI.baseUrlLabel")},{default:i(()=>[a(L,{value:e.form.whisperAPI.baseURL,"onUpdate:value":t[3]||(t[3]=n=>e.form.whisperAPI.baseURL=n),disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperAPI.modelLabel")},{default:i(()=>[a(L,{value:e.form.whisperAPI.model,"onUpdate:value":t[4]||(t[4]=n=>e.form.whisperAPI.model=n),disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperAPI.languageLabel")},{default:i(()=>[a(L,{value:e.form.whisperAPI.language,"onUpdate:value":t[5]||(t[5]=n=>e.form.whisperAPI.language=n),disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperAPI.timeoutLabel")},{default:i(()=>[a(x,{value:e.form.whisperAPI.timeout,"onUpdate:value":t[6]||(t[6]=n=>e.form.whisperAPI.timeout=n),min:1e3,max:6e5,step:1e3,style:{width:"200px"},disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"])]),_:1})]),_:1})):C("v-if",!0),e.form.defaultEngine==="whisper-local"?(O(),z(m,{key:2,style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:i(()=>[b("span",oe,c(e.t("speechSettings.whisperLocal.cardTitle")),1)]),default:i(()=>[a(_,{"label-col":{span:6},"wrapper-col":{span:18},style:{"max-width":"720px"}},{default:i(()=>[a(f,{label:e.t("speechSettings.whisperLocal.serverUrlLabel")},{default:i(()=>[a(L,{value:e.form.whisperLocal.serverUrl,"onUpdate:value":t[7]||(t[7]=n=>e.form.whisperLocal.serverUrl=n),placeholder:"http://localhost:8002",disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperLocal.modelSizeLabel")},{default:i(()=>[a(y,{value:e.form.whisperLocal.modelSize,"onUpdate:value":t[8]||(t[8]=n=>e.form.whisperLocal.modelSize=n),style:{width:"180px"},disabled:e.saving},{default:i(()=>[a(r,{value:"tiny"},{default:i(()=>[...t[11]||(t[11]=[p("tiny",-1)])]),_:1}),a(r,{value:"base"},{default:i(()=>[...t[12]||(t[12]=[p("base",-1)])]),_:1}),a(r,{value:"small"},{default:i(()=>[...t[13]||(t[13]=[p("small",-1)])]),_:1}),a(r,{value:"medium"},{default:i(()=>[...t[14]||(t[14]=[p("medium",-1)])]),_:1}),a(r,{value:"large"},{default:i(()=>[...t[15]||(t[15]=[p("large",-1)])]),_:1})]),_:1},8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperLocal.deviceLabel")},{default:i(()=>[a(y,{value:e.form.whisperLocal.device,"onUpdate:value":t[9]||(t[9]=n=>e.form.whisperLocal.device=n),style:{width:"180px"},disabled:e.saving},{default:i(()=>[a(r,{value:"auto"},{default:i(()=>[...t[16]||(t[16]=[p("auto",-1)])]),_:1}),a(r,{value:"cpu"},{default:i(()=>[...t[17]||(t[17]=[p("cpu",-1)])]),_:1}),a(r,{value:"cuda"},{default:i(()=>[...t[18]||(t[18]=[p("cuda",-1)])]),_:1})]),_:1},8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperLocal.timeoutLabel")},{default:i(()=>[a(x,{value:e.form.whisperLocal.timeout,"onUpdate:value":t[10]||(t[10]=n=>e.form.whisperLocal.timeout=n),min:1e3,max:6e5,step:1e3,style:{width:"200px"},disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"])]),_:1})]),_:1})):C("v-if",!0),b("div",re,[a(o,{onClick:e.resetForm,disabled:e.saving||e.loading},{default:i(()=>[p(c(e.t("speechSettings.buttons.reset")),1)]),_:1},8,["disabled"]),a(o,{type:"primary",loading:e.saving,disabled:!e.isDirty,onClick:e.saveConfig},{default:i(()=>[p(c(e.t("speechSettings.buttons.save")),1)]),_:1},8,["loading","disabled"]),e.isDirty?(O(),j("span",de,c(e.t("speechSettings.dirtyHint")),1)):C("v-if",!0)])]),_:1},8,["spinning"])])}const ue=Q($,[["render",pe],["__scopeId","data-v-2b18ccaa"],["__file","/tmp/cc-web-panel-Rpy4Dn/repo/packages/web-panel/src/views/SpeechSettings.vue"]]);export{ue as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-BRGx3w6T.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-hPGk1eGj.js";import{a0 as t}from"./index-BRGx3w6T.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-CV6a_w_Y.js";import"./useFlexGapSupport-BH7zTw8S.js";import"./styleChecker-PJpzavV8.js";import"./index-DqkbHHg8.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-DLaprKhS.js";import{a0 as t}from"./index-BRGx3w6T.js";import"./vendor-Bn1JzzAn.js";import"./index-DqkbHHg8.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|