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.
Files changed (207) hide show
  1. package/README.md +14 -6
  2. package/package.json +3 -2
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/.build-hash +1 -1
  6. package/src/assets/web-panel/assets/{AIOps-DkrNbDzS.js → AIOps-CVac3rIN.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-DJjFXDhv.js → ActionButton-ChM9GxMl.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-DyUbagRn.js → Analytics-CV5399Js.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-p7kJWSvn.js → AppLayout-CuonVXhg.js} +3 -3
  10. package/src/assets/web-panel/assets/{Artifacts-C3rVh4Ak.js → Artifacts-D9qKfgb6.js} +1 -1
  11. package/src/assets/web-panel/assets/{Audit-Bch_L_YO.js → Audit-DUvLysQc.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-BNHy8zP6.js → BackgroundAgents-DfKohQeT.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-BUaye_Ys.js → Backup-CohoEI8R.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-D49mzAVz.js → BaseInput-BwdoA3xv.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-2MDzM_us.js → Chat-DRkuz1d2.js} +5 -5
  16. package/src/assets/web-panel/assets/ChatBubbleRenderer-v3pzeHNC.js +1 -0
  17. package/src/assets/web-panel/assets/{Checkbox-5p1T_KEq.js → Checkbox-B-GNGpKv.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-TKtiLaoZ.js → Codegen-Bs2lAsoZ.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-BVCMG9mS.js → Col-Bk1mJKDZ.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-D09-QczH.js → Community-B_FDSCOo.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-QuRMCnj7.js → Compact-No1qSLLH.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-CN0PV7fk.js → Compliance-CcrG43-d.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-5N2zhAty.js → Cowork-DLkj2ywK.js} +3 -3
  24. package/src/assets/web-panel/assets/{Cron-BxT8UZ0S.js → Cron-sQHELVEz.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-Dp-noQl4.js → Crosschain-CRTZ3GZg.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-B7MZFkjG.js → DID-Ds2bjvxE.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-DulJ3rKV.js → Dashboard-DOONG2NX.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-DV4ov4zF.js → Dropdown-Br3PNA2L.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-DB2-ooz6.js → EmailListRenderer-DT6UUqjZ.js} +1 -1
  30. package/src/assets/web-panel/assets/{EvolutionSettings-B1Rb6p7q.js → EvolutionSettings-BSLuEjlT.js} +1 -1
  31. package/src/assets/web-panel/assets/{FamilyGuardDashboard-U8aHayx-.js → FamilyGuardDashboard-2aEM9avE.js} +1 -1
  32. package/src/assets/web-panel/assets/{Federation-BkQULBHY.js → Federation-D3B0tlQU.js} +1 -1
  33. package/src/assets/web-panel/assets/{FormItemContext-CtviG260.js → FormItemContext-DTVkVVQP.js} +1 -1
  34. package/src/assets/web-panel/assets/{GenericCardRenderer-DnPirB24.js → GenericCardRenderer-BgFEgP4y.js} +1 -1
  35. package/src/assets/web-panel/assets/{Git-CK57Oro6.js → Git-3t71m6Xd.js} +2 -2
  36. package/src/assets/web-panel/assets/{Governance-DbI-LB8-.js → Governance-DS7WvlaX.js} +1 -1
  37. package/src/assets/web-panel/assets/{Inference-sEG4T1Jg.js → Inference-CeT-xWrI.js} +1 -1
  38. package/src/assets/web-panel/assets/{KnowledgeGraph-9SLJR3h9.js → KnowledgeGraph-BQzMncp5.js} +1 -1
  39. package/src/assets/web-panel/assets/{Logs-BIZYcISQ.js → Logs-CC5DOKhV.js} +2 -2
  40. package/src/assets/web-panel/assets/{MarkdownRenderer-9nfWupWP.js → MarkdownRenderer-5jYM4kYG.js} +1 -1
  41. package/src/assets/web-panel/assets/{Marketplace-CRmLLwAE.js → Marketplace-CpYDyy3o.js} +1 -1
  42. package/src/assets/web-panel/assets/{McpTools-DkOFkSO1.js → McpTools-DRdAZPMr.js} +3 -3
  43. package/src/assets/web-panel/assets/{Memory-M29Kd9TU.js → Memory-CBLRr-l8.js} +2 -2
  44. package/src/assets/web-panel/assets/{MobileBridge-Tl6JvPw_.js → MobileBridge-Bnj9veNN.js} +1 -1
  45. package/src/assets/web-panel/assets/{MobileProjects-Bq-FPDzS.js → MobileProjects-lYFPD24p.js} +1 -1
  46. package/src/assets/web-panel/assets/{Mtc-DkUjX1F5.js → Mtc-BMU_C9vD.js} +2 -2
  47. package/src/assets/web-panel/assets/{MtcAudit-BCqr1I4q.js → MtcAudit-DQV-zumU.js} +4 -4
  48. package/src/assets/web-panel/assets/{Multisig-DmoqYGQ5.js → Multisig-LpqpqV1d.js} +3 -3
  49. package/src/assets/web-panel/assets/{NLProgramming-DNRQeRke.js → NLProgramming-C4OMklSO.js} +1 -1
  50. package/src/assets/web-panel/assets/{Notes-CQSBeiY6.js → Notes-Cg0QCinP.js} +3 -3
  51. package/src/assets/web-panel/assets/{NotificationSettings-gNY9bbH6.js → NotificationSettings-amoZoMna.js} +1 -1
  52. package/src/assets/web-panel/assets/{OrderTableRenderer-DW0CNjh8.js → OrderTableRenderer-CxNvhf5n.js} +1 -1
  53. package/src/assets/web-panel/assets/{Organization-CthnbKag.js → Organization-BetJmyX5.js} +4 -4
  54. package/src/assets/web-panel/assets/{Overflow-_GQ3sbXu.js → Overflow-DbeoPtVD.js} +1 -1
  55. package/src/assets/web-panel/assets/{P2P-BTr7ea6W.js → P2P-B5sitQWT.js} +2 -2
  56. package/src/assets/web-panel/assets/PdhVaultBrowser-AP9SG2ic.js +7 -0
  57. package/src/assets/web-panel/assets/{Permissions-DMny2Cjs.js → Permissions-Bc7fgNKx.js} +4 -4
  58. package/src/assets/web-panel/assets/{PersonalDataHub-CyYlMSoI.js → PersonalDataHub-BwdGMcWZ.js} +3 -3
  59. package/src/assets/web-panel/assets/{Pipeline-FASu2Oc4.js → Pipeline-DVuJA9BA.js} +1 -1
  60. package/src/assets/web-panel/assets/{Privacy-9bC5FnsJ.js → Privacy-BGzwOYRG.js} +1 -1
  61. package/src/assets/web-panel/assets/{ProjectInit-BOYZwB5G.js → ProjectInit-BpHcC5br.js} +2 -2
  62. package/src/assets/web-panel/assets/{ProjectSettings-45DViNG-.js → ProjectSettings-BI5G5gsc.js} +2 -2
  63. package/src/assets/web-panel/assets/{Projects-C2fZzMZc.js → Projects-Ce92-l1V.js} +1 -1
  64. package/src/assets/web-panel/assets/{Providers-BgjvZx9F.js → Providers-CRHCcLFS.js} +1 -1
  65. package/src/assets/web-panel/assets/{QrScannerModal-Brw-3csB.js → QrScannerModal-qSeg5xag.js} +1 -1
  66. package/src/assets/web-panel/assets/QuickAsk-CA8oSceR.js +1 -0
  67. package/src/assets/web-panel/assets/{Recommend-DuQGxjIR.js → Recommend-DMvPodNo.js} +1 -1
  68. package/src/assets/web-panel/assets/{RemoteSession-T1cdSSRL.js → RemoteSession-BWsapEyN.js} +2 -2
  69. package/src/assets/web-panel/assets/{Reputation-9FT2dI4G.js → Reputation-BZJETVmC.js} +1 -1
  70. package/src/assets/web-panel/assets/{Row-yNIbNftX.js → Row-CUE1OSMp.js} +1 -1
  71. package/src/assets/web-panel/assets/{RssFeed-BIchNoPd.js → RssFeed-DvMazcUD.js} +2 -2
  72. package/src/assets/web-panel/assets/{Search-msDJ8UTZ.js → Search-e1c-NXWv.js} +1 -1
  73. package/src/assets/web-panel/assets/{Security-DE46oBYT.js → Security-Dc9GZsx2.js} +3 -3
  74. package/src/assets/web-panel/assets/{Services-Dori7vc3.js → Services-AFz6ke-4.js} +2 -2
  75. package/src/assets/web-panel/assets/{Skeleton-D3O3sUFz.js → Skeleton-gow6MYcY.js} +1 -1
  76. package/src/assets/web-panel/assets/{Skills-BV0ct8SO.js → Skills-h6AxYjUP.js} +1 -1
  77. package/src/assets/web-panel/assets/{Sla-DflIVOrh.js → Sla-Cr4CkJ0O.js} +1 -1
  78. package/src/assets/web-panel/assets/{SpeechSettings-Cpbv2Zz6.js → SpeechSettings-Bd5yuBtH.js} +1 -1
  79. package/src/assets/web-panel/assets/{SyncSettings-Dgg6-wbe.js → SyncSettings-1t4QZMLW.js} +2 -2
  80. package/src/assets/web-panel/assets/{Tasks-Cb6e4Klx.js → Tasks-u-DrjLRM.js} +1 -1
  81. package/src/assets/web-panel/assets/{Templates-GfdAATGz.js → Templates-C0yLUC9b.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tenant-D0gecLXl.js → Tenant-ds1YT5iS.js} +1 -1
  83. package/src/assets/web-panel/assets/{Terminal-BFRPJt-0.js → Terminal-BoIskW2m.js} +2 -2
  84. package/src/assets/web-panel/assets/{TimelineRenderer-BobtChxX.js → TimelineRenderer-BkdVK24X.js} +1 -1
  85. package/src/assets/web-panel/assets/{Tokens-CifeZtHV.js → Tokens-djyDgmfk.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trigger-BHBvbBCf.js → Trigger-CYefDS3H.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trust-6lvqjKYp.js → Trust-CE_dbep_.js} +1 -1
  88. package/src/assets/web-panel/assets/{UkeySign-CqzMc-G5.js → UkeySign-DwVs_fey.js} +1 -1
  89. package/src/assets/web-panel/assets/{VideoEditing-OIiRG582.js → VideoEditing-BTUqMHAV.js} +1 -1
  90. package/src/assets/web-panel/assets/{Wallet-4MeKq0q_.js → Wallet-Bu_E7Rrc.js} +4 -4
  91. package/src/assets/web-panel/assets/{WebAuthn-eHBRjGQG.js → WebAuthn-DTbre5AB.js} +4 -4
  92. package/src/assets/web-panel/assets/{WorkflowEditor-DlzYdEqW.js → WorkflowEditor-BsBzd3gt.js} +1 -1
  93. package/src/assets/web-panel/assets/{chat-CBcjOzkX.js → chat-tdifQQvu.js} +1 -1
  94. package/src/assets/web-panel/assets/{colors-zgwsYQSa.js → colors-D3SNW2Vx.js} +1 -1
  95. package/src/assets/web-panel/assets/{compact-item-Dcd9H5Bn.js → compact-item-UBlCjrAW.js} +1 -1
  96. package/src/assets/web-panel/assets/{createContext-DR1tO-8r.js → createContext-DKsnEnFt.js} +1 -1
  97. package/src/assets/web-panel/assets/devWarning-BBnVfJHh.js +1 -0
  98. package/src/assets/web-panel/assets/{hasIn-CtfbUH_p.js → hasIn-BkeySXWe.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BXfGHUz_.js → index-6Nvzgytx.js} +1 -1
  100. package/src/assets/web-panel/assets/index-B2w_3mtS.js +1 -0
  101. package/src/assets/web-panel/assets/{index-DYPMJ5Mb.js → index-BEiHKah0.js} +25 -25
  102. package/src/assets/web-panel/assets/{index-LN7Hkl1C.js → index-BIeFLaMV.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DA2-Bhy8.js → index-BV2zQteq.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CwHgaYVH.js → index-BVvz3ntc.js} +1 -1
  105. package/src/assets/web-panel/assets/index-BoHurydC.js +1 -0
  106. package/src/assets/web-panel/assets/{index-DVpp9YSQ.js → index-Bw0k3VgD.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CaGNqkY0.js → index-C-KTHSUE.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DWuCGhHa.js → index-C9ImNw5O.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DTx4FyLU.js → index-CG_b1xyX.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Cur8LNNn.js → index-CUjyL0ZS.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DfzOYmOj.js → index-CXkn77ZN.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Cdhy5ckh.js → index-CZ6JUooI.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-D1GxtY-h.js → index-Cuz2QCFT.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-C0kP88Pb.js → index-D5Umd_Z-.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DHEiuvhA.js → index-D6es7MSG.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CPLLgPxA.js → index-D93iSDUw.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-B3QUK1ks.js → index-D9m1HQzl.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DWG98orp.js → index-D9um0YVl.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-hTcre7U9.js → index-DD6dD3LV.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-C5XGvJb0.js → index-DFMrIEIt.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DvPOpvvH.js → index-DSCiZJXb.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-D8WPohye.js → index-DSe_7MSy.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-JSfldpw4.js → index-DYFjOyTH.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-5XaB_Tjg.js → index-DdyTv6yc.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BoxowMYS.js → index-DfrW-iVs.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DSvcz0RO.js → index-Dg8-Duze.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-J-ORW1i6.js → index-DiDgwRty.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CT7zIkqP.js → index-DlEIp1gJ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-D7ZOiIKb.js → index-DlO6HdD9.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DeAi4CNt.js → index-DtxUSZSS.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CmVIM-m2.js → index-DugZRCiI.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-oWOlF7CM.js → index-P-ailFQY.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-dvF6C39V.js → index-PWScrdlX.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CSQCHpDo.js → index-SpQ26gD6.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CmzQzTY5.js → index-TLBpgN30.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-z8lrkcb-.js → index-bOIcWW8F.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-BndPtS9D.js → index-pgGKNvmm.js} +1 -1
  138. package/src/assets/web-panel/assets/{initDefaultProps-CVMtDrWZ.js → initDefaultProps-CVCXG2Hv.js} +1 -1
  139. package/src/assets/web-panel/assets/{motion-Dye3IU8k.js → motion-Dv00jw87.js} +1 -1
  140. package/src/assets/web-panel/assets/{move-C251Zo34.js → move-BFz51iHf.js} +1 -1
  141. package/src/assets/web-panel/assets/{mtc-parser-BDiOORoQ.js → mtc-parser-BK2woIDE.js} +1 -1
  142. package/src/assets/web-panel/assets/{omit-DTDA_RHv.js → omit-D2X_Gwoo.js} +1 -1
  143. package/src/assets/web-panel/assets/{pickAttrs-CqEUTPcT.js → pickAttrs-CLmFyJ1q.js} +1 -1
  144. package/src/assets/web-panel/assets/{placementArrow-BOB8QWH3.js → placementArrow-CCzPddQm.js} +1 -1
  145. package/src/assets/web-panel/assets/{responsiveObserve-CZDXP1d9.js → responsiveObserve-hcm_Zlxd.js} +1 -1
  146. package/src/assets/web-panel/assets/{slide-DPaRw3E9.js → slide-BxfZEFVp.js} +1 -1
  147. package/src/assets/web-panel/assets/{statusUtils-Ba9d7XZ7.js → statusUtils-kzB9pT-t.js} +1 -1
  148. package/src/assets/web-panel/assets/{styleChecker-mZKU3lvW.js → styleChecker-CDFd7YCI.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFlexGapSupport-VcauLq0M.js → useFlexGapSupport-Czl7NNhS.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFs-Cal9KRcx.js → useFs-y0SAzirG.js} +1 -1
  151. package/src/assets/web-panel/assets/{usePersonalDataHub-DISoRyQB.js → usePersonalDataHub-BvdPznrA.js} +1 -1
  152. package/src/assets/web-panel/assets/{vnode-B58C6w6B.js → vnode-D8mNbyZ7.js} +1 -1
  153. package/src/assets/web-panel/assets/{zoom-BPlBAMKB.js → zoom-_hun6w9W.js} +1 -1
  154. package/src/assets/web-panel/index.html +1 -1
  155. package/src/command-help-index.json +1 -1
  156. package/src/commands/agent.js +12 -5
  157. package/src/commands/ask.js +96 -21
  158. package/src/commands/complete.js +14 -10
  159. package/src/commands/llm.js +23 -41
  160. package/src/commands/session.js +2 -2
  161. package/src/commands/stream.js +9 -5
  162. package/src/commands/ui.js +30 -2
  163. package/src/data/changelog.json +65 -0
  164. package/src/gateways/ws/llm-chat-protocol.js +131 -40
  165. package/src/gateways/ws/llm-creds.js +29 -79
  166. package/src/gateways/ws/message-dispatcher.js +2 -0
  167. package/src/gateways/ws/ws-agent-handler.js +1 -1
  168. package/src/gateways/ws/ws-session-gateway.js +26 -12
  169. package/src/lib/__tests__/provider-stream.test.js +70 -4
  170. package/src/lib/chat-core.js +186 -24
  171. package/src/lib/cowork-adapter.js +29 -15
  172. package/src/lib/evolution/agent-evolution-runtime-composition.js +10 -7
  173. package/src/lib/evolution/evolution-deployment-config.js +36 -4
  174. package/src/lib/evolution/evolution-deployment-loader.js +117 -4
  175. package/src/lib/evolution/evolution-deployment-profile.js +2 -2
  176. package/src/lib/evolution/evolution-evidence-projector.js +18 -3
  177. package/src/lib/evolution/evolution-file-witness.js +10 -0
  178. package/src/lib/evolution/evolution-ledger.js +237 -28
  179. package/src/lib/evolution/evolution-windows-directory-durability.js +322 -0
  180. package/src/lib/evolution/governed-hub-llm.js +2 -1
  181. package/src/lib/evolution/governed-model-turn.js +4 -1
  182. package/src/lib/evolution/local-ui-evolution-deployment.js +768 -0
  183. package/src/lib/evolution/local-ui-evolution-host.mjs +44 -0
  184. package/src/lib/evolution/local-ui-evolution-runtime.js +624 -0
  185. package/src/lib/evolution/opaque-hex-id.js +28 -0
  186. package/src/lib/hub-llm-client.js +22 -14
  187. package/src/lib/image-input.js +19 -3
  188. package/src/lib/llm-config-defaults.js +19 -30
  189. package/src/lib/llm-connection-config.js +4 -0
  190. package/src/lib/llm-connection-probe.js +5 -1
  191. package/src/lib/llm-connection-resolution.js +94 -0
  192. package/src/lib/llm-providers.js +33 -11
  193. package/src/lib/ollama-base-url.js +14 -0
  194. package/src/lib/provider-protocol.js +104 -0
  195. package/src/lib/provider-stream.js +163 -4
  196. package/src/lib/runnable-provider.js +1 -0
  197. package/src/repl/chat-repl.js +58 -11
  198. package/src/runtime/agent-core.js +26 -43
  199. package/src/runtime/headless-runner.js +11 -4
  200. package/src/runtime/headless-stream.js +10 -4
  201. package/src/runtime/policies/agent-policy.js +17 -11
  202. package/src/assets/web-panel/assets/ChatBubbleRenderer-DOX3Y5EJ.js +0 -1
  203. package/src/assets/web-panel/assets/PdhVaultBrowser-D9McHF9I.js +0 -7
  204. package/src/assets/web-panel/assets/QuickAsk-DWG-A5zB.js +0 -1
  205. package/src/assets/web-panel/assets/devWarning-DYhpRtve.js +0 -1
  206. package/src/assets/web-panel/assets/index-DPJXFIY7.js +0 -1
  207. package/src/assets/web-panel/assets/index-DjBhR5M_.js +0 -1
@@ -1 +1 @@
1
- import{u as v}from"./index-DYPMJ5Mb.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
+ 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-DYPMJ5Mb.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
+ 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-DYPMJ5Mb.js";import{i as f}from"./motion-Dye3IU8k.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),{[`
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-DYPMJ5Mb.js"></script>
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: \"ollama\")\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",
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",
@@ -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
- ...loadConfig().llm,
1491
- provider: options.provider,
1492
- model: options.model,
1493
- baseUrl: options.baseUrl,
1494
- apiKey: options.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
 
@@ -29,7 +29,16 @@ import { captureAgentEvolutionRuntimeComposition } from "../lib/evolution/agent-
29
29
  import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
30
30
  import { logger } from "../lib/logger.js";
31
31
  import { BUILT_IN_PROVIDERS } from "../lib/llm-providers.js";
32
+ import { normalizeOllamaBaseUrl } from "../lib/ollama-base-url.js";
33
+ import {
34
+ geminiGenerateContentUrl,
35
+ geminiRequestBody,
36
+ geminiResponseText,
37
+ normalizeProviderBaseUrl,
38
+ openAICompatibleBaseUrl,
39
+ } from "../lib/provider-protocol.js";
32
40
  import { loadConfig } from "../lib/config-manager.js";
41
+ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
33
42
  import { expandFileRefs } from "../runtime/file-ref-expander.js";
34
43
 
35
44
  const ANDROID_LOCAL_OLLAMA_URL = "http://127.0.0.1:18484";
@@ -73,6 +82,33 @@ export function resolveOllamaBaseUrl({
73
82
  return "http://localhost:11434";
74
83
  }
75
84
 
85
+ export function resolveAskOptions(
86
+ options = {},
87
+ config = {},
88
+ env = process.env,
89
+ ) {
90
+ const connection = resolveLlmConnection(options, [config.llm || {}], { env });
91
+ const provider = connection.provider;
92
+ const resolved = {
93
+ model: connection.model || (provider === "ollama" ? "qwen2:7b" : null),
94
+ provider,
95
+ apiKey: connection.apiKey,
96
+ baseUrl: connection.baseUrl,
97
+ };
98
+ if (provider === "ollama") {
99
+ resolved.baseUrl = resolveOllamaBaseUrl({
100
+ options,
101
+ env,
102
+ config:
103
+ config.llm?.provider === "ollama" &&
104
+ connection.endpointSources.includes(config.llm)
105
+ ? config
106
+ : {},
107
+ });
108
+ }
109
+ return resolved;
110
+ }
111
+
76
112
  /**
77
113
  * Send a single question to an LLM provider.
78
114
  * @param {string} question
@@ -115,7 +151,8 @@ export async function queryLLM(
115
151
  throw error;
116
152
  }
117
153
  const provider = options.provider || "ollama";
118
- const model = options.model || "qwen2:7b";
154
+ const model =
155
+ options.model || BUILT_IN_PROVIDERS[provider]?.models?.[0] || "qwen2:7b";
119
156
  const messages = [{ role: "user", content: question }];
120
157
  const providerMessages = (
121
158
  await captureAgentEvolutionIngress(evolutionIngress).prepareModelRequest({
@@ -139,7 +176,7 @@ export async function queryLLM(
139
176
  }
140
177
 
141
178
  if (provider === "ollama") {
142
- const baseUrl = options.baseUrl || "http://localhost:11434";
179
+ const baseUrl = normalizeOllamaBaseUrl(options.baseUrl);
143
180
  // Use /api/chat (modern Ollama API + only endpoint Android LocalLlmServer
144
181
  // implements). Non-streaming mode keeps the response shape simple.
145
182
  const response = await providerFetch(`${baseUrl}/api/chat`, {
@@ -167,7 +204,6 @@ export async function queryLLM(
167
204
  return data.message?.content ?? "";
168
205
  }
169
206
 
170
- // OpenAI-compatible providers (openai, volcengine, deepseek, dashscope, mistral, gemini)
171
207
  const providerDef = BUILT_IN_PROVIDERS[provider];
172
208
  if (!providerDef) {
173
209
  throw new Error(
@@ -185,7 +221,59 @@ export async function queryLLM(
185
221
  }
186
222
 
187
223
  const apiBase = options.baseUrl || providerDef.baseUrl;
188
- const response = await providerFetch(`${apiBase}/chat/completions`, {
224
+ if (provider === "anthropic") {
225
+ const response = await providerFetch(
226
+ `${normalizeProviderBaseUrl(apiBase)}/messages`,
227
+ {
228
+ method: "POST",
229
+ headers: {
230
+ "Content-Type": "application/json",
231
+ "x-api-key": apiKey,
232
+ "anthropic-version": "2023-06-01",
233
+ },
234
+ body: JSON.stringify({
235
+ model,
236
+ max_tokens: 4096,
237
+ messages: providerMessages,
238
+ }),
239
+ },
240
+ );
241
+ if (!response.ok) {
242
+ throw new Error(
243
+ `anthropic error: ${response.status} ${response.statusText}`,
244
+ );
245
+ }
246
+ const data = await response.json();
247
+ return (
248
+ data.content
249
+ ?.filter((part) => part.type === "text")
250
+ .map((part) => part.text)
251
+ .join("") || ""
252
+ );
253
+ }
254
+
255
+ if (provider === "gemini") {
256
+ const response = await providerFetch(
257
+ geminiGenerateContentUrl(apiBase, model),
258
+ {
259
+ method: "POST",
260
+ headers: {
261
+ "Content-Type": "application/json",
262
+ "x-goog-api-key": apiKey,
263
+ },
264
+ body: JSON.stringify(geminiRequestBody(providerMessages)),
265
+ },
266
+ );
267
+ if (!response.ok) {
268
+ throw new Error(`gemini error: ${response.status} ${response.statusText}`);
269
+ }
270
+ const data = await response.json();
271
+ return geminiResponseText(data);
272
+ }
273
+
274
+ const response = await providerFetch(
275
+ `${openAICompatibleBaseUrl(provider, apiBase)}/chat/completions`,
276
+ {
189
277
  method: "POST",
190
278
  headers: {
191
279
  "Content-Type": "application/json",
@@ -195,7 +283,8 @@ export async function queryLLM(
195
283
  model: model || providerDef.models[0],
196
284
  messages: providerMessages,
197
285
  }),
198
- });
286
+ },
287
+ );
199
288
 
200
289
  if (!response.ok) {
201
290
  throw new Error(
@@ -252,26 +341,12 @@ export function registerAskCommand(program, dependencies = {}) {
252
341
  .option("--json", "Output as JSON")
253
342
  .action(async (question, options) => {
254
343
  const config = loadConfig();
255
- const provider = options.provider || config.llm?.provider || "ollama";
256
- const resolvedOptions = {
257
- model: options.model || config.llm?.model || "qwen2:7b",
258
- provider,
259
- apiKey: options.apiKey || config.llm?.apiKey,
260
- };
344
+ const resolvedOptions = resolveAskOptions(options, config);
345
+ const { provider } = resolvedOptions;
261
346
  // baseUrl resolution only applies the Android-local override path for
262
347
  // provider=ollama (LocalLlmServer is Ollama-compat). For other providers
263
348
  // we use the existing precedence: --base-url > config.llm.baseUrl >
264
349
  // provider default.
265
- if (provider === "ollama") {
266
- resolvedOptions.baseUrl = resolveOllamaBaseUrl({
267
- options,
268
- env: process.env,
269
- config,
270
- });
271
- } else {
272
- resolvedOptions.baseUrl = options.baseUrl || config.llm?.baseUrl;
273
- }
274
-
275
350
  // Expand @path references (e.g. `cc ask "summarize @notes.md"`) before
276
351
  // sending to the model. The original question is preserved for --json
277
352
  // output; only the LLM sees the injected file contents.
@@ -17,6 +17,7 @@ import { randomUUID } from "node:crypto";
17
17
  import { types as utilTypes } from "node:util";
18
18
  import { captureAgentEvolutionRuntimeComposition } from "../lib/evolution/agent-evolution-runtime-composition-brand.js";
19
19
  import { resolveOllamaBaseUrl, queryLLM } from "./ask.js";
20
+ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
20
21
 
21
22
  /** Hard cap so a runaway model can't flood the editor with a whole file. */
22
23
  export const MAX_COMPLETION_CHARS = 2000;
@@ -135,19 +136,22 @@ export function registerCompleteCommand(program, dependencies = {}) {
135
136
  return;
136
137
  }
137
138
 
138
- const provider = options.provider || config.llm?.provider || "ollama";
139
+ const connection = resolveLlmConnection(options, [config.llm || {}], {
140
+ defaultModel:
141
+ (options.provider || config.llm?.provider || "ollama") === "ollama"
142
+ ? "qwen2.5-coder"
143
+ : null,
144
+ });
145
+ const provider = connection.provider;
139
146
  const resolvedOptions = {
140
147
  provider,
141
- model:
142
- options.model ||
143
- config.llm?.model ||
144
- (provider === "ollama" ? "qwen2.5-coder" : undefined),
145
- apiKey: options.apiKey || config.llm?.apiKey,
148
+ model: connection.model || (provider === "ollama" ? "qwen2.5-coder" : undefined),
149
+ apiKey: connection.apiKey,
150
+ baseUrl: connection.baseUrl,
146
151
  };
147
- resolvedOptions.baseUrl =
148
- provider === "ollama"
149
- ? resolveOllamaBaseUrl({ options, config })
150
- : options.baseUrl || config.llm?.baseUrl;
152
+ if (provider === "ollama" && config.llm?.provider === "ollama") {
153
+ resolvedOptions.baseUrl = resolveOllamaBaseUrl({ options, config });
154
+ }
151
155
 
152
156
  try {
153
157
  const prompt = buildFimPrompt(prefix, suffix, language);
@@ -43,6 +43,7 @@ import {
43
43
  autoFailStuckRequestsV2,
44
44
  getLlmProvidersStatsV2,
45
45
  } from "../lib/llm-providers.js";
46
+ import { normalizeOllamaBaseUrl } from "../lib/ollama-base-url.js";
46
47
  import {
47
48
  readLlmConnectionInput,
48
49
  saveLlmConnection,
@@ -52,6 +53,7 @@ import {
52
53
  llmProbeReceipt,
53
54
  } from "../lib/llm-connection-probe.js";
54
55
  import { resolveModelCapabilityProfile } from "../lib/model-capabilities.js";
56
+ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
55
57
 
56
58
  /**
57
59
  * Resolve the effective `cc llm test` target from CLI flags + persisted config.
@@ -75,46 +77,27 @@ export function resolveLlmTestTarget(
75
77
  ) {
76
78
  const llm = config.llm || {};
77
79
  const provider = options.provider || llm.provider || "ollama";
78
- const sameProvider = provider === (llm.provider || "ollama");
79
80
  const isOllama = provider === "ollama";
80
81
  const builtIn = builtIns[provider];
81
-
82
- const model =
83
- options.model ||
84
- (sameProvider ? llm.model : undefined) ||
85
- (isOllama ? "qwen2:7b" : builtIn?.models?.[0] || "gpt-4o-mini");
86
-
87
- let baseUrl;
88
- if (isOllama) {
89
- // Only inherit config.baseUrl when the CONFIGURED provider is also ollama —
90
- // otherwise `--provider ollama` would probe another provider's endpoint.
91
- const configOllamaBase =
92
- llm.provider === "ollama" ? llm.baseUrl : undefined;
93
- baseUrl = options.baseUrl || configOllamaBase || "http://localhost:11434";
94
- } else {
95
- baseUrl =
96
- options.baseUrl ||
97
- (sameProvider ? llm.baseUrl : undefined) ||
98
- builtIn?.baseUrl ||
99
- "https://api.openai.com/v1";
100
- }
101
-
102
- const apiKey = isOllama
103
- ? undefined
104
- : options.apiKey ||
105
- (sameProvider ? llm.apiKey : undefined) ||
106
- (builtIn?.apiKeyEnv ? env[builtIn.apiKeyEnv] : undefined);
107
-
82
+ const connection = resolveLlmConnection(options, [llm], {
83
+ env,
84
+ builtIns,
85
+ defaultProvider: provider,
86
+ defaultModel: isOllama
87
+ ? "qwen2:7b"
88
+ : builtIn?.models?.[0] || "gpt-4o-mini",
89
+ });
108
90
  return {
109
- provider,
110
- model,
111
- baseUrl,
112
- apiKey,
91
+ provider: connection.provider,
92
+ model: connection.model,
93
+ baseUrl:
94
+ connection.baseUrl ||
95
+ (isOllama ? "http://localhost:11434" : "https://api.openai.com/v1"),
96
+ apiKey: isOllama ? undefined : connection.apiKey || undefined,
113
97
  isOllama,
114
98
  label: builtIn?.displayName || (isOllama ? "Ollama" : provider),
115
99
  };
116
100
  }
117
-
118
101
  /** Resolve a static profile without reading credentials or provider key envs. */
119
102
  export function resolveLlmCapabilities(
120
103
  options = {},
@@ -253,7 +236,9 @@ export function registerLlmCommand(program) {
253
236
  const spinner = ora("Fetching models...").start();
254
237
  try {
255
238
  if (options.provider === "ollama") {
256
- const response = await fetch(`${options.baseUrl}/api/tags`);
239
+ const response = await fetch(
240
+ `${normalizeOllamaBaseUrl(options.baseUrl)}/api/tags`,
241
+ );
257
242
  if (!response.ok) {
258
243
  throw new Error(`Ollama not reachable: ${response.status}`);
259
244
  }
@@ -300,13 +285,10 @@ export function registerLlmCommand(program) {
300
285
 
301
286
  // llm test - test connectivity
302
287
  //
303
- // Defaults to the CONFIGURED provider/model/baseUrl/apiKey (config.llm.*),
304
- // NOT a hard-coded ollama. Previously this always probed ollama unless you
305
- // passed --provider, so a user on volcengine/openai/etc. (and the JetBrains
306
- // "Configure LLM" wizard, which calls `cc llm test`) got a spurious
307
- // "fetch failed" against a local ollama they never ran. Any non-ollama
308
- // built-in provider is OpenAI-compatible, so they share one /chat/completions
309
- // probe instead of only special-casing openai.
288
+ // Defaults to the configured provider/model/baseUrl/apiKey (config.llm.*),
289
+ // not a hard-coded Ollama endpoint. The probe routes Ollama, Anthropic, and
290
+ // Gemini through their native protocols and uses chat/completions for the
291
+ // remaining OpenAI-compatible providers.
310
292
  llm
311
293
  .command("test")
312
294
  .description(
@@ -760,9 +760,9 @@ export function registerSessionCommand(program, dependencies = {}) {
760
760
  const ingress = composition.evolutionIngress;
761
761
  await ingress.start();
762
762
  const lifecycle = await startChatRepl({
763
- model: options.model || sess.model || "qwen2:7b",
763
+ model: options.model || sess.model,
764
764
  provider: options.provider || sess.provider || "ollama",
765
- baseUrl: options.baseUrl || "http://localhost:11434",
765
+ baseUrl: options.baseUrl,
766
766
  resumeMessages: sess.messages,
767
767
  sessionId: sess.id,
768
768
  evolutionIngress: ingress,
@@ -13,6 +13,7 @@
13
13
  import { logger } from "../lib/logger.js";
14
14
  import { loadConfig } from "../lib/config-manager.js";
15
15
  import { buildProviderSource } from "../lib/provider-stream.js";
16
+ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
16
17
  import {
17
18
  readEvolutionCompositionFactory,
18
19
  prepareGovernedModelTurn,
@@ -29,16 +30,19 @@ export function registerStreamCommand(program, dependencies = {}) {
29
30
  )
30
31
  .argument("<prompt>", "The prompt to stream")
31
32
  .option("--model <model>", "Model name")
32
- .option("--provider <provider>", "LLM provider", "ollama")
33
+ .option("--provider <provider>", "LLM provider (default: configured)")
33
34
  .option("--base-url <url>", "API base URL")
34
35
  .option("--api-key <key>", "API key")
35
36
  .option("--text", "Emit concatenated final text instead of NDJSON events")
36
37
  .action(async (prompt, options) => {
37
38
  const config = loadConfig();
38
- const provider = options.provider || config.llm?.provider || "ollama";
39
- const baseUrl = options.baseUrl || config.llm?.baseUrl;
40
- const apiKey = options.apiKey || config.llm?.apiKey;
41
- const model = options.model || config.llm?.model;
39
+ const connection = resolveLlmConnection(options, [config.llm || {}], {
40
+ defaultModel:
41
+ (options.provider || config.llm?.provider || "ollama") === "ollama"
42
+ ? "qwen2:7b"
43
+ : null,
44
+ });
45
+ const { provider, baseUrl, apiKey, model } = connection;
42
46
 
43
47
  try {
44
48
  const { createStreamRouter } =
@@ -1,6 +1,8 @@
1
1
  import { logger } from "../lib/logger.js";
2
2
  import { createAgentRuntimeFactory } from "../runtime/runtime-factory.js";
3
3
  import { readEvolutionCompositionFactory } from "../lib/evolution/governed-model-turn.js";
4
+ import { loadEvolutionDeploymentCommandDependencies } from "../lib/evolution/evolution-deployment-loader.js";
5
+ import { getEvolutionDeploymentStatus } from "../lib/evolution/evolution-deployment-config.js";
4
6
 
5
7
  export function registerUiCommand(program, dependencies = {}) {
6
8
  const evolutionCompositionFactory =
@@ -27,6 +29,29 @@ export function registerUiCommand(program, dependencies = {}) {
27
29
  )
28
30
  .action(async (opts) => {
29
31
  try {
32
+ let activeEvolutionCompositionFactory = evolutionCompositionFactory;
33
+ if (activeEvolutionCompositionFactory === null) {
34
+ let deploymentDependencies = null;
35
+ let localTrustSetupError = null;
36
+ try {
37
+ deploymentDependencies =
38
+ await loadEvolutionDeploymentCommandDependencies("ui", {
39
+ initializeDefaultLocalUi: true,
40
+ });
41
+ } catch (error) {
42
+ localTrustSetupError = error;
43
+ }
44
+ activeEvolutionCompositionFactory = readEvolutionCompositionFactory(
45
+ deploymentDependencies || {},
46
+ );
47
+ if (activeEvolutionCompositionFactory === null) {
48
+ const status = await getEvolutionDeploymentStatus();
49
+ const readiness = status.readiness.ui;
50
+ logger.warn(
51
+ `Quick Ask model egress is unavailable (${readiness.code}): ${localTrustSetupError?.message || readiness.detail}. ${readiness.remediation || "Review cc evolution deployment status."}`,
52
+ );
53
+ }
54
+ }
30
55
  // Allow env vars to override CLI defaults — host/token/port/uiMode.
31
56
  // Use case: Android local terminal app pre-injects CC_UI_HOST=0.0.0.0
32
57
  // + a per-install CC_UI_TOKEN so `cc ui` is reachable from other
@@ -47,9 +72,12 @@ export function registerUiCommand(program, dependencies = {}) {
47
72
  );
48
73
  const runtime = createAgentRuntimeFactory({
49
74
  deps:
50
- evolutionCompositionFactory === null
75
+ activeEvolutionCompositionFactory === null
51
76
  ? {}
52
- : { evolutionCompositionFactory },
77
+ : {
78
+ evolutionCompositionFactory:
79
+ activeEvolutionCompositionFactory,
80
+ },
53
81
  }).createUiRuntime({
54
82
  port,
55
83
  wsPort: parseInt(opts.wsPort, 10),
@@ -1,6 +1,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",