chainlesschain 0.162.147 → 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 (257) hide show
  1. package/README.md +1 -1
  2. package/package.json +2 -2
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-DywJ7xTv.js → AIOps-BJif14yR.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-BTlqcY-q.js → ActionButton-CXek6gJY.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-FdG1Mvwy.js → Analytics-BgQhdAJi.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-CVsnbvN1.js → AppLayout-DTYl5NtR.js} +5 -5
  8. package/src/assets/web-panel/assets/{Audit-ITdpJ7vR.js → Audit-BzATQAeR.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-BfXqnXo1.js → Backup-BzdPEQhL.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-C09ip3_E.js → BaseInput-BM0KVh8E.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-qdkhB42l.js → Chat-D7fHXHkz.js} +6 -6
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-D2KfETZD.js → ChatBubbleRenderer-Wm34RR-b.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-j6WZCuff.js → Checkbox-CAiSQ9vO.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-CGZ-K3uK.js → Codegen-Df40CrEe.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-CIlPOAu6.js → Col-DIT2fNFU.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-sY-i-hic.js → Community-CSTIbW2k.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-DcoEfyL8.js → Compact-DtqXZZUi.js} +1 -1
  18. package/src/assets/web-panel/assets/Compliance-CUtzw6o7.js +1 -0
  19. package/src/assets/web-panel/assets/{Cowork-DLY_fkLv.js → Cowork-CezmlnmU.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-D049pZBC.js → Cron-P4BITarg.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-DCXdE8M9.js → Crosschain-BRRiYwvq.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-JCvPZtjW.js → DID-L5ijB9i4.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-Cg2xu3iE.js → Dashboard-CFxro4ob.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-DjJLjbLh.js → Dropdown-BmAFCQ71.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-DugNcSLR.js → EmailListRenderer-DJBCEuon.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-J6Nb-E30.js → FamilyGuardDashboard-z4oLq6eT.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-CQ3Ttpbl.js → Federation-DsVCpHMF.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-Cz0NKag4.js → FormItemContext-DP3bP5th.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-NYcMP6iz.js → GenericCardRenderer-BAXP2Gc6.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-B4hYN18N.js → Git-I3g_bAw9.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-DOQPCcC0.js → Governance-jHS5-ioS.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-HtLF746W.js → Inference-CPL7sfx9.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-BXrk8rMm.js → KnowledgeGraph-Jf236h4C.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-DS0JnD3-.js → Logs-Cm2tcSKg.js} +2 -2
  35. package/src/assets/web-panel/assets/{Marketplace-Cqnjihrz.js → Marketplace-CZK82rhi.js} +1 -1
  36. package/src/assets/web-panel/assets/{McpTools-Cx3Psk-U.js → McpTools-CZCeji7a.js} +5 -5
  37. package/src/assets/web-panel/assets/{Memory-BjyysPtj.js → Memory-3l2KVS9k.js} +2 -2
  38. package/src/assets/web-panel/assets/MobileBridge-D3Arxfeg.css +1 -0
  39. package/src/assets/web-panel/assets/MobileBridge-VYdpoLh6.js +1 -0
  40. package/src/assets/web-panel/assets/{MobileProjects-Xwf-fdOQ.js → MobileProjects-CiB9cmm1.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-Djkql5m5.js → Mtc-wCFZbBuL.js} +2 -2
  42. package/src/assets/web-panel/assets/{MtcAudit-D2BAZlu0.js → MtcAudit-1a3THIyG.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-ByqP1ZzH.js → Multisig-DMzLB2hG.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-C_kn0nE2.js → NLProgramming-D9wZbf6l.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-7l7eXHPq.js → Notes-hrFe2ZM-.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-BrCDoitw.js → NotificationSettings-CHGX5Jwm.js} +1 -1
  47. package/src/assets/web-panel/assets/OrderTableRenderer-CRIFE2Tj.js +1 -0
  48. package/src/assets/web-panel/assets/{Organization-DdoNAxsM.js → Organization-By7FkhtY.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-Bw7R6dE3.js → Overflow--khGSzJn.js} +1 -1
  50. package/src/assets/web-panel/assets/{OverrideContext-C2r4vyBb.js → OverrideContext-BlgL9440.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-DJNtBugA.js → P2P-CAG9dH35.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-Dwhd5_ue.js → PdhVaultBrowser-B3SQZmK9.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-BYoSfhPR.js → Permissions-D35ec6JA.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-aYCYJbnH.js → PersonalDataHub-CxBF7hW_.js} +2 -2
  55. package/src/assets/web-panel/assets/{Pipeline-DJp6CprF.js → Pipeline-s6EtOO1s.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-Cq9HZweR.js → Privacy-BbJYmWmO.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-CmF0HsSt.js → ProjectInit-VGQq1jMT.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-P8V5Aea2.js → ProjectSettings-B1ew3Teh.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-CGcNIs_g.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-D589v0q2.js → Providers-mrO47FIK.js} +1 -1
  61. package/src/assets/web-panel/assets/QrScannerModal-IJF2mHyw.js +1 -0
  62. package/src/assets/web-panel/assets/{MobileBridge-zJpPuf4E.css → QrScannerModal-NwAHNfiJ.css} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-lvRV2osB.js → QuickAsk-CU0wN_Z0.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-sb84MTpY.js → Recommend-DhN37R6G.js} +1 -1
  65. package/src/assets/web-panel/assets/RemoteSession-D_xOX_hu.js +4 -0
  66. package/src/assets/web-panel/assets/{Reputation-d9Y3vy-W.js → Reputation-D_Ssv7uH.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-DMdhLUTp.js → Row-Kx5dKxX7.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-OL-SMDkz.js → RssFeed-BlGwqZkY.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-BjStLKq1.js → Search-hLFQzxpb.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-MeI411qr.js → Security-DMlvsVt4.js} +2 -2
  71. package/src/assets/web-panel/assets/{Services-UajosuhT.js → Services-Bd0Qsj2m.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-CGpG-QJ1.js → Skeleton-DFclq9X3.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-C6P2RPY-.js → Skills-BNtln2qY.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-B_fPprgw.js → Sla-Dch5H19G.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-CqxLjSlQ.js → SpeechSettings-2UfQcU1g.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-DixSfFOQ.js → SyncSettings-CD9YQr4i.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-PavzPBxc.js → Tasks-BNu-7MzI.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-BYdGRnfX.js → Templates-D1n9CaIR.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-BQLgnarD.js → Tenant-DenL3iBW.js} +1 -1
  80. package/src/assets/web-panel/assets/Terminal-ZzU0Io1Y.js +3 -0
  81. package/src/assets/web-panel/assets/{TimelineRenderer-Bv7uZRM7.js → TimelineRenderer-D87IfukO.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-DxhgszRJ.js → Tokens-BkiZc8E3.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-nQYHayuc.js → Trigger-BNRSytGN.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-CvqZDuZ4.js → Trust-Bwbd4X2m.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-DaR8GV2I.js → UkeySign-B8O2bs0o.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-C6Mpsokw.js → VideoEditing-C2fL8zmH.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-B57VRrWc.js → Wallet-BORYDdE1.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-BbtEEtpq.js → WebAuthn-C0V5S2FM.js} +4 -4
  89. package/src/assets/web-panel/assets/{WorkflowEditor-C5LwvKmH.js → WorkflowEditor-2dR0fcHL.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-MzuPR5jh.js → chat-BmuAFAn8.js} +1 -1
  91. package/src/assets/web-panel/assets/{collapseMotion-mxzzcDsg.js → collapseMotion-DVfhbsdP.js} +1 -1
  92. package/src/assets/web-panel/assets/{colors-HyW8mi_y.js → colors-CN3smMcK.js} +1 -1
  93. package/src/assets/web-panel/assets/{compact-item-DvUSzWAp.js → compact-item-DCnxb4kW.js} +1 -1
  94. package/src/assets/web-panel/assets/{createContext-4MppZl7X.js → createContext-vlR43pHn.js} +1 -1
  95. package/src/assets/web-panel/assets/devWarning-DxwmsL4j.js +1 -0
  96. package/src/assets/web-panel/assets/{echarts-jxgIOFUZ.js → echarts-CL0F2SnX.js} +1 -1
  97. package/src/assets/web-panel/assets/{hasIn-D9q3CJ-u.js → hasIn-D04tHYFd.js} +1 -1
  98. package/src/assets/web-panel/assets/{icons-DP3uiYxy.js → icons-BsDmGpcT.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-C9I5MuJ0.js → index-0DnaZGkC.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-Caqtu6Et.js → index-430S68MN.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-eOQO6KnV.js → index-B78xL3s2.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Ci6adKh8.js → index-BTPEZTk1.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CifKUNtV.js → index-BXRg8GFQ.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-D7TDMMfu.js → index-BasvsWDM.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DNYqw0MO.js → index-BeGDEXFs.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-m0b6Fj9q.js → index-BqhASEL4.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BF2JsbiX.js → index-BudvKQfG.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DFqvWeGc.js → index-C-6NO5il.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-SDblbKj6.js → index-C5Sxb1sE.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-UUMCA2Sq.js → index-CP9m9Ggr.js} +4 -4
  111. package/src/assets/web-panel/assets/{index--Bm6OqmU.js → index-CTOCnIQ7.js} +1 -1
  112. package/src/assets/web-panel/assets/index-Cg2ldRfU.js +1 -0
  113. package/src/assets/web-panel/assets/{index-Dv7ffI2g.js → index-ClhAHDK3.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BcunsBIx.js → index-CnXebZLL.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CvAqCAo9.js → index-CngCC8hC.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DcMkjb92.js → index-Cr-A0FYJ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BFGfC5RS.js → index-CsAsCPJ6.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DDZ6fP5Z.js → index-D28DeAAB.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CgIfXOD9.js → index-D5LZVZ0L.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DmZ6-suL.js → index-D65_XseV.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Cs-RKRUM.js → index-D8vwp4qp.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B994UQfE.js → index-DDwLgQY9.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-Btz8pU68.js → index-DIpY0qM5.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-B5E4DhVc.js → index-DTWg-18U.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-D2jrnaq3.js → index-DTtRscUa.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BmCo2Xdp.js → index-DYAtmqiv.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-Zvtru2oE.js → index-D_n8_vfI.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CLAZs1Vd.js → index-DbADHwhr.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CucRo4Vz.js → index-DbVsQBOH.js} +1 -1
  130. package/src/assets/web-panel/assets/index-Dwzo-dtJ.js +1 -0
  131. package/src/assets/web-panel/assets/{index-C0DiL97c.js → index-HhNjnCfe.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Bl-E4W4q.js → index-ToUh2b1-.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-ryFLxB1p.js → index-TslMTwNy.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BGQtFso0.js → index-_FIkN3jd.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-zLwYpvX0.js → index-hpvvtAZ3.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-Dvg5xYuP.js → index-jzR7Ujuw.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-xvUVuFnA.js → index-ljuBiQW9.js} +1 -1
  138. package/src/assets/web-panel/assets/{initDefaultProps-CC--PMsC.js → initDefaultProps-C3wUb4je.js} +1 -1
  139. package/src/assets/web-panel/assets/{motion-DdrBjRF1.js → motion-D-jYFUNA.js} +1 -1
  140. package/src/assets/web-panel/assets/{move-D712Gwl2.js → move-tqb8nwJ2.js} +1 -1
  141. package/src/assets/web-panel/assets/{mtc-parser-39y-keKO.js → mtc-parser-DSOjMJMz.js} +1 -1
  142. package/src/assets/web-panel/assets/{omit-6Y51gDB9.js → omit-CJ7VimIW.js} +1 -1
  143. package/src/assets/web-panel/assets/{pickAttrs-Cy6EHbq9.js → pickAttrs-qXiG1iT3.js} +1 -1
  144. package/src/assets/web-panel/assets/{placementArrow-BYxdAm0p.js → placementArrow-CkGBcy1Z.js} +1 -1
  145. package/src/assets/web-panel/assets/{responsiveObserve-C9R6q_cr.js → responsiveObserve-D3WvTlLO.js} +1 -1
  146. package/src/assets/web-panel/assets/{slide-CXUJlilB.js → slide-BEE2ftge.js} +1 -1
  147. package/src/assets/web-panel/assets/{statusUtils-DOtrOeql.js → statusUtils-CsfBpxiG.js} +1 -1
  148. package/src/assets/web-panel/assets/{styleChecker-D5r39o92.js → styleChecker-xPrIiJPI.js} +1 -1
  149. package/src/assets/web-panel/assets/useFlexGapSupport-C5Yd-SCR.js +1 -0
  150. package/src/assets/web-panel/assets/{useFs-BkrT-Zbc.js → useFs-D_MDS8HI.js} +1 -1
  151. package/src/assets/web-panel/assets/{useMergedState-Cl2q1fes.js → useMergedState-Dc9sO2d7.js} +1 -1
  152. package/src/assets/web-panel/assets/{usePersonalDataHub-BwnnnZjU.js → usePersonalDataHub-BqJh-usA.js} +1 -1
  153. package/src/assets/web-panel/assets/{useRefs-DD9q4mOT.js → useRefs-CAeFRzPf.js} +1 -1
  154. package/src/assets/web-panel/assets/{useState-BK4hy8Ma.js → useState-LwExUYDO.js} +1 -1
  155. package/src/assets/web-panel/assets/{vendor-BvqAck49.js → vendor-BMxUs6UX.js} +16 -16
  156. package/src/assets/web-panel/assets/{vnode-SU-N4pum.js → vnode-chm_p-gz.js} +1 -1
  157. package/src/assets/web-panel/assets/{zoom-DHScfpTP.js → zoom-3-YDNz0Z.js} +1 -1
  158. package/src/assets/web-panel/index.html +3 -3
  159. package/src/assets/web-panel/remote-session-sw.js +43 -0
  160. package/src/command-manifest.json +22 -1
  161. package/src/commands/agent.js +44 -5
  162. package/src/commands/codeintel.js +252 -0
  163. package/src/commands/eval.js +248 -0
  164. package/src/commands/plugin.js +354 -0
  165. package/src/commands/serve.js +10 -0
  166. package/src/commands/team.js +456 -0
  167. package/src/gateways/remote-session-relay.js +160 -0
  168. package/src/gateways/ws/message-dispatcher.js +77 -2
  169. package/src/gateways/ws/remote-session-protocol.js +466 -0
  170. package/src/gateways/ws/ws-server.js +299 -0
  171. package/src/harness/golden-transcript.js +65 -0
  172. package/src/harness/mcp-client.js +6 -2
  173. package/src/harness/prompt-compressor.js +27 -1
  174. package/src/harness/remote-command-ledger.js +158 -0
  175. package/src/harness/remote-session-audit-sink.js +132 -0
  176. package/src/harness/remote-session-audit.js +110 -0
  177. package/src/harness/remote-session-crypto.js +217 -0
  178. package/src/harness/remote-session-push-apns.js +246 -0
  179. package/src/harness/remote-session-push-errors.js +15 -0
  180. package/src/harness/remote-session-push-fcm.js +238 -0
  181. package/src/harness/remote-session-push-huawei.js +174 -0
  182. package/src/harness/remote-session-push-oppo.js +171 -0
  183. package/src/harness/remote-session-push-senders.js +42 -0
  184. package/src/harness/remote-session-push-vivo.js +179 -0
  185. package/src/harness/remote-session-push-web.js +299 -0
  186. package/src/harness/remote-session-push-xiaomi.js +99 -0
  187. package/src/harness/remote-session-push.js +104 -0
  188. package/src/harness/remote-session-registry.js +420 -0
  189. package/src/index.js +6 -0
  190. package/src/lib/agent-core.js +2 -0
  191. package/src/lib/agent-sandbox.js +161 -5
  192. package/src/lib/agent-team/task-lease.js +434 -0
  193. package/src/lib/agent-team/team-budget.js +165 -0
  194. package/src/lib/agent-team/team-mailbox.js +106 -0
  195. package/src/lib/agent-team/team-runner.js +266 -0
  196. package/src/lib/agent-team/team-worktree.js +204 -0
  197. package/src/lib/agents.js +18 -0
  198. package/src/lib/async-hook-supervisor.cjs +305 -0
  199. package/src/lib/did-manager.js +6 -4
  200. package/src/lib/eval/runner.js +163 -0
  201. package/src/lib/eval/tasks.js +456 -0
  202. package/src/lib/eval/trend.js +185 -0
  203. package/src/lib/lsp/__tests__/code-intelligence.integration.test.js +129 -0
  204. package/src/lib/lsp/__tests__/code-intelligence.test.js +228 -0
  205. package/src/lib/lsp/__tests__/jsonrpc-stream.test.js +104 -0
  206. package/src/lib/lsp/__tests__/lsp-client.test.js +258 -0
  207. package/src/lib/lsp/__tests__/lsp-manager.test.js +264 -0
  208. package/src/lib/lsp/__tests__/lsp-server-registry.test.js +128 -0
  209. package/src/lib/lsp/code-intelligence.js +356 -0
  210. package/src/lib/lsp/jsonrpc-stream.js +139 -0
  211. package/src/lib/lsp/lsp-client.js +318 -0
  212. package/src/lib/lsp/lsp-manager.js +323 -0
  213. package/src/lib/lsp/lsp-server-registry.js +196 -0
  214. package/src/lib/mcp-oauth.js +23 -6
  215. package/src/lib/plugin-monitor-supervisor.js +238 -0
  216. package/src/lib/plugin-runtime/agents.js +51 -0
  217. package/src/lib/plugin-runtime/bin.js +100 -0
  218. package/src/lib/plugin-runtime/hooks.js +100 -0
  219. package/src/lib/plugin-runtime/install.js +388 -0
  220. package/src/lib/plugin-runtime/lsp.js +75 -0
  221. package/src/lib/plugin-runtime/manifest.js +458 -0
  222. package/src/lib/plugin-runtime/mcp.js +89 -0
  223. package/src/lib/plugin-runtime/monitors.js +100 -0
  224. package/src/lib/plugin-runtime/policy.js +144 -0
  225. package/src/lib/plugin-runtime/reload.js +79 -0
  226. package/src/lib/plugin-runtime/scopes.js +197 -0
  227. package/src/lib/plugin-runtime/settings.js +119 -0
  228. package/src/lib/plugin-runtime/signature.js +107 -0
  229. package/src/lib/plugin-runtime/skills.js +43 -0
  230. package/src/lib/plugin-runtime/trust.js +140 -0
  231. package/src/lib/sandbox-egress-proxy.js +162 -0
  232. package/src/lib/sandbox-network-policy.js +134 -0
  233. package/src/lib/sandbox-v2.js +10 -4
  234. package/src/lib/session-manager.js +7 -3
  235. package/src/lib/settings-hook-events.cjs +78 -6
  236. package/src/lib/settings-hooks.cjs +29 -3
  237. package/src/lib/settings-loader.cjs +35 -1
  238. package/src/lib/skill-loader.js +18 -0
  239. package/src/lib/telemetry/span-recorder.js +237 -0
  240. package/src/repl/agent-repl.js +400 -4
  241. package/src/runtime/agent-core.js +546 -52
  242. package/src/runtime/agent-runtime.js +8 -13
  243. package/src/runtime/coding-agent-contract-shared.cjs +82 -8
  244. package/src/runtime/coding-agent-policy.cjs +32 -7
  245. package/src/runtime/fallback-model.js +134 -7
  246. package/src/runtime/headless-runner.js +353 -108
  247. package/src/runtime/mcp-config.js +46 -0
  248. package/src/runtime/policies/agent-policy.js +2 -0
  249. package/src/assets/web-panel/assets/Compliance-T8EtTecW.js +0 -1
  250. package/src/assets/web-panel/assets/MobileBridge-CYaITZ7w.js +0 -1
  251. package/src/assets/web-panel/assets/OrderTableRenderer-CmtqIdwr.js +0 -1
  252. package/src/assets/web-panel/assets/Projects-DPd5-lNS.js +0 -1
  253. package/src/assets/web-panel/assets/Terminal-BzOHpq-B.js +0 -3
  254. package/src/assets/web-panel/assets/devWarning-6YJJMjSH.js +0 -1
  255. package/src/assets/web-panel/assets/index-D_oeGLr6.js +0 -1
  256. package/src/assets/web-panel/assets/index-Qa57YG19.js +0 -1
  257. package/src/assets/web-panel/assets/useFlexGapSupport-DfAD5U4Z.js +0 -1
@@ -0,0 +1,129 @@
1
+ /**
2
+ * LSP integration test — exercises the FULL stack (spawn → handshake → didOpen →
3
+ * query) against a REAL `typescript-language-server` if one is resolvable on
4
+ * PATH. When no server is installed (e.g. CI without the toolchain) the whole
5
+ * suite SKIPS visibly rather than passing hollowly ("不假绿" — no cosmetic green).
6
+ *
7
+ * To run it locally: `npm i -g typescript-language-server typescript` (or put a
8
+ * project-local one on PATH), then `npx vitest run code-intelligence.integration`.
9
+ */
10
+
11
+ import { describe, it, expect, beforeAll, afterAll } from "vitest";
12
+ import os from "os";
13
+ import fs from "fs";
14
+ import path from "path";
15
+ import { resolveBin } from "../lsp-server-registry.js";
16
+ import { CodeIntelligence } from "../code-intelligence.js";
17
+
18
+ const serverAvailable = Boolean(resolveBin("typescript-language-server"));
19
+ const suite = serverAvailable ? describe : describe.skip;
20
+
21
+ if (!serverAvailable) {
22
+ // Make the skip reason obvious in test output.
23
+ // eslint-disable-next-line no-console
24
+ console.warn(
25
+ "[lsp.integration] SKIP — no `typescript-language-server` on PATH. " +
26
+ "Install it to run real LSP integration coverage.",
27
+ );
28
+ }
29
+
30
+ suite("CodeIntelligence against a real typescript-language-server", () => {
31
+ let tmp;
32
+ let ci;
33
+
34
+ beforeAll(() => {
35
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), "cc-lsp-it-"));
36
+ fs.mkdirSync(path.join(tmp, "src"));
37
+ fs.writeFileSync(
38
+ path.join(tmp, "package.json"),
39
+ JSON.stringify({ name: "lsp-it", version: "1.0.0", private: true }),
40
+ "utf8",
41
+ );
42
+ fs.writeFileSync(
43
+ path.join(tmp, "tsconfig.json"),
44
+ JSON.stringify({
45
+ compilerOptions: {
46
+ strict: true,
47
+ target: "ES2020",
48
+ module: "ESNext",
49
+ moduleResolution: "node",
50
+ },
51
+ include: ["src"],
52
+ }),
53
+ "utf8",
54
+ );
55
+ fs.writeFileSync(
56
+ path.join(tmp, "src", "math.ts"),
57
+ "export function add(a: number, b: number): number {\n return a + b;\n}\n",
58
+ "utf8",
59
+ );
60
+ fs.writeFileSync(
61
+ path.join(tmp, "src", "main.ts"),
62
+ 'import { add } from "./math";\n\nconst total = add(1, 2);\nconsole.log(total);\nconst bad: number = notDeclared;\n',
63
+ "utf8",
64
+ );
65
+ ci = new CodeIntelligence({ projectRoot: tmp, coldStart: true });
66
+ });
67
+
68
+ afterAll(async () => {
69
+ if (ci) await ci.dispose();
70
+ try {
71
+ fs.rmSync(tmp, { recursive: true, force: true });
72
+ } catch {
73
+ /* best effort */
74
+ }
75
+ });
76
+
77
+ it("resolves a cross-file definition", async () => {
78
+ // `add` usage in main.ts (line 3, col 15) → declaration in math.ts
79
+ const res = await ci.definition(path.join(tmp, "src", "main.ts"), 3, 15);
80
+ expect(res.available).toBe(true);
81
+ expect(res.locations.length).toBeGreaterThan(0);
82
+ expect(res.locations.some((l) => l.file.endsWith("math.ts"))).toBe(true);
83
+ }, 30000);
84
+
85
+ it("finds all references to a symbol across files", async () => {
86
+ // `add` declaration in math.ts (line 1, col 17)
87
+ const res = await ci.references(path.join(tmp, "src", "math.ts"), 1, 17);
88
+ expect(res.available).toBe(true);
89
+ // declaration + import + call site
90
+ expect(res.locations.length).toBeGreaterThanOrEqual(2);
91
+ expect(res.locations.some((l) => l.file.endsWith("main.ts"))).toBe(true);
92
+ }, 30000);
93
+
94
+ it("reports diagnostics for an undefined name", async () => {
95
+ const res = await ci.diagnostics(path.join(tmp, "src", "main.ts"), {
96
+ timeoutMs: 8000,
97
+ });
98
+ expect(res.available).toBe(true);
99
+ expect(res.diagnostics.some((d) => /notDeclared/.test(d.message))).toBe(
100
+ true,
101
+ );
102
+ const err = res.diagnostics.find((d) => d.severity === "error");
103
+ expect(err).toBeTruthy();
104
+ }, 30000);
105
+
106
+ it("lists document symbols", async () => {
107
+ const res = await ci.documentSymbols(path.join(tmp, "src", "math.ts"));
108
+ expect(res.available).toBe(true);
109
+ expect(
110
+ res.symbols.some((s) => s.name === "add" && s.kind === "function"),
111
+ ).toBe(true);
112
+ }, 30000);
113
+
114
+ it("previews a rename without mutating files", async () => {
115
+ const before = fs.readFileSync(path.join(tmp, "src", "math.ts"), "utf8");
116
+ const res = await ci.renamePreview(
117
+ path.join(tmp, "src", "math.ts"),
118
+ 1,
119
+ 17,
120
+ "sum",
121
+ );
122
+ expect(res.available).toBe(true);
123
+ expect(res.edits.length).toBeGreaterThan(0);
124
+ // preview only — the file on disk is unchanged
125
+ expect(fs.readFileSync(path.join(tmp, "src", "math.ts"), "utf8")).toBe(
126
+ before,
127
+ );
128
+ }, 30000);
129
+ });
@@ -0,0 +1,228 @@
1
+ /**
2
+ * CodeIntelligence tests — result normalization + graceful degradation. Injects
3
+ * a fake LSPManager so no server runs; asserts that raw LSP shapes (Location vs
4
+ * LocationLink, DocumentSymbol vs SymbolInformation, WorkspaceEdit variants) are
5
+ * flattened to 1-based `{file,line,col}` and that "no server" degrades cleanly.
6
+ */
7
+
8
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
9
+ import { CodeIntelligence, _deps } from "../code-intelligence.js";
10
+
11
+ /** Fake manager: canned request results, or an "unavailable" verdict. */
12
+ function fakeManager({ requestResult, unavailable, diagnostics } = {}) {
13
+ const client = {
14
+ request: async () => requestResult,
15
+ running: true,
16
+ };
17
+ return {
18
+ projectRoot: "/proj",
19
+ async ensureFor() {
20
+ if (unavailable) return { unavailable: true, reason: unavailable };
21
+ return {
22
+ client,
23
+ uri: "file:///proj/a.ts",
24
+ languageId: "typescript",
25
+ root: "/proj",
26
+ };
27
+ },
28
+ async didChangeFile() {
29
+ return this.ensureFor();
30
+ },
31
+ async waitForDiagnostics() {
32
+ return diagnostics || [];
33
+ },
34
+ async disposeAll() {},
35
+ };
36
+ }
37
+
38
+ let origRead;
39
+ beforeEach(() => {
40
+ origRead = _deps.readFileSync;
41
+ _deps.readFileSync = () => "const foo = 1;\nfoo();\n";
42
+ });
43
+ afterEach(() => {
44
+ _deps.readFileSync = origRead;
45
+ });
46
+
47
+ describe("definition/references normalization", () => {
48
+ it("normalizes a plain Location to 1-based with a snippet", async () => {
49
+ const mgr = fakeManager({
50
+ requestResult: [
51
+ {
52
+ uri: "file:///proj/a.ts",
53
+ range: {
54
+ start: { line: 0, character: 6 },
55
+ end: { line: 0, character: 9 },
56
+ },
57
+ },
58
+ ],
59
+ });
60
+ const ci = new CodeIntelligence({ manager: mgr });
61
+ const res = await ci.definition("a.ts", 2, 1);
62
+ expect(res.available).toBe(true);
63
+ expect(res.locations[0]).toMatchObject({
64
+ file: expect.stringContaining("a.ts"),
65
+ line: 1, // 0 → 1
66
+ col: 7, // 6 → 7
67
+ endLine: 1,
68
+ endCol: 10,
69
+ });
70
+ expect(res.locations[0].snippet).toBe("const foo = 1;");
71
+ });
72
+
73
+ it("normalizes a LocationLink (targetUri/targetRange)", async () => {
74
+ const mgr = fakeManager({
75
+ requestResult: [
76
+ {
77
+ targetUri: "file:///proj/b.ts",
78
+ targetSelectionRange: {
79
+ start: { line: 4, character: 2 },
80
+ end: { line: 4, character: 5 },
81
+ },
82
+ },
83
+ ],
84
+ });
85
+ const ci = new CodeIntelligence({ manager: mgr });
86
+ const res = await ci.definition("a.ts", 2, 1);
87
+ expect(res.locations[0]).toMatchObject({ line: 5, col: 3 });
88
+ expect(res.locations[0].file).toContain("b.ts");
89
+ });
90
+ });
91
+
92
+ describe("graceful degradation", () => {
93
+ it("returns available:false with a reason when no server is installed", async () => {
94
+ const mgr = fakeManager({
95
+ unavailable: "no language server installed for typescript",
96
+ });
97
+ const ci = new CodeIntelligence({ manager: mgr });
98
+ const res = await ci.definition("a.ts", 1, 1);
99
+ expect(res).toEqual({
100
+ available: false,
101
+ reason: "no language server installed for typescript",
102
+ });
103
+ });
104
+ });
105
+
106
+ describe("document symbols", () => {
107
+ it("flattens hierarchical DocumentSymbols with container names", async () => {
108
+ const mgr = fakeManager({
109
+ requestResult: [
110
+ {
111
+ name: "MyClass",
112
+ kind: 5, // class
113
+ selectionRange: {
114
+ start: { line: 0, character: 6 },
115
+ end: { line: 0, character: 13 },
116
+ },
117
+ children: [
118
+ {
119
+ name: "method1",
120
+ kind: 6,
121
+ selectionRange: {
122
+ start: { line: 1, character: 2 },
123
+ end: { line: 1, character: 9 },
124
+ },
125
+ },
126
+ ],
127
+ },
128
+ ],
129
+ });
130
+ const ci = new CodeIntelligence({ manager: mgr });
131
+ const res = await ci.documentSymbols("a.ts");
132
+ expect(res.symbols).toHaveLength(2);
133
+ expect(res.symbols[0]).toMatchObject({
134
+ name: "MyClass",
135
+ kind: "class",
136
+ line: 1,
137
+ });
138
+ expect(res.symbols[1]).toMatchObject({
139
+ name: "method1",
140
+ kind: "method",
141
+ container: "MyClass",
142
+ line: 2,
143
+ });
144
+ });
145
+ });
146
+
147
+ describe("diagnostics", () => {
148
+ it("normalizes severity and position", async () => {
149
+ const mgr = fakeManager({
150
+ diagnostics: [
151
+ {
152
+ severity: 1,
153
+ message: "Cannot find name 'x'.",
154
+ range: {
155
+ start: { line: 3, character: 4 },
156
+ end: { line: 3, character: 5 },
157
+ },
158
+ code: 2304,
159
+ source: "ts",
160
+ },
161
+ ],
162
+ });
163
+ const ci = new CodeIntelligence({ manager: mgr });
164
+ const res = await ci.diagnostics("a.ts");
165
+ expect(res.diagnostics[0]).toMatchObject({
166
+ severity: "error",
167
+ message: "Cannot find name 'x'.",
168
+ line: 4,
169
+ col: 5,
170
+ code: "2304",
171
+ source: "ts",
172
+ });
173
+ });
174
+ });
175
+
176
+ describe("rename preview", () => {
177
+ it("flattens WorkspaceEdit.changes without applying", async () => {
178
+ const mgr = fakeManager({
179
+ requestResult: {
180
+ changes: {
181
+ "file:///proj/a.ts": [
182
+ {
183
+ range: {
184
+ start: { line: 0, character: 6 },
185
+ end: { line: 0, character: 9 },
186
+ },
187
+ newText: "bar",
188
+ },
189
+ ],
190
+ },
191
+ },
192
+ });
193
+ const ci = new CodeIntelligence({ manager: mgr });
194
+ const res = await ci.renamePreview("a.ts", 1, 7, "bar");
195
+ expect(res.edits).toHaveLength(1);
196
+ expect(res.edits[0].file).toContain("a.ts");
197
+ expect(res.edits[0].edits[0]).toMatchObject({
198
+ line: 1,
199
+ col: 7,
200
+ newText: "bar",
201
+ });
202
+ });
203
+
204
+ it("flattens WorkspaceEdit.documentChanges", async () => {
205
+ const mgr = fakeManager({
206
+ requestResult: {
207
+ documentChanges: [
208
+ {
209
+ textDocument: { uri: "file:///proj/c.ts", version: 2 },
210
+ edits: [
211
+ {
212
+ range: {
213
+ start: { line: 9, character: 0 },
214
+ end: { line: 9, character: 3 },
215
+ },
216
+ newText: "baz",
217
+ },
218
+ ],
219
+ },
220
+ ],
221
+ },
222
+ });
223
+ const ci = new CodeIntelligence({ manager: mgr });
224
+ const res = await ci.renamePreview("a.ts", 1, 1, "baz");
225
+ expect(res.edits[0].file).toContain("c.ts");
226
+ expect(res.edits[0].edits[0]).toMatchObject({ line: 10, newText: "baz" });
227
+ });
228
+ });
@@ -0,0 +1,104 @@
1
+ /**
2
+ * jsonrpc-stream tests — LSP Content-Length framing. Pure, no IO. Pins the
3
+ * split-chunk / multi-message / multibyte-length / lenient-LF edge cases that a
4
+ * naive framer gets wrong.
5
+ */
6
+
7
+ import { describe, it, expect } from "vitest";
8
+ import {
9
+ encodeMessage,
10
+ parseContentLength,
11
+ MessageBuffer,
12
+ } from "../jsonrpc-stream.js";
13
+
14
+ describe("encodeMessage", () => {
15
+ it("frames a message with a byte-accurate Content-Length", () => {
16
+ const buf = encodeMessage({ jsonrpc: "2.0", id: 1, method: "ping" });
17
+ const text = buf.toString("utf8");
18
+ const body = JSON.stringify({ jsonrpc: "2.0", id: 1, method: "ping" });
19
+ expect(text).toBe(
20
+ `Content-Length: ${Buffer.byteLength(body)}\r\n\r\n${body}`,
21
+ );
22
+ });
23
+
24
+ it("counts BYTES not characters for multibyte content", () => {
25
+ const buf = encodeMessage({ text: "你好" }); // 6 UTF-8 bytes for the two chars
26
+ const headerLen = Number(
27
+ /Content-Length: (\d+)/.exec(buf.toString("utf8"))[1],
28
+ );
29
+ const body = JSON.stringify({ text: "你好" });
30
+ expect(headerLen).toBe(Buffer.byteLength(body, "utf8"));
31
+ // round-trips through the buffer intact
32
+ const mb = new MessageBuffer().append(buf);
33
+ expect(mb.read()).toEqual({ text: "你好" });
34
+ });
35
+ });
36
+
37
+ describe("parseContentLength", () => {
38
+ it("reads the header case-insensitively", () => {
39
+ expect(parseContentLength("content-length: 42")).toBe(42);
40
+ expect(parseContentLength("Content-Length: 7\r\nContent-Type: x")).toBe(
41
+ 7,
42
+ );
43
+ });
44
+ it("returns null when absent or invalid", () => {
45
+ expect(parseContentLength("Content-Type: application/json")).toBeNull();
46
+ expect(parseContentLength("Content-Length: abc")).toBeNull();
47
+ });
48
+ });
49
+
50
+ describe("MessageBuffer", () => {
51
+ it("decodes a single framed message", () => {
52
+ const mb = new MessageBuffer();
53
+ mb.append(encodeMessage({ id: 1, result: "ok" }));
54
+ expect(mb.read()).toEqual({ id: 1, result: "ok" });
55
+ expect(mb.read()).toBeNull();
56
+ });
57
+
58
+ it("decodes multiple messages in one chunk", () => {
59
+ const mb = new MessageBuffer();
60
+ const chunk = Buffer.concat([
61
+ encodeMessage({ id: 1 }),
62
+ encodeMessage({ id: 2 }),
63
+ encodeMessage({ id: 3 }),
64
+ ]);
65
+ mb.append(chunk);
66
+ expect(mb.readAll().map((m) => m.id)).toEqual([1, 2, 3]);
67
+ });
68
+
69
+ it("reassembles a message split across chunks (header and body)", () => {
70
+ const full = encodeMessage({ id: 7, method: "textDocument/definition" });
71
+ const mb = new MessageBuffer();
72
+ // split mid-header and mid-body
73
+ for (let i = 0; i < full.length; i += 5) {
74
+ mb.append(full.slice(i, i + 5));
75
+ }
76
+ expect(mb.read()).toEqual({ id: 7, method: "textDocument/definition" });
77
+ expect(mb.hasPartial).toBe(false);
78
+ });
79
+
80
+ it("retains a partial frame until the rest arrives", () => {
81
+ const full = encodeMessage({ id: 9 });
82
+ const mb = new MessageBuffer();
83
+ mb.append(full.slice(0, full.length - 3));
84
+ expect(mb.read()).toBeNull();
85
+ expect(mb.hasPartial).toBe(true);
86
+ mb.append(full.slice(full.length - 3));
87
+ expect(mb.read()).toEqual({ id: 9 });
88
+ });
89
+
90
+ it("tolerates LF-only header separators", () => {
91
+ const body = JSON.stringify({ id: 5 });
92
+ const mb = new MessageBuffer();
93
+ mb.append(`Content-Length: ${body.length}\n\n${body}`);
94
+ expect(mb.read()).toEqual({ id: 5 });
95
+ });
96
+
97
+ it("skips a body that isn't valid JSON but stays aligned for the next frame", () => {
98
+ const mb = new MessageBuffer();
99
+ const bad = "Content-Length: 3\r\n\r\n{{{";
100
+ mb.append(bad + encodeMessage({ id: 2 }).toString("utf8"));
101
+ // bad frame dropped, good one still decoded
102
+ expect(mb.read()).toEqual({ id: 2 });
103
+ });
104
+ });