chainlesschain 0.166.109 → 0.166.114
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -6
- package/package.json +3 -2
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-DkrNbDzS.js → AIOps-CVac3rIN.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DJjFXDhv.js → ActionButton-ChM9GxMl.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DyUbagRn.js → Analytics-CV5399Js.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-p7kJWSvn.js → AppLayout-CuonVXhg.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-C3rVh4Ak.js → Artifacts-D9qKfgb6.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bch_L_YO.js → Audit-DUvLysQc.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BNHy8zP6.js → BackgroundAgents-DfKohQeT.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BUaye_Ys.js → Backup-CohoEI8R.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-D49mzAVz.js → BaseInput-BwdoA3xv.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-2MDzM_us.js → Chat-DRkuz1d2.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-v3pzeHNC.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-5p1T_KEq.js → Checkbox-B-GNGpKv.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-TKtiLaoZ.js → Codegen-Bs2lAsoZ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BVCMG9mS.js → Col-Bk1mJKDZ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D09-QczH.js → Community-B_FDSCOo.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-QuRMCnj7.js → Compact-No1qSLLH.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CN0PV7fk.js → Compliance-CcrG43-d.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-5N2zhAty.js → Cowork-DLkj2ywK.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-BxT8UZ0S.js → Cron-sQHELVEz.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Dp-noQl4.js → Crosschain-CRTZ3GZg.js} +1 -1
- package/src/assets/web-panel/assets/{DID-B7MZFkjG.js → DID-Ds2bjvxE.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DulJ3rKV.js → Dashboard-DOONG2NX.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DV4ov4zF.js → Dropdown-Br3PNA2L.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DB2-ooz6.js → EmailListRenderer-DT6UUqjZ.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-B1Rb6p7q.js → EvolutionSettings-BSLuEjlT.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-U8aHayx-.js → FamilyGuardDashboard-2aEM9avE.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BkQULBHY.js → Federation-D3B0tlQU.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CtviG260.js → FormItemContext-DTVkVVQP.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DnPirB24.js → GenericCardRenderer-BgFEgP4y.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CK57Oro6.js → Git-3t71m6Xd.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DbI-LB8-.js → Governance-DS7WvlaX.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-sEG4T1Jg.js → Inference-CeT-xWrI.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-9SLJR3h9.js → KnowledgeGraph-BQzMncp5.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BIZYcISQ.js → Logs-CC5DOKhV.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-9nfWupWP.js → MarkdownRenderer-5jYM4kYG.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CRmLLwAE.js → Marketplace-CpYDyy3o.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DkOFkSO1.js → McpTools-DRdAZPMr.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-M29Kd9TU.js → Memory-CBLRr-l8.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Tl6JvPw_.js → MobileBridge-Bnj9veNN.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Bq-FPDzS.js → MobileProjects-lYFPD24p.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DkUjX1F5.js → Mtc-BMU_C9vD.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BCqr1I4q.js → MtcAudit-DQV-zumU.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-DmoqYGQ5.js → Multisig-LpqpqV1d.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DNRQeRke.js → NLProgramming-C4OMklSO.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CQSBeiY6.js → Notes-Cg0QCinP.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-gNY9bbH6.js → NotificationSettings-amoZoMna.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DW0CNjh8.js → OrderTableRenderer-CxNvhf5n.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CthnbKag.js → Organization-BetJmyX5.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-_GQ3sbXu.js → Overflow-DbeoPtVD.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BTr7ea6W.js → P2P-B5sitQWT.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-AP9SG2ic.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-DMny2Cjs.js → Permissions-Bc7fgNKx.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CyYlMSoI.js → PersonalDataHub-BwdGMcWZ.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-FASu2Oc4.js → Pipeline-DVuJA9BA.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-9bC5FnsJ.js → Privacy-BGzwOYRG.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BOYZwB5G.js → ProjectInit-BpHcC5br.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-45DViNG-.js → ProjectSettings-BI5G5gsc.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-C2fZzMZc.js → Projects-Ce92-l1V.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BgjvZx9F.js → Providers-CRHCcLFS.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Brw-3csB.js → QrScannerModal-qSeg5xag.js} +1 -1
- package/src/assets/web-panel/assets/QuickAsk-CA8oSceR.js +1 -0
- package/src/assets/web-panel/assets/{Recommend-DuQGxjIR.js → Recommend-DMvPodNo.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-T1cdSSRL.js → RemoteSession-BWsapEyN.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-9FT2dI4G.js → Reputation-BZJETVmC.js} +1 -1
- package/src/assets/web-panel/assets/{Row-yNIbNftX.js → Row-CUE1OSMp.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BIchNoPd.js → RssFeed-DvMazcUD.js} +2 -2
- package/src/assets/web-panel/assets/{Search-msDJ8UTZ.js → Search-e1c-NXWv.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DE46oBYT.js → Security-Dc9GZsx2.js} +3 -3
- package/src/assets/web-panel/assets/{Services-Dori7vc3.js → Services-AFz6ke-4.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-D3O3sUFz.js → Skeleton-gow6MYcY.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BV0ct8SO.js → Skills-h6AxYjUP.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DflIVOrh.js → Sla-Cr4CkJ0O.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Cpbv2Zz6.js → SpeechSettings-Bd5yuBtH.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Dgg6-wbe.js → SyncSettings-1t4QZMLW.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Cb6e4Klx.js → Tasks-u-DrjLRM.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-GfdAATGz.js → Templates-C0yLUC9b.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-D0gecLXl.js → Tenant-ds1YT5iS.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BFRPJt-0.js → Terminal-BoIskW2m.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BobtChxX.js → TimelineRenderer-BkdVK24X.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CifeZtHV.js → Tokens-djyDgmfk.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BHBvbBCf.js → Trigger-CYefDS3H.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-6lvqjKYp.js → Trust-CE_dbep_.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CqzMc-G5.js → UkeySign-DwVs_fey.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-OIiRG582.js → VideoEditing-BTUqMHAV.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-4MeKq0q_.js → Wallet-Bu_E7Rrc.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-eHBRjGQG.js → WebAuthn-DTbre5AB.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-DlzYdEqW.js → WorkflowEditor-BsBzd3gt.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CBcjOzkX.js → chat-tdifQQvu.js} +1 -1
- package/src/assets/web-panel/assets/{colors-zgwsYQSa.js → colors-D3SNW2Vx.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Dcd9H5Bn.js → compact-item-UBlCjrAW.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DR1tO-8r.js → createContext-DKsnEnFt.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BBnVfJHh.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CtfbUH_p.js → hasIn-BkeySXWe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXfGHUz_.js → index-6Nvzgytx.js} +1 -1
- package/src/assets/web-panel/assets/index-B2w_3mtS.js +1 -0
- package/src/assets/web-panel/assets/{index-DYPMJ5Mb.js → index-BEiHKah0.js} +25 -25
- package/src/assets/web-panel/assets/{index-LN7Hkl1C.js → index-BIeFLaMV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DA2-Bhy8.js → index-BV2zQteq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CwHgaYVH.js → index-BVvz3ntc.js} +1 -1
- package/src/assets/web-panel/assets/index-BoHurydC.js +1 -0
- package/src/assets/web-panel/assets/{index-DVpp9YSQ.js → index-Bw0k3VgD.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaGNqkY0.js → index-C-KTHSUE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWuCGhHa.js → index-C9ImNw5O.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTx4FyLU.js → index-CG_b1xyX.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cur8LNNn.js → index-CUjyL0ZS.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfzOYmOj.js → index-CXkn77ZN.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cdhy5ckh.js → index-CZ6JUooI.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1GxtY-h.js → index-Cuz2QCFT.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0kP88Pb.js → index-D5Umd_Z-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHEiuvhA.js → index-D6es7MSG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPLLgPxA.js → index-D93iSDUw.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3QUK1ks.js → index-D9m1HQzl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWG98orp.js → index-D9um0YVl.js} +1 -1
- package/src/assets/web-panel/assets/{index-hTcre7U9.js → index-DD6dD3LV.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5XGvJb0.js → index-DFMrIEIt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvPOpvvH.js → index-DSCiZJXb.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8WPohye.js → index-DSe_7MSy.js} +1 -1
- package/src/assets/web-panel/assets/{index-JSfldpw4.js → index-DYFjOyTH.js} +1 -1
- package/src/assets/web-panel/assets/{index-5XaB_Tjg.js → index-DdyTv6yc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoxowMYS.js → index-DfrW-iVs.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSvcz0RO.js → index-Dg8-Duze.js} +1 -1
- package/src/assets/web-panel/assets/{index-J-ORW1i6.js → index-DiDgwRty.js} +1 -1
- package/src/assets/web-panel/assets/{index-CT7zIkqP.js → index-DlEIp1gJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7ZOiIKb.js → index-DlO6HdD9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeAi4CNt.js → index-DtxUSZSS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmVIM-m2.js → index-DugZRCiI.js} +1 -1
- package/src/assets/web-panel/assets/{index-oWOlF7CM.js → index-P-ailFQY.js} +1 -1
- package/src/assets/web-panel/assets/{index-dvF6C39V.js → index-PWScrdlX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSQCHpDo.js → index-SpQ26gD6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmzQzTY5.js → index-TLBpgN30.js} +1 -1
- package/src/assets/web-panel/assets/{index-z8lrkcb-.js → index-bOIcWW8F.js} +1 -1
- package/src/assets/web-panel/assets/{index-BndPtS9D.js → index-pgGKNvmm.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CVMtDrWZ.js → initDefaultProps-CVCXG2Hv.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Dye3IU8k.js → motion-Dv00jw87.js} +1 -1
- package/src/assets/web-panel/assets/{move-C251Zo34.js → move-BFz51iHf.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BDiOORoQ.js → mtc-parser-BK2woIDE.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DTDA_RHv.js → omit-D2X_Gwoo.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CqEUTPcT.js → pickAttrs-CLmFyJ1q.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BOB8QWH3.js → placementArrow-CCzPddQm.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CZDXP1d9.js → responsiveObserve-hcm_Zlxd.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DPaRw3E9.js → slide-BxfZEFVp.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Ba9d7XZ7.js → statusUtils-kzB9pT-t.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-mZKU3lvW.js → styleChecker-CDFd7YCI.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-VcauLq0M.js → useFlexGapSupport-Czl7NNhS.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Cal9KRcx.js → useFs-y0SAzirG.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DISoRyQB.js → usePersonalDataHub-BvdPznrA.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-B58C6w6B.js → vnode-D8mNbyZ7.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BPlBAMKB.js → zoom-_hun6w9W.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agent.js +12 -5
- package/src/commands/ask.js +96 -21
- package/src/commands/complete.js +14 -10
- package/src/commands/llm.js +23 -41
- package/src/commands/session.js +2 -2
- package/src/commands/stream.js +9 -5
- package/src/commands/ui.js +30 -2
- package/src/data/changelog.json +65 -0
- package/src/gateways/ws/llm-chat-protocol.js +131 -40
- package/src/gateways/ws/llm-creds.js +29 -79
- package/src/gateways/ws/message-dispatcher.js +2 -0
- package/src/gateways/ws/ws-agent-handler.js +1 -1
- package/src/gateways/ws/ws-session-gateway.js +26 -12
- package/src/lib/__tests__/provider-stream.test.js +70 -4
- package/src/lib/chat-core.js +186 -24
- package/src/lib/cowork-adapter.js +29 -15
- package/src/lib/evolution/agent-evolution-runtime-composition.js +10 -7
- package/src/lib/evolution/evolution-deployment-config.js +36 -4
- package/src/lib/evolution/evolution-deployment-loader.js +117 -4
- package/src/lib/evolution/evolution-deployment-profile.js +2 -2
- package/src/lib/evolution/evolution-evidence-projector.js +18 -3
- package/src/lib/evolution/evolution-file-witness.js +10 -0
- package/src/lib/evolution/evolution-ledger.js +237 -28
- package/src/lib/evolution/evolution-windows-directory-durability.js +322 -0
- package/src/lib/evolution/governed-hub-llm.js +2 -1
- package/src/lib/evolution/governed-model-turn.js +4 -1
- package/src/lib/evolution/local-ui-evolution-deployment.js +768 -0
- package/src/lib/evolution/local-ui-evolution-host.mjs +44 -0
- package/src/lib/evolution/local-ui-evolution-runtime.js +624 -0
- package/src/lib/evolution/opaque-hex-id.js +28 -0
- package/src/lib/hub-llm-client.js +22 -14
- package/src/lib/image-input.js +19 -3
- package/src/lib/llm-config-defaults.js +19 -30
- package/src/lib/llm-connection-config.js +4 -0
- package/src/lib/llm-connection-probe.js +5 -1
- package/src/lib/llm-connection-resolution.js +94 -0
- package/src/lib/llm-providers.js +33 -11
- package/src/lib/ollama-base-url.js +14 -0
- package/src/lib/provider-protocol.js +104 -0
- package/src/lib/provider-stream.js +163 -4
- package/src/lib/runnable-provider.js +1 -0
- package/src/repl/chat-repl.js +58 -11
- package/src/runtime/agent-core.js +26 -43
- package/src/runtime/headless-runner.js +11 -4
- package/src/runtime/headless-stream.js +10 -4
- package/src/runtime/policies/agent-policy.js +17 -11
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DOX3Y5EJ.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-D9McHF9I.js +0 -7
- package/src/assets/web-panel/assets/QuickAsk-DWG-A5zB.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DYhpRtve.js +0 -1
- package/src/assets/web-panel/assets/index-DPJXFIY7.js +0 -1
- package/src/assets/web-panel/assets/index-DjBhR5M_.js +0 -1
|
@@ -9,6 +9,13 @@ import {
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { BUILT_IN_PROVIDERS } from "./llm-providers.js";
|
|
12
|
+
import { normalizeOllamaBaseUrl } from "./ollama-base-url.js";
|
|
13
|
+
import {
|
|
14
|
+
geminiGenerateContentUrl,
|
|
15
|
+
geminiRequestBody,
|
|
16
|
+
normalizeProviderBaseUrl,
|
|
17
|
+
openAICompatibleBaseUrl,
|
|
18
|
+
} from "./provider-protocol.js";
|
|
12
19
|
|
|
13
20
|
async function* responseLines(body) {
|
|
14
21
|
const reader = body.getReader();
|
|
@@ -51,8 +58,9 @@ export async function* ollamaTokenStream({
|
|
|
51
58
|
signal,
|
|
52
59
|
requireCompletion = false,
|
|
53
60
|
}) {
|
|
61
|
+
const normalizedBaseUrl = normalizeOllamaBaseUrl(baseUrl);
|
|
54
62
|
const res = await providerFetch(
|
|
55
|
-
`${
|
|
63
|
+
`${normalizedBaseUrl}/api/${messages ? "chat" : "generate"}`,
|
|
56
64
|
{
|
|
57
65
|
method: "POST",
|
|
58
66
|
headers: { "Content-Type": "application/json" },
|
|
@@ -96,7 +104,9 @@ export async function* openAIStream({
|
|
|
96
104
|
requireCompletion = false,
|
|
97
105
|
}) {
|
|
98
106
|
const governed = hasFormalBudgetProviderScope();
|
|
99
|
-
const res = await providerFetch(
|
|
107
|
+
const res = await providerFetch(
|
|
108
|
+
`${normalizeProviderBaseUrl(baseUrl)}/chat/completions`,
|
|
109
|
+
{
|
|
100
110
|
method: "POST",
|
|
101
111
|
headers: {
|
|
102
112
|
"Content-Type": "application/json",
|
|
@@ -109,7 +119,8 @@ export async function* openAIStream({
|
|
|
109
119
|
...(governed ? { stream_options: { include_usage: true } } : {}),
|
|
110
120
|
}),
|
|
111
121
|
signal,
|
|
112
|
-
|
|
122
|
+
},
|
|
123
|
+
);
|
|
113
124
|
if (!res.ok || !res.body) {
|
|
114
125
|
throw new Error(`${res.status} ${res.statusText}`);
|
|
115
126
|
}
|
|
@@ -139,6 +150,126 @@ export async function* openAIStream({
|
|
|
139
150
|
throw new Error("OpenAI stream ended before its completion marker");
|
|
140
151
|
}
|
|
141
152
|
|
|
153
|
+
export async function* geminiTokenStream({
|
|
154
|
+
baseUrl,
|
|
155
|
+
apiKey,
|
|
156
|
+
model,
|
|
157
|
+
prompt,
|
|
158
|
+
messages,
|
|
159
|
+
signal,
|
|
160
|
+
requireCompletion = false,
|
|
161
|
+
}) {
|
|
162
|
+
const requestMessages = messages ?? [{ role: "user", content: prompt }];
|
|
163
|
+
const res = await providerFetch(
|
|
164
|
+
geminiGenerateContentUrl(baseUrl, model, { stream: true }),
|
|
165
|
+
{
|
|
166
|
+
method: "POST",
|
|
167
|
+
headers: {
|
|
168
|
+
"Content-Type": "application/json",
|
|
169
|
+
"x-goog-api-key": apiKey,
|
|
170
|
+
},
|
|
171
|
+
body: JSON.stringify(geminiRequestBody(requestMessages)),
|
|
172
|
+
signal,
|
|
173
|
+
},
|
|
174
|
+
);
|
|
175
|
+
if (!res.ok || !res.body) {
|
|
176
|
+
throw new Error(`Gemini ${res.status} ${res.statusText}`);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
let completed = false;
|
|
180
|
+
for await (const raw of responseLines(res.body)) {
|
|
181
|
+
const line = raw.trim();
|
|
182
|
+
if (!line.startsWith("data:")) continue;
|
|
183
|
+
const payload = line.slice(5).trim();
|
|
184
|
+
if (!payload || payload === "[DONE]") continue;
|
|
185
|
+
try {
|
|
186
|
+
const data = JSON.parse(payload);
|
|
187
|
+
if (requireCompletion && data.error)
|
|
188
|
+
throw new Error("Gemini stream returned an error");
|
|
189
|
+
const candidate = data.candidates?.[0];
|
|
190
|
+
if (candidate?.finishReason || data.promptFeedback?.blockReason)
|
|
191
|
+
completed = true;
|
|
192
|
+
for (const part of candidate?.content?.parts || []) {
|
|
193
|
+
if (part?.thought !== true && typeof part?.text === "string")
|
|
194
|
+
yield part.text;
|
|
195
|
+
}
|
|
196
|
+
} catch (error) {
|
|
197
|
+
if (requireCompletion) throw error;
|
|
198
|
+
/* skip malformed chunks when completion isn't enforced */
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (requireCompletion && !completed)
|
|
202
|
+
throw new Error("Gemini stream ended before its completion marker");
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export async function* anthropicTokenStream({
|
|
206
|
+
baseUrl,
|
|
207
|
+
apiKey,
|
|
208
|
+
model,
|
|
209
|
+
prompt,
|
|
210
|
+
messages,
|
|
211
|
+
signal,
|
|
212
|
+
requireCompletion = false,
|
|
213
|
+
}) {
|
|
214
|
+
const requestMessages = messages ?? [{ role: "user", content: prompt }];
|
|
215
|
+
const system = requestMessages
|
|
216
|
+
.filter((message) => message.role === "system")
|
|
217
|
+
.map((message) => message.content)
|
|
218
|
+
.join("\n\n");
|
|
219
|
+
const turns = requestMessages
|
|
220
|
+
.filter((message) => message.role !== "system")
|
|
221
|
+
.map((message) => ({
|
|
222
|
+
role: message.role === "assistant" ? "assistant" : "user",
|
|
223
|
+
content: message.content,
|
|
224
|
+
}));
|
|
225
|
+
const res = await providerFetch(
|
|
226
|
+
`${normalizeProviderBaseUrl(baseUrl)}/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
|
+
stream: true,
|
|
238
|
+
...(system ? { system } : {}),
|
|
239
|
+
messages: turns,
|
|
240
|
+
}),
|
|
241
|
+
signal,
|
|
242
|
+
},
|
|
243
|
+
);
|
|
244
|
+
if (!res.ok || !res.body) {
|
|
245
|
+
throw new Error(`Anthropic ${res.status} ${res.statusText}`);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
let completed = false;
|
|
249
|
+
for await (const raw of responseLines(res.body)) {
|
|
250
|
+
const line = raw.trim();
|
|
251
|
+
if (!line.startsWith("data:")) continue;
|
|
252
|
+
const payload = line.slice(5).trim();
|
|
253
|
+
if (!payload) continue;
|
|
254
|
+
try {
|
|
255
|
+
const data = JSON.parse(payload);
|
|
256
|
+
if (requireCompletion && (data.error || data.type === "error"))
|
|
257
|
+
throw new Error("Anthropic stream returned an error");
|
|
258
|
+
if (data.type === "message_stop") completed = true;
|
|
259
|
+
if (
|
|
260
|
+
data.type === "content_block_delta" &&
|
|
261
|
+
typeof data.delta?.text === "string"
|
|
262
|
+
)
|
|
263
|
+
yield data.delta.text;
|
|
264
|
+
} catch (error) {
|
|
265
|
+
if (requireCompletion) throw error;
|
|
266
|
+
/* skip malformed chunks when completion isn't enforced */
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if (requireCompletion && !completed)
|
|
270
|
+
throw new Error("Anthropic stream ended before its completion marker");
|
|
271
|
+
}
|
|
272
|
+
|
|
142
273
|
/**
|
|
143
274
|
* Build an AsyncIterable<string> token stream for the given provider.
|
|
144
275
|
* Throws on unsupported provider / missing API key.
|
|
@@ -172,8 +303,36 @@ export function buildProviderSource(provider, opts = {}) {
|
|
|
172
303
|
`API key required for ${provider} (--api-key or ${def.apiKeyEnv})`,
|
|
173
304
|
);
|
|
174
305
|
}
|
|
306
|
+
if (provider === "anthropic") {
|
|
307
|
+
return anthropicTokenStream({
|
|
308
|
+
baseUrl: baseUrl || def.baseUrl,
|
|
309
|
+
apiKey: finalKey,
|
|
310
|
+
model: model || def.models[0],
|
|
311
|
+
prompt,
|
|
312
|
+
messages,
|
|
313
|
+
signal,
|
|
314
|
+
requireCompletion,
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
if (provider === "gemini") {
|
|
318
|
+
return geminiTokenStream({
|
|
319
|
+
baseUrl:
|
|
320
|
+
baseUrl ||
|
|
321
|
+
def.baseUrl ||
|
|
322
|
+
"https://generativelanguage.googleapis.com/v1beta",
|
|
323
|
+
apiKey: finalKey,
|
|
324
|
+
model: model || def.models[0],
|
|
325
|
+
prompt,
|
|
326
|
+
messages,
|
|
327
|
+
signal,
|
|
328
|
+
requireCompletion,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
175
331
|
return openAIStream({
|
|
176
|
-
baseUrl:
|
|
332
|
+
baseUrl: openAICompatibleBaseUrl(
|
|
333
|
+
provider,
|
|
334
|
+
normalizeProviderBaseUrl(baseUrl || def.baseUrl),
|
|
335
|
+
),
|
|
177
336
|
apiKey: finalKey,
|
|
178
337
|
model: model || def.models[0],
|
|
179
338
|
prompt,
|
|
@@ -198,6 +198,7 @@ export function makeRunnableProviderFallback(
|
|
|
198
198
|
// swap ONLY the model to the provider's own default so the call succeeds.
|
|
199
199
|
if (
|
|
200
200
|
nonEmpty(options.provider) &&
|
|
201
|
+
inferProviderFromBaseUrl(options.baseUrl) === options.provider &&
|
|
201
202
|
modelForeignToProvider(options.provider, options.model)
|
|
202
203
|
) {
|
|
203
204
|
const def = defaultModelFor(options.provider);
|
package/src/repl/chat-repl.js
CHANGED
|
@@ -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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
12405
|
-
|
|
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
|
-
|
|
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:
|
|
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 =
|
|
12438
|
-
const key = apiKey
|
|
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
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
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
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
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:
|
|
25
|
+
model: connection.model || defaults.model || "qwen2:7b",
|
|
13
26
|
visionModel: overrides.visionModel,
|
|
14
|
-
provider:
|
|
15
|
-
|
|
16
|
-
|
|
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 y,U as n,R as a,S,K as x,Q as C,V as w,_ as B,b as s}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-DYPMJ5Mb.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"},O={class:"actor"},R={class:"time"},V={class:"body"};function q(c,d,t,r,i,l){const o=h("a-tag");return u(),y("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",T,[n("div",M,[n("span",O,a(r.actorLabel),1),n("span",R,a(r.formattedTime),1)]),n("div",V,a(r.messageText),1),t.event.source.adapter?(u(),S(o,{key:0,class:"src",color:r.adapterColor},{default:x(()=>[C(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(N,[["render",q],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-xv0Oy3/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ChatBubbleRenderer-DOX3Y5EJ.js","./vendor-Bn1JzzAn.js","./index-DYPMJ5Mb.js","./icons-DG5UD-6K.js","./index-Cq93VfoF.css","./ChatBubbleRenderer-gy5SDGw2.css","./OrderTableRenderer-DW0CNjh8.js","./OrderTableRenderer-CfrDjSHT.css","./TimelineRenderer-BobtChxX.js","./TimelineRenderer-BlTAtkOc.css","./EmailListRenderer-DB2-ooz6.js","./EmailListRenderer-DTPZPx_S.css","./GenericCardRenderer-DnPirB24.js","./GenericCardRenderer-o85VDYQS.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{E as ue,r as E,b as w,I as g,P as u,J as S,U as v,c,S as C,V as x,_ as M,F as V,Z as se,a0 as ae,R,K as m,Q as b,W as L,o as J}from"./vendor-Bn1JzzAn.js";import{u as U}from"./usePersonalDataHub-DISoRyQB.js";import{_ as D,e as F,d as P}from"./index-DYPMJ5Mb.js";import{aa as q,ag as Q,M as z,aI as G,v as H,aH as K,aq as W,ac as Y,e as de,d as fe,k as pe,ai as me,aA as ye,R as _e}from"./icons-DG5UD-6K.js";import"./useShellMode-CgR0wCYM.js";const I=Object.freeze({q:"",category:null,adapter:null,subtype:null,since:null,until:null}),B=50,Z=300,X=ue("pdhBrowser",()=>{const r=E({...I}),t=E([]),n=E(null),e=E(!1),o=E(!1),a=E(null),l=E(null),s=E(!1),i=E({byCategory:{},byAdapter:{},bySubtype:{},total:0});let d=0,y=null;const j=w(()=>t.value.length>0),A=w(()=>n.value!=null);function h(O={}){const p={},f=r.value;return f.q&&f.q.trim()&&(p.q=f.q.trim()),f.category&&(p.category=f.category),f.adapter&&(p.adapter=f.adapter),f.subtype&&(p.subtype=f.subtype),Number.isFinite(f.since)&&(p.since=f.since),Number.isFinite(f.until)&&(p.until=f.until),{...p,...O}}async function _(){const O=++d;e.value=!0,a.value=null;const p=U();try{const[f,T]=await Promise.all([p.searchEvents(h({limit:B})),p.facetCounts({...r.value.q&&r.value.q.trim()?{q:r.value.q.trim()}:{},...Number.isFinite(r.value.since)?{since:r.value.since}:{},...Number.isFinite(r.value.until)?{until:r.value.until}:{}})]);if(O!==d)return;t.value=f.rows||[],n.value=f.nextCursor||null,l.value=f.mode||"like",s.value=!!f.shortQuery,i.value={byCategory:T.byCategory||{},byAdapter:T.byAdapter||{},bySubtype:T.bySubtype||{},total:T.total||0}}catch(f){if(O!==d)return;a.value=f&&f.message?f.message:String(f),t.value=[],n.value=null}finally{O===d&&(e.value=!1)}}async function k(){if(!n.value||o.value)return;o.value=!0,a.value=null;const O=U();try{const p=await O.searchEvents(h({cursor:n.value,limit:B}));t.value=t.value.concat(p.rows||[]),n.value=p.nextCursor||null,l.value=p.mode||l.value}catch(p){a.value=p&&p.message?p.message:String(p)}finally{o.value=!1}}function le(O,p){if(!(O in I))throw new Error(`pdhBrowser.setFilter: unknown key "${O}"`);r.value={...r.value,[O]:p},y&&clearTimeout(y),y=setTimeout(()=>{y=null,_()},Z)}function ie(O){return r.value={...I,...O},y&&(clearTimeout(y),y=null),_()}function ce(){r.value={...I},t.value=[],n.value=null,a.value=null,i.value={byCategory:{},byAdapter:{},bySubtype:{},total:0}}return{filters:r,results:t,cursor:n,isLoading:e,isAppending:o,error:a,mode:l,shortQuery:s,facets:i,hasResults:j,canLoadMore:A,search:_,loadMore:k,setFilter:le,setFilters:ie,reset:ce,PAGE_SIZE:B,SEARCH_DEBOUNCE_MS:Z}}),ge=Object.freeze(["chat","social","email","shopping","travel","system","ai-chat","other"]),ve=Object.freeze({chat:"社交聊天",social:"内容平台",email:"邮件",shopping:"支付订单",travel:"出行",system:"系统数据","ai-chat":"AI 对话",other:"其他"});function N(r){return ve[r]||r||"未知"}const be=Object.freeze([["wechat","chat"],["messaging-","chat"],["social-","social"],["email-","email"],["shopping-","shopping"],["alipay-","shopping"],["travel-","travel"],["system-data","system"],["browser-","system"],["meeting-","system"],["vscode","system"],["vscodium","system"],["jetbrains-ide","system"],["win-recent","system"],["git-activity","system"],["shell-history","system"],["hbuilderx","system"],["local-files","system"],["cursor","ai-chat"],["claude-code","ai-chat"],["ai-chat-","ai-chat"]]);function $(r){if(typeof r!="string"||r.length===0)return"other";for(const[t,n]of be)if(t.endsWith("-")||t==="system-data"){if(r.startsWith(t))return n}else if(r===t)return n;return"other"}const he={__name:"CategorySidebar",props:{selected:{type:String,default:null},facets:{type:Object,default:()=>({byCategory:{},total:0})}},emits:["select"],setup(r,{expose:t}){t();const n=r,e=w(()=>n.facets.total||0),o={chat:Y,social:W,email:K,shopping:H,travel:G,system:z,"ai-chat":Q,other:q};function a(i){return o[i]||q}function l(i){return i?{backgroundColor:"#fff",color:"#1677ff"}:{backgroundColor:"#f0f0f0",color:"#666"}}const s={props:n,total:e,ICONS:o,iconFor:a,badgeStyle:l,computed:w,get AppstoreOutlined(){return q},get MessageOutlined(){return Y},get PlayCircleOutlined(){return W},get MailOutlined(){return K},get ShoppingOutlined(){return H},get CarOutlined(){return G},get MobileOutlined(){return z},get RobotOutlined(){return Q},get CATEGORIES(){return ge},get categoryLabel(){return N}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},Oe={class:"pdh-sidebar"},Se=["onClick"],we={class:"label"};function Ce(r,t,n,e,o,a){const l=g("a-badge");return u(),S("div",Oe,[t[2]||(t[2]=v("div",{class:"sidebar-title"},"数据类型",-1)),v("div",{class:M(["cat-item",{active:n.selected===null}]),onClick:t[0]||(t[0]=s=>r.$emit("select",null))},[c(e.AppstoreOutlined,{class:"icon"}),t[1]||(t[1]=v("span",{class:"label"},"全部",-1)),e.total>0?(u(),C(l,{key:0,count:e.total,"number-style":e.badgeStyle(n.selected===null),"overflow-count":9999},null,8,["count","number-style"])):x("v-if",!0)],2),(u(!0),S(V,null,se(e.CATEGORIES,s=>(u(),S("div",{key:s,class:M(["cat-item",{active:n.selected===s,dim:!n.facets.byCategory[s]}]),onClick:i=>r.$emit("select",s)},[(u(),C(ae(e.iconFor(s)),{class:"icon"})),v("span",we,R(e.categoryLabel(s)),1),n.facets.byCategory[s]?(u(),C(l,{key:0,count:n.facets.byCategory[s],"number-style":e.badgeStyle(n.selected===s),"overflow-count":9999},null,8,["count","number-style"])):x("v-if",!0)],10,Se))),128))])}const ke=D(he,[["render",Ce],["__scopeId","data-v-6b62a22e"],["__file","/tmp/cc-web-panel-xv0Oy3/repo/packages/web-panel/src/components/pdh/CategorySidebar.vue"]]),xe={__name:"SearchFilterBar",props:{filters:{type:Object,required:!0},facets:{type:Object,default:()=>({byAdapter:{}})},isLoading:{type:Boolean,default:!1},mode:{type:String,default:null},shortQuery:{type:Boolean,default:!1}},emits:["set-filter","reset"],setup(r,{expose:t,emit:n}){t();const e=r,o=n,a=w(()=>e.filters.category?`在「${e.filters.category}」类目内搜索…`:"搜索关键词(如:支付宝、罗技、Kotlin)…"),l=w(()=>Object.entries(e.facets.byAdapter||{}).sort((_,k)=>k[1]-_[1]).map(([_,k])=>({value:_,label:`${_} (${k})`}))),s=w(()=>!e.filters.since&&!e.filters.until?null:[e.filters.since?new Date(e.filters.since):null,e.filters.until?new Date(e.filters.until):null]),i=w(()=>!!(e.filters.q||e.filters.adapter||e.filters.subtype||e.filters.since||e.filters.until));function d(h){o("set-filter","q",h||"")}function y(h){o("set-filter","q",h||"")}function j(h){if(!h||h.length===0){o("set-filter","since",null),o("set-filter","until",null);return}const[_,k]=h;o("set-filter","since",_?+_:null),o("set-filter","until",k?+k:null)}const A={props:e,emit:o,placeholderText:a,adapterOptions:l,dateRangeValue:s,hasActiveFilters:i,onQInput:d,onSearch:y,onDateChange:j,computed:w,get SearchOutlined(){return pe},get CloseCircleOutlined(){return fe},get InfoCircleOutlined(){return de}};return Object.defineProperty(A,"__isScriptSetup",{enumerable:!1,value:!0}),A}},Ee={class:"pdh-filter-bar"},Re={key:1,class:"hint"},je={key:2,class:"hint"};function Ae(r,t,n,e,o,a){const l=g("a-input-search"),s=g("a-select"),i=g("a-range-picker"),d=g("a-button");return u(),S("div",Ee,[c(l,{value:n.filters.q,placeholder:e.placeholderText,"enter-button":"搜索","allow-clear":"",loading:n.isLoading,style:{flex:"1","max-width":"480px"},"onUpdate:value":e.onQInput,onSearch:e.onSearch},{prefix:m(()=>[c(e.SearchOutlined)]),_:1},8,["value","placeholder","loading"]),c(s,{value:n.filters.adapter,placeholder:"所有 adapter","allow-clear":"",options:e.adapterOptions,style:{width:"200px"},"onUpdate:value":t[0]||(t[0]=y=>r.$emit("set-filter","adapter",y||null))},null,8,["value","options"]),c(i,{value:e.dateRangeValue,placeholder:["开始日期","结束日期"],style:{width:"280px"},"onUpdate:value":e.onDateChange},null,8,["value"]),e.hasActiveFilters?(u(),C(d,{key:0,type:"link",danger:"",onClick:t[1]||(t[1]=y=>r.$emit("reset"))},{icon:m(()=>[c(e.CloseCircleOutlined)]),default:m(()=>[t[2]||(t[2]=b(" 清空筛选 ",-1))]),_:1})):x("v-if",!0),n.shortQuery?(u(),S("span",Re,[c(e.InfoCircleOutlined),t[3]||(t[3]=b(" 关键词需至少 3 字 (FTS5 trigram 限制) ",-1))])):n.mode==="like"?(u(),S("span",je,[c(e.InfoCircleOutlined),t[4]||(t[4]=b(" 当前为 LIKE 兜底模式 ",-1))])):x("v-if",!0)])}const Le=D(xe,[["render",Ae],["__scopeId","data-v-d7cce6e9"],["__file","/tmp/cc-web-panel-xv0Oy3/repo/packages/web-panel/src/components/pdh/SearchFilterBar.vue"]]),Fe={__name:"RendererDispatcher",props:{event:{type:Object,required:!0}},setup(r,{expose:t}){t();const n=L(()=>F(()=>import("./ChatBubbleRenderer-DOX3Y5EJ.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),e=L(()=>F(()=>import("./OrderTableRenderer-DW0CNjh8.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)),o=L(()=>F(()=>import("./TimelineRenderer-BobtChxX.js"),__vite__mapDeps([8,1,2,3,4,9]),import.meta.url)),a=L(()=>F(()=>import("./EmailListRenderer-DB2-ooz6.js"),__vite__mapDeps([10,1,2,3,4,11]),import.meta.url)),l=L(()=>F(()=>import("./GenericCardRenderer-DnPirB24.js"),__vite__mapDeps([12,1,2,3,4,13]),import.meta.url));function s(d){const y=d&&d.source&&d.source.adapter;switch($(y)){case"chat":case"ai-chat":return n;case"shopping":return e;case"travel":return o;case"email":return a;default:return l}}const i={ChatBubbleRenderer:n,OrderTableRenderer:e,TimelineRenderer:o,EmailListRenderer:a,GenericCardRenderer:l,rendererFor:s,defineAsyncComponent:L,get getCategory(){return $}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}};function De(r,t,n,e,o,a){return u(),C(ae(e.rendererFor(n.event)),{event:n.event},null,8,["event"])}const Te=D(Fe,[["render",De],["__file","/tmp/cc-web-panel-xv0Oy3/repo/packages/web-panel/src/components/pdh/renderers/RendererDispatcher.vue"]]);function ee(r){return JSON.stringify(r,null,2)}function te(r){return r.map(t=>JSON.stringify(t)).join(`
|
|
3
|
-
`)+`
|
|
4
|
-
`}function ne(r){const n=["id","subtype","occurredAt","occurredAtIso","actor","place","adapter","summary","contentJson","extraJson"].join(","),e=r.map(o=>{const a=Number.isFinite(o.occurredAt)?o.occurredAt:null,l=a?new Date(a).toISOString():"",s=o.source&&o.source.adapter||"",i=o.content&&(o.content.text||o.content.title||o.content.subject)||"";return[o.id||"",o.subtype||"",a!=null?String(a):"",l,o.actor||"",o.place||"",s,i,o.content?JSON.stringify(o.content):"",o.extra?JSON.stringify(o.extra):""].map(Ie).join(",")});return[n,...e].join(`
|
|
5
|
-
`)+`
|
|
6
|
-
`}function Ie(r){const t=String(r??"");return t.includes(",")||t.includes('"')||t.includes(`
|
|
7
|
-
`)||t.includes("\r")?'"'+t.replace(/"/g,'""')+'"':t}function re(r,t,n="application/octet-stream"){if(typeof window>"u"||typeof document>"u")return t;const e=new Blob([r],{type:n}),o=URL.createObjectURL(e),a=document.createElement("a");return a.href=o,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),setTimeout(()=>URL.revokeObjectURL(o),1e3),t}function oe(r,t=null){const n=new Date,e=n.getFullYear(),o=String(n.getMonth()+1).padStart(2,"0"),a=String(n.getDate()).padStart(2,"0"),l=r==="ndjson"?"ndjson":r,s=t?`-${t}`:"";return`pdh-events-${e}-${o}-${a}${s}.${l}`}const Pe={__name:"ExportDropdown",props:{events:{type:Array,required:!0},category:{type:String,default:null}},setup(r,{expose:t}){t();const n=r,e=w(()=>n.events.length>0),o={json:"application/json;charset=utf-8",ndjson:"application/x-ndjson;charset=utf-8",csv:"text/csv;charset=utf-8"};function a(i){switch(i){case"json":return ee(n.events);case"ndjson":return te(n.events);case"csv":return ne(n.events);default:throw new Error(`unknown format: ${i}`)}}function l({key:i}){try{const d=a(i),y=oe(i,n.category);re(d,y,o[i]),P.success(`已导出 ${n.events.length} 条到 ${y}`)}catch(d){P.error(`导出失败: ${d.message||d}`)}}const s={props:n,hasResults:e,MIME:o,serialize:a,onClick:l,computed:w,get DownloadOutlined(){return ye},get DownOutlined(){return me},get message(){return P},get eventsToJson(){return ee},get eventsToNdjson(){return te},get eventsToCsv(){return ne},get downloadAs(){return re},get suggestFilename(){return oe}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}};function qe(r,t,n,e,o,a){const l=g("a-button"),s=g("a-menu-item"),i=g("a-menu"),d=g("a-dropdown");return u(),C(d,{disabled:!e.hasResults},{overlay:m(()=>[c(i,{onClick:e.onClick},{default:m(()=>[c(s,{key:"json"},{default:m(()=>[...t[0]||(t[0]=[b("JSON (.json)",-1)])]),_:1}),c(s,{key:"ndjson"},{default:m(()=>[...t[1]||(t[1]=[b("NDJSON (.ndjson)",-1)])]),_:1}),c(s,{key:"csv"},{default:m(()=>[...t[2]||(t[2]=[b("CSV (.csv)",-1)])]),_:1})]),_:1})]),default:m(()=>[c(l,{disabled:!e.hasResults},{icon:m(()=>[c(e.DownloadOutlined)]),default:m(()=>[b(" 导出 ("+R(n.events.length)+") ",1),c(e.DownOutlined)]),_:1},8,["disabled"])]),_:1},8,["disabled"])}const Be=D(Pe,[["render",qe],["__file","/tmp/cc-web-panel-xv0Oy3/repo/packages/web-panel/src/components/pdh/ExportDropdown.vue"]]),Ve={__name:"PdhVaultBrowser",setup(r,{expose:t}){t();const n=X(),e=w(()=>n.filters.q?`没有匹配 "${n.filters.q}" 的事件 — 试试更短的关键词或换个类目`:n.filters.category?`「${N(n.filters.category)}」类目下还没有数据 — 去采集页同步对应 adapter`:"Vault 里还没有数据 — 去「个人数据中台」页面同步任意 adapter");function o(s){n.filters.category=s,n.search()}function a(s,i){n.setFilter(s,i)}J(()=>{!n.hasResults&&!n.isLoading&&n.search()});const l={store:n,emptyHint:e,onCategorySelect:o,onSetFilter:a,onMounted:J,computed:w,get ReloadOutlined(){return _e},get usePdhBrowserStore(){return X},get categoryLabel(){return N},CategorySidebar:ke,SearchFilterBar:Le,RendererDispatcher:Te,ExportDropdown:Be};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}},Ne={class:"pdh-browser-page"},Me={class:"page-header"},Je={class:"main-pane"},Ue={class:"results-summary"},Qe={key:0},ze={key:0},Ge={key:1},He={class:"loaded-of"},Ke={class:"results-list"},We={key:2,class:"load-more"};function Ye(r,t,n,e,o,a){const l=g("a-tag"),s=g("a-button"),i=g("a-space"),d=g("a-col"),y=g("a-spin"),j=g("a-alert"),A=g("a-empty"),h=g("a-row");return u(),S("div",Ne,[v("div",Me,[t[6]||(t[6]=v("div",null,[v("h2",{class:"page-title"},"数据浏览器"),v("p",{class:"page-sub"}," Vault 里所有已采集的数据,按类目浏览 / 全文检索 / 时间窗口筛选。 完全离线,不外传。 ")],-1)),c(i,null,{default:m(()=>[e.store.mode==="fts5"?(u(),C(l,{key:0,color:"green"},{default:m(()=>[...t[3]||(t[3]=[b("FTS5 trigram",-1)])]),_:1})):e.store.mode==="like"?(u(),C(l,{key:1,color:"orange"},{default:m(()=>[...t[4]||(t[4]=[b("LIKE 兜底",-1)])]),_:1})):x("v-if",!0),c(e.ExportDropdown,{events:e.store.results,category:e.store.filters.category},null,8,["events","category"]),c(s,{onClick:t[0]||(t[0]=_=>e.store.search()),loading:e.store.isLoading},{icon:m(()=>[c(e.ReloadOutlined)]),default:m(()=>[t[5]||(t[5]=b(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),c(h,{gutter:16,class:"browser-layout"},{default:m(()=>[c(d,{xs:24,sm:24,md:6,lg:5,xl:4},{default:m(()=>[c(e.CategorySidebar,{selected:e.store.filters.category,facets:e.store.facets,onSelect:e.onCategorySelect},null,8,["selected","facets"])]),_:1}),c(d,{xs:24,sm:24,md:18,lg:19,xl:20},{default:m(()=>[v("div",Je,[c(e.SearchFilterBar,{filters:e.store.filters,facets:e.store.facets,"is-loading":e.store.isLoading,mode:e.store.mode,"short-query":e.store.shortQuery,onSetFilter:e.onSetFilter,onReset:t[1]||(t[1]=_=>{e.store.reset(),e.store.search()})},null,8,["filters","facets","is-loading","mode","short-query"]),v("div",Ue,[e.store.isLoading&&e.store.results.length===0?(u(),S("span",Qe,[c(y,{size:"small"}),t[7]||(t[7]=b(" 载入中… ",-1))])):(u(),S(V,{key:1},[v("strong",null,R(e.store.facets.total),1),t[11]||(t[11]=b(" 条事件 ",-1)),e.store.filters.category?(u(),S("span",ze,[t[8]||(t[8]=b(" / 当前类目 ",-1)),v("strong",null,R(e.categoryLabel(e.store.filters.category)),1),v("strong",null,R(e.store.facets.byCategory[e.store.filters.category]||0),1)])):x("v-if",!0),e.store.filters.q?(u(),S("span",Ge,[t[9]||(t[9]=b(' / 关键词 "',-1)),v("em",null,R(e.store.filters.q),1),t[10]||(t[10]=b('"',-1))])):x("v-if",!0),v("span",He," / 已显示 "+R(e.store.results.length),1)],64))]),e.store.error?(u(),C(j,{key:0,type:"error","show-icon":"",message:e.store.error,closable:"",style:{margin:"12px 0"}},null,8,["message"])):x("v-if",!0),!e.store.isLoading&&e.store.results.length===0&&!e.store.error?(u(),C(A,{key:1,description:e.emptyHint,style:{"margin-top":"40px"}},null,8,["description"])):x("v-if",!0),v("div",Ke,[(u(!0),S(V,null,se(e.store.results,(_,k)=>(u(),C(e.RendererDispatcher,{key:`r-${k}-${_.id}`,event:_},null,8,["event"]))),128))]),e.store.canLoadMore?(u(),S("div",We,[c(s,{loading:e.store.isAppending,onClick:t[2]||(t[2]=_=>e.store.loadMore()),block:""},{default:m(()=>[...t[12]||(t[12]=[b(" 加载下一页 (50 条) ",-1)])]),_:1},8,["loading"])])):x("v-if",!0)])]),_:1})]),_:1})])}const nt=D(Ve,[["render",Ye],["__scopeId","data-v-0f7c02cd"],["__file","/tmp/cc-web-panel-xv0Oy3/repo/packages/web-panel/src/views/PdhVaultBrowser.vue"]]);export{nt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as v,J as m,U as _,R as l,c as p,K as u,S as w,V as k,r as h,P as i,a1 as P,a2 as Q,Q as b}from"./vendor-Bn1JzzAn.js";import{u as B,_ as D}from"./index-DYPMJ5Mb.js";import{b as E,f as K,S as N,am as T}from"./icons-DG5UD-6K.js";function L(){const n=[];let a=null,d=!1,e=null;return{push(o){if(n.push(o),a){const t=a;a=null,t()}},finish(o){if(d=!0,e=o||null,a){const t=a;a=null,t()}},async*iterate(){for(;;){for(;n.length>0;)yield n.shift();if(d){if(e)throw e;return}await new Promise(o=>{a=o})}}}}function V(){const n=B();function a(e){if(!e||!Array.isArray(e.messages))throw new Error("messages array is required");const o=L(),t=new AbortController;e.signal&&(e.signal.aborted?t.abort(e.signal.reason):e.signal.addEventListener("abort",()=>t.abort(e.signal.reason),{once:!0}));const s=n.sendStream({type:"llm.chat",messages:e.messages,options:e.options||{}},{onChunk:r=>o.push(r),idleMs:e.idleMs??6e4,signal:t.signal}).then(r=>(o.finish(null),r),r=>{throw o.finish(r),r});function c(){t.signal.aborted||t.abort(new Error("aborted"))}return{stream:o.iterate(),result:s,cancel:c}}async function d(e){const o=typeof e.onDelta=="function"?e.onDelta:()=>{},{stream:t,result:s}=a(e);try{for await(const c of t)o(c)}catch{}return s}return{chat:a,chatTo:d}}const U={__name:"QuickAsk",setup(n,{expose:a}){a();const d=V(),e=h(""),o=h(""),t=h(""),s=h(!1),c=h(""),r=h(null);let f=null;async function C(){if(!(s.value||!e.value.trim())){s.value=!0,t.value="",c.value="",r.value=null;try{const y=[{role:"user",content:e.value}],M={},z=o.value.trim();z&&(M.model=z);const q=d.chat({messages:y,options:M});f=q;try{for await(const x of q.stream)x?.content?t.value=x.content:x?.delta&&(t.value+=x.delta)}catch{}const A=await q.result;r.value={model:A?.model||null,tokens:A?.tokens??null},!t.value&&A?.message?.content&&(t.value=A.message.content)}catch(y){c.value=y?.message||String(y)}finally{s.value=!1,f=null}}}function S(){f?.cancel&&f.cancel()}function g(){t.value="",c.value="",r.value=null}const O={llm:d,prompt:e,model:o,answer:t,running:s,error:c,finalMeta:r,get activeChat(){return f},set activeChat(y){f=y},run:C,cancel:S,reset:g,ref:h,get SendOutlined(){return T},get SyncOutlined(){return N},get CheckCircleOutlined(){return K},get CloseOutlined(){return E},get useLlmChat(){return V}};return Object.defineProperty(O,"__isScriptSetup",{enumerable:!1,value:!0}),O}},j={style:{"margin-bottom":"24px"}},F={class:"page-title"},I={class:"page-sub"},J={style:{display:"flex","justify-content":"space-between","align-items":"center","margin-top":"12px"}},R={style:{display:"flex",gap:"8px","align-items":"center",color:"var(--text-muted)","font-size":"11px"}},W={key:0},G={key:1},H={key:2},X={key:0,style:{color:"#1677ff","font-size":"11px"}},Y={key:1,style:{color:"#52c41a","font-size":"11px"}},Z={key:0,style:{margin:"0","white-space":"pre-wrap","font-family":"var(--font-body, system-ui)","font-size":"13px"}},$={key:2,style:{background:"#2a1517",border:"1px solid #5c2426",padding:"8px","border-radius":"4px","margin-top":"8px"}},ee={style:{color:"#ff7875","font-size":"11px",margin:"0","white-space":"pre-wrap"}};function ne(n,a,d,e,o,t){const s=v("a-textarea"),c=v("a-input"),r=v("a-button"),f=v("a-space"),C=v("a-card"),S=v("a-empty");return i(),m("div",null,[_("div",j,[_("h2",F,l(n.$t("quickAsk.title")),1),_("p",I,l(n.$t("quickAsk.subtitle")),1)]),p(C,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:u(()=>[p(s,{value:e.prompt,"onUpdate:value":a[0]||(a[0]=g=>e.prompt=g),rows:4,placeholder:n.$t("quickAsk.promptPlaceholder"),disabled:e.running,onKeydown:[P(Q(e.run,["ctrl","prevent"]),["enter"]),P(Q(e.run,["meta","prevent"]),["enter"])]},null,8,["value","placeholder","disabled","onKeydown"]),_("div",J,[_("div",R,[p(c,{value:e.model,"onUpdate:value":a[1]||(a[1]=g=>e.model=g),placeholder:n.$t("quickAsk.modelPlaceholder"),size:"small",style:{width:"200px"},disabled:e.running,"allow-clear":""},null,8,["value","placeholder","disabled"]),e.answer?(i(),m("span",W,l(e.answer.length)+" "+l(n.$t("quickAsk.charsSuffix")),1)):k("v-if",!0),e.finalMeta?(i(),m("span",G,"· "+l(e.finalMeta.tokens??0)+" "+l(n.$t("quickAsk.tokensSuffix")),1)):k("v-if",!0),e.finalMeta?.model?(i(),m("span",H,"· "+l(e.finalMeta.model),1)):k("v-if",!0)]),p(f,null,{default:u(()=>[e.answer||e.error?(i(),w(r,{key:0,disabled:e.running,onClick:e.reset},{default:u(()=>[b(l(n.$t("quickAsk.clear")),1)]),_:1},8,["disabled"])):k("v-if",!0),e.running?(i(),w(r,{key:1,danger:"",onClick:e.cancel},{icon:u(()=>[p(e.CloseOutlined)]),default:u(()=>[b(" "+l(n.$t("quickAsk.cancel")),1)]),_:1})):(i(),w(r,{key:2,type:"primary",disabled:!e.prompt.trim(),onClick:e.run},{icon:u(()=>[p(e.SendOutlined)]),default:u(()=>[b(" "+l(n.$t("quickAsk.send")),1)]),_:1},8,["disabled"]))]),_:1})])]),_:1}),e.answer||e.running||e.error?(i(),w(C,{key:0,title:n.$t("quickAsk.answerCardTitle"),style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{extra:u(()=>[e.running?(i(),m("span",X,[p(e.SyncOutlined,{spin:!0}),b(" "+l(n.$t("quickAsk.streaming")),1)])):e.finalMeta?(i(),m("span",Y,[p(e.CheckCircleOutlined),b(" "+l(n.$t("quickAsk.done")),1)])):k("v-if",!0)]),default:u(()=>[e.answer?(i(),m("pre",Z,l(e.answer),1)):e.running?(i(),w(S,{key:1,description:n.$t("quickAsk.waitingFirstToken")},null,8,["description"])):k("v-if",!0),e.error?(i(),m("div",$,[_("pre",ee,l(e.error),1)])):k("v-if",!0)]),_:1},8,["title"])):k("v-if",!0)])}const re=D(U,[["render",ne],["__file","/tmp/cc-web-panel-xv0Oy3/repo/packages/web-panel/src/views/QuickAsk.vue"]]);export{re as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-DYPMJ5Mb.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-BVCMG9mS.js";import{a0 as t}from"./index-DYPMJ5Mb.js";import"./vendor-Bn1JzzAn.js";import"./index-BXfGHUz_.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-yNIbNftX.js";import{a0 as t}from"./index-DYPMJ5Mb.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-CZDXP1d9.js";import"./useFlexGapSupport-VcauLq0M.js";import"./styleChecker-mZKU3lvW.js";import"./index-BXfGHUz_.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|