chainlesschain 0.166.108 → 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.
- package/README.md +14 -7
- package/package.json +3 -2
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-B5HWUFaS.js → AIOps-sOceeExN.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DCIKpxoQ.js → ActionButton-BQs-vRUr.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-dsgvjCEQ.js → Analytics-sfAHHMhA.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DWDH5Qbm.js → AppLayout-0gAvE0c8.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-BD8S8kzU.js → Artifacts-Dh9s2Qmd.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CDXv4Aoj.js → Audit-CITm26SU.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BLAQ5Uy0.js → BackgroundAgents-BiMbBOh0.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-moPac6tF.js → Backup-CNpnhI3h.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C_6nzsLU.js → BaseInput-BI_lltkp.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-cYuslkFG.js → Chat-BgfB88xY.js} +6 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BDP3fGoz.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-Qjb-XOX_.js → Checkbox-4xy9rS3j.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-IYRWXlMA.js → Codegen-D93h9ihS.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CsQ9jv8M.js → Col-BRf3STY-.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BbNmfTwe.js → Community-f187ziSL.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-SShDx-nr.js → Compact-D4hXWuo1.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CLWhKIJp.js → Compliance-C6cYKI6H.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-D4tK9_s3.js → Cowork-C1i1f8LD.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-D7GnfQ1z.js → Cron-BacCE4LA.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-TG86SH3X.js → Crosschain-DXztxOoH.js} +1 -1
- package/src/assets/web-panel/assets/{DID-6pue0NCO.js → DID-rpf4HN8x.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BwkJ29du.js → Dashboard-h4bgtH7L.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DEvpYDof.js → Dropdown-CyQnoHmu.js} +1 -1
- package/src/assets/web-panel/assets/EmailListRenderer-FCtp4AcB.js +1 -0
- package/src/assets/web-panel/assets/{EvolutionSettings-tpvPMM9W.js → EvolutionSettings-JbISHTWR.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CWYFW75O.js → FamilyGuardDashboard-DCIQLyfK.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-gRIi96rM.js → Federation-DDbFpwja.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-B7Nr3YkV.js → FormItemContext-CXF0jtXb.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-b1BgGgLT.js → GenericCardRenderer-CUaNfAM0.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Dis1jjO7.js → Git-Bhoz2gDf.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-C4Yg99Am.js → Governance-FiiXHe8e.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-D4UQRbGu.js → Inference-brpTW2Q3.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Co_kLMAq.js → KnowledgeGraph-BCWP-f6k.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-D4BRp7bg.js → Logs-CxYcduoK.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-12vD1nC1.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-ys0j1vr9.js → Marketplace-DANdmW7l.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-B3ZvRZe_.js → McpTools-Bi_EKkb5.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-BOa0jbr-.js → Memory-DecoMbYw.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CWJRmUbj.js → MobileBridge-DrOhFKp0.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-rRwP16dN.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-CCcOk5m5.js → Mtc-SLPII1iw.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-vlrrScbQ.js → MtcAudit-DWoVORYy.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-C8K59S_8.js → Multisig-Dxpnmq-m.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-oTpFYVme.js → NLProgramming-kNTpNqCP.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BhqAJWiz.js → Notes-D1uXCfVd.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DCnV1CJM.js → NotificationSettings-D3Qt8Gkl.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CZGnsrVW.js → OrderTableRenderer-qvaah2-m.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DX1LuQlJ.js → Organization-EhRl4JoJ.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CbfKrFdT.js → Overflow-BTt5C_5W.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BEwYZuHL.js → P2P-CeR2jyb0.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-YNmWbwd7.js → PdhVaultBrowser-BzD3OHWq.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DyZ18LiA.js → Permissions-BOPyeRlz.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-B2J3aw2g.js → PersonalDataHub-DcmNNsfO.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-CXl2ZlhQ.js → Pipeline-DuL3kwWC.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-I5SDmgAp.js → Privacy-CkQRdlSU.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Crl9tXw3.js → ProjectInit-moE_vQ1P.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DCFtFlSK.js → ProjectSettings-PnTWi4NQ.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Do5BQq1i.js → Projects-DZvbT3D7.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Cb7OWa3y.js → Providers-CkcrHYy9.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CJmhAU-s.js → QrScannerModal-nYNFGf_H.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Cu6lEWou.js → QuickAsk-53WNo7xT.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Crip3jLB.js → Recommend-CmYN_NaS.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-KxYY-2CB.js → RemoteSession-BuOdNEjA.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-D0vN-htI.js → Reputation-BgkheZou.js} +1 -1
- package/src/assets/web-panel/assets/{Row-wqzd_xCD.js → Row-DvA3klj1.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-8lsPfb0a.js → RssFeed-CgkIL3PG.js} +3 -3
- package/src/assets/web-panel/assets/{Search-C-e8qAeU.js → Search-Cv2twJdL.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CMM9WgFy.js → Security-XrD2UNU6.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CZdxjN2B.js → Services-LujCntCK.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BI3XNk35.js → Skeleton-ZZCOsxPX.js} +1 -1
- package/src/assets/web-panel/assets/Skills-BEXGkOrU.js +1 -0
- package/src/assets/web-panel/assets/{Sla-HQruznKY.js → Sla-CIqmCgdD.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Dl-MFq3w.js → SpeechSettings-DkVbwJox.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BU224vDm.js → SyncSettings-BVGgUs0p.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-C1lh68l5.js +1 -0
- package/src/assets/web-panel/assets/{Templates-Jb3TPz4Q.js → Templates-BG4zNAFx.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CQ-GTrfa.js → Tenant-t2o6i5fY.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BbMl3Rue.js → Terminal-CH8UDdVO.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CS_vstKF.js → TimelineRenderer-B5sYY1IO.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BaopVl1f.js → Tokens-D0y7QkG5.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DtnD4WUN.js → Trigger-BA2nKko0.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CsvG4Tmf.js → Trust-CrFKCQIs.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C1-A-cOV.js → UkeySign-B3x_-Zun.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CNgJPdSL.js → VideoEditing-TEwxbLH6.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CdF41501.js → Wallet-Larp5rrt.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-D-JmxD5g.js → WebAuthn-DfWbEIZe.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-C0XunR13.js → WorkflowEditor-8LKiKExY.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BBAZpD_G.js → chat-ByxYOvYW.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BxSxO5BX.js → colors-Dh4yAClh.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BoxL8pg5.js → compact-item-f5n2j1WZ.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-W5JAyZmY.js → createContext-DIprYuXL.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DRIge35Z.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-HpiKDPVC.js → hasIn-CvYeap2I.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9VxE1C-.js → index-3ROY-lYB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdEcQ1rp.js → index-6VEWxOyC.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4uI7WCB.js → index-7eG1J-GT.js} +1 -1
- package/src/assets/web-panel/assets/{index-_38IJqoP.js → index-B0AXUhiJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7GIUWWF.js → index-BS_dpgzu.js} +1 -1
- package/src/assets/web-panel/assets/{index-ooP1pQCt.js → index-BaXSBxy-.js} +1 -1
- package/src/assets/web-panel/assets/{index-gvfIRZxJ.js → index-Bk8oWRk6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSJ0cAle.js → index-BlImvgb7.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5kqii-G.js → index-BoayvJ48.js} +1 -1
- package/src/assets/web-panel/assets/index-Bq24rTYx.js +1 -0
- package/src/assets/web-panel/assets/{index-B05_YRHZ.js → index-BsU46c7D.js} +1 -1
- package/src/assets/web-panel/assets/{index-_p4e3KfB.js → index-BvyFQF8I.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bwn6k_qw.js → index-C2RGykST.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtFAEG08.js → index-C5aH2Pj2.js} +1 -1
- package/src/assets/web-panel/assets/{index-CehxfRUR.js → index-CD0s5ESV.js} +1 -1
- package/src/assets/web-panel/assets/{index-JrMBRi62.js → index-CIZQtz8G.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRg3aOoj.js → index-CJjc8ObW.js} +1 -1
- package/src/assets/web-panel/assets/{index-V6VIJe2N.js → index-CTqJNul4.js} +1 -1
- package/src/assets/web-panel/assets/{index-p6rNtYud.js → index-CcvA1nae.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6m6B4Wy.js → index-CpR0zD38.js} +1 -1
- package/src/assets/web-panel/assets/{index-IO2I7nzu.js → index-CzabQZ7I.js} +1 -1
- package/src/assets/web-panel/assets/index-D2f18WsK.js +1 -0
- package/src/assets/web-panel/assets/{index-9caMEwQ-.js → index-DGyTzElU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DinY7IQa.js → index-DI8jC7gQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DuM9I1If.js → index-DUj-sL9U.js} +1 -1
- package/src/assets/web-panel/assets/{index-DkSnlgK_.js → index-DaZVtafQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CM_gdohF.js → index-DjvON8oh.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcmAiq_Y.js → index-DlJCDpeN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaJk9U9V.js → index-DlTwZIeX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgMViZIY.js → index-DlULGx8u.js} +1 -1
- package/src/assets/web-panel/assets/{index-BA3WWQAT.js → index-DmcAL4hd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSyfxxQS.js → index-DshB3-Up.js} +3 -3
- package/src/assets/web-panel/assets/{index-BZAbaY64.js → index-Du435yzt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BW4PP5GN.js → index-bt-0zMmH.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlPvZgv8.js → index-c_CxUQl3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ba4usRFM.js → index-fpWv4u3Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-DwidpDEE.js → index-hwbaD3Nk.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcyzZloJ.js → index-uDiVjYrS.js} +1 -1
- package/src/assets/web-panel/assets/{index-QzlEbtRL.js → index-xU0eHLIH.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Dfn6M05J.js → initDefaultProps-DRuE92W6.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BRRwFqGO.js → motion-6Sgma5Vd.js} +1 -1
- package/src/assets/web-panel/assets/{move-DpDPN6zR.js → move-BbQsH8sb.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BHlSE87F.js → mtc-parser-BdC4INal.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CEOri_L5.js → omit-DeC5m_bi.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DqICh-ad.js → pickAttrs-DuehpBws.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DQizFFiV.js → placementArrow-CJEhv2ij.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DmFHPdvC.js → responsiveObserve-Dyw3lDGr.js} +1 -1
- package/src/assets/web-panel/assets/{slide-s2s1XS3T.js → slide-BMaLXTbS.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-IwEIbBan.js → statusUtils-c1K_SdJH.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CIFLlbXH.js → styleChecker-CefBry8k.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CFkN2Cgh.js → useFlexGapSupport-Dj2IsZpo.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BSY6O48s.js → useFs-RLfB3yqb.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-iJl3VnU0.js → usePersonalDataHub-DbRVH_NA.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-vu8ReMs7.js → vnode-DTn_QVJz.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CeSrYAHp.js → zoom-DuFR0E7i.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agent.js +12 -5
- package/src/commands/ask.js +96 -21
- package/src/commands/complete.js +14 -10
- package/src/commands/llm.js +23 -41
- package/src/commands/session.js +2 -2
- package/src/commands/stream.js +9 -5
- package/src/commands/ui.js +30 -2
- package/src/data/changelog.json +52 -0
- package/src/gateways/ws/llm-chat-protocol.js +23 -5
- package/src/gateways/ws/llm-creds.js +38 -60
- package/src/gateways/ws/ws-agent-handler.js +1 -1
- package/src/gateways/ws/ws-server.js +47 -0
- package/src/gateways/ws/ws-session-gateway.js +26 -12
- package/src/lib/__tests__/provider-stream.test.js +70 -4
- package/src/lib/chat-core.js +186 -24
- package/src/lib/cowork-adapter.js +29 -15
- package/src/lib/evolution/agent-evolution-runtime-composition.js +10 -7
- package/src/lib/evolution/evolution-deployment-config.js +27 -4
- package/src/lib/evolution/evolution-deployment-loader.js +58 -3
- package/src/lib/evolution/evolution-deployment-profile.js +2 -2
- package/src/lib/evolution/evolution-evidence-projector.js +18 -3
- package/src/lib/evolution/evolution-file-witness.js +10 -0
- package/src/lib/evolution/evolution-ledger.js +237 -28
- package/src/lib/evolution/evolution-windows-directory-durability.js +322 -0
- package/src/lib/evolution/governed-hub-llm.js +2 -1
- package/src/lib/evolution/governed-model-turn.js +4 -1
- package/src/lib/evolution/local-ui-evolution-deployment.js +682 -0
- package/src/lib/evolution/local-ui-evolution-host.mjs +26 -0
- package/src/lib/evolution/local-ui-evolution-runtime.js +601 -0
- package/src/lib/evolution/opaque-hex-id.js +28 -0
- package/src/lib/hub-llm-client.js +22 -14
- package/src/lib/image-input.js +19 -3
- package/src/lib/llm-config-defaults.js +19 -30
- package/src/lib/llm-connection-config.js +4 -0
- package/src/lib/llm-connection-probe.js +5 -1
- package/src/lib/llm-connection-resolution.js +94 -0
- package/src/lib/llm-providers.js +33 -11
- package/src/lib/ollama-base-url.js +14 -0
- package/src/lib/provider-protocol.js +104 -0
- package/src/lib/provider-stream.js +163 -4
- package/src/lib/runnable-provider.js +1 -0
- package/src/repl/chat-repl.js +58 -11
- package/src/runtime/agent-core.js +26 -43
- package/src/runtime/headless-runner.js +11 -4
- package/src/runtime/headless-stream.js +10 -4
- package/src/runtime/policies/agent-policy.js +17 -11
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Ceh3MG6M.js +0 -1
- package/src/assets/web-panel/assets/EmailListRenderer-CQj7UlKJ.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-Dgy8arQI.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-7ty8vTpj.js +0 -1
- package/src/assets/web-panel/assets/Skills-DMlsh9It.js +0 -1
- package/src/assets/web-panel/assets/Tasks-DESg3yCs.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BI5TZ7EX.js +0 -1
- package/src/assets/web-panel/assets/index-9-JLDK5n.js +0 -1
- package/src/assets/web-panel/assets/index-B7m8ioaQ.js +0 -1
package/src/commands/ask.js
CHANGED
|
@@ -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 =
|
|
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
|
|
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
|
-
|
|
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
|
|
256
|
-
const
|
|
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.
|
package/src/commands/complete.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
143
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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);
|
package/src/commands/llm.js
CHANGED
|
@@ -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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
304
|
-
//
|
|
305
|
-
//
|
|
306
|
-
//
|
|
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(
|
package/src/commands/session.js
CHANGED
|
@@ -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
|
|
763
|
+
model: options.model || sess.model,
|
|
764
764
|
provider: options.provider || sess.provider || "ollama",
|
|
765
|
-
baseUrl: options.baseUrl
|
|
765
|
+
baseUrl: options.baseUrl,
|
|
766
766
|
resumeMessages: sess.messages,
|
|
767
767
|
sessionId: sess.id,
|
|
768
768
|
evolutionIngress: ingress,
|
package/src/commands/stream.js
CHANGED
|
@@ -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
|
|
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
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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 } =
|
package/src/commands/ui.js
CHANGED
|
@@ -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
|
-
|
|
75
|
+
activeEvolutionCompositionFactory === null
|
|
51
76
|
? {}
|
|
52
|
-
: {
|
|
77
|
+
: {
|
|
78
|
+
evolutionCompositionFactory:
|
|
79
|
+
activeEvolutionCompositionFactory,
|
|
80
|
+
},
|
|
53
81
|
}).createUiRuntime({
|
|
54
82
|
port,
|
|
55
83
|
wsPort: parseInt(opts.wsPort, 10),
|
package/src/data/changelog.json
CHANGED
|
@@ -1,6 +1,58 @@
|
|
|
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
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"productVersion": null,
|
|
45
|
+
"cliVersion": "0.166.109",
|
|
46
|
+
"cliVersions": ["0.166.109"],
|
|
47
|
+
"date": "2026-10-21",
|
|
48
|
+
"title": "",
|
|
49
|
+
"sections": [
|
|
50
|
+
{
|
|
51
|
+
"heading": "Fixed - cc CLI 0.166.109: use saved LLM settings for Web Panel Quick Ask (candidate, 2026-10-21)",
|
|
52
|
+
"body": "- Resolve the selected provider, endpoint, model, and API key from current saved CLI settings for Web Panel Quick Ask requests.\n- Avoid pairing credentials with a different saved endpoint during concurrent config updates, and keep provider/environment fallback behavior explicit.\n- Normalize Ollama endpoints that include the OpenAI-compatible `/v1` suffix before sending Ollama requests.\n- Child npm package versions remain unchanged. IDE extensions are not part of this CLI release."
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
},
|
|
4
56
|
{
|
|
5
57
|
"productVersion": null,
|
|
6
58
|
"cliVersion": "0.166.108",
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
* Provider resolution (first non-null wins):
|
|
27
27
|
* 1. message.options — explicit provider/model/apiKey from the client
|
|
28
28
|
* 2. server.sessionManager.getSession(sessionId) — set via `cc auth llm`
|
|
29
|
-
* 3.
|
|
29
|
+
* 3. Current saved `config.llm`
|
|
30
|
+
* 4. process.env[BUILT_IN_PROVIDERS[provider].apiKeyEnv]
|
|
30
31
|
*
|
|
31
32
|
* Without any source of credentials we send a clean ok:false frame instantly
|
|
32
33
|
* — the user sees an actionable error rather than a 60s hang.
|
|
@@ -36,10 +37,13 @@ import {
|
|
|
36
37
|
streamOllama,
|
|
37
38
|
streamOpenAI,
|
|
38
39
|
streamAnthropic,
|
|
40
|
+
streamGemini,
|
|
39
41
|
} from "../../lib/chat-core.js";
|
|
40
42
|
import { BUILT_IN_PROVIDERS } from "../../lib/llm-providers.js";
|
|
41
43
|
import { resolveLlmCreds } from "./llm-creds.js";
|
|
42
44
|
import { prepareGovernedModelTurn } from "../../lib/evolution/governed-model-turn.js";
|
|
45
|
+
import { normalizeOllamaBaseUrl } from "../../lib/ollama-base-url.js";
|
|
46
|
+
import { normalizeProviderBaseUrl } from "../../lib/provider-protocol.js";
|
|
43
47
|
|
|
44
48
|
function validateMessages(messages) {
|
|
45
49
|
if (!Array.isArray(messages) || messages.length === 0)
|
|
@@ -126,7 +130,10 @@ export async function handleLlmChat(server, id, ws, message) {
|
|
|
126
130
|
requireCompletion: turn.governed,
|
|
127
131
|
signal: controller.signal,
|
|
128
132
|
};
|
|
129
|
-
const baseUrl =
|
|
133
|
+
const baseUrl =
|
|
134
|
+
creds.provider === "ollama"
|
|
135
|
+
? normalizeOllamaBaseUrl(creds.baseUrl)
|
|
136
|
+
: normalizeProviderBaseUrl(creds.baseUrl);
|
|
130
137
|
if (creds.provider === "ollama") {
|
|
131
138
|
await streamOllama(
|
|
132
139
|
turn.messages,
|
|
@@ -138,8 +145,7 @@ export async function handleLlmChat(server, id, ws, message) {
|
|
|
138
145
|
streamOptions,
|
|
139
146
|
);
|
|
140
147
|
} else if (creds.provider === "anthropic") {
|
|
141
|
-
const
|
|
142
|
-
const url = baseUrl !== "http://localhost:11434" ? baseUrl : def.baseUrl;
|
|
148
|
+
const url = baseUrl;
|
|
143
149
|
await streamAnthropic(
|
|
144
150
|
turn.messages,
|
|
145
151
|
creds.model,
|
|
@@ -150,12 +156,24 @@ export async function handleLlmChat(server, id, ws, message) {
|
|
|
150
156
|
undefined,
|
|
151
157
|
streamOptions,
|
|
152
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
|
+
);
|
|
153
171
|
} else {
|
|
154
172
|
// OpenAI-compatible — covers openai / volcengine / deepseek / dashscope /
|
|
155
173
|
// kimi / minimax / mistral / custom. baseUrl from creds; default-from
|
|
156
174
|
// BUILT_IN_PROVIDERS already applied above.
|
|
157
175
|
const def = BUILT_IN_PROVIDERS[creds.provider];
|
|
158
|
-
const url = baseUrl
|
|
176
|
+
const url = baseUrl || def?.baseUrl;
|
|
159
177
|
await streamOpenAI(
|
|
160
178
|
turn.messages,
|
|
161
179
|
creds.model,
|