chainlesschain 0.162.148 → 0.162.149
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-DwpCCp64.js → AIOps-BJif14yR.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-C9pBYocA.js → ActionButton-CXek6gJY.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BWAkeXxK.js → Analytics-BgQhdAJi.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-CivFGH6B.js → AppLayout-DTYl5NtR.js} +3 -3
- package/src/assets/web-panel/assets/{Audit-Cm8hRpZm.js → Audit-BzATQAeR.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DXdFMsE8.js → Backup-BzdPEQhL.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-uAwSTeql.js → BaseInput-BM0KVh8E.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-KU8eeJJE.js → Chat-D7fHXHkz.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Wm34RR-b.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-C6AMDkjd.js → Checkbox-CAiSQ9vO.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-t2moDxcO.js → Codegen-Df40CrEe.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DCcsRRhN.js → Col-DIT2fNFU.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DtB-8SAC.js → Community-CSTIbW2k.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CZm8THYA.js → Compact-DtqXZZUi.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-LiQgC7g1.js → Compliance-CUtzw6o7.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CA8SAxht.js → Cowork-CezmlnmU.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CtRaF1wD.js → Cron-P4BITarg.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-6-br6Hub.js → Crosschain-BRRiYwvq.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Do2EccrL.js → DID-L5ijB9i4.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-wrXcbzGe.js → Dashboard-CFxro4ob.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-p3FsT245.js → Dropdown-BmAFCQ71.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-D95A2L8q.js → EmailListRenderer-DJBCEuon.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-cLuJW2zo.js → FamilyGuardDashboard-z4oLq6eT.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Brgq_cbN.js → Federation-DsVCpHMF.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DWLCkNgh.js → FormItemContext-DP3bP5th.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BBqUfQd6.js → GenericCardRenderer-BAXP2Gc6.js} +1 -1
- package/src/assets/web-panel/assets/{Git-8F090w4I.js → Git-I3g_bAw9.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CCogEbxb.js → Governance-jHS5-ioS.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CfLD7v7C.js → Inference-CPL7sfx9.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DDuHJewd.js → KnowledgeGraph-Jf236h4C.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CE8KSEVC.js → Logs-Cm2tcSKg.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-DmwpZmhT.js → Marketplace-CZK82rhi.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Bf7AazU8.js → McpTools-CZCeji7a.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-D0QU_00S.js → Memory-3l2KVS9k.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-yXS9xdhx.js → MobileBridge-VYdpoLh6.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BuDUoGUP.js → MobileProjects-CiB9cmm1.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BYyHy28p.js → Mtc-wCFZbBuL.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-CK0aqpiZ.js → MtcAudit-1a3THIyG.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-mNimKYeb.js → Multisig-DMzLB2hG.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-AioAJ0YA.js → NLProgramming-D9wZbf6l.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CVVNCLHE.js → Notes-hrFe2ZM-.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-C4ABj-TK.js → NotificationSettings-CHGX5Jwm.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CRIFE2Tj.js +1 -0
- package/src/assets/web-panel/assets/{Organization-uozl_gWK.js → Organization-By7FkhtY.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BCZOM2hK.js → Overflow--khGSzJn.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CArcaiaj.js → P2P-CAG9dH35.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Sgq2Srr8.js → PdhVaultBrowser-B3SQZmK9.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BYrQrXnH.js → Permissions-D35ec6JA.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BzHStAbz.js → PersonalDataHub-CxBF7hW_.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-k7KqxX1M.js → Pipeline-s6EtOO1s.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-IumTUWqx.js → Privacy-BbJYmWmO.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BRyImYTf.js → ProjectInit-VGQq1jMT.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BFIqTBFk.js → ProjectSettings-B1ew3Teh.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CGcNIs_g.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CyyFnUPs.js → Providers-mrO47FIK.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C82cRx-X.js → QrScannerModal-IJF2mHyw.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DGxDF521.js → QuickAsk-CU0wN_Z0.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Cns-Am1y.js → Recommend-DhN37R6G.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-R7OqAIlg.js → RemoteSession-D_xOX_hu.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-D7mgPIYV.js → Reputation-D_Ssv7uH.js} +1 -1
- package/src/assets/web-panel/assets/{Row-B3lEURyd.js → Row-Kx5dKxX7.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-9_UVrpBt.js → RssFeed-BlGwqZkY.js} +2 -2
- package/src/assets/web-panel/assets/{Search-ClZeO80q.js → Search-hLFQzxpb.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BNNJczEp.js → Security-DMlvsVt4.js} +3 -3
- package/src/assets/web-panel/assets/{Services-C5SjrWUj.js → Services-Bd0Qsj2m.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Ci_obQ-g.js → Skeleton-DFclq9X3.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DdebN15P.js → Skills-BNtln2qY.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-OinZP2vi.js → Sla-Dch5H19G.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CxzbNF51.js → SpeechSettings-2UfQcU1g.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-D06N_66b.js → SyncSettings-CD9YQr4i.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BdEdW0AZ.js → Tasks-BNu-7MzI.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-F1ctKmPa.js → Templates-D1n9CaIR.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CVz1Urot.js → Tenant-DenL3iBW.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-ZzU0Io1Y.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-Doitzjmf.js → TimelineRenderer-D87IfukO.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BpyVRpVA.js → Tokens-BkiZc8E3.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-nWhWYTbU.js → Trigger-BNRSytGN.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DK_G-wLx.js → Trust-Bwbd4X2m.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B5yBUojO.js → UkeySign-B8O2bs0o.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C5D51qAe.js → VideoEditing-C2fL8zmH.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CLbL9K7v.js → Wallet-BORYDdE1.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DZUelI3V.js → WebAuthn-C0V5S2FM.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-8RPxt4KW.js → WorkflowEditor-2dR0fcHL.js} +1 -1
- package/src/assets/web-panel/assets/{chat-4N4tOA3d.js → chat-BmuAFAn8.js} +1 -1
- package/src/assets/web-panel/assets/{colors-zbbGVrua.js → colors-CN3smMcK.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-D7iMkbnE.js → compact-item-DCnxb4kW.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CBzPJv-w.js → createContext-vlR43pHn.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DxwmsL4j.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-bHdrQSqZ.js → hasIn-D04tHYFd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbE5D0WL.js → index-0DnaZGkC.js} +1 -1
- package/src/assets/web-panel/assets/{index-308gCGh7.js → index-430S68MN.js} +1 -1
- package/src/assets/web-panel/assets/{index-kmh1TxRa.js → index-B78xL3s2.js} +1 -1
- package/src/assets/web-panel/assets/{index-QFObYeo1.js → index-BTPEZTk1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZb8F8YG.js → index-BXRg8GFQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE9j5YgT.js → index-BasvsWDM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiG1IZao.js → index-BeGDEXFs.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bqmx24kh.js → index-BqhASEL4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCr0geV9.js → index-BudvKQfG.js} +1 -1
- package/src/assets/web-panel/assets/{index-S74FpAIn.js → index-C-6NO5il.js} +1 -1
- package/src/assets/web-panel/assets/{index-DyoNgbXl.js → index-C5Sxb1sE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtbbdLnf.js → index-CP9m9Ggr.js} +3 -3
- package/src/assets/web-panel/assets/{index-CkxK86vf.js → index-CTOCnIQ7.js} +1 -1
- package/src/assets/web-panel/assets/index-Cg2ldRfU.js +1 -0
- package/src/assets/web-panel/assets/{index-BTIjjXry.js → index-ClhAHDK3.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7b1hGry.js → index-CnXebZLL.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPxkoKgA.js → index-CngCC8hC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ci009ijp.js → index-Cr-A0FYJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdmMoYN1.js → index-CsAsCPJ6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBNr77E1.js → index-D28DeAAB.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1s0Bz9O.js → index-D5LZVZ0L.js} +1 -1
- package/src/assets/web-panel/assets/{index-oDKNgCsP.js → index-D65_XseV.js} +1 -1
- package/src/assets/web-panel/assets/{index-QNAG4JtR.js → index-D8vwp4qp.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQfu1U78.js → index-DDwLgQY9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnBOpqv3.js → index-DIpY0qM5.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQ6NcfWz.js → index-DTWg-18U.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4XKpj6c.js → index-DTtRscUa.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1YDh7Wr.js → index-DYAtmqiv.js} +1 -1
- package/src/assets/web-panel/assets/{index-CvRMA9uT.js → index-D_n8_vfI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CahryTX0.js → index-DbADHwhr.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJ4ZGyW0.js → index-DbVsQBOH.js} +1 -1
- package/src/assets/web-panel/assets/index-Dwzo-dtJ.js +1 -0
- package/src/assets/web-panel/assets/{index-xYCm6W2h.js → index-HhNjnCfe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BS4_Mwk6.js → index-ToUh2b1-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DISWAYce.js → index-TslMTwNy.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmqlJed-.js → index-_FIkN3jd.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqdPyWm5.js → index-hpvvtAZ3.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsKehmmS.js → index-jzR7Ujuw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUyjUkY7.js → index-ljuBiQW9.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BD55yNBt.js → initDefaultProps-C3wUb4je.js} +1 -1
- package/src/assets/web-panel/assets/{motion-B5Bbe77U.js → motion-D-jYFUNA.js} +1 -1
- package/src/assets/web-panel/assets/{move-CTvIqHEH.js → move-tqb8nwJ2.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BkNyPQKB.js → mtc-parser-DSOjMJMz.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BaXJXgHA.js → omit-CJ7VimIW.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Bw6-YTxH.js → pickAttrs-qXiG1iT3.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BLdbkLqJ.js → placementArrow-CkGBcy1Z.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-IVYkzntU.js → responsiveObserve-D3WvTlLO.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DFMFwwtY.js → slide-BEE2ftge.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CURYRtZ1.js → statusUtils-CsfBpxiG.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Cfz63s1r.js → styleChecker-xPrIiJPI.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-COJL0KE3.js → useFlexGapSupport-C5Yd-SCR.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-YLLojQQf.js → useFs-D_MDS8HI.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BF_21qUC.js → usePersonalDataHub-BqJh-usA.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-9ZpkA7bb.js → vnode-chm_p-gz.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DhtAfhl8.js → zoom-3-YDNz0Z.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/assets/web-panel/remote-session-sw.js +43 -0
- package/src/command-manifest.json +22 -1
- package/src/commands/agent.js +44 -5
- package/src/commands/codeintel.js +252 -0
- package/src/commands/eval.js +248 -0
- package/src/commands/plugin.js +354 -0
- package/src/commands/team.js +456 -0
- package/src/gateways/ws/message-dispatcher.js +45 -2
- package/src/gateways/ws/remote-session-protocol.js +37 -0
- package/src/gateways/ws/ws-server.js +1 -1
- package/src/harness/prompt-compressor.js +27 -1
- package/src/harness/remote-command-ledger.js +158 -0
- package/src/harness/remote-session-push-apns.js +246 -0
- package/src/harness/remote-session-push-errors.js +15 -0
- package/src/harness/remote-session-push-fcm.js +9 -25
- package/src/harness/remote-session-push-huawei.js +174 -0
- package/src/harness/remote-session-push-oppo.js +171 -0
- package/src/harness/remote-session-push-senders.js +42 -0
- package/src/harness/remote-session-push-vivo.js +179 -0
- package/src/harness/remote-session-push-web.js +299 -0
- package/src/harness/remote-session-push-xiaomi.js +99 -0
- package/src/index.js +6 -0
- package/src/lib/agent-core.js +2 -0
- package/src/lib/agent-sandbox.js +161 -5
- package/src/lib/agent-team/task-lease.js +434 -0
- package/src/lib/agent-team/team-budget.js +165 -0
- package/src/lib/agent-team/team-mailbox.js +106 -0
- package/src/lib/agent-team/team-runner.js +266 -0
- package/src/lib/agent-team/team-worktree.js +204 -0
- package/src/lib/agents.js +18 -0
- package/src/lib/async-hook-supervisor.cjs +305 -0
- package/src/lib/eval/runner.js +163 -0
- package/src/lib/eval/tasks.js +456 -0
- package/src/lib/eval/trend.js +185 -0
- package/src/lib/lsp/__tests__/code-intelligence.integration.test.js +129 -0
- package/src/lib/lsp/__tests__/code-intelligence.test.js +228 -0
- package/src/lib/lsp/__tests__/jsonrpc-stream.test.js +104 -0
- package/src/lib/lsp/__tests__/lsp-client.test.js +258 -0
- package/src/lib/lsp/__tests__/lsp-manager.test.js +264 -0
- package/src/lib/lsp/__tests__/lsp-server-registry.test.js +128 -0
- package/src/lib/lsp/code-intelligence.js +356 -0
- package/src/lib/lsp/jsonrpc-stream.js +139 -0
- package/src/lib/lsp/lsp-client.js +318 -0
- package/src/lib/lsp/lsp-manager.js +323 -0
- package/src/lib/lsp/lsp-server-registry.js +196 -0
- package/src/lib/plugin-monitor-supervisor.js +238 -0
- package/src/lib/plugin-runtime/agents.js +51 -0
- package/src/lib/plugin-runtime/bin.js +100 -0
- package/src/lib/plugin-runtime/hooks.js +100 -0
- package/src/lib/plugin-runtime/install.js +388 -0
- package/src/lib/plugin-runtime/lsp.js +75 -0
- package/src/lib/plugin-runtime/manifest.js +458 -0
- package/src/lib/plugin-runtime/mcp.js +89 -0
- package/src/lib/plugin-runtime/monitors.js +100 -0
- package/src/lib/plugin-runtime/policy.js +144 -0
- package/src/lib/plugin-runtime/reload.js +79 -0
- package/src/lib/plugin-runtime/scopes.js +197 -0
- package/src/lib/plugin-runtime/settings.js +119 -0
- package/src/lib/plugin-runtime/signature.js +107 -0
- package/src/lib/plugin-runtime/skills.js +43 -0
- package/src/lib/plugin-runtime/trust.js +140 -0
- package/src/lib/sandbox-egress-proxy.js +162 -0
- package/src/lib/sandbox-network-policy.js +134 -0
- package/src/lib/sandbox-v2.js +10 -4
- package/src/lib/settings-hook-events.cjs +78 -6
- package/src/lib/settings-hooks.cjs +29 -3
- package/src/lib/settings-loader.cjs +35 -1
- package/src/lib/skill-loader.js +18 -0
- package/src/lib/telemetry/span-recorder.js +237 -0
- package/src/repl/agent-repl.js +400 -4
- package/src/runtime/agent-core.js +546 -52
- package/src/runtime/coding-agent-contract-shared.cjs +82 -8
- package/src/runtime/coding-agent-policy.cjs +32 -7
- package/src/runtime/fallback-model.js +134 -7
- package/src/runtime/headless-runner.js +353 -108
- package/src/runtime/mcp-config.js +46 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DCNfbdlx.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-DIp8Xcbd.js +0 -1
- package/src/assets/web-panel/assets/Projects-Dpid9CDg.js +0 -1
- package/src/assets/web-panel/assets/Terminal-BvAK_Zel.js +0 -3
- package/src/assets/web-panel/assets/devWarning-C2Z5LRgq.js +0 -1
- package/src/assets/web-panel/assets/index-BGp6Yr-Y.js +0 -1
- package/src/assets/web-panel/assets/index-BXiw9dQf.js +0 -1
|
@@ -300,6 +300,7 @@ function loadSettingsConfig(opts = {}) {
|
|
|
300
300
|
const cwd = opts.cwd || process.cwd();
|
|
301
301
|
let model = null;
|
|
302
302
|
const env = {};
|
|
303
|
+
let sandbox = null;
|
|
303
304
|
const files = [];
|
|
304
305
|
for (const file of settingsPaths(cwd, opts.settingsFile)) {
|
|
305
306
|
const data = readSettingsFile(file, { onWarn: opts.onWarn });
|
|
@@ -317,6 +318,14 @@ function loadSettingsConfig(opts = {}) {
|
|
|
317
318
|
}
|
|
318
319
|
}
|
|
319
320
|
}
|
|
321
|
+
if (
|
|
322
|
+
data.sandbox &&
|
|
323
|
+
typeof data.sandbox === "object" &&
|
|
324
|
+
!Array.isArray(data.sandbox)
|
|
325
|
+
) {
|
|
326
|
+
sandbox = mergeSandboxSettings(sandbox, data.sandbox);
|
|
327
|
+
contributed = true;
|
|
328
|
+
}
|
|
320
329
|
if (contributed) files.push(file);
|
|
321
330
|
}
|
|
322
331
|
const managed = loadManagedSettings(opts);
|
|
@@ -335,9 +344,33 @@ function loadSettingsConfig(opts = {}) {
|
|
|
335
344
|
}
|
|
336
345
|
}
|
|
337
346
|
}
|
|
347
|
+
if (
|
|
348
|
+
data.sandbox &&
|
|
349
|
+
typeof data.sandbox === "object" &&
|
|
350
|
+
!Array.isArray(data.sandbox)
|
|
351
|
+
) {
|
|
352
|
+
sandbox = mergeSandboxSettings(sandbox, data.sandbox);
|
|
353
|
+
contributed = true;
|
|
354
|
+
}
|
|
338
355
|
if (contributed) files.push(managed.file);
|
|
339
356
|
}
|
|
340
|
-
return { model, env, files };
|
|
357
|
+
return { model, env, sandbox, files };
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
function mergeSandboxSettings(base, overlay) {
|
|
361
|
+
const out =
|
|
362
|
+
base && typeof base === "object" ? JSON.parse(JSON.stringify(base)) : {};
|
|
363
|
+
for (const [key, value] of Object.entries(overlay || {})) {
|
|
364
|
+
if (Array.isArray(value)) {
|
|
365
|
+
const previous = Array.isArray(out[key]) ? out[key] : [];
|
|
366
|
+
out[key] = [...new Set([...previous, ...value].map(String))];
|
|
367
|
+
} else if (value && typeof value === "object") {
|
|
368
|
+
out[key] = mergeSandboxSettings(out[key], value);
|
|
369
|
+
} else if (["string", "boolean", "number"].includes(typeof value)) {
|
|
370
|
+
out[key] = value;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return out;
|
|
341
374
|
}
|
|
342
375
|
|
|
343
376
|
/**
|
|
@@ -393,6 +426,7 @@ module.exports = {
|
|
|
393
426
|
applyManagedPermissionPolicy,
|
|
394
427
|
assertManagedPermissionMode,
|
|
395
428
|
parseEnvList,
|
|
429
|
+
mergeSandboxSettings,
|
|
396
430
|
ruleSource,
|
|
397
431
|
addRule,
|
|
398
432
|
scopeFile,
|
package/src/lib/skill-loader.js
CHANGED
|
@@ -28,6 +28,7 @@ import { getElectronUserDataDir } from "./paths.js";
|
|
|
28
28
|
import { findProjectRoot } from "./project-detector.js";
|
|
29
29
|
import { findProjectRoot as findGitRoot } from "./project-instructions.js";
|
|
30
30
|
import { parseSkillMcpServers } from "./skill-mcp.js";
|
|
31
|
+
import { discoverPluginSkillLayers } from "./plugin-runtime/skills.js";
|
|
31
32
|
import settingsLoader from "./settings-loader.cjs";
|
|
32
33
|
|
|
33
34
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
@@ -72,6 +73,7 @@ export const LAYER_NAMES = [
|
|
|
72
73
|
"bundled",
|
|
73
74
|
"cli-bundled",
|
|
74
75
|
"marketplace",
|
|
76
|
+
"plugin",
|
|
75
77
|
"managed",
|
|
76
78
|
"claude-user",
|
|
77
79
|
"claude-project",
|
|
@@ -312,6 +314,22 @@ export class CLISkillLoader {
|
|
|
312
314
|
exists: fs.existsSync(marketplacePath),
|
|
313
315
|
});
|
|
314
316
|
|
|
317
|
+
// Layer 1b: plugin — each installed plugin's skills/ dir (Phase 3). Sits
|
|
318
|
+
// just above marketplace so a user's managed/workspace/project skills still
|
|
319
|
+
// override a plugin's on a name collision. One entry per plugin.
|
|
320
|
+
try {
|
|
321
|
+
for (const p of discoverPluginSkillLayers({ cwd: process.cwd() })) {
|
|
322
|
+
layers.push({
|
|
323
|
+
layer: "plugin",
|
|
324
|
+
path: p.path,
|
|
325
|
+
exists: fs.existsSync(p.path),
|
|
326
|
+
plugin: p.name,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
} catch {
|
|
330
|
+
/* plugin skill discovery is best-effort — never break skill loading */
|
|
331
|
+
}
|
|
332
|
+
|
|
315
333
|
// Layer 2: managed — <userData>/skills/
|
|
316
334
|
const managedPath = path.join(userData, "skills");
|
|
317
335
|
layers.push({
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TelemetryRecorder (Phase 7) — a dependency-free, OpenTelemetry-SHAPED span +
|
|
3
|
+
* metrics recorder for the agent's real execution (model calls, tool calls,
|
|
4
|
+
* cache, retries, failures). The plan asks to "引入 OpenTelemetry,覆盖模型、
|
|
5
|
+
* 工具、缓存、重试和失败分类" — but pulling the `@opentelemetry/*` SDK in (a
|
|
6
|
+
* heavy dep tree that also needs a running collector) is the wrong default for a
|
|
7
|
+
* ~2 MB CLI. This records the SAME span/attribute model and can emit OTLP JSON
|
|
8
|
+
* (`toOtlp()`) so a real collector can ingest it later, without the dependency.
|
|
9
|
+
*
|
|
10
|
+
* It captures the plan's metric set — per-name durations (avg/p50/p95/max),
|
|
11
|
+
* counters (token / cost / cache-hit / retry), and failure classification — and
|
|
12
|
+
* `summary()` renders them. The clock is injected so tests are deterministic.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
let _seq = 0;
|
|
16
|
+
function spanId() {
|
|
17
|
+
_seq = (_seq + 1) % Number.MAX_SAFE_INTEGER;
|
|
18
|
+
// 16-hex-ish id derived from a monotonic counter (deterministic, no RNG —
|
|
19
|
+
// Math.random is intentionally avoided so callers can snapshot/replay).
|
|
20
|
+
return _seq.toString(16).padStart(16, "0");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class TelemetryRecorder {
|
|
24
|
+
constructor({
|
|
25
|
+
now = () => Date.now(),
|
|
26
|
+
serviceName = "chainlesschain-cli",
|
|
27
|
+
} = {}) {
|
|
28
|
+
this._now = typeof now === "function" ? now : () => now;
|
|
29
|
+
this.serviceName = serviceName;
|
|
30
|
+
this._spans = []; // completed spans
|
|
31
|
+
this._counters = new Map(); // name → { total, byAttr }
|
|
32
|
+
this._failures = new Map(); // category → count
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Start a span. Returns a handle; call `.end()` (optionally with a status /
|
|
37
|
+
* extra attributes) to record it. Nesting is expressed via `parentId`.
|
|
38
|
+
*/
|
|
39
|
+
startSpan(name, attributes = {}, { parentId = null } = {}) {
|
|
40
|
+
const id = spanId();
|
|
41
|
+
const start = this._now();
|
|
42
|
+
const attrs = { ...attributes };
|
|
43
|
+
const events = [];
|
|
44
|
+
const self = this;
|
|
45
|
+
let ended = false;
|
|
46
|
+
return {
|
|
47
|
+
id,
|
|
48
|
+
name,
|
|
49
|
+
setAttribute(k, v) {
|
|
50
|
+
attrs[k] = v;
|
|
51
|
+
return this;
|
|
52
|
+
},
|
|
53
|
+
addEvent(evName, evAttrs = {}) {
|
|
54
|
+
events.push({
|
|
55
|
+
name: evName,
|
|
56
|
+
time: self._now(),
|
|
57
|
+
attributes: { ...evAttrs },
|
|
58
|
+
});
|
|
59
|
+
return this;
|
|
60
|
+
},
|
|
61
|
+
/**
|
|
62
|
+
* Record a failure on this span, classified into a category (defaults to
|
|
63
|
+
* the error name) so `summary().failures` aggregates by cause.
|
|
64
|
+
*/
|
|
65
|
+
recordException(err, category) {
|
|
66
|
+
const cat = category || err?.code || err?.name || "error";
|
|
67
|
+
attrs["failure.category"] = cat;
|
|
68
|
+
attrs["error"] = true;
|
|
69
|
+
events.push({
|
|
70
|
+
name: "exception",
|
|
71
|
+
time: self._now(),
|
|
72
|
+
attributes: {
|
|
73
|
+
"exception.message": err?.message || String(err),
|
|
74
|
+
"exception.category": cat,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
self._failures.set(cat, (self._failures.get(cat) || 0) + 1);
|
|
78
|
+
return this;
|
|
79
|
+
},
|
|
80
|
+
end(extra = {}) {
|
|
81
|
+
if (ended) return; // idempotent
|
|
82
|
+
ended = true;
|
|
83
|
+
const endTime = self._now();
|
|
84
|
+
Object.assign(attrs, extra.attributes || {});
|
|
85
|
+
const status = extra.status || (attrs.error ? "error" : "ok");
|
|
86
|
+
self._spans.push({
|
|
87
|
+
id,
|
|
88
|
+
parentId,
|
|
89
|
+
name,
|
|
90
|
+
startTime: start,
|
|
91
|
+
endTime,
|
|
92
|
+
durationMs: endTime - start,
|
|
93
|
+
status,
|
|
94
|
+
attributes: attrs,
|
|
95
|
+
events,
|
|
96
|
+
});
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Increment a named counter (tokens, cost, cache.hit, retry, …). */
|
|
102
|
+
counter(name, value = 1, attributes = {}) {
|
|
103
|
+
const entry = this._counters.get(name) || { total: 0, byAttr: {} };
|
|
104
|
+
entry.total += value;
|
|
105
|
+
for (const [k, v] of Object.entries(attributes)) {
|
|
106
|
+
const key = `${k}=${v}`;
|
|
107
|
+
entry.byAttr[key] = (entry.byAttr[key] || 0) + value;
|
|
108
|
+
}
|
|
109
|
+
this._counters.set(name, entry);
|
|
110
|
+
return entry.total;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
_percentile(sorted, p) {
|
|
114
|
+
if (sorted.length === 0) return 0;
|
|
115
|
+
// nearest-rank
|
|
116
|
+
const rank = Math.ceil((p / 100) * sorted.length);
|
|
117
|
+
return sorted[Math.min(rank, sorted.length) - 1];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Aggregate metrics across everything recorded so far. */
|
|
121
|
+
summary() {
|
|
122
|
+
const byName = {};
|
|
123
|
+
for (const s of this._spans) {
|
|
124
|
+
(byName[s.name] = byName[s.name] || []).push(s);
|
|
125
|
+
}
|
|
126
|
+
const durations = {};
|
|
127
|
+
for (const [name, spans] of Object.entries(byName)) {
|
|
128
|
+
const ds = spans.map((s) => s.durationMs).sort((a, b) => a - b);
|
|
129
|
+
const total = ds.reduce((a, b) => a + b, 0);
|
|
130
|
+
const errors = spans.filter((s) => s.status === "error").length;
|
|
131
|
+
durations[name] = {
|
|
132
|
+
count: spans.length,
|
|
133
|
+
errors,
|
|
134
|
+
totalMs: total,
|
|
135
|
+
avgMs: Math.round(total / spans.length),
|
|
136
|
+
p50Ms: this._percentile(ds, 50),
|
|
137
|
+
p95Ms: this._percentile(ds, 95),
|
|
138
|
+
maxMs: ds[ds.length - 1] || 0,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
const counters = {};
|
|
142
|
+
for (const [name, entry] of this._counters) {
|
|
143
|
+
counters[name] = { total: entry.total, byAttr: { ...entry.byAttr } };
|
|
144
|
+
}
|
|
145
|
+
const failures = {};
|
|
146
|
+
let failureTotal = 0;
|
|
147
|
+
for (const [cat, n] of this._failures) {
|
|
148
|
+
failures[cat] = n;
|
|
149
|
+
failureTotal += n;
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
spanCount: this._spans.length,
|
|
153
|
+
durations,
|
|
154
|
+
counters,
|
|
155
|
+
failures,
|
|
156
|
+
failureTotal,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** OTLP/JSON-shaped export (resourceSpans) — ingestible by an OTel collector. */
|
|
161
|
+
toOtlp() {
|
|
162
|
+
return {
|
|
163
|
+
resourceSpans: [
|
|
164
|
+
{
|
|
165
|
+
resource: {
|
|
166
|
+
attributes: [
|
|
167
|
+
{ key: "service.name", value: { stringValue: this.serviceName } },
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
scopeSpans: [
|
|
171
|
+
{
|
|
172
|
+
scope: { name: "chainlesschain.cli" },
|
|
173
|
+
spans: this._spans.map((s) => ({
|
|
174
|
+
traceId: "0".repeat(32),
|
|
175
|
+
spanId: s.id,
|
|
176
|
+
parentSpanId: s.parentId || "",
|
|
177
|
+
name: s.name,
|
|
178
|
+
startTimeUnixNano: s.startTime * 1e6,
|
|
179
|
+
endTimeUnixNano: s.endTime * 1e6,
|
|
180
|
+
status: { code: s.status === "error" ? 2 : 1 },
|
|
181
|
+
attributes: Object.entries(s.attributes).map(([k, v]) => ({
|
|
182
|
+
key: k,
|
|
183
|
+
value:
|
|
184
|
+
typeof v === "number"
|
|
185
|
+
? { doubleValue: v }
|
|
186
|
+
: typeof v === "boolean"
|
|
187
|
+
? { boolValue: v }
|
|
188
|
+
: { stringValue: String(v) },
|
|
189
|
+
})),
|
|
190
|
+
events: s.events.map((e) => ({
|
|
191
|
+
name: e.name,
|
|
192
|
+
timeUnixNano: e.time * 1e6,
|
|
193
|
+
attributes: Object.entries(e.attributes).map(([k, v]) => ({
|
|
194
|
+
key: k,
|
|
195
|
+
value: { stringValue: String(v) },
|
|
196
|
+
})),
|
|
197
|
+
})),
|
|
198
|
+
})),
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
spans() {
|
|
207
|
+
return this._spans.slice();
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
reset() {
|
|
211
|
+
this._spans = [];
|
|
212
|
+
this._counters = new Map();
|
|
213
|
+
this._failures = new Map();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/** Render a summary as a compact text block. */
|
|
218
|
+
export function formatTelemetry(summary) {
|
|
219
|
+
const lines = [];
|
|
220
|
+
lines.push(`Telemetry: ${summary.spanCount} span(s)`);
|
|
221
|
+
for (const [name, d] of Object.entries(summary.durations)) {
|
|
222
|
+
lines.push(
|
|
223
|
+
` ${name}: n=${d.count}${d.errors ? ` err=${d.errors}` : ""} ` +
|
|
224
|
+
`avg=${d.avgMs}ms p50=${d.p50Ms}ms p95=${d.p95Ms}ms max=${d.maxMs}ms`,
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
for (const [name, c] of Object.entries(summary.counters)) {
|
|
228
|
+
lines.push(` ${name}: ${c.total}`);
|
|
229
|
+
}
|
|
230
|
+
if (summary.failureTotal > 0) {
|
|
231
|
+
const parts = Object.entries(summary.failures)
|
|
232
|
+
.map(([cat, n]) => `${cat}=${n}`)
|
|
233
|
+
.join(", ");
|
|
234
|
+
lines.push(` failures: ${summary.failureTotal} (${parts})`);
|
|
235
|
+
}
|
|
236
|
+
return lines.join("\n");
|
|
237
|
+
}
|