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.
Files changed (231) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-DwpCCp64.js → AIOps-BJif14yR.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-C9pBYocA.js → ActionButton-CXek6gJY.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-BWAkeXxK.js → Analytics-BgQhdAJi.js} +2 -2
  7. package/src/assets/web-panel/assets/{AppLayout-CivFGH6B.js → AppLayout-DTYl5NtR.js} +3 -3
  8. package/src/assets/web-panel/assets/{Audit-Cm8hRpZm.js → Audit-BzATQAeR.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-DXdFMsE8.js → Backup-BzdPEQhL.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-uAwSTeql.js → BaseInput-BM0KVh8E.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-KU8eeJJE.js → Chat-D7fHXHkz.js} +4 -4
  12. package/src/assets/web-panel/assets/ChatBubbleRenderer-Wm34RR-b.js +1 -0
  13. package/src/assets/web-panel/assets/{Checkbox-C6AMDkjd.js → Checkbox-CAiSQ9vO.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-t2moDxcO.js → Codegen-Df40CrEe.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DCcsRRhN.js → Col-DIT2fNFU.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DtB-8SAC.js → Community-CSTIbW2k.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-CZm8THYA.js → Compact-DtqXZZUi.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-LiQgC7g1.js → Compliance-CUtzw6o7.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-CA8SAxht.js → Cowork-CezmlnmU.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-CtRaF1wD.js → Cron-P4BITarg.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-6-br6Hub.js → Crosschain-BRRiYwvq.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-Do2EccrL.js → DID-L5ijB9i4.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-wrXcbzGe.js → Dashboard-CFxro4ob.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-p3FsT245.js → Dropdown-BmAFCQ71.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-D95A2L8q.js → EmailListRenderer-DJBCEuon.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-cLuJW2zo.js → FamilyGuardDashboard-z4oLq6eT.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-Brgq_cbN.js → Federation-DsVCpHMF.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-DWLCkNgh.js → FormItemContext-DP3bP5th.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-BBqUfQd6.js → GenericCardRenderer-BAXP2Gc6.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-8F090w4I.js → Git-I3g_bAw9.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CCogEbxb.js → Governance-jHS5-ioS.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-CfLD7v7C.js → Inference-CPL7sfx9.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DDuHJewd.js → KnowledgeGraph-Jf236h4C.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-CE8KSEVC.js → Logs-Cm2tcSKg.js} +2 -2
  35. package/src/assets/web-panel/assets/{Marketplace-DmwpZmhT.js → Marketplace-CZK82rhi.js} +1 -1
  36. package/src/assets/web-panel/assets/{McpTools-Bf7AazU8.js → McpTools-CZCeji7a.js} +4 -4
  37. package/src/assets/web-panel/assets/{Memory-D0QU_00S.js → Memory-3l2KVS9k.js} +2 -2
  38. package/src/assets/web-panel/assets/{MobileBridge-yXS9xdhx.js → MobileBridge-VYdpoLh6.js} +1 -1
  39. package/src/assets/web-panel/assets/{MobileProjects-BuDUoGUP.js → MobileProjects-CiB9cmm1.js} +1 -1
  40. package/src/assets/web-panel/assets/{Mtc-BYyHy28p.js → Mtc-wCFZbBuL.js} +2 -2
  41. package/src/assets/web-panel/assets/{MtcAudit-CK0aqpiZ.js → MtcAudit-1a3THIyG.js} +4 -4
  42. package/src/assets/web-panel/assets/{Multisig-mNimKYeb.js → Multisig-DMzLB2hG.js} +3 -3
  43. package/src/assets/web-panel/assets/{NLProgramming-AioAJ0YA.js → NLProgramming-D9wZbf6l.js} +1 -1
  44. package/src/assets/web-panel/assets/{Notes-CVVNCLHE.js → Notes-hrFe2ZM-.js} +3 -3
  45. package/src/assets/web-panel/assets/{NotificationSettings-C4ABj-TK.js → NotificationSettings-CHGX5Jwm.js} +1 -1
  46. package/src/assets/web-panel/assets/OrderTableRenderer-CRIFE2Tj.js +1 -0
  47. package/src/assets/web-panel/assets/{Organization-uozl_gWK.js → Organization-By7FkhtY.js} +4 -4
  48. package/src/assets/web-panel/assets/{Overflow-BCZOM2hK.js → Overflow--khGSzJn.js} +1 -1
  49. package/src/assets/web-panel/assets/{P2P-CArcaiaj.js → P2P-CAG9dH35.js} +2 -2
  50. package/src/assets/web-panel/assets/{PdhVaultBrowser-Sgq2Srr8.js → PdhVaultBrowser-B3SQZmK9.js} +3 -3
  51. package/src/assets/web-panel/assets/{Permissions-BYrQrXnH.js → Permissions-D35ec6JA.js} +4 -4
  52. package/src/assets/web-panel/assets/{PersonalDataHub-BzHStAbz.js → PersonalDataHub-CxBF7hW_.js} +2 -2
  53. package/src/assets/web-panel/assets/{Pipeline-k7KqxX1M.js → Pipeline-s6EtOO1s.js} +1 -1
  54. package/src/assets/web-panel/assets/{Privacy-IumTUWqx.js → Privacy-BbJYmWmO.js} +1 -1
  55. package/src/assets/web-panel/assets/{ProjectInit-BRyImYTf.js → ProjectInit-VGQq1jMT.js} +2 -2
  56. package/src/assets/web-panel/assets/{ProjectSettings-BFIqTBFk.js → ProjectSettings-B1ew3Teh.js} +2 -2
  57. package/src/assets/web-panel/assets/Projects-CGcNIs_g.js +1 -0
  58. package/src/assets/web-panel/assets/{Providers-CyyFnUPs.js → Providers-mrO47FIK.js} +1 -1
  59. package/src/assets/web-panel/assets/{QrScannerModal-C82cRx-X.js → QrScannerModal-IJF2mHyw.js} +1 -1
  60. package/src/assets/web-panel/assets/{QuickAsk-DGxDF521.js → QuickAsk-CU0wN_Z0.js} +1 -1
  61. package/src/assets/web-panel/assets/{Recommend-Cns-Am1y.js → Recommend-DhN37R6G.js} +1 -1
  62. package/src/assets/web-panel/assets/{RemoteSession-R7OqAIlg.js → RemoteSession-D_xOX_hu.js} +2 -2
  63. package/src/assets/web-panel/assets/{Reputation-D7mgPIYV.js → Reputation-D_Ssv7uH.js} +1 -1
  64. package/src/assets/web-panel/assets/{Row-B3lEURyd.js → Row-Kx5dKxX7.js} +1 -1
  65. package/src/assets/web-panel/assets/{RssFeed-9_UVrpBt.js → RssFeed-BlGwqZkY.js} +2 -2
  66. package/src/assets/web-panel/assets/{Search-ClZeO80q.js → Search-hLFQzxpb.js} +1 -1
  67. package/src/assets/web-panel/assets/{Security-BNNJczEp.js → Security-DMlvsVt4.js} +3 -3
  68. package/src/assets/web-panel/assets/{Services-C5SjrWUj.js → Services-Bd0Qsj2m.js} +2 -2
  69. package/src/assets/web-panel/assets/{Skeleton-Ci_obQ-g.js → Skeleton-DFclq9X3.js} +1 -1
  70. package/src/assets/web-panel/assets/{Skills-DdebN15P.js → Skills-BNtln2qY.js} +1 -1
  71. package/src/assets/web-panel/assets/{Sla-OinZP2vi.js → Sla-Dch5H19G.js} +1 -1
  72. package/src/assets/web-panel/assets/{SpeechSettings-CxzbNF51.js → SpeechSettings-2UfQcU1g.js} +1 -1
  73. package/src/assets/web-panel/assets/{SyncSettings-D06N_66b.js → SyncSettings-CD9YQr4i.js} +2 -2
  74. package/src/assets/web-panel/assets/{Tasks-BdEdW0AZ.js → Tasks-BNu-7MzI.js} +1 -1
  75. package/src/assets/web-panel/assets/{Templates-F1ctKmPa.js → Templates-D1n9CaIR.js} +1 -1
  76. package/src/assets/web-panel/assets/{Tenant-CVz1Urot.js → Tenant-DenL3iBW.js} +1 -1
  77. package/src/assets/web-panel/assets/Terminal-ZzU0Io1Y.js +3 -0
  78. package/src/assets/web-panel/assets/{TimelineRenderer-Doitzjmf.js → TimelineRenderer-D87IfukO.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tokens-BpyVRpVA.js → Tokens-BkiZc8E3.js} +1 -1
  80. package/src/assets/web-panel/assets/{Trigger-nWhWYTbU.js → Trigger-BNRSytGN.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trust-DK_G-wLx.js → Trust-Bwbd4X2m.js} +1 -1
  82. package/src/assets/web-panel/assets/{UkeySign-B5yBUojO.js → UkeySign-B8O2bs0o.js} +1 -1
  83. package/src/assets/web-panel/assets/{VideoEditing-C5D51qAe.js → VideoEditing-C2fL8zmH.js} +1 -1
  84. package/src/assets/web-panel/assets/{Wallet-CLbL9K7v.js → Wallet-BORYDdE1.js} +4 -4
  85. package/src/assets/web-panel/assets/{WebAuthn-DZUelI3V.js → WebAuthn-C0V5S2FM.js} +4 -4
  86. package/src/assets/web-panel/assets/{WorkflowEditor-8RPxt4KW.js → WorkflowEditor-2dR0fcHL.js} +1 -1
  87. package/src/assets/web-panel/assets/{chat-4N4tOA3d.js → chat-BmuAFAn8.js} +1 -1
  88. package/src/assets/web-panel/assets/{colors-zbbGVrua.js → colors-CN3smMcK.js} +1 -1
  89. package/src/assets/web-panel/assets/{compact-item-D7iMkbnE.js → compact-item-DCnxb4kW.js} +1 -1
  90. package/src/assets/web-panel/assets/{createContext-CBzPJv-w.js → createContext-vlR43pHn.js} +1 -1
  91. package/src/assets/web-panel/assets/devWarning-DxwmsL4j.js +1 -0
  92. package/src/assets/web-panel/assets/{hasIn-bHdrQSqZ.js → hasIn-D04tHYFd.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-DbE5D0WL.js → index-0DnaZGkC.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-308gCGh7.js → index-430S68MN.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-kmh1TxRa.js → index-B78xL3s2.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-QFObYeo1.js → index-BTPEZTk1.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BZb8F8YG.js → index-BXRg8GFQ.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DE9j5YgT.js → index-BasvsWDM.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CiG1IZao.js → index-BeGDEXFs.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-Bqmx24kh.js → index-BqhASEL4.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BCr0geV9.js → index-BudvKQfG.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-S74FpAIn.js → index-C-6NO5il.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DyoNgbXl.js → index-C5Sxb1sE.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BtbbdLnf.js → index-CP9m9Ggr.js} +3 -3
  105. package/src/assets/web-panel/assets/{index-CkxK86vf.js → index-CTOCnIQ7.js} +1 -1
  106. package/src/assets/web-panel/assets/index-Cg2ldRfU.js +1 -0
  107. package/src/assets/web-panel/assets/{index-BTIjjXry.js → index-ClhAHDK3.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-B7b1hGry.js → index-CnXebZLL.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CPxkoKgA.js → index-CngCC8hC.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Ci009ijp.js → index-Cr-A0FYJ.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CdmMoYN1.js → index-CsAsCPJ6.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BBNr77E1.js → index-D28DeAAB.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-B1s0Bz9O.js → index-D5LZVZ0L.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-oDKNgCsP.js → index-D65_XseV.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-QNAG4JtR.js → index-D8vwp4qp.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CQfu1U78.js → index-DDwLgQY9.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BnBOpqv3.js → index-DIpY0qM5.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CQ6NcfWz.js → index-DTWg-18U.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-D4XKpj6c.js → index-DTtRscUa.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-D1YDh7Wr.js → index-DYAtmqiv.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CvRMA9uT.js → index-D_n8_vfI.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CahryTX0.js → index-DbADHwhr.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BJ4ZGyW0.js → index-DbVsQBOH.js} +1 -1
  124. package/src/assets/web-panel/assets/index-Dwzo-dtJ.js +1 -0
  125. package/src/assets/web-panel/assets/{index-xYCm6W2h.js → index-HhNjnCfe.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BS4_Mwk6.js → index-ToUh2b1-.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DISWAYce.js → index-TslMTwNy.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DmqlJed-.js → index-_FIkN3jd.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CqdPyWm5.js → index-hpvvtAZ3.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BsKehmmS.js → index-jzR7Ujuw.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DUyjUkY7.js → index-ljuBiQW9.js} +1 -1
  132. package/src/assets/web-panel/assets/{initDefaultProps-BD55yNBt.js → initDefaultProps-C3wUb4je.js} +1 -1
  133. package/src/assets/web-panel/assets/{motion-B5Bbe77U.js → motion-D-jYFUNA.js} +1 -1
  134. package/src/assets/web-panel/assets/{move-CTvIqHEH.js → move-tqb8nwJ2.js} +1 -1
  135. package/src/assets/web-panel/assets/{mtc-parser-BkNyPQKB.js → mtc-parser-DSOjMJMz.js} +1 -1
  136. package/src/assets/web-panel/assets/{omit-BaXJXgHA.js → omit-CJ7VimIW.js} +1 -1
  137. package/src/assets/web-panel/assets/{pickAttrs-Bw6-YTxH.js → pickAttrs-qXiG1iT3.js} +1 -1
  138. package/src/assets/web-panel/assets/{placementArrow-BLdbkLqJ.js → placementArrow-CkGBcy1Z.js} +1 -1
  139. package/src/assets/web-panel/assets/{responsiveObserve-IVYkzntU.js → responsiveObserve-D3WvTlLO.js} +1 -1
  140. package/src/assets/web-panel/assets/{slide-DFMFwwtY.js → slide-BEE2ftge.js} +1 -1
  141. package/src/assets/web-panel/assets/{statusUtils-CURYRtZ1.js → statusUtils-CsfBpxiG.js} +1 -1
  142. package/src/assets/web-panel/assets/{styleChecker-Cfz63s1r.js → styleChecker-xPrIiJPI.js} +1 -1
  143. package/src/assets/web-panel/assets/{useFlexGapSupport-COJL0KE3.js → useFlexGapSupport-C5Yd-SCR.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFs-YLLojQQf.js → useFs-D_MDS8HI.js} +1 -1
  145. package/src/assets/web-panel/assets/{usePersonalDataHub-BF_21qUC.js → usePersonalDataHub-BqJh-usA.js} +1 -1
  146. package/src/assets/web-panel/assets/{vnode-9ZpkA7bb.js → vnode-chm_p-gz.js} +1 -1
  147. package/src/assets/web-panel/assets/{zoom-DhtAfhl8.js → zoom-3-YDNz0Z.js} +1 -1
  148. package/src/assets/web-panel/index.html +1 -1
  149. package/src/assets/web-panel/remote-session-sw.js +43 -0
  150. package/src/command-manifest.json +22 -1
  151. package/src/commands/agent.js +44 -5
  152. package/src/commands/codeintel.js +252 -0
  153. package/src/commands/eval.js +248 -0
  154. package/src/commands/plugin.js +354 -0
  155. package/src/commands/team.js +456 -0
  156. package/src/gateways/ws/message-dispatcher.js +45 -2
  157. package/src/gateways/ws/remote-session-protocol.js +37 -0
  158. package/src/gateways/ws/ws-server.js +1 -1
  159. package/src/harness/prompt-compressor.js +27 -1
  160. package/src/harness/remote-command-ledger.js +158 -0
  161. package/src/harness/remote-session-push-apns.js +246 -0
  162. package/src/harness/remote-session-push-errors.js +15 -0
  163. package/src/harness/remote-session-push-fcm.js +9 -25
  164. package/src/harness/remote-session-push-huawei.js +174 -0
  165. package/src/harness/remote-session-push-oppo.js +171 -0
  166. package/src/harness/remote-session-push-senders.js +42 -0
  167. package/src/harness/remote-session-push-vivo.js +179 -0
  168. package/src/harness/remote-session-push-web.js +299 -0
  169. package/src/harness/remote-session-push-xiaomi.js +99 -0
  170. package/src/index.js +6 -0
  171. package/src/lib/agent-core.js +2 -0
  172. package/src/lib/agent-sandbox.js +161 -5
  173. package/src/lib/agent-team/task-lease.js +434 -0
  174. package/src/lib/agent-team/team-budget.js +165 -0
  175. package/src/lib/agent-team/team-mailbox.js +106 -0
  176. package/src/lib/agent-team/team-runner.js +266 -0
  177. package/src/lib/agent-team/team-worktree.js +204 -0
  178. package/src/lib/agents.js +18 -0
  179. package/src/lib/async-hook-supervisor.cjs +305 -0
  180. package/src/lib/eval/runner.js +163 -0
  181. package/src/lib/eval/tasks.js +456 -0
  182. package/src/lib/eval/trend.js +185 -0
  183. package/src/lib/lsp/__tests__/code-intelligence.integration.test.js +129 -0
  184. package/src/lib/lsp/__tests__/code-intelligence.test.js +228 -0
  185. package/src/lib/lsp/__tests__/jsonrpc-stream.test.js +104 -0
  186. package/src/lib/lsp/__tests__/lsp-client.test.js +258 -0
  187. package/src/lib/lsp/__tests__/lsp-manager.test.js +264 -0
  188. package/src/lib/lsp/__tests__/lsp-server-registry.test.js +128 -0
  189. package/src/lib/lsp/code-intelligence.js +356 -0
  190. package/src/lib/lsp/jsonrpc-stream.js +139 -0
  191. package/src/lib/lsp/lsp-client.js +318 -0
  192. package/src/lib/lsp/lsp-manager.js +323 -0
  193. package/src/lib/lsp/lsp-server-registry.js +196 -0
  194. package/src/lib/plugin-monitor-supervisor.js +238 -0
  195. package/src/lib/plugin-runtime/agents.js +51 -0
  196. package/src/lib/plugin-runtime/bin.js +100 -0
  197. package/src/lib/plugin-runtime/hooks.js +100 -0
  198. package/src/lib/plugin-runtime/install.js +388 -0
  199. package/src/lib/plugin-runtime/lsp.js +75 -0
  200. package/src/lib/plugin-runtime/manifest.js +458 -0
  201. package/src/lib/plugin-runtime/mcp.js +89 -0
  202. package/src/lib/plugin-runtime/monitors.js +100 -0
  203. package/src/lib/plugin-runtime/policy.js +144 -0
  204. package/src/lib/plugin-runtime/reload.js +79 -0
  205. package/src/lib/plugin-runtime/scopes.js +197 -0
  206. package/src/lib/plugin-runtime/settings.js +119 -0
  207. package/src/lib/plugin-runtime/signature.js +107 -0
  208. package/src/lib/plugin-runtime/skills.js +43 -0
  209. package/src/lib/plugin-runtime/trust.js +140 -0
  210. package/src/lib/sandbox-egress-proxy.js +162 -0
  211. package/src/lib/sandbox-network-policy.js +134 -0
  212. package/src/lib/sandbox-v2.js +10 -4
  213. package/src/lib/settings-hook-events.cjs +78 -6
  214. package/src/lib/settings-hooks.cjs +29 -3
  215. package/src/lib/settings-loader.cjs +35 -1
  216. package/src/lib/skill-loader.js +18 -0
  217. package/src/lib/telemetry/span-recorder.js +237 -0
  218. package/src/repl/agent-repl.js +400 -4
  219. package/src/runtime/agent-core.js +546 -52
  220. package/src/runtime/coding-agent-contract-shared.cjs +82 -8
  221. package/src/runtime/coding-agent-policy.cjs +32 -7
  222. package/src/runtime/fallback-model.js +134 -7
  223. package/src/runtime/headless-runner.js +353 -108
  224. package/src/runtime/mcp-config.js +46 -0
  225. package/src/assets/web-panel/assets/ChatBubbleRenderer-DCNfbdlx.js +0 -1
  226. package/src/assets/web-panel/assets/OrderTableRenderer-DIp8Xcbd.js +0 -1
  227. package/src/assets/web-panel/assets/Projects-Dpid9CDg.js +0 -1
  228. package/src/assets/web-panel/assets/Terminal-BvAK_Zel.js +0 -3
  229. package/src/assets/web-panel/assets/devWarning-C2Z5LRgq.js +0 -1
  230. package/src/assets/web-panel/assets/index-BGp6Yr-Y.js +0 -1
  231. 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,
@@ -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
+ }