chainlesschain 0.166.108 → 0.166.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/README.md +14 -7
  2. package/package.json +3 -2
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-B5HWUFaS.js → AIOps-sOceeExN.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-DCIKpxoQ.js → ActionButton-BQs-vRUr.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-dsgvjCEQ.js → Analytics-sfAHHMhA.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-DWDH5Qbm.js → AppLayout-0gAvE0c8.js} +4 -4
  9. package/src/assets/web-panel/assets/{Artifacts-BD8S8kzU.js → Artifacts-Dh9s2Qmd.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-CDXv4Aoj.js → Audit-CITm26SU.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-BLAQ5Uy0.js → BackgroundAgents-BiMbBOh0.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-moPac6tF.js → Backup-CNpnhI3h.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-C_6nzsLU.js → BaseInput-BI_lltkp.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-cYuslkFG.js → Chat-BgfB88xY.js} +6 -6
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-BDP3fGoz.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-Qjb-XOX_.js → Checkbox-4xy9rS3j.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-IYRWXlMA.js → Codegen-D93h9ihS.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-CsQ9jv8M.js → Col-BRf3STY-.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-BbNmfTwe.js → Community-f187ziSL.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-SShDx-nr.js → Compact-D4hXWuo1.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-CLWhKIJp.js → Compliance-C6cYKI6H.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-D4tK9_s3.js → Cowork-C1i1f8LD.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-D7GnfQ1z.js → Cron-BacCE4LA.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-TG86SH3X.js → Crosschain-DXztxOoH.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-6pue0NCO.js → DID-rpf4HN8x.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-BwkJ29du.js → Dashboard-h4bgtH7L.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-DEvpYDof.js → Dropdown-CyQnoHmu.js} +1 -1
  28. package/src/assets/web-panel/assets/EmailListRenderer-FCtp4AcB.js +1 -0
  29. package/src/assets/web-panel/assets/{EvolutionSettings-tpvPMM9W.js → EvolutionSettings-JbISHTWR.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CWYFW75O.js → FamilyGuardDashboard-DCIQLyfK.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-gRIi96rM.js → Federation-DDbFpwja.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-B7Nr3YkV.js → FormItemContext-CXF0jtXb.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-b1BgGgLT.js → GenericCardRenderer-CUaNfAM0.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-Dis1jjO7.js → Git-Bhoz2gDf.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-C4Yg99Am.js → Governance-FiiXHe8e.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-D4UQRbGu.js → Inference-brpTW2Q3.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-Co_kLMAq.js → KnowledgeGraph-BCWP-f6k.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-D4BRp7bg.js → Logs-CxYcduoK.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-12vD1nC1.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-ys0j1vr9.js → Marketplace-DANdmW7l.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-B3ZvRZe_.js → McpTools-Bi_EKkb5.js} +2 -2
  42. package/src/assets/web-panel/assets/{Memory-BOa0jbr-.js → Memory-DecoMbYw.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-CWJRmUbj.js → MobileBridge-DrOhFKp0.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-rRwP16dN.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-CCcOk5m5.js → Mtc-SLPII1iw.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-vlrrScbQ.js → MtcAudit-DWoVORYy.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-C8K59S_8.js → Multisig-Dxpnmq-m.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-oTpFYVme.js → NLProgramming-kNTpNqCP.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BhqAJWiz.js → Notes-D1uXCfVd.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-DCnV1CJM.js → NotificationSettings-D3Qt8Gkl.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-CZGnsrVW.js → OrderTableRenderer-qvaah2-m.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-DX1LuQlJ.js → Organization-EhRl4JoJ.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-CbfKrFdT.js → Overflow-BTt5C_5W.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-BEwYZuHL.js → P2P-CeR2jyb0.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-YNmWbwd7.js → PdhVaultBrowser-BzD3OHWq.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-DyZ18LiA.js → Permissions-BOPyeRlz.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-B2J3aw2g.js → PersonalDataHub-DcmNNsfO.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-CXl2ZlhQ.js → Pipeline-DuL3kwWC.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-I5SDmgAp.js → Privacy-CkQRdlSU.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-Crl9tXw3.js → ProjectInit-moE_vQ1P.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-DCFtFlSK.js → ProjectSettings-PnTWi4NQ.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-Do5BQq1i.js → Projects-DZvbT3D7.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-Cb7OWa3y.js → Providers-CkcrHYy9.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-CJmhAU-s.js → QrScannerModal-nYNFGf_H.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-Cu6lEWou.js → QuickAsk-53WNo7xT.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-Crip3jLB.js → Recommend-CmYN_NaS.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-KxYY-2CB.js → RemoteSession-BuOdNEjA.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-D0vN-htI.js → Reputation-BgkheZou.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-wqzd_xCD.js → Row-DvA3klj1.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-8lsPfb0a.js → RssFeed-CgkIL3PG.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-C-e8qAeU.js → Search-Cv2twJdL.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-CMM9WgFy.js → Security-XrD2UNU6.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-CZdxjN2B.js → Services-LujCntCK.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-BI3XNk35.js → Skeleton-ZZCOsxPX.js} +1 -1
  75. package/src/assets/web-panel/assets/Skills-BEXGkOrU.js +1 -0
  76. package/src/assets/web-panel/assets/{Sla-HQruznKY.js → Sla-CIqmCgdD.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-Dl-MFq3w.js → SpeechSettings-DkVbwJox.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-BU224vDm.js → SyncSettings-BVGgUs0p.js} +2 -2
  79. package/src/assets/web-panel/assets/Tasks-C1lh68l5.js +1 -0
  80. package/src/assets/web-panel/assets/{Templates-Jb3TPz4Q.js → Templates-BG4zNAFx.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-CQ-GTrfa.js → Tenant-t2o6i5fY.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-BbMl3Rue.js → Terminal-CH8UDdVO.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-CS_vstKF.js → TimelineRenderer-B5sYY1IO.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-BaopVl1f.js → Tokens-D0y7QkG5.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-DtnD4WUN.js → Trigger-BA2nKko0.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-CsvG4Tmf.js → Trust-CrFKCQIs.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-C1-A-cOV.js → UkeySign-B3x_-Zun.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-CNgJPdSL.js → VideoEditing-TEwxbLH6.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-CdF41501.js → Wallet-Larp5rrt.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-D-JmxD5g.js → WebAuthn-DfWbEIZe.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-C0XunR13.js → WorkflowEditor-8LKiKExY.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-BBAZpD_G.js → chat-ByxYOvYW.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-BxSxO5BX.js → colors-Dh4yAClh.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-BoxL8pg5.js → compact-item-f5n2j1WZ.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-W5JAyZmY.js → createContext-DIprYuXL.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-DRIge35Z.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-HpiKDPVC.js → hasIn-CvYeap2I.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B9VxE1C-.js → index-3ROY-lYB.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DdEcQ1rp.js → index-6VEWxOyC.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-C4uI7WCB.js → index-7eG1J-GT.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-_38IJqoP.js → index-B0AXUhiJ.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-C7GIUWWF.js → index-BS_dpgzu.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-ooP1pQCt.js → index-BaXSBxy-.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-gvfIRZxJ.js → index-Bk8oWRk6.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BSJ0cAle.js → index-BlImvgb7.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-C5kqii-G.js → index-BoayvJ48.js} +1 -1
  107. package/src/assets/web-panel/assets/index-Bq24rTYx.js +1 -0
  108. package/src/assets/web-panel/assets/{index-B05_YRHZ.js → index-BsU46c7D.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-_p4e3KfB.js → index-BvyFQF8I.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Bwn6k_qw.js → index-C2RGykST.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BtFAEG08.js → index-C5aH2Pj2.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CehxfRUR.js → index-CD0s5ESV.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-JrMBRi62.js → index-CIZQtz8G.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CRg3aOoj.js → index-CJjc8ObW.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-V6VIJe2N.js → index-CTqJNul4.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-p6rNtYud.js → index-CcvA1nae.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-D6m6B4Wy.js → index-CpR0zD38.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-IO2I7nzu.js → index-CzabQZ7I.js} +1 -1
  119. package/src/assets/web-panel/assets/index-D2f18WsK.js +1 -0
  120. package/src/assets/web-panel/assets/{index-9caMEwQ-.js → index-DGyTzElU.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DinY7IQa.js → index-DI8jC7gQ.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DuM9I1If.js → index-DUj-sL9U.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DkSnlgK_.js → index-DaZVtafQ.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CM_gdohF.js → index-DjvON8oh.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DcmAiq_Y.js → index-DlJCDpeN.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DaJk9U9V.js → index-DlTwZIeX.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BgMViZIY.js → index-DlULGx8u.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BA3WWQAT.js → index-DmcAL4hd.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DSyfxxQS.js → index-DshB3-Up.js} +3 -3
  130. package/src/assets/web-panel/assets/{index-BZAbaY64.js → index-Du435yzt.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BW4PP5GN.js → index-bt-0zMmH.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DlPvZgv8.js → index-c_CxUQl3.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-Ba4usRFM.js → index-fpWv4u3Z.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-DwidpDEE.js → index-hwbaD3Nk.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CcyzZloJ.js → index-uDiVjYrS.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-QzlEbtRL.js → index-xU0eHLIH.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-Dfn6M05J.js → initDefaultProps-DRuE92W6.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BRRwFqGO.js → motion-6Sgma5Vd.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-DpDPN6zR.js → move-BbQsH8sb.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-BHlSE87F.js → mtc-parser-BdC4INal.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-CEOri_L5.js → omit-DeC5m_bi.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-DqICh-ad.js → pickAttrs-DuehpBws.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-DQizFFiV.js → placementArrow-CJEhv2ij.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-DmFHPdvC.js → responsiveObserve-Dyw3lDGr.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-s2s1XS3T.js → slide-BMaLXTbS.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-IwEIbBan.js → statusUtils-c1K_SdJH.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-CIFLlbXH.js → styleChecker-CefBry8k.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-CFkN2Cgh.js → useFlexGapSupport-Dj2IsZpo.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-BSY6O48s.js → useFs-RLfB3yqb.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-iJl3VnU0.js → usePersonalDataHub-DbRVH_NA.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-vu8ReMs7.js → vnode-DTn_QVJz.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-CeSrYAHp.js → zoom-DuFR0E7i.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +1 -1
  155. package/src/commands/agent.js +12 -5
  156. package/src/commands/ask.js +96 -21
  157. package/src/commands/complete.js +14 -10
  158. package/src/commands/llm.js +23 -41
  159. package/src/commands/session.js +2 -2
  160. package/src/commands/stream.js +9 -5
  161. package/src/commands/ui.js +30 -2
  162. package/src/data/changelog.json +52 -0
  163. package/src/gateways/ws/llm-chat-protocol.js +23 -5
  164. package/src/gateways/ws/llm-creds.js +38 -60
  165. package/src/gateways/ws/ws-agent-handler.js +1 -1
  166. package/src/gateways/ws/ws-server.js +47 -0
  167. package/src/gateways/ws/ws-session-gateway.js +26 -12
  168. package/src/lib/__tests__/provider-stream.test.js +70 -4
  169. package/src/lib/chat-core.js +186 -24
  170. package/src/lib/cowork-adapter.js +29 -15
  171. package/src/lib/evolution/agent-evolution-runtime-composition.js +10 -7
  172. package/src/lib/evolution/evolution-deployment-config.js +27 -4
  173. package/src/lib/evolution/evolution-deployment-loader.js +58 -3
  174. package/src/lib/evolution/evolution-deployment-profile.js +2 -2
  175. package/src/lib/evolution/evolution-evidence-projector.js +18 -3
  176. package/src/lib/evolution/evolution-file-witness.js +10 -0
  177. package/src/lib/evolution/evolution-ledger.js +237 -28
  178. package/src/lib/evolution/evolution-windows-directory-durability.js +322 -0
  179. package/src/lib/evolution/governed-hub-llm.js +2 -1
  180. package/src/lib/evolution/governed-model-turn.js +4 -1
  181. package/src/lib/evolution/local-ui-evolution-deployment.js +682 -0
  182. package/src/lib/evolution/local-ui-evolution-host.mjs +26 -0
  183. package/src/lib/evolution/local-ui-evolution-runtime.js +601 -0
  184. package/src/lib/evolution/opaque-hex-id.js +28 -0
  185. package/src/lib/hub-llm-client.js +22 -14
  186. package/src/lib/image-input.js +19 -3
  187. package/src/lib/llm-config-defaults.js +19 -30
  188. package/src/lib/llm-connection-config.js +4 -0
  189. package/src/lib/llm-connection-probe.js +5 -1
  190. package/src/lib/llm-connection-resolution.js +94 -0
  191. package/src/lib/llm-providers.js +33 -11
  192. package/src/lib/ollama-base-url.js +14 -0
  193. package/src/lib/provider-protocol.js +104 -0
  194. package/src/lib/provider-stream.js +163 -4
  195. package/src/lib/runnable-provider.js +1 -0
  196. package/src/repl/chat-repl.js +58 -11
  197. package/src/runtime/agent-core.js +26 -43
  198. package/src/runtime/headless-runner.js +11 -4
  199. package/src/runtime/headless-stream.js +10 -4
  200. package/src/runtime/policies/agent-policy.js +17 -11
  201. package/src/assets/web-panel/assets/ChatBubbleRenderer-Ceh3MG6M.js +0 -1
  202. package/src/assets/web-panel/assets/EmailListRenderer-CQj7UlKJ.js +0 -1
  203. package/src/assets/web-panel/assets/MarkdownRenderer-Dgy8arQI.js +0 -1
  204. package/src/assets/web-panel/assets/MobileProjects-7ty8vTpj.js +0 -1
  205. package/src/assets/web-panel/assets/Skills-DMlsh9It.js +0 -1
  206. package/src/assets/web-panel/assets/Tasks-DESg3yCs.js +0 -1
  207. package/src/assets/web-panel/assets/devWarning-BI5TZ7EX.js +0 -1
  208. package/src/assets/web-panel/assets/index-9-JLDK5n.js +0 -1
  209. package/src/assets/web-panel/assets/index-B7m8ioaQ.js +0 -1
@@ -41,11 +41,14 @@ import readline from "readline";
41
41
  import chalk from "chalk";
42
42
  import { logger } from "../lib/logger.js";
43
43
  import { BUILT_IN_PROVIDERS } from "../lib/llm-providers.js";
44
+ import { loadConfig } from "../lib/config-manager.js";
45
+ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
44
46
  import { expandFileRefsAsync } from "../runtime/file-ref-expander.js";
45
47
  import {
46
48
  streamOllama,
47
49
  streamOpenAI,
48
50
  streamAnthropic,
51
+ streamGemini,
49
52
  } from "../lib/chat-core.js";
50
53
  import {
51
54
  startSession,
@@ -111,10 +114,19 @@ export async function startChatRepl(options = {}) {
111
114
  ? assertChatSessionUsageAdmission(options.sessionId)
112
115
  : null;
113
116
  const evolutionSession = createAgentEvolutionSessionLifecycle(evolutionIngress);
114
- let model = options.model || "qwen2:7b";
115
- let provider = options.provider || "ollama";
116
- const baseUrl = options.baseUrl || "http://localhost:11434";
117
- const apiKey = options.apiKey || null;
117
+ const llmConfig = loadConfig().llm || {};
118
+ const connection = resolveLlmConnection(options, [llmConfig], {
119
+ defaultModel:
120
+ (options.provider || llmConfig.provider || "ollama") === "anthropic"
121
+ ? "claude-sonnet-4-6"
122
+ : (options.provider || llmConfig.provider || "ollama") === "ollama"
123
+ ? "qwen2:7b"
124
+ : null,
125
+ });
126
+ let provider = connection.provider;
127
+ let model = connection.model || (provider === "ollama" ? "qwen2:7b" : "");
128
+ let baseUrl = connection.baseUrl;
129
+ let apiKey = connection.apiKey;
118
130
 
119
131
  const messages = [];
120
132
  const stdout = options.stdout || process.stdout;
@@ -219,6 +231,23 @@ export async function startChatRepl(options = {}) {
219
231
 
220
232
  case "/provider":
221
233
  if (arg) {
234
+ if (arg !== provider) {
235
+ const nextConnection = resolveLlmConnection(
236
+ { provider: arg },
237
+ [llmConfig],
238
+ {
239
+ defaultModel:
240
+ arg === "anthropic"
241
+ ? "claude-sonnet-4-6"
242
+ : arg === "ollama"
243
+ ? "qwen2:7b"
244
+ : null,
245
+ },
246
+ );
247
+ model = nextConnection.model || "";
248
+ baseUrl = nextConnection.baseUrl;
249
+ apiKey = nextConnection.apiKey;
250
+ }
222
251
  provider = arg;
223
252
  logger.info(`Provider changed to: ${chalk.cyan(provider)}`);
224
253
  } else {
@@ -347,9 +376,7 @@ export async function startChatRepl(options = {}) {
347
376
  } else if (provider === "anthropic") {
348
377
  const providerDef = BUILT_IN_PROVIDERS.anthropic;
349
378
  const url =
350
- baseUrl !== "http://localhost:11434"
351
- ? baseUrl
352
- : providerDef?.baseUrl || "https://api.anthropic.com/v1";
379
+ baseUrl || providerDef?.baseUrl || "https://api.anthropic.com/v1";
353
380
  const key =
354
381
  apiKey ||
355
382
  (providerDef?.apiKeyEnv ? process.env[providerDef.apiKeyEnv] : null);
@@ -366,13 +393,33 @@ export async function startChatRepl(options = {}) {
366
393
  onUsage,
367
394
  onStall,
368
395
  );
396
+ } else if (provider === "gemini") {
397
+ const providerDef = BUILT_IN_PROVIDERS.gemini;
398
+ const url =
399
+ baseUrl ||
400
+ providerDef?.baseUrl ||
401
+ "https://generativelanguage.googleapis.com/v1beta";
402
+ const key =
403
+ apiKey ||
404
+ (providerDef?.apiKeyEnv ? process.env[providerDef.apiKeyEnv] : null);
405
+ if (!key)
406
+ throw new Error(
407
+ `API key required for gemini (set ${providerDef?.apiKeyEnv || "GEMINI_API_KEY"})`,
408
+ );
409
+ response = await streamGemini(
410
+ providerMessages,
411
+ model,
412
+ url,
413
+ key,
414
+ onToken,
415
+ onUsage,
416
+ onStall,
417
+ );
369
418
  } else {
370
- // OpenAI-compatible providers (openai, volcengine, deepseek, dashscope, mistral, gemini, anthropic-proxy)
419
+ // OpenAI-compatible providers (openai, volcengine, deepseek, dashscope, mistral, anthropic-proxy)
371
420
  const providerDef = BUILT_IN_PROVIDERS[provider];
372
421
  const url =
373
- baseUrl !== "http://localhost:11434"
374
- ? baseUrl
375
- : providerDef?.baseUrl || "https://api.openai.com/v1";
422
+ baseUrl || providerDef?.baseUrl || "https://api.openai.com/v1";
376
423
  const key =
377
424
  apiKey ||
378
425
  (providerDef?.apiKeyEnv ? process.env[providerDef.apiKeyEnv] : null);
@@ -3,6 +3,13 @@ import {
3
3
  requireUnscopedToolExecution,
4
4
  } from "../lib/formal-budget-provider-scope.js";
5
5
  import { isFormalBudgetError } from "../lib/formal-budget-errors.js";
6
+ import { normalizeOllamaBaseUrl } from "../lib/ollama-base-url.js";
7
+ import {
8
+ normalizeProviderBaseUrl,
9
+ openAICompatibleBaseUrl,
10
+ } from "../lib/provider-protocol.js";
11
+ import { BUILT_IN_PROVIDERS } from "../lib/llm-providers.js";
12
+ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
6
13
  /**
7
14
  * Agent Core — transport-independent agentic logic
8
15
  *
@@ -12073,6 +12080,14 @@ export async function chatWithTools(rawMessages, options) {
12073
12080
  options.evolutionIngress == null
12074
12081
  ? null
12075
12082
  : captureAgentEvolutionIngress(options.evolutionIngress);
12083
+ const providerHint = options.provider || "ollama";
12084
+ const legacyDefaultModels = {
12085
+ anthropic: "claude-sonnet-4-6",
12086
+ };
12087
+ const connection = resolveLlmConnection(options, [], {
12088
+ defaultProvider: providerHint,
12089
+ defaultModel: legacyDefaultModels[providerHint],
12090
+ });
12076
12091
  const {
12077
12092
  provider,
12078
12093
  model,
@@ -12080,7 +12095,7 @@ export async function chatWithTools(rawMessages, options) {
12080
12095
  apiKey,
12081
12096
  contextEngine: ce,
12082
12097
  signal,
12083
- } = options;
12098
+ } = { ...options, ...connection };
12084
12099
 
12085
12100
  const providerRequestId = _normalizeProviderRequestId(
12086
12101
  options.providerRequestId,
@@ -12143,7 +12158,7 @@ export async function chatWithTools(rawMessages, options) {
12143
12158
  await options.onProviderCallStart?.();
12144
12159
 
12145
12160
  if (provider === "ollama") {
12146
- const apiUrl = `${baseUrl}/api/chat`;
12161
+ const apiUrl = `${normalizeOllamaBaseUrl(baseUrl)}/api/chat`;
12147
12162
  // Multimodal (`cc agent --image`): ollama wants `{content, images:[base64]}`
12148
12163
  // not OpenAI-style `image_url` blocks. Convert only when an image part is
12149
12164
  // present so text-only runs keep the identical request shape.
@@ -12224,7 +12239,7 @@ export async function chatWithTools(rawMessages, options) {
12224
12239
  }
12225
12240
 
12226
12241
  if (provider === "anthropic") {
12227
- const key = apiKey || process.env.ANTHROPIC_API_KEY;
12242
+ const key = apiKey;
12228
12243
  if (!key) throw new Error("ANTHROPIC_API_KEY required");
12229
12244
 
12230
12245
  const systemMsgs = messages.filter((m) => m.role === "system");
@@ -12307,10 +12322,7 @@ export async function chatWithTools(rawMessages, options) {
12307
12322
  : systemText;
12308
12323
  }
12309
12324
 
12310
- const url =
12311
- baseUrl && baseUrl !== "http://localhost:11434"
12312
- ? baseUrl
12313
- : "https://api.anthropic.com/v1";
12325
+ const url = normalizeProviderBaseUrl(baseUrl);
12314
12326
 
12315
12327
  // Real token streaming (--include-partial-messages): stream the SSE response
12316
12328
  // and forward text deltas live, assembling tool_use blocks back into the
@@ -12401,32 +12413,12 @@ export async function chatWithTools(rawMessages, options) {
12401
12413
  }
12402
12414
 
12403
12415
  // OpenAI-compatible providers
12404
- const providerUrls = {
12405
- openai: "https://api.openai.com/v1",
12406
- deepseek: "https://api.deepseek.com/v1",
12407
- dashscope: "https://dashscope.aliyuncs.com/compatible-mode/v1",
12408
- mistral: "https://api.mistral.ai/v1",
12409
- gemini: "https://generativelanguage.googleapis.com/v1beta/openai",
12410
- volcengine: "https://ark.cn-beijing.volces.com/api/v3",
12411
- };
12416
+ const providerDefinition = BUILT_IN_PROVIDERS[provider];
12417
+ const url = openAICompatibleBaseUrl(provider, baseUrl);
12412
12418
 
12413
- const providerApiKeyEnvs = {
12414
- openai: "OPENAI_API_KEY",
12415
- deepseek: "DEEPSEEK_API_KEY",
12416
- dashscope: "DASHSCOPE_API_KEY",
12417
- mistral: "MISTRAL_API_KEY",
12418
- gemini: "GEMINI_API_KEY",
12419
- volcengine: "VOLCENGINE_API_KEY",
12420
- };
12421
-
12422
- const url =
12423
- baseUrl && baseUrl !== "http://localhost:11434"
12424
- ? baseUrl
12425
- : providerUrls[provider];
12426
-
12427
- if (!url) {
12419
+ if (!providerDefinition || !url) {
12428
12420
  throw new Error(
12429
- `Unsupported provider: ${provider}. Supported: ollama, anthropic, openai, deepseek, dashscope, mistral, gemini, volcengine`,
12421
+ `Unsupported provider: ${provider}. Supported: ${Object.keys(BUILT_IN_PROVIDERS).join(", ")}`,
12430
12422
  );
12431
12423
  }
12432
12424
  const supportsOpenAIRequestIdentity = _isOfficialOpenAIEndpoint(
@@ -12434,19 +12426,10 @@ export async function chatWithTools(rawMessages, options) {
12434
12426
  url,
12435
12427
  );
12436
12428
 
12437
- const envKey = providerApiKeyEnvs[provider] || "OPENAI_API_KEY";
12438
- const key = apiKey || process.env[envKey];
12429
+ const envKey = providerDefinition.apiKeyEnv;
12430
+ const key = apiKey;
12439
12431
  if (!key) throw new Error(`${envKey} required for provider ${provider}`);
12440
-
12441
- const defaultModels = {
12442
- openai: "gpt-4o",
12443
- deepseek: "deepseek-chat",
12444
- dashscope: "qwen-turbo",
12445
- mistral: "mistral-large-latest",
12446
- gemini: "gemini-2.0-flash",
12447
- volcengine: "deepseek-v4-1-flash-260910",
12448
- };
12449
- const effectiveModel = model || defaultModels[provider] || "gpt-4o-mini";
12432
+ const effectiveModel = model || providerDefinition.models?.[0];
12450
12433
  const modelProfile = resolveModelCapabilityProfile({
12451
12434
  provider,
12452
12435
  model: effectiveModel,
@@ -26,6 +26,7 @@ import { randomUUID } from "node:crypto";
26
26
  import { isProxy } from "node:util/types";
27
27
  import { transportErrorDetails } from "../lib/transport-error-details.js";
28
28
  import { captureAgentExecutionPolicy } from "../lib/agent-execution-policy.js";
29
+ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
29
30
  import { HERMETIC_CODING_SYSTEM_PROMPT } from "../lib/coding-task-guidance.js";
30
31
  import { bootstrap } from "./bootstrap.js";
31
32
  import {
@@ -1159,10 +1160,16 @@ async function runAgentHeadlessInWorkspace(
1159
1160
  // `let` (not const): a custom-command macro's `model:` frontmatter may
1160
1161
  // override it below (when the user passed no explicit --model), mirroring
1161
1162
  // `cc command run`.
1162
- let model = options.model || "qwen2.5:7b";
1163
- const provider = options.provider || "ollama";
1164
- const baseUrl = options.baseUrl || "http://localhost:11434";
1165
- const apiKey = options.apiKey || null;
1163
+ const connection = resolveLlmConnection(options, [], {
1164
+ defaultModel:
1165
+ (options.provider || "ollama") === "anthropic"
1166
+ ? "claude-sonnet-4-6"
1167
+ : (options.provider || "ollama") === "ollama"
1168
+ ? "qwen2.5:7b"
1169
+ : null,
1170
+ });
1171
+ let model = connection.model;
1172
+ const { provider, baseUrl, apiKey } = connection;
1166
1173
  const cwd = options.cwd || process.cwd();
1167
1174
  const formalQualityHermetic = isFormalQualityHermeticRuntime(process.env);
1168
1175
  const hermeticExecution =
@@ -19,6 +19,7 @@
19
19
  import { randomUUID } from "node:crypto";
20
20
  import { transportErrorDetails } from "../lib/transport-error-details.js";
21
21
  import { captureAgentExecutionPolicy } from "../lib/agent-execution-policy.js";
22
+ import { resolveLlmConnection } from "../lib/llm-connection-resolution.js";
22
23
  import { TaskWorklog } from "../lib/context-memory-kernel/task-worklog-port.js";
23
24
  import { isProxy } from "node:util/types";
24
25
  import {
@@ -1777,10 +1778,15 @@ async function runAgentHeadlessStreamInWorkspace(
1777
1778
  ) {
1778
1779
  throw new TypeError("Agent retrieval authorities must share one tenant");
1779
1780
  }
1780
- const model = options.model || "qwen2.5:7b";
1781
- const provider = options.provider || "ollama";
1782
- const baseUrl = options.baseUrl || "http://localhost:11434";
1783
- const apiKey = options.apiKey || null;
1781
+ const connection = resolveLlmConnection(options, [], {
1782
+ defaultModel:
1783
+ (options.provider || "ollama") === "anthropic"
1784
+ ? "claude-sonnet-4-6"
1785
+ : (options.provider || "ollama") === "ollama"
1786
+ ? "qwen2.5:7b"
1787
+ : null,
1788
+ });
1789
+ const { model, provider, baseUrl, apiKey } = connection;
1784
1790
  const writeOut = deps.writeOut;
1785
1791
  const writeErr = deps.writeErr;
1786
1792
 
@@ -1,4 +1,5 @@
1
1
  import { captureAgentExecutionPolicy } from "../../lib/agent-execution-policy.js";
2
+ import { resolveLlmConnection } from "../../lib/llm-connection-resolution.js";
2
3
 
3
4
  export function resolveAgentPolicy({
4
5
  config = null,
@@ -7,20 +8,25 @@ export function resolveAgentPolicy({
7
8
  } = {}) {
8
9
  const llm = config?.llm || {};
9
10
  const executionPolicy = captureAgentExecutionPolicy(overrides);
11
+ const provider =
12
+ overrides.provider || llm.provider || defaults.provider || "ollama";
13
+ const connection = resolveLlmConnection(overrides, [llm, defaults], {
14
+ defaultProvider: provider,
15
+ defaultModel:
16
+ defaults.model ||
17
+ (provider === "anthropic"
18
+ ? "claude-sonnet-4-6"
19
+ : provider === "ollama"
20
+ ? "qwen2:7b"
21
+ : null),
22
+ });
10
23
 
11
24
  return {
12
- model: overrides.model || llm.model || defaults.model || "qwen2:7b",
25
+ model: connection.model || defaults.model || "qwen2:7b",
13
26
  visionModel: overrides.visionModel,
14
- provider:
15
- overrides.provider || llm.provider || defaults.provider || "ollama",
16
- baseUrl:
17
- overrides.baseUrl !== undefined
18
- ? overrides.baseUrl
19
- : llm.baseUrl || defaults.baseUrl,
20
- apiKey:
21
- overrides.apiKey !== undefined
22
- ? overrides.apiKey
23
- : llm.apiKey || defaults.apiKey || null,
27
+ provider: connection.provider,
28
+ baseUrl: connection.baseUrl,
29
+ apiKey: connection.apiKey || null,
24
30
  sessionId: overrides.sessionId || null,
25
31
  agentId: overrides.agentId || null,
26
32
  recallMemory:
@@ -1 +0,0 @@
1
- import{I as h,P as u,J as S,U as n,R as a,S as y,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-DSyfxxQS.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),v=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${v}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},M={class:"meta"},R={class:"actor"},V={class:"time"},q={class:"body"};function D(c,d,t,r,i,l){const o=h("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",T,[n("div",M,[n("span",R,a(r.actorLabel),1),n("span",V,a(r.formattedTime),1)]),n("div",q,a(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const j=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-JseEsv/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{j as default};
@@ -1 +0,0 @@
1
- import{I as C,P as c,J as f,U as r,c as h,_ as k,R as s,V as l,K as d,Q as u,S as g,b as t}from"./vendor-Bn1JzzAn.js";import{_ as j}from"./index-DSyfxxQS.js";import{aH as w}from"./icons-DG5UD-6K.js";const E={__name:"EmailListRenderer",props:{event:{type:Object,required:!0}},setup(_,{expose:m}){m();const a=_,e=t(()=>a.event.content||{}),i=t(()=>a.event.extra||{}),p=t(()=>e.value.from||e.value.sender||e.value.fromName||a.event.actor||"(未知发件人)"),n=t(()=>e.value.subject||e.value.title||"(无主题)"),y=t(()=>e.value.snippet||e.value.preview||e.value.body?.slice(0,100)||null),b=t(()=>Array.isArray(e.value.attachments)?e.value.attachments.length:typeof e.value.attachmentCount=="number"?e.value.attachmentCount:0),x=t(()=>i.value.category||e.value.category),S=t(()=>e.value.unread===!0),T=t(()=>{if(!a.event.occurredAt)return"";const o=new Date(a.event.occurredAt);return`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")} ${String(o.getHours()).padStart(2,"0")}:${String(o.getMinutes()).padStart(2,"0")}`}),v={props:a,c:e,e:i,fromText:p,subjectText:n,snippetText:y,attachmentCount:b,category:x,isUnread:S,formattedTime:T,computed:t,get MailOutlined(){return w}};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}},M={class:"email-row"},N={class:"left"},O={class:"body"},V={class:"head"},A={class:"from"},B={class:"time"},R={class:"subject"},D={key:0,class:"snippet"},L={class:"meta"};function U(_,m,a,e,i,p){const n=C("a-tag");return c(),f("div",M,[r("div",N,[h(e.MailOutlined,{class:k(["icon",{unread:e.isUnread}])},null,8,["class"])]),r("div",O,[r("div",V,[r("span",A,s(e.fromText),1),r("span",B,s(e.formattedTime),1)]),r("div",R,s(e.subjectText),1),e.snippetText?(c(),f("div",D,s(e.snippetText),1)):l("v-if",!0),r("div",L,[h(n,{color:"blue",class:"src"},{default:d(()=>[u(s(a.event.source.adapter),1)]),_:1}),e.attachmentCount>0?(c(),g(n,{key:0,color:"orange"},{default:d(()=>[u(" 📎 "+s(e.attachmentCount),1)]),_:1})):l("v-if",!0),e.category?(c(),g(n,{key:1},{default:d(()=>[u(s(e.category),1)]),_:1})):l("v-if",!0)])])])}const P=j(E,[["render",U],["__scopeId","data-v-e4ddf632"],["__file","/tmp/cc-web-panel-JseEsv/repo/packages/web-panel/src/components/pdh/renderers/EmailListRenderer.vue"]]);export{P as default};
@@ -1 +0,0 @@
1
- import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-DSyfxxQS.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-JseEsv/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
@@ -1 +0,0 @@
1
- import{I as n,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as b}from"./vendor-Bn1JzzAn.js";import{_ as v,b as m}from"./index-DSyfxxQS.js";import{a8 as y,M}from"./icons-DG5UD-6K.js";const B={__name:"MobileProjects",setup(p,{expose:i}){i();const s=u(),{t:e}=m();function a(){s.push("/projects")}function _(){s.push("/mobile-bridge")}const c={router:s,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return m},get MobileOutlined(){return M},get FolderOutlined(){return y}};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}},x={class:"mobile-projects-placeholder"},O={class:"title"},k={class:"subtitle"},w={class:"explainer"};function T(p,i,s,e,a,_){const c=n("a-alert"),d=n("a-button"),f=n("a-space"),P=n("a-empty"),j=n("a-card");return h(),g("div",x,[l(j,null,{default:r(()=>[l(P,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",k,t(e.t("mobileProjects.subtitle")),1),l(c,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",w,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),b(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),b(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const N=v(B,[["render",T],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-JseEsv/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};
@@ -1 +0,0 @@
1
- import{E,b as w,r as b,I as m,J as y,U as a,R as g,c as i,K as u,V as h,F as C,Z as L,N as O,o as M,P as p,Q as v,S as R}from"./vendor-Bn1JzzAn.js";import{u as I,_ as q}from"./index-DSyfxxQS.js";import{u as N}from"./useShellMode-CgR0wCYM.js";import{p as P}from"./parsers-YNLm7sQ0.js";import{u as z}from"./chat-BBAZpD_G.js";import{aa as V,aq as j,R as B}from"./icons-DG5UD-6K.js";const A=E("skills",()=>{const _=b(!1),t=b([]),n=b(""),e=b("all"),k=w(()=>{const o=new Set(["all"]);return t.value.forEach(l=>{l.category&&o.add(l.category),l.executionMode&&o.add(l.executionMode)}),[...o]}),S=w(()=>{let o=t.value;if(e.value!=="all"&&(o=o.filter(l=>l.category===e.value||l.executionMode===e.value)),n.value){const l=n.value.toLowerCase();o=o.filter(d=>d.name?.toLowerCase().includes(l)||d.description?.toLowerCase().includes(l)||d.title?.toLowerCase().includes(l))}return o});async function f(){const o=I();_.value=!0;try{if(N().isEmbedded){const c=await o.sendRaw({type:"skill.list"},2e4);c?.ok&&Array.isArray(c.result?.skills)?t.value=c.result.skills:(console.error("skill.list custom topic failed:",c?.error),t.value=[]);return}const{output:l}=await o.execute("skill list",2e4),d=P(l);t.value=d}catch(l){console.error("Failed to load skills:",l)}finally{_.value=!1}}return{loading:_,allSkills:t,searchQuery:n,selectedCategory:e,categories:k,filteredSkills:S,loadSkills:f}}),F={__name:"Skills",setup(_,{expose:t}){t();const n=A(),e=z(),k=O(),S=w(()=>n.categories.filter(r=>r!=="all").slice(0,6));function f(r){return{"built-in":"内置","cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合",workspace:"工作区",marketplace:"市场"}[r]||r}function o(r){return{"cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合","built-in":"内置"}[r]||r||"未知"}function l(r){return{"cli-direct":"cyan",agent:"purple","llm-query":"blue",hybrid:"orange","built-in":"green"}[r]||"default"}async function d(r){await e.createSession("agent"),k.push("/chat"),setTimeout(()=>{e.currentSessionId&&e.sendMessage(e.currentSessionId,`/skill run ${r}`)},300)}M(()=>{n.allSkills.length||n.loadSkills()});const c={skillsStore:n,chatStore:e,router:k,displayCategories:S,catLabel:f,modeLabel:o,modeColor:l,runSkill:d,computed:w,onMounted:M,get useRouter(){return O},get ReloadOutlined(){return B},get PlayCircleOutlined(){return j},get AppstoreOutlined(){return V},get useSkillsStore(){return A},get useChatStore(){return z}};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}},Q={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},U={class:"page-sub"},J={style:{display:"flex",gap:"12px","margin-bottom":"20px","flex-wrap":"wrap"}},T={key:0,style:{"text-align":"center",padding:"60px"}},D={class:"skills-grid"},G={style:{display:"flex","justify-content":"space-between","align-items":"flex-start"}},K={style:{flex:"1","min-width":"0"}},W={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px","font-family":"monospace"}},Z={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},H={style:{"margin-left":"12px","flex-shrink":"0"}},X={style:{"margin-top":"10px",display:"flex","justify-content":"flex-end"}},Y={style:{"text-align":"center",padding:"60px",color:"var(--text-muted)"}};function $(_,t,n,e,k,S){const f=m("a-button"),o=m("a-input-search"),l=m("a-radio-button"),d=m("a-radio-group"),c=m("a-spin"),r=m("a-tag"),x=m("a-card");return p(),y("div",null,[a("div",Q,[a("div",null,[t[3]||(t[3]=a("h2",{class:"page-title"},"技能管理",-1)),a("p",U,g(e.skillsStore.allSkills.length)+" 个可用技能",1)]),i(f,{type:"primary",ghost:"",loading:e.skillsStore.loading,onClick:t[0]||(t[0]=s=>e.skillsStore.loadSkills())},{icon:u(()=>[i(e.ReloadOutlined)]),default:u(()=>[t[4]||(t[4]=v(" 刷新 ",-1))]),_:1},8,["loading"])]),h(" Search & Filter "),a("div",J,[i(o,{value:e.skillsStore.searchQuery,"onUpdate:value":t[1]||(t[1]=s=>e.skillsStore.searchQuery=s),placeholder:"搜索技能名称或描述...",style:{width:"300px"},"allow-clear":""},null,8,["value"]),i(d,{value:e.skillsStore.selectedCategory,"onUpdate:value":t[2]||(t[2]=s=>e.skillsStore.selectedCategory=s),"button-style":"solid"},{default:u(()=>[i(l,{value:"all"},{default:u(()=>[...t[5]||(t[5]=[v("全部",-1)])]),_:1}),(p(!0),y(C,null,L(e.displayCategories,s=>(p(),R(l,{key:s,value:s},{default:u(()=>[v(g(e.catLabel(s)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),h(" Loading State "),e.skillsStore.loading?(p(),y("div",T,[i(c,{size:"large"}),t[6]||(t[6]=a("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载技能中...",-1))])):e.skillsStore.filteredSkills.length?(p(),y(C,{key:1},[h(" Skills Grid "),a("div",D,[(p(!0),y(C,null,L(e.skillsStore.filteredSkills,s=>(p(),R(x,{key:s.name,class:"skill-card",size:"small",hoverable:"",style:{background:"var(--bg-card)","border-color":"var(--border-color)",cursor:"default"}},{default:u(()=>[a("div",G,[a("div",K,[a("div",W,g(s.name),1),a("div",Z,g(s.description||"暂无描述"),1)]),a("div",H,[i(r,{color:e.modeColor(s.executionMode),style:{"font-size":"10px"}},{default:u(()=>[v(g(e.modeLabel(s.executionMode)),1)]),_:2},1032,["color"])])]),a("div",X,[i(f,{size:"small",type:"primary",ghost:"",onClick:ee=>e.runSkill(s.name)},{icon:u(()=>[i(e.PlayCircleOutlined)]),default:u(()=>[t[7]||(t[7]=v(" 运行 ",-1))]),_:1},8,["onClick"])])]),_:2},1024))),128))])],2112)):(p(),y(C,{key:2},[h(" Empty State "),a("div",Y,[i(e.AppstoreOutlined,{style:{"font-size":"48px","margin-bottom":"16px",display:"block"}}),a("div",null,g(e.skillsStore.allSkills.length?"没有匹配的技能":"点击刷新加载技能列表"),1)])],2112))])}const ie=q(F,[["render",$],["__scopeId","data-v-d64d43f5"],["__file","/tmp/cc-web-panel-JseEsv/repo/packages/web-panel/src/views/Skills.vue"]]);export{ie as default};
@@ -1 +0,0 @@
1
- import{E,b as D,r as R,I as p,J as c,U as _,c as n,K as a,S as C,V as x,o as I,x as V,P as i,Q as k,R as r,F as T,Z as F}from"./vendor-Bn1JzzAn.js";import{u as P,_ as O}from"./index-DSyfxxQS.js";import{R as U}from"./icons-DG5UD-6K.js";const B=E("tasks",()=>{const y=R([]),l=R(!1);let u=null,t=null,d=null;const b=D(()=>y.value.filter(e=>e.status==="running")),v=D(()=>y.value.filter(e=>e.status==="pending")),w=D(()=>y.value.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="timeout"));async function s(){const e=P();l.value=!0;try{const g=await e.sendRaw({type:"tasks-list"});g&&Array.isArray(g.tasks)&&(y.value=g.tasks)}catch{}finally{l.value=!1}}async function m(e){const g=P();try{await g.sendRaw({type:"tasks-stop",taskId:e})}catch{}finally{await s()}}const f=R(null);function h(e=5e3){N(),s(),u=setInterval(s,e),S()}function N(){u&&(clearInterval(u),u=null),t&&(t(),t=null),d&&(clearTimeout(d),d=null)}function S(){const e=P();if(t)return;const g=z=>{z.type==="task:notification"&&z.payload?.task&&(f.value=z.payload.task,s(),d&&clearTimeout(d),d=setTimeout(()=>{f.value=null,d=null},8e3))};t=e.onRuntimeEvent(g)}function A(e){return!e||e<0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${(e/6e4).toFixed(1)}m`}function o(e){switch(e){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:y,loading:l,running:b,pending:v,completed:w,lastNotification:f,fetchTasks:s,stopTask:m,startPolling:h,stopPolling:N,formatDuration:A,getStatusColor:o}}),J={__name:"Tasks",setup(y,{expose:l}){l();const u=B(),t=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function d(s){return s.status==="running"&&s.startedAt?u.formatDuration(Date.now()-s.startedAt):s.completedAt&&s.startedAt?u.formatDuration(s.completedAt-s.startedAt):"-"}function b(s){return s?new Date(s).toLocaleString():"-"}function v(s,m){return s?s.length>m?`${s.slice(0,m)}...`:s:""}I(()=>u.startPolling(5e3)),V(()=>u.stopPolling());const w={store:u,columns:t,getDuration:d,formatTime:b,truncate:v,onMounted:I,onUnmounted:V,get ReloadOutlined(){return U},get useTasksStore(){return B}};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}},L={class:"page-header"},j={key:0,class:"error-text"},K={key:1},M={class:"task-header"},Q={class:"task-desc"},W={class:"task-id"},Z={class:"task-meta"},q=["title"],G={key:0,class:"error-text"},H={key:1,class:"success-text"},X={key:2,class:"muted-text"};function Y(y,l,u,t,d,b){const v=p("a-button"),w=p("a-space"),s=p("a-alert"),m=p("a-statistic"),f=p("a-card"),h=p("a-col"),N=p("a-row"),S=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",L,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(w,null,{default:a(()=>[n(v,{ghost:"",loading:t.store.loading,onClick:l[0]||(l[0]=o=>t.store.fetchTasks())},{icon:a(()=>[n(t.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=k(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),t.store.lastNotification?(i(),C(s,{key:0,type:t.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=o=>t.store.lastNotification=null)},{message:a(()=>[k(" 任务"+r(t.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(t.store.lastNotification.description||t.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[t.store.lastNotification.error?(i(),c("span",j,r(t.store.lastNotification.error),1)):t.store.lastNotification.result?(i(),c("span",K,r(t.truncate(String(t.store.lastNotification.result),120)),1)):x("v-if",!0)]),_:1},8,["type"])):x("v-if",!0),n(N,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"全部任务",value:t.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"运行中",value:t.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"等待中",value:t.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"已完成",value:t.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),t.store.running.length>0?(i(),C(f,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(T,null,F(t.store.running,o=>(i(),c("div",{key:o.id,class:"task-item running"},[_("div",M,[n(S,{color:t.store.getStatusColor(o.status)},{default:a(()=>[k(r(o.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",Q,r(o.description),1),_("span",W,r(o.id.slice(0,16)),1)]),_("div",Z,[_("span",null,"类型: "+r(o.type||"-"),1),_("span",null,"已运行: "+r(t.store.formatDuration(Date.now()-o.startedAt)),1),n(v,{size:"small",danger:"",onClick:e=>t.store.stopTask(o.id)},{default:a(()=>[...l[4]||(l[4]=[k("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):x("v-if",!0),n(f,{class:"panel-card"},{default:a(()=>[n(A,{columns:t.columns,"data-source":t.store.tasks,pagination:{pageSize:15,size:"small"},loading:t.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:o,record:e})=>[o.key==="status"?(i(),C(S,{key:0,color:t.store.getStatusColor(e.status)},{default:a(()=>[k(r(e.status),1)]),_:2},1032,["color"])):o.key==="description"?(i(),c("span",{key:1,title:e.command},r(e.description),9,q)):o.key==="duration"?(i(),c(T,{key:2},[k(r(t.getDuration(e)),1)],64)):o.key==="createdAt"?(i(),c(T,{key:3},[k(r(t.formatTime(e.createdAt)),1)],64)):o.key==="result"?(i(),c(T,{key:4},[e.error?(i(),c("span",G,r(t.truncate(e.error,60)),1)):e.result?(i(),c("span",H,r(t.truncate(String(e.result),60)),1)):(i(),c("span",X,"-"))],64)):o.key==="action"?(i(),c(T,{key:5},[e.status==="running"?(i(),C(v,{key:0,size:"small",danger:"",onClick:g=>t.store.stopTask(e.id)},{default:a(()=>[...l[5]||(l[5]=[k(" 停止 ",-1)])]),_:1},8,["onClick"])):x("v-if",!0)],64)):x("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const st=O(J,[["render",Y],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-JseEsv/repo/packages/web-panel/src/views/Tasks.vue"]]);export{st as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-DSyfxxQS.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-CsQ9jv8M.js";import{a0 as t}from"./index-DSyfxxQS.js";import"./vendor-Bn1JzzAn.js";import"./index-9caMEwQ-.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-wqzd_xCD.js";import{a0 as t}from"./index-DSyfxxQS.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-DmFHPdvC.js";import"./useFlexGapSupport-CFkN2Cgh.js";import"./styleChecker-CIFLlbXH.js";import"./index-9caMEwQ-.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};