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
@@ -143,23 +143,21 @@ export async function queryLLM(
143
143
  options = {},
144
144
  evolutionIngress = null,
145
145
  ) {
146
- if (evolutionIngress === null) {
147
- const error = new Error(
148
- "Model egress requires an authenticated evolution ingress",
149
- );
150
- error.code = "CC_AGENT_EVOLUTION_INGRESS_FAILED";
151
- throw error;
152
- }
153
146
  const provider = options.provider || "ollama";
154
147
  const model =
155
148
  options.model || BUILT_IN_PROVIDERS[provider]?.models?.[0] || "qwen2:7b";
156
149
  const messages = [{ role: "user", content: question }];
157
- const providerMessages = (
158
- await captureAgentEvolutionIngress(evolutionIngress).prepareModelRequest({
159
- messages,
160
- tools: [],
161
- })
162
- ).messages;
150
+ const providerMessages =
151
+ evolutionIngress === null
152
+ ? messages
153
+ : (
154
+ await captureAgentEvolutionIngress(
155
+ evolutionIngress,
156
+ ).prepareModelRequest({
157
+ messages,
158
+ tools: [],
159
+ })
160
+ ).messages;
163
161
 
164
162
  // Claude-Code 2.1.183 parity: warn (stderr only, so --json/stdout stays
165
163
  // clean) if the requested model is a provider-retired snapshot. Suppressed
@@ -265,7 +263,9 @@ export async function queryLLM(
265
263
  },
266
264
  );
267
265
  if (!response.ok) {
268
- throw new Error(`gemini error: ${response.status} ${response.statusText}`);
266
+ throw new Error(
267
+ `gemini error: ${response.status} ${response.statusText}`,
268
+ );
269
269
  }
270
270
  const data = await response.json();
271
271
  return geminiResponseText(data);
@@ -274,15 +274,15 @@ export async function queryLLM(
274
274
  const response = await providerFetch(
275
275
  `${openAICompatibleBaseUrl(provider, apiBase)}/chat/completions`,
276
276
  {
277
- method: "POST",
278
- headers: {
279
- "Content-Type": "application/json",
280
- Authorization: `Bearer ${apiKey}`,
281
- },
282
- body: JSON.stringify({
283
- model: model || providerDef.models[0],
284
- messages: providerMessages,
285
- }),
277
+ method: "POST",
278
+ headers: {
279
+ "Content-Type": "application/json",
280
+ Authorization: `Bearer ${apiKey}`,
281
+ },
282
+ body: JSON.stringify({
283
+ model: model || providerDef.models[0],
284
+ messages: providerMessages,
285
+ }),
286
286
  },
287
287
  );
288
288
 
@@ -42,11 +42,7 @@ export async function resolveChatCommandEvolutionComposition(
42
42
  { agent = false } = {},
43
43
  ) {
44
44
  if (evolutionCompositionFactory === null) {
45
- const error = new Error(
46
- "Chat model egress requires an authenticated evolution composition factory",
47
- );
48
- error.code = "CC_AGENT_EVOLUTION_INGRESS_FAILED";
49
- throw error;
45
+ return null;
50
46
  }
51
47
  const mode = agent ? "chat-agent" : "chat";
52
48
  const runId = `${mode}-${randomUUID()}`;
@@ -106,8 +106,9 @@ function _sessionEpoch(ts) {
106
106
  * @returns {{statusBar:string, autoMerge:{allow:boolean,reason:string,unmet:string[]}, lines:string[]}}
107
107
  */
108
108
  export async function renderPrStatus(signals = {}, opts = {}) {
109
- const { strictAutoMergeDecision, describePrStatusBar } =
110
- await import("../lib/pr-automation-policy.js");
109
+ const { strictAutoMergeDecision, describePrStatusBar } = await import(
110
+ "../lib/pr-automation-policy.js"
111
+ );
111
112
  const autoMerge = strictAutoMergeDecision({
112
113
  enabled: opts.enabled === true,
113
114
  hasOpenPr: signals.hasOpenPr,
@@ -356,22 +357,25 @@ export function registerSessionCommand(program, dependencies = {}) {
356
357
  sourceErrors.local = error?.message || String(error);
357
358
  }
358
359
  try {
359
- const { listBackgroundAgents } =
360
- await import("../lib/background-agent-supervisor.js");
360
+ const { listBackgroundAgents } = await import(
361
+ "../lib/background-agent-supervisor.js"
362
+ );
361
363
  background = listBackgroundAgents({ all: true });
362
364
  } catch (error) {
363
365
  sourceErrors.background = error?.message || String(error);
364
366
  }
365
367
  try {
366
- const { readRemoteControlStates } =
367
- await import("../lib/remote-control.js");
368
+ const { readRemoteControlStates } = await import(
369
+ "../lib/remote-control.js"
370
+ );
368
371
  remote = readRemoteControlStates();
369
372
  } catch (error) {
370
373
  sourceErrors.remote = error?.message || String(error);
371
374
  }
372
375
  try {
373
- const { listCollaborationRuns } =
374
- await import("../lib/collaboration-run-store.js");
376
+ const { listCollaborationRuns } = await import(
377
+ "../lib/collaboration-run-store.js"
378
+ );
375
379
  team = listCollaborationRuns({ limit }).filter(
376
380
  (run) => run?.kind === "team",
377
381
  );
@@ -392,8 +396,9 @@ export function registerSessionCommand(program, dependencies = {}) {
392
396
  sourceErrors.workflow = error?.message || String(error);
393
397
  }
394
398
  try {
395
- const { listDynamicWorkflowWorkbenchStates } =
396
- await import("../lib/dynamic-workflow-runtime.js");
399
+ const { listDynamicWorkflowWorkbenchStates } = await import(
400
+ "../lib/dynamic-workflow-runtime.js"
401
+ );
397
402
  const discovered = listDynamicWorkflowWorkbenchStates(projectRoot, {
398
403
  limit,
399
404
  });
@@ -412,8 +417,9 @@ export function registerSessionCommand(program, dependencies = {}) {
412
417
  // engine proves that the exact worktree is supported. Copy-mode
413
418
  // checkpoints need explicit paths and therefore cannot truthfully be
414
419
  // offered as a one-click session action.
415
- const { isCheckpointAvailable } =
416
- await import("../lib/checkpoint-store.js");
420
+ const { isCheckpointAvailable } = await import(
421
+ "../lib/checkpoint-store.js"
422
+ );
417
423
  const capability = new Map();
418
424
  const decorate = (items, pathFor, sessionFor) =>
419
425
  items.map((item) => {
@@ -456,8 +462,9 @@ export function registerSessionCommand(program, dependencies = {}) {
456
462
  // checkpoint action unavailable with its explicit reason.
457
463
  }
458
464
  try {
459
- const { ArtifactStore, publicArtifactMetadata } =
460
- await import("../lib/artifact-store.js");
465
+ const { ArtifactStore, publicArtifactMetadata } = await import(
466
+ "../lib/artifact-store.js"
467
+ );
461
468
  artifacts = new ArtifactStore().list().map(publicArtifactMetadata);
462
469
  } catch {
463
470
  // Summaries are optional; absence never removes a session.
@@ -469,22 +476,25 @@ export function registerSessionCommand(program, dependencies = {}) {
469
476
  // Summaries are optional; absence never removes a session.
470
477
  }
471
478
  try {
472
- const { SessionMessageFabric } =
473
- await import("../lib/session-message-fabric.js");
479
+ const { SessionMessageFabric } = await import(
480
+ "../lib/session-message-fabric.js"
481
+ );
474
482
  sessionMessageFabric = new SessionMessageFabric().projection();
475
483
  } catch (error) {
476
484
  sourceErrors.sessionMessageFabric = error?.message || String(error);
477
485
  }
478
486
  try {
479
- const { SessionWorkbenchStore } =
480
- await import("../lib/session-workbench-store.js");
487
+ const { SessionWorkbenchStore } = await import(
488
+ "../lib/session-workbench-store.js"
489
+ );
481
490
  sessionWorkbench = new SessionWorkbenchStore().projection();
482
491
  } catch (error) {
483
492
  sourceErrors.sessionWorkbench = error?.message || String(error);
484
493
  }
485
494
 
486
- const { buildSessionProjection } =
487
- await import("../lib/session-projection.js");
495
+ const { buildSessionProjection } = await import(
496
+ "../lib/session-projection.js"
497
+ );
488
498
  const projection = buildSessionProjection({
489
499
  local,
490
500
  background,
@@ -511,8 +521,9 @@ export function registerSessionCommand(program, dependencies = {}) {
511
521
  }
512
522
  }
513
523
  } catch (error) {
514
- const { disconnectedSessionProjection } =
515
- await import("../lib/session-projection.js");
524
+ const { disconnectedSessionProjection } = await import(
525
+ "../lib/session-projection.js"
526
+ );
516
527
  if (options.json) {
517
528
  jsonPayload = JSON.stringify(
518
529
  disconnectedSessionProjection(error?.message || String(error)),
@@ -562,8 +573,9 @@ export function registerSessionCommand(program, dependencies = {}) {
562
573
  } else {
563
574
  // Live path: resolve the session's linked PR and fetch via gh.
564
575
  const { getPrLinks } = await import("../lib/pr-link-ledger.js");
565
- const { getLastSessionId } =
566
- await import("../harness/jsonl-session-store.js");
576
+ const { getLastSessionId } = await import(
577
+ "../harness/jsonl-session-store.js"
578
+ );
567
579
  const sid = !id || id === "last" ? getLastSessionId() : id;
568
580
  const links = sid ? getPrLinks(sid) : [];
569
581
  if (links.length === 0) {
@@ -641,8 +653,9 @@ export function registerSessionCommand(program, dependencies = {}) {
641
653
  // (single / non-TTY / Ctrl-C). Same helper as `cc agent --resume`.
642
654
  if (!id) {
643
655
  ctx = await bootstrap({ verbose: program.opts().verbose });
644
- const { pickRecentSession } =
645
- await import("../lib/session-picker.js");
656
+ const { pickRecentSession } = await import(
657
+ "../lib/session-picker.js"
658
+ );
646
659
  const picked = await pickRecentSession(ctx);
647
660
  if (!picked.id) {
648
661
  logger.error(
@@ -672,8 +685,9 @@ export function registerSessionCommand(program, dependencies = {}) {
672
685
  if (jsonlId) {
673
686
  // Tamper gate: a broken hash chain means the transcript was edited
674
687
  // outside the store — never silently rebuild it as trusted context.
675
- const { verifySession } =
676
- await import("../harness/jsonl-session-store.js");
688
+ const { verifySession } = await import(
689
+ "../harness/jsonl-session-store.js"
690
+ );
677
691
  const trust = verifySession(jsonlId);
678
692
  if (["missing", "conflict"].includes(trust.status)) {
679
693
  logger.error(
@@ -741,12 +755,15 @@ export function registerSessionCommand(program, dependencies = {}) {
741
755
  resolveChatCommandEvolutionComposition,
742
756
  assertChatSessionUsageAdmission,
743
757
  } = await import("./chat.js");
744
- const { readEvolutionCompositionFactory } =
745
- await import("../lib/evolution/governed-model-turn.js");
746
- const { loadEvolutionDeploymentCommandDependencies } =
747
- await import("../lib/evolution/evolution-deployment-loader.js");
748
- const { waitForAgentEvolutionSession } =
749
- await import("../lib/evolution/agent-evolution-session-lifecycle.js");
758
+ const { readEvolutionCompositionFactory } = await import(
759
+ "../lib/evolution/governed-model-turn.js"
760
+ );
761
+ const { loadEvolutionDeploymentCommandDependencies } = await import(
762
+ "../lib/evolution/evolution-deployment-loader.js"
763
+ );
764
+ const { waitForAgentEvolutionSession } = await import(
765
+ "../lib/evolution/agent-evolution-session-lifecycle.js"
766
+ );
750
767
  assertChatSessionUsageAdmission(sess.id);
751
768
  // Resume is a chat entrypoint. Use the target's authenticated chat
752
769
  // deployment, loaded only here so read-only session commands need none.
@@ -757,8 +774,8 @@ export function registerSessionCommand(program, dependencies = {}) {
757
774
  );
758
775
  const composition =
759
776
  await resolveChatCommandEvolutionComposition(factory);
760
- const ingress = composition.evolutionIngress;
761
- await ingress.start();
777
+ const ingress = composition?.evolutionIngress ?? null;
778
+ if (ingress !== null) await ingress.start();
762
779
  const lifecycle = await startChatRepl({
763
780
  model: options.model || sess.model,
764
781
  provider: options.provider || sess.provider || "ollama",
@@ -767,7 +784,9 @@ export function registerSessionCommand(program, dependencies = {}) {
767
784
  sessionId: sess.id,
768
785
  evolutionIngress: ingress,
769
786
  });
770
- await waitForAgentEvolutionSession(lifecycle, ingress);
787
+ if (ingress !== null)
788
+ await waitForAgentEvolutionSession(lifecycle, ingress);
789
+ else await lifecycle.finished;
771
790
  } catch (err) {
772
791
  logger.error(`Failed: ${err.message}`);
773
792
  process.exitCode = 1;
@@ -810,8 +829,9 @@ export function registerSessionCommand(program, dependencies = {}) {
810
829
  );
811
830
  }
812
831
  if (sid) {
813
- const { renderAgentSessionMarkdown } =
814
- await import("../lib/agent-session-export.js");
832
+ const { renderAgentSessionMarkdown } = await import(
833
+ "../lib/agent-session-export.js"
834
+ );
815
835
  markdown = renderAgentSessionMarkdown(sid, store.readEvents(sid), {
816
836
  exportedAt: new Date().toISOString(),
817
837
  });
@@ -1064,8 +1084,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1064
1084
  }
1065
1085
  let result;
1066
1086
  if (jsonlId) {
1067
- const { renameSession } =
1068
- await import("../harness/jsonl-session-store.js");
1087
+ const { renameSession } = await import(
1088
+ "../harness/jsonl-session-store.js"
1089
+ );
1069
1090
  result = renameSession(jsonlId, normalized);
1070
1091
  } else {
1071
1092
  ctx = await bootstrap({ verbose: program.opts().verbose });
@@ -1104,8 +1125,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1104
1125
  .option("--json", "Output as JSON")
1105
1126
  .action(async (options) => {
1106
1127
  try {
1107
- const { pruneJsonlSessions } =
1108
- await import("../harness/jsonl-session-store.js");
1128
+ const { pruneJsonlSessions } = await import(
1129
+ "../harness/jsonl-session-store.js"
1130
+ );
1109
1131
  const result = pruneJsonlSessions({
1110
1132
  olderThanDays: Number(options.olderThan),
1111
1133
  keep: options.keep != null ? Number(options.keep) : undefined,
@@ -1483,8 +1505,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1483
1505
  .option("--json", "Output as JSON")
1484
1506
  .action(async (id, options) => {
1485
1507
  try {
1486
- const { getApprovalGate } =
1487
- await import("../lib/session-core-singletons.js");
1508
+ const { getApprovalGate } = await import(
1509
+ "../lib/session-core-singletons.js"
1510
+ );
1488
1511
  const gate = await getApprovalGate();
1489
1512
  if (options.set) {
1490
1513
  await gate.setSessionPolicy(id, options.set);
@@ -1519,8 +1542,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1519
1542
  .option("--json", "Output as JSON")
1520
1543
  .action(async (options) => {
1521
1544
  try {
1522
- const { getSessionManager } =
1523
- await import("../lib/session-core-singletons.js");
1545
+ const { getSessionManager } = await import(
1546
+ "../lib/session-core-singletons.js"
1547
+ );
1524
1548
  const mgr = getSessionManager();
1525
1549
  const live = mgr.list({
1526
1550
  agentId: options.agent,
@@ -1564,8 +1588,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1564
1588
  .argument("<id>", "Session ID")
1565
1589
  .action(async (id) => {
1566
1590
  try {
1567
- const { getSessionManager } =
1568
- await import("../lib/session-core-singletons.js");
1591
+ const { getSessionManager } = await import(
1592
+ "../lib/session-core-singletons.js"
1593
+ );
1569
1594
  const mgr = getSessionManager();
1570
1595
  if (!mgr.has(id)) {
1571
1596
  logger.error(`Session ${id} is not active in this process`);
@@ -1590,8 +1615,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1590
1615
  .argument("<id>", "Session ID")
1591
1616
  .action(async (id) => {
1592
1617
  try {
1593
- const { getSessionManager } =
1594
- await import("../lib/session-core-singletons.js");
1618
+ const { getSessionManager } = await import(
1619
+ "../lib/session-core-singletons.js"
1620
+ );
1595
1621
  const mgr = getSessionManager();
1596
1622
  const ok = await mgr.resume(id);
1597
1623
  if (!ok) {
@@ -1620,12 +1646,14 @@ export function registerSessionCommand(program, dependencies = {}) {
1620
1646
  .option("--agent-id <id>", "Agent id for scope=agent")
1621
1647
  .action(async (id, options) => {
1622
1648
  try {
1623
- const { getSessionManager } =
1624
- await import("../lib/session-core-singletons.js");
1649
+ const { getSessionManager } = await import(
1650
+ "../lib/session-core-singletons.js"
1651
+ );
1625
1652
  if (options.consolidate) {
1626
1653
  try {
1627
- const { consolidateJsonlSession } =
1628
- await import("../lib/session-consolidator.js");
1654
+ const { consolidateJsonlSession } = await import(
1655
+ "../lib/session-consolidator.js"
1656
+ );
1629
1657
  const res = await consolidateJsonlSession(id, {
1630
1658
  scope: options.scope,
1631
1659
  scopeId: options.scopeId || null,
@@ -1844,8 +1872,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1844
1872
  );
1845
1873
  process.exit(1);
1846
1874
  }
1847
- const { sessionUsage, allSessionsUsage } =
1848
- await import("../lib/session-usage.js");
1875
+ const { sessionUsage, allSessionsUsage } = await import(
1876
+ "../lib/session-usage.js"
1877
+ );
1849
1878
  const result = id
1850
1879
  ? sessionUsage(id)
1851
1880
  : allSessionsUsage({ limit: parseInt(options.limit, 10) || 1000 });
@@ -1918,8 +1947,9 @@ export function registerSessionCommand(program, dependencies = {}) {
1918
1947
  .option("--json", "Machine-readable JSON output")
1919
1948
  .action(async (id) => {
1920
1949
  try {
1921
- const { getVerifiedSessionObservabilityAuthority } =
1922
- await import("../harness/jsonl-session-store.js");
1950
+ const { getVerifiedSessionObservabilityAuthority } = await import(
1951
+ "../harness/jsonl-session-store.js"
1952
+ );
1923
1953
  const authority = getVerifiedSessionObservabilityAuthority(id);
1924
1954
  console.log(
1925
1955
  JSON.stringify(
@@ -2357,8 +2387,9 @@ async function mirrorPruneSessions() {
2357
2387
  * (`session.mirror.encryption`). Requires both to be configured.
2358
2388
  */
2359
2389
  async function mirrorRotateKey() {
2360
- const { createMirror, createMirrorCipher, rotateMirrorKey } =
2361
- await import("../harness/session-mirror.js");
2390
+ const { createMirror, createMirrorCipher, rotateMirrorKey } = await import(
2391
+ "../harness/session-mirror.js"
2392
+ );
2362
2393
  const { cfg } = await loadConfiguredMirror();
2363
2394
  if (!cfg || !cfg.kind || cfg.kind === "none") {
2364
2395
  return { target: null };
@@ -9,6 +9,7 @@ import {
9
9
  } from "../constants.js";
10
10
  import { ensureHomeDir, getConfigPath } from "../lib/paths.js";
11
11
  import {
12
+ loadConfig,
12
13
  setSecretConfigValue,
13
14
  updateConfigAtomically,
14
15
  } from "../lib/config-manager.js";
@@ -59,6 +60,26 @@ export function assertRequiredProviderCredential(providerInfo, apiKey) {
59
60
  }
60
61
  }
61
62
 
63
+ export function resolveSetupLlmDefaults(provider, existing = {}) {
64
+ const preset = LLM_PROVIDERS[provider];
65
+ if (!preset) throw new Error("Unknown setup provider");
66
+ const sameProvider = existing?.provider === provider;
67
+ return {
68
+ baseUrl:
69
+ sameProvider &&
70
+ typeof existing.baseUrl === "string" &&
71
+ existing.baseUrl.trim()
72
+ ? existing.baseUrl
73
+ : preset.defaultBaseUrl,
74
+ model:
75
+ sameProvider &&
76
+ typeof existing.model === "string" &&
77
+ existing.model.trim()
78
+ ? existing.model
79
+ : preset.defaultModel,
80
+ };
81
+ }
82
+
62
83
  async function runSetup(options) {
63
84
  logger.log(chalk.bold("\n ChainlessChain Setup Wizard\n"));
64
85
  logger.log(` Version: ${VERSION}`);
@@ -104,6 +125,17 @@ async function runSetup(options) {
104
125
  ]);
105
126
 
106
127
  // Step 5: Configure LLM
128
+ let existingLlm;
129
+ try {
130
+ existingLlm = loadConfig({
131
+ resolveSecrets: false,
132
+ failIfUnavailable: true,
133
+ }).llm;
134
+ } catch {
135
+ throw new Error(
136
+ "Could not read existing LLM configuration; repair it before running setup",
137
+ );
138
+ }
107
139
  const providerChoices = Object.entries(LLM_PROVIDERS).map(([key, info]) => ({
108
140
  name: info.name,
109
141
  value: key,
@@ -112,8 +144,7 @@ async function runSetup(options) {
112
144
  const providerInfo = LLM_PROVIDERS[provider];
113
145
 
114
146
  let apiKey = null;
115
- let baseUrl = providerInfo.defaultBaseUrl;
116
- let model = providerInfo.defaultModel;
147
+ let { baseUrl, model } = resolveSetupLlmDefaults(provider, existingLlm);
117
148
 
118
149
  if (providerInfo.requiresApiKey) {
119
150
  apiKey = await askPassword(`Enter ${providerInfo.name} API key:`);
@@ -123,14 +154,8 @@ async function runSetup(options) {
123
154
  }
124
155
 
125
156
  if (provider === "custom" || providerInfo.isProxy) {
126
- baseUrl = await askInput(
127
- "Enter API base URL:",
128
- providerInfo.defaultBaseUrl || "",
129
- );
130
- model = await askInput(
131
- "Enter model name:",
132
- providerInfo.defaultModel || "",
133
- );
157
+ baseUrl = await askInput("Enter API base URL:", baseUrl || "");
158
+ model = await askInput("Enter model name:", model || "");
134
159
  } else {
135
160
  const customizeModel = await askConfirm(
136
161
  `Use default model (${model})?`,
@@ -1,6 +1,10 @@
1
1
  import { logger } from "../lib/logger.js";
2
2
  import { createAgentRuntimeFactory } from "../runtime/runtime-factory.js";
3
3
  import { readEvolutionCompositionFactory } from "../lib/evolution/governed-model-turn.js";
4
+ import {
5
+ prepareConfiguredUiModelTurn,
6
+ loadConfiguredUiEvolutionFactory,
7
+ } from "../lib/evolution/optional-ui-model-turn.js";
4
8
  import { loadEvolutionDeploymentCommandDependencies } from "../lib/evolution/evolution-deployment-loader.js";
5
9
  import { getEvolutionDeploymentStatus } from "../lib/evolution/evolution-deployment-config.js";
6
10
 
@@ -36,7 +40,7 @@ export function registerUiCommand(program, dependencies = {}) {
36
40
  try {
37
41
  deploymentDependencies =
38
42
  await loadEvolutionDeploymentCommandDependencies("ui", {
39
- initializeDefaultLocalUi: true,
43
+ initializeDefaultLocalUi: false,
40
44
  });
41
45
  } catch (error) {
42
46
  localTrustSetupError = error;
@@ -44,7 +48,10 @@ export function registerUiCommand(program, dependencies = {}) {
44
48
  activeEvolutionCompositionFactory = readEvolutionCompositionFactory(
45
49
  deploymentDependencies || {},
46
50
  );
47
- if (activeEvolutionCompositionFactory === null) {
51
+ if (
52
+ activeEvolutionCompositionFactory === null &&
53
+ localTrustSetupError
54
+ ) {
48
55
  const status = await getEvolutionDeploymentStatus();
49
56
  const readiness = status.readiness.ui;
50
57
  logger.warn(
@@ -71,13 +78,19 @@ export function registerUiCommand(program, dependencies = {}) {
71
78
  10,
72
79
  );
73
80
  const runtime = createAgentRuntimeFactory({
74
- deps:
75
- activeEvolutionCompositionFactory === null
81
+ deps: {
82
+ ...(activeEvolutionCompositionFactory === null
76
83
  ? {}
77
84
  : {
78
85
  evolutionCompositionFactory:
79
86
  activeEvolutionCompositionFactory,
80
- },
87
+ }),
88
+ // Re-read the shared setting at each new Quick Ask request so the
89
+ // GUI and config-file switches also work in an already running UI.
90
+ prepareUiModelTurn: prepareConfiguredUiModelTurn,
91
+ resolveEvolutionCompositionFactory:
92
+ loadConfiguredUiEvolutionFactory,
93
+ },
81
94
  }).createUiRuntime({
82
95
  port,
83
96
  wsPort: parseInt(opts.wsPort, 10),
package/src/constants.js CHANGED
@@ -26,95 +26,21 @@ export const DEFAULT_PORTS = {
26
26
  wsServer: 18800,
27
27
  };
28
28
 
29
- export const LLM_PROVIDERS = {
30
- volcengine: {
31
- name: "Volcengine (火山引擎/豆包)",
32
- defaultBaseUrl: "https://ark.cn-beijing.volces.com/api/v3",
33
- defaultModel: "deepseek-v4-1-flash-260910",
34
- requiresApiKey: true,
35
- },
36
- openai: {
37
- name: "OpenAI",
38
- defaultBaseUrl: "https://api.openai.com/v1",
39
- defaultModel: "gpt-4o",
40
- requiresApiKey: true,
41
- },
42
- anthropic: {
43
- name: "Anthropic (Claude)",
44
- defaultBaseUrl: "https://api.anthropic.com/v1",
45
- defaultModel: "claude-sonnet-4-6",
46
- requiresApiKey: true,
47
- },
48
- deepseek: {
49
- name: "DeepSeek",
50
- defaultBaseUrl: "https://api.deepseek.com/v1",
51
- defaultModel: "deepseek-chat",
52
- requiresApiKey: true,
53
- },
54
- dashscope: {
55
- name: "DashScope (阿里通义)",
56
- defaultBaseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1",
57
- defaultModel: "qwen-max",
58
- requiresApiKey: true,
59
- },
60
- gemini: {
61
- name: "Google Gemini",
62
- defaultBaseUrl: "https://generativelanguage.googleapis.com/v1beta",
63
- defaultModel: "gemini-2.0-flash",
64
- requiresApiKey: true,
65
- },
66
- kimi: {
67
- name: "Kimi (月之暗面)",
68
- defaultBaseUrl: "https://api.moonshot.cn/v1",
69
- defaultModel: "moonshot-v1-auto",
70
- requiresApiKey: true,
71
- },
72
- minimax: {
73
- name: "MiniMax (海螺AI)",
74
- defaultBaseUrl: "https://api.minimax.chat/v1",
75
- defaultModel: "MiniMax-Text-01",
76
- requiresApiKey: true,
77
- },
78
- mistral: {
79
- name: "Mistral AI",
80
- defaultBaseUrl: "https://api.mistral.ai/v1",
81
- defaultModel: "mistral-large-latest",
82
- requiresApiKey: true,
83
- },
84
- ollama: {
85
- name: "Ollama (本地部署)",
86
- defaultBaseUrl: "http://localhost:11434",
87
- defaultModel: "qwen2:7b",
88
- requiresApiKey: false,
89
- },
90
- "openai-proxy": {
91
- name: "OpenAI 中转站 (API2D/CloseAI等)",
92
- defaultBaseUrl: "",
93
- defaultModel: "gpt-4o",
94
- requiresApiKey: true,
95
- isProxy: true,
96
- },
97
- "anthropic-proxy": {
98
- name: "Anthropic 中转站 (Claude代理)",
99
- defaultBaseUrl: "",
100
- defaultModel: "claude-sonnet-4-6",
101
- requiresApiKey: true,
102
- isProxy: true,
103
- },
104
- "gemini-proxy": {
105
- name: "Gemini 中转站 (Google代理)",
106
- defaultBaseUrl: "",
107
- defaultModel: "gemini-2.0-flash",
108
- requiresApiKey: true,
109
- isProxy: true,
110
- },
111
- custom: {
112
- name: "自定义 Provider (自建服务/vLLM/TGI等)",
113
- defaultBaseUrl: "",
114
- defaultModel: "",
115
- requiresApiKey: true,
116
- },
117
- };
29
+ // New-connection suggestions are shared with both IDEs. Runtime fallbacks and
30
+ // existing persisted models are deliberately independent of this catalog.
31
+ const onboardingCatalog = require("./lib/llm-onboarding-catalog.json");
32
+ export const LLM_PROVIDERS = Object.fromEntries(
33
+ onboardingCatalog.providers.map((preset) => [
34
+ preset.id,
35
+ {
36
+ name: preset.cliLabel || preset.label,
37
+ defaultBaseUrl: preset.baseUrl,
38
+ defaultModel: preset.defaultModel,
39
+ requiresApiKey: preset.needsKey,
40
+ ...(preset.isProxy ? { isProxy: true } : {}),
41
+ },
42
+ ]),
43
+ );
118
44
 
119
45
  export const EDITIONS = {
120
46
  personal: {
@@ -136,6 +62,9 @@ export const DEFAULT_CONFIG = {
136
62
  completedAt: null,
137
63
  edition: "personal",
138
64
  features: {},
65
+ evolution: {
66
+ enabled: false,
67
+ },
139
68
  paths: {
140
69
  projectRoot: null,
141
70
  database: null,