chainlesschain 0.162.30 → 0.162.31
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 +2 -2
- package/src/assets/web-panel/assets/{AIOps-CsNttUU7.js → AIOps-BqWP6FKu.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-lgohjckQ.js → ActionButton-CXwMgOvX.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-ccV3LAca.js → Analytics-DAebZ4IY.js} +3 -3
- package/src/assets/web-panel/assets/AppLayout-CYsqYoME.js +9 -0
- package/src/assets/web-panel/assets/{Audit-B1gFM5U9.js → Audit-BbTtX1Nf.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BeWE3ERo.js → Backup-DgqY2Eb-.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CDkPsNG2.js → BaseInput-Cq2ZuSoO.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-ztb9ia6e.js → Chat-D2kqpUyO.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-C-svYkrC.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-BcfRBlIY.js → Checkbox-_9swHpyc.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DOs99xkr.js → Codegen-Cr9YbCPl.js} +1 -1
- package/src/assets/web-panel/assets/{Col-D1X6tYlj.js → Col--wdpCMxx.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DTksIWtz.js → Community-DuFcVnLu.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DIJtAYBO.js → Compact-1yzYeT04.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BBf7LF_k.js → Compliance-Dq3aU9Df.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-UBPXQ40s.js → Cowork-CrWcnIg8.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CkRm1jPB.js → Cron-Bh6fKZ0h.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-qALlTl7e.js → Crosschain-8ofPaWVW.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CqyqVS6E.js → DID-D3EiYm3w.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-BFjEdFne.js +3 -0
- package/src/assets/web-panel/assets/{Dropdown-Cb5UzbSZ.js → Dropdown-pYVPcP6O.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CarBq8Fk.js → EmailListRenderer-zBPodwJ1.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CSiGXaZz.js → FamilyGuardDashboard-CyQTW6PW.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DUxhVoBN.js → Federation-Ctaq3zYq.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BoMQpkhx.js → FormItemContext-CWYJCLq1.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DTVqC_CX.js → GenericCardRenderer-B1g6t9R9.js} +1 -1
- package/src/assets/web-panel/assets/{Git-C_XuPtK5.js → Git-DH-v8iwd.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BZyqlqz-.js → Governance-jZxXvOs5.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DdZVUimI.js → Inference-D07LRghn.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-IzZ-jnCn.js → KnowledgeGraph-DnGtRZhx.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-koTK6eNc.js → Logs-D2pM9C4W.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-6zpJ1L8n.js → Marketplace-UyIO7C7r.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Ywc4IVks.js → McpTools-Bf1gvZPf.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-C_zB9dUa.js → Memory-C1bWj4RN.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Nc05r24L.js → MobileBridge-C_Ot1H_a.js} +2 -2
- package/src/assets/web-panel/assets/{MobileProjects-BJGxL526.js → MobileProjects-zr-PpsT_.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Im7SIcz1.js → Mtc-CnzFUz5J.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-BFFzvzMD.js → MtcAudit-CAAh99wz.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-CcNEbycq.js → Multisig-D6IAg6HE.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CDH6OTXN.js → NLProgramming-BFMarxb0.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Dqg3QXcU.js → Notes-BRp9ro3t.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CDVmK1eU.js → NotificationSettings-C0Au3Cxb.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-ISp6btRY.js +1 -0
- package/src/assets/web-panel/assets/{Organization-DJb9bRQS.js → Organization-DYoxLBRX.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CK7Q5dje.js → Overflow-rO8JJWGJ.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CJIyYfwc.js → P2P-DJleeXIK.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-uqRULcuw.js → PdhVaultBrowser-DM5qghFp.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-Crvwt6bq.js → Permissions-D5v4Beya.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DcN5OWzg.js → PersonalDataHub-c2ZTX0Pv.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-DfWJvvJW.js → Pipeline-Crrkyhpz.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DepD0S3v.js → Privacy-DZVyrJKa.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B7OKhH27.js → ProjectInit-DKg7J0gz.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BJ4ueRFv.js → ProjectSettings-3ndmTvVH.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Dl_hPdhU.js → Projects-ll5wnj2L.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Dl0FT1S3.js → Providers-BeqBVMhB.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-V2hYLhfp.js → QuickAsk-DKAAxzuA.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-8Kaiodgv.js → Recommend-Byu7IGei.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-CsxB3JGg.js → Reputation-BKhWAmCu.js} +1 -1
- package/src/assets/web-panel/assets/{Row-6-x7tEYq.js → Row-BFtn11O6.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Buv6f5tw.js → RssFeed-D5a0PT0k.js} +2 -2
- package/src/assets/web-panel/assets/{Search-ABrDz84n.js → Search-DAkuaZNe.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DqOJmz18.js → Security-C79Ml2Ms.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Cq4Tda3q.js → Services-BBk_jH6-.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-n74QlyYq.js → Skeleton-Cy0VvL0M.js} +1 -1
- package/src/assets/web-panel/assets/Skills-OQNky3uI.js +1 -0
- package/src/assets/web-panel/assets/{Sla-hwRgJ99Z.js → Sla-CbX1f8xN.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-B6Bs6_-8.js → SpeechSettings-BIkoUjws.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CTp2dZ0z.js → SyncSettings-DG6Swk7G.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-D70Lis6S.js → Tasks-C9R8sgyi.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Cags0ssw.js → Templates-AaJPeCIz.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BxCMzzGt.js → Tenant-jVFRofww.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-v05SDqHd.js → Terminal-DHBMzfK6.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BLUDHbBL.js → TimelineRenderer-9RFfOHSI.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-D-xKLJYv.js → Tokens-ZTfwuABF.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-B47tVIbH.js → Trigger-Xo7uZNQs.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DmRU9kfs.js → Trust-C0cTPYvn.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DzgSGs-c.js → UkeySign-DmMKio71.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C6qu58up.js → VideoEditing-DP7B-oGT.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Dh8ZWx8f.js → Wallet-B1kZDARo.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DFHOVuAY.js → WebAuthn-Bo5kBx27.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-B_fyQ3Y_.js → WorkflowEditor-DGI9SNHH.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BR-WxnCQ.js → chat-y97W1CIG.js} +1 -1
- package/src/assets/web-panel/assets/{colors-C-6RysQe.js → colors-DtTNo0sH.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-B_9_SCKN.js → compact-item-D0q0exuS.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-D6rklIbE.js → createContext-D7pLFs2I.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BDK34w0I.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BrotgSvd.js → hasIn-CXjG5B2j.js} +1 -1
- package/src/assets/web-panel/assets/{index-DkpDFJRn.js → index-1dwtkcJv.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfqUsPl2.js → index-4mWZhCzz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaLhL3Tj.js → index-6np5ESBM.js} +1 -1
- package/src/assets/web-panel/assets/{index-DigjvHuo.js → index-8jxbZupG.js} +1 -1
- package/src/assets/web-panel/assets/{index-MCmNzIC7.js → index-B3y_4OdG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWmJukRW.js → index-B4dPdrvC.js} +1 -1
- package/src/assets/web-panel/assets/index-B6SaRuCI.js +1 -0
- package/src/assets/web-panel/assets/index-B9ekWb3I.js +1 -0
- package/src/assets/web-panel/assets/{index-GzuCTHVZ.js → index-BJUf19Wd.js} +3 -3
- package/src/assets/web-panel/assets/{index-PzM_GlKb.js → index-BO644Q4S.js} +1 -1
- package/src/assets/web-panel/assets/{index-CTQkYbir.js → index-BPXhU-jp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsDNNDBN.js → index-BU944DeT.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bwkg_EJk.js → index-B_hjkMtX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMnomft7.js → index-BdhEYW2a.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJ70GAW2.js → index-BgmvrPJH.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTh0fWI4.js → index-BgyrM0UN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CAfRNHna.js → index-BnLrbXDA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCWzUY8K.js → index-BqVjUN8b.js} +1 -1
- package/src/assets/web-panel/assets/{index-kkjq_hwC.js → index-BzCPx1cq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CK8YwdNd.js → index-CFsPe2N7.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6KqyxG1.js → index-CKrbutAQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bv9BrnD2.js → index-CSdhC7Qo.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJgp_QFo.js → index-Cbqu804A.js} +1 -1
- package/src/assets/web-panel/assets/{index-rWiOF7Iu.js → index-CkGFqlYX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrGp-4E2.js → index-Ct6xtKkc.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cn5ghmbB.js → index-DY6KLlgG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BbRl_gIW.js → index-D_4WcI1V.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTpElYJs.js → index-DjCawXk1.js} +1 -1
- package/src/assets/web-panel/assets/{index-MBOwmoOi.js → index-Dr45Nm9V.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2yXH6vy.js → index-EaIfumgW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTCUOKu9.js → index-POaFzYGS.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIiCIC2j.js → index-TrBGgrwG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdDmzoPE.js → index-YWOEx3rP.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cn21XmDt.js → index-_3wPBMKt.js} +1 -1
- package/src/assets/web-panel/assets/{index-CsWVDOd2.js → index-aarO4HT9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CTpxOc5s.js → index-bVJvqDAz.js} +1 -1
- package/src/assets/web-panel/assets/{index-B85rQNYG.js → index-gFLQe31v.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZehgEQYa.js → index-kvV0f4tV.js} +1 -1
- package/src/assets/web-panel/assets/{index-E_5VXq8H.js → index-qoB3whR9.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-C2v_L5na.js → initDefaultProps-BnXISaAa.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DNDqGbfr.js → motion-ChY7C0zJ.js} +1 -1
- package/src/assets/web-panel/assets/{move-xvpQ_6hJ.js → move-ByFZMFM5.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Cb0FsfrO.js → omit-BYeliY1H.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BxhYpnum.js → pickAttrs-B9dcAKnu.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B3soaW4h.js → placementArrow-D3F_txz7.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B-eRSLvd.js → responsiveObserve-ClkwY7wS.js} +1 -1
- package/src/assets/web-panel/assets/{slide--cM2ZOx-.js → slide-BNgy2Eea.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DjBhfi8Q.js → statusUtils-Bv3heMCD.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-C30mMh8o.js → styleChecker-DVdlHbQm.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-f7y2Qlzs.js → useFlexGapSupport-alrRY5BK.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-iTCXoLoZ.js → useFs-CcVh0-Vu.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BH0RXmVF.js → usePersonalDataHub-CkkHPhyq.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DQtmeDXM.js → vnode-DWi0X9WN.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-vw50zkLZ.js → zoom-DCbqxxLH.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +306 -1
- package/src/commands/ask.js +35 -1
- package/src/commands/checkpoint.js +239 -0
- package/src/commands/cost.js +114 -0
- package/src/commands/session.js +22 -2
- package/src/index.js +4 -0
- package/src/lib/file-checkpoint.js +300 -0
- package/src/lib/llm-pricing.js +227 -0
- package/src/lib/personal-data-hub-wiring.js +30 -0
- package/src/lib/recent-session.js +72 -0
- package/src/lib/session-picker.js +68 -0
- package/src/repl/agent-repl.js +58 -2
- package/src/repl/chat-repl.js +16 -1
- package/src/runtime/agent-core.js +68 -31
- package/src/runtime/fallback-model.js +109 -0
- package/src/runtime/file-ref-expander.js +258 -0
- package/src/runtime/headless-runner.js +576 -0
- package/src/runtime/headless-stream.js +302 -0
- package/src/runtime/policies/agent-policy.js +6 -0
- package/src/runtime/quiet-stdout.js +35 -0
- package/src/runtime/system-prompt.js +60 -0
- package/src/assets/web-panel/assets/AppLayout-B0hl5cPk.js +0 -9
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Dlw_6n3M.js +0 -1
- package/src/assets/web-panel/assets/Dashboard-XlMpT7K_.js +0 -3
- package/src/assets/web-panel/assets/OrderTableRenderer-Bg0bkfjR.js +0 -1
- package/src/assets/web-panel/assets/Skills-CC0iozL5.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BiN5HELJ.js +0 -1
- package/src/assets/web-panel/assets/index-BhxiT2LJ.js +0 -1
- package/src/assets/web-panel/assets/index-DBNSZ2oz.js +0 -1
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming-input headless runner — Claude-Code `--input-format stream-json`.
|
|
3
|
+
*
|
|
4
|
+
* Where `runAgentHeadless` runs ONE turn from a single prompt and exits, this
|
|
5
|
+
* variant keeps a persistent conversation driven by NDJSON user events on
|
|
6
|
+
* stdin: one JSON object per line, a turn per event, NDJSON results per turn,
|
|
7
|
+
* until stdin closes. Pairs with `--output-format stream-json` for a full
|
|
8
|
+
* program-to-agent duplex (SDK-style multi-turn).
|
|
9
|
+
*
|
|
10
|
+
* Input event shapes accepted (kept liberal for interop):
|
|
11
|
+
* {"type":"user","message":{"role":"user","content":"hi"}}
|
|
12
|
+
* {"type":"user","message":{"content":[{"type":"text","text":"hi"}]}}
|
|
13
|
+
* {"type":"user","text":"hi"} | {"role":"user","content":"hi"} | {"prompt":"hi"}
|
|
14
|
+
*
|
|
15
|
+
* Reuses the exported permission/tool helpers + the core agent loop so it does
|
|
16
|
+
* not duplicate (or fork) `runAgentHeadless`'s internals.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { bootstrap } from "./bootstrap.js";
|
|
20
|
+
import { buildSystemPrompt, agentLoop as coreAgentLoop } from "./agent-core.js";
|
|
21
|
+
import { composeSystemPrompt } from "./system-prompt.js";
|
|
22
|
+
import { expandFileRefs } from "./file-ref-expander.js";
|
|
23
|
+
import { IterationBudget } from "../lib/iteration-budget.js";
|
|
24
|
+
import {
|
|
25
|
+
resolvePermissionMode,
|
|
26
|
+
resolveEnabledTools,
|
|
27
|
+
} from "./headless-runner.js";
|
|
28
|
+
import { withQuietStdout } from "./quiet-stdout.js";
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Parse one NDJSON input line into { text } / { error } / null (blank → skip).
|
|
32
|
+
*/
|
|
33
|
+
export function parseInputEvent(line) {
|
|
34
|
+
const trimmed = (line || "").trim();
|
|
35
|
+
if (!trimmed) return null;
|
|
36
|
+
let obj;
|
|
37
|
+
try {
|
|
38
|
+
obj = JSON.parse(trimmed);
|
|
39
|
+
} catch {
|
|
40
|
+
return { error: `invalid JSON line: ${trimmed.slice(0, 80)}` };
|
|
41
|
+
}
|
|
42
|
+
const msg = obj && typeof obj === "object" ? obj.message || obj : {};
|
|
43
|
+
let content = msg.content ?? obj.text ?? obj.prompt;
|
|
44
|
+
if (Array.isArray(content)) {
|
|
45
|
+
content = content
|
|
46
|
+
.map((b) => (typeof b === "string" ? b : b?.text || ""))
|
|
47
|
+
.join("");
|
|
48
|
+
}
|
|
49
|
+
if (typeof content !== "string" || !content.trim()) return null;
|
|
50
|
+
return { text: content };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Yield NDJSON lines from a byte/string stream (stdin). Splits on "\n" and
|
|
55
|
+
* flushes any trailing partial line when the stream ends.
|
|
56
|
+
*/
|
|
57
|
+
export async function* readJsonLines(input) {
|
|
58
|
+
let buf = "";
|
|
59
|
+
for await (const chunk of input) {
|
|
60
|
+
buf += typeof chunk === "string" ? chunk : chunk.toString("utf-8");
|
|
61
|
+
let idx;
|
|
62
|
+
while ((idx = buf.indexOf("\n")) >= 0) {
|
|
63
|
+
yield buf.slice(0, idx);
|
|
64
|
+
buf = buf.slice(idx + 1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (buf.trim()) yield buf;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Run a single turn through the core agent loop, emitting NDJSON events.
|
|
72
|
+
* Returns the turn outcome so the caller can grow history + the result line.
|
|
73
|
+
*/
|
|
74
|
+
async function runTurn(messages, loopOptions, { runLoop, emit }) {
|
|
75
|
+
const usage = { input_tokens: 0, output_tokens: 0 };
|
|
76
|
+
const toolCalls = [];
|
|
77
|
+
let finalText = "";
|
|
78
|
+
let endReason = "complete";
|
|
79
|
+
|
|
80
|
+
for await (const event of runLoop(messages, loopOptions)) {
|
|
81
|
+
switch (event.type) {
|
|
82
|
+
case "tool-executing":
|
|
83
|
+
toolCalls.push({ tool: event.tool, args: event.args });
|
|
84
|
+
emit({ type: "tool_use", tool: event.tool, args: event.args });
|
|
85
|
+
break;
|
|
86
|
+
case "tool-result": {
|
|
87
|
+
const err = event.error || event.result?.error || null;
|
|
88
|
+
if (toolCalls.length > 0)
|
|
89
|
+
toolCalls[toolCalls.length - 1].is_error = Boolean(err);
|
|
90
|
+
emit({
|
|
91
|
+
type: "tool_result",
|
|
92
|
+
tool: event.tool,
|
|
93
|
+
is_error: Boolean(err),
|
|
94
|
+
error: err,
|
|
95
|
+
result: event.result,
|
|
96
|
+
});
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
case "token-usage":
|
|
100
|
+
usage.input_tokens += event.usage?.input_tokens || 0;
|
|
101
|
+
usage.output_tokens += event.usage?.output_tokens || 0;
|
|
102
|
+
emit({ type: "token_usage", usage: event.usage });
|
|
103
|
+
break;
|
|
104
|
+
case "iteration-warning":
|
|
105
|
+
emit({ type: "iteration_warning", message: event.message });
|
|
106
|
+
break;
|
|
107
|
+
case "iteration-budget-exhausted":
|
|
108
|
+
endReason = "max_turns";
|
|
109
|
+
emit({ type: "iteration_budget_exhausted", budget: event.budget });
|
|
110
|
+
break;
|
|
111
|
+
case "response-complete":
|
|
112
|
+
finalText = event.content || "";
|
|
113
|
+
break;
|
|
114
|
+
case "run-ended":
|
|
115
|
+
if (event.reason) endReason = event.reason;
|
|
116
|
+
break;
|
|
117
|
+
default:
|
|
118
|
+
if (event.type) emit(event);
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { finalText, endReason, usage, toolCalls };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Drive a multi-turn headless conversation from NDJSON stdin events.
|
|
127
|
+
*
|
|
128
|
+
* @param {object} options same shape as runAgentHeadless (minus single prompt)
|
|
129
|
+
* @param {object} [deps] { input, bootstrap, getApprovalGate, agentLoop,
|
|
130
|
+
* writeOut, writeErr, expandFileRefs }
|
|
131
|
+
* @returns {Promise<{exitCode:number, turns:number}>}
|
|
132
|
+
*/
|
|
133
|
+
export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
134
|
+
const model = options.model || "qwen2.5:7b";
|
|
135
|
+
const provider = options.provider || "ollama";
|
|
136
|
+
const baseUrl = options.baseUrl || "http://localhost:11434";
|
|
137
|
+
const apiKey = options.apiKey || null;
|
|
138
|
+
const cwd = options.cwd || process.cwd();
|
|
139
|
+
const additionalDirectories = Array.isArray(options.additionalDirectories)
|
|
140
|
+
? options.additionalDirectories.filter(Boolean)
|
|
141
|
+
: [];
|
|
142
|
+
|
|
143
|
+
const input = deps.input || process.stdin;
|
|
144
|
+
const runLoop = deps.agentLoop || coreAgentLoop;
|
|
145
|
+
const doBootstrap = deps.bootstrap || bootstrap;
|
|
146
|
+
const doExpand = deps.expandFileRefs || expandFileRefs;
|
|
147
|
+
const writeOut = deps.writeOut || ((s) => process.stdout.write(s));
|
|
148
|
+
const writeErr = deps.writeErr || ((s) => process.stderr.write(s));
|
|
149
|
+
const emit = (obj) => writeOut(JSON.stringify(obj) + "\n");
|
|
150
|
+
|
|
151
|
+
const getApprovalGate =
|
|
152
|
+
deps.getApprovalGate ||
|
|
153
|
+
(async () => {
|
|
154
|
+
const m = await import("../lib/session-core-singletons.js");
|
|
155
|
+
return m.getApprovalGate();
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
const perm = resolvePermissionMode(options.permissionMode);
|
|
159
|
+
const enabledToolNames = resolveEnabledTools({
|
|
160
|
+
allowedTools: options.allowedTools,
|
|
161
|
+
readOnly: perm.readOnly,
|
|
162
|
+
});
|
|
163
|
+
const disabledTools = options.disallowedTools || [];
|
|
164
|
+
|
|
165
|
+
let db = null;
|
|
166
|
+
try {
|
|
167
|
+
// Bootstrap logs db/config diagnostics via console.info (→ stdout); divert
|
|
168
|
+
// to stderr so the NDJSON stream stays clean.
|
|
169
|
+
const ctx = await withQuietStdout(() => doBootstrap({ verbose: false }));
|
|
170
|
+
db = ctx.db || null;
|
|
171
|
+
} catch {
|
|
172
|
+
// DB optional — static-prompt fallback.
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const sessionId =
|
|
176
|
+
options.sessionId || `headless-stream-${Date.now()}-${process.pid}`;
|
|
177
|
+
|
|
178
|
+
let approvalGate = null;
|
|
179
|
+
try {
|
|
180
|
+
approvalGate = await getApprovalGate();
|
|
181
|
+
if (approvalGate) {
|
|
182
|
+
approvalGate.setSessionPolicy?.(sessionId, perm.sessionPolicy);
|
|
183
|
+
approvalGate.setConfirmer?.(perm.confirmer);
|
|
184
|
+
}
|
|
185
|
+
} catch {
|
|
186
|
+
approvalGate = null;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const systemContent = composeSystemPrompt(
|
|
190
|
+
buildSystemPrompt(cwd, { additionalDirectories }),
|
|
191
|
+
{
|
|
192
|
+
systemPrompt: options.systemPrompt,
|
|
193
|
+
appendSystemPrompt: options.appendSystemPrompt,
|
|
194
|
+
},
|
|
195
|
+
);
|
|
196
|
+
const messages = [{ role: "system", content: systemContent }];
|
|
197
|
+
|
|
198
|
+
emit({
|
|
199
|
+
type: "system",
|
|
200
|
+
subtype: "init",
|
|
201
|
+
session_id: sessionId,
|
|
202
|
+
model,
|
|
203
|
+
provider,
|
|
204
|
+
permission_mode: options.permissionMode || "default",
|
|
205
|
+
tools: enabledToolNames,
|
|
206
|
+
input_format: "stream-json",
|
|
207
|
+
additional_directories: additionalDirectories,
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
const loopOptionsBase = {
|
|
211
|
+
model,
|
|
212
|
+
provider,
|
|
213
|
+
baseUrl,
|
|
214
|
+
apiKey,
|
|
215
|
+
cwd,
|
|
216
|
+
additionalDirectories,
|
|
217
|
+
sessionId,
|
|
218
|
+
hookDb: db,
|
|
219
|
+
approvalGate,
|
|
220
|
+
enabledToolNames,
|
|
221
|
+
disabledTools,
|
|
222
|
+
chatFn: deps.chatFn || options.chatFn || undefined,
|
|
223
|
+
signal: options.signal || undefined,
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
let turns = 0;
|
|
227
|
+
let sawError = false;
|
|
228
|
+
|
|
229
|
+
for await (const line of readJsonLines(input)) {
|
|
230
|
+
const parsed = parseInputEvent(line);
|
|
231
|
+
if (parsed == null) continue; // blank line
|
|
232
|
+
if (parsed.error) {
|
|
233
|
+
emit({
|
|
234
|
+
type: "result",
|
|
235
|
+
subtype: "error",
|
|
236
|
+
is_error: true,
|
|
237
|
+
error: parsed.error,
|
|
238
|
+
});
|
|
239
|
+
sawError = true;
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Per-turn iteration budget so one turn can't starve the rest.
|
|
244
|
+
const budget = Number.isFinite(options.maxTurns)
|
|
245
|
+
? new IterationBudget({
|
|
246
|
+
limit: Math.max(1, Math.floor(options.maxTurns)),
|
|
247
|
+
})
|
|
248
|
+
: new IterationBudget();
|
|
249
|
+
|
|
250
|
+
// @file expansion per user event (parity with single-turn headless).
|
|
251
|
+
let userContent = parsed.text;
|
|
252
|
+
if (options.expandFileRefs !== false) {
|
|
253
|
+
const expanded = doExpand(parsed.text, { cwd });
|
|
254
|
+
userContent = expanded.prompt;
|
|
255
|
+
for (const w of expanded.warnings) writeErr(` @ref: ${w}\n`);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
messages.push({ role: "user", content: userContent });
|
|
259
|
+
turns += 1;
|
|
260
|
+
|
|
261
|
+
let outcome;
|
|
262
|
+
try {
|
|
263
|
+
outcome = await runTurn(
|
|
264
|
+
messages,
|
|
265
|
+
{ ...loopOptionsBase, iterationBudget: budget },
|
|
266
|
+
{ runLoop, emit },
|
|
267
|
+
);
|
|
268
|
+
} catch (err) {
|
|
269
|
+
emit({
|
|
270
|
+
type: "result",
|
|
271
|
+
subtype: "error",
|
|
272
|
+
is_error: true,
|
|
273
|
+
error: err?.message || String(err),
|
|
274
|
+
turn: turns,
|
|
275
|
+
});
|
|
276
|
+
sawError = true;
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Grow the conversation so the next turn has context.
|
|
281
|
+
messages.push({ role: "assistant", content: outcome.finalText });
|
|
282
|
+
|
|
283
|
+
const exhausted =
|
|
284
|
+
outcome.endReason === "budget-exhausted" ||
|
|
285
|
+
outcome.endReason === "max_turns";
|
|
286
|
+
const isError = exhausted || outcome.endReason === "no-response";
|
|
287
|
+
if (isError) sawError = true;
|
|
288
|
+
|
|
289
|
+
emit({
|
|
290
|
+
type: "result",
|
|
291
|
+
subtype: exhausted ? "error_max_turns" : isError ? "error" : "success",
|
|
292
|
+
is_error: isError,
|
|
293
|
+
result: outcome.finalText,
|
|
294
|
+
session_id: sessionId,
|
|
295
|
+
turn: turns,
|
|
296
|
+
usage: outcome.usage,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
emit({ type: "system", subtype: "end", session_id: sessionId, turns });
|
|
301
|
+
return { exitCode: sawError ? 1 : 0, turns };
|
|
302
|
+
}
|
|
@@ -26,6 +26,12 @@ export function resolveAgentPolicy({
|
|
|
26
26
|
noStream: overrides.noStream === true,
|
|
27
27
|
parkOnExit: overrides.parkOnExit === false ? false : true,
|
|
28
28
|
bundlePath: overrides.bundlePath || null,
|
|
29
|
+
additionalDirectories: Array.isArray(overrides.additionalDirectories)
|
|
30
|
+
? overrides.additionalDirectories
|
|
31
|
+
: [],
|
|
32
|
+
systemPrompt: overrides.systemPrompt || null,
|
|
33
|
+
appendSystemPrompt: overrides.appendSystemPrompt || null,
|
|
34
|
+
fallbackModel: overrides.fallbackModel || null,
|
|
29
35
|
};
|
|
30
36
|
}
|
|
31
37
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run a function with stdout redirected to stderr.
|
|
3
|
+
*
|
|
4
|
+
* The headless runners emit machine-readable output (text answer / JSON /
|
|
5
|
+
* NDJSON) on stdout, but bootstrap/db/config code logs diagnostics via
|
|
6
|
+
* console.info — which Node writes to stdout — e.g. "[DatabaseManager] …",
|
|
7
|
+
* "[AppConfig] Configuration loaded". Those lines corrupt a JSON/NDJSON stream
|
|
8
|
+
* and muddy a plain-text answer. Wrapping the noisy setup in withQuietStdout
|
|
9
|
+
* sends that chatter to stderr (the diagnostic channel) while keeping stdout
|
|
10
|
+
* pristine for the actual payload.
|
|
11
|
+
*
|
|
12
|
+
* Scope is deliberately narrow: it swaps `stream.write` only for the duration
|
|
13
|
+
* of `fn` and always restores it (even on throw), so it never affects the
|
|
14
|
+
* payload writes that happen afterwards, nor any other command.
|
|
15
|
+
*
|
|
16
|
+
* @template T
|
|
17
|
+
* @param {() => T | Promise<T>} fn
|
|
18
|
+
* @param {object} [opts]
|
|
19
|
+
* @param {{write: Function}} [opts.stream=process.stdout] stream to silence
|
|
20
|
+
* @param {{write: Function}} [opts.target=process.stderr] where to divert to
|
|
21
|
+
* @returns {Promise<T>}
|
|
22
|
+
*/
|
|
23
|
+
export async function withQuietStdout(fn, opts = {}) {
|
|
24
|
+
const stream = opts.stream || process.stdout;
|
|
25
|
+
const target = opts.target || process.stderr;
|
|
26
|
+
const original = stream.write;
|
|
27
|
+
stream.write = function (chunk, encoding, cb) {
|
|
28
|
+
return target.write(chunk, encoding, cb);
|
|
29
|
+
};
|
|
30
|
+
try {
|
|
31
|
+
return await fn();
|
|
32
|
+
} finally {
|
|
33
|
+
stream.write = original;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System-prompt overrides for `cc agent` — Claude-Code `--system-prompt` /
|
|
3
|
+
* `--append-system-prompt` parity.
|
|
4
|
+
*
|
|
5
|
+
* - `--system-prompt` replaces the built-in system prompt entirely.
|
|
6
|
+
* - `--append-system-prompt` appends extra guidance after the built-in one.
|
|
7
|
+
*
|
|
8
|
+
* Both accept a literal string OR `@path` (read the file as the prompt text),
|
|
9
|
+
* so a reusable persona can live in a file without a full `--bundle`.
|
|
10
|
+
*
|
|
11
|
+
* Split into two pure-ish functions so each is unit-testable:
|
|
12
|
+
* - resolvePromptText : CLI value (literal / @file) → text [does fs I/O]
|
|
13
|
+
* - composeSystemPrompt: (base, {systemPrompt, appendSystemPrompt}) → text
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import fsDefault from "fs";
|
|
17
|
+
import pathDefault from "path";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Resolve a CLI prompt value. A leading `@` means "read this file"; anything
|
|
21
|
+
* else (or an unreadable @path) is returned verbatim as literal text.
|
|
22
|
+
*
|
|
23
|
+
* @param {string|null|undefined} value
|
|
24
|
+
* @param {object} [opts] { cwd, deps:{ fs, path } }
|
|
25
|
+
* @returns {string|null} null only when value is null/undefined
|
|
26
|
+
*/
|
|
27
|
+
export function resolvePromptText(value, opts = {}) {
|
|
28
|
+
if (value == null) return null;
|
|
29
|
+
const str = String(value);
|
|
30
|
+
if (!str.startsWith("@")) return str;
|
|
31
|
+
|
|
32
|
+
const fs = opts.deps?.fs || fsDefault;
|
|
33
|
+
const path = opts.deps?.path || pathDefault;
|
|
34
|
+
const cwd = opts.cwd || process.cwd();
|
|
35
|
+
const abs = path.resolve(cwd, str.slice(1));
|
|
36
|
+
try {
|
|
37
|
+
return fs.readFileSync(abs, "utf-8");
|
|
38
|
+
} catch {
|
|
39
|
+
// Not a readable file → treat the whole token as literal text.
|
|
40
|
+
return str;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Compose the effective system prompt.
|
|
46
|
+
* - a (truthy) override replaces the base entirely;
|
|
47
|
+
* - an append is added after, separated by a blank line.
|
|
48
|
+
*
|
|
49
|
+
* @param {string} base
|
|
50
|
+
* @param {object} [opts] { systemPrompt, appendSystemPrompt }
|
|
51
|
+
* @returns {string}
|
|
52
|
+
*/
|
|
53
|
+
export function composeSystemPrompt(base, opts = {}) {
|
|
54
|
+
const { systemPrompt, appendSystemPrompt } = opts;
|
|
55
|
+
let result = systemPrompt ? systemPrompt : base || "";
|
|
56
|
+
if (appendSystemPrompt) {
|
|
57
|
+
result = result ? `${result}\n\n${appendSystemPrompt}` : appendSystemPrompt;
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import{b as v,r as P,I as k,P as y,J as L,c as e,K as t,U as d,Q as l,R as a,S as A,F as I,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-BvqAck49.js";import{u as H,_ as Z,E as ke,a as oe,b as ie,c as ae,T as _e,d as V}from"./index-GzuCTHVZ.js";import{u as N}from"./useShellMode-CgR0wCYM.js";import{R as ge,B as de,M as ce,U as Oe,D as he,S as be,h as we,i as ve,j as Le,N as Se,k as Ce,F as Be,l as Ee,m as Te,A as Ae,P as Me,n as Re,o as Pe,p as je,q as De,r as Ue,s as Ne,t as Ie,u as Ke,v as Fe,w as Ve,x as We,V as ze,K as Ge,y as He,z as qe,G as Je,H as Ye,J as Ze,W as Qe,O 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,e as ct,a6 as ut,a7 as pt,a8 as yt,a9 as ft,aa as mt,ab as kt,ac as _t}from"./icons-DP3uiYxy.js";import le from"./index-CCWzUY8K.js";import"./KeyCode-D63Tfrq7.js";import"./omit-Cb0FsfrO.js";import"./pickAttrs-BxhYpnum.js";import"./initDefaultProps-C2v_L5na.js";import"./motion-DNDqGbfr.js";import"./raf-Deuc0E8-.js";import"./index-CJgp_QFo.js";import"./index-DTCUOKu9.js";import"./isVisible-C7tPsqfj.js";import"./useState-BK4hy8Ma.js";import"./devWarning-BiN5HELJ.js";import"./compact-item-B_9_SCKN.js";import"./createContext-D6rklIbE.js";import"./Compact-DIJtAYBO.js";import"./_getTag-DnrRH4E6.js";import"./styleChecker-C30mMh8o.js";import"./zoom-vw50zkLZ.js";import"./ActionButton-lgohjckQ.js";import"./vnode-DQtmeDXM.js";const gt=""+new URL("logo-DBCYUiWP.png",import.meta.url).href,E={notifications:P([]),unreadCount:P(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 p({limit:o=50,offset:s=0,isRead:f}={}){if(!N().isEmbedded)return E.notifications.value=[],E.unreadCount.value=0,E.notifications.value;const g=await i.sendRaw({type:"notification.list",limit:o,offset:s,isRead:f},15e3),O=G(g);if(O?.success===!1)throw new Error(O.error||"notification.list failed");return E.notifications.value=Array.isArray(O?.notifications)?O.notifications:[],await S(),E.notifications.value}async function S(){if(!N().isEmbedded)return E.unreadCount.value=0,0;const o=await i.sendRaw({type:"notification.unread-count"},1e4),s=G(o);return E.unreadCount.value=Number(s?.count)||0,E.unreadCount.value}async function n(o){if(o==null||o==="")throw new Error("id is required");if(!N().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 g=E.notifications.value.find(O=>O.id===o);g&&(g.is_read=1),await S()}async function _(){if(!N().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 E.notifications.value)f.is_read=1;E.unreadCount.value=0}async function h(o,s=""){if(!N().isEmbedded)throw new Error("桌面通知仅在嵌入式 web-shell 中可用");const f=await i.sendRaw({type:"notification.send-desktop",title:o,body:s},1e4),g=G(f);if(g?.success===!1)throw new Error(g.error||"notification.send-desktop failed")}return{notifications:v(()=>E.notifications.value),unreadCount:v(()=>E.unreadCount.value),refresh:p,refreshUnreadCount:S,markRead:n,markAllRead:_,sendDesktop:h}}const Ot={__name:"NotificationBell",setup(i,{expose:p}){p();const S=P(!1),n=P("all"),_=P(!1),{notifications:h,unreadCount:o,refresh:s,markRead:f,markAllRead:g}=re();function O(){j()}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(N().isEmbedded){_.value=!0;try{await s({limit:100})}catch{}finally{_.value=!1}}}async function j(){S.value=!0,await C()}async function D(c){if(!c.is_read)try{await f(c.id)}catch{}}async function r(){try{await g()}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,U=6e4,K=60*U,F=24*K;return R<U?"刚刚":R<K?`${Math.floor(R/U)} 分钟前`:R<F?`${Math.floor(R/K)} 小时前`:new Date(b).toLocaleDateString()}const T={visible:S,filter:n,loading:_,notifications:h,unreadCount:o,refresh:s,markRead:f,markAllRead:g,_onOpenEvent:O,filtered:M,refreshList:C,onOpen:j,onItemClick:D,onMarkAllRead:r,formatTime:w,ref:P,computed:v,onMounted:z,onUnmounted:$,get Empty(){return ke},get BellOutlined(){return de},get ReloadOutlined(){return ge},get useNotifications(){return re},get useShellMode(){return N}};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}},ht={class:"notif-toolbar"},bt={class:"notif-body"},wt={key:2,class:"notif-list"},vt=["onClick"],Lt={class:"notif-row"},St={class:"notif-title"},Ct={class:"notif-time"},Bt={key:0,class:"notif-message"};function Et(i,p,S,n,_,h){const o=k("a-badge"),s=k("a-tooltip"),f=k("a-radio-button"),g=k("a-radio-group"),O=k("a-space"),M=k("a-button"),C=k("a-empty"),j=k("a-spin"),D=k("a-drawer");return y(),L(I,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(D,{open:n.visible,"onUpdate:open":p[1]||(p[1]=r=>n.visible=r),title:"通知中心",placement:"right",width:400,"body-style":{padding:0}},{default:t(()=>[d("div",ht,[e(O,null,{default:t(()=>[e(g,{value:n.filter,"onUpdate:value":p[0]||(p[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(()=>[...p[2]||(p[2]=[l(" 全部已读 ",-1)])]),_:1},8,["disabled"])]),_:1})]),d("div",bt,[!n.loading&&n.filtered.length===0?(y(),A(C,{key:0,description:"暂无通知",image:n.Empty.PRESENTED_IMAGE_SIMPLE,style:{padding:"60px 0"}},null,8,["image"])):n.loading?(y(),A(j,{key:1,style:{display:"block",padding:"60px"}})):(y(),L("ul",wt,[(y(!0),L(I,null,se(n.filtered,r=>(y(),L("li",{key:r.id,class:W(["notif-item",{unread:!r.is_read}]),onClick:w=>n.onItemClick(r)},[d("div",Lt,[d("div",St,a(r.title||r.message||"(无标题)"),1),d("span",Ct,a(n.formatTime(r.created_at)),1)]),r.message&&r.title?(y(),L("div",Bt,a(r.message),1)):m("v-if",!0)],10,vt))),128))]))])]),_:1},8,["open"])],64)}const Tt=Z(Ot,[["render",Et],["__scopeId","data-v-8c1554dd"],["__file","/tmp/cc-web-panel-lKopdB/repo/packages/web-panel/src/components/NotificationBell.vue"]]),At={__name:"MobileBridgeHeaderStatus",setup(i,{expose:p}){p();function S(r){if(!r)return[];try{return JSON.parse(r)}catch{}const w=String(r).split(`
|
|
2
|
-
`),T=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 U=b[1];return!(U>="A"&&U<="Z"||U>="a"&&U<="z")});if(T<0)return[];for(let c=w.length-1;c>=T;c--){const b=w[c].trim();if(/^[\]\}]/.test(b)&&!/^[\]\}][A-Za-z]/.test(b))try{return JSON.parse(w.slice(T,c+1).join(`
|
|
3
|
-
`))}catch{return[]}}return[]}const n=J(),_=H(),h=P([]);let o=null;const s=v(()=>h.value.length),f=v(()=>h.value.filter(r=>M(r)).length),g=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(_.status==="connected")try{const{output:r}=await _.execute("p2p devices --type mobile --json",1e4);h.value=S(r)||[]}catch{}}function j(){n.push("/mobile-bridge")}z(()=>{C(),o=setInterval(C,5e3)}),ee(()=>{o&&(clearInterval(o),o=null)});const D={parseJsonOutput:S,router:n,ws:_,devices:h,get pollTimer(){return o},set pollTimer(r){o=r},totalCount:s,onlineCount:f,iconColor:g,tooltip:O,isOnline:M,refresh:C,onClick:j,ref:P,computed:v,onMounted:z,onBeforeUnmount:ee,get useRouter(){return J},get MobileOutlined(){return ce},get useWsStore(){return H}};return Object.defineProperty(D,"__isScriptSetup",{enumerable:!1,value:!0}),D}},Mt={key:0,class:"mbh-count"};function Rt(i,p,S,n,_,h){const o=k("a-badge"),s=k("a-tooltip");return y(),A(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?(y(),L("span",Mt,a(n.totalCount),1)):m("v-if",!0)],2)]),_:1},8,["count"])]),_:1},8,["title"])}const Pt=Z(At,[["render",Rt],["__scopeId","data-v-e8ef01d6"],["__file","/tmp/cc-web-panel-lKopdB/repo/packages/web-panel/src/components/MobileBridgeHeaderStatus.vue"]]),Y="cc.web-panel.sidebar.openKeys",jt={__name:"AppLayout",setup(i,{expose:p}){p();const S=J(),n=te(),_=H(),h=oe(),{t:o}=ie(),s=N(),f=P(!1),g=window.__CC_CONFIG__||{},O=v(()=>g.mode==="project"),M="v5.0.3.99",C=v(()=>h.current),j=v(()=>h.config.vars["--menu-mode"]),D=v(()=>{const u=n.name?.toLowerCase()||"dashboard";return[{mcptools:"mcp",quickask:"quick-ask",ukeysign:"ukey-sign"}[u]||u]}),r=["g-overview","g-config","g-data","g-advanced","g-enterprise","g-social","g-media","g-extension"];function w(){try{const u=localStorage.getItem(Y);if(u){const B=JSON.parse(u);if(Array.isArray(B))return B.filter(q=>r.includes(q))}}catch{}return[...r]}const T=P(w());ne(T,u=>{try{localStorage.setItem(Y,JSON.stringify(u))}catch{}},{deep:!0});const c=v(()=>_.status),b=v(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[_.status]||"default"),R=v(()=>{const u=`appLayout.footerStatus.${_.status}`,B=o(u);return B===u?o("appLayout.footerStatus.unknown"):B});function U(u){h.setTheme(u)}const{current:K,supported:F,setLocale:Q}=ae();function ue(){const u=F[(F.indexOf(K.value)+1)%F.length];Q(u)}async function X(u){try{const B=await _.sendRaw({type:"window.open",role:u},1e4);if(B?.ok===!1){V.error(`打开失败:${B.error||"未知"}`);return}const q=B?.result??B;q?.reason==="role_reserved"?V.warning("该窗口角色被保留"):q?.reason}catch(B){V.error(`打开桌面窗口失败:${B.message||B}`)}}async function pe(){le.confirm({title:"切换到桌面壳?",content:"回到 V5/V6 桌面壳。完整 electronAPI 表面(UKey 硬件 / 原生对话框 / 系统设置等)会重新可用,但失去 web-panel 的 SPA 体验。保存后需要重启应用才生效。",okText:"切换并重启",cancelText:"取消",centered:!0,async onOk(){try{const u=await _.sendRaw({type:"shell.switch",target:"desktop"},5e3);if(u?.ok===!1)throw new Error(u.error||"shell.switch returned failure");V.loading({content:"正在重启…",duration:0})}catch(u){const B=u instanceof Error?u.message:String(u);V.error("切换失败:"+B)}}})}function ye({key:u}){if(typeof u=="string"&&u.startsWith("desktop:")){X(u);return}S.push({mcp:"/mcp"}[u]||`/${u}`)}z(()=>_.connect());const x={router:S,route:n,ws:_,themeStore:h,t:o,shellMode:s,collapsed:f,cfg:g,isProject:O,PRODUCT_VERSION:M,currentTheme:C,menuTheme:j,selectedKeys:D,ALL_GROUP_KEYS:r,OPEN_KEYS_LS:Y,loadOpenKeys:w,openKeys:T,wsStatus:c,statusBadge:b,statusText:R,setTheme:U,locale:K,SUPPORTED_LOCALES:F,setLocale:Q,toggleLocale:ue,openDesktopWindow:X,switchToDesktopShell:pe,onMenuClick:ye,ref:P,computed:v,onMounted:z,watch:ne,get useRouter(){return J},get useRoute(){return te},get DashboardOutlined(){return _t},get MessageOutlined(){return kt},get RocketOutlined(){return mt},get AppstoreOutlined(){return ft},get ApiOutlined(){return yt},get FolderOutlined(){return pt},get GlobalOutlined(){return ut},get InfoCircleOutlined(){return ct},get ControlOutlined(){return dt},get FileTextOutlined(){return st},get CloudServerOutlined(){return rt},get BookOutlined(){return lt},get BranchesOutlined(){return at},get ClockCircleOutlined(){return it},get ThunderboltOutlined(){return ot},get ApartmentOutlined(){return nt},get SafetyCertificateOutlined(){return tt},get LockOutlined(){return et},get WifiOutlined(){return $e},get CodeOutlined(){return xe},get ProjectOutlined(){return Xe},get WalletOutlined(){return Qe},get TeamOutlined(){return Ze},get BarChartOutlined(){return Ye},get BlockOutlined(){return Je},get CloudUploadOutlined(){return qe},get ReadOutlined(){return He},get KeyOutlined(){return Ge},get VideoCameraOutlined(){return ze},get ShareAltOutlined(){return We},get IdcardOutlined(){return Ve},get UsergroupAddOutlined(){return Fe},get ShoppingOutlined(){return Ke},get SwapOutlined(){return Ie},get AlertOutlined(){return Ne},get SafetyOutlined(){return Ue},get ExperimentOutlined(){return De},get DeploymentUnitOutlined(){return je},get BulbOutlined(){return Pe},get BankOutlined(){return Re},get PartitionOutlined(){return Me},get AuditOutlined(){return Ae},get FileSearchOutlined(){return Te},get TrophyOutlined(){return Ee},get FireOutlined(){return Be},get SearchOutlined(){return Ce},get NumberOutlined(){return Se},get ClusterOutlined(){return Le},get SoundOutlined(){return ve},get DesktopOutlined(){return we},get BellOutlined(){return de},get SyncOutlined(){return be},get MobileOutlined(){return ce},get DatabaseOutlined(){return he},get UnorderedListOutlined(){return Oe},get message(){return V},get Modal(){return le},get useWsStore(){return H},get useThemeStore(){return oe},get THEMES(){return _e},get logoSrc(){return gt},get useShellMode(){return N},get useI18n(){return ie},get useLocale(){return ae},NotificationBell:Tt,MobileBridgeHeaderStatus:Pt};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},Dt=["src"],Ut={key:0,class:"logo-text"},Nt={key:0,class:"mode-banner project"},It={class:"banner-info"},Kt={class:"banner-name"},Ft={class:"banner-sub"},Vt={key:1,class:"mode-banner global"},Wt={class:"banner-name"},zt=["title"],Gt={class:"group-label"},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={key:0,class:"footer-text"},en={class:"header-left"},tn={class:"header-right"},nn={class:"theme-switcher"},on=["data-theme-key","onClick"],an=["data-locale"],ln={class:"lang-switch-label"},rn={class:"version-tag"};function sn(i,p,S,n,_,h){const o=k("a-menu-item"),s=k("a-sub-menu"),f=k("a-menu-divider"),g=k("a-menu"),O=k("a-badge"),M=k("a-layout-sider"),C=k("a-tooltip"),j=k("a-tag"),D=k("a-layout-header"),r=k("router-view"),w=k("a-layout-content"),T=k("a-layout");return y(),A(T,{class:"app-root"},{default:t(()=>[m(" ── Sidebar ─────────────────────────────────────────────────── "),e(M,{collapsed:n.collapsed,"onUpdate:collapsed":p[2]||(p[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,Dt),n.collapsed?m("v-if",!0):(y(),L("span",Ut,"ChainlessChain"))],2),m(" Mode banner "),n.collapsed?(y(),L("div",{key:1,class:"mode-icon-sm",title:n.isProject?n.cfg.projectName:i.$t("appLayout.scope.global")},[n.isProject?(y(),A(n.FolderOutlined,{key:0,style:{color:"#1677ff"}})):(y(),A(n.GlobalOutlined,{key:1,style:{color:"#722ed1"}}))],8,zt)):(y(),L(I,{key:0},[n.isProject?(y(),L("div",Nt,[e(n.FolderOutlined,{class:"banner-icon"}),d("div",It,[d("div",Kt,a(n.cfg.projectName||i.$t("appLayout.scope.fallbackProject")),1),d("div",Ft,a(i.$t("appLayout.scope.projectPanel")),1)])])):(y(),L("div",Vt,[e(n.GlobalOutlined,{class:"banner-icon"}),d("span",Wt,a(i.$t("appLayout.scope.global")),1)]))],64)),m(" Navigation "),e(g,{selectedKeys:n.selectedKeys,"onUpdate:selectedKeys":p[0]||(p[0]=c=>n.selectedKeys=c),openKeys:n.openKeys,"onUpdate:openKeys":p[1]||(p[1]=c=>n.openKeys=c),theme:n.menuTheme,mode:"inline","inline-collapsed":n.collapsed,class:"side-menu",onClick:n.onMenuClick},{default:t(()=>[n.collapsed?(y(),L(I,{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(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?(y(),L(I,{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)):(y(),L(I,{key:0},[e(s,{key:"g-overview"},{title:t(()=>[d("span",Gt,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",Ht,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",qt,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(()=>[p[3]||(p[3]=l("个人数据中台",-1))]),_:1}),e(o,{key:"personal-data-hub/browser"},{icon:t(()=>[e(n.UnorderedListOutlined)]),default:t(()=>[p[4]||(p[4]=l("数据浏览器",-1))]),_:1}),e(o,{key:"family-guard"},{icon:t(()=>[e(n.TeamOutlined)]),default:t(()=>[p[5]||(p[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})]),_:1}),e(s,{key:"g-advanced"},{title:t(()=>[d("span",Jt,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:"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",Yt,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",Zt,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",Qt,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?(y(),A(s,{key:"g-desktop"},{title:t(()=>[d("span",xt,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):(y(),L("span",$t,a(n.statusText),1))],2)]),_:1},8,["collapsed"]),m(" ── Main area ───────────────────────────────────────────────── "),e(T,{class:"main-area"},{default:t(()=>[m(" Header "),e(D,{class:"app-header"},{default:t(()=>[d("div",en,[d("div",{class:W(["scope-tag",n.isProject?"project":"global"])},[(y(),A(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?(y(),A(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",tn,[m(" Theme switcher "),d("div",nn,[(y(!0),L(I,null,se(n.THEMES,(c,b)=>(y(),A(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,on)]),_: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",ln,a(i.$t("language.switch")),1)],8,an)]),_: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?(y(),A(n.NotificationBell,{key:0})):m("v-if",!0),d("span",rn,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?(y(),A(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(j,{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",sn],["__scopeId","data-v-6f6437fc"],["__file","/tmp/cc-web-panel-lKopdB/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 S,U as n,R as a,S as y,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-BvqAck49.js";import{_ as k}from"./index-GzuCTHVZ.js";import"./icons-DP3uiYxy.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),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:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},M={class:"meta"},R={class:"actor"},V={class:"time"},q={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",T,[n("div",M,[n("span",R,a(r.actorLabel),1),n("span",V,a(r.formattedTime),1)]),n("div",q,a(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-lKopdB/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 f,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 B,b as w,P as m,Q as v,$ as N,F as T,Z as F}from"./vendor-BvqAck49.js";import{u as A,_ as J}from"./index-GzuCTHVZ.js";import{u as V}from"./chat-BR-WxnCQ.js";import{s as W}from"./community-parser-CO25nZFt.js";import{ad as K,ae as Q,a4 as Z,h as X,a7 as Y,ab as x,a9 as ee,af as te,a8 as se,R as oe}from"./icons-DP3uiYxy.js";function ae(e){const n=W(e);if(!n)return null;try{return JSON.parse(n)}catch{}const c=n.match(/\[[\s\S]*\]|\{[\s\S]*\}/);if(!c)return null;try{return JSON.parse(c[0])}catch{return null}}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),c=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(u=>{u.type==="compression:summary"?P(u.payload?.summary||{}):u.type==="session:start"?c.value.sessionCount=(c.value.sessionCount||0)+1:u.type==="session:end"&&(c.value.sessionCount=Math.max(0,(c.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){c.value.appRunning=i.includes("Desktop app running"),c.value.setupDone=i.includes("Setup completed");const u=i.match(/Edition:\s+(\S+)/i);u&&(c.value.edition=u[1]);const g=i.match(/LLM:\s+(\S+)\s+\(([^)]+)\)/i);if(g)c.value.activeLlm=g[1],c.value.activeModel=g[2];else{const r=i.match(/LLM:\s+(\S+)/i);r&&(c.value.activeLlm=r[1])}}async function D(){const i=A();S(i),n.value=!0;const u={type:"compression-stats",windowMs:d(h.value.windowPreset)};h.value.provider&&(u.provider=h.value.provider),h.value.model&&(u.model=h.value.model);try{const g=await i.sendRaw(u,1e4);P(g.summary||{})}catch{}finally{n.value=!1}}async function p(){const i=A();S(i),e.value=!0,c.value.wsStatus=i.status,t.value="";try{const[u,g]=await Promise.allSettled([i.execute("status",15e3),i.listSessions()]);if(u.status==="fulfilled"){const r=u.value.output;t.value=r.split(`
|
|
2
|
-
`).slice(0,20).join(`
|
|
3
|
-
`),_(r)}g.status==="fulfilled"&&(c.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)&&(c.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&&!c.value.activeLlm&&(c.value.activeLlm=j[1])}}),i.sendRaw({type:"mcp.list_tools"},5e3).then(r=>{const R=(r?.result??r)?.servers;c.value.mcpCount=Array.isArray(R)?R.length:0}).catch(()=>{c.value.mcpCount=0}),await D()}catch{}finally{e.value=!1}}return{loading:e,compressionLoading:n,stats:c,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 c=q(),t=A(),O=V(),h=H(),b=window.__CC_CONFIG__||{},S=w(()=>b.mode==="project"),y="v5.0.3.99",P=w(()=>t.status),d=w(()=>h.loading),_=w(()=>h.statusLog),D=w(()=>h.telemetryFilters),p=w(()=>h.compression),i=w(()=>h.stats),u=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"),c.push("/chat")}U(()=>{h.ensureRuntimeSubscription(t),setTimeout(C,300)}),B(()=>{h.stopRuntimeSubscription()});const M={router:c,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:u,providerEntries:g,modelEntries:r,refresh:C,refreshCompression:R,formatPercent:j,newAgentSession:L,computed:w,onMounted:U,onUnmounted:B,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 V},get useDashboardStore(){return H}};return Object.defineProperty(M,"__isScriptSetup",{enumerable:!1,value:!0}),M}},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"}},fe={class:"stat-header"},ve={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"},Ne={class:"stat-value",style:{color:"#faad14"}},Me={class:"stat-sub"},qe={class:"status-log"},Ue={class:"telemetry-filter"},Be={class:"telemetry-filter-label"},Ve={class:"telemetry-filter"},He={class:"telemetry-filter-label"},Ie={class:"telemetry-filter"},Ge={class:"telemetry-filter-label"},Je={class:"telemetry-card"},We={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"},ft={class:"telemetry-section-title"},vt={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,c,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"),u=k("a-descriptions-item"),g=k("a-descriptions");return m(),f("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(()=>[v(" "+a(e.$t("dashboard.refresh")),1)]),_:1},8,["loading"])]),t.isProject?(m(),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(()=>[v(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",fe,[l("span",ve,a(e.$t("dashboard.stats.wsGateway")),1),s(P,{status:t.wsStatus==="connected"?"success":"error"},null,8,["status"])]),l("div",{class:"stat-value",style:N({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:N({color:t.stats.appRunning?"#52c41a":"#888"})},null,8,["style"])]),l("div",{class:"stat-value",style:N({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",Ne,a(t.stats.noteCount??"—"),1),l("div",Me,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(()=>[v(" "+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(()=>[v(" "+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(()=>[v(" "+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(()=>[v(" "+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(()=>[v(" "+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(()=>[v(" "+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(()=>[v(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",Be,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(()=>[v(a(e.$t("dashboard.telemetry.windowAll")),1)]),_:1}),s(p,{value:"1h"},{default:o(()=>[v(a(e.$t("dashboard.telemetry.window1h")),1)]),_:1}),s(p,{value:"24h"},{default:o(()=>[v(a(e.$t("dashboard.telemetry.window24h")),1)]),_:1}),s(p,{value:"7d"},{default:o(()=>[v(a(e.$t("dashboard.telemetry.window7d")),1)]),_:1})]),_:1},8,["value"])])]),_:1}),s(d,{xs:24,md:8},{default:o(()=>[l("div",Ve,[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(()=>[v(a(e.$t("dashboard.telemetry.providerAll")),1)]),_:1}),(m(!0),f(T,null,F(t.providerEntries,r=>(m(),z(p,{key:r.key,value:r.key},{default:o(()=>[v(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(()=>[v(a(e.$t("dashboard.telemetry.modelAll")),1)]),_:1}),(m(!0),f(T,null,F(t.modelEntries,r=>(m(),z(p,{key:r.key,value:r.key},{default:o(()=>[v(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",Je,[l("div",We,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?(m(),f("div",rt,a(e.$t("dashboard.telemetry.strategyEmpty")),1)):(m(),f("div",nt,[(m(!0),f(T,null,F(t.compression.strategyDistribution.slice(0,6),r=>(m(),f("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?(m(),f("div",ct,a(e.$t("dashboard.telemetry.variantEmpty")),1)):(m(),f("div",ut,[(m(!0),f(T,null,F(t.variantEntries,([r,C])=>(m(),f("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",ft,a(e.$t("dashboard.telemetry.providerSlice")),1),t.providerEntries.length===0?(m(),f("div",vt,a(e.$t("dashboard.telemetry.providerEmpty")),1)):(m(),f("div",ht,[(m(!0),f(T,null,F(t.providerEntries.slice(0,6),r=>(m(),f("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?(m(),f("div",pt,a(e.$t("dashboard.telemetry.modelEmpty")),1)):(m(),f("div",_t,[(m(!0),f(T,null,F(t.modelEntries.slice(0,6),r=>(m(),f("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(u,{label:e.$t("dashboard.info.panelMode")},{default:o(()=>[s(S,{color:t.isProject?"blue":"purple"},{default:o(()=>[v(a(t.isProject?e.$t("dashboard.info.modeProject"):e.$t("dashboard.info.modeGlobal")),1)]),_:1},8,["color"])]),_:1},8,["label"]),t.isProject?(m(),z(u,{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?(m(),z(u,{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(u,{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(u,{label:e.$t("dashboard.info.auth")},{default:o(()=>[s(S,{color:t.cfg.wsToken?"green":"default",style:{"font-size":"11px"}},{default:o(()=>[v(a(t.cfg.wsToken?e.$t("dashboard.info.authEnabled"):e.$t("dashboard.info.authDisabled")),1)]),_:1},8,["color"])]),_:1},8,["label"]),s(u,{label:e.$t("dashboard.info.version")},{default:o(()=>[l("span",St,a(t.PRODUCT_VERSION),1)]),_:1},8,["label"])]),_:1})]),_:1},8,["title"])])}const Et=J(re,[["render",Ct],["__scopeId","data-v-7f773d42"],["__file","/tmp/cc-web-panel-lKopdB/repo/packages/web-panel/src/views/Dashboard.vue"]]);export{Et as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as w,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as o}from"./vendor-BvqAck49.js";import{_ as S}from"./index-GzuCTHVZ.js";import"./icons-DP3uiYxy.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const a=p,e=o(()=>a.event.content||{}),d=o(()=>a.event.extra||{}),m=o(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=o(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=o(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=o(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=o(()=>e.value.status||e.value.state),b=o(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=o(()=>{if(!a.event.occurredAt)return"";const t=new Date(a.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:a,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:o};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},B={class:"val"},R={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},F={class:"val mono"},K={key:1,class:"row"};function M(p,r,a,e,d,m){const c=w("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(a.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(a.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",B,n(e.merchantText),1)]),s("div",R,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",F,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",K,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const J=S(k,[["render",M],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-lKopdB/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{J as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as I,b as w,r as b,I as m,J as y,U as a,R as g,c as i,K as u,V as h,F as C,Z as L,N as O,o as M,P as p,Q as S,S as R}from"./vendor-BvqAck49.js";import{u as B,_ as E}from"./index-GzuCTHVZ.js";import{u as N}from"./useShellMode-CgR0wCYM.js";import{p as P}from"./parsers-UEvh_ShA.js";import{u as z}from"./chat-BR-WxnCQ.js";import{a9 as V,ap as j,R as q}from"./icons-DP3uiYxy.js";const A=I("skills",()=>{const _=b(!1),t=b([]),n=b(""),e=b("all"),k=w(()=>{const o=new Set(["all"]);return t.value.forEach(l=>{l.category&&o.add(l.category),l.executionMode&&o.add(l.executionMode)}),[...o]}),v=w(()=>{let o=t.value;if(e.value!=="all"&&(o=o.filter(l=>l.category===e.value||l.executionMode===e.value)),n.value){const l=n.value.toLowerCase();o=o.filter(d=>d.name?.toLowerCase().includes(l)||d.description?.toLowerCase().includes(l)||d.title?.toLowerCase().includes(l))}return o});async function f(){const o=B();_.value=!0;try{if(N().isEmbedded){const c=await o.sendRaw({type:"skill.list"},2e4);c?.ok&&Array.isArray(c.result?.skills)?t.value=c.result.skills:(console.error("skill.list custom topic failed:",c?.error),t.value=[]);return}const{output:l}=await o.execute("skill list",2e4),d=P(l);t.value=d}catch(l){console.error("Failed to load skills:",l)}finally{_.value=!1}}return{loading:_,allSkills:t,searchQuery:n,selectedCategory:e,categories:k,filteredSkills:v,loadSkills:f}}),F={__name:"Skills",setup(_,{expose:t}){t();const n=A(),e=z(),k=O(),v=w(()=>n.categories.filter(r=>r!=="all").slice(0,6));function f(r){return{"built-in":"内置","cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合",workspace:"工作区",marketplace:"市场"}[r]||r}function o(r){return{"cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合","built-in":"内置"}[r]||r||"未知"}function l(r){return{"cli-direct":"cyan",agent:"purple","llm-query":"blue",hybrid:"orange","built-in":"green"}[r]||"default"}async function d(r){await e.createSession("agent"),k.push("/chat"),setTimeout(()=>{e.currentSessionId&&e.sendMessage(e.currentSessionId,`/skill run ${r}`)},300)}M(()=>{n.allSkills.length||n.loadSkills()});const c={skillsStore:n,chatStore:e,router:k,displayCategories:v,catLabel:f,modeLabel:o,modeColor:l,runSkill:d,computed:w,onMounted:M,get useRouter(){return O},get ReloadOutlined(){return q},get PlayCircleOutlined(){return j},get AppstoreOutlined(){return V},get useSkillsStore(){return A},get useChatStore(){return z}};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}},Q={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},U={class:"page-sub"},K={style:{display:"flex",gap:"12px","margin-bottom":"20px","flex-wrap":"wrap"}},T={key:0,style:{"text-align":"center",padding:"60px"}},D={class:"skills-grid"},G={style:{display:"flex","justify-content":"space-between","align-items":"flex-start"}},J={style:{flex:"1","min-width":"0"}},W={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px","font-family":"monospace"}},Z={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},H={style:{"margin-left":"12px","flex-shrink":"0"}},X={style:{"margin-top":"10px",display:"flex","justify-content":"flex-end"}},Y={style:{"text-align":"center",padding:"60px",color:"var(--text-muted)"}};function $(_,t,n,e,k,v){const f=m("a-button"),o=m("a-input-search"),l=m("a-radio-button"),d=m("a-radio-group"),c=m("a-spin"),r=m("a-tag"),x=m("a-card");return p(),y("div",null,[a("div",Q,[a("div",null,[t[3]||(t[3]=a("h2",{class:"page-title"},"技能管理",-1)),a("p",U,g(e.skillsStore.allSkills.length)+" 个可用技能",1)]),i(f,{type:"primary",ghost:"",loading:e.skillsStore.loading,onClick:t[0]||(t[0]=s=>e.skillsStore.loadSkills())},{icon:u(()=>[i(e.ReloadOutlined)]),default:u(()=>[t[4]||(t[4]=S(" 刷新 ",-1))]),_:1},8,["loading"])]),h(" Search & Filter "),a("div",K,[i(o,{value:e.skillsStore.searchQuery,"onUpdate:value":t[1]||(t[1]=s=>e.skillsStore.searchQuery=s),placeholder:"搜索技能名称或描述...",style:{width:"300px"},"allow-clear":""},null,8,["value"]),i(d,{value:e.skillsStore.selectedCategory,"onUpdate:value":t[2]||(t[2]=s=>e.skillsStore.selectedCategory=s),"button-style":"solid"},{default:u(()=>[i(l,{value:"all"},{default:u(()=>[...t[5]||(t[5]=[S("全部",-1)])]),_:1}),(p(!0),y(C,null,L(e.displayCategories,s=>(p(),R(l,{key:s,value:s},{default:u(()=>[S(g(e.catLabel(s)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),h(" Loading State "),e.skillsStore.loading?(p(),y("div",T,[i(c,{size:"large"}),t[6]||(t[6]=a("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载技能中...",-1))])):e.skillsStore.filteredSkills.length?(p(),y(C,{key:1},[h(" Skills Grid "),a("div",D,[(p(!0),y(C,null,L(e.skillsStore.filteredSkills,s=>(p(),R(x,{key:s.name,class:"skill-card",size:"small",hoverable:"",style:{background:"var(--bg-card)","border-color":"var(--border-color)",cursor:"default"}},{default:u(()=>[a("div",G,[a("div",J,[a("div",W,g(s.name),1),a("div",Z,g(s.description||"暂无描述"),1)]),a("div",H,[i(r,{color:e.modeColor(s.executionMode),style:{"font-size":"10px"}},{default:u(()=>[S(g(e.modeLabel(s.executionMode)),1)]),_:2},1032,["color"])])]),a("div",X,[i(f,{size:"small",type:"primary",ghost:"",onClick:ee=>e.runSkill(s.name)},{icon:u(()=>[i(e.PlayCircleOutlined)]),default:u(()=>[t[7]||(t[7]=S(" 运行 ",-1))]),_:1},8,["onClick"])])]),_:2},1024))),128))])],2112)):(p(),y(C,{key:2},[h(" Empty State "),a("div",Y,[i(e.AppstoreOutlined,{style:{"font-size":"48px","margin-bottom":"16px",display:"block"}}),a("div",null,g(e.skillsStore.allSkills.length?"没有匹配的技能":"点击刷新加载技能列表"),1)])],2112))])}const ie=E(F,[["render",$],["__scopeId","data-v-d64d43f5"],["__file","/tmp/cc-web-panel-lKopdB/repo/packages/web-panel/src/views/Skills.vue"]]);export{ie as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{O as r}from"./index-GzuCTHVZ.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-6-x7tEYq.js";import{U as t}from"./index-GzuCTHVZ.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-B-eRSLvd.js";import"./useFlexGapSupport-f7y2Qlzs.js";import"./styleChecker-C30mMh8o.js";import"./index-D6KqyxG1.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-D1X6tYlj.js";import{U as t}from"./index-GzuCTHVZ.js";import"./vendor-BvqAck49.js";import"./index-D6KqyxG1.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};
|