chainlesschain 0.166.127 → 0.166.128

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 (182) hide show
  1. package/README.md +11 -1
  2. package/package.json +1 -1
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-DkSOwKNn.js → AIOps-BmGA5zXX.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-CaYSnkeR.js → ActionButton-B7WXwoF0.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-D8kEgXLP.js → Analytics-IvJG43B5.js} +2 -2
  8. package/src/assets/web-panel/assets/{AppLayout-D43FaO4a.js → AppLayout-DWY017_e.js} +5 -5
  9. package/src/assets/web-panel/assets/Artifacts-BOyohM_-.js +1 -0
  10. package/src/assets/web-panel/assets/{Audit-0ogv1Zu5.js → Audit-CD9sTnBN.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-BhLnn-Gw.js → BackgroundAgents-J6gg5z0U.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-D4591rlk.js → Backup-D7ik3lse.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-gK1PjPDZ.js → BaseInput-MrDd5zcz.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-CCDmOYwg.js → Chat-DbxRqGiK.js} +5 -5
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-DbeJAwMg.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-DG4PRH9M.js → Checkbox-CditB77B.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-DtJxGiSg.js → Codegen-Ds0UZWZG.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-4wGBC25p.js → Col-CZlj1XI2.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-dOCSc8t-.js → Community-j4B2SoT6.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-Du4kXsyN.js → Compact-BuKQutaO.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-BbI5XMcz.js → Compliance-DAgDyS-p.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-CbQRpyiK.js → Cowork-DX2-I6V3.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-CtWy2bMC.js → Cron-dJpc-FxX.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-CzdM5hF6.js → Crosschain-7m8euM3v.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-CcBboBJN.js → DID-CLoYoCe1.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-I7m0oCeC.js → Dashboard-DR1rRMb7.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-CKIy2Ikn.js → Dropdown-BsKhCfvH.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-BNuxCq89.js → EmailListRenderer-BAGexzJu.js} +1 -1
  29. package/src/assets/web-panel/assets/EvolutionSettings-BqYYmC01.js +1 -0
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-QThmET-n.js → FamilyGuardDashboard-BIpueefy.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-Bqf7YYlV.js → Federation-BluNep6d.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DZAM28ve.js → FormItemContext-CerdM3am.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DunXFYML.js → GenericCardRenderer-DXh4tOjU.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BgwOjaMf.js → Git-CEE0cGmf.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-B1za4wCP.js → Governance-Bc-XNDhM.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-DMPqX1oN.js → Inference-CiBzXyZ-.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-ChDn3okr.js → KnowledgeGraph-CV2IiyuN.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-BQoPB6-O.js → Logs-fbQYKuSz.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-B73ZyMRI.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-DZXEaPpe.js → Marketplace-C5utdpxZ.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-CZbVOFaG.js → McpTools-CPE4SaF3.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-Cl3T8asu.js → Memory-DTFDszzk.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-DK_ayU9I.js → MobileBridge-DxqPmTzP.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-DEWAA2gT.js → MobileProjects-CwcK8l2y.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-z-XAWzMh.js → Mtc-DrjECLGO.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-CX7qJvQS.js → MtcAudit-4IURCa-3.js} +5 -5
  47. package/src/assets/web-panel/assets/{Multisig-DiQlKgxx.js → Multisig-CggLV1Cp.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-Ciuxcu00.js → NLProgramming-DkOQJT73.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BAvqNw_6.js → Notes-Dodcva6s.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-DkHDTslA.js → NotificationSettings-CQ3HeTs6.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer--WZdD2oV.js → OrderTableRenderer-pT2nzmIO.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-Bv6bMLCe.js → Organization-B6HFsIfU.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-Bwoz_oq1.js → Overflow-G9dju55N.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-De7T0ZeB.js → P2P-C1BCE155.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-Dblr2x25.js → PdhVaultBrowser-BFAxXn5D.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-C-jAt-cg.js → Permissions-DWg7cw9Q.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-yXeXDMgf.js → PersonalDataHub-BQxuOQOO.js} +3 -3
  58. package/src/assets/web-panel/assets/{Pipeline-C8CYoLOa.js → Pipeline-C3Gse9Ne.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-B-gwnOGT.js → Privacy-Dcsjx6Oi.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-CbNjHiBV.js → ProjectInit-DeYlnXJQ.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-BMUY0GCP.js → ProjectSettings-D7kbZ_K7.js} +2 -2
  62. package/src/assets/web-panel/assets/Projects-C5m3NGzM.js +1 -0
  63. package/src/assets/web-panel/assets/{Providers-K_tlWkON.js → Providers-oT6jy83z.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-2RSZDzJI.js → QrScannerModal-NZ11GEBa.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-mhbcQRMI.js → QuickAsk-CtQU4Tx0.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BXm0uG0q.js → Recommend-3CoXYu3O.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-xhOpmNZG.js → RemoteSession-C2d4LzBM.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-CwbCWB-3.js → Reputation-WZQHrGwl.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-BdAjmDBO.js → Row-ChiqY7Hg.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-Cq4LZ9WU.js → RssFeed-Cjwl2Kum.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-C_I6B-4l.js → Search-DRDMZxTF.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-CdH6mzL-.js → Security-D0y4LlQ4.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-CWu1wqtS.js → Services-ChpkqWm0.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-daw9DiVM.js → Skeleton-D3WGZ8yO.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-CmurIxkM.js → Skills-Bv_7HaUW.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-cETA5aPO.js → Sla-crZMKyX0.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-B1llZgu3.js → SpeechSettings-ByWn5XDZ.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-DufZ-B2q.js → SyncSettings--R55vxvj.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-PfRLKTFY.js → Tasks-BZA_Via_.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-DGtz-vT8.js → Templates-9eJ9yY8Q.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-JeKYLN0b.js → Tenant-CfWX2jqj.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-BiMsF2Y0.js → Terminal-CUXUF4kL.js} +2 -2
  83. package/src/assets/web-panel/assets/TimelineRenderer-77y9bkYN.js +1 -0
  84. package/src/assets/web-panel/assets/{Tokens-DpIg-0ju.js → Tokens-CvyrdLH6.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-DreKHxyb.js → Trigger-MNRl_YNr.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-D7ByQvBQ.js → Trust-BHOXK-Mp.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-OudyQByy.js → UkeySign-Bz1oZNyQ.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-BhU6nzCF.js → VideoEditing-DlqmXyZv.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-BCEpB6E0.js → Wallet-Dg1rnqEG.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DwjAM5Mr.js → WebAuthn-DJtGeaOk.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-ChQqlAmY.js → WorkflowEditor-DJPubjX5.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-CzUKWqTy.js → chat-BWweDuIV.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-D3Y_Pvu4.js → colors-BX5ViADF.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-ByyPRfkA.js → compact-item-Df8MLbXp.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-Dt5PF6VI.js → createContext-C0FDTwdV.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-BgM5vq1s.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-BuIaEKuC.js → hasIn-PpL6GdNk.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DWW5svXU.js → index-7VyVOEf7.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-NFqKQquS.js → index-B3K1uZ7R.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DHzVIQLX.js → index-B4UxFB2N.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BztqxXMP.js → index-B8-pSyP7.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-B600riYP.js → index-B982oUKN.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CFXZ9lbO.js → index-BF0ERucU.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BmVY2f7I.js → index-BMIEWinN.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-EtrWRKu2.js → index-BWSCphaT.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DSXjiZAV.js → index-BeFhy4BX.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CgPKUSe4.js → index-Beh1kLwx.js} +1 -1
  108. package/src/assets/web-panel/assets/index-Bl-HTXWn.js +1 -0
  109. package/src/assets/web-panel/assets/{index-D51wU4q-.js → index-C0PqPK-8.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Di78LDr8.js → index-C2JU-gdS.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-_oJnnOnZ.js → index-C8wl7Ica.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CZX4_hGp.js → index-C9FOwTgX.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Dlec7Sr4.js → index-C9N1u8jV.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BcqZAAr5.js → index-Cf86RSQk.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BwlY7Yap.js → index-ChV82mzs.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CmrfHS36.js → index-Cj00JSqq.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-GyTOYTFg.js → index-Cm7vZvA3.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DSgroT-P.js → index-CmMzB4C-.js} +3 -3
  119. package/src/assets/web-panel/assets/{index-BSWTyRhI.js → index-CxY_U5RT.js} +1 -1
  120. package/src/assets/web-panel/assets/index-Cxf0YfM5.js +1 -0
  121. package/src/assets/web-panel/assets/{index-COsjgjvP.js → index-D5Ei75Wt.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BdvZNMNm.js → index-DBzaRg4E.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-F-T8AHeo.js → index-DFtzEEYe.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DxVLI-Iu.js → index-DGLbojjx.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-D7QSTEjb.js → index-D_6XIMVV.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-1YgdY0Vq.js → index-DddQd0_V.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-Cb7MzML-.js → index-DwZkBGXd.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-gg5zO3aD.js → index-DxJqyIP8.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-huWw0XBb.js → index-Dy8K2laU.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DpAqy6Co.js → index-FAZH69my.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CByWkXdO.js → index-NdEUFm32.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BO29sPX8.js → index-P1ERNJla.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-CCBm8_o4.js → index-R0LQ3fgq.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CAfX0VyL.js → index-UXM5vpt4.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CDTS4qJm.js → index-iif2A1eL.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-BFQGN97S.js → index-itNn6pW1.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-Bny6G13G.js → initDefaultProps-DeMthvi4.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-DRhRj_uM.js → motion-_7kbkzE0.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-D0wKnhYr.js → move-gCI04pLw.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-BXXSTJBk.js → mtc-parser-D5UWHv2U.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-d8t9Yze4.js → omit-CDCZcqeS.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-nyB6BMe6.js → pickAttrs-DGMDLi3S.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-CSFyBNA2.js → placementArrow-C-3vC1Vh.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-DYmiKhJa.js → responsiveObserve-vdoYucvi.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-D4KZSRmt.js → slide-B62FhgyZ.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-BcrcPeFm.js → statusUtils-DCLlfnym.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-BFgOb1vz.js → styleChecker-CGvQ4LRR.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-DQ5qSQlN.js → useFlexGapSupport-BqkGoKwe.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-Cafq069l.js → useFs-Bkr_nU3q.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-DTma9Ary.js → usePersonalDataHub-CYxMIUEq.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-HvC2-bE9.js → vnode-sAbcY1FX.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-AZxADWXu.js → zoom-Dm2pLrXi.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +1 -1
  155. package/src/commands/agent.js +29 -0
  156. package/src/commands/setup.js +35 -10
  157. package/src/constants.js +15 -89
  158. package/src/data/changelog.json +14 -1
  159. package/src/lib/bm25-search.js +6 -3
  160. package/src/lib/coding-task-guidance.js +6 -1
  161. package/src/lib/context-memory-kernel/memory-query-index.js +35 -17
  162. package/src/lib/goal-check-evidence.js +159 -0
  163. package/src/lib/goal-condition-engine.js +24 -2
  164. package/src/lib/llm-connection-probe.js +48 -4
  165. package/src/lib/llm-onboarding-catalog.json +131 -0
  166. package/src/lib/skill-retrieval-router.js +2 -1
  167. package/src/lib/skill-search-tokenizer.js +143 -0
  168. package/src/repl/agent-repl.js +8 -4
  169. package/src/runtime/agent-core.js +87 -7
  170. package/src/runtime/headless-runner.js +138 -66
  171. package/src/runtime/headless-stream.js +1 -0
  172. package/src/runtime/mcp-tool-search-ranking.js +142 -0
  173. package/src/runtime/mcp-tool-search.js +198 -60
  174. package/src/assets/web-panel/assets/Artifacts-DfxY2Gqs.js +0 -1
  175. package/src/assets/web-panel/assets/ChatBubbleRenderer-CnpWe3dp.js +0 -1
  176. package/src/assets/web-panel/assets/EvolutionSettings-BeBovLZs.js +0 -1
  177. package/src/assets/web-panel/assets/MarkdownRenderer-uS1yHX12.js +0 -1
  178. package/src/assets/web-panel/assets/Projects-DpCaWXv6.js +0 -1
  179. package/src/assets/web-panel/assets/TimelineRenderer-DhcBAGPg.js +0 -1
  180. package/src/assets/web-panel/assets/devWarning-BgSxkkQ3.js +0 -1
  181. package/src/assets/web-panel/assets/index-D5v6roiB.js +0 -1
  182. package/src/assets/web-panel/assets/index-DgXZCvH5.js +0 -1
@@ -0,0 +1,131 @@
1
+ {
2
+ "schema": "chainlesschain.llm-onboarding-catalog/v1",
3
+ "capabilityCatalogVersion": "2026-10-15",
4
+ "scope": "new-connections",
5
+ "runtimeVerified": false,
6
+ "accountVerified": false,
7
+ "providers": [
8
+ {
9
+ "id": "volcengine",
10
+ "label": "Volcengine / Doubao (volcengine)",
11
+ "cliLabel": "Volcengine (火山引擎/豆包)",
12
+ "baseUrl": "https://ark.cn-beijing.volces.com/api/v3",
13
+ "defaultModel": "deepseek-v4-1-flash-260910",
14
+ "needsKey": true,
15
+ "visionModel": "doubao-seed-2-0-lite-260215"
16
+ },
17
+ {
18
+ "id": "ollama",
19
+ "label": "Ollama (local, no key)",
20
+ "cliLabel": "Ollama (本地部署)",
21
+ "baseUrl": "http://localhost:11434",
22
+ "defaultModel": "qwen2.5:7b",
23
+ "needsKey": false,
24
+ "visionModel": ""
25
+ },
26
+ {
27
+ "id": "anthropic",
28
+ "label": "Anthropic Claude",
29
+ "cliLabel": "Anthropic (Claude)",
30
+ "baseUrl": "https://api.anthropic.com/v1",
31
+ "defaultModel": "claude-sonnet-5-5",
32
+ "needsKey": true,
33
+ "visionModel": ""
34
+ },
35
+ {
36
+ "id": "openai",
37
+ "label": "OpenAI",
38
+ "baseUrl": "https://api.openai.com/v1",
39
+ "defaultModel": "gpt-6.1-sol",
40
+ "needsKey": true,
41
+ "visionModel": ""
42
+ },
43
+ {
44
+ "id": "deepseek",
45
+ "label": "DeepSeek",
46
+ "baseUrl": "https://api.deepseek.com/v1",
47
+ "defaultModel": "deepseek-chat",
48
+ "needsKey": true,
49
+ "visionModel": ""
50
+ },
51
+ {
52
+ "id": "dashscope",
53
+ "label": "Aliyun Bailian / Tongyi (dashscope)",
54
+ "cliLabel": "DashScope (阿里通义)",
55
+ "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
56
+ "defaultModel": "qwen-max",
57
+ "needsKey": true,
58
+ "visionModel": ""
59
+ },
60
+ {
61
+ "id": "kimi",
62
+ "label": "Moonshot Kimi",
63
+ "cliLabel": "Kimi (月之暗面)",
64
+ "baseUrl": "https://api.moonshot.cn/v1",
65
+ "defaultModel": "moonshot-v1-auto",
66
+ "needsKey": true,
67
+ "visionModel": ""
68
+ },
69
+ {
70
+ "id": "gemini",
71
+ "label": "Google Gemini",
72
+ "baseUrl": "https://generativelanguage.googleapis.com/v1beta",
73
+ "defaultModel": "gemini-2.0-flash",
74
+ "needsKey": true,
75
+ "visionModel": ""
76
+ },
77
+ {
78
+ "id": "mistral",
79
+ "label": "Mistral",
80
+ "cliLabel": "Mistral AI",
81
+ "baseUrl": "https://api.mistral.ai/v1",
82
+ "defaultModel": "mistral-large-latest",
83
+ "needsKey": true,
84
+ "visionModel": ""
85
+ },
86
+ {
87
+ "id": "minimax",
88
+ "label": "MiniMax",
89
+ "cliLabel": "MiniMax (海螺AI)",
90
+ "baseUrl": "https://api.minimax.chat/v1",
91
+ "defaultModel": "MiniMax-Text-01",
92
+ "needsKey": true,
93
+ "visionModel": ""
94
+ },
95
+ {
96
+ "id": "openai-proxy",
97
+ "label": "OpenAI compatible gateway",
98
+ "cliLabel": "OpenAI 中转站 (API2D/CloseAI等)",
99
+ "baseUrl": "",
100
+ "defaultModel": "gpt-4o",
101
+ "needsKey": true,
102
+ "isProxy": true
103
+ },
104
+ {
105
+ "id": "anthropic-proxy",
106
+ "label": "Anthropic compatible gateway",
107
+ "cliLabel": "Anthropic 中转站 (Claude代理)",
108
+ "baseUrl": "",
109
+ "defaultModel": "claude-sonnet-4-6",
110
+ "needsKey": true,
111
+ "isProxy": true
112
+ },
113
+ {
114
+ "id": "gemini-proxy",
115
+ "label": "Gemini compatible gateway",
116
+ "cliLabel": "Gemini 中转站 (Google代理)",
117
+ "baseUrl": "",
118
+ "defaultModel": "gemini-2.0-flash",
119
+ "needsKey": true,
120
+ "isProxy": true
121
+ },
122
+ {
123
+ "id": "custom",
124
+ "label": "Custom provider (vLLM / TGI / compatible service)",
125
+ "cliLabel": "自定义 Provider (自建服务/vLLM/TGI等)",
126
+ "baseUrl": "",
127
+ "defaultModel": "",
128
+ "needsKey": true
129
+ }
130
+ ]
131
+ }
@@ -1,4 +1,5 @@
1
1
  import { BM25Search } from "./bm25-search.js";
2
+ import { tokenizeSkillSearchText } from "./skill-search-tokenizer.js";
2
3
  import { captureSkillRetrievalRevocationReader } from "./evolution/skill-retrieval-revocation-authority.js";
3
4
 
4
5
  export const SKILL_RETRIEVAL_RESULT_SCHEMA =
@@ -150,7 +151,7 @@ export function routeSkillDescriptors({
150
151
  admitted.push({ skill, digest });
151
152
  }
152
153
 
153
- const bm25 = new BM25Search({ language: "auto" });
154
+ const bm25 = new BM25Search({ tokenizer: tokenizeSkillSearchText });
154
155
  bm25.indexDocuments(
155
156
  admitted.map(({ skill, digest }) => ({
156
157
  id: digest,
@@ -0,0 +1,143 @@
1
+ // Descriptor retrieval only. Skill bodies and execution admission never enter
2
+ // this tokenizer. Keep the generic RAG tokenizer unchanged.
3
+ const segmenter = new Intl.Segmenter("zh", { granularity: "word" });
4
+ const stopWords = new Set([
5
+ "a",
6
+ "an",
7
+ "the",
8
+ "is",
9
+ "are",
10
+ "was",
11
+ "were",
12
+ "be",
13
+ "been",
14
+ "being",
15
+ "have",
16
+ "has",
17
+ "had",
18
+ "do",
19
+ "does",
20
+ "did",
21
+ "will",
22
+ "would",
23
+ "could",
24
+ "should",
25
+ "may",
26
+ "might",
27
+ "shall",
28
+ "can",
29
+ "to",
30
+ "of",
31
+ "in",
32
+ "for",
33
+ "on",
34
+ "with",
35
+ "at",
36
+ "by",
37
+ "from",
38
+ "as",
39
+ "into",
40
+ "through",
41
+ "during",
42
+ "before",
43
+ "after",
44
+ "above",
45
+ "below",
46
+ "between",
47
+ "but",
48
+ "and",
49
+ "or",
50
+ "not",
51
+ "no",
52
+ "nor",
53
+ "so",
54
+ "if",
55
+ "then",
56
+ "than",
57
+ "too",
58
+ "very",
59
+ "just",
60
+ "about",
61
+ "up",
62
+ "out",
63
+ "it",
64
+ "its",
65
+ "this",
66
+ "that",
67
+ "these",
68
+ "those",
69
+ "i",
70
+ "me",
71
+ "my",
72
+ "we",
73
+ "our",
74
+ "you",
75
+ "your",
76
+ "he",
77
+ "him",
78
+ "his",
79
+ "she",
80
+ "her",
81
+ "they",
82
+ "them",
83
+ "their",
84
+ "what",
85
+ "which",
86
+ "please",
87
+ "help",
88
+ "请",
89
+ "请问",
90
+ "帮",
91
+ "帮我",
92
+ "我",
93
+ "我要",
94
+ "需要",
95
+ "如何",
96
+ "怎么",
97
+ "一下",
98
+ "一个",
99
+ "的",
100
+ "在",
101
+ "中",
102
+ "和",
103
+ "并",
104
+ "给",
105
+ "为",
106
+ "从",
107
+ "将",
108
+ "把",
109
+ "进行",
110
+ "可以",
111
+ "使用",
112
+ ]);
113
+
114
+ export function tokenizeSkillSearchText(text) {
115
+ if (typeof text !== "string" || !text) return [];
116
+ const unicodeNormalized = text.normalize("NFKC");
117
+ const identifiers = [];
118
+ for (const part of segmenter.segment(unicodeNormalized)) {
119
+ if (
120
+ part.isWordLike &&
121
+ /_|[\p{Ll}\p{N}]\p{Lu}|\p{Lu}\p{Lu}\p{Ll}/u.test(part.segment)
122
+ ) {
123
+ identifiers.push(part.segment.toLowerCase());
124
+ }
125
+ }
126
+ // Split acronym and camel-case boundaries before lowercasing; punctuation
127
+ // already separates kebab/snake identifiers in the word segmenter.
128
+ const normalized = unicodeNormalized
129
+ .replace(/([\p{Lu}])([\p{Lu}][\p{Ll}])/gu, "$1 $2")
130
+ .replace(/([\p{Ll}\p{N}])([\p{Lu}])/gu, "$1 $2")
131
+ .toLowerCase();
132
+ const tokens = [];
133
+ for (const part of segmenter.segment(normalized)) {
134
+ if (!part.isWordLike) continue;
135
+ // Intl keeps snake_case as a single word, while user queries use spaces.
136
+ for (const word of part.segment.split("_")) {
137
+ if (word && !stopWords.has(word)) tokens.push(word);
138
+ }
139
+ }
140
+ // Retain literal compound names too, so lowercase exact-name searches still
141
+ // work after adding their natural-language word boundaries.
142
+ return [...tokens, ...identifiers];
143
+ }
@@ -4430,11 +4430,15 @@ async function startAgentReplInWorkspaceOwned(
4430
4430
  // for this session via the shared mcp-config engine. Holds {mcpClient,
4431
4431
  // extraToolDefinitions, externalToolExecutors, externalToolDescriptors}.
4432
4432
  let _adhocMcp = null;
4433
+ let _projectMcpToolDefinitions = (definitions) => definitions;
4433
4434
  const _persistReplContextSources = () => {
4434
4435
  if (!useJsonl || !sessionId) return false;
4435
4436
  _replSkillCacheLedger =
4436
4437
  _replSkillLoader.getCacheLedger?.() || _replSkillCacheLedger;
4437
- const mcpDefinitions = _adhocMcp?.extraToolDefinitions || [];
4438
+ const mcpDefinitions = _projectMcpToolDefinitions(
4439
+ _adhocMcp?.extraToolDefinitions || [],
4440
+ _adhocMcp?.externalToolExecutors,
4441
+ );
4438
4442
  if (
4439
4443
  mcpDefinitions.length === 0 &&
4440
4444
  _loadedReplPersonaSkills.length === 0 &&
@@ -4656,9 +4660,9 @@ async function startAgentReplInWorkspaceOwned(
4656
4660
  // MCP tool search (context scaling): defer big tool schemas behind the
4657
4661
  // internal tool_search tool. Below-threshold / disabled → no-op.
4658
4662
  try {
4659
- const { maybeApplyToolSearch } = await import(
4660
- "../runtime/mcp-tool-search.js"
4661
- );
4663
+ const { maybeApplyToolSearch, projectMcpToolDefinitions } =
4664
+ await import("../runtime/mcp-tool-search.js");
4665
+ _projectMcpToolDefinitions = projectMcpToolDefinitions;
4662
4666
  const ts = maybeApplyToolSearch(_adhocMcp, {
4663
4667
  model,
4664
4668
  provider,
@@ -65,7 +65,10 @@ import {
65
65
  copyHostToolOutputIdentity,
66
66
  } from "../lib/tool-result-preview.js";
67
67
  import { DIAGNOSTIC_WORKFLOW_GUIDANCE } from "../lib/diagnostic-workflow.js";
68
- import { CODING_TASK_QUALITY_GUIDANCE } from "../lib/coding-task-guidance.js";
68
+ import {
69
+ CODING_TASK_QUALITY_GUIDANCE,
70
+ CODING_CHANGE_REVIEW_PROMPT,
71
+ } from "../lib/coding-task-guidance.js";
69
72
  import { RemoteReadLoopGuard } from "../lib/remote-read-loop-guard.js";
70
73
  import {
71
74
  isPrActionRequest,
@@ -198,7 +201,11 @@ import {
198
201
  toOllamaMessages,
199
202
  imageUrlBlockToAnthropic,
200
203
  } from "../lib/image-input.js";
201
- import { executeToolSearch, gateDeferredMcpCall } from "./mcp-tool-search.js";
204
+ import {
205
+ executeToolSearch,
206
+ gateDeferredMcpCall,
207
+ projectMcpToolDefinitions,
208
+ } from "./mcp-tool-search.js";
202
209
  import {
203
210
  emitHooksV2Event,
204
211
  executeHooksV2Event,
@@ -9669,7 +9676,9 @@ async function executeToolInner(
9669
9676
  // local — same risk class as list_skills, so no approval gate.
9670
9677
  if (localToolExecutor?.kind === "tool-search") {
9671
9678
  return attachDescriptor(
9672
- executeToolSearch(localToolExecutor.registry, args || {}),
9679
+ executeToolSearch(localToolExecutor.registry, args || {}, {
9680
+ allowedToolNames: effectiveAllowedToolNames,
9681
+ }),
9673
9682
  );
9674
9683
  }
9675
9684
 
@@ -12010,6 +12019,13 @@ function getEffectiveToolDefinitions(options = {}) {
12010
12019
  });
12011
12020
  }
12012
12021
 
12022
+ function getProviderToolDefinitions(options = {}) {
12023
+ return projectMcpToolDefinitions(
12024
+ getEffectiveToolDefinitions(options),
12025
+ options.externalToolExecutors,
12026
+ );
12027
+ }
12028
+
12013
12029
  const PROVIDER_REQUEST_ID_RE = /^[\x21-\x7e]{1,512}$/;
12014
12030
 
12015
12031
  function _normalizeProviderRequestId(value) {
@@ -12109,7 +12125,7 @@ export async function chatWithTools(rawMessages, options) {
12109
12125
  options.providerRequestId,
12110
12126
  );
12111
12127
 
12112
- let tools = getEffectiveToolDefinitions(options);
12128
+ let tools = getProviderToolDefinitions(options);
12113
12129
  if (Array.isArray(options.contextMemorySelectedToolNames)) {
12114
12130
  const selected = new Set(options.contextMemorySelectedToolNames);
12115
12131
  tools = tools.filter((tool) => selected.has(tool?.function?.name));
@@ -14704,6 +14720,9 @@ export async function* agentLoop(messages, options) {
14704
14720
  // obligation outside transcript compaction and never replay it automatically.
14705
14721
  const pendingSubtreeMutations = new Map();
14706
14722
  let subtreeMutationReprompted = false;
14723
+ let hasFileContentChanges = false;
14724
+ // Headless outer turns share this object; a new user turn gets a fresh one.
14725
+ const changeReviewState = options._changeReviewState || { requested: false };
14707
14726
  const recordSubtreeMutation = (tool, args, result) => {
14708
14727
  if (!GUARDED_FILE_MUTATION_TOOLS.has(tool)) return;
14709
14728
  if (!args || typeof args !== "object" || Array.isArray(args)) return;
@@ -14747,6 +14766,7 @@ export async function* agentLoop(messages, options) {
14747
14766
  result.mutationPerformed !== false
14748
14767
  ) {
14749
14768
  pendingSubtreeMutations.delete(key);
14769
+ if (effect === "file-content") hasFileContentChanges = true;
14750
14770
  }
14751
14771
  };
14752
14772
  const signal = options.signal || null;
@@ -16209,7 +16229,7 @@ export async function* agentLoop(messages, options) {
16209
16229
  {
16210
16230
  ...options,
16211
16231
  contextMemoryToolDefinitions:
16212
- getEffectiveToolDefinitions(iterationToolOptions),
16232
+ getProviderToolDefinitions(iterationToolOptions),
16213
16233
  contextMemoryTrustedSystemIndexes,
16214
16234
  },
16215
16235
  );
@@ -16237,15 +16257,29 @@ export async function* agentLoop(messages, options) {
16237
16257
  "model",
16238
16258
  budget.consumed,
16239
16259
  );
16260
+ // A review may replace the first completion. Keep streaming transport but
16261
+ // discard live text/thinking in this opt-in mode; only the accepted final
16262
+ // response is published. This avoids concatenating drafts in IDE clients
16263
+ // without buffering unbounded provider output or changing the protocol.
16264
+ const outputOptions =
16265
+ options.reviewChanges === true
16266
+ ? {
16267
+ ...iterationToolOptions,
16268
+ onToken:
16269
+ typeof options.onToken === "function" ? () => {} : undefined,
16270
+ onThinking:
16271
+ typeof options.onThinking === "function" ? () => {} : undefined,
16272
+ }
16273
+ : iterationToolOptions;
16240
16274
  const plannedProviderOptions = canonicalProviderContext?.plan
16241
16275
  ? {
16242
- ...iterationToolOptions,
16276
+ ...outputOptions,
16243
16277
  contextEngine: null,
16244
16278
  contextMemoryPreplanned: true,
16245
16279
  contextMemorySelectedToolNames:
16246
16280
  canonicalProviderContext.selectedToolNames,
16247
16281
  }
16248
- : iterationToolOptions;
16282
+ : outputOptions;
16249
16283
  const requestOptions = providerRequestId
16250
16284
  ? { ...plannedProviderOptions, providerRequestId }
16251
16285
  : plannedProviderOptions;
@@ -16258,6 +16292,23 @@ export async function* agentLoop(messages, options) {
16258
16292
  ? { ...requestOptions, evolutionIngress }
16259
16293
  : requestOptions),
16260
16294
  };
16295
+ const originalExtraTools = requestOptions.extraToolDefinitions;
16296
+ if (Array.isArray(originalExtraTools)) {
16297
+ const projectedExtraTools = projectMcpToolDefinitions(
16298
+ originalExtraTools,
16299
+ requestOptions.externalToolExecutors,
16300
+ );
16301
+ if (projectedExtraTools !== originalExtraTools) {
16302
+ const admittedNames = new Set(
16303
+ getEffectiveToolDefinitions(requestOptions).map(
16304
+ (tool) => tool.function.name,
16305
+ ),
16306
+ );
16307
+ providerCallOptions.extraToolDefinitions = projectedExtraTools.filter(
16308
+ (tool) => admittedNames.has(tool.function.name),
16309
+ );
16310
+ }
16311
+ }
16261
16312
  const modelUsageCall = {
16262
16313
  type: "model-usage-started",
16263
16314
  callId: _newModelUsageCallId("model"),
@@ -16414,6 +16465,7 @@ export async function* agentLoop(messages, options) {
16414
16465
  contextWindow: requestContextWindow,
16415
16466
  };
16416
16467
  } else {
16468
+ changeReviewState.usageKnown = false;
16417
16469
  yield {
16418
16470
  type: "model-usage-unknown",
16419
16471
  callId: modelUsageCall.callId,
@@ -16602,6 +16654,34 @@ export async function* agentLoop(messages, options) {
16602
16654
  };
16603
16655
  return;
16604
16656
  }
16657
+ // Opt-in review uses the same loop, tools, usage settlement and budget.
16658
+ // Never emit a provisional completion or turn this self-check into an
16659
+ // acceptance verdict. Failed/deferred writes do not arm the review.
16660
+ if (
16661
+ options.reviewChanges === true &&
16662
+ hasFileContentChanges &&
16663
+ !changeReviewState.requested &&
16664
+ changeReviewState.usageKnown !== false &&
16665
+ budget.hasRemaining()
16666
+ ) {
16667
+ throwIfAborted(signal);
16668
+ changeReviewState.requested = true;
16669
+ messages.push(
16670
+ markRuntimeOnlySessionMessage({
16671
+ role: "assistant",
16672
+ content: msg.content || "",
16673
+ }),
16674
+ markRuntimeOnlySessionMessage({
16675
+ role: "user",
16676
+ content: CODING_CHANGE_REVIEW_PROMPT,
16677
+ }),
16678
+ );
16679
+ yield {
16680
+ type: "iteration-warning",
16681
+ message: "Reviewing changed files against the task before finishing.",
16682
+ };
16683
+ continue;
16684
+ }
16605
16685
  // Surface the final answer's extended-thinking reasoning (Anthropic, when
16606
16686
  // --think is on) so non-streaming consumers (the REPL) can show it. The
16607
16687
  // streaming path forwards reasoning live via onThinking instead.