chainlesschain 0.166.126 → 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 (199) hide show
  1. package/README.md +31 -3
  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/.build-hash +1 -1
  6. package/src/assets/web-panel/assets/{AIOps-C6HzxpS_.js → AIOps-BmGA5zXX.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-Ba2WP_mo.js → ActionButton-B7WXwoF0.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-MEZ-eSYO.js → Analytics-IvJG43B5.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-B1F4dMJl.js → AppLayout-DWY017_e.js} +5 -5
  10. package/src/assets/web-panel/assets/Artifacts-BOyohM_-.js +1 -0
  11. package/src/assets/web-panel/assets/{Audit-GzrP6OYx.js → Audit-CD9sTnBN.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-PJ3RWIS5.js → BackgroundAgents-J6gg5z0U.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-DV0wK73Y.js → Backup-D7ik3lse.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-BqWPlsK1.js → BaseInput-MrDd5zcz.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-D0yNPOid.js → Chat-DbxRqGiK.js} +5 -5
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-D0De01yM.js → ChatBubbleRenderer-DbeJAwMg.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-GOdS6Fpz.js → Checkbox-CditB77B.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-CcvPMAwP.js → Codegen-Ds0UZWZG.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-07yH3vgP.js → Col-CZlj1XI2.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-cZI0W7u_.js → Community-j4B2SoT6.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-BP6fwhXB.js → Compact-BuKQutaO.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-BvwQCjXA.js → Compliance-DAgDyS-p.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-yhhvyKZU.js → Cowork-DX2-I6V3.js} +3 -3
  24. package/src/assets/web-panel/assets/{Cron-Bpji2uez.js → Cron-dJpc-FxX.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-BZ7XwkuS.js → Crosschain-7m8euM3v.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-BJ-Fw-Uk.js → DID-CLoYoCe1.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-3FbsaKoR.js → Dashboard-DR1rRMb7.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-DP8yuWyM.js → Dropdown-BsKhCfvH.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-Co3i-4ca.js → EmailListRenderer-BAGexzJu.js} +1 -1
  30. package/src/assets/web-panel/assets/EvolutionSettings-BqYYmC01.js +1 -0
  31. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CPjecSCb.js → FamilyGuardDashboard-BIpueefy.js} +1 -1
  32. package/src/assets/web-panel/assets/{Federation-CJkZPulM.js → Federation-BluNep6d.js} +1 -1
  33. package/src/assets/web-panel/assets/{FormItemContext-CU0YWiAZ.js → FormItemContext-CerdM3am.js} +1 -1
  34. package/src/assets/web-panel/assets/{GenericCardRenderer-kTxvvpiU.js → GenericCardRenderer-DXh4tOjU.js} +1 -1
  35. package/src/assets/web-panel/assets/{Git-Cs6SFvMq.js → Git-CEE0cGmf.js} +2 -2
  36. package/src/assets/web-panel/assets/{Governance-CSs_8thn.js → Governance-Bc-XNDhM.js} +1 -1
  37. package/src/assets/web-panel/assets/{Inference-D7yCromD.js → Inference-CiBzXyZ-.js} +1 -1
  38. package/src/assets/web-panel/assets/{KnowledgeGraph-C6BcMDRm.js → KnowledgeGraph-CV2IiyuN.js} +1 -1
  39. package/src/assets/web-panel/assets/{Logs-Cz20G07I.js → Logs-fbQYKuSz.js} +2 -2
  40. package/src/assets/web-panel/assets/MarkdownRenderer-B73ZyMRI.js +1 -0
  41. package/src/assets/web-panel/assets/{Marketplace-BZIopTsG.js → Marketplace-C5utdpxZ.js} +1 -1
  42. package/src/assets/web-panel/assets/{McpTools-OHaHium7.js → McpTools-CPE4SaF3.js} +3 -3
  43. package/src/assets/web-panel/assets/{Memory-DBNBmoM9.js → Memory-DTFDszzk.js} +2 -2
  44. package/src/assets/web-panel/assets/{MobileBridge-BH-ajP-j.js → MobileBridge-DxqPmTzP.js} +1 -1
  45. package/src/assets/web-panel/assets/{MobileProjects-DwiFGqpp.js → MobileProjects-CwcK8l2y.js} +1 -1
  46. package/src/assets/web-panel/assets/{Mtc-BmT_VyZL.js → Mtc-DrjECLGO.js} +2 -2
  47. package/src/assets/web-panel/assets/{MtcAudit-D24wmjmR.js → MtcAudit-4IURCa-3.js} +5 -5
  48. package/src/assets/web-panel/assets/{Multisig-DwWj1F8f.js → Multisig-CggLV1Cp.js} +3 -3
  49. package/src/assets/web-panel/assets/{NLProgramming-DXBRBwhU.js → NLProgramming-DkOQJT73.js} +1 -1
  50. package/src/assets/web-panel/assets/{Notes-C1QG3x5c.js → Notes-Dodcva6s.js} +3 -3
  51. package/src/assets/web-panel/assets/{NotificationSettings-BnlSMFBJ.js → NotificationSettings-CQ3HeTs6.js} +1 -1
  52. package/src/assets/web-panel/assets/{OrderTableRenderer-uuW0wQc0.js → OrderTableRenderer-pT2nzmIO.js} +1 -1
  53. package/src/assets/web-panel/assets/{Organization-CXGC9RYr.js → Organization-B6HFsIfU.js} +4 -4
  54. package/src/assets/web-panel/assets/{Overflow-C3RxcBqQ.js → Overflow-G9dju55N.js} +1 -1
  55. package/src/assets/web-panel/assets/{P2P-DTh-AqFm.js → P2P-C1BCE155.js} +2 -2
  56. package/src/assets/web-panel/assets/{PdhVaultBrowser-IX0sEKne.js → PdhVaultBrowser-BFAxXn5D.js} +3 -3
  57. package/src/assets/web-panel/assets/{Permissions-CpcyEP_G.js → Permissions-DWg7cw9Q.js} +4 -4
  58. package/src/assets/web-panel/assets/{PersonalDataHub-I5zN_SIn.js → PersonalDataHub-BQxuOQOO.js} +3 -3
  59. package/src/assets/web-panel/assets/{Pipeline-CVg3gNFN.js → Pipeline-C3Gse9Ne.js} +1 -1
  60. package/src/assets/web-panel/assets/{Privacy-Dffk2pq9.js → Privacy-Dcsjx6Oi.js} +1 -1
  61. package/src/assets/web-panel/assets/{ProjectInit-B8Y3VsbN.js → ProjectInit-DeYlnXJQ.js} +2 -2
  62. package/src/assets/web-panel/assets/{ProjectSettings-Ds_4fCFG.js → ProjectSettings-D7kbZ_K7.js} +2 -2
  63. package/src/assets/web-panel/assets/{Projects-BlyQuiCs.js → Projects-C5m3NGzM.js} +1 -1
  64. package/src/assets/web-panel/assets/{Providers-CI9tKh8S.js → Providers-oT6jy83z.js} +1 -1
  65. package/src/assets/web-panel/assets/{QrScannerModal-DOrmL6X3.js → QrScannerModal-NZ11GEBa.js} +1 -1
  66. package/src/assets/web-panel/assets/{QuickAsk-CSSlopeF.js → QuickAsk-CtQU4Tx0.js} +1 -1
  67. package/src/assets/web-panel/assets/{Recommend-fKDWVJgw.js → Recommend-3CoXYu3O.js} +1 -1
  68. package/src/assets/web-panel/assets/{RemoteSession-BKlbq1C0.js → RemoteSession-C2d4LzBM.js} +3 -3
  69. package/src/assets/web-panel/assets/{Reputation-DhOFTKRG.js → Reputation-WZQHrGwl.js} +1 -1
  70. package/src/assets/web-panel/assets/{Row-ckVQk62z.js → Row-ChiqY7Hg.js} +1 -1
  71. package/src/assets/web-panel/assets/{RssFeed-CShivptZ.js → RssFeed-Cjwl2Kum.js} +2 -2
  72. package/src/assets/web-panel/assets/{Search-PJpI8T9h.js → Search-DRDMZxTF.js} +1 -1
  73. package/src/assets/web-panel/assets/{Security-CVQPej3p.js → Security-D0y4LlQ4.js} +3 -3
  74. package/src/assets/web-panel/assets/{Services-CWJj07ru.js → Services-ChpkqWm0.js} +2 -2
  75. package/src/assets/web-panel/assets/{Skeleton-CNxdd41V.js → Skeleton-D3WGZ8yO.js} +1 -1
  76. package/src/assets/web-panel/assets/{Skills-AD-xWT2V.js → Skills-Bv_7HaUW.js} +1 -1
  77. package/src/assets/web-panel/assets/{Sla-BuDuN1ak.js → Sla-crZMKyX0.js} +1 -1
  78. package/src/assets/web-panel/assets/{SpeechSettings-WYryugQK.js → SpeechSettings-ByWn5XDZ.js} +1 -1
  79. package/src/assets/web-panel/assets/{SyncSettings-Dxz8z_yO.js → SyncSettings--R55vxvj.js} +2 -2
  80. package/src/assets/web-panel/assets/{Tasks-BCQFGo6S.js → Tasks-BZA_Via_.js} +1 -1
  81. package/src/assets/web-panel/assets/{Templates-CNU1xhuV.js → Templates-9eJ9yY8Q.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tenant-CFsqv744.js → Tenant-CfWX2jqj.js} +1 -1
  83. package/src/assets/web-panel/assets/{Terminal--7FxkXMc.js → Terminal-CUXUF4kL.js} +2 -2
  84. package/src/assets/web-panel/assets/{TimelineRenderer-Cqtg4CN-.js → TimelineRenderer-77y9bkYN.js} +1 -1
  85. package/src/assets/web-panel/assets/{Tokens-DQD8oVJ3.js → Tokens-CvyrdLH6.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trigger-BujLIIRO.js → Trigger-MNRl_YNr.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trust-_3yRNM57.js → Trust-BHOXK-Mp.js} +1 -1
  88. package/src/assets/web-panel/assets/{UkeySign-C_QKp9Ig.js → UkeySign-Bz1oZNyQ.js} +1 -1
  89. package/src/assets/web-panel/assets/{VideoEditing-BkgP1c6L.js → VideoEditing-DlqmXyZv.js} +1 -1
  90. package/src/assets/web-panel/assets/{Wallet-CTHaNBha.js → Wallet-Dg1rnqEG.js} +4 -4
  91. package/src/assets/web-panel/assets/{WebAuthn-CbXcDn_T.js → WebAuthn-DJtGeaOk.js} +4 -4
  92. package/src/assets/web-panel/assets/{WorkflowEditor-BUOyHiTN.js → WorkflowEditor-DJPubjX5.js} +1 -1
  93. package/src/assets/web-panel/assets/{chat-DTG5Geyv.js → chat-BWweDuIV.js} +1 -1
  94. package/src/assets/web-panel/assets/{colors-BAdqWSlv.js → colors-BX5ViADF.js} +1 -1
  95. package/src/assets/web-panel/assets/{compact-item-DYh7YdLa.js → compact-item-Df8MLbXp.js} +1 -1
  96. package/src/assets/web-panel/assets/{createContext-mPOA80GV.js → createContext-C0FDTwdV.js} +1 -1
  97. package/src/assets/web-panel/assets/devWarning-BgM5vq1s.js +1 -0
  98. package/src/assets/web-panel/assets/{hasIn-Gzp3HIXP.js → hasIn-PpL6GdNk.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CLuIQO9d.js → index-7VyVOEf7.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BL46pkYn.js → index-B3K1uZ7R.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CFXlLyEF.js → index-B4UxFB2N.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Diwevwx7.js → index-B8-pSyP7.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Brr8ALy2.js → index-B982oUKN.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CsgxUKpZ.js → index-BF0ERucU.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BjRl7Jhc.js → index-BMIEWinN.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-X1iyU-gh.js → index-BWSCphaT.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CYbMpkmP.js → index-BeFhy4BX.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CGQfiMVc.js → index-Beh1kLwx.js} +1 -1
  109. package/src/assets/web-panel/assets/index-Bl-HTXWn.js +1 -0
  110. package/src/assets/web-panel/assets/{index-CR3ZvuY6.js → index-C0PqPK-8.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CzkgWUAt.js → index-C2JU-gdS.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-z3FnuAKK.js → index-C8wl7Ica.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-og41WNLX.js → index-C9FOwTgX.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BQZVcznI.js → index-C9N1u8jV.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CqSb5LAk.js → index-Cf86RSQk.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DxpX3q8j.js → index-ChV82mzs.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CdleQSUU.js → index-Cj00JSqq.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-ByUjSWIg.js → index-Cm7vZvA3.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DbdMPF9D.js → index-CmMzB4C-.js} +3 -3
  120. package/src/assets/web-panel/assets/{index-Ch0qsp2p.js → index-CxY_U5RT.js} +1 -1
  121. package/src/assets/web-panel/assets/index-Cxf0YfM5.js +1 -0
  122. package/src/assets/web-panel/assets/{index-BYE61P6D.js → index-D5Ei75Wt.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-OkiNUps8.js → index-DBzaRg4E.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BKYYncej.js → index-DFtzEEYe.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-C52u0SKj.js → index-DGLbojjx.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D_65ERlZ.js → index-D_6XIMVV.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-Byln7kVS.js → index-DddQd0_V.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CcZz24sL.js → index-DwZkBGXd.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-C5MHbkbK.js → index-DxJqyIP8.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CMScSzoi.js → index-Dy8K2laU.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BH067bfd.js → index-FAZH69my.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-y-TWtPEX.js → index-NdEUFm32.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DfsFQ-DX.js → index-P1ERNJla.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CchNIYmQ.js → index-R0LQ3fgq.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-DCw8rGv8.js → index-UXM5vpt4.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-B1UsX4Hx.js → index-iif2A1eL.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-C9uyUX6z.js → index-itNn6pW1.js} +1 -1
  138. package/src/assets/web-panel/assets/{initDefaultProps-DmksOjaL.js → initDefaultProps-DeMthvi4.js} +1 -1
  139. package/src/assets/web-panel/assets/{motion-Cb3y_Vsi.js → motion-_7kbkzE0.js} +1 -1
  140. package/src/assets/web-panel/assets/{move-DP-3qcfq.js → move-gCI04pLw.js} +1 -1
  141. package/src/assets/web-panel/assets/{mtc-parser-BCDUfUEO.js → mtc-parser-D5UWHv2U.js} +1 -1
  142. package/src/assets/web-panel/assets/{omit-MH-O2PY6.js → omit-CDCZcqeS.js} +1 -1
  143. package/src/assets/web-panel/assets/{pickAttrs-BaZORqPr.js → pickAttrs-DGMDLi3S.js} +1 -1
  144. package/src/assets/web-panel/assets/{placementArrow-Dkp_5tvw.js → placementArrow-C-3vC1Vh.js} +1 -1
  145. package/src/assets/web-panel/assets/{responsiveObserve-DBJSmMkS.js → responsiveObserve-vdoYucvi.js} +1 -1
  146. package/src/assets/web-panel/assets/{slide-Cc6qGIgj.js → slide-B62FhgyZ.js} +1 -1
  147. package/src/assets/web-panel/assets/{statusUtils-FundADw-.js → statusUtils-DCLlfnym.js} +1 -1
  148. package/src/assets/web-panel/assets/{styleChecker-qOO9jMdb.js → styleChecker-CGvQ4LRR.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFlexGapSupport-BYbRYwok.js → useFlexGapSupport-BqkGoKwe.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFs-D6PqFBtt.js → useFs-Bkr_nU3q.js} +1 -1
  151. package/src/assets/web-panel/assets/{usePersonalDataHub-mJpur_zt.js → usePersonalDataHub-CYxMIUEq.js} +1 -1
  152. package/src/assets/web-panel/assets/{vnode-ZFVHKenK.js → vnode-sAbcY1FX.js} +1 -1
  153. package/src/assets/web-panel/assets/{zoom-Ca_KBv2o.js → zoom-Dm2pLrXi.js} +1 -1
  154. package/src/assets/web-panel/index.html +1 -1
  155. package/src/command-help-index.json +1 -1
  156. package/src/commands/agent.js +29 -0
  157. package/src/commands/ask.js +23 -23
  158. package/src/commands/chat.js +1 -5
  159. package/src/commands/session.js +92 -61
  160. package/src/commands/setup.js +35 -10
  161. package/src/commands/ui.js +18 -5
  162. package/src/constants.js +18 -89
  163. package/src/data/changelog.json +26 -0
  164. package/src/gateways/ws/action-protocol.js +22 -14
  165. package/src/gateways/ws/chat-intent-protocol.js +7 -3
  166. package/src/gateways/ws/llm-chat-protocol.js +9 -2
  167. package/src/gateways/ws/ws-server.js +24 -12
  168. package/src/lib/bm25-search.js +6 -3
  169. package/src/lib/chat-intent-service.js +28 -4
  170. package/src/lib/coding-task-guidance.js +6 -1
  171. package/src/lib/config-manager.js +49 -16
  172. package/src/lib/config-schema.js +5 -0
  173. package/src/lib/context-memory-kernel/memory-query-index.js +35 -17
  174. package/src/lib/evolution/evolution-deployment-config.js +48 -5
  175. package/src/lib/evolution/evolution-deployment-loader.js +26 -11
  176. package/src/lib/evolution/evolution-enabled.js +27 -0
  177. package/src/lib/evolution/governed-model-turn.js +4 -1
  178. package/src/lib/evolution/optional-ui-model-turn.js +26 -0
  179. package/src/lib/goal-check-evidence.js +159 -0
  180. package/src/lib/goal-condition-engine.js +24 -2
  181. package/src/lib/llm-connection-probe.js +48 -4
  182. package/src/lib/llm-onboarding-catalog.json +131 -0
  183. package/src/lib/paths.js +2 -2
  184. package/src/lib/skill-retrieval-router.js +2 -1
  185. package/src/lib/skill-search-tokenizer.js +143 -0
  186. package/src/repl/agent-repl.js +8 -4
  187. package/src/repl/chat-repl.js +15 -9
  188. package/src/runtime/agent-core.js +87 -7
  189. package/src/runtime/agent-runtime.js +18 -6
  190. package/src/runtime/headless-runner.js +138 -66
  191. package/src/runtime/headless-stream.js +1 -0
  192. package/src/runtime/mcp-tool-search-ranking.js +142 -0
  193. package/src/runtime/mcp-tool-search.js +198 -60
  194. package/src/assets/web-panel/assets/Artifacts-D50kNasl.js +0 -1
  195. package/src/assets/web-panel/assets/EvolutionSettings-BKWKDok5.js +0 -1
  196. package/src/assets/web-panel/assets/MarkdownRenderer-vialawkx.js +0 -1
  197. package/src/assets/web-panel/assets/devWarning-ChcomtaV.js +0 -1
  198. package/src/assets/web-panel/assets/index-CXxCC-4V.js +0 -1
  199. package/src/assets/web-panel/assets/index-CZYLUp6g.js +0 -1
package/src/lib/paths.js CHANGED
@@ -278,8 +278,8 @@ export function getBinDir() {
278
278
  return join(getHomeDir(), "bin");
279
279
  }
280
280
 
281
- export function getConfigPath() {
282
- return join(getHomeDir(), "config.json");
281
+ export function getConfigPath(options = {}) {
282
+ return join(resolveConfigDataRoot(options).path, "config.json");
283
283
  }
284
284
 
285
285
  export function getStatePath() {
@@ -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,
@@ -103,17 +103,20 @@ export async function startChatRepl(options = {}) {
103
103
  options.evolutionIngress == null
104
104
  ? null
105
105
  : captureAgentEvolutionIngress(options.evolutionIngress);
106
- if (evolutionIngress === null) {
107
- const error = new Error(
108
- "Chat REPL model egress requires an authenticated evolution ingress",
109
- );
110
- error.code = "CC_AGENT_EVOLUTION_INGRESS_FAILED";
111
- throw error;
112
- }
113
106
  const admittedSessionId = options.sessionId
114
107
  ? assertChatSessionUsageAdmission(options.sessionId)
115
108
  : null;
116
- const evolutionSession = createAgentEvolutionSessionLifecycle(evolutionIngress);
109
+ const evolutionSession =
110
+ evolutionIngress === null
111
+ ? null
112
+ : createAgentEvolutionSessionLifecycle(evolutionIngress);
113
+ let resolveFinished;
114
+ let rejectFinished;
115
+ const finished = new Promise((resolve, reject) => {
116
+ resolveFinished = resolve;
117
+ rejectFinished = reject;
118
+ });
119
+ void finished.catch(() => {});
117
120
  const llmConfig = loadConfig().llm || {};
118
121
  const connection = resolveLlmConnection(options, [llmConfig], {
119
122
  defaultModel:
@@ -510,7 +513,10 @@ export async function startChatRepl(options = {}) {
510
513
  ? 0
511
514
  : 1
512
515
  : exitCode;
516
+ if (finalExitCode === 0) resolveFinished();
517
+ else rejectFinished(outputFailure);
513
518
  process.exit(finalExitCode);
514
519
  });
515
- return evolutionSession?.handle;
520
+ // Keep owners alive until readline closes even when Evolution is off.
521
+ return evolutionSession?.handle ?? Object.freeze({ finished });
516
522
  }
@@ -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.
@@ -189,6 +189,9 @@ export class AgentRuntime {
189
189
  resolveAgentBundle: deps.resolveAgentBundle || null,
190
190
  openBrowser: deps.openBrowser || openBrowser,
191
191
  runTurn: deps.runTurn || null,
192
+ prepareUiModelTurn: deps.prepareUiModelTurn || null,
193
+ resolveEvolutionCompositionFactory:
194
+ deps.resolveEvolutionCompositionFactory || null,
192
195
  evolutionCompositionFactory:
193
196
  deps.evolutionCompositionFactory == null
194
197
  ? null
@@ -415,6 +418,9 @@ export class AgentRuntime {
415
418
  ? {}
416
419
  : { evolutionIngress: this.evolutionIngress }),
417
420
  });
421
+ if (this.evolutionIngress === null && result?.finished) {
422
+ await result.finished;
423
+ }
418
424
  if (this.evolutionIngress !== null) {
419
425
  if (result?.schema === AGENT_EVOLUTION_SESSION_SCHEMA) {
420
426
  return await waitForAgentEvolutionSession(
@@ -489,10 +495,12 @@ export class AgentRuntime {
489
495
  typeof loadBundle !== "function" ||
490
496
  typeof resolveBundle !== "function"
491
497
  ) {
492
- ({ loadBundle } =
493
- await import("@chainlesschain/session-core/agent-bundle-loader"));
494
- ({ resolveBundle } =
495
- await import("@chainlesschain/session-core/agent-bundle-resolver"));
498
+ ({ loadBundle } = await import(
499
+ "@chainlesschain/session-core/agent-bundle-loader"
500
+ ));
501
+ ({ resolveBundle } = await import(
502
+ "@chainlesschain/session-core/agent-bundle-resolver"
503
+ ));
496
504
  }
497
505
  const bundle = loadBundle(this.policy.bundlePath);
498
506
  bundleResolved = resolveBundle(bundle);
@@ -557,8 +565,9 @@ export class AgentRuntime {
557
565
  if (Number.isNaN(httpPort) || httpPort < 1 || httpPort > 65535) {
558
566
  throw new Error("Invalid --http-port. Must be between 1 and 65535.");
559
567
  }
560
- const { createEnvelopeBus, createEnvelopeHttpServer } =
561
- await import("../gateways/http/envelope-http-server.js");
568
+ const { createEnvelopeBus, createEnvelopeHttpServer } = await import(
569
+ "../gateways/http/envelope-http-server.js"
570
+ );
562
571
  envelopeBus = createEnvelopeBus();
563
572
  httpServer = createEnvelopeHttpServer({
564
573
  bus: envelopeBus,
@@ -766,6 +775,9 @@ export class AgentRuntime {
766
775
  sessionManager,
767
776
  projectRoot: workspacePolicyCwd,
768
777
  evolutionCompositionFactory: this.deps.evolutionCompositionFactory,
778
+ prepareUiModelTurn: this.deps.prepareUiModelTurn,
779
+ resolveEvolutionCompositionFactory:
780
+ this.deps.resolveEvolutionCompositionFactory,
769
781
  });
770
782
  // ChainlessChainWSServer extends EventEmitter and emits "error"
771
783
  // synchronously on bind failure (in addition to rejecting start()).