chainlesschain 0.162.174 → 0.162.175
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/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-Dcl-X1Hw.js → AIOps-DherW0Rh.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-ClMh9HzT.js → ActionButton-CDGfqt2Y.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DPj0rSQ5.js → Analytics-BYhkzdgD.js} +3 -3
- package/src/assets/web-panel/assets/AppLayout-cEKk1cpb.js +9 -0
- package/src/assets/web-panel/assets/{Artifacts-L8781rE8.js → Artifacts-_aXR3WWc.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CffB6WIP.js → Audit-CYAf-gY7.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BkLhayyY.js → BackgroundAgents-D4Q20phR.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BQnwFI78.js → Backup-Cq0Tyk58.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-xuUGHQch.js → BaseInput-CPj_CdAv.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-feQXwWrg.js → Chat-BQ-Qq0es.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Ci97vNTs.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-DVaIiUGW.js → Checkbox-rke6l3yg.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-D2kEnzeU.js → Codegen-DiacrIPq.js} +1 -1
- package/src/assets/web-panel/assets/{Col-azDoyusS.js → Col-Cx3BY-Up.js} +1 -1
- package/src/assets/web-panel/assets/{Community-OZdnPWM5.js → Community-DfmWiQy8.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-VDMvBN-C.js → Compact-DdQnpxy5.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CPJ_zgQ1.js → Compliance-lzliOH_r.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-iRBwcsOA.js → Cowork-CYx4Un5k.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DrxrspUz.js → Cron-BGDcPFlo.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-D-rkAZXF.js → Crosschain-0_X5g2ri.js} +1 -1
- package/src/assets/web-panel/assets/{DID-5Pp1Xnmr.js → DID-C0PEf3Eu.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-DULQjQ58.js +3 -0
- package/src/assets/web-panel/assets/{Dropdown-BWj_E0Ie.js → Dropdown-DGRHRbW6.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BT-wgSEh.js → EmailListRenderer-ChX8XPwB.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-1PzH23pa.js → FamilyGuardDashboard-Dyq6IBNu.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BxMIXGC6.js → Federation-DH1NfAL2.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CyJobBln.js → FormItemContext-BN1I_uNi.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-YkjFuQTN.js → GenericCardRenderer-Dq_2UYpe.js} +1 -1
- package/src/assets/web-panel/assets/{Git-C2a98Wp_.js → Git-BAy1yvI2.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DKL3Fl84.js → Governance-Db6Q2iSy.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BJ2cQC_3.js → Inference-0ub6yHcr.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DBAsOngt.js → KnowledgeGraph-DtLetM36.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-COt8g9LO.js → Logs-Bcoy7CUd.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-3Lfht1Fd.js → MarkdownRenderer-BfEMFAXf.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-C9Zk9Pb2.js → Marketplace-tt2rzwRR.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DDWDFWPO.js → McpTools-BhOgX-MU.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-BRmVye_o.js → Memory-BJUxeWBL.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CppBbWpD.js → MobileBridge-BwUY2G9w.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-C4GKn1dH.js → MobileProjects-BLRfHhqi.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CcWpeGa6.js → Mtc-B2WMboOm.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-BcllEq0K.js → MtcAudit-8pNEXO63.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-BFD1CarL.js → Multisig-C1wm5a_1.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-QNXXYvjz.js → NLProgramming-C1QpKF7g.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-07YwgQVy.js → Notes-CiQUcxFu.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-bOccEInE.js → NotificationSettings-BblDPJ_x.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DlRi29WL.js → OrderTableRenderer-DRjYcPtb.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CBaezzEr.js → Organization-Dp3VKB0X.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Bl5NohFO.js → Overflow-Czx161m9.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CLMal9Aw.js → P2P-ClFi6wOs.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CGO0NITk.js → PdhVaultBrowser-CRweW0lz.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CPSw48E2.js → Permissions-BzcRoqTn.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CDM5n134.js → PersonalDataHub-ChGTpNMd.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-BdsqG7WV.js → Pipeline-BMOOpKWA.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B6L4E-M7.js → Privacy-D0AZHObH.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DXPyZKRs.js → ProjectInit-yYFlZ6Ja.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BrCC3xYT.js → ProjectSettings-DJNVuMQs.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BYmuHC2q.js → Projects-Br0rBWH1.js} +1 -1
- package/src/assets/web-panel/assets/Providers-zZRhNtSu.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-DkukgCrR.js → QrScannerModal-81NZOitV.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-D-htOrV8.js → QuickAsk-Dic2lCbJ.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Bm7SIfzu.js → Recommend-Dh9iwViE.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C9rP-iMc.js → RemoteSession-Bq9VYEFy.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-kGlUgbsl.js → Reputation-CxFZ-NbJ.js} +1 -1
- package/src/assets/web-panel/assets/{Row-PBupbbUA.js → Row-BVSLcaX2.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-njlwKUGK.js → RssFeed-BbC-5DOH.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DLdEmgBw.js → Search-BfjZ1GCr.js} +1 -1
- package/src/assets/web-panel/assets/{Security-SXGPSHdu.js → Security-CVjhOV5r.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CuFGnNsb.js → Services-D45u-Aqe.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CtUC0mDa.js → Skeleton-WkGoK4he.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-P1qgOVFn.js → Skills-D_jvQZcj.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CsppE8YV.js → Sla-Bf4QTF3E.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Cq1oG56m.js → SpeechSettings-DVpZdbMN.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DdKW6V-C.js → SyncSettings-DEEojoMS.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BCc9san5.js → Tasks-DFwxpLIk.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CcHC1dMA.js → Templates-Bzl-9wY5.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CA4PqU22.js → Tenant-0khxUOB8.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-Fj7ea0In.js → Terminal-DWGYhAYU.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DHWTSvOy.js → TimelineRenderer-B0Y4LONc.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Ddz-P_yh.js → Tokens-DEE07SFh.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-ePmrmLZ1.js → Trigger-BM7xvA5z.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DmuK1CCE.js → Trust-Dv3ijvvZ.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CqqBuRrT.js → UkeySign-B1-enmMt.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BGlR3uWM.js → VideoEditing-DYiIPByd.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Ba_Qx6Ga.js → Wallet-D-y374BQ.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-29neXKt2.js → WebAuthn-HBDjcUhi.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-lD0lR0UQ.js → WorkflowEditor-sKn4qTID.js} +1 -1
- package/src/assets/web-panel/assets/{chat-B3stH01u.js → chat-TVYhaBXj.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Czly56MN.js → colors-DMADxY9v.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-C0TkbkAJ.js → compact-item-OftcHpO_.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BJmpSlf1.js → createContext-DW1zVUSN.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CLOk6rdE.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-D1q-zw7u.js → hasIn-CaUathNp.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7sFKQ53.js → index--5UvwqH_.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dpz_7sf-.js → index-77kgkUgY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlvsSuBC.js → index-8YelceUU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpMIdPJ0.js → index-B-19mFhn.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEt2-3x5.js → index-B52Ztt8Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQftlZn-.js → index-BBNg08cD.js} +3 -3
- package/src/assets/web-panel/assets/{index-upY9rkGZ.js → index-BEzLLVYd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDHXx65P.js → index-BFVbDpqg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmUta2lw.js → index-BJ1PjRY3.js} +1 -1
- package/src/assets/web-panel/assets/{index-z8ATo2aQ.js → index-BSp1Ofvx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DO8xOwxi.js → index-Bg-7FpaL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpGs96FC.js → index-BupSWDcl.js} +1 -1
- package/src/assets/web-panel/assets/{index-K4YaPDOn.js → index-BvRw4Fna.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8KqsomG.js → index-C9JoaYSs.js} +1 -1
- package/src/assets/web-panel/assets/{index-8GKykbS4.js → index-CK-p7Hji.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dw3L_smW.js → index-CKNdnJRo.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAhrn9EJ.js → index-CM8W07sc.js} +1 -1
- package/src/assets/web-panel/assets/index-CSgUfMTM.js +1 -0
- package/src/assets/web-panel/assets/{index-C1pOqU7D.js → index-CZXYI5LU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DV-twjNO.js → index-CeCIYYG7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIF6XHIi.js → index-Cmdv6Dev.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cu_4HaUS.js → index-CpDtN0dl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRcQsPez.js → index-D63QVAiJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-kTvMq7.js → index-DAfT3EMd.js} +1 -1
- package/src/assets/web-panel/assets/{index-CHvPlzWJ.js → index-DHi634g9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgS8XUBU.js → index-DKjqFpYa.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZDUhX41Z.js → index-DWVZ3T0t.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVwJ3jht.js → index-DXcqvWBp.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbvNJUwu.js → index-DYwwUKDg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaqEHaCg.js → index-DZdT8nio.js} +1 -1
- package/src/assets/web-panel/assets/index-DliSZvAP.js +1 -0
- package/src/assets/web-panel/assets/{index-DBqAm8es.js → index-GUKz4Pv9.js} +1 -1
- package/src/assets/web-panel/assets/{index-ChESIe5r.js → index-Lr0MO-GU.js} +1 -1
- package/src/assets/web-panel/assets/{index-C27TnOoT.js → index-hXq7QRA_.js} +1 -1
- package/src/assets/web-panel/assets/{index-cPjWjvmW.js → index-iDmgT2Dg.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cf7Gr3NG.js → index-kdMl_0zL.js} +1 -1
- package/src/assets/web-panel/assets/{index-XWV8JWMc.js → index-pSVCBsG4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZeoKL6t.js → index-s-EnkUCn.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bm_-RKal.js → index-sm1sGIxW.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-QWEXi6-t.js → initDefaultProps-DdcKTlQR.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BfrQwvV1.js → motion-CL-hTBQj.js} +1 -1
- package/src/assets/web-panel/assets/{move-Dn7x0H9t.js → move-qYSAkxNG.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-F61D_TgE.js → mtc-parser-ZwRSZtRP.js} +1 -1
- package/src/assets/web-panel/assets/{omit-4SQZ39PF.js → omit-Bld-8ftI.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-C7DTe126.js → pickAttrs-DGHs-a9Z.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-40NeyzDK.js → placementArrow-DRQPMyI5.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BiUJ6qWs.js → responsiveObserve-C5MJG_Yo.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CacJTM3f.js → slide-VZ-fpZCD.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-K812HB-k.js → statusUtils-9ocfCyHk.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CKeHA2eM.js → styleChecker-B6QAwAN5.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CKl4FqXF.js → useFlexGapSupport-Bq1twor3.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DPoiJjSZ.js → useFs-DKZq96tz.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-aHwBspmt.js → usePersonalDataHub-D0RmRVXf.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DrA-GuCT.js → vnode-D6kEj_tt.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-G3LMswgy.js → zoom-2yfasoQf.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +6 -2
- package/src/commands/background-session.js +103 -0
- package/src/esm-bridge.js +3 -0
- package/src/gateways/ws/ws-server.js +18 -2
- package/src/index.js +123 -55
- package/src/lazy-dispatch.js +86 -85
- package/src/lib/async-hook-supervisor.cjs +14 -2
- package/src/lib/background-interaction-resolver.js +71 -0
- package/src/lib/background-session-transport.js +59 -1
- package/src/lib/crash-reporter.js +6 -0
- package/src/lib/hook-manager.js +32 -4
- package/src/lib/ipc-attach-protocol.js +98 -0
- package/src/lib/process-execution-broker/credential-agent.js +275 -0
- package/src/lib/process-execution-broker/index.js +155 -6
- package/src/lib/process-execution-broker/platform-sandbox.js +351 -0
- package/src/lib/provenance-api.js +6 -0
- package/src/lib/proxy-bootstrap.js +19 -0
- package/src/lib/repl-rewind.js +9 -4
- package/src/lib/session-hooks.js +328 -473
- package/src/lib/session-telemetry-middleware.js +6 -0
- package/src/lib/trace-api.js +6 -0
- package/src/lib/update-notice.js +3 -43
- package/src/repl/agent-repl.js +39 -13
- package/src/workers/background-agent-worker.js +80 -1
- package/src/assets/web-panel/assets/AppLayout-7iSKDmlI.js +0 -9
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DcbUHeGW.js +0 -1
- package/src/assets/web-panel/assets/Dashboard-BAKYNavw.js +0 -3
- package/src/assets/web-panel/assets/Providers-CbCe2eUl.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CDI8Sbaj.js +0 -1
- package/src/assets/web-panel/assets/index-96LBR96V.js +0 -1
- package/src/assets/web-panel/assets/index-DyQkiW24.js +0 -1
package/src/lib/update-notice.js
CHANGED
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Zero startup cost by design:
|
|
5
|
-
* - the CLI entry only does ONE sync cache read (~/.chainlesschain/
|
|
6
|
-
* update-check.json) and prints a single gray stderr line when the cached
|
|
7
|
-
* latest version is newer than the running one (TTY only, never pollutes
|
|
8
|
-
* piped/JSON output);
|
|
9
|
-
* - when the cache is stale (>24h) it spawns a DETACHED, unref'd child that
|
|
10
|
-
* refreshes the cache from the npm registry for the NEXT run — the current
|
|
11
|
-
* invocation never waits on the network. The cache's checkedAt is touched
|
|
12
|
-
* optimistically before spawning so concurrent invocations don't stampede.
|
|
13
|
-
*
|
|
14
|
-
* Disable with CC_UPDATE_NOTICE=0. `cc update` remains the full interactive
|
|
15
|
-
* checker (GitHub releases + assets); this is just the passive nudge.
|
|
2
|
+
* Passive startup update notice. Cache reads are synchronous and fail-open;
|
|
3
|
+
* refreshing the npm metadata is delegated to a detached child process.
|
|
16
4
|
*/
|
|
17
|
-
|
|
18
5
|
import fsDefault from "fs";
|
|
19
6
|
import pathDefault from "path";
|
|
20
7
|
import osDefault from "os";
|
|
@@ -28,7 +15,6 @@ import { readDiskVersion } from "./version-skew.js";
|
|
|
28
15
|
export const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
29
16
|
export const NPM_LATEST_URL =
|
|
30
17
|
"https://registry.npmjs.org/chainlesschain/latest";
|
|
31
|
-
|
|
32
18
|
export const _deps = {
|
|
33
19
|
fs: fsDefault,
|
|
34
20
|
path: pathDefault,
|
|
@@ -63,34 +49,19 @@ function writeCache(deps, cache) {
|
|
|
63
49
|
}
|
|
64
50
|
}
|
|
65
51
|
|
|
66
|
-
/**
|
|
67
|
-
* Entry-point hook. Cheap and fail-open — never throws, never blocks.
|
|
68
|
-
*
|
|
69
|
-
* @returns {{ printed: boolean, spawned: boolean }}
|
|
70
|
-
*/
|
|
71
52
|
export function maybeNotifyUpdate(opts = {}) {
|
|
72
53
|
const deps = { ..._deps, ...(opts.deps || {}) };
|
|
73
54
|
const env = opts.env || process.env;
|
|
74
55
|
const now = opts.now ?? Date.now();
|
|
75
56
|
const isTTY = opts.isTTY ?? Boolean(process.stderr.isTTY);
|
|
76
|
-
// `running` = the version THIS process loaded at spawn (baked VERSION).
|
|
77
|
-
// `installed` = the version on disk RIGHT NOW (a fresh package.json read).
|
|
78
|
-
// They diverge after `npm i -g` runs under a long-lived process: the files
|
|
79
|
-
// update but the running process keeps the old code. We therefore compare the
|
|
80
|
-
// INSTALLED version against npm latest (so a stale process never nags
|
|
81
|
-
// "npm i -g" when disk is already current), and separately flag a
|
|
82
|
-
// running<installed skew as "restart to apply" (re-installing wouldn't help).
|
|
83
57
|
const running = opts.currentVersion || VERSION;
|
|
84
58
|
const installed = opts.installedVersion ?? readDiskVersion() ?? running;
|
|
85
59
|
const print =
|
|
86
60
|
opts.print || ((line) => process.stderr.write(chalk.gray(line) + "\n"));
|
|
87
|
-
|
|
88
61
|
const out = { printed: false, spawned: false };
|
|
89
62
|
try {
|
|
90
63
|
if (env.CC_UPDATE_NOTICE === "0") return out;
|
|
91
|
-
|
|
92
64
|
const cache = readCache(deps);
|
|
93
|
-
|
|
94
65
|
if (
|
|
95
66
|
isTTY &&
|
|
96
67
|
cache?.latest &&
|
|
@@ -98,7 +69,6 @@ export function maybeNotifyUpdate(opts = {}) {
|
|
|
98
69
|
semver.valid(installed) &&
|
|
99
70
|
semver.gt(cache.latest, installed)
|
|
100
71
|
) {
|
|
101
|
-
// A newer release exists on npm → a real upgrade is available.
|
|
102
72
|
print(
|
|
103
73
|
`Update available: chainlesschain ${installed} → ${cache.latest} (npm i -g chainlesschain · CC_UPDATE_NOTICE=0 to hide)`,
|
|
104
74
|
);
|
|
@@ -109,19 +79,13 @@ export function maybeNotifyUpdate(opts = {}) {
|
|
|
109
79
|
semver.valid(running) &&
|
|
110
80
|
semver.gt(installed, running)
|
|
111
81
|
) {
|
|
112
|
-
// Already updated on disk, but this process is older → restart to apply.
|
|
113
|
-
// Re-running `npm i -g` would be a no-op; the fix is to relaunch cc / the
|
|
114
|
-
// IDE panel so the new code loads.
|
|
115
82
|
print(
|
|
116
83
|
`cc was updated ${running} → ${installed} on disk — restart cc (or reload your IDE panel) to apply (CC_UPDATE_NOTICE=0 to hide)`,
|
|
117
84
|
);
|
|
118
85
|
out.printed = true;
|
|
119
86
|
}
|
|
120
|
-
|
|
121
87
|
const stale = !cache?.checkedAt || now - cache.checkedAt > CACHE_TTL_MS;
|
|
122
88
|
if (stale) {
|
|
123
|
-
// Optimistic touch first: parallel `cc` invocations inside the stale
|
|
124
|
-
// window won't each spawn a refresher.
|
|
125
89
|
writeCache(deps, { ...(cache || {}), checkedAt: now });
|
|
126
90
|
const refresher = deps.path.join(
|
|
127
91
|
deps.path.dirname(fileURLToPath(import.meta.url)),
|
|
@@ -136,15 +100,11 @@ export function maybeNotifyUpdate(opts = {}) {
|
|
|
136
100
|
out.spawned = true;
|
|
137
101
|
}
|
|
138
102
|
} catch {
|
|
139
|
-
/*
|
|
103
|
+
/* update hints must never affect the CLI */
|
|
140
104
|
}
|
|
141
105
|
return out;
|
|
142
106
|
}
|
|
143
107
|
|
|
144
|
-
/**
|
|
145
|
-
* One cache refresh (used by the detached child; exported for tests).
|
|
146
|
-
* npm registry only — light, unauthenticated, no GitHub rate-limit risk.
|
|
147
|
-
*/
|
|
148
108
|
export async function refreshCacheOnce({
|
|
149
109
|
cacheFile,
|
|
150
110
|
fetchImpl = fetch,
|
package/src/repl/agent-repl.js
CHANGED
|
@@ -77,6 +77,7 @@ import {
|
|
|
77
77
|
fireUserPromptSubmit,
|
|
78
78
|
fireAssistantResponse,
|
|
79
79
|
fireSessionStop,
|
|
80
|
+
fireNotification,
|
|
80
81
|
} from "../lib/session-hooks.js";
|
|
81
82
|
import { HookEvents } from "../lib/hook-manager.js";
|
|
82
83
|
import { IterationBudget } from "../lib/iteration-budget.js";
|
|
@@ -182,21 +183,46 @@ function persistRecentDenial(record, options = {}) {
|
|
|
182
183
|
* user's attention (e.g. waiting on a permission/risk confirmation). A hook can
|
|
183
184
|
* ring a bell / send a desktop notification. Best-effort, never blocks.
|
|
184
185
|
*/
|
|
185
|
-
async function _fireNotification(message) {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
186
|
+
async function _fireNotification(message, type = "info") {
|
|
187
|
+
// Fire settings.json observe hooks first (best-effort)
|
|
188
|
+
if (_settingsHooks) {
|
|
189
|
+
try {
|
|
190
|
+
const { runObserveHooks } =
|
|
191
|
+
await import("../lib/settings-hook-events.cjs");
|
|
192
|
+
runObserveHooks(
|
|
193
|
+
_settingsHooks,
|
|
194
|
+
"Notification",
|
|
195
|
+
{
|
|
196
|
+
message,
|
|
197
|
+
type,
|
|
198
|
+
cwd: process.cwd(),
|
|
199
|
+
session_id: _session?.sessionId || null,
|
|
200
|
+
},
|
|
201
|
+
{ cwd: process.cwd() },
|
|
202
|
+
);
|
|
203
|
+
} catch (_err) {
|
|
204
|
+
// observe-only — never affect the prompt
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Fire database-registered Notification hooks (interceptable/suppressible)
|
|
208
|
+
if (_session) {
|
|
209
|
+
try {
|
|
210
|
+
const result = await fireNotification(_hookDb, message, {
|
|
211
|
+
session: _session,
|
|
212
|
+
type,
|
|
213
|
+
});
|
|
214
|
+
if (result?.directive?.suppress) {
|
|
215
|
+
return { suppress: true };
|
|
216
|
+
}
|
|
217
|
+
if (result?.directive?.message) {
|
|
218
|
+
return { message: result.directive.message };
|
|
219
|
+
}
|
|
220
|
+
} catch (_err) {
|
|
221
|
+
// ignore hook errors
|
|
222
|
+
}
|
|
197
223
|
}
|
|
224
|
+
return { message };
|
|
198
225
|
}
|
|
199
|
-
|
|
200
226
|
/**
|
|
201
227
|
* "Always allow" persistence: derive a sensible allow rule for a tool call,
|
|
202
228
|
* append it to .claude/settings.local.json (personal, gitignored), and reflect
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
} from "../lib/background-agent-supervisor.js";
|
|
26
26
|
import { startBackgroundSessionServer } from "../lib/background-session-transport.js";
|
|
27
27
|
import { idlePhaseFor } from "../lib/background-agent-phase.js";
|
|
28
|
+
import { attachInteractionRequestHandler } from "../lib/background-interaction-resolver.js";
|
|
28
29
|
|
|
29
30
|
const jobFile = process.argv[2];
|
|
30
31
|
let job;
|
|
@@ -37,7 +38,10 @@ let phase = "turn";
|
|
|
37
38
|
let turnCount = 0;
|
|
38
39
|
let lastExit = { code: 0, signal: null };
|
|
39
40
|
let transportState = null;
|
|
41
|
+
let detachInteractionHandler = null;
|
|
40
42
|
const promptQueue = [];
|
|
43
|
+
// P0-2: 保存 pending 的交互请求,等 attach 客户端连接后转发
|
|
44
|
+
const pendingInteractions = new Map();
|
|
41
45
|
|
|
42
46
|
// Backpressure (Gap 4): an attached client can push prompts faster than
|
|
43
47
|
// turns drain — an unbounded queue grows without limit and every entry is a
|
|
@@ -114,7 +118,7 @@ function startTurn(argv, promptText) {
|
|
|
114
118
|
child = spawn(process.execPath, [job.cliEntry, ...argv], {
|
|
115
119
|
cwd: job.cwd,
|
|
116
120
|
env: { ...process.env, CC_BACKGROUND_AGENT_ID: job.id },
|
|
117
|
-
stdio: ["ignore", log.fd, log.fd],
|
|
121
|
+
stdio: ["ignore", log.fd, log.fd, "ipc"], // P0-2: 开启 IPC 通道用于人机交互
|
|
118
122
|
windowsHide: true,
|
|
119
123
|
// POSIX: give the agent child its own process group so an orphan reclaim
|
|
120
124
|
// (worker crashed → supervisor kills the recorded agentPid) or /stop can
|
|
@@ -146,9 +150,71 @@ function startTurn(argv, promptText) {
|
|
|
146
150
|
turn: turnCount,
|
|
147
151
|
prompt: promptText || null,
|
|
148
152
|
});
|
|
153
|
+
|
|
154
|
+
// P0-2: 挂载人机交互请求处理器,转发给 attach 客户端
|
|
155
|
+
detachInteractionHandler = attachInteractionRequestHandler(
|
|
156
|
+
child,
|
|
157
|
+
async (payload, msg) => {
|
|
158
|
+
const requestId = msg.requestId;
|
|
159
|
+
// 如果有 attach 客户端,转发给它等待响应
|
|
160
|
+
if (server && server.clientCount() > 0) {
|
|
161
|
+
return new Promise((resolve, reject) => {
|
|
162
|
+
const timer = setTimeout(
|
|
163
|
+
() => {
|
|
164
|
+
pendingInteractions.delete(requestId);
|
|
165
|
+
if (payload.defaultValue !== undefined) {
|
|
166
|
+
resolve(payload.defaultValue);
|
|
167
|
+
} else {
|
|
168
|
+
reject(new Error(`Interaction timed out: ${payload.question}`));
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
payload.timeoutMs || 5 * 60 * 1000,
|
|
172
|
+
);
|
|
173
|
+
timer.unref?.();
|
|
174
|
+
pendingInteractions.set(requestId, {
|
|
175
|
+
resolve,
|
|
176
|
+
reject,
|
|
177
|
+
timer,
|
|
178
|
+
payload,
|
|
179
|
+
});
|
|
180
|
+
server.broadcastInteractionRequest(requestId, payload);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
// 没有客户端连接,返回默认值(如果有的话)
|
|
184
|
+
if (payload.defaultValue !== undefined) {
|
|
185
|
+
return payload.defaultValue;
|
|
186
|
+
}
|
|
187
|
+
// 没有默认值,记录到 state 让用户后续 attach 时能看到
|
|
188
|
+
mergeState({
|
|
189
|
+
pendingQuestion: {
|
|
190
|
+
intId: requestId,
|
|
191
|
+
requestId,
|
|
192
|
+
prompt: payload.prompt || payload.question,
|
|
193
|
+
hint: payload.hint,
|
|
194
|
+
options: payload.options,
|
|
195
|
+
multiSelect: payload.multiSelect,
|
|
196
|
+
timeoutMs: payload.timeoutMs,
|
|
197
|
+
askedAt: Date.now(),
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
// 等待用户 attach 后回复
|
|
201
|
+
return new Promise((resolve) => {
|
|
202
|
+
pendingInteractions.set(requestId, { resolve });
|
|
203
|
+
});
|
|
204
|
+
},
|
|
205
|
+
);
|
|
206
|
+
|
|
149
207
|
child.on("exit", (code, signal) => {
|
|
150
208
|
lastExit = { code, signal };
|
|
151
209
|
child = null;
|
|
210
|
+
// 清理交互处理器
|
|
211
|
+
detachInteractionHandler?.();
|
|
212
|
+
detachInteractionHandler = null;
|
|
213
|
+
// 清理所有 pending 交互
|
|
214
|
+
for (const [, pending] of pendingInteractions) {
|
|
215
|
+
pending.reject?.(new Error("Agent exited"));
|
|
216
|
+
}
|
|
217
|
+
pendingInteractions.clear();
|
|
152
218
|
server?.broadcast({ type: "turn-ended", turn: turnCount, exitCode: code });
|
|
153
219
|
maybeContinue();
|
|
154
220
|
});
|
|
@@ -259,6 +325,19 @@ async function main() {
|
|
|
259
325
|
finalize(lastExit.code, lastExit.signal);
|
|
260
326
|
}
|
|
261
327
|
},
|
|
328
|
+
onInteractionResponse: ({ requestId, intId, answer, error }) => {
|
|
329
|
+
// Support both field names: requestId (from transport) and intId (legacy)
|
|
330
|
+
const resolvedId = requestId ?? intId;
|
|
331
|
+
const entry = pendingInteractions.get(resolvedId);
|
|
332
|
+
if (!entry) return;
|
|
333
|
+
pendingInteractions.delete(resolvedId);
|
|
334
|
+
clearTimeout(entry.timer);
|
|
335
|
+
if (error) {
|
|
336
|
+
entry.reject(new Error(error));
|
|
337
|
+
} else {
|
|
338
|
+
entry.resolve(answer);
|
|
339
|
+
}
|
|
340
|
+
},
|
|
262
341
|
});
|
|
263
342
|
transportState = { pipe: server.pipePath, token };
|
|
264
343
|
mergeState({ transport: transportState });
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import{b as v,r as D,I as k,P as p,J as L,c as e,K as t,U as d,Q as l,R as a,S as B,F,Z as se,_ as W,V as m,o as z,x as $,$ as fe,N as J,f as ee,M as te,w as ne,a0 as me}from"./vendor-Bn1JzzAn.js";import{u as H,_ as Z,E as ke,a as oe,b as ie,c as ae,T as ge,d as V}from"./index-CQftlZn-.js";import{u as U}from"./useShellMode-CgR0wCYM.js";import{R as _e,B as de,M as ue,F as Oe,U as he,D as be,S as we,h as ve,i as Le,j as Se,N as Ce,k as Ee,l as Te,m as Ae,n as Be,A as Me,P as Re,o as De,p as Pe,q as je,r as Ne,s as Ue,t as Fe,u as Ie,v as Ke,w as Ve,x as We,y as ze,V as Ge,K as He,z as qe,G as Je,H as Ye,J as Ze,O as Qe,W as Xe,Q as xe,X as $e,Y as et,Z as tt,_ as nt,$ as ot,a0 as it,a1 as at,a2 as lt,a3 as rt,a4 as st,a5 as dt,a6 as ut,e as ct,a7 as yt,a8 as pt,a9 as ft,aa as mt,ab as kt,ac as gt,ad as _t}from"./icons-DG5UD-6K.js";import le from"./index-DmUta2lw.js";import"./KeyCode-D63Tfrq7.js";import"./omit-4SQZ39PF.js";import"./pickAttrs-C7DTe126.js";import"./initDefaultProps-QWEXi6-t.js";import"./motion-BfrQwvV1.js";import"./raf-Deuc0E8-.js";import"./index-BVwJ3jht.js";import"./index-8GKykbS4.js";import"./isVisible-C7tPsqfj.js";import"./useState-CnxtbLoC.js";import"./devWarning-CDI8Sbaj.js";import"./compact-item-C0TkbkAJ.js";import"./createContext-BJmpSlf1.js";import"./Compact-VDMvBN-C.js";import"./_getTag-DnrRH4E6.js";import"./styleChecker-CKeHA2eM.js";import"./zoom-G3LMswgy.js";import"./ActionButton-ClMh9HzT.js";import"./vnode-DrA-GuCT.js";const Ot=""+new URL("logo-DBCYUiWP.png",import.meta.url).href,T={notifications:D([]),unreadCount:D(0)};function G(i){if(i&&i.ok===!1)throw new Error(i.error||"notification handler failed");return i?.result??i}function re(){const i=H();async function u({limit:o=50,offset:s=0,isRead:f}={}){if(!U().isEmbedded)return T.notifications.value=[],T.unreadCount.value=0,T.notifications.value;const _=await i.sendRaw({type:"notification.list",limit:o,offset:s,isRead:f},15e3),O=G(_);if(O?.success===!1)throw new Error(O.error||"notification.list failed");return T.notifications.value=Array.isArray(O?.notifications)?O.notifications:[],await S(),T.notifications.value}async function S(){if(!U().isEmbedded)return T.unreadCount.value=0,0;const o=await i.sendRaw({type:"notification.unread-count"},1e4),s=G(o);return T.unreadCount.value=Number(s?.count)||0,T.unreadCount.value}async function n(o){if(o==null||o==="")throw new Error("id is required");if(!U().isEmbedded)return;const s=await i.sendRaw({type:"notification.mark-read",id:o},1e4),f=G(s);if(f?.success===!1)throw new Error(f.error||"notification.mark-read failed");const _=T.notifications.value.find(O=>O.id===o);_&&(_.is_read=1),await S()}async function g(){if(!U().isEmbedded)return;const o=await i.sendRaw({type:"notification.mark-all-read"},1e4),s=G(o);if(s?.success===!1)throw new Error(s.error||"notification.mark-all-read failed");for(const f of T.notifications.value)f.is_read=1;T.unreadCount.value=0}async function h(o,s=""){if(!U().isEmbedded)throw new Error("桌面通知仅在嵌入式 web-shell 中可用");const f=await i.sendRaw({type:"notification.send-desktop",title:o,body:s},1e4),_=G(f);if(_?.success===!1)throw new Error(_.error||"notification.send-desktop failed")}return{notifications:v(()=>T.notifications.value),unreadCount:v(()=>T.unreadCount.value),refresh:u,refreshUnreadCount:S,markRead:n,markAllRead:g,sendDesktop:h}}const ht={__name:"NotificationBell",setup(i,{expose:u}){u();const S=D(!1),n=D("all"),g=D(!1),{notifications:h,unreadCount:o,refresh:s,markRead:f,markAllRead:_}=re();function O(){P()}z(()=>{window.addEventListener("cc:open-notification-drawer",O)}),$(()=>{window.removeEventListener("cc:open-notification-drawer",O)});const M=v(()=>n.value==="unread"?h.value.filter(c=>!c.is_read):h.value);async function C(){if(U().isEmbedded){g.value=!0;try{await s({limit:100})}catch{}finally{g.value=!1}}}async function P(){S.value=!0,await C()}async function j(c){if(!c.is_read)try{await f(c.id)}catch{}}async function r(){try{await _()}catch(c){console.warn("[NotificationBell] markAllRead failed:",c?.message||c)}}function w(c){if(!c)return"";const b=typeof c=="string"?Date.parse(c):Number(c);if(!Number.isFinite(b))return String(c);const R=Date.now()-b,N=6e4,I=60*N,K=24*I;return R<N?"刚刚":R<I?`${Math.floor(R/N)} 分钟前`:R<K?`${Math.floor(R/I)} 小时前`:new Date(b).toLocaleDateString()}const A={visible:S,filter:n,loading:g,notifications:h,unreadCount:o,refresh:s,markRead:f,markAllRead:_,_onOpenEvent:O,filtered:M,refreshList:C,onOpen:P,onItemClick:j,onMarkAllRead:r,formatTime:w,ref:D,computed:v,onMounted:z,onUnmounted:$,get Empty(){return ke},get BellOutlined(){return de},get ReloadOutlined(){return _e},get useNotifications(){return re},get useShellMode(){return U}};return Object.defineProperty(A,"__isScriptSetup",{enumerable:!1,value:!0}),A}},bt={class:"notif-toolbar"},wt={class:"notif-body"},vt={key:2,class:"notif-list"},Lt=["onClick"],St={class:"notif-row"},Ct={class:"notif-title"},Et={class:"notif-time"},Tt={key:0,class:"notif-message"};function At(i,u,S,n,g,h){const o=k("a-badge"),s=k("a-tooltip"),f=k("a-radio-button"),_=k("a-radio-group"),O=k("a-space"),M=k("a-button"),C=k("a-empty"),P=k("a-spin"),j=k("a-drawer");return p(),L(F,null,[e(s,{title:"通知"},{default:t(()=>[e(o,{count:n.unreadCount,"overflow-count":99,offset:[-4,4]},{default:t(()=>[d("button",{type:"button",class:"notif-bell-btn","aria-label":"通知",onClick:n.onOpen},[e(n.BellOutlined)])]),_:1},8,["count"])]),_:1}),e(j,{open:n.visible,"onUpdate:open":u[1]||(u[1]=r=>n.visible=r),title:"通知中心",placement:"right",width:400,"body-style":{padding:0}},{default:t(()=>[d("div",bt,[e(O,null,{default:t(()=>[e(_,{value:n.filter,"onUpdate:value":u[0]||(u[0]=r=>n.filter=r),size:"small","button-style":"solid"},{default:t(()=>[e(f,{value:"all"},{default:t(()=>[l("全部 ("+a(n.notifications.length)+")",1)]),_:1}),e(f,{value:"unread"},{default:t(()=>[l("未读 ("+a(n.unreadCount)+")",1)]),_:1})]),_:1},8,["value"])]),_:1}),e(O,null,{default:t(()=>[e(M,{size:"small",loading:n.loading,onClick:n.refreshList},{icon:t(()=>[e(n.ReloadOutlined)]),_:1},8,["loading"]),e(M,{size:"small",disabled:n.unreadCount===0,onClick:n.onMarkAllRead},{default:t(()=>[...u[2]||(u[2]=[l(" 全部已读 ",-1)])]),_:1},8,["disabled"])]),_:1})]),d("div",wt,[!n.loading&&n.filtered.length===0?(p(),B(C,{key:0,description:"暂无通知",image:n.Empty.PRESENTED_IMAGE_SIMPLE,style:{padding:"60px 0"}},null,8,["image"])):n.loading?(p(),B(P,{key:1,style:{display:"block",padding:"60px"}})):(p(),L("ul",vt,[(p(!0),L(F,null,se(n.filtered,r=>(p(),L("li",{key:r.id,class:W(["notif-item",{unread:!r.is_read}]),onClick:w=>n.onItemClick(r)},[d("div",St,[d("div",Ct,a(r.title||r.message||"(无标题)"),1),d("span",Et,a(n.formatTime(r.created_at)),1)]),r.message&&r.title?(p(),L("div",Tt,a(r.message),1)):m("v-if",!0)],10,Lt))),128))]))])]),_:1},8,["open"])],64)}const Bt=Z(ht,[["render",At],["__scopeId","data-v-8c1554dd"],["__file","/tmp/cc-web-panel-pNtnyO/repo/packages/web-panel/src/components/NotificationBell.vue"]]),Mt={__name:"MobileBridgeHeaderStatus",setup(i,{expose:u}){u();function S(r){if(!r)return[];try{return JSON.parse(r)}catch{}const w=String(r).split(`
|
|
2
|
-
`),A=w.findIndex(c=>{const b=c.trim();if(!b)return!1;const R=b[0];if(R!=="["&&R!=="{")return!1;if(b.length===1)return!0;const N=b[1];return!(N>="A"&&N<="Z"||N>="a"&&N<="z")});if(A<0)return[];for(let c=w.length-1;c>=A;c--){const b=w[c].trim();if(/^[\]\}]/.test(b)&&!/^[\]\}][A-Za-z]/.test(b))try{return JSON.parse(w.slice(A,c+1).join(`
|
|
3
|
-
`))}catch{return[]}}return[]}const n=J(),g=H(),h=D([]);let o=null;const s=v(()=>h.value.length),f=v(()=>h.value.filter(r=>M(r)).length),_=v(()=>s.value===0?"var(--text-muted, #999)":"#52c41a"),O=v(()=>s.value===0?"尚未配对任何手机 — 点击进入配对":`已配对 ${s.value} 台手机 — 点击进入管理`);function M(r){if(!r)return!1;if(typeof r.online=="boolean")return r.online;const w=(r.status||"").toLowerCase();return w==="online"||w==="connected"||w==="active"||w==="paired"}async function C(){if(g.status==="connected")try{const{output:r}=await g.execute("p2p devices --type mobile --json",1e4);h.value=S(r)||[]}catch{}}function P(){n.push("/mobile-bridge")}z(()=>{C(),o=setInterval(C,5e3)}),ee(()=>{o&&(clearInterval(o),o=null)});const j={parseJsonOutput:S,router:n,ws:g,devices:h,get pollTimer(){return o},set pollTimer(r){o=r},totalCount:s,onlineCount:f,iconColor:_,tooltip:O,isOnline:M,refresh:C,onClick:P,ref:D,computed:v,onMounted:z,onBeforeUnmount:ee,get useRouter(){return J},get MobileOutlined(){return ue},get useWsStore(){return H}};return Object.defineProperty(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},Rt={key:0,class:"mbh-count"};function Dt(i,u,S,n,g,h){const o=k("a-badge"),s=k("a-tooltip");return p(),B(s,{title:n.tooltip},{default:t(()=>[e(o,{count:n.totalCount,"show-zero":!1,"overflow-count":9,offset:[-2,4]},{default:t(()=>[d("button",{type:"button",class:W(["mbh-btn",{"mbh-btn--active":n.totalCount>0}]),onClick:n.onClick},[e(n.MobileOutlined,{style:fe({color:n.iconColor,fontSize:"14px"})},null,8,["style"]),n.totalCount>0?(p(),L("span",Rt,a(n.totalCount),1)):m("v-if",!0)],2)]),_:1},8,["count"])]),_:1},8,["title"])}const Pt=Z(Mt,[["render",Dt],["__scopeId","data-v-e8ef01d6"],["__file","/tmp/cc-web-panel-pNtnyO/repo/packages/web-panel/src/components/MobileBridgeHeaderStatus.vue"]]),Y="cc.web-panel.sidebar.openKeys",jt={__name:"AppLayout",setup(i,{expose:u}){u();const S=J(),n=te(),g=H(),h=oe(),{t:o}=ie(),s=U(),f=D(!1),_=window.__CC_CONFIG__||{},O=v(()=>_.mode==="project"),M="v5.0.3.134",C=v(()=>h.current),P=v(()=>h.config.vars["--menu-mode"]),j=v(()=>{const y=n.name?.toLowerCase()||"dashboard";return[{mcptools:"mcp",quickask:"quick-ask",ukeysign:"ukey-sign"}[y]||y]}),r=["g-overview","g-config","g-data","g-advanced","g-enterprise","g-social","g-media","g-extension"];function w(){try{const y=localStorage.getItem(Y);if(y){const E=JSON.parse(y);if(Array.isArray(E))return E.filter(q=>r.includes(q))}}catch{}return[...r]}const A=D(w());ne(A,y=>{try{localStorage.setItem(Y,JSON.stringify(y))}catch{}},{deep:!0});const c=v(()=>g.status),b=v(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[g.status]||"default"),R=v(()=>{const y=`appLayout.footerStatus.${g.status}`,E=o(y);return E===y?o("appLayout.footerStatus.unknown"):E});function N(y){h.setTheme(y)}const{current:I,supported:K,setLocale:Q}=ae();function ce(){const y=K[(K.indexOf(I.value)+1)%K.length];Q(y)}async function X(y){try{const E=await g.sendRaw({type:"window.open",role:y},1e4);if(E?.ok===!1){V.error(`打开失败:${E.error||"未知"}`);return}const q=E?.result??E;q?.reason==="role_reserved"?V.warning("该窗口角色被保留"):q?.reason}catch(E){V.error(`打开桌面窗口失败:${E.message||E}`)}}async function ye(){le.confirm({title:"切换到桌面壳?",content:"回到 V5/V6 桌面壳。完整 electronAPI 表面(UKey 硬件 / 原生对话框 / 系统设置等)会重新可用,但失去 web-panel 的 SPA 体验。保存后需要重启应用才生效。",okText:"切换并重启",cancelText:"取消",centered:!0,async onOk(){try{const y=await g.sendRaw({type:"shell.switch",target:"desktop"},5e3);if(y?.ok===!1)throw new Error(y.error||"shell.switch returned failure");V.loading({content:"正在重启…",duration:0})}catch(y){const E=y instanceof Error?y.message:String(y);V.error("切换失败:"+E)}}})}function pe({key:y}){if(typeof y=="string"&&y.startsWith("desktop:")){X(y);return}S.push({mcp:"/mcp"}[y]||`/${y}`)}z(()=>g.connect());const x={router:S,route:n,ws:g,themeStore:h,t:o,shellMode:s,collapsed:f,cfg:_,isProject:O,PRODUCT_VERSION:M,currentTheme:C,menuTheme:P,selectedKeys:j,ALL_GROUP_KEYS:r,OPEN_KEYS_LS:Y,loadOpenKeys:w,openKeys:A,wsStatus:c,statusBadge:b,statusText:R,setTheme:N,locale:I,SUPPORTED_LOCALES:K,setLocale:Q,toggleLocale:ce,openDesktopWindow:X,switchToDesktopShell:ye,onMenuClick:pe,ref:D,computed:v,onMounted:z,watch:ne,get useRouter(){return J},get useRoute(){return te},get DashboardOutlined(){return _t},get MessageOutlined(){return gt},get RocketOutlined(){return kt},get AppstoreOutlined(){return mt},get ApiOutlined(){return ft},get FolderOutlined(){return pt},get GlobalOutlined(){return yt},get InfoCircleOutlined(){return ct},get ControlOutlined(){return ut},get FileTextOutlined(){return dt},get CloudServerOutlined(){return st},get BookOutlined(){return rt},get BranchesOutlined(){return lt},get ClockCircleOutlined(){return at},get ThunderboltOutlined(){return it},get ApartmentOutlined(){return ot},get SafetyCertificateOutlined(){return nt},get LockOutlined(){return tt},get WifiOutlined(){return et},get CodeOutlined(){return $e},get ProjectOutlined(){return xe},get WalletOutlined(){return Xe},get TeamOutlined(){return Qe},get BarChartOutlined(){return Ze},get BlockOutlined(){return Ye},get CloudUploadOutlined(){return Je},get ReadOutlined(){return qe},get KeyOutlined(){return He},get VideoCameraOutlined(){return Ge},get ShareAltOutlined(){return ze},get IdcardOutlined(){return We},get UsergroupAddOutlined(){return Ve},get ShoppingOutlined(){return Ke},get SwapOutlined(){return Ie},get AlertOutlined(){return Fe},get SafetyOutlined(){return Ue},get ExperimentOutlined(){return Ne},get DeploymentUnitOutlined(){return je},get BulbOutlined(){return Pe},get BankOutlined(){return De},get PartitionOutlined(){return Re},get AuditOutlined(){return Me},get FileSearchOutlined(){return Be},get TrophyOutlined(){return Ae},get FireOutlined(){return Te},get SearchOutlined(){return Ee},get NumberOutlined(){return Ce},get ClusterOutlined(){return Se},get SoundOutlined(){return Le},get DesktopOutlined(){return ve},get BellOutlined(){return de},get SyncOutlined(){return we},get MobileOutlined(){return ue},get DatabaseOutlined(){return be},get UnorderedListOutlined(){return he},get FileDoneOutlined(){return Oe},get message(){return V},get Modal(){return le},get useWsStore(){return H},get useThemeStore(){return oe},get THEMES(){return ge},get logoSrc(){return Ot},get useShellMode(){return U},get useI18n(){return ie},get useLocale(){return ae},NotificationBell:Bt,MobileBridgeHeaderStatus:Pt};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},Nt=["src"],Ut={key:0,class:"logo-text"},Ft={key:0,class:"mode-banner project"},It={class:"banner-info"},Kt={class:"banner-name"},Vt={class:"banner-sub"},Wt={key:1,class:"mode-banner global"},zt={class:"banner-name"},Gt=["title"],Ht={class:"group-label"},qt={class:"group-label"},Jt={class:"group-label"},Yt={class:"group-label"},Zt={class:"group-label"},Qt={class:"group-label"},Xt={class:"group-label"},xt={class:"group-label"},$t={class:"group-label"},en={key:0,class:"footer-text"},tn={class:"header-left"},nn={class:"header-right"},on={class:"theme-switcher"},an=["data-theme-key","onClick"],ln=["data-locale"],rn={class:"lang-switch-label"},sn={class:"version-tag"};function dn(i,u,S,n,g,h){const o=k("a-menu-item"),s=k("a-sub-menu"),f=k("a-menu-divider"),_=k("a-menu"),O=k("a-badge"),M=k("a-layout-sider"),C=k("a-tooltip"),P=k("a-tag"),j=k("a-layout-header"),r=k("router-view"),w=k("a-layout-content"),A=k("a-layout");return p(),B(A,{class:"app-root"},{default:t(()=>[m(" ── Sidebar ─────────────────────────────────────────────────── "),e(M,{collapsed:n.collapsed,"onUpdate:collapsed":u[2]||(u[2]=c=>n.collapsed=c),collapsible:"","collapsed-width":56,width:216,class:"sidebar"},{default:t(()=>[m(" Logo "),d("div",{class:W(["logo",{collapsed:n.collapsed}])},[d("img",{src:n.logoSrc,alt:"ChainlessChain",class:"logo-icon"},null,8,Nt),n.collapsed?m("v-if",!0):(p(),L("span",Ut,"ChainlessChain"))],2),m(" Mode banner "),n.collapsed?(p(),L("div",{key:1,class:"mode-icon-sm",title:n.isProject?n.cfg.projectName:i.$t("appLayout.scope.global")},[n.isProject?(p(),B(n.FolderOutlined,{key:0,style:{color:"#1677ff"}})):(p(),B(n.GlobalOutlined,{key:1,style:{color:"#722ed1"}}))],8,Gt)):(p(),L(F,{key:0},[n.isProject?(p(),L("div",Ft,[e(n.FolderOutlined,{class:"banner-icon"}),d("div",It,[d("div",Kt,a(n.cfg.projectName||i.$t("appLayout.scope.fallbackProject")),1),d("div",Vt,a(i.$t("appLayout.scope.projectPanel")),1)])])):(p(),L("div",Wt,[e(n.GlobalOutlined,{class:"banner-icon"}),d("span",zt,a(i.$t("appLayout.scope.global")),1)]))],64)),m(" Navigation "),e(_,{selectedKeys:n.selectedKeys,"onUpdate:selectedKeys":u[0]||(u[0]=c=>n.selectedKeys=c),openKeys:n.openKeys,"onUpdate:openKeys":u[1]||(u[1]=c=>n.openKeys=c),theme:n.menuTheme,mode:"inline","inline-collapsed":n.collapsed,class:"side-menu",onClick:n.onMenuClick},{default:t(()=>[n.collapsed?(p(),L(F,{key:1},[e(o,{key:"dashboard"},{icon:t(()=>[e(n.DashboardOutlined)]),_:1}),e(o,{key:"chat"},{icon:t(()=>[e(n.MessageOutlined)]),_:1}),e(o,{key:"quick-ask"},{icon:t(()=>[e(n.ThunderboltOutlined)]),_:1}),e(o,{key:"cowork"},{icon:t(()=>[e(n.RocketOutlined)]),_:1}),e(o,{key:"services"},{icon:t(()=>[e(n.ControlOutlined)]),_:1}),e(o,{key:"aiops"},{icon:t(()=>[e(n.AlertOutlined)]),_:1}),e(o,{key:"tokens"},{icon:t(()=>[e(n.NumberOutlined)]),_:1}),e(o,{key:"logs"},{icon:t(()=>[e(n.FileTextOutlined)]),_:1}),e(f,{class:"divider-sm"}),e(o,{key:"skills"},{icon:t(()=>[e(n.AppstoreOutlined)]),_:1}),e(o,{key:"providers"},{icon:t(()=>[e(n.ApiOutlined)]),_:1}),e(o,{key:"mcp"},{icon:t(()=>[e(n.CloudServerOutlined)]),_:1}),e(o,{key:"project-settings"},{icon:t(()=>[e(n.FolderOutlined)]),_:1}),e(o,{key:"speech-settings"},{icon:t(()=>[e(n.SoundOutlined)]),_:1}),e(o,{key:"notification-settings"},{icon:t(()=>[e(n.BellOutlined)]),_:1}),e(o,{key:"sync-settings"},{icon:t(()=>[e(n.SyncOutlined)]),_:1}),e(o,{key:"nlprog"},{icon:t(()=>[e(n.BulbOutlined)]),_:1}),e(o,{key:"codegen"},{icon:t(()=>[e(n.CodeOutlined)]),_:1}),e(f,{class:"divider-sm"}),e(o,{key:"notes"},{icon:t(()=>[e(n.BookOutlined)]),_:1}),e(o,{key:"search"},{icon:t(()=>[e(n.SearchOutlined)]),_:1}),e(o,{key:"memory"},{icon:t(()=>[e(n.BranchesOutlined)]),_:1}),e(o,{key:"knowledge"},{icon:t(()=>[e(n.ShareAltOutlined)]),_:1}),e(o,{key:"personal-data-hub"},{icon:t(()=>[e(n.DatabaseOutlined)]),_:1}),e(o,{key:"personal-data-hub/browser"},{icon:t(()=>[e(n.UnorderedListOutlined)]),_:1}),e(o,{key:"marketplace"},{icon:t(()=>[e(n.ShoppingOutlined)]),_:1}),e(o,{key:"cron"},{icon:t(()=>[e(n.ClockCircleOutlined)]),_:1}),e(o,{key:"workflow"},{icon:t(()=>[e(n.ApartmentOutlined)]),_:1}),e(o,{key:"pipeline"},{icon:t(()=>[e(n.PartitionOutlined)]),_:1}),e(o,{key:"tasks"},{icon:t(()=>[e(n.ThunderboltOutlined)]),_:1}),e(o,{key:"background-agents"},{icon:t(()=>[e(n.RocketOutlined)]),_:1}),e(o,{key:"artifacts"},{icon:t(()=>[e(n.FileDoneOutlined)]),_:1}),e(f,{class:"divider-sm"}),e(o,{key:"security"},{icon:t(()=>[e(n.SafetyCertificateOutlined)]),_:1}),e(o,{key:"ukey-sign"},{icon:t(()=>[e(n.KeyOutlined)]),_:1}),e(o,{key:"trust"},{icon:t(()=>[e(n.SafetyOutlined)]),_:1}),e(o,{key:"audit"},{icon:t(()=>[e(n.FileSearchOutlined)]),_:1}),e(o,{key:"mtc"},{icon:t(()=>[e(n.SafetyOutlined)]),_:1}),e(o,{key:"mtc-audit"},{icon:t(()=>[e(n.SafetyOutlined)]),_:1}),e(o,{key:"multisig"},{icon:t(()=>[e(n.TeamOutlined)]),_:1}),e(o,{key:"did"},{icon:t(()=>[e(n.IdcardOutlined)]),_:1}),e(o,{key:"permissions"},{icon:t(()=>[e(n.LockOutlined)]),_:1}),e(o,{key:"p2p"},{icon:t(()=>[e(n.WifiOutlined)]),_:1}),e(o,{key:"mobile-bridge"},{icon:t(()=>[e(n.MobileOutlined)]),_:1}),e(o,{key:"terminal"},{icon:t(()=>[e(n.DesktopOutlined)]),_:1}),e(o,{key:"backup"},{icon:t(()=>[e(n.CloudUploadOutlined)]),_:1}),e(o,{key:"git"},{icon:t(()=>[e(n.CodeOutlined)]),_:1}),e(o,{key:"projects"},{icon:t(()=>[e(n.ProjectOutlined)]),_:1}),e(o,{key:"crosschain"},{icon:t(()=>[e(n.SwapOutlined)]),_:1}),e(o,{key:"compliance"},{icon:t(()=>[e(n.SafetyOutlined)]),_:1}),e(o,{key:"privacy"},{icon:t(()=>[e(n.ExperimentOutlined)]),_:1}),e(o,{key:"inference"},{icon:t(()=>[e(n.DeploymentUnitOutlined)]),_:1}),e(o,{key:"federation"},{icon:t(()=>[e(n.ClusterOutlined)]),_:1}),e(f,{class:"divider-sm"}),e(o,{key:"wallet"},{icon:t(()=>[e(n.WalletOutlined)]),_:1}),e(o,{key:"organization"},{icon:t(()=>[e(n.TeamOutlined)]),_:1}),e(o,{key:"tenant"},{icon:t(()=>[e(n.BankOutlined)]),_:1}),e(o,{key:"sla"},{icon:t(()=>[e(n.DashboardOutlined)]),_:1}),e(o,{key:"analytics"},{icon:t(()=>[e(n.BarChartOutlined)]),_:1}),e(o,{key:"templates"},{icon:t(()=>[e(n.BlockOutlined)]),_:1}),e(f,{class:"divider-sm"}),e(o,{key:"community"},{icon:t(()=>[e(n.UsergroupAddOutlined)]),_:1}),e(o,{key:"governance"},{icon:t(()=>[e(n.AuditOutlined)]),_:1}),e(o,{key:"reputation"},{icon:t(()=>[e(n.TrophyOutlined)]),_:1}),e(o,{key:"recommend"},{icon:t(()=>[e(n.FireOutlined)]),_:1}),e(f,{class:"divider-sm"}),e(o,{key:"rssfeed"},{icon:t(()=>[e(n.ReadOutlined)]),_:1}),e(o,{key:"webauthn"},{icon:t(()=>[e(n.KeyOutlined)]),_:1}),n.shellMode.isEmbedded?(p(),L(F,{key:0},[e(f,{class:"divider-sm"}),e(o,{key:"desktop:hardware-wallet"},{icon:t(()=>[e(n.SafetyCertificateOutlined)]),_:1}),e(o,{key:"desktop:backup-dashboard"},{icon:t(()=>[e(n.CloudUploadOutlined)]),_:1}),e(o,{key:"desktop:llm-test-chat"},{icon:t(()=>[e(n.ExperimentOutlined)]),_:1}),e(o,{key:"desktop:settings"},{icon:t(()=>[e(n.ControlOutlined)]),_:1})],64)):m("v-if",!0)],64)):(p(),L(F,{key:0},[e(s,{key:"g-overview"},{title:t(()=>[d("span",Ht,a(i.$t("appLayout.groups.overview")),1)]),default:t(()=>[e(o,{key:"dashboard"},{icon:t(()=>[e(n.DashboardOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.dashboard")),1)]),_:1}),e(o,{key:"chat"},{icon:t(()=>[e(n.MessageOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.chat")),1)]),_:1}),e(o,{key:"quick-ask"},{icon:t(()=>[e(n.ThunderboltOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.quickAsk")),1)]),_:1}),e(o,{key:"cowork"},{icon:t(()=>[e(n.RocketOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.cowork")),1)]),_:1}),e(o,{key:"services"},{icon:t(()=>[e(n.ControlOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.services")),1)]),_:1}),e(o,{key:"aiops"},{icon:t(()=>[e(n.AlertOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.aiops")),1)]),_:1}),e(o,{key:"tokens"},{icon:t(()=>[e(n.NumberOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.tokens")),1)]),_:1}),e(o,{key:"logs"},{icon:t(()=>[e(n.FileTextOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.logs")),1)]),_:1})]),_:1}),e(s,{key:"g-config"},{title:t(()=>[d("span",qt,a(i.$t("appLayout.groups.config")),1)]),default:t(()=>[e(o,{key:"skills"},{icon:t(()=>[e(n.AppstoreOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.skills")),1)]),_:1}),e(o,{key:"providers"},{icon:t(()=>[e(n.ApiOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.providers")),1)]),_:1}),e(o,{key:"mcp"},{icon:t(()=>[e(n.CloudServerOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.mcp")),1)]),_:1}),e(o,{key:"project-settings"},{icon:t(()=>[e(n.FolderOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.projectSettings")),1)]),_:1}),e(o,{key:"speech-settings"},{icon:t(()=>[e(n.SoundOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.speechSettings")),1)]),_:1}),e(o,{key:"notification-settings"},{icon:t(()=>[e(n.BellOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.notificationSettings")),1)]),_:1}),e(o,{key:"sync-settings"},{icon:t(()=>[e(n.SyncOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.syncSettings")),1)]),_:1}),e(o,{key:"nlprog"},{icon:t(()=>[e(n.BulbOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.nlprog")),1)]),_:1}),e(o,{key:"codegen"},{icon:t(()=>[e(n.CodeOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.codegen")),1)]),_:1})]),_:1}),e(s,{key:"g-data"},{title:t(()=>[d("span",Jt,a(i.$t("appLayout.groups.data")),1)]),default:t(()=>[e(o,{key:"notes"},{icon:t(()=>[e(n.BookOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.notes")),1)]),_:1}),e(o,{key:"search"},{icon:t(()=>[e(n.SearchOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.search")),1)]),_:1}),e(o,{key:"memory"},{icon:t(()=>[e(n.BranchesOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.memory")),1)]),_:1}),e(o,{key:"knowledge"},{icon:t(()=>[e(n.ShareAltOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.knowledge")),1)]),_:1}),e(o,{key:"personal-data-hub"},{icon:t(()=>[e(n.DatabaseOutlined)]),default:t(()=>[u[3]||(u[3]=l("个人数据中台",-1))]),_:1}),e(o,{key:"personal-data-hub/browser"},{icon:t(()=>[e(n.UnorderedListOutlined)]),default:t(()=>[u[4]||(u[4]=l("数据浏览器",-1))]),_:1}),e(o,{key:"family-guard"},{icon:t(()=>[e(n.TeamOutlined)]),default:t(()=>[u[5]||(u[5]=l("家庭守护",-1))]),_:1}),e(o,{key:"marketplace"},{icon:t(()=>[e(n.ShoppingOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.marketplace")),1)]),_:1}),e(o,{key:"cron"},{icon:t(()=>[e(n.ClockCircleOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.cron")),1)]),_:1}),e(o,{key:"workflow"},{icon:t(()=>[e(n.ApartmentOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.workflow")),1)]),_:1}),e(o,{key:"pipeline"},{icon:t(()=>[e(n.PartitionOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.pipeline")),1)]),_:1}),e(o,{key:"tasks"},{icon:t(()=>[e(n.ThunderboltOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.tasks")),1)]),_:1}),e(o,{key:"background-agents"},{icon:t(()=>[e(n.RocketOutlined)]),default:t(()=>[u[6]||(u[6]=l("后台 Agent",-1))]),_:1}),e(o,{key:"artifacts"},{icon:t(()=>[e(n.FileDoneOutlined)]),default:t(()=>[u[7]||(u[7]=l("交付物",-1))]),_:1})]),_:1}),e(s,{key:"g-advanced"},{title:t(()=>[d("span",Yt,a(i.$t("appLayout.groups.advanced")),1)]),default:t(()=>[e(o,{key:"security"},{icon:t(()=>[e(n.SafetyCertificateOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.security")),1)]),_:1}),e(o,{key:"ukey-sign"},{icon:t(()=>[e(n.KeyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.ukeySign")),1)]),_:1}),e(o,{key:"trust"},{icon:t(()=>[e(n.SafetyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.trust")),1)]),_:1}),e(o,{key:"audit"},{icon:t(()=>[e(n.FileSearchOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.audit")),1)]),_:1}),e(o,{key:"mtc"},{icon:t(()=>[e(n.SafetyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.mtc")),1)]),_:1}),e(o,{key:"mtc-audit"},{icon:t(()=>[e(n.SafetyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.mtcAudit","MTC 审计")),1)]),_:1}),e(o,{key:"multisig"},{icon:t(()=>[e(n.TeamOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.multisig","M-of-N 多签")),1)]),_:1}),e(o,{key:"did"},{icon:t(()=>[e(n.IdcardOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.did")),1)]),_:1}),e(o,{key:"permissions"},{icon:t(()=>[e(n.LockOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.permissions")),1)]),_:1}),e(o,{key:"p2p"},{icon:t(()=>[e(n.WifiOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.p2p")),1)]),_:1}),e(o,{key:"mobile-bridge"},{icon:t(()=>[e(n.MobileOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.mobileBridge","移动桥")),1)]),_:1}),e(o,{key:"remote-session"},{icon:t(()=>[e(n.DesktopOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.remoteSession","远程会话")),1)]),_:1}),e(o,{key:"mobile-projects"},{icon:t(()=>[e(n.MobileOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.mobileProjects","手机项目 (v0.2)")),1)]),_:1}),e(o,{key:"terminal"},{icon:t(()=>[e(n.DesktopOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.terminal","远程终端")),1)]),_:1}),e(o,{key:"backup"},{icon:t(()=>[e(n.CloudUploadOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.backup")),1)]),_:1}),e(o,{key:"git"},{icon:t(()=>[e(n.CodeOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.git")),1)]),_:1}),e(o,{key:"projects"},{icon:t(()=>[e(n.ProjectOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.projects")),1)]),_:1}),e(o,{key:"crosschain"},{icon:t(()=>[e(n.SwapOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.crosschain")),1)]),_:1}),e(o,{key:"compliance"},{icon:t(()=>[e(n.SafetyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.compliance")),1)]),_:1}),e(o,{key:"privacy"},{icon:t(()=>[e(n.ExperimentOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.privacy")),1)]),_:1}),e(o,{key:"inference"},{icon:t(()=>[e(n.DeploymentUnitOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.inference")),1)]),_:1}),e(o,{key:"federation"},{icon:t(()=>[e(n.ClusterOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.federation")),1)]),_:1})]),_:1}),e(s,{key:"g-enterprise"},{title:t(()=>[d("span",Zt,a(i.$t("appLayout.groups.enterprise")),1)]),default:t(()=>[e(o,{key:"wallet"},{icon:t(()=>[e(n.WalletOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.wallet")),1)]),_:1}),e(o,{key:"organization"},{icon:t(()=>[e(n.TeamOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.organization")),1)]),_:1}),e(o,{key:"tenant"},{icon:t(()=>[e(n.BankOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.tenant")),1)]),_:1}),e(o,{key:"sla"},{icon:t(()=>[e(n.DashboardOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.sla")),1)]),_:1}),e(o,{key:"analytics"},{icon:t(()=>[e(n.BarChartOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.analytics")),1)]),_:1}),e(o,{key:"templates"},{icon:t(()=>[e(n.BlockOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.templates")),1)]),_:1})]),_:1}),e(s,{key:"g-social"},{title:t(()=>[d("span",Qt,a(i.$t("appLayout.groups.social")),1)]),default:t(()=>[e(o,{key:"community"},{icon:t(()=>[e(n.UsergroupAddOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.community")),1)]),_:1}),e(o,{key:"governance"},{icon:t(()=>[e(n.AuditOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.governance")),1)]),_:1}),e(o,{key:"reputation"},{icon:t(()=>[e(n.TrophyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.reputation")),1)]),_:1}),e(o,{key:"recommend"},{icon:t(()=>[e(n.FireOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.recommend")),1)]),_:1})]),_:1}),e(s,{key:"g-media"},{title:t(()=>[d("span",Xt,a(i.$t("appLayout.groups.media")),1)]),default:t(()=>[e(o,{key:"video"},{icon:t(()=>[e(n.VideoCameraOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.video")),1)]),_:1})]),_:1}),e(s,{key:"g-extension"},{title:t(()=>[d("span",xt,a(i.$t("appLayout.groups.extension")),1)]),default:t(()=>[e(o,{key:"rssfeed"},{icon:t(()=>[e(n.ReadOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.rssfeed")),1)]),_:1}),e(o,{key:"webauthn"},{icon:t(()=>[e(n.KeyOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.webauthn")),1)]),_:1})]),_:1}),m(` Desktop-only group — only shown in the embedded web-shell. Each
|
|
4
|
-
click opens a new BrowserWindow loading the V5/V6 desktop
|
|
5
|
-
renderer (full electronAPI / UKey / FS / settings live there). `),n.shellMode.isEmbedded?(p(),B(s,{key:"g-desktop"},{title:t(()=>[d("span",$t,a(i.$t("appLayout.groups.desktop")),1)]),default:t(()=>[e(o,{key:"desktop:hardware-wallet"},{icon:t(()=>[e(n.SafetyCertificateOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.desktopHardware")),1)]),_:1}),e(o,{key:"desktop:backup-dashboard"},{icon:t(()=>[e(n.CloudUploadOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.desktopBackup")),1)]),_:1}),e(o,{key:"desktop:llm-test-chat"},{icon:t(()=>[e(n.ExperimentOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.desktopLlmTest")),1)]),_:1}),e(o,{key:"desktop:settings"},{icon:t(()=>[e(n.ControlOutlined)]),default:t(()=>[l(a(i.$t("appLayout.items.desktopSettings")),1)]),_:1})]),_:1})):m("v-if",!0)],64))]),_:1},8,["selectedKeys","openKeys","theme","inline-collapsed"]),m(" Connection status "),d("div",{class:W(["sidebar-footer",{collapsed:n.collapsed}])},[e(O,{status:n.statusBadge},null,8,["status"]),n.collapsed?m("v-if",!0):(p(),L("span",en,a(n.statusText),1))],2)]),_:1},8,["collapsed"]),m(" ── Main area ───────────────────────────────────────────────── "),e(A,{class:"main-area"},{default:t(()=>[m(" Header "),e(j,{class:"app-header"},{default:t(()=>[d("div",tn,[d("div",{class:W(["scope-tag",n.isProject?"project":"global"])},[(p(),B(me(n.isProject?n.FolderOutlined:n.GlobalOutlined))),d("span",null,a(n.isProject?n.cfg.projectName||i.$t("appLayout.scope.fallbackProject"):i.$t("appLayout.scope.global")),1),n.isProject&&n.cfg.projectRoot?(p(),B(C,{key:0,title:n.cfg.projectRoot},{default:t(()=>[e(n.InfoCircleOutlined,{class:"info-icon"})]),_:1},8,["title"])):m("v-if",!0)],2)]),d("div",nn,[m(" Theme switcher "),d("div",on,[(p(!0),L(F,null,se(n.THEMES,(c,b)=>(p(),B(C,{key:b,title:c.label},{default:t(()=>[d("button",{class:W(["theme-btn",{active:n.currentTheme===b}]),"data-theme-key":b,onClick:R=>n.setTheme(b)},a(c.icon),11,an)]),_:2},1032,["title"]))),128))]),m(` Language switcher (incremental i18n; only owns its own
|
|
6
|
-
labels + ErrorBoundary + common.* today). `),e(C,{title:i.$t("language.label")},{default:t(()=>[d("button",{class:"lang-switch-btn","data-locale":n.locale,onClick:n.toggleLocale},[e(n.GlobalOutlined,{class:"lang-switch-icon"}),d("span",rn,a(i.$t("language.switch")),1)],8,ln)]),_:1},8,["title"]),m(" Mobile bridge status — pill showing online/total paired phones.\n Click to /mobile-bridge. Polls every 5s via `p2p devices` CLI. "),e(n.MobileBridgeHeaderStatus),m(` Notification bell — only meaningful in the embedded web-shell
|
|
7
|
-
where notification.* WS topics are registered. In pure-browser
|
|
8
|
-
mode the composable returns empty / no-op shapes, so the badge
|
|
9
|
-
just shows 0 and the drawer is empty. `),n.shellMode.isEmbedded?(p(),B(n.NotificationBell,{key:0})):m("v-if",!0),d("span",sn,a(n.PRODUCT_VERSION),1),m(" Phase 1.6 symmetric switch: only inside the embedded\n desktop shell does this make sense (no-op in `cc serve`\n browser mode where there's no V5/V6 to fall back to). "),n.shellMode.isEmbedded?(p(),B(C,{key:1,title:i.$t("appLayout.shellSwitch")},{default:t(()=>[d("button",{type:"button",class:"shell-switch-btn",onClick:n.switchToDesktopShell},[e(n.DesktopOutlined)])]),_:1},8,["title"])):m("v-if",!0),e(P,{color:n.wsStatus==="connected"?"green":n.wsStatus==="connecting"?"orange":"red",class:"ws-tag"},{default:t(()=>[l(a(n.wsStatus==="connected"?i.$t("appLayout.wsStatus.connected"):n.wsStatus==="connecting"?i.$t("appLayout.wsStatus.connecting"):i.$t("appLayout.wsStatus.disconnected")),1)]),_:1},8,["color"])])]),_:1}),m(" Content "),e(w,{class:"page-content"},{default:t(()=>[e(r)]),_:1})]),_:1})]),_:1})}const Pn=Z(jt,[["render",dn],["__scopeId","data-v-6f6437fc"],["__file","/tmp/cc-web-panel-pNtnyO/repo/packages/web-panel/src/components/AppLayout.vue"]]);export{Pn as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as v,P as u,J as y,U as s,R as a,S,K as C,Q as x,V as w,_ as B,b as n}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-CQftlZn-.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=n(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=n(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=n(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=n(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=n(()=>{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"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:n};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=v("a-tag");return u(),y("div",{class:B(["chat-row",{mine:r.isMine}])},[s("div",T,[s("div",M,[s("span",O,a(r.actorLabel),1),s("span",R,a(r.formattedTime),1)]),s("div",V,a(r.messageText),1),t.event.source.adapter?(u(),S(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 A=k(N,[["render",q],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-pNtnyO/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{E as G,r as E,I as k,J as v,U as l,R as a,c as s,K as o,S as z,V as $,N as q,o as U,x as V,b as w,P as u,Q as f,$ as M,F as T,Z as F}from"./vendor-Bn1JzzAn.js";import{u as A,t as W,_ as J}from"./index-CQftlZn-.js";import{u as B}from"./chat-B3stH01u.js";import{ae as K,af as Q,a5 as Z,h as X,a8 as Y,ac as x,aa as ee,ag as te,a9 as se,R as oe}from"./icons-DG5UD-6K.js";function ae(e){return W(e)}function le(){return{samples:0,compressedSamples:0,hitRate:0,totalSavedTokens:0,averageSavedTokens:0,totalOriginalTokens:0,totalCompressedTokens:0,netSavingsRate:0,variantDistribution:{},strategyDistribution:[],providerDistribution:[],modelDistribution:[]}}const H=G("dashboard",()=>{const e=E(!1),n=E(!1),m=E({wsStatus:"disconnected",activeLlm:null,activeModel:null,skillCount:0,sessionCount:0,providerCount:0,appRunning:!1,setupDone:!1,edition:"",mcpCount:null,noteCount:null}),t=E(""),O=E(le()),h=E({windowPreset:"all",provider:"",model:""});let b=null;function S(i=A()){b||(b=i.onRuntimeEvent(c=>{c.type==="compression:summary"?P(c.payload?.summary||{}):c.type==="session:start"?m.value.sessionCount=(m.value.sessionCount||0)+1:c.type==="session:end"&&(m.value.sessionCount=Math.max(0,(m.value.sessionCount||0)-1))}))}function y(){b&&(b(),b=null)}function P(i){O.value={...O.value,...i||{}}}function d(i){return i==="1h"?3600*1e3:i==="24h"?1440*60*1e3:i==="7d"?10080*60*1e3:null}function _(i){m.value.appRunning=i.includes("Desktop app running"),m.value.setupDone=i.includes("Setup completed");const c=i.match(/Edition:\s+(\S+)/i);c&&(m.value.edition=c[1]);const g=i.match(/LLM:\s+(\S+)\s+\(([^)]+)\)/i);if(g)m.value.activeLlm=g[1],m.value.activeModel=g[2];else{const r=i.match(/LLM:\s+(\S+)/i);r&&(m.value.activeLlm=r[1])}}async function D(){const i=A();S(i),n.value=!0;const c={type:"compression-stats",windowMs:d(h.value.windowPreset)};h.value.provider&&(c.provider=h.value.provider),h.value.model&&(c.model=h.value.model);try{const g=await i.sendRaw(c,1e4);P(g.summary||{})}catch{}finally{n.value=!1}}async function p(){const i=A();S(i),e.value=!0,m.value.wsStatus=i.status,t.value="";try{const[c,g]=await Promise.allSettled([i.execute("status",15e3),i.listSessions()]);if(c.status==="fulfilled"){const r=c.value.output;t.value=r.split(`
|
|
2
|
-
`).slice(0,20).join(`
|
|
3
|
-
`),_(r)}g.status==="fulfilled"&&(m.value.sessionCount=g.value.length),Promise.allSettled([i.execute("skill sources --json",15e3),i.execute("llm providers",15e3)]).then(([r,C])=>{if(r.status==="fulfilled"){const R=ae(r.value.output);Array.isArray(R)&&(m.value.skillCount=R.reduce((j,L)=>j+(typeof L?.count=="number"?L.count:0),0))}if(C.status==="fulfilled"){const j=C.value.output.match(/active[:\s]+(\S+)/i);j&&!m.value.activeLlm&&(m.value.activeLlm=j[1])}}),i.sendRaw({type:"mcp.list_tools"},5e3).then(r=>{const R=(r?.result??r)?.servers;m.value.mcpCount=Array.isArray(R)?R.length:0}).catch(()=>{m.value.mcpCount=0}),await D()}catch{}finally{e.value=!1}}return{loading:e,compressionLoading:n,stats:m,statusLog:t,compression:O,telemetryFilters:h,ensureRuntimeSubscription:S,stopRuntimeSubscription:y,refresh:p,refreshCompression:D,applyCompressionSummary:P,toWindowMs:d}}),re={__name:"Dashboard",setup(e,{expose:n}){n();const m=q(),t=A(),O=B(),h=H(),b=window.__CC_CONFIG__||{},S=w(()=>b.mode==="project"),y="v5.0.3.134",P=w(()=>t.status),d=w(()=>h.loading),_=w(()=>h.statusLog),D=w(()=>h.telemetryFilters),p=w(()=>h.compression),i=w(()=>h.stats),c=w(()=>Object.entries(p.value.variantDistribution||{})),g=w(()=>p.value.providerDistribution||[]),r=w(()=>p.value.modelDistribution||[]);async function C(){await h.refresh()}async function R(){await h.refreshCompression()}function j(I){return`${((I||0)*100).toFixed(1)}%`}async function L(){await O.createSession("agent"),m.push("/chat")}U(()=>{h.ensureRuntimeSubscription(t),setTimeout(C,300)}),V(()=>{h.stopRuntimeSubscription()});const N={router:m,ws:t,chatStore:O,dashboardStore:h,cfg:b,isProject:S,PRODUCT_VERSION:y,wsStatus:P,loading:d,statusLog:_,telemetryFilters:D,compression:p,stats:i,variantEntries:c,providerEntries:g,modelEntries:r,refresh:C,refreshCompression:R,formatPercent:j,newAgentSession:L,computed:w,onMounted:U,onUnmounted:V,get useRouter(){return q},get ReloadOutlined(){return oe},get ApiOutlined(){return se},get RobotOutlined(){return te},get AppstoreOutlined(){return ee},get MessageOutlined(){return x},get FolderOutlined(){return Y},get DesktopOutlined(){return X},get FileTextOutlined(){return Z},get ToolOutlined(){return Q},get SettingOutlined(){return K},get useWsStore(){return A},get useChatStore(){return B},get useDashboardStore(){return H}};return Object.defineProperty(N,"__isScriptSetup",{enumerable:!1,value:!0}),N}},ne={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"20px"}},ie={class:"page-title"},de={class:"page-sub"},ce={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},ue={style:{color:"#91caff","font-weight":"600"}},me={style:{color:"#4a6fa5","font-size":"11px","font-family":"monospace"}},ve={class:"stat-header"},fe={class:"stat-label"},he={class:"stat-sub"},be={class:"stat-header"},ye={class:"stat-label"},pe={class:"stat-value",style:{color:"#91caff","font-size":"15px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},_e={class:"stat-sub",style:{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}},ge={class:"stat-header"},ke={class:"stat-label"},we={class:"stat-value",style:{color:"#1677ff"}},Se={class:"stat-sub"},Ce={class:"stat-header"},Re={class:"stat-label"},Oe={class:"stat-value",style:{color:"#c084fc"}},Pe={class:"stat-sub"},De={class:"stat-header"},je={class:"stat-label"},Ee={class:"stat-sub"},Te={class:"stat-header"},Fe={class:"stat-label"},ze={class:"stat-value",style:{color:"#13c2c2"}},Ae={class:"stat-sub"},Le={class:"stat-header"},$e={class:"stat-label"},Me={class:"stat-value",style:{color:"#faad14"}},Ne={class:"stat-sub"},qe={class:"status-log"},Ue={class:"telemetry-filter"},Ve={class:"telemetry-filter-label"},Be={class:"telemetry-filter"},He={class:"telemetry-filter-label"},Ie={class:"telemetry-filter"},Ge={class:"telemetry-filter-label"},We={class:"telemetry-card"},Je={class:"telemetry-label"},Ke={class:"telemetry-value"},Qe={class:"telemetry-sub"},Ze={class:"telemetry-card"},Xe={class:"telemetry-label"},Ye={class:"telemetry-value"},xe={class:"telemetry-sub"},et={class:"telemetry-card"},tt={class:"telemetry-label"},st={class:"telemetry-value"},ot={class:"telemetry-sub"},at={class:"telemetry-section"},lt={class:"telemetry-section-title"},rt={key:0,class:"telemetry-empty"},nt={key:1,class:"telemetry-list"},it={class:"telemetry-section"},dt={class:"telemetry-section-title"},ct={key:0,class:"telemetry-empty"},ut={key:1,class:"telemetry-list"},mt={class:"telemetry-section"},vt={class:"telemetry-section-title"},ft={key:0,class:"telemetry-empty"},ht={key:1,class:"telemetry-list"},bt={class:"telemetry-section"},yt={class:"telemetry-section-title"},pt={key:0,class:"telemetry-empty"},_t={key:1,class:"telemetry-list"},gt={style:{color:"#91caff"}},kt={style:{color:"var(--text-muted)","font-family":"monospace","font-size":"11px"}},wt={style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},St={style:{color:"var(--text-muted)"}};function Ct(e,n,m,t,O,h){const b=k("a-button"),S=k("a-tag"),y=k("a-card"),P=k("a-badge"),d=k("a-col"),_=k("a-row"),D=k("a-space"),p=k("a-select-option"),i=k("a-select"),c=k("a-descriptions-item"),g=k("a-descriptions");return u(),v("div",null,[l("div",ne,[l("div",null,[l("h2",ie,a(e.$t("dashboard.title")),1),l("p",de,a(t.isProject?e.$t("dashboard.subProject",{name:t.cfg.projectName||e.$t("dashboard.unnamedProject")}):e.$t("dashboard.subGlobal")),1)]),s(b,{type:"primary",ghost:"",loading:t.loading,onClick:t.refresh},{icon:o(()=>[s(t.ReloadOutlined)]),default:o(()=>[f(" "+a(e.$t("dashboard.refresh")),1)]),_:1},8,["loading"])]),t.isProject?(u(),z(y,{key:0,style:{background:"rgba(22,119,255,.08)","border-color":"rgba(22,119,255,.25)","margin-bottom":"16px"},size:"small"},{default:o(()=>[l("div",ce,[s(t.FolderOutlined,{style:{color:"#1677ff","font-size":"18px"}}),l("div",null,[l("div",ue,a(t.cfg.projectName||e.$t("dashboard.projectBanner.fallbackName")),1),l("div",me,a(t.cfg.projectRoot),1)]),s(S,{color:"blue",style:{"margin-left":"auto"}},{default:o(()=>[f(a(e.$t("dashboard.projectBanner.tag")),1)]),_:1})])]),_:1})):$("v-if",!0),s(_,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:o(()=>[s(d,{xs:24,sm:12,lg:6},{default:o(()=>[s(y,{class:"stat-card gateway-card",size:"small"},{default:o(()=>[l("div",ve,[l("span",fe,a(e.$t("dashboard.stats.wsGateway")),1),s(P,{status:t.wsStatus==="connected"?"success":"error"},null,8,["status"])]),l("div",{class:"stat-value",style:M({color:t.wsStatus==="connected"?"#52c41a":"#888"})},a(t.wsStatus==="connected"?e.$t("dashboard.stats.wsRunning"):e.$t("dashboard.stats.wsDisconnected")),5),l("div",he,a(e.$t("dashboard.stats.wsPortLine",{port:t.cfg.wsPort||18800,host:t.cfg.wsHost||"127.0.0.1"})),1)]),_:1})]),_:1}),s(d,{xs:24,sm:12,lg:6},{default:o(()=>[s(y,{class:"stat-card",size:"small"},{default:o(()=>[l("div",be,[l("span",ye,a(e.$t("dashboard.stats.currentLlm")),1),s(t.RobotOutlined,{style:{color:"#1677ff"}})]),l("div",pe,a(t.stats.activeLlm||e.$t("dashboard.stats.llmUnconfigured")),1),l("div",_e,a(t.stats.activeModel||"—"),1)]),_:1})]),_:1}),s(d,{xs:24,sm:12,lg:6},{default:o(()=>[s(y,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:n[0]||(n[0]=r=>e.$router.push("/skills"))},{default:o(()=>[l("div",ge,[l("span",ke,a(e.$t("dashboard.stats.skills")),1),s(t.AppstoreOutlined,{style:{color:"#1677ff"}})]),l("div",we,a(t.stats.skillCount||"—"),1),l("div",Se,a(e.$t("dashboard.stats.skillsHint")),1)]),_:1})]),_:1}),s(d,{xs:24,sm:12,lg:6},{default:o(()=>[s(y,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:n[1]||(n[1]=r=>e.$router.push("/chat"))},{default:o(()=>[l("div",Ce,[l("span",Re,a(e.$t("dashboard.stats.sessions")),1),s(t.MessageOutlined,{style:{color:"#722ed1"}})]),l("div",Oe,a(t.stats.sessionCount),1),l("div",Pe,a(e.$t("dashboard.stats.sessionsHint")),1)]),_:1})]),_:1})]),_:1}),s(_,{gutter:[12,12],style:{"margin-bottom":"16px"}},{default:o(()=>[s(d,{xs:24,sm:8},{default:o(()=>[s(y,{class:"stat-card",size:"small"},{default:o(()=>[l("div",De,[l("span",je,a(e.$t("dashboard.stats.appStatus")),1),s(t.DesktopOutlined,{style:M({color:t.stats.appRunning?"#52c41a":"#888"})},null,8,["style"])]),l("div",{class:"stat-value",style:M({color:t.stats.appRunning?"#52c41a":"#888",fontSize:"15px"})},a(t.stats.appRunning?e.$t("dashboard.stats.appRunning"):t.stats.setupDone?e.$t("dashboard.stats.appReady"):e.$t("dashboard.stats.appNotStarted")),5),l("div",Ee,a(e.$t("dashboard.stats.edition",{name:t.stats.edition||"Community"})),1)]),_:1})]),_:1}),s(d,{xs:24,sm:8},{default:o(()=>[s(y,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:n[2]||(n[2]=r=>e.$router.push("/mcp"))},{default:o(()=>[l("div",Te,[l("span",Fe,a(e.$t("dashboard.stats.mcp")),1),s(t.ToolOutlined,{style:{color:"#13c2c2"}})]),l("div",ze,a(t.stats.mcpCount??"—"),1),l("div",Ae,a(e.$t("dashboard.stats.mcpHint")),1)]),_:1})]),_:1}),s(d,{xs:24,sm:8},{default:o(()=>[s(y,{class:"stat-card",size:"small",style:{cursor:"pointer"},onClick:n[3]||(n[3]=r=>e.$router.push("/notes"))},{default:o(()=>[l("div",Le,[l("span",$e,a(e.$t("dashboard.stats.notes")),1),s(t.FileTextOutlined,{style:{color:"#faad14"}})]),l("div",Me,a(t.stats.noteCount??"—"),1),l("div",Ne,a(e.$t("dashboard.stats.notesHint")),1)]),_:1})]),_:1})]),_:1}),s(_,{gutter:[16,16]},{default:o(()=>[s(d,{xs:24,lg:10},{default:o(()=>[s(y,{title:e.$t("dashboard.quick.title"),style:{background:"var(--bg-card)","border-color":"var(--border-color)",height:"100%"}},{default:o(()=>[s(D,{direction:"vertical",style:{width:"100%"},size:"middle"},{default:o(()=>[s(b,{type:"primary",block:"",onClick:n[4]||(n[4]=r=>e.$router.push("/chat"))},{icon:o(()=>[s(t.MessageOutlined)]),default:o(()=>[f(" "+a(t.isProject?e.$t("dashboard.quick.enterProjectChat"):e.$t("dashboard.quick.newAiChat")),1)]),_:1}),s(b,{block:"",onClick:t.newAgentSession,style:{background:"rgba(114,46,209,.12)","border-color":"#722ed1",color:"#722ed1"}},{icon:o(()=>[s(t.RobotOutlined)]),default:o(()=>[f(" "+a(e.$t("dashboard.quick.startAgent")),1)]),_:1}),s(_,{gutter:8},{default:o(()=>[s(d,{span:12},{default:o(()=>[s(b,{block:"",onClick:n[5]||(n[5]=r=>e.$router.push("/services")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[s(t.SettingOutlined)]),default:o(()=>[f(" "+a(e.$t("dashboard.quick.services")),1)]),_:1})]),_:1}),s(d,{span:12},{default:o(()=>[s(b,{block:"",onClick:n[6]||(n[6]=r=>e.$router.push("/logs")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[s(t.FileTextOutlined)]),default:o(()=>[f(" "+a(e.$t("dashboard.quick.logs")),1)]),_:1})]),_:1})]),_:1}),s(_,{gutter:8},{default:o(()=>[s(d,{span:12},{default:o(()=>[s(b,{block:"",onClick:n[7]||(n[7]=r=>e.$router.push("/skills")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[s(t.AppstoreOutlined)]),default:o(()=>[f(" "+a(e.$t("dashboard.quick.skills")),1)]),_:1})]),_:1}),s(d,{span:12},{default:o(()=>[s(b,{block:"",onClick:n[8]||(n[8]=r=>e.$router.push("/providers")),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[s(t.ApiOutlined)]),default:o(()=>[f(" "+a(e.$t("dashboard.quick.providers")),1)]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["title"])]),_:1}),s(d,{xs:24,lg:14},{default:o(()=>[s(y,{title:e.$t("dashboard.status.title"),style:{background:"var(--bg-card)","border-color":"var(--border-color)"},loading:t.loading},{extra:o(()=>[s(b,{type:"link",size:"small",onClick:n[9]||(n[9]=r=>e.$router.push("/logs"))},{default:o(()=>[f(a(e.$t("dashboard.status.more")),1)]),_:1})]),default:o(()=>[l("pre",qe,a(t.statusLog||e.$t("dashboard.status.placeholder")),1)]),_:1},8,["title","loading"])]),_:1})]),_:1}),s(y,{title:e.$t("dashboard.telemetry.title"),style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"},loading:t.loading},{default:o(()=>[s(_,{gutter:[12,12],style:{"margin-bottom":"12px"}},{default:o(()=>[s(d,{xs:24,md:8},{default:o(()=>[l("div",Ue,[l("div",Ve,a(e.$t("dashboard.telemetry.filterWindow")),1),s(i,{value:t.telemetryFilters.windowPreset,"onUpdate:value":n[10]||(n[10]=r=>t.telemetryFilters.windowPreset=r),style:{width:"100%"},onChange:t.refreshCompression},{default:o(()=>[s(p,{value:"all"},{default:o(()=>[f(a(e.$t("dashboard.telemetry.windowAll")),1)]),_:1}),s(p,{value:"1h"},{default:o(()=>[f(a(e.$t("dashboard.telemetry.window1h")),1)]),_:1}),s(p,{value:"24h"},{default:o(()=>[f(a(e.$t("dashboard.telemetry.window24h")),1)]),_:1}),s(p,{value:"7d"},{default:o(()=>[f(a(e.$t("dashboard.telemetry.window7d")),1)]),_:1})]),_:1},8,["value"])])]),_:1}),s(d,{xs:24,md:8},{default:o(()=>[l("div",Be,[l("div",He,a(e.$t("dashboard.telemetry.filterProvider")),1),s(i,{value:t.telemetryFilters.provider,"onUpdate:value":n[11]||(n[11]=r=>t.telemetryFilters.provider=r),style:{width:"100%"},onChange:t.refreshCompression},{default:o(()=>[s(p,{value:""},{default:o(()=>[f(a(e.$t("dashboard.telemetry.providerAll")),1)]),_:1}),(u(!0),v(T,null,F(t.providerEntries,r=>(u(),z(p,{key:r.key,value:r.key},{default:o(()=>[f(a(r.key),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1}),s(d,{xs:24,md:8},{default:o(()=>[l("div",Ie,[l("div",Ge,a(e.$t("dashboard.telemetry.filterModel")),1),s(i,{value:t.telemetryFilters.model,"onUpdate:value":n[12]||(n[12]=r=>t.telemetryFilters.model=r),style:{width:"100%"},onChange:t.refreshCompression},{default:o(()=>[s(p,{value:""},{default:o(()=>[f(a(e.$t("dashboard.telemetry.modelAll")),1)]),_:1}),(u(!0),v(T,null,F(t.modelEntries,r=>(u(),z(p,{key:r.key,value:r.key},{default:o(()=>[f(a(r.key),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])])]),_:1})]),_:1}),s(_,{gutter:[12,12]},{default:o(()=>[s(d,{xs:24,sm:8},{default:o(()=>[l("div",We,[l("div",Je,a(e.$t("dashboard.telemetry.hitRate")),1),l("div",Ke,a(t.formatPercent(t.compression.hitRate)),1),l("div",Qe,a(e.$t("dashboard.telemetry.hitRateSub",{compressed:t.compression.compressedSamples,total:t.compression.samples})),1)])]),_:1}),s(d,{xs:24,sm:8},{default:o(()=>[l("div",Ze,[l("div",Xe,a(e.$t("dashboard.telemetry.savedTokens")),1),l("div",Ye,a(t.compression.totalSavedTokens),1),l("div",xe,a(e.$t("dashboard.telemetry.savedTokensSub",{avg:t.compression.averageSavedTokens})),1)])]),_:1}),s(d,{xs:24,sm:8},{default:o(()=>[l("div",et,[l("div",tt,a(e.$t("dashboard.telemetry.netSavingsRate")),1),l("div",st,a(t.formatPercent(t.compression.netSavingsRate)),1),l("div",ot,a(e.$t("dashboard.telemetry.netSavingsRateSub",{original:t.compression.totalOriginalTokens,compressed:t.compression.totalCompressedTokens})),1)])]),_:1})]),_:1}),s(_,{gutter:[16,16],style:{"margin-top":"12px"}},{default:o(()=>[s(d,{xs:24,lg:12},{default:o(()=>[l("div",at,[l("div",lt,a(e.$t("dashboard.telemetry.strategyDistribution")),1),t.compression.strategyDistribution.length===0?(u(),v("div",rt,a(e.$t("dashboard.telemetry.strategyEmpty")),1)):(u(),v("div",nt,[(u(!0),v(T,null,F(t.compression.strategyDistribution.slice(0,6),r=>(u(),v("div",{key:r.strategy,class:"telemetry-row"},[l("span",null,a(r.strategy),1),l("span",null,a(e.$t("dashboard.telemetry.strategyRow",{hits:r.hits,rate:t.formatPercent(r.hitRate)})),1)]))),128))]))])]),_:1}),s(d,{xs:24,lg:12},{default:o(()=>[l("div",it,[l("div",dt,a(e.$t("dashboard.telemetry.variantDistribution")),1),t.variantEntries.length===0?(u(),v("div",ct,a(e.$t("dashboard.telemetry.variantEmpty")),1)):(u(),v("div",ut,[(u(!0),v(T,null,F(t.variantEntries,([r,C])=>(u(),v("div",{key:r,class:"telemetry-row"},[l("span",null,a(r),1),l("span",null,a(e.$t("dashboard.telemetry.variantRow",{count:C})),1)]))),128))]))])]),_:1})]),_:1}),s(_,{gutter:[16,16],style:{"margin-top":"12px"}},{default:o(()=>[s(d,{xs:24,lg:12},{default:o(()=>[l("div",mt,[l("div",vt,a(e.$t("dashboard.telemetry.providerSlice")),1),t.providerEntries.length===0?(u(),v("div",ft,a(e.$t("dashboard.telemetry.providerEmpty")),1)):(u(),v("div",ht,[(u(!0),v(T,null,F(t.providerEntries.slice(0,6),r=>(u(),v("div",{key:r.key,class:"telemetry-row"},[l("span",null,a(r.key),1),l("span",null,a(e.$t("dashboard.telemetry.providerRow",{samples:r.samples,rate:t.formatPercent(r.hitRate)})),1)]))),128))]))])]),_:1}),s(d,{xs:24,lg:12},{default:o(()=>[l("div",bt,[l("div",yt,a(e.$t("dashboard.telemetry.modelSlice")),1),t.modelEntries.length===0?(u(),v("div",pt,a(e.$t("dashboard.telemetry.modelEmpty")),1)):(u(),v("div",_t,[(u(!0),v(T,null,F(t.modelEntries.slice(0,6),r=>(u(),v("div",{key:r.key,class:"telemetry-row"},[l("span",null,a(r.key),1),l("span",null,a(e.$t("dashboard.telemetry.modelRow",{samples:r.samples,saved:r.savedTokens})),1)]))),128))]))])]),_:1})]),_:1})]),_:1},8,["title","loading"]),s(y,{title:e.$t("dashboard.info.title"),style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{default:o(()=>[s(g,{column:{xs:1,sm:2,lg:3},size:"small"},{default:o(()=>[s(c,{label:e.$t("dashboard.info.panelMode")},{default:o(()=>[s(S,{color:t.isProject?"blue":"purple"},{default:o(()=>[f(a(t.isProject?e.$t("dashboard.info.modeProject"):e.$t("dashboard.info.modeGlobal")),1)]),_:1},8,["color"])]),_:1},8,["label"]),t.isProject?(u(),z(c,{key:0,label:e.$t("dashboard.info.projectName")},{default:o(()=>[l("span",gt,a(t.cfg.projectName||"—"),1)]),_:1},8,["label"])):$("v-if",!0),t.isProject?(u(),z(c,{key:1,label:e.$t("dashboard.info.projectPath")},{default:o(()=>[l("span",kt,a(t.cfg.projectRoot),1)]),_:1},8,["label"])):$("v-if",!0),s(c,{label:e.$t("dashboard.info.websocket")},{default:o(()=>[l("span",wt," ws://"+a(t.cfg.wsHost||"127.0.0.1")+":"+a(t.cfg.wsPort||18800),1)]),_:1},8,["label"]),s(c,{label:e.$t("dashboard.info.auth")},{default:o(()=>[s(S,{color:t.cfg.wsToken?"green":"default",style:{"font-size":"11px"}},{default:o(()=>[f(a(t.cfg.wsToken?e.$t("dashboard.info.authEnabled"):e.$t("dashboard.info.authDisabled")),1)]),_:1},8,["color"])]),_:1},8,["label"]),s(c,{label:e.$t("dashboard.info.version")},{default:o(()=>[l("span",St,a(t.PRODUCT_VERSION),1)]),_:1},8,["label"])]),_:1})]),_:1},8,["title"])])}const jt=J(re,[["render",Ct],["__scopeId","data-v-7f773d42"],["__file","/tmp/cc-web-panel-pNtnyO/repo/packages/web-panel/src/views/Dashboard.vue"]]);export{jt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as G,r as k,I as m,J as F,U as d,c as i,K as l,V as u,S,F as R,Z as q,o as I,a as A,P as g,Q as x,R as C,_ as E}from"./vendor-Bn1JzzAn.js";import{u as M,_ as H,d as _}from"./index-CQftlZn-.js";import{a as D,b as W,c as j}from"./parsers-UEvh_ShA.js";import{R as J}from"./icons-DG5UD-6K.js";const B=G("providers",()=>{const K=k(!1),o=k(null),v=k([]),e=k([]),w=k(null);async function U(){const s=M();K.value=!0;try{const{output:f}=await s.execute("llm providers",15e3);v.value=D(f);const p=v.value.find(h=>h.active);p&&(w.value=p.name);const{output:b}=await s.execute("llm models",15e3);e.value=W(b)}catch(f){console.error("Failed to load providers:",f)}finally{K.value=!1}}async function y(s){await M().execute(`llm switch ${s}`,1e4),v.value.forEach(p=>p.active=p.name===s),w.value=s}async function a(s){const f=M();o.value=s;try{const{output:p,exitCode:b}=await f.execute("llm test",3e4),h=v.value.find(L=>L.name===s);return h&&(h.status=b===0?"ok":"error"),b===0}catch{const p=v.value.find(b=>b.name===s);return p&&(p.status="error"),!1}finally{o.value=null}}return{loading:K,testing:o,providers:v,localModels:e,activeProvider:w,loadProviders:U,switchProvider:y,testProvider:a}}),Q={__name:"Providers",setup(K,{expose:o}){o();const v=B(),e=M(),w=k(!1),U=k(!1),y=k(!1),a=A({provider:void 0,model:"",apiKey:"",baseUrl:"",temperature:.7,maxTokens:4096});let s={};const f=["ollama","openai","anthropic","volcengine","deepseek","gemini","groq","mistral","custom","zhipu"],p={ollama:"Ollama(本地)",openai:"OpenAI",anthropic:"Anthropic",volcengine:"火山引擎(豆包)",deepseek:"DeepSeek",gemini:"Google Gemini",groq:"Groq",mistral:"Mistral",custom:"Custom(自定义)",zhipu:"智谱 AI"},b=f.map(n=>({value:n,label:p[n]||n}));async function h(n){try{await v.switchProvider(n),_.success(`已切换到 ${n}`)}catch(t){_.error(`切换失败: ${t.message}`)}}async function L(n){await v.testProvider(n)?_.success(`${n} 连接正常`):_.warning(`${n} 连接失败,请检查配置`)}async function z(){w.value=!0;try{const{output:n}=await e.execute("config list",15e3),t=j(n);t.provider&&(a.provider=t.provider),t.model&&(a.model=t.model),t.apiKey&&(a.apiKey=t.apiKey),t.baseUrl&&(a.baseUrl=t.baseUrl),t.temperature!==void 0&&(a.temperature=t.temperature),t.maxTokens!==void 0&&(a.maxTokens=t.maxTokens),s={provider:t.provider??"",model:t.model??"",apiKey:t.apiKey??"",baseUrl:t.baseUrl??"",temperature:t.temperature??a.temperature,maxTokens:t.maxTokens??a.maxTokens},_.success("配置已加载")}catch(n){_.error(`加载配置失败: ${n.message}`)}finally{w.value=!1}}async function O(){U.value=!0;const n=[],t=[];try{if(a.provider&&a.provider!==s.provider)try{await e.execute(`config set llm.provider ${a.provider}`,1e4),t.push("provider")}catch(c){n.push(`provider: ${c.message}`)}if(a.model&&a.model!==s.model)try{await e.execute(`config set llm.model ${a.model}`,1e4),t.push("model")}catch(c){n.push(`model: ${c.message}`)}if(a.apiKey&&a.apiKey!==s.apiKey)try{await e.execute(`config set llm.apiKey ${a.apiKey}`,1e4),t.push("apiKey")}catch(c){n.push(`apiKey: ${c.message}`)}if(a.baseUrl!==void 0&&a.baseUrl!==s.baseUrl)try{await e.execute(`config set llm.baseUrl ${a.baseUrl}`,1e4),t.push("baseUrl")}catch(c){n.push(`baseUrl: ${c.message}`)}if(a.temperature!==s.temperature)try{await e.execute(`config set llm.temperature ${a.temperature}`,1e4),t.push("temperature")}catch(c){n.push(`temperature: ${c.message}`)}if(a.maxTokens!==s.maxTokens)try{await e.execute(`config set llm.maxTokens ${a.maxTokens}`,1e4),t.push("maxTokens")}catch(c){n.push(`maxTokens: ${c.message}`)}n.length>0?_.warning(`部分配置保存失败: ${n.join("; ")}`):t.length>0?(_.success(`已保存 ${t.length} 项配置`),s={...a},(t.includes("apiKey")||t.includes("provider")||t.includes("baseUrl")||t.includes("model"))&&(y.value=!0),t.includes("provider")&&v.loadProviders()):_.info("没有检测到配置变更")}catch(c){_.error(`保存配置失败: ${c.message}`)}finally{U.value=!1}}function P(){a.provider=s.provider||void 0,a.model=s.model||"",a.apiKey=s.apiKey||"",a.baseUrl=s.baseUrl||"",a.temperature=s.temperature??.7,a.maxTokens=s.maxTokens??4096}I(()=>{v.loadProviders(),z()});const T={providersStore:v,ws:e,configLoading:w,configSaving:U,showRestartHint:y,configForm:a,get loadedConfig(){return s},set loadedConfig(n){s=n},knownProviders:f,providerLabels:p,providerOptions:b,switchProvider:h,test:L,loadConfig:z,saveConfig:O,resetForm:P,onMounted:I,reactive:A,ref:k,get ReloadOutlined(){return J},get message(){return _},get useProvidersStore(){return B},get useWsStore(){return M},get parseLlmConfigOutput(){return j}};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}},Z={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},X={key:1,style:{"text-align":"center",padding:"60px"}},Y={class:"providers-grid"},$={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},ee={style:{"font-size":"24px"}},oe={style:{flex:"1"}},ae={style:{color:"#e0e0e0","font-weight":"500"}},te={style:{color:"var(--text-secondary)","font-size":"11px","font-family":"monospace"}},re={style:{display:"flex",gap:"8px","justify-content":"flex-end"}},se={key:0,style:{"margin-top":"24px"}},ne={style:{color:"#ccc","font-family":"monospace","font-size":"13px"}},ie={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"16px"}},le={class:"config-grid"},de={style:{display:"flex","align-items":"center",gap:"12px"}},ce={style:{display:"flex",gap:"12px","justify-content":"flex-end","margin-top":"16px"}};function me(K,o,v,e,w,U){const y=m("a-button"),a=m("a-alert"),s=m("a-spin"),f=m("a-tag"),p=m("a-badge"),b=m("a-card"),h=m("a-list-item"),L=m("a-list"),z=m("a-divider"),O=m("a-select"),P=m("a-form-item"),T=m("a-input"),n=m("a-input-password"),t=m("a-slider"),c=m("a-input-number"),N=m("a-form");return g(),F("div",null,[d("div",Z,[o[10]||(o[10]=d("div",null,[d("h2",{class:"page-title"},"LLM 配置"),d("p",{class:"page-sub"},"管理 AI 服务提供商")],-1)),i(y,{type:"primary",ghost:"",loading:e.providersStore.loading,onClick:o[0]||(o[0]=r=>e.providersStore.loadProviders())},{icon:l(()=>[i(e.ReloadOutlined)]),default:l(()=>[o[9]||(o[9]=x(" 刷新 ",-1))]),_:1},8,["loading"])]),u(" Active Provider Banner "),e.providersStore.activeProvider?(g(),S(a,{key:0,type:"success",style:{"margin-bottom":"20px",background:"rgba(41,162,112,.08)","border-color":"rgba(41,162,112,.3)"},"show-icon":""},{message:l(()=>[d("span",null,[o[11]||(o[11]=x("当前激活:",-1)),d("strong",null,C(e.providersStore.activeProvider),1)])]),_:1})):u("v-if",!0),u(" Loading "),e.providersStore.loading?(g(),F("div",X,[i(s,{size:"large"}),o[12]||(o[12]=d("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载 LLM 信息中...",-1))])):(g(),F(R,{key:2},[u(" Providers Grid "),d("div",null,[d("div",Y,[(g(!0),F(R,null,q(e.providersStore.providers,r=>(g(),S(b,{key:r.name,class:E(["provider-card",{active:r.active}]),style:{background:"var(--bg-card)"},size:"small"},{default:l(()=>[d("div",$,[d("span",ee,C(r.icon),1),d("div",oe,[d("div",ae,C(r.label),1),d("div",te,C(r.name),1)]),d("div",null,[r.active?(g(),S(f,{key:0,color:"green"},{default:l(()=>[...o[13]||(o[13]=[x("活跃",-1)])]),_:1})):r.status==="ok"?(g(),S(p,{key:1,status:"success",text:""})):r.status==="error"?(g(),S(p,{key:2,status:"error",text:""})):u("v-if",!0)])]),d("div",re,[i(y,{size:"small",style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"},loading:e.providersStore.testing===r.name,onClick:V=>e.test(r.name)},{default:l(()=>[...o[14]||(o[14]=[x(" 测试 ",-1)])]),_:1},8,["loading","onClick"]),r.active?(g(),S(f,{key:1,color:"green",style:{margin:"0","line-height":"24px"}},{default:l(()=>[...o[16]||(o[16]=[x("当前",-1)])]),_:1})):(g(),S(y,{key:0,size:"small",type:"primary",ghost:"",onClick:V=>e.switchProvider(r.name)},{default:l(()=>[...o[15]||(o[15]=[x(" 切换 ",-1)])]),_:1},8,["onClick"]))])]),_:2},1032,["class"]))),128))]),u(" Local Models (Ollama) "),e.providersStore.localModels.length?(g(),F("div",se,[o[17]||(o[17]=d("h3",{style:{color:"#ccc","font-size":"15px","margin-bottom":"12px"}}," 本地模型(Ollama) ",-1)),i(L,{"data-source":e.providersStore.localModels,size:"small",style:{background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)"}},{renderItem:l(({item:r})=>[i(h,{style:{padding:"10px 16px","border-color":"#252525"}},{actions:l(()=>[i(f,{color:"cyan",style:{"font-size":"10px"}},{default:l(()=>[x(C(r.size||"local"),1)]),_:2},1024)]),default:l(()=>[d("span",ne,C(r.name),1)]),_:2},1024)]),_:1},8,["data-source"])])):u("v-if",!0),u(" LLM Parameter Settings "),i(z,{style:{"border-color":"var(--border-color)",margin:"32px 0 24px"}}),e.showRestartHint?(g(),S(a,{key:1,type:"warning","show-icon":"",closable:"",style:{"margin-bottom":"16px"},message:"配置已保存,但当前聊天会话仍在用旧 key",description:"桌面端的 LLM 会话只在新建会话时重读配置。请新建一个 Chat,或重启应用,新 key/Provider 才会生效。",onClose:o[1]||(o[1]=r=>e.showRestartHint=!1)})):u("v-if",!0),d("div",ie,[o[19]||(o[19]=d("h3",{class:"section-title"},"LLM 参数设置",-1)),i(y,{size:"small",loading:e.configLoading,onClick:e.loadConfig,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:l(()=>[i(e.ReloadOutlined)]),default:l(()=>[o[18]||(o[18]=x(" 加载配置 ",-1))]),_:1},8,["loading"])]),i(b,{class:"config-card",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:l(()=>[i(N,{model:e.configForm,layout:"vertical",class:"config-form"},{default:l(()=>[d("div",le,[u(" Provider "),i(P,{label:"Provider(提供商)"},{default:l(()=>[i(O,{value:e.configForm.provider,"onUpdate:value":o[2]||(o[2]=r=>e.configForm.provider=r),placeholder:"选择 LLM 提供商",options:e.providerOptions,style:{width:"100%"},disabled:e.configSaving},null,8,["value","options","disabled"])]),_:1}),u(" Model "),i(P,{label:"Model(模型名称)"},{default:l(()=>[i(T,{value:e.configForm.model,"onUpdate:value":o[3]||(o[3]=r=>e.configForm.model=r),placeholder:"例如 doubao-seed-1-6-251015","allow-clear":"",disabled:e.configSaving},null,8,["value","disabled"])]),_:1}),u(" API Key "),i(P,{label:"API Key"},{default:l(()=>[i(n,{value:e.configForm.apiKey,"onUpdate:value":o[4]||(o[4]=r=>e.configForm.apiKey=r),placeholder:"输入 API Key",disabled:e.configSaving},null,8,["value","disabled"])]),_:1}),u(" Base URL "),i(P,{label:"Base URL"},{default:l(()=>[i(T,{value:e.configForm.baseUrl,"onUpdate:value":o[5]||(o[5]=r=>e.configForm.baseUrl=r),placeholder:"例如 https://ark.cn-beijing.volces.com/api/v3","allow-clear":"",disabled:e.configSaving},null,8,["value","disabled"])]),_:1}),u(" Temperature "),i(P,{label:"Temperature(温度)"},{default:l(()=>[d("div",de,[i(t,{value:e.configForm.temperature,"onUpdate:value":o[6]||(o[6]=r=>e.configForm.temperature=r),min:0,max:2,step:.1,style:{flex:"1"},disabled:e.configSaving},null,8,["value","disabled"]),i(c,{value:e.configForm.temperature,"onUpdate:value":o[7]||(o[7]=r=>e.configForm.temperature=r),min:0,max:2,step:.1,precision:1,style:{width:"80px"},disabled:e.configSaving},null,8,["value","disabled"])])]),_:1}),u(" Max Tokens "),i(P,{label:"Max Tokens(最大输出长度)"},{default:l(()=>[i(c,{value:e.configForm.maxTokens,"onUpdate:value":o[8]||(o[8]=r=>e.configForm.maxTokens=r),min:256,max:128e3,step:256,style:{width:"100%"},placeholder:"4096",disabled:e.configSaving},null,8,["value","disabled"])]),_:1})]),d("div",ce,[i(y,{onClick:e.resetForm,disabled:e.configSaving,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{default:l(()=>[...o[20]||(o[20]=[x(" 重置 ",-1)])]),_:1},8,["disabled"]),i(y,{type:"primary",loading:e.configSaving,onClick:e.saveConfig},{default:l(()=>[...o[21]||(o[21]=[x(" 保存配置 ",-1)])]),_:1},8,["loading"])])]),_:1},8,["model"])]),_:1})])],2112))])}const ge=H(Q,[["render",me],["__scopeId","data-v-64155d06"],["__file","/tmp/cc-web-panel-pNtnyO/repo/packages/web-panel/src/views/Providers.vue"]]);export{ge as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-CQftlZn-.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-azDoyusS.js";import{a0 as t}from"./index-CQftlZn-.js";import"./vendor-Bn1JzzAn.js";import"./index-CHvPlzWJ.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-PBupbbUA.js";import{a0 as t}from"./index-CQftlZn-.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-BiUJ6qWs.js";import"./useFlexGapSupport-CKl4FqXF.js";import"./styleChecker-CKeHA2eM.js";import"./index-CHvPlzWJ.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|