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
@@ -353,6 +353,74 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
353
353
  tags: ["tool:search_files", "contract:coding-agent", "tier:mvp"],
354
354
  },
355
355
  },
356
+ {
357
+ name: "code_intelligence",
358
+ title: "Code Intelligence",
359
+ kind: "analysis",
360
+ tier: "extension",
361
+ description:
362
+ "Semantic code navigation via a Language Server (LSP): resolve a symbol's " +
363
+ "definition, find its references, get type/hover info, list document or " +
364
+ "workspace symbols, read diagnostics, or preview a rename — WITHOUT text " +
365
+ "guessing. Prefer this over search_files when you need exact symbol " +
366
+ "semantics. Positions are 1-based (line/col). Degrades gracefully to a " +
367
+ "'not available' result when no language server is installed for the file.",
368
+ inputSchema: {
369
+ type: "object",
370
+ properties: {
371
+ action: {
372
+ type: "string",
373
+ enum: [
374
+ "definition",
375
+ "references",
376
+ "hover",
377
+ "document_symbols",
378
+ "workspace_symbols",
379
+ "diagnostics",
380
+ "rename_preview",
381
+ ],
382
+ description: "Which semantic query to run",
383
+ },
384
+ file: {
385
+ type: "string",
386
+ description:
387
+ "File path (relative to cwd). Required for every action except workspace_symbols.",
388
+ },
389
+ line: {
390
+ type: "integer",
391
+ description:
392
+ "1-based line number of the symbol (definition/references/hover/rename_preview).",
393
+ },
394
+ col: {
395
+ type: "integer",
396
+ description:
397
+ "1-based column of the symbol (definition/references/hover/rename_preview).",
398
+ },
399
+ query: {
400
+ type: "string",
401
+ description: "Symbol name to search for (workspace_symbols).",
402
+ },
403
+ new_name: {
404
+ type: "string",
405
+ description: "Proposed new identifier (rename_preview).",
406
+ },
407
+ },
408
+ required: ["action"],
409
+ },
410
+ ...TOOL_POLICY_METADATA.code_intelligence,
411
+ permissions: {
412
+ level: "readonly",
413
+ scopes: ["filesystem:read", "process:spawn"],
414
+ },
415
+ telemetry: {
416
+ category: "analysis",
417
+ tags: [
418
+ "tool:code_intelligence",
419
+ "contract:coding-agent",
420
+ "tier:extension",
421
+ ],
422
+ },
423
+ },
356
424
  {
357
425
  name: "list_dir",
358
426
  title: "List Directory",
@@ -422,7 +490,8 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
422
490
  properties: {
423
491
  category: {
424
492
  type: "string",
425
- description: "Filter by category (e.g. development, automation, data)",
493
+ description:
494
+ "Filter by category (e.g. development, automation, data)",
426
495
  },
427
496
  query: {
428
497
  type: "string",
@@ -491,7 +560,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
491
560
  agent: {
492
561
  type: "string",
493
562
  description:
494
- 'Optional name of a pre-defined subagent from .chainlesschain/agents/ or .claude/agents/ (e.g. "review:security"). Loads that file\'s system prompt + tool allow-list. Run `cc agents list` to see them. Explicit `role`/`tools` override the agent\'s values.',
563
+ "Optional name of a pre-defined subagent from .chainlesschain/agents/ or .claude/agents/ (e.g. \"review:security\"). Loads that file's system prompt + tool allow-list. Run `cc agents list` to see them. Explicit `role`/`tools` override the agent's values.",
495
564
  },
496
565
  role: {
497
566
  type: "string",
@@ -588,7 +657,16 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
588
657
  },
589
658
  provider: {
590
659
  type: "string",
591
- enum: ["auto", "tavily", "brave", "bocha", "qianfan", "duckduckgo", "searxng", "baidu"],
660
+ enum: [
661
+ "auto",
662
+ "tavily",
663
+ "brave",
664
+ "bocha",
665
+ "qianfan",
666
+ "duckduckgo",
667
+ "searxng",
668
+ "baidu",
669
+ ],
592
670
  description:
593
671
  "Override the configured search backend for this call (default: from config / auto)",
594
672
  },
@@ -763,11 +841,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
763
841
  },
764
842
  telemetry: {
765
843
  category: "search",
766
- tags: [
767
- "tool:search_sessions",
768
- "contract:coding-agent",
769
- "tier:extension",
770
- ],
844
+ tags: ["tool:search_sessions", "contract:coding-agent", "tier:extension"],
771
845
  },
772
846
  },
773
847
  ]);
@@ -23,7 +23,11 @@ const TOOL_DECISIONS = Object.freeze({
23
23
  REQUIRE_CONFIRMATION: "require_confirmation",
24
24
  });
25
25
 
26
- const PLAN_APPROVED_STATES = Object.freeze(["approved", "executing", "completed"]);
26
+ const PLAN_APPROVED_STATES = Object.freeze([
27
+ "approved",
28
+ "executing",
29
+ "completed",
30
+ ]);
27
31
 
28
32
  const READ_ONLY_GIT_SUBCOMMANDS = Object.freeze([
29
33
  "status",
@@ -64,6 +68,20 @@ const TOOL_POLICY_METADATA = Object.freeze({
64
68
  approvalFlow: "auto",
65
69
  isReadOnly: true,
66
70
  },
71
+ code_intelligence: {
72
+ // Read-only semantic navigation via LSP (definition/references/hover/
73
+ // symbols/diagnostics/rename-preview). It never mutates the workspace — a
74
+ // rename returns a preview, not an applied edit — so it is auto-approved and
75
+ // available in plan mode, like search_files.
76
+ riskLevel: RISK_LEVELS.LOW,
77
+ category: TOOL_CATEGORIES.ANALYZE,
78
+ availableInPlanMode: true,
79
+ planModeBehavior: "allow",
80
+ requiresPlanApproval: false,
81
+ requiresConfirmation: false,
82
+ approvalFlow: "auto",
83
+ isReadOnly: true,
84
+ },
67
85
  edit_file: {
68
86
  riskLevel: RISK_LEVELS.MEDIUM,
69
87
  category: TOOL_CATEGORIES.WRITE,
@@ -295,7 +313,9 @@ function isDangerousGitCommand(command) {
295
313
  case "checkout":
296
314
  // Discard working-tree changes: `checkout -- <path>`, `checkout .`,
297
315
  // or `-f`/`--force` (a plain branch checkout is not flagged).
298
- return lower.includes("--") || lower.includes(".") || has("-f", "--force");
316
+ return (
317
+ lower.includes("--") || lower.includes(".") || has("-f", "--force")
318
+ );
299
319
  case "restore":
300
320
  // Worktree restore discards changes; a pure `--staged` restore only
301
321
  // unstages and is recoverable.
@@ -321,9 +341,9 @@ function isDangerousGitCommand(command) {
321
341
  // or an explicit `--delete --force`.
322
342
  return rest.includes("-D") || (has("--delete") && has("-f", "--force"));
323
343
  case "stash":
324
- return ["drop", "clear"].includes((lower[0] || ""));
344
+ return ["drop", "clear"].includes(lower[0] || "");
325
345
  case "reflog":
326
- return ["expire", "delete"].includes((lower[0] || ""));
346
+ return ["expire", "delete"].includes(lower[0] || "");
327
347
  case "update-ref":
328
348
  return has("-d", "--delete");
329
349
  case "filter-branch":
@@ -333,9 +353,14 @@ function isDangerousGitCommand(command) {
333
353
  return lower.some((t) => t.startsWith("--prune"));
334
354
  case "rebase":
335
355
  // History rewrite; control sub-actions (--abort/--continue/etc.) are safe.
336
- return !["--abort", "--continue", "--skip", "--quit", "--edit-todo", "--show-current-patch"].includes(
337
- lower[0] || "",
338
- );
356
+ return ![
357
+ "--abort",
358
+ "--continue",
359
+ "--skip",
360
+ "--quit",
361
+ "--edit-todo",
362
+ "--show-current-patch",
363
+ ].includes(lower[0] || "");
339
364
  default:
340
365
  return false;
341
366
  }
@@ -13,11 +13,20 @@
13
13
  * 3 models) and 2.1.152 switches to the configured fallback when the primary
14
14
  * model is "not found".
15
15
  *
16
- * Same-provider only: each hop swaps `options.model`, keeping the configured
17
- * provider / baseUrl / apiKey. Cross-provider fallback is a larger feature.
16
+ * Cross-provider fallback (v2): a fallback entry may name a DIFFERENT provider
17
+ * as `provider:model` (e.g. `openai:gpt-4o`, `ollama:qwen2.5:7b`). A cross-
18
+ * provider hop swaps provider + baseUrl + apiKey too, resolving the target
19
+ * provider's connection from BUILT_IN_PROVIDERS + its `apiKeyEnv`. SECURITY: a
20
+ * cross-provider hop is used ONLY when the user EXPLICITLY named that provider in
21
+ * the fallback chain AND the target provider's API key is present in the env —
22
+ * we never reuse the primary provider's key against a different vendor (that
23
+ * would be the silent auth-substitution this project forbids). A cross-provider
24
+ * entry whose key is missing is SKIPPED with a clear reason, not attempted with
25
+ * the wrong credential.
18
26
  */
19
27
 
20
28
  import { chatWithTools } from "./agent-core.js";
29
+ import { BUILT_IN_PROVIDERS } from "../lib/llm-providers.js";
21
30
 
22
31
  // Claude Code caps the fallback chain at 3 backups; mirror that here so a
23
32
  // mis-configured comma list can't fan out into an unbounded retry storm.
@@ -142,6 +151,85 @@ export function normalizeFallbackModels(input) {
142
151
  return out;
143
152
  }
144
153
 
154
+ /**
155
+ * Parse a fallback entry into `{ provider, model }`. A `provider:model` prefix
156
+ * is recognized ONLY when the prefix is a KNOWN provider name — so an
157
+ * ollama-style model id that itself contains a colon (`qwen2.5:7b`) is NOT
158
+ * mis-split, while `ollama:qwen2.5:7b` correctly yields provider `ollama` +
159
+ * model `qwen2.5:7b`. A plain `model` (no known-provider prefix) means
160
+ * "same provider" (provider: null).
161
+ *
162
+ * @param {string} entry
163
+ * @param {Set<string>} [knownProviders] provider names to recognize as prefixes
164
+ * @returns {{ provider: string|null, model: string }}
165
+ */
166
+ export function parseFallbackEntry(entry, knownProviders) {
167
+ const known =
168
+ knownProviders || new Set(Object.keys(BUILT_IN_PROVIDERS || {}));
169
+ const s = String(entry || "").trim();
170
+ const idx = s.indexOf(":");
171
+ if (idx > 0) {
172
+ const head = s.slice(0, idx);
173
+ const rest = s.slice(idx + 1);
174
+ if (rest && known.has(head)) {
175
+ return { provider: head, model: rest };
176
+ }
177
+ }
178
+ return { provider: null, model: s };
179
+ }
180
+
181
+ /**
182
+ * Resolve a fallback entry into a concrete call target. For a SAME-provider hop
183
+ * (no known provider prefix), only the model changes. For a CROSS-provider hop,
184
+ * resolve the target provider's baseUrl + apiKey (from its `apiKeyEnv` in the
185
+ * environment); if the target needs a key and none is set, the hop is
186
+ * `unavailable` (skipped) — we never fall back onto a different vendor with the
187
+ * wrong/absent credential.
188
+ *
189
+ * @param {string} entry
190
+ * @param {object} [opts] { env, providers, knownProviders }
191
+ * @returns {{ model, provider?, baseUrl?, apiKey?, crossProvider:boolean } | { unavailable:true, reason:string, model:string, provider:string }}
192
+ */
193
+ export function resolveFallbackTarget(entry, opts = {}) {
194
+ const env = opts.env || process.env;
195
+ const providers = opts.providers || BUILT_IN_PROVIDERS || {};
196
+ const { provider, model } = parseFallbackEntry(
197
+ entry,
198
+ opts.knownProviders || new Set(Object.keys(providers)),
199
+ );
200
+ if (!provider) {
201
+ return { model, crossProvider: false };
202
+ }
203
+ const def = providers[provider];
204
+ if (!def) {
205
+ return {
206
+ unavailable: true,
207
+ reason: `unknown provider "${provider}"`,
208
+ provider,
209
+ model,
210
+ };
211
+ }
212
+ let apiKey = null;
213
+ if (def.apiKeyEnv) {
214
+ apiKey = env[def.apiKeyEnv] || null;
215
+ if (!apiKey) {
216
+ return {
217
+ unavailable: true,
218
+ reason: `${provider} fallback skipped: ${def.apiKeyEnv} not set`,
219
+ provider,
220
+ model,
221
+ };
222
+ }
223
+ }
224
+ return {
225
+ model,
226
+ provider,
227
+ baseUrl: def.baseUrl || null,
228
+ apiKey,
229
+ crossProvider: true,
230
+ };
231
+ }
232
+
145
233
  /**
146
234
  * Build a chatFn that walks an ordered fallback chain when the primary fails.
147
235
  *
@@ -168,6 +256,9 @@ export function makeFallbackChatFn(opts = {}) {
168
256
  const isModelNotFound = opts.isModelNotFound || isModelNotFoundError;
169
257
  const onFallback = opts.onFallback;
170
258
 
259
+ const env = opts.env || process.env;
260
+ const providers = opts.providers || BUILT_IN_PROVIDERS || {};
261
+
171
262
  return async function chatWithFallback(messages, options = {}) {
172
263
  try {
173
264
  return await baseChatFn(messages, options);
@@ -175,8 +266,30 @@ export function makeFallbackChatFn(opts = {}) {
175
266
  let err = firstErr;
176
267
  let lastTried = options.model;
177
268
  for (const candidate of models) {
178
- // Skip a no-op hop (fallback identical to the model just attempted).
179
- if (!candidate || candidate === lastTried) continue;
269
+ const target = resolveFallbackTarget(candidate, { env, providers });
270
+ // A cross-provider hop whose key is absent (or an unknown provider) is
271
+ // skipped — never attempted with the wrong credential. Surface why.
272
+ if (target.unavailable) {
273
+ if (typeof onFallback === "function") {
274
+ try {
275
+ onFallback({
276
+ from: lastTried,
277
+ to: candidate,
278
+ skipped: true,
279
+ reason: target.reason,
280
+ error: err?.message || String(err),
281
+ });
282
+ } catch {
283
+ /* best-effort */
284
+ }
285
+ }
286
+ continue;
287
+ }
288
+ // Skip a no-op hop (same provider + same model just attempted).
289
+ const sameModel = target.model === lastTried;
290
+ const sameProvider =
291
+ !target.crossProvider || target.provider === options.provider;
292
+ if (!target.model || (sameModel && sameProvider)) continue;
180
293
  // Only advance the chain for transient failures or a missing primary;
181
294
  // a real bad-request / auth error is surfaced immediately.
182
295
  if (!isRetryable(err) && !isModelNotFound(err)) throw err;
@@ -184,16 +297,30 @@ export function makeFallbackChatFn(opts = {}) {
184
297
  try {
185
298
  onFallback({
186
299
  from: lastTried,
187
- to: candidate,
300
+ to: target.crossProvider
301
+ ? `${target.provider}:${target.model}`
302
+ : target.model,
303
+ crossProvider: target.crossProvider,
188
304
  error: err?.message || String(err),
189
305
  });
190
306
  } catch {
191
307
  // Notification is best-effort — never mask the retry.
192
308
  }
193
309
  }
194
- lastTried = candidate;
310
+ lastTried = target.model;
311
+ // Build the per-hop options: same-provider swaps only the model; a
312
+ // cross-provider hop also swaps provider/baseUrl/apiKey.
313
+ const hopOptions = target.crossProvider
314
+ ? {
315
+ ...options,
316
+ model: target.model,
317
+ provider: target.provider,
318
+ baseUrl: target.baseUrl,
319
+ apiKey: target.apiKey,
320
+ }
321
+ : { ...options, model: target.model };
195
322
  try {
196
- return await baseChatFn(messages, { ...options, model: candidate });
323
+ return await baseChatFn(messages, hopOptions);
197
324
  } catch (nextErr) {
198
325
  err = nextErr;
199
326
  }