chainlesschain 0.166.109 → 0.166.114
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 -6
- 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/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-DkrNbDzS.js → AIOps-CVac3rIN.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DJjFXDhv.js → ActionButton-ChM9GxMl.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DyUbagRn.js → Analytics-CV5399Js.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-p7kJWSvn.js → AppLayout-CuonVXhg.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-C3rVh4Ak.js → Artifacts-D9qKfgb6.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bch_L_YO.js → Audit-DUvLysQc.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BNHy8zP6.js → BackgroundAgents-DfKohQeT.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BUaye_Ys.js → Backup-CohoEI8R.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-D49mzAVz.js → BaseInput-BwdoA3xv.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-2MDzM_us.js → Chat-DRkuz1d2.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-v3pzeHNC.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-5p1T_KEq.js → Checkbox-B-GNGpKv.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-TKtiLaoZ.js → Codegen-Bs2lAsoZ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BVCMG9mS.js → Col-Bk1mJKDZ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D09-QczH.js → Community-B_FDSCOo.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-QuRMCnj7.js → Compact-No1qSLLH.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CN0PV7fk.js → Compliance-CcrG43-d.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-5N2zhAty.js → Cowork-DLkj2ywK.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-BxT8UZ0S.js → Cron-sQHELVEz.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Dp-noQl4.js → Crosschain-CRTZ3GZg.js} +1 -1
- package/src/assets/web-panel/assets/{DID-B7MZFkjG.js → DID-Ds2bjvxE.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DulJ3rKV.js → Dashboard-DOONG2NX.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DV4ov4zF.js → Dropdown-Br3PNA2L.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DB2-ooz6.js → EmailListRenderer-DT6UUqjZ.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-B1Rb6p7q.js → EvolutionSettings-BSLuEjlT.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-U8aHayx-.js → FamilyGuardDashboard-2aEM9avE.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BkQULBHY.js → Federation-D3B0tlQU.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CtviG260.js → FormItemContext-DTVkVVQP.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DnPirB24.js → GenericCardRenderer-BgFEgP4y.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CK57Oro6.js → Git-3t71m6Xd.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DbI-LB8-.js → Governance-DS7WvlaX.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-sEG4T1Jg.js → Inference-CeT-xWrI.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-9SLJR3h9.js → KnowledgeGraph-BQzMncp5.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BIZYcISQ.js → Logs-CC5DOKhV.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-9nfWupWP.js → MarkdownRenderer-5jYM4kYG.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CRmLLwAE.js → Marketplace-CpYDyy3o.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DkOFkSO1.js → McpTools-DRdAZPMr.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-M29Kd9TU.js → Memory-CBLRr-l8.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Tl6JvPw_.js → MobileBridge-Bnj9veNN.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Bq-FPDzS.js → MobileProjects-lYFPD24p.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DkUjX1F5.js → Mtc-BMU_C9vD.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BCqr1I4q.js → MtcAudit-DQV-zumU.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-DmoqYGQ5.js → Multisig-LpqpqV1d.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DNRQeRke.js → NLProgramming-C4OMklSO.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CQSBeiY6.js → Notes-Cg0QCinP.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-gNY9bbH6.js → NotificationSettings-amoZoMna.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DW0CNjh8.js → OrderTableRenderer-CxNvhf5n.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CthnbKag.js → Organization-BetJmyX5.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-_GQ3sbXu.js → Overflow-DbeoPtVD.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BTr7ea6W.js → P2P-B5sitQWT.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-AP9SG2ic.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-DMny2Cjs.js → Permissions-Bc7fgNKx.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CyYlMSoI.js → PersonalDataHub-BwdGMcWZ.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-FASu2Oc4.js → Pipeline-DVuJA9BA.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-9bC5FnsJ.js → Privacy-BGzwOYRG.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BOYZwB5G.js → ProjectInit-BpHcC5br.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-45DViNG-.js → ProjectSettings-BI5G5gsc.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-C2fZzMZc.js → Projects-Ce92-l1V.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BgjvZx9F.js → Providers-CRHCcLFS.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Brw-3csB.js → QrScannerModal-qSeg5xag.js} +1 -1
- package/src/assets/web-panel/assets/QuickAsk-CA8oSceR.js +1 -0
- package/src/assets/web-panel/assets/{Recommend-DuQGxjIR.js → Recommend-DMvPodNo.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-T1cdSSRL.js → RemoteSession-BWsapEyN.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-9FT2dI4G.js → Reputation-BZJETVmC.js} +1 -1
- package/src/assets/web-panel/assets/{Row-yNIbNftX.js → Row-CUE1OSMp.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BIchNoPd.js → RssFeed-DvMazcUD.js} +2 -2
- package/src/assets/web-panel/assets/{Search-msDJ8UTZ.js → Search-e1c-NXWv.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DE46oBYT.js → Security-Dc9GZsx2.js} +3 -3
- package/src/assets/web-panel/assets/{Services-Dori7vc3.js → Services-AFz6ke-4.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-D3O3sUFz.js → Skeleton-gow6MYcY.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BV0ct8SO.js → Skills-h6AxYjUP.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DflIVOrh.js → Sla-Cr4CkJ0O.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Cpbv2Zz6.js → SpeechSettings-Bd5yuBtH.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Dgg6-wbe.js → SyncSettings-1t4QZMLW.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Cb6e4Klx.js → Tasks-u-DrjLRM.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-GfdAATGz.js → Templates-C0yLUC9b.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-D0gecLXl.js → Tenant-ds1YT5iS.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BFRPJt-0.js → Terminal-BoIskW2m.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BobtChxX.js → TimelineRenderer-BkdVK24X.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CifeZtHV.js → Tokens-djyDgmfk.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BHBvbBCf.js → Trigger-CYefDS3H.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-6lvqjKYp.js → Trust-CE_dbep_.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CqzMc-G5.js → UkeySign-DwVs_fey.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-OIiRG582.js → VideoEditing-BTUqMHAV.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-4MeKq0q_.js → Wallet-Bu_E7Rrc.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-eHBRjGQG.js → WebAuthn-DTbre5AB.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-DlzYdEqW.js → WorkflowEditor-BsBzd3gt.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CBcjOzkX.js → chat-tdifQQvu.js} +1 -1
- package/src/assets/web-panel/assets/{colors-zgwsYQSa.js → colors-D3SNW2Vx.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Dcd9H5Bn.js → compact-item-UBlCjrAW.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DR1tO-8r.js → createContext-DKsnEnFt.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BBnVfJHh.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CtfbUH_p.js → hasIn-BkeySXWe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXfGHUz_.js → index-6Nvzgytx.js} +1 -1
- package/src/assets/web-panel/assets/index-B2w_3mtS.js +1 -0
- package/src/assets/web-panel/assets/{index-DYPMJ5Mb.js → index-BEiHKah0.js} +25 -25
- package/src/assets/web-panel/assets/{index-LN7Hkl1C.js → index-BIeFLaMV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DA2-Bhy8.js → index-BV2zQteq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CwHgaYVH.js → index-BVvz3ntc.js} +1 -1
- package/src/assets/web-panel/assets/index-BoHurydC.js +1 -0
- package/src/assets/web-panel/assets/{index-DVpp9YSQ.js → index-Bw0k3VgD.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaGNqkY0.js → index-C-KTHSUE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWuCGhHa.js → index-C9ImNw5O.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTx4FyLU.js → index-CG_b1xyX.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cur8LNNn.js → index-CUjyL0ZS.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfzOYmOj.js → index-CXkn77ZN.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cdhy5ckh.js → index-CZ6JUooI.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1GxtY-h.js → index-Cuz2QCFT.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0kP88Pb.js → index-D5Umd_Z-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHEiuvhA.js → index-D6es7MSG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPLLgPxA.js → index-D93iSDUw.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3QUK1ks.js → index-D9m1HQzl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWG98orp.js → index-D9um0YVl.js} +1 -1
- package/src/assets/web-panel/assets/{index-hTcre7U9.js → index-DD6dD3LV.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5XGvJb0.js → index-DFMrIEIt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvPOpvvH.js → index-DSCiZJXb.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8WPohye.js → index-DSe_7MSy.js} +1 -1
- package/src/assets/web-panel/assets/{index-JSfldpw4.js → index-DYFjOyTH.js} +1 -1
- package/src/assets/web-panel/assets/{index-5XaB_Tjg.js → index-DdyTv6yc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoxowMYS.js → index-DfrW-iVs.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSvcz0RO.js → index-Dg8-Duze.js} +1 -1
- package/src/assets/web-panel/assets/{index-J-ORW1i6.js → index-DiDgwRty.js} +1 -1
- package/src/assets/web-panel/assets/{index-CT7zIkqP.js → index-DlEIp1gJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7ZOiIKb.js → index-DlO6HdD9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeAi4CNt.js → index-DtxUSZSS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmVIM-m2.js → index-DugZRCiI.js} +1 -1
- package/src/assets/web-panel/assets/{index-oWOlF7CM.js → index-P-ailFQY.js} +1 -1
- package/src/assets/web-panel/assets/{index-dvF6C39V.js → index-PWScrdlX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSQCHpDo.js → index-SpQ26gD6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmzQzTY5.js → index-TLBpgN30.js} +1 -1
- package/src/assets/web-panel/assets/{index-z8lrkcb-.js → index-bOIcWW8F.js} +1 -1
- package/src/assets/web-panel/assets/{index-BndPtS9D.js → index-pgGKNvmm.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CVMtDrWZ.js → initDefaultProps-CVCXG2Hv.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Dye3IU8k.js → motion-Dv00jw87.js} +1 -1
- package/src/assets/web-panel/assets/{move-C251Zo34.js → move-BFz51iHf.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BDiOORoQ.js → mtc-parser-BK2woIDE.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DTDA_RHv.js → omit-D2X_Gwoo.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CqEUTPcT.js → pickAttrs-CLmFyJ1q.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BOB8QWH3.js → placementArrow-CCzPddQm.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CZDXP1d9.js → responsiveObserve-hcm_Zlxd.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DPaRw3E9.js → slide-BxfZEFVp.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Ba9d7XZ7.js → statusUtils-kzB9pT-t.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-mZKU3lvW.js → styleChecker-CDFd7YCI.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-VcauLq0M.js → useFlexGapSupport-Czl7NNhS.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Cal9KRcx.js → useFs-y0SAzirG.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DISoRyQB.js → usePersonalDataHub-BvdPznrA.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-B58C6w6B.js → vnode-D8mNbyZ7.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BPlBAMKB.js → zoom-_hun6w9W.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 +65 -0
- package/src/gateways/ws/llm-chat-protocol.js +131 -40
- package/src/gateways/ws/llm-creds.js +29 -79
- package/src/gateways/ws/message-dispatcher.js +2 -0
- package/src/gateways/ws/ws-agent-handler.js +1 -1
- 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 +36 -4
- package/src/lib/evolution/evolution-deployment-loader.js +117 -4
- 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 +768 -0
- package/src/lib/evolution/local-ui-evolution-host.mjs +44 -0
- package/src/lib/evolution/local-ui-evolution-runtime.js +624 -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-DOX3Y5EJ.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-D9McHF9I.js +0 -7
- package/src/assets/web-panel/assets/QuickAsk-DWG-A5zB.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DYhpRtve.js +0 -1
- package/src/assets/web-panel/assets/index-DPJXFIY7.js +0 -1
- package/src/assets/web-panel/assets/index-DjBhR5M_.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as v}from"./index-
|
|
1
|
+
import{u as v}from"./index-BEiHKah0.js";import{u as _}from"./useShellMode-CgR0wCYM.js";function d(r){if(!r)return r;if(r.error)throw new Error(r.error);return r.result!==void 0?r.result:r}async function p(r,s={},e=!0){try{if(e!==!0||!r||typeof r.sendRaw!="function")return{status:"unavailable",path:null};const a=await r.sendRaw({type:"fs.openDirectory",title:s.title},6e4);if(a&&(a.ok===!1||a.error))return{status:"unavailable",path:null};const t=a&&a.result!==void 0?a.result:a;return t&&(t.ok===!1||t.error||t.unsupported===!0)?{status:"unavailable",path:null}:t&&t.canceled===!0?{status:"cancelled",path:null}:t&&typeof t.path=="string"&&t.path.length>0?{status:"selected",path:t.path}:{status:"unavailable",path:null}}catch{return{status:"unavailable",path:null}}}function b(r,s,e,a,t){return typeof r.onMessage!="function"||typeof r.sendRaw!="function"?r.sendRaw({type:s,...e},t).then(d):new Promise((n,u)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${s}.event`,m=`${s}.end`;let c=!1,h=()=>{};const o=(i,f)=>{if(!c){c=!0,clearTimeout(g);try{h()}catch{}i(f)}},g=setTimeout(()=>{o(u,new Error(`stream timeout (${t}ms): ${s}`))},t),y=r.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof a=="function")try{a(i.event||i)}catch{}return}if(i.type===m){o(n,d(i));return}i.type==="error"&&o(u,new Error(i.message||"stream error"))}});h=typeof y=="function"?y:()=>{},Promise.resolve(r.sendRaw({id:l,type:s,...e},t)).catch(()=>{})})}function k(){const r=v(),s=_(),e=(a,t={},n=3e4)=>r.sendRaw({type:a,...t},n).then(d);return{async health(){return await e("personal-data-hub.health",{},8e3)},async stats(){return await e("personal-data-hub.stats",{},8e3)},async listAdapters(){return await e("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const t=await r.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),n=t&&t.result!==void 0?t.result:t,u=n&&typeof n.path=="string"?n.path:n&&typeof n.filePath=="string"?n.filePath:null;return n&&n.canceled!==!0&&u?u:null}catch{return null}},async pickDirectoryResult(a={}){return await p(r,a,s.isEmbedded)},async pickDirectory(a={}){const t=await p(r,a,s.isEmbedded);return t.status==="selected"?t.path:null},async adapterReadiness(a){return await e("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,t={}){return await e("personal-data-hub.sync-adapter",{name:a,options:t},6e5)},async syncAll(a={}){return await e("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:t=20,seed:n=1}={}){return await e("personal-data-hub.register-mock",{name:a,count:t,seed:n})},async unregister(a){return await e("personal-data-hub.unregister",{name:a})},async ask(a,t={}){return await e("personal-data-hub.ask",{question:a,options:t},18e4)},async queryEvents(a={}){return await e("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await e("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await e("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await e("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await e("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,t={}){return await e("personal-data-hub.register-email",{account:a,opts:t},15e3)},async unregisterEmail(a){return await e("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await e("personal-data-hub.list-email-accounts",{},5e3)},async activateEmail(a){return await e("personal-data-hub.activate-email",{email:a},5e3)},async eventDetail(a){return await e("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,t={},n){return await b(r,"personal-data-hub.sync-adapter-stream",{name:a,options:t},n,6e5)},async syncAllStream(a={},t){return await b(r,"personal-data-hub.sync-all-stream",{options:a},t,9e5)},async registerAlipay(a,t={}){return await e("personal-data-hub.register-alipay",{account:a,opts:t},15e3)},async unregisterAlipay(a){return await e("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await e("personal-data-hub.list-alipay-accounts",{},5e3)},async activateAlipay(a){return await e("personal-data-hub.activate-alipay",{email:a},5e3)},async importAlipayBill({zipPath:a,csvPath:t,zipPassword:n}={}){return await e("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:t,zipPassword:n},3e5)},async reviewQueueList(a=50){return await e("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,t){return await e("personal-data-hub.review-decision",{reviewId:a,decision:t},5e3)},async manualMerge(a,t){return await e("personal-data-hub.manual-merge",{aId:a,bId:t},5e3)},async manualUnmerge(a){return await e("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await e("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await e("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await e("personal-data-hub.skills-list",{},5e3)},async runSkill(a,t={}){return await e("personal-data-hub.run-skill",{name:a,options:t},12e4)},async openAichatLogin(a,t={}){return await e("personal-data-hub.aichat-open-login",{vendor:a,opts:t},1e4)},async probeAichatCookies(a,t){return await e("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:t},1e4)},async registerAichatVendor(a,t,n={}){return await e("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:t,opts:n},3e4)},async rotateAichatLogin(a){return await e("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await e("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await e("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await e("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await e("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l}={}){return await e("personal-data-hub.register-wechat",{account:a,dbPath:t,wechatDataPath:n,fridaOpts:u,keyProviderOverride:l},45e3)},async listWechatAccounts(){return await e("personal-data-hub.list-wechat-accounts",{},5e3)},async activateWechat(a,t={}){return await e("personal-data-hub.activate-wechat",{uin:a,fridaOpts:t.fridaOpts,keyProviderOverride:t.keyProviderOverride},45e3)},async unregisterWechat(a){return await e("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await e("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await e("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await e("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await e("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await e("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await e("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await e("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await e("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{k as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as i,h as a,w as l}from"./index-
|
|
1
|
+
import{N as i,h as a,w as l}from"./index-BEiHKah0.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-Bn1JzzAn.js";function c(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,u=e;if(Array.isArray(e)&&(u=i(e)[0]),!u)return null;const n=o(u,r,s);return n.props=t?a(a({},n.props),r):n.props,l(typeof n.props.class!="object","class must be string"),n}function V(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return e.map(s=>c(s,r,t))}function v(e,r,t){p(o(e,a({},r)),t)}const m=e=>(e||[]).some(r=>g(r)?!(r.type===d||r.type===f&&!m(r.children)):!0)?e:null;function h(e,r,t,s){var u;const n=(u=e[r])===null||u===void 0?void 0:u.call(e,t);return m(n)?n:s?.()}export{h as a,V as b,c,v as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{K as o}from"./index-
|
|
1
|
+
import{K as o}from"./index-BEiHKah0.js";import{i as f}from"./motion-Dv00jw87.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
|
|
2
2
|
${t}-enter,
|
|
3
3
|
${t}-appear
|
|
4
4
|
`]:{transform:"scale(0)",opacity:0,animationTimingFunction:n.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${t}-leave`]:{animationTimingFunction:n.motionEaseInOutCirc}}]};export{h as i,c as z};
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// Injected by web-ui-server.js at serve time
|
|
9
9
|
window.__CC_CONFIG__ = __CC_CONFIG_PLACEHOLDER__;
|
|
10
10
|
</script>
|
|
11
|
-
<script type="module" crossorigin src="./assets/index-
|
|
11
|
+
<script type="module" crossorigin src="./assets/index-BEiHKah0.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="./assets/vendor-Bn1JzzAn.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="./assets/icons-DG5UD-6K.js">
|
|
14
14
|
<link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
"status": "Usage: chainlesschain status [options]\n\nShow status of ChainlessChain app and services\n\nOptions:\n --json Output as machine-readable JSON\n --deep Include Docker Compose service inspection\n -h, --help display help for command\n",
|
|
154
154
|
"statusline": "Usage: chainlesschain statusline|status-line [options] [command]\n\nPreview / show the .claude/settings.json statusLine\n\nOptions:\n -h, --help display help for command\n\nCommands:\n preview [options] Render the configured status line once\n show [options] Show the resolved statusLine config\n help [command] display help for command\n",
|
|
155
155
|
"stop": "Usage: chainlesschain stop [options]\n\nStop ChainlessChain\n\nOptions:\n --services Stop Docker services only\n --all Stop both app and Docker services\n -h, --help display help for command\n",
|
|
156
|
-
"stream": "Usage: chainlesschain stream [options] <prompt>\n\nStream a single prompt through session-core StreamRouter (NDJSON on stdout)\n\nArguments:\n prompt The prompt to stream\n\nOptions:\n --model <model> Model name\n --provider <provider> LLM provider (default:
|
|
156
|
+
"stream": "Usage: chainlesschain stream [options] <prompt>\n\nStream a single prompt through session-core StreamRouter (NDJSON on stdout)\n\nArguments:\n prompt The prompt to stream\n\nOptions:\n --model <model> Model name\n --provider <provider> LLM provider (default: configured)\n --base-url <url> API base URL\n --api-key <key> API key\n --text Emit concatenated final text instead of NDJSON events\n -h, --help display help for command\n",
|
|
157
157
|
"stress": "Usage: chainlesschain stress [options] [command]\n\nFederation stress testing — load simulation, bottleneck & capacity planning\n\nOptions:\n -h, --help display help for command\n\nCommands:\n run [options] Run a stress test at a given load level\n list [options] List stress test history\n show [options] <test-id> Show full results for a stress test\n analyze [options] <test-id> Analyze bottlenecks for a stress test\n plan [options] <test-id> Generate capacity plan recommendations\n stop <test-id> Mark a running stress test as stopped\n levels [options] List built-in load levels\n run-statuses List RUN_STATUS_V2 values\n level-names List LEVEL_NAME_V2 values\n bottleneck-kinds List BOTTLENECK_KIND_V2 values\n bottleneck-severities List BOTTLENECK_SEVERITY_V2 values\n default-max-concurrent Show STRESS_DEFAULT_MAX_CONCURRENT\n max-concurrent Show current max concurrent test limit\n active-test-count Show current active (RUNNING) test count\n set-max-concurrent <n> Set max concurrent test admission limit\n start-v2 [options] Start a V2 stress run (RUNNING, no metrics until complete)\n complete [options] <test-id> Complete a RUNNING run and compute metrics\n stop-v2 <test-id> Stop a RUNNING run (→ STOPPED)\n fail <test-id> <error-message> Fail a RUNNING run with an error message (→ FAILED)\n set-status [options] <test-id> <status> Transition run to a given status (state-machine guarded)\n recommend-level [options] <target-rps> Recommend the largest built-in level ≤ targetRps\n stats-v2 Show aggregate V2 stats (byStatus/byLevel/bottlenecks)\n help [command] display help for command\n",
|
|
158
158
|
"subagent": "Usage: chainlesschain subagent [options] [command]\n\nSub-agent registry V2 governance\n\nOptions:\n -h, --help display help for command\n\nCommands:\n maturities-v2\n task-lifecycle-v2\n stats-v2\n config-v2\n register-profile-v2 <id> <owner> [role]\n activate-profile-v2 <id>\n pause-profile-v2 <id>\n retire-profile-v2 <id>\n touch-profile-v2 <id>\n get-profile-v2 <id>\n list-profiles-v2\n create-task-v2 <id> <profileId> [desc]\n start-task-v2 <id>\n complete-task-v2 <id>\n fail-task-v2 <id> [reason]\n cancel-task-v2 <id> [reason]\n get-task-v2 <id>\n list-tasks-v2\n auto-pause-idle-v2\n auto-fail-stuck-v2\n set-max-active-v2 <n>\n set-max-pending-v2 <n>\n set-idle-ms-v2 <n>\n set-stuck-ms-v2 <n>\n reset-state-v2\n help [command] display help for command\n",
|
|
159
159
|
"svccont": "Usage: chainlesschain svccont [options] [command]\n\nService Container V2 governance\n\nOptions:\n -h, --help display help for command\n\nCommands:\n enums-v2\n config-v2\n set-max-active-v2 <n>\n set-max-pending-v2 <n>\n set-idle-ms-v2 <n>\n set-stuck-ms-v2 <n>\n register-container-v2 [options] <id> <owner>\n activate-container-v2 <id>\n degrade-container-v2 <id>\n decommission-container-v2 <id>\n touch-container-v2 <id>\n get-container-v2 <id>\n list-containers-v2\n create-resolution-v2 [options] <id> <containerId>\n resolving-resolution-v2 <id>\n resolve-resolution-v2 <id>\n fail-resolution-v2 <id> [reason]\n cancel-resolution-v2 <id> [reason]\n get-resolution-v2 <id>\n list-resolutions-v2\n auto-degrade-idle-v2\n auto-fail-stuck-v2\n gov-stats-v2\n reset-state-v2\n help [command] display help for command\n",
|
package/src/commands/agent.js
CHANGED
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
normalizeFallbackModels,
|
|
24
24
|
} from "../runtime/fallback-model.js";
|
|
25
25
|
import { resolveImages, resolveVisionLlm } from "../lib/image-input.js";
|
|
26
|
+
import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
|
|
26
27
|
import { loadConfig } from "../lib/config-manager.js";
|
|
27
28
|
import { captureUnattendedActionPolicy } from "../lib/unattended-action-policy.js";
|
|
28
29
|
import {
|
|
@@ -1480,18 +1481,24 @@ export function registerAgentCommand(program, dependencies = {}) {
|
|
|
1480
1481
|
}
|
|
1481
1482
|
}
|
|
1482
1483
|
|
|
1484
|
+
const configuredLlm = loadConfig().llm || {};
|
|
1485
|
+
const visionConnection = resolveLlmConnection(options, [configuredLlm]);
|
|
1483
1486
|
const visionLlm = resolveVisionLlm({
|
|
1484
1487
|
hasImage: images.length > 0,
|
|
1485
1488
|
flags: {
|
|
1486
1489
|
model: explicitCliModel,
|
|
1487
1490
|
visionModel: options.visionModel,
|
|
1491
|
+
provider: options.provider,
|
|
1488
1492
|
},
|
|
1489
1493
|
llm: {
|
|
1490
|
-
...
|
|
1491
|
-
provider:
|
|
1492
|
-
model:
|
|
1493
|
-
baseUrl:
|
|
1494
|
-
apiKey:
|
|
1494
|
+
...configuredLlm,
|
|
1495
|
+
provider: visionConnection.provider,
|
|
1496
|
+
model: visionConnection.model,
|
|
1497
|
+
baseUrl: visionConnection.baseUrl,
|
|
1498
|
+
apiKey: visionConnection.apiKey,
|
|
1499
|
+
visionModel: visionConnection.endpointSources.includes(configuredLlm)
|
|
1500
|
+
? configuredLlm.visionModel
|
|
1501
|
+
: undefined,
|
|
1495
1502
|
},
|
|
1496
1503
|
});
|
|
1497
1504
|
|
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,71 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "CHANGELOG.md",
|
|
3
3
|
"releases": [
|
|
4
|
+
{
|
|
5
|
+
"productVersion": null,
|
|
6
|
+
"cliVersion": "0.166.114",
|
|
7
|
+
"cliVersions": ["0.166.114"],
|
|
8
|
+
"date": "2026-10-22",
|
|
9
|
+
"title": "",
|
|
10
|
+
"sections": [
|
|
11
|
+
{
|
|
12
|
+
"heading": "Fixed - cc CLI 0.166.114: Quick Ask streaming and local Evolution setup (candidate, 2026-10-22)",
|
|
13
|
+
"body": "- Surface provider waiting status, credential errors, and terminal streaming failures in Quick Ask; bound governed chat initialization and completion to 60 seconds and support cancellation of active requests.\n- Migrate a supported signed UI-only local Evolution host to admit `agent`, `ask`, `chat`, and `ui`, retaining its signing identity and detecting concurrent profile changes.\n- Prepare VS Code 0.37.156 and JetBrains 0.4.173 to recommend CLI 0.166.114. These versions are unreleased candidates; publication still requires the exact release commit's GitHub Actions gates, OIDC npm publication and public readback before IDE publication."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"productVersion": null,
|
|
19
|
+
"cliVersion": "0.166.113",
|
|
20
|
+
"cliVersions": ["0.166.113"],
|
|
21
|
+
"date": "2026-10-22",
|
|
22
|
+
"title": "",
|
|
23
|
+
"sections": [
|
|
24
|
+
{
|
|
25
|
+
"heading": "cc CLI 0.166.113 release attempt (unpublished, 2026-10-22)",
|
|
26
|
+
"body": "- The immutable candidate did not pass its macOS release gate because a test asserted a temporary-path alias; no npm or IDE publication is claimed."
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"productVersion": null,
|
|
32
|
+
"cliVersion": "0.166.112",
|
|
33
|
+
"cliVersions": ["0.166.112"],
|
|
34
|
+
"date": "2026-10-22",
|
|
35
|
+
"title": "",
|
|
36
|
+
"sections": [
|
|
37
|
+
{
|
|
38
|
+
"heading": "Fixed - cc CLI 0.166.112: retain generated Evolution test signing keys (published, 2026-10-22)",
|
|
39
|
+
"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- Public pairing: CLI 0.166.112, Open VSX 0.37.155 and JetBrains 0.4.172. Session Core 0.3.21 preceded the CLI; exact-source CLI CI and Strict Sandbox passed before OIDC npm publication, and both IDE channels followed verified npm readback. [Publication evidence](https://github.com/chainlesschain/chainlesschain/blob/main/docs/research/cli/evidence/release112-public/publication.json)."
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"productVersion": null,
|
|
45
|
+
"cliVersion": "0.166.111",
|
|
46
|
+
"cliVersions": ["0.166.111"],
|
|
47
|
+
"date": "2026-10-21",
|
|
48
|
+
"title": "",
|
|
49
|
+
"sections": [
|
|
50
|
+
{
|
|
51
|
+
"heading": "Fixed - cc CLI 0.166.111: route every configured provider correctly (candidate, 2026-10-21)",
|
|
52
|
+
"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."
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"productVersion": null,
|
|
58
|
+
"cliVersion": "0.166.110",
|
|
59
|
+
"cliVersions": ["0.166.110"],
|
|
60
|
+
"date": "2026-10-21",
|
|
61
|
+
"title": "",
|
|
62
|
+
"sections": [
|
|
63
|
+
{
|
|
64
|
+
"heading": "Fixed - cc CLI 0.166.110: normalize Ollama native API URLs (candidate, 2026-10-21)",
|
|
65
|
+
"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."
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
},
|
|
4
69
|
{
|
|
5
70
|
"productVersion": null,
|
|
6
71
|
"cliVersion": "0.166.109",
|