chainlesschain 0.166.109 → 0.166.112

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 (206) hide show
  1. package/README.md +6 -4
  2. package/package.json +3 -2
  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-DkrNbDzS.js → AIOps-sOceeExN.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-DJjFXDhv.js → ActionButton-BQs-vRUr.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-DyUbagRn.js → Analytics-sfAHHMhA.js} +2 -2
  8. package/src/assets/web-panel/assets/{AppLayout-p7kJWSvn.js → AppLayout-0gAvE0c8.js} +4 -4
  9. package/src/assets/web-panel/assets/{Artifacts-C3rVh4Ak.js → Artifacts-Dh9s2Qmd.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-Bch_L_YO.js → Audit-CITm26SU.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-BNHy8zP6.js → BackgroundAgents-BiMbBOh0.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-BUaye_Ys.js → Backup-CNpnhI3h.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-D49mzAVz.js → BaseInput-BI_lltkp.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-2MDzM_us.js → Chat-BgfB88xY.js} +5 -5
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-BDP3fGoz.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-5p1T_KEq.js → Checkbox-4xy9rS3j.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-TKtiLaoZ.js → Codegen-D93h9ihS.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-BVCMG9mS.js → Col-BRf3STY-.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-D09-QczH.js → Community-f187ziSL.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-QuRMCnj7.js → Compact-D4hXWuo1.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-CN0PV7fk.js → Compliance-C6cYKI6H.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-5N2zhAty.js → Cowork-C1i1f8LD.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-BxT8UZ0S.js → Cron-BacCE4LA.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-Dp-noQl4.js → Crosschain-DXztxOoH.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-B7MZFkjG.js → DID-rpf4HN8x.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-DulJ3rKV.js → Dashboard-h4bgtH7L.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-DV4ov4zF.js → Dropdown-CyQnoHmu.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-DB2-ooz6.js → EmailListRenderer-FCtp4AcB.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-B1Rb6p7q.js → EvolutionSettings-JbISHTWR.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-U8aHayx-.js → FamilyGuardDashboard-DCIQLyfK.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-BkQULBHY.js → Federation-DDbFpwja.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-CtviG260.js → FormItemContext-CXF0jtXb.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DnPirB24.js → GenericCardRenderer-CUaNfAM0.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-CK57Oro6.js → Git-Bhoz2gDf.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-DbI-LB8-.js → Governance-FiiXHe8e.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-sEG4T1Jg.js → Inference-brpTW2Q3.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-9SLJR3h9.js → KnowledgeGraph-BCWP-f6k.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-BIZYcISQ.js → Logs-CxYcduoK.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-12vD1nC1.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-CRmLLwAE.js → Marketplace-DANdmW7l.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-DkOFkSO1.js → McpTools-Bi_EKkb5.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-M29Kd9TU.js → Memory-DecoMbYw.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-Tl6JvPw_.js → MobileBridge-DrOhFKp0.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-rRwP16dN.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-DkUjX1F5.js → Mtc-SLPII1iw.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-BCqr1I4q.js → MtcAudit-DWoVORYy.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-DmoqYGQ5.js → Multisig-Dxpnmq-m.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-DNRQeRke.js → NLProgramming-kNTpNqCP.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-CQSBeiY6.js → Notes-D1uXCfVd.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-gNY9bbH6.js → NotificationSettings-D3Qt8Gkl.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-DW0CNjh8.js → OrderTableRenderer-qvaah2-m.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-CthnbKag.js → Organization-EhRl4JoJ.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-_GQ3sbXu.js → Overflow-BTt5C_5W.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-BTr7ea6W.js → P2P-CeR2jyb0.js} +2 -2
  55. package/src/assets/web-panel/assets/PdhVaultBrowser-BzD3OHWq.js +7 -0
  56. package/src/assets/web-panel/assets/{Permissions-DMny2Cjs.js → Permissions-BOPyeRlz.js} +3 -3
  57. package/src/assets/web-panel/assets/{PersonalDataHub-CyYlMSoI.js → PersonalDataHub-DcmNNsfO.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-FASu2Oc4.js → Pipeline-DuL3kwWC.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-9bC5FnsJ.js → Privacy-CkQRdlSU.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-BOYZwB5G.js → ProjectInit-moE_vQ1P.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-45DViNG-.js → ProjectSettings-PnTWi4NQ.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-C2fZzMZc.js → Projects-DZvbT3D7.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-BgjvZx9F.js → Providers-CkcrHYy9.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-Brw-3csB.js → QrScannerModal-nYNFGf_H.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-DWG-A5zB.js → QuickAsk-53WNo7xT.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-DuQGxjIR.js → Recommend-CmYN_NaS.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-T1cdSSRL.js → RemoteSession-BuOdNEjA.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-9FT2dI4G.js → Reputation-BgkheZou.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-yNIbNftX.js → Row-DvA3klj1.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-BIchNoPd.js → RssFeed-CgkIL3PG.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-msDJ8UTZ.js → Search-Cv2twJdL.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-DE46oBYT.js → Security-XrD2UNU6.js} +2 -2
  73. package/src/assets/web-panel/assets/{Services-Dori7vc3.js → Services-LujCntCK.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-D3O3sUFz.js → Skeleton-ZZCOsxPX.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-BV0ct8SO.js → Skills-BEXGkOrU.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-DflIVOrh.js → Sla-CIqmCgdD.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-Cpbv2Zz6.js → SpeechSettings-DkVbwJox.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-Dgg6-wbe.js → SyncSettings-BVGgUs0p.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-Cb6e4Klx.js → Tasks-C1lh68l5.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-GfdAATGz.js → Templates-BG4zNAFx.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-D0gecLXl.js → Tenant-t2o6i5fY.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-BFRPJt-0.js → Terminal-CH8UDdVO.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-BobtChxX.js → TimelineRenderer-B5sYY1IO.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-CifeZtHV.js → Tokens-D0y7QkG5.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-BHBvbBCf.js → Trigger-BA2nKko0.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-6lvqjKYp.js → Trust-CrFKCQIs.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CqzMc-G5.js → UkeySign-B3x_-Zun.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-OIiRG582.js → VideoEditing-TEwxbLH6.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-4MeKq0q_.js → Wallet-Larp5rrt.js} +2 -2
  90. package/src/assets/web-panel/assets/{WebAuthn-eHBRjGQG.js → WebAuthn-DfWbEIZe.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-DlzYdEqW.js → WorkflowEditor-8LKiKExY.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-CBcjOzkX.js → chat-ByxYOvYW.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-zgwsYQSa.js → colors-Dh4yAClh.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-Dcd9H5Bn.js → compact-item-f5n2j1WZ.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-DR1tO-8r.js → createContext-DIprYuXL.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-DRIge35Z.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-CtfbUH_p.js → hasIn-CvYeap2I.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-D1GxtY-h.js → index-3ROY-lYB.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CT7zIkqP.js → index-6VEWxOyC.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-Cdhy5ckh.js → index-7eG1J-GT.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DvPOpvvH.js → index-B0AXUhiJ.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cur8LNNn.js → index-BS_dpgzu.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DWG98orp.js → index-BaXSBxy-.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-C5XGvJb0.js → index-Bk8oWRk6.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DA2-Bhy8.js → index-BlImvgb7.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CwHgaYVH.js → index-BoayvJ48.js} +1 -1
  107. package/src/assets/web-panel/assets/index-Bq24rTYx.js +1 -0
  108. package/src/assets/web-panel/assets/{index-DHEiuvhA.js → index-BsU46c7D.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DSvcz0RO.js → index-BvyFQF8I.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D7ZOiIKb.js → index-C2RGykST.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CmzQzTY5.js → index-C5aH2Pj2.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-oWOlF7CM.js → index-CD0s5ESV.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DVpp9YSQ.js → index-CIZQtz8G.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DWuCGhHa.js → index-CJjc8ObW.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-JSfldpw4.js → index-CTqJNul4.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-dvF6C39V.js → index-CcvA1nae.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CmVIM-m2.js → index-CpR0zD38.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CaGNqkY0.js → index-CzabQZ7I.js} +1 -1
  119. package/src/assets/web-panel/assets/index-D2f18WsK.js +1 -0
  120. package/src/assets/web-panel/assets/{index-BXfGHUz_.js → index-DGyTzElU.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-LN7Hkl1C.js → index-DI8jC7gQ.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DfzOYmOj.js → index-DUj-sL9U.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BoxowMYS.js → index-DaZVtafQ.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CSQCHpDo.js → index-DjvON8oh.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-B3QUK1ks.js → index-DlJCDpeN.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-J-ORW1i6.js → index-DlTwZIeX.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-z8lrkcb-.js → index-DlULGx8u.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-hTcre7U9.js → index-DmcAL4hd.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DYPMJ5Mb.js → index-DshB3-Up.js} +3 -3
  130. package/src/assets/web-panel/assets/{index-5XaB_Tjg.js → index-Du435yzt.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-C0kP88Pb.js → index-bt-0zMmH.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D8WPohye.js → index-c_CxUQl3.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DeAi4CNt.js → index-fpWv4u3Z.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BndPtS9D.js → index-hwbaD3Nk.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-DTx4FyLU.js → index-uDiVjYrS.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-CPLLgPxA.js → index-xU0eHLIH.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-CVMtDrWZ.js → initDefaultProps-DRuE92W6.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-Dye3IU8k.js → motion-6Sgma5Vd.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-C251Zo34.js → move-BbQsH8sb.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-BDiOORoQ.js → mtc-parser-BdC4INal.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-DTDA_RHv.js → omit-DeC5m_bi.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-CqEUTPcT.js → pickAttrs-DuehpBws.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-BOB8QWH3.js → placementArrow-CJEhv2ij.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-CZDXP1d9.js → responsiveObserve-Dyw3lDGr.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-DPaRw3E9.js → slide-BMaLXTbS.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-Ba9d7XZ7.js → statusUtils-c1K_SdJH.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-mZKU3lvW.js → styleChecker-CefBry8k.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-VcauLq0M.js → useFlexGapSupport-Dj2IsZpo.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-Cal9KRcx.js → useFs-RLfB3yqb.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-DISoRyQB.js → usePersonalDataHub-DbRVH_NA.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-B58C6w6B.js → vnode-DTn_QVJz.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-BPlBAMKB.js → zoom-DuFR0E7i.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 +12 -5
  156. package/src/commands/ask.js +96 -21
  157. package/src/commands/complete.js +14 -10
  158. package/src/commands/llm.js +23 -41
  159. package/src/commands/session.js +2 -2
  160. package/src/commands/stream.js +9 -5
  161. package/src/commands/ui.js +30 -2
  162. package/src/data/changelog.json +39 -0
  163. package/src/gateways/ws/llm-chat-protocol.js +18 -10
  164. package/src/gateways/ws/llm-creds.js +29 -79
  165. package/src/gateways/ws/ws-agent-handler.js +1 -1
  166. package/src/gateways/ws/ws-session-gateway.js +26 -12
  167. package/src/lib/__tests__/provider-stream.test.js +70 -4
  168. package/src/lib/chat-core.js +186 -24
  169. package/src/lib/cowork-adapter.js +29 -15
  170. package/src/lib/evolution/agent-evolution-runtime-composition.js +10 -7
  171. package/src/lib/evolution/evolution-deployment-config.js +27 -4
  172. package/src/lib/evolution/evolution-deployment-loader.js +58 -3
  173. package/src/lib/evolution/evolution-deployment-profile.js +2 -2
  174. package/src/lib/evolution/evolution-evidence-projector.js +18 -3
  175. package/src/lib/evolution/evolution-file-witness.js +10 -0
  176. package/src/lib/evolution/evolution-ledger.js +237 -28
  177. package/src/lib/evolution/evolution-windows-directory-durability.js +322 -0
  178. package/src/lib/evolution/governed-hub-llm.js +2 -1
  179. package/src/lib/evolution/governed-model-turn.js +4 -1
  180. package/src/lib/evolution/local-ui-evolution-deployment.js +682 -0
  181. package/src/lib/evolution/local-ui-evolution-host.mjs +26 -0
  182. package/src/lib/evolution/local-ui-evolution-runtime.js +601 -0
  183. package/src/lib/evolution/opaque-hex-id.js +28 -0
  184. package/src/lib/hub-llm-client.js +22 -14
  185. package/src/lib/image-input.js +19 -3
  186. package/src/lib/llm-config-defaults.js +19 -30
  187. package/src/lib/llm-connection-config.js +4 -0
  188. package/src/lib/llm-connection-probe.js +5 -1
  189. package/src/lib/llm-connection-resolution.js +94 -0
  190. package/src/lib/llm-providers.js +33 -11
  191. package/src/lib/ollama-base-url.js +14 -0
  192. package/src/lib/provider-protocol.js +104 -0
  193. package/src/lib/provider-stream.js +163 -4
  194. package/src/lib/runnable-provider.js +1 -0
  195. package/src/repl/chat-repl.js +58 -11
  196. package/src/runtime/agent-core.js +26 -43
  197. package/src/runtime/headless-runner.js +11 -4
  198. package/src/runtime/headless-stream.js +10 -4
  199. package/src/runtime/policies/agent-policy.js +17 -11
  200. package/src/assets/web-panel/assets/ChatBubbleRenderer-DOX3Y5EJ.js +0 -1
  201. package/src/assets/web-panel/assets/MarkdownRenderer-9nfWupWP.js +0 -1
  202. package/src/assets/web-panel/assets/MobileProjects-Bq-FPDzS.js +0 -1
  203. package/src/assets/web-panel/assets/PdhVaultBrowser-D9McHF9I.js +0 -7
  204. package/src/assets/web-panel/assets/devWarning-DYhpRtve.js +0 -1
  205. package/src/assets/web-panel/assets/index-DPJXFIY7.js +0 -1
  206. package/src/assets/web-panel/assets/index-DjBhR5M_.js +0 -1
@@ -29,7 +29,16 @@ import { captureAgentEvolutionRuntimeComposition } from "../lib/evolution/agent-
29
29
  import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
30
30
  import { logger } from "../lib/logger.js";
31
31
  import { BUILT_IN_PROVIDERS } from "../lib/llm-providers.js";
32
+ import { normalizeOllamaBaseUrl } from "../lib/ollama-base-url.js";
33
+ import {
34
+ geminiGenerateContentUrl,
35
+ geminiRequestBody,
36
+ geminiResponseText,
37
+ normalizeProviderBaseUrl,
38
+ openAICompatibleBaseUrl,
39
+ } from "../lib/provider-protocol.js";
32
40
  import { loadConfig } from "../lib/config-manager.js";
41
+ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
33
42
  import { expandFileRefs } from "../runtime/file-ref-expander.js";
34
43
 
35
44
  const ANDROID_LOCAL_OLLAMA_URL = "http://127.0.0.1:18484";
@@ -73,6 +82,33 @@ export function resolveOllamaBaseUrl({
73
82
  return "http://localhost:11434";
74
83
  }
75
84
 
85
+ export function resolveAskOptions(
86
+ options = {},
87
+ config = {},
88
+ env = process.env,
89
+ ) {
90
+ const connection = resolveLlmConnection(options, [config.llm || {}], { env });
91
+ const provider = connection.provider;
92
+ const resolved = {
93
+ model: connection.model || (provider === "ollama" ? "qwen2:7b" : null),
94
+ provider,
95
+ apiKey: connection.apiKey,
96
+ baseUrl: connection.baseUrl,
97
+ };
98
+ if (provider === "ollama") {
99
+ resolved.baseUrl = resolveOllamaBaseUrl({
100
+ options,
101
+ env,
102
+ config:
103
+ config.llm?.provider === "ollama" &&
104
+ connection.endpointSources.includes(config.llm)
105
+ ? config
106
+ : {},
107
+ });
108
+ }
109
+ return resolved;
110
+ }
111
+
76
112
  /**
77
113
  * Send a single question to an LLM provider.
78
114
  * @param {string} question
@@ -115,7 +151,8 @@ export async function queryLLM(
115
151
  throw error;
116
152
  }
117
153
  const provider = options.provider || "ollama";
118
- const model = options.model || "qwen2:7b";
154
+ const model =
155
+ options.model || BUILT_IN_PROVIDERS[provider]?.models?.[0] || "qwen2:7b";
119
156
  const messages = [{ role: "user", content: question }];
120
157
  const providerMessages = (
121
158
  await captureAgentEvolutionIngress(evolutionIngress).prepareModelRequest({
@@ -139,7 +176,7 @@ export async function queryLLM(
139
176
  }
140
177
 
141
178
  if (provider === "ollama") {
142
- const baseUrl = options.baseUrl || "http://localhost:11434";
179
+ const baseUrl = normalizeOllamaBaseUrl(options.baseUrl);
143
180
  // Use /api/chat (modern Ollama API + only endpoint Android LocalLlmServer
144
181
  // implements). Non-streaming mode keeps the response shape simple.
145
182
  const response = await providerFetch(`${baseUrl}/api/chat`, {
@@ -167,7 +204,6 @@ export async function queryLLM(
167
204
  return data.message?.content ?? "";
168
205
  }
169
206
 
170
- // OpenAI-compatible providers (openai, volcengine, deepseek, dashscope, mistral, gemini)
171
207
  const providerDef = BUILT_IN_PROVIDERS[provider];
172
208
  if (!providerDef) {
173
209
  throw new Error(
@@ -185,7 +221,59 @@ export async function queryLLM(
185
221
  }
186
222
 
187
223
  const apiBase = options.baseUrl || providerDef.baseUrl;
188
- const response = await providerFetch(`${apiBase}/chat/completions`, {
224
+ if (provider === "anthropic") {
225
+ const response = await providerFetch(
226
+ `${normalizeProviderBaseUrl(apiBase)}/messages`,
227
+ {
228
+ method: "POST",
229
+ headers: {
230
+ "Content-Type": "application/json",
231
+ "x-api-key": apiKey,
232
+ "anthropic-version": "2023-06-01",
233
+ },
234
+ body: JSON.stringify({
235
+ model,
236
+ max_tokens: 4096,
237
+ messages: providerMessages,
238
+ }),
239
+ },
240
+ );
241
+ if (!response.ok) {
242
+ throw new Error(
243
+ `anthropic error: ${response.status} ${response.statusText}`,
244
+ );
245
+ }
246
+ const data = await response.json();
247
+ return (
248
+ data.content
249
+ ?.filter((part) => part.type === "text")
250
+ .map((part) => part.text)
251
+ .join("") || ""
252
+ );
253
+ }
254
+
255
+ if (provider === "gemini") {
256
+ const response = await providerFetch(
257
+ geminiGenerateContentUrl(apiBase, model),
258
+ {
259
+ method: "POST",
260
+ headers: {
261
+ "Content-Type": "application/json",
262
+ "x-goog-api-key": apiKey,
263
+ },
264
+ body: JSON.stringify(geminiRequestBody(providerMessages)),
265
+ },
266
+ );
267
+ if (!response.ok) {
268
+ throw new Error(`gemini error: ${response.status} ${response.statusText}`);
269
+ }
270
+ const data = await response.json();
271
+ return geminiResponseText(data);
272
+ }
273
+
274
+ const response = await providerFetch(
275
+ `${openAICompatibleBaseUrl(provider, apiBase)}/chat/completions`,
276
+ {
189
277
  method: "POST",
190
278
  headers: {
191
279
  "Content-Type": "application/json",
@@ -195,7 +283,8 @@ export async function queryLLM(
195
283
  model: model || providerDef.models[0],
196
284
  messages: providerMessages,
197
285
  }),
198
- });
286
+ },
287
+ );
199
288
 
200
289
  if (!response.ok) {
201
290
  throw new Error(
@@ -252,26 +341,12 @@ export function registerAskCommand(program, dependencies = {}) {
252
341
  .option("--json", "Output as JSON")
253
342
  .action(async (question, options) => {
254
343
  const config = loadConfig();
255
- const provider = options.provider || config.llm?.provider || "ollama";
256
- const resolvedOptions = {
257
- model: options.model || config.llm?.model || "qwen2:7b",
258
- provider,
259
- apiKey: options.apiKey || config.llm?.apiKey,
260
- };
344
+ const resolvedOptions = resolveAskOptions(options, config);
345
+ const { provider } = resolvedOptions;
261
346
  // baseUrl resolution only applies the Android-local override path for
262
347
  // provider=ollama (LocalLlmServer is Ollama-compat). For other providers
263
348
  // we use the existing precedence: --base-url > config.llm.baseUrl >
264
349
  // provider default.
265
- if (provider === "ollama") {
266
- resolvedOptions.baseUrl = resolveOllamaBaseUrl({
267
- options,
268
- env: process.env,
269
- config,
270
- });
271
- } else {
272
- resolvedOptions.baseUrl = options.baseUrl || config.llm?.baseUrl;
273
- }
274
-
275
350
  // Expand @path references (e.g. `cc ask "summarize @notes.md"`) before
276
351
  // sending to the model. The original question is preserved for --json
277
352
  // output; only the LLM sees the injected file contents.
@@ -17,6 +17,7 @@ import { randomUUID } from "node:crypto";
17
17
  import { types as utilTypes } from "node:util";
18
18
  import { captureAgentEvolutionRuntimeComposition } from "../lib/evolution/agent-evolution-runtime-composition-brand.js";
19
19
  import { resolveOllamaBaseUrl, queryLLM } from "./ask.js";
20
+ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
20
21
 
21
22
  /** Hard cap so a runaway model can't flood the editor with a whole file. */
22
23
  export const MAX_COMPLETION_CHARS = 2000;
@@ -135,19 +136,22 @@ export function registerCompleteCommand(program, dependencies = {}) {
135
136
  return;
136
137
  }
137
138
 
138
- const provider = options.provider || config.llm?.provider || "ollama";
139
+ const connection = resolveLlmConnection(options, [config.llm || {}], {
140
+ defaultModel:
141
+ (options.provider || config.llm?.provider || "ollama") === "ollama"
142
+ ? "qwen2.5-coder"
143
+ : null,
144
+ });
145
+ const provider = connection.provider;
139
146
  const resolvedOptions = {
140
147
  provider,
141
- model:
142
- options.model ||
143
- config.llm?.model ||
144
- (provider === "ollama" ? "qwen2.5-coder" : undefined),
145
- apiKey: options.apiKey || config.llm?.apiKey,
148
+ model: connection.model || (provider === "ollama" ? "qwen2.5-coder" : undefined),
149
+ apiKey: connection.apiKey,
150
+ baseUrl: connection.baseUrl,
146
151
  };
147
- resolvedOptions.baseUrl =
148
- provider === "ollama"
149
- ? resolveOllamaBaseUrl({ options, config })
150
- : options.baseUrl || config.llm?.baseUrl;
152
+ if (provider === "ollama" && config.llm?.provider === "ollama") {
153
+ resolvedOptions.baseUrl = resolveOllamaBaseUrl({ options, config });
154
+ }
151
155
 
152
156
  try {
153
157
  const prompt = buildFimPrompt(prefix, suffix, language);
@@ -43,6 +43,7 @@ import {
43
43
  autoFailStuckRequestsV2,
44
44
  getLlmProvidersStatsV2,
45
45
  } from "../lib/llm-providers.js";
46
+ import { normalizeOllamaBaseUrl } from "../lib/ollama-base-url.js";
46
47
  import {
47
48
  readLlmConnectionInput,
48
49
  saveLlmConnection,
@@ -52,6 +53,7 @@ import {
52
53
  llmProbeReceipt,
53
54
  } from "../lib/llm-connection-probe.js";
54
55
  import { resolveModelCapabilityProfile } from "../lib/model-capabilities.js";
56
+ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
55
57
 
56
58
  /**
57
59
  * Resolve the effective `cc llm test` target from CLI flags + persisted config.
@@ -75,46 +77,27 @@ export function resolveLlmTestTarget(
75
77
  ) {
76
78
  const llm = config.llm || {};
77
79
  const provider = options.provider || llm.provider || "ollama";
78
- const sameProvider = provider === (llm.provider || "ollama");
79
80
  const isOllama = provider === "ollama";
80
81
  const builtIn = builtIns[provider];
81
-
82
- const model =
83
- options.model ||
84
- (sameProvider ? llm.model : undefined) ||
85
- (isOllama ? "qwen2:7b" : builtIn?.models?.[0] || "gpt-4o-mini");
86
-
87
- let baseUrl;
88
- if (isOllama) {
89
- // Only inherit config.baseUrl when the CONFIGURED provider is also ollama —
90
- // otherwise `--provider ollama` would probe another provider's endpoint.
91
- const configOllamaBase =
92
- llm.provider === "ollama" ? llm.baseUrl : undefined;
93
- baseUrl = options.baseUrl || configOllamaBase || "http://localhost:11434";
94
- } else {
95
- baseUrl =
96
- options.baseUrl ||
97
- (sameProvider ? llm.baseUrl : undefined) ||
98
- builtIn?.baseUrl ||
99
- "https://api.openai.com/v1";
100
- }
101
-
102
- const apiKey = isOllama
103
- ? undefined
104
- : options.apiKey ||
105
- (sameProvider ? llm.apiKey : undefined) ||
106
- (builtIn?.apiKeyEnv ? env[builtIn.apiKeyEnv] : undefined);
107
-
82
+ const connection = resolveLlmConnection(options, [llm], {
83
+ env,
84
+ builtIns,
85
+ defaultProvider: provider,
86
+ defaultModel: isOllama
87
+ ? "qwen2:7b"
88
+ : builtIn?.models?.[0] || "gpt-4o-mini",
89
+ });
108
90
  return {
109
- provider,
110
- model,
111
- baseUrl,
112
- apiKey,
91
+ provider: connection.provider,
92
+ model: connection.model,
93
+ baseUrl:
94
+ connection.baseUrl ||
95
+ (isOllama ? "http://localhost:11434" : "https://api.openai.com/v1"),
96
+ apiKey: isOllama ? undefined : connection.apiKey || undefined,
113
97
  isOllama,
114
98
  label: builtIn?.displayName || (isOllama ? "Ollama" : provider),
115
99
  };
116
100
  }
117
-
118
101
  /** Resolve a static profile without reading credentials or provider key envs. */
119
102
  export function resolveLlmCapabilities(
120
103
  options = {},
@@ -253,7 +236,9 @@ export function registerLlmCommand(program) {
253
236
  const spinner = ora("Fetching models...").start();
254
237
  try {
255
238
  if (options.provider === "ollama") {
256
- const response = await fetch(`${options.baseUrl}/api/tags`);
239
+ const response = await fetch(
240
+ `${normalizeOllamaBaseUrl(options.baseUrl)}/api/tags`,
241
+ );
257
242
  if (!response.ok) {
258
243
  throw new Error(`Ollama not reachable: ${response.status}`);
259
244
  }
@@ -300,13 +285,10 @@ export function registerLlmCommand(program) {
300
285
 
301
286
  // llm test - test connectivity
302
287
  //
303
- // Defaults to the CONFIGURED provider/model/baseUrl/apiKey (config.llm.*),
304
- // NOT a hard-coded ollama. Previously this always probed ollama unless you
305
- // passed --provider, so a user on volcengine/openai/etc. (and the JetBrains
306
- // "Configure LLM" wizard, which calls `cc llm test`) got a spurious
307
- // "fetch failed" against a local ollama they never ran. Any non-ollama
308
- // built-in provider is OpenAI-compatible, so they share one /chat/completions
309
- // probe instead of only special-casing openai.
288
+ // Defaults to the configured provider/model/baseUrl/apiKey (config.llm.*),
289
+ // not a hard-coded Ollama endpoint. The probe routes Ollama, Anthropic, and
290
+ // Gemini through their native protocols and uses chat/completions for the
291
+ // remaining OpenAI-compatible providers.
310
292
  llm
311
293
  .command("test")
312
294
  .description(
@@ -760,9 +760,9 @@ export function registerSessionCommand(program, dependencies = {}) {
760
760
  const ingress = composition.evolutionIngress;
761
761
  await ingress.start();
762
762
  const lifecycle = await startChatRepl({
763
- model: options.model || sess.model || "qwen2:7b",
763
+ model: options.model || sess.model,
764
764
  provider: options.provider || sess.provider || "ollama",
765
- baseUrl: options.baseUrl || "http://localhost:11434",
765
+ baseUrl: options.baseUrl,
766
766
  resumeMessages: sess.messages,
767
767
  sessionId: sess.id,
768
768
  evolutionIngress: ingress,
@@ -13,6 +13,7 @@
13
13
  import { logger } from "../lib/logger.js";
14
14
  import { loadConfig } from "../lib/config-manager.js";
15
15
  import { buildProviderSource } from "../lib/provider-stream.js";
16
+ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
16
17
  import {
17
18
  readEvolutionCompositionFactory,
18
19
  prepareGovernedModelTurn,
@@ -29,16 +30,19 @@ export function registerStreamCommand(program, dependencies = {}) {
29
30
  )
30
31
  .argument("<prompt>", "The prompt to stream")
31
32
  .option("--model <model>", "Model name")
32
- .option("--provider <provider>", "LLM provider", "ollama")
33
+ .option("--provider <provider>", "LLM provider (default: configured)")
33
34
  .option("--base-url <url>", "API base URL")
34
35
  .option("--api-key <key>", "API key")
35
36
  .option("--text", "Emit concatenated final text instead of NDJSON events")
36
37
  .action(async (prompt, options) => {
37
38
  const config = loadConfig();
38
- const provider = options.provider || config.llm?.provider || "ollama";
39
- const baseUrl = options.baseUrl || config.llm?.baseUrl;
40
- const apiKey = options.apiKey || config.llm?.apiKey;
41
- const model = options.model || config.llm?.model;
39
+ const connection = resolveLlmConnection(options, [config.llm || {}], {
40
+ defaultModel:
41
+ (options.provider || config.llm?.provider || "ollama") === "ollama"
42
+ ? "qwen2:7b"
43
+ : null,
44
+ });
45
+ const { provider, baseUrl, apiKey, model } = connection;
42
46
 
43
47
  try {
44
48
  const { createStreamRouter } =
@@ -1,6 +1,8 @@
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 { loadEvolutionDeploymentCommandDependencies } from "../lib/evolution/evolution-deployment-loader.js";
5
+ import { getEvolutionDeploymentStatus } from "../lib/evolution/evolution-deployment-config.js";
4
6
 
5
7
  export function registerUiCommand(program, dependencies = {}) {
6
8
  const evolutionCompositionFactory =
@@ -27,6 +29,29 @@ export function registerUiCommand(program, dependencies = {}) {
27
29
  )
28
30
  .action(async (opts) => {
29
31
  try {
32
+ let activeEvolutionCompositionFactory = evolutionCompositionFactory;
33
+ if (activeEvolutionCompositionFactory === null) {
34
+ let deploymentDependencies = null;
35
+ let localTrustSetupError = null;
36
+ try {
37
+ deploymentDependencies =
38
+ await loadEvolutionDeploymentCommandDependencies("ui", {
39
+ initializeDefaultLocalUi: true,
40
+ });
41
+ } catch (error) {
42
+ localTrustSetupError = error;
43
+ }
44
+ activeEvolutionCompositionFactory = readEvolutionCompositionFactory(
45
+ deploymentDependencies || {},
46
+ );
47
+ if (activeEvolutionCompositionFactory === null) {
48
+ const status = await getEvolutionDeploymentStatus();
49
+ const readiness = status.readiness.ui;
50
+ logger.warn(
51
+ `Quick Ask model egress is unavailable (${readiness.code}): ${localTrustSetupError?.message || readiness.detail}. ${readiness.remediation || "Review cc evolution deployment status."}`,
52
+ );
53
+ }
54
+ }
30
55
  // Allow env vars to override CLI defaults — host/token/port/uiMode.
31
56
  // Use case: Android local terminal app pre-injects CC_UI_HOST=0.0.0.0
32
57
  // + a per-install CC_UI_TOKEN so `cc ui` is reachable from other
@@ -47,9 +72,12 @@ export function registerUiCommand(program, dependencies = {}) {
47
72
  );
48
73
  const runtime = createAgentRuntimeFactory({
49
74
  deps:
50
- evolutionCompositionFactory === null
75
+ activeEvolutionCompositionFactory === null
51
76
  ? {}
52
- : { evolutionCompositionFactory },
77
+ : {
78
+ evolutionCompositionFactory:
79
+ activeEvolutionCompositionFactory,
80
+ },
53
81
  }).createUiRuntime({
54
82
  port,
55
83
  wsPort: parseInt(opts.wsPort, 10),
@@ -1,6 +1,45 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.166.112",
7
+ "cliVersions": ["0.166.112"],
8
+ "date": "2026-10-21",
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Fixed - cc CLI 0.166.112: retain generated Evolution test signing keys (candidate, 2026-10-21)",
13
+ "body": "- Preserve the supplied private signing-key path when saving an explicit Evolution test deployment, so generated test deployments remain usable after configuration.\n- Align Windows ACL fixtures with Session Core's extended-path PowerShell protocol while keeping CLI-facing paths unchanged.\n- Pair VS Code 0.37.155 and JetBrains 0.4.172 with CLI 0.166.112. Publish Session Core 0.3.21 first, then CLI through the exact-SHA GitHub Actions OIDC workflow; publish IDE extensions only after npm readback succeeds."
14
+ }
15
+ ]
16
+ },
17
+ {
18
+ "productVersion": null,
19
+ "cliVersion": "0.166.111",
20
+ "cliVersions": ["0.166.111"],
21
+ "date": "2026-10-21",
22
+ "title": "",
23
+ "sections": [
24
+ {
25
+ "heading": "Fixed - cc CLI 0.166.111: route every configured provider correctly (candidate, 2026-10-21)",
26
+ "body": "- Route Gemini Quick Ask, `cc ask`, interactive chat and `cc stream` through Google's native `generateContent` API; keep agent and Hub compatibility clients on Google's `/v1beta/openai` endpoint.\n- Send Anthropic through its native Messages API in `cc ask` and `cc stream`; keep OpenAI-compatible providers and configured proxies on `/chat/completions`.\n- Remove trailing slashes before provider endpoint paths, send Gemini credentials in headers, and avoid reusing a different provider's saved model, URL or API key after a provider override.\n- Publish Session Core 0.3.21 before this CLI release for the Windows long-path ACL fix used by signed local Quick Ask storage.\n- Pair IDE candidates VS Code 0.37.155 and JetBrains 0.4.172 with CLI 0.166.111 after the public CLI package is available."
27
+ }
28
+ ]
29
+ },
30
+ {
31
+ "productVersion": null,
32
+ "cliVersion": "0.166.110",
33
+ "cliVersions": ["0.166.110"],
34
+ "date": "2026-10-21",
35
+ "title": "",
36
+ "sections": [
37
+ {
38
+ "heading": "Fixed - cc CLI 0.166.110: normalize Ollama native API URLs (candidate, 2026-10-21)",
39
+ "body": "- Strip an optional trailing `/v1` from Ollama base URLs before native `/api/*` requests across agent chat, streaming chat, model probes, and provider checks, preventing requests such as `/v1/api/chat` from returning 404.\n- Save Ollama connection settings with the native API base URL while preserving `/v1` on OpenAI-compatible providers.\n- Initialize a user-scoped signed Evolution host on the first `cc ui` launch when no deployment exists, removing manual signature setup from Quick Ask while keeping the local authority limited to UI model turns and bound to each run.\n- Add a verified Windows local NTFS directory flush for local UI evidence before witness CAS; unsupported profile storage fails during initialization rather than after starting Quick Ask.\n- Child npm package versions remain unchanged. IDE extensions are not part of this CLI release."
40
+ }
41
+ ]
42
+ },
4
43
  {
5
44
  "productVersion": null,
6
45
  "cliVersion": "0.166.109",
@@ -37,16 +37,13 @@ import {
37
37
  streamOllama,
38
38
  streamOpenAI,
39
39
  streamAnthropic,
40
+ streamGemini,
40
41
  } from "../../lib/chat-core.js";
41
42
  import { BUILT_IN_PROVIDERS } from "../../lib/llm-providers.js";
42
43
  import { resolveLlmCreds } from "./llm-creds.js";
43
44
  import { prepareGovernedModelTurn } from "../../lib/evolution/governed-model-turn.js";
44
-
45
- function normalizeOllamaBaseUrl(value) {
46
- return String(value || "http://localhost:11434")
47
- .replace(/\/v1\/?$/i, "")
48
- .replace(/\/+$/, "");
49
- }
45
+ import { normalizeOllamaBaseUrl } from "../../lib/ollama-base-url.js";
46
+ import { normalizeProviderBaseUrl } from "../../lib/provider-protocol.js";
50
47
 
51
48
  function validateMessages(messages) {
52
49
  if (!Array.isArray(messages) || messages.length === 0)
@@ -136,7 +133,7 @@ export async function handleLlmChat(server, id, ws, message) {
136
133
  const baseUrl =
137
134
  creds.provider === "ollama"
138
135
  ? normalizeOllamaBaseUrl(creds.baseUrl)
139
- : creds.baseUrl || "http://localhost:11434";
136
+ : normalizeProviderBaseUrl(creds.baseUrl);
140
137
  if (creds.provider === "ollama") {
141
138
  await streamOllama(
142
139
  turn.messages,
@@ -148,8 +145,7 @@ export async function handleLlmChat(server, id, ws, message) {
148
145
  streamOptions,
149
146
  );
150
147
  } else if (creds.provider === "anthropic") {
151
- const def = BUILT_IN_PROVIDERS.anthropic;
152
- const url = baseUrl !== "http://localhost:11434" ? baseUrl : def.baseUrl;
148
+ const url = baseUrl;
153
149
  await streamAnthropic(
154
150
  turn.messages,
155
151
  creds.model,
@@ -160,12 +156,24 @@ export async function handleLlmChat(server, id, ws, message) {
160
156
  undefined,
161
157
  streamOptions,
162
158
  );
159
+ } else if (creds.provider === "gemini") {
160
+ const url = baseUrl;
161
+ await streamGemini(
162
+ turn.messages,
163
+ creds.model,
164
+ url,
165
+ creds.apiKey,
166
+ onToken,
167
+ onUsage,
168
+ undefined,
169
+ streamOptions,
170
+ );
163
171
  } else {
164
172
  // OpenAI-compatible — covers openai / volcengine / deepseek / dashscope /
165
173
  // kimi / minimax / mistral / custom. baseUrl from creds; default-from
166
174
  // BUILT_IN_PROVIDERS already applied above.
167
175
  const def = BUILT_IN_PROVIDERS[creds.provider];
168
- const url = baseUrl !== "http://localhost:11434" ? baseUrl : def?.baseUrl;
176
+ const url = baseUrl || def?.baseUrl;
169
177
  await streamOpenAI(
170
178
  turn.messages,
171
179
  creds.model,