chainlesschain 0.162.93 → 0.162.95
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/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BB5mADdi.js → AIOps-DLvvkb9x.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BcIs1DhT.js → ActionButton-BxhQTwqd.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CNhfaUbF.js → Analytics-C4oUXzhG.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-D1T07CY4.js → AppLayout-CjzKJdv3.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-Et29_1F4.js → Audit-B-MrugUs.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B0ggFwOy.js → Backup-ecIfEpIZ.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-ChTsFhxU.js → BaseInput-BUcSfWnx.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-H5DMwE1E.js → Chat-DIc1n_Lk.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CBQYVCUs.js → ChatBubbleRenderer-BGzg7oVA.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DBsH3Plc.js → Checkbox-BQ3Ueff-.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-gGtw6sXf.js → Codegen-CvSGLnqE.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Df317HUo.js → Col-Br9IXZcE.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CSERdOno.js → Community-tPuLOf0r.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-D31wUdGx.js → Compact-vMWH73BE.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-92p7-fAe.js → Compliance-Ct9z699x.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-B_HJ_3fc.js → Cowork-Bxs1kL1y.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DIAgns-d.js → Cron-QEpr2k4U.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain--pT2fZrx.js → Crosschain-u4xbUw6O.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BR_apx67.js → DID-DXTEvyrW.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CIv6YbX3.js → Dashboard-C4pZgzkg.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BByKNFqx.js → Dropdown-LRuqREGe.js} +1 -1
- package/src/assets/web-panel/assets/EmailListRenderer-D7XI1yBM.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CA9WH0R8.js → FamilyGuardDashboard-3y_SuAMQ.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CnOtOrN0.js → Federation-DbjbJJCW.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CW4kzO3J.js → FormItemContext-WPpMZcUw.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CUVA-qrZ.js → GenericCardRenderer-nNT9Tn4E.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Dl9HG9Yo.js → Git-DqDaVzwV.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BgieRKC3.js → Governance-BquBZpcg.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-55hVpHm_.js → Inference-RcPPYijs.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BCSm8nT7.js → KnowledgeGraph-ByXfZV13.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DPR2qyoe.js → Logs-CHT3DUcq.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-DSfYHaLe.js → Marketplace-Bi0HJ9pN.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DvP_EW02.js → McpTools-QCBxPRRc.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-vpNLjkQh.js → Memory-D4RlxGXn.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DXT2hsiu.js → MobileBridge-CU_PV7e-.js} +2 -2
- package/src/assets/web-panel/assets/{MobileProjects-wh6wAgGH.js → MobileProjects-c1CMFD8z.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-hLUm4hEi.js → Mtc-BezDB1-s.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-DapBAJjs.js → MtcAudit-CgLpiHpE.js} +6 -6
- package/src/assets/web-panel/assets/{Multisig-hQs0FE-E.js → Multisig-vx6bz-bA.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-JHOgd9cA.js → NLProgramming-CGOagg3-.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CRF8S0xK.js → Notes-BcuDGYRS.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-VYaLm62h.js → NotificationSettings-ZAGCDUpc.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-PNYP-hFh.js → OrderTableRenderer-B5onE0eX.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DnrXiOjr.js → Organization-y_y20-5Y.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-y0VkBEmD.js → Overflow-BEICS31D.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-jK93QK2m.js → P2P-D_WRMzh4.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-C8f5NbbI.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-6u2dj6z7.js → Permissions-3aqCc_4f.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-E0j19ibV.js → PersonalDataHub-DT3R9g9Y.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-2YSzaqHA.js → Pipeline-MiMWIhw0.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-jhYDq4eK.js → Privacy-C3JsLuDa.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-C4UBpmgK.js → ProjectInit-EhHVi1ff.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-B-BYxXeT.js → ProjectSettings-D_dNEA37.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Dn-wcIfk.js → Projects-CXydUXp8.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-B9oU5w2Y.js → Providers-CPEhi2iZ.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BSEAjKKg.js → QuickAsk-BFQpMleX.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-B2G2qN0o.js → Recommend-DzbovRC8.js} +1 -1
- package/src/assets/web-panel/assets/Reputation-DoBeV3TD.js +1 -0
- package/src/assets/web-panel/assets/{Row-CfFRxFir.js → Row-DthhwX_B.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Cr7P2tEV.js → RssFeed-Dsf5U0lP.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DU23Ncv0.js → Search-CJPB8kKl.js} +1 -1
- package/src/assets/web-panel/assets/{Security-XlP_XKyJ.js → Security-DI9MfpdD.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CvmT7pHE.js → Services-BdG0TFGf.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-r38WJidJ.js → Skeleton-DSYazY_B.js} +1 -1
- package/src/assets/web-panel/assets/Skills-BD309VTT.js +1 -0
- package/src/assets/web-panel/assets/{Sla-D4EOWYSw.js → Sla-CaUlw4_6.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-COVO-nuO.js → SpeechSettings-CZAPkR7H.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CFworQPJ.js → SyncSettings-CFRSowN3.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-Di8EOluc.js +1 -0
- package/src/assets/web-panel/assets/{Templates-CXcol1Sm.js → Templates-B5FTziwi.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DthNkjQO.js → Tenant-Dj3XYfBg.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-CznH_rJT.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-Dd9CmQ-l.js → TimelineRenderer-DTHzaXPt.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DoV9Eaxw.js → Tokens-Bo56nuML.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-t0b7L2h7.js → Trigger-pyVUVBwb.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-fXDFZevl.js → Trust-Cp7jMkKN.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-c7zmwDuv.js → UkeySign-aPcZCdpz.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-AxUsMrpY.js → VideoEditing-DAv5j--w.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BB6Hkf9D.js → Wallet-DRhK7IDR.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-JBl4_qBv.js → WebAuthn-B2yQJuq8.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BMOyglO4.js → WorkflowEditor-D98DhR54.js} +1 -1
- package/src/assets/web-panel/assets/{chat-ClEx1qbW.js → chat-BXrRNi8C.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DBawfCLx.js → colors-jQ94T_qn.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BZff7uOC.js → compact-item-KqUJLlF2.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-pWYC3gCE.js → createContext-DxM3zuQW.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Bo1r5_zX.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-lX6sY5PY.js → hasIn-BGm946KV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dm_BVdZG.js → index-1P0sXNhG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdXLG_Lh.js → index-B-2HpfWo.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRhurdyB.js → index-B4b7KjRq.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2m7AQfe.js → index-BAPk6ntc.js} +1 -1
- package/src/assets/web-panel/assets/index-BCU6dVQ-.js +1 -0
- package/src/assets/web-panel/assets/{index-OYqduj3d.js → index-BGjCjsf1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdKd25BC.js → index-BMp41Q1Y.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dt3yAuCK.js → index-BXMZLfd8.js} +1 -1
- package/src/assets/web-panel/assets/{index-5ER-NP_g.js → index-BaU_fSK7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYgqlm3l.js → index-BbS0cBU9.js} +1 -1
- package/src/assets/web-panel/assets/{index-oETPgXwU.js → index-BnEZfi5D.js} +1 -1
- package/src/assets/web-panel/assets/{index-C6QoSIPt.js → index-C5NQai7O.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkUBHiXd.js → index-C7Z2m28C.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0xNvq3Z.js → index-C7sBLech.js} +1 -1
- package/src/assets/web-panel/assets/{index-DH58L6nn.js → index-CbQvgx2e.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd3KxxFO.js → index-Ce-YoL4x.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dj-c7GTQ.js → index-CfE3jxrT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE0RpNJf.js → index-CghRL1dh.js} +1 -1
- package/src/assets/web-panel/assets/{index-Oirvb-h0.js → index-CreXAr5Y.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0cwx_ly.js → index-Crw76vIF.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXBf3t5D.js → index-Cz_SFSix.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7xkvbtG.js → index-D1VWL6Lc.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bxy05j6q.js → index-DOYcemym.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bvcasgi2.js → index-DRzsaWQy.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bp4RaoTi.js → index-DSzb9VOG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DQTfwMek.js → index-DTUs9t5F.js} +1 -1
- package/src/assets/web-panel/assets/{index-oK90a36q.js → index-DWcd5zDG.js} +3 -3
- package/src/assets/web-panel/assets/{index-Cewjdty4.js → index-DZMzj4ay.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4tHr9Y9.js → index-DZpVYD4j.js} +1 -1
- package/src/assets/web-panel/assets/{index-E7dpMseg.js → index-DboUBf6R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEc3MwP8.js → index-Dgzw6eKr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXBvWyps.js → index-Dib0FsTT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DPXnMie3.js → index-FSYz5aww.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdXWNqWZ.js → index-LWTZAud0.js} +1 -1
- package/src/assets/web-panel/assets/index-N_oOFphx.js +1 -0
- package/src/assets/web-panel/assets/{index-mBBrUDzF.js → index-T4UJiTi3.js} +1 -1
- package/src/assets/web-panel/assets/{index-F4__gs9X.js → index-aOLXuHpG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CI6hB8lg.js → index-mZNLT2SP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLqR3qaE.js → index-yavsyHif.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BTUpF0QI.js → initDefaultProps-BDoZJI7g.js} +1 -1
- package/src/assets/web-panel/assets/{motion-2WeVnnEL.js → motion-sceLjgp-.js} +1 -1
- package/src/assets/web-panel/assets/{move-WjKqLduO.js → move-CTWQpFa7.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DnFKewM5.js → omit-dr-NCrHZ.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-C6Y6tV6C.js → pickAttrs-DK-GX_Z2.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-5GZUx8Lr.js → placementArrow-BIPf--18.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DGmwHltc.js → responsiveObserve-BzrWT5tV.js} +1 -1
- package/src/assets/web-panel/assets/{slide-RbVe2IlW.js → slide-D5XhxlET.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CqyCtZXh.js → statusUtils-6DI-k-9E.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-D4lnP6aI.js → styleChecker-DMw-eyn9.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DiMKO4Xv.js → useFlexGapSupport-D4oVdliM.js} +1 -1
- package/src/assets/web-panel/assets/{useFs--HqUmdpU.js → useFs-D3PPZnvy.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-4h3Apiwr.js → usePersonalDataHub-Gh5ba4KP.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BKpoqKhe.js → vnode-CVEM1u4x.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-D1RKjeeJ.js → zoom-ClT_-9RZ.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/pdh.js +162 -0
- package/src/harness/mcp-client.js +19 -2
- package/src/harness/mock-llm-provider.js +14 -0
- package/src/index.js +2 -0
- package/src/lib/claude-code-bridge.js +14 -2
- package/src/lib/file-checkpoint.js +30 -4
- package/src/lib/pdh-bridge.js +266 -0
- package/src/lib/repl-completer.js +5 -1
- package/src/lib/session-tail.js +6 -1
- package/src/lib/skill-mcp.js +10 -4
- package/src/repl/agent-repl.js +13 -6
- package/src/runtime/agent-core.js +25 -0
- package/src/runtime/headless-runner.js +39 -5
- package/src/runtime/headless-stream.js +92 -1
- package/src/runtime/mcp-config.js +104 -3
- package/src/assets/web-panel/assets/EmailListRenderer-DKCmhw1W.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-BITZbGtU.js +0 -7
- package/src/assets/web-panel/assets/Reputation-cdXZrYdH.js +0 -1
- package/src/assets/web-panel/assets/Skills-Bd49FHct.js +0 -1
- package/src/assets/web-panel/assets/Tasks-mWQgh-Xq.js +0 -1
- package/src/assets/web-panel/assets/Terminal-BuX3TG_s.js +0 -3
- package/src/assets/web-panel/assets/devWarning-B1b-Rehg.js +0 -1
- package/src/assets/web-panel/assets/index-Bv1uJXTd.js +0 -1
- package/src/assets/web-panel/assets/index-DJYUttUZ.js +0 -1
|
@@ -102,6 +102,18 @@ export function parseInputEvent(line) {
|
|
|
102
102
|
if (!obj.id) return null;
|
|
103
103
|
return { approval: { id: String(obj.id), approve: obj.approve === true } };
|
|
104
104
|
}
|
|
105
|
+
// Answer to an ask_user_question (panel QuickPick for interactive questions):
|
|
106
|
+
// {"type":"answer","id":"q-1","answer":<string|string[]|null>}
|
|
107
|
+
// A null/absent answer cancels (handler → user_timeout, model proceeds).
|
|
108
|
+
if (obj && typeof obj === "object" && obj.type === "answer") {
|
|
109
|
+
if (!obj.id) return null;
|
|
110
|
+
return {
|
|
111
|
+
answer: {
|
|
112
|
+
id: String(obj.id),
|
|
113
|
+
value: obj.answer === undefined ? null : obj.answer,
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
105
117
|
const msg = obj && typeof obj === "object" ? obj.message || obj : {};
|
|
106
118
|
let content = msg.content ?? obj.text ?? obj.prompt;
|
|
107
119
|
if (Array.isArray(content)) {
|
|
@@ -147,14 +159,24 @@ export function parseInputEvent(line) {
|
|
|
147
159
|
*/
|
|
148
160
|
export async function* readJsonLines(input) {
|
|
149
161
|
let buf = "";
|
|
162
|
+
// Reuse ONE streaming decoder across chunks so a multi-byte UTF-8 character
|
|
163
|
+
// (e.g. a 3-byte Chinese char) split across two Buffer chunks is reassembled
|
|
164
|
+
// rather than corrupted. process.stdin yields Buffers with no setEncoding, so
|
|
165
|
+
// a per-chunk `chunk.toString("utf-8")` would turn a split character into
|
|
166
|
+
// U+FFFD replacement chars.
|
|
167
|
+
const decoder = new TextDecoder();
|
|
150
168
|
for await (const chunk of input) {
|
|
151
|
-
buf +=
|
|
169
|
+
buf +=
|
|
170
|
+
typeof chunk === "string"
|
|
171
|
+
? chunk
|
|
172
|
+
: decoder.decode(chunk, { stream: true });
|
|
152
173
|
let idx;
|
|
153
174
|
while ((idx = buf.indexOf("\n")) >= 0) {
|
|
154
175
|
yield buf.slice(0, idx);
|
|
155
176
|
buf = buf.slice(idx + 1);
|
|
156
177
|
}
|
|
157
178
|
}
|
|
179
|
+
buf += decoder.decode(); // flush any bytes held from a final partial char
|
|
158
180
|
if (buf.trim()) yield buf;
|
|
159
181
|
}
|
|
160
182
|
|
|
@@ -404,6 +426,60 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
404
426
|
approvalGate = null;
|
|
405
427
|
}
|
|
406
428
|
|
|
429
|
+
// ── Interactive questions (ask_user_question round-trip; chat-panel UX) ────
|
|
430
|
+
// Same structured pattern as approvals: when the consumer opts in (the IDE
|
|
431
|
+
// panel sets CC_INTERACTIVE_QUESTIONS=1 in the child env), the model's
|
|
432
|
+
// `ask_user_question` tool emits `question_request`, BLOCKS until a
|
|
433
|
+
// {"type":"answer",id,answer} arrives on stdin, and times out gracefully
|
|
434
|
+
// (CC_QUESTION_TIMEOUT_MS, default 180s) — the handler maps the timeout to
|
|
435
|
+
// user_timeout so the model proceeds, never a hard failure. Off by default
|
|
436
|
+
// (env unset / pipes) → agent-core gets no askUser → user_not_reachable, the
|
|
437
|
+
// existing graceful "proceed autonomously" path. Backward-safe: an env var
|
|
438
|
+
// (not a flag) means an old `cc` simply ignores it.
|
|
439
|
+
const interactiveQuestions =
|
|
440
|
+
options.interactiveQuestions === true ||
|
|
441
|
+
process.env.CC_INTERACTIVE_QUESTIONS === "1";
|
|
442
|
+
const pendingQuestions = new Map();
|
|
443
|
+
let questionSeq = 0;
|
|
444
|
+
const questionTimeoutMs =
|
|
445
|
+
Number(process.env.CC_QUESTION_TIMEOUT_MS) > 0
|
|
446
|
+
? Number(process.env.CC_QUESTION_TIMEOUT_MS)
|
|
447
|
+
: 180000;
|
|
448
|
+
const settleQuestion = (id, answer, via) => {
|
|
449
|
+
const p = pendingQuestions.get(id);
|
|
450
|
+
if (!p) return;
|
|
451
|
+
pendingQuestions.delete(id);
|
|
452
|
+
clearTimeout(p.timer);
|
|
453
|
+
emit({ type: "question_resolved", id, via, session_id: sessionId });
|
|
454
|
+
p.resolve(answer);
|
|
455
|
+
};
|
|
456
|
+
const failQuestion = (id, via) => {
|
|
457
|
+
const p = pendingQuestions.get(id);
|
|
458
|
+
if (!p) return;
|
|
459
|
+
pendingQuestions.delete(id);
|
|
460
|
+
clearTimeout(p.timer);
|
|
461
|
+
emit({ type: "question_resolved", id, via, session_id: sessionId });
|
|
462
|
+
const e = new Error(`ask_user_question ${via}`);
|
|
463
|
+
e.code = "USER_TIMEOUT"; // handler → user_timeout (model proceeds, not a failure)
|
|
464
|
+
p.reject(e);
|
|
465
|
+
};
|
|
466
|
+
const interactionAskUser = ({ question, options: qOptions, multiSelect, timeoutMs } = {}) =>
|
|
467
|
+
new Promise((resolve, reject) => {
|
|
468
|
+
const id = `q-${++questionSeq}`;
|
|
469
|
+
const ms = Number(timeoutMs) > 0 ? Number(timeoutMs) : questionTimeoutMs;
|
|
470
|
+
const timer = setTimeout(() => failQuestion(id, "timeout"), ms);
|
|
471
|
+
timer.unref?.();
|
|
472
|
+
pendingQuestions.set(id, { resolve, reject, timer });
|
|
473
|
+
emit({
|
|
474
|
+
type: "question_request",
|
|
475
|
+
id,
|
|
476
|
+
session_id: sessionId,
|
|
477
|
+
question: typeof question === "string" ? question : "",
|
|
478
|
+
options: Array.isArray(qOptions) ? qOptions : null,
|
|
479
|
+
multiSelect: multiSelect === true,
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
|
|
407
483
|
// --output-style (or settings.json `outputStyle`) persona, appended.
|
|
408
484
|
let outputStyleBody = null;
|
|
409
485
|
try {
|
|
@@ -591,6 +667,10 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
591
667
|
// edit reviews via openDiff) route to the structured approval round-trip
|
|
592
668
|
// instead of failing closed. Absent in CI/pipes → unchanged fail-closed.
|
|
593
669
|
permissionConfirm: interactive ? interactiveConfirm : undefined,
|
|
670
|
+
// ask_user_question round-trip (opt-in via CC_INTERACTIVE_QUESTIONS): give
|
|
671
|
+
// the tool handler an askUser that emits question_request + blocks on stdin.
|
|
672
|
+
// Absent → agent-core returns user_not_reachable (graceful proceed).
|
|
673
|
+
interaction: interactiveQuestions ? { askUser: interactionAskUser } : undefined,
|
|
594
674
|
prepareCall: goalPrepareCallFn,
|
|
595
675
|
// --mcp-config wiring (tool defs + dispatch map + live client).
|
|
596
676
|
mcpClient: mcp?.mcpClient || null,
|
|
@@ -684,6 +764,13 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
684
764
|
);
|
|
685
765
|
continue;
|
|
686
766
|
}
|
|
767
|
+
if (parsed.answer) {
|
|
768
|
+
// Answers settle a BLOCKED ask_user_question — never queued. A null
|
|
769
|
+
// value (user cancelled the QuickPick) → user_timeout (model proceeds).
|
|
770
|
+
if (parsed.answer.value == null) failQuestion(parsed.answer.id, "cancelled");
|
|
771
|
+
else settleQuestion(parsed.answer.id, parsed.answer.value, "user-answer");
|
|
772
|
+
continue;
|
|
773
|
+
}
|
|
687
774
|
queue.push(parsed);
|
|
688
775
|
if (wakeQueue) wakeQueue();
|
|
689
776
|
}
|
|
@@ -696,6 +783,10 @@ export async function runAgentHeadlessStream(options = {}, deps = {}) {
|
|
|
696
783
|
for (const id of [...pendingApprovals.keys()]) {
|
|
697
784
|
settleApproval(id, false, "stdin-closed");
|
|
698
785
|
}
|
|
786
|
+
// stdin closed while a question was pending → user_timeout (model proceeds).
|
|
787
|
+
for (const id of [...pendingQuestions.keys()]) {
|
|
788
|
+
failQuestion(id, "stdin-closed");
|
|
789
|
+
}
|
|
699
790
|
if (wakeQueue) wakeQueue();
|
|
700
791
|
})();
|
|
701
792
|
const nextEvent = async () => {
|
|
@@ -23,6 +23,11 @@ import {
|
|
|
23
23
|
ideServerToMcpConfig,
|
|
24
24
|
isInIdeTerminal,
|
|
25
25
|
} from "../lib/ide-bridge.js";
|
|
26
|
+
import {
|
|
27
|
+
discoverPdhServer,
|
|
28
|
+
pdhServerToMcpConfig,
|
|
29
|
+
isInPdhTerminal,
|
|
30
|
+
} from "../lib/pdh-bridge.js";
|
|
26
31
|
|
|
27
32
|
/**
|
|
28
33
|
* Normalize a parsed config object into a `{ name: serverConfig }` map.
|
|
@@ -55,6 +60,31 @@ export function mcpToolName(server, tool) {
|
|
|
55
60
|
return `mcp__${server}__${tool}`;
|
|
56
61
|
}
|
|
57
62
|
|
|
63
|
+
/**
|
|
64
|
+
* When an MCP connect fails with an authentication error (HTTP 401/403, or an
|
|
65
|
+
* explicit Unauthorized/Forbidden) on a URL-based server, return an actionable
|
|
66
|
+
* one-line hint pointing the user at `cc mcp login`. Returns null for non-auth
|
|
67
|
+
* errors or stdio servers (no url). cc's mcp-client throws `HTTP 401: …` /
|
|
68
|
+
* `HTTP 403: …` from its transport on these — the common path for an MCP server
|
|
69
|
+
* that requires OAuth but has no stored token (Claude-Code 2.1.183 surfaced the
|
|
70
|
+
* same auth-required class; cc already exposes no tools from such a server, so
|
|
71
|
+
* the residual gap was the missing actionable guidance).
|
|
72
|
+
*
|
|
73
|
+
* @param {string|undefined} url the server's `url` (stdio servers pass none)
|
|
74
|
+
* @param {string} errMessage the thrown connect error message
|
|
75
|
+
* @returns {string|null}
|
|
76
|
+
*/
|
|
77
|
+
export function mcpAuthHint(url, errMessage) {
|
|
78
|
+
if (!url) return null;
|
|
79
|
+
const m = String(errMessage || "");
|
|
80
|
+
const isAuth =
|
|
81
|
+
/\bHTTP\s*40[13]\b/i.test(m) ||
|
|
82
|
+
/\bunauthor/i.test(m) ||
|
|
83
|
+
/\bforbidden\b/i.test(m);
|
|
84
|
+
if (!isAuth) return null;
|
|
85
|
+
return ` → "${url}" requires authentication; run: cc mcp login ${url}\n`;
|
|
86
|
+
}
|
|
87
|
+
|
|
58
88
|
/**
|
|
59
89
|
* Connect the given servers and build the agent-loop wiring. Connection
|
|
60
90
|
* failures are reported (writeErr) but never abort the run — a broken server
|
|
@@ -126,12 +156,26 @@ export async function setupMcpFromConfig(servers, deps = {}) {
|
|
|
126
156
|
try {
|
|
127
157
|
res = await mcpClient.connect(name, connectCfg);
|
|
128
158
|
} catch (err) {
|
|
129
|
-
|
|
159
|
+
let line = ` mcp: failed to connect "${name}": ${err.message}\n`;
|
|
160
|
+
const hint = mcpAuthHint(cfg.url, err.message);
|
|
161
|
+
if (hint) line += hint;
|
|
162
|
+
writeErr(line);
|
|
130
163
|
continue;
|
|
131
164
|
}
|
|
132
165
|
const tools = Array.isArray(res?.tools) ? res.tools : [];
|
|
133
166
|
const resources = Array.isArray(res?.resources) ? res.resources : [];
|
|
134
167
|
const prompts = Array.isArray(res?.prompts) ? res.prompts : [];
|
|
168
|
+
// A server can connect (initialize OK) yet have its tools/list fail — the
|
|
169
|
+
// mcp-client surfaces that as `res.toolsError` (Claude-Code 2.1.181
|
|
170
|
+
// "Connected · tools fetch failed"). Don't let it pass as a silent
|
|
171
|
+
// "0 tools": report it, and if the fetch failed on auth (401/403), reuse the
|
|
172
|
+
// same actionable `cc mcp login` hint as the connect-failure path.
|
|
173
|
+
if (res?.toolsError) {
|
|
174
|
+
let line = ` mcp: "${name}" connected but tools fetch failed: ${res.toolsError}\n`;
|
|
175
|
+
const hint = mcpAuthHint(cfg.url, res.toolsError);
|
|
176
|
+
if (hint) line += hint;
|
|
177
|
+
writeErr(line);
|
|
178
|
+
}
|
|
135
179
|
connected.push({
|
|
136
180
|
server: name,
|
|
137
181
|
tools: tools.length,
|
|
@@ -377,6 +421,48 @@ export async function loadIdeMcp(opts = {}, deps = {}) {
|
|
|
377
421
|
return out;
|
|
378
422
|
}
|
|
379
423
|
|
|
424
|
+
/**
|
|
425
|
+
* Discover a running PDH bridge (the Android app's device-capability MCP server)
|
|
426
|
+
* and connect it as the reserved server `pdh`. Best-effort: returns `deps.into`
|
|
427
|
+
* (or null) on nothing found / bad config, never throws. An explicit user
|
|
428
|
+
* registration of a server named `pdh` wins — PDH auto-discovery yields with a
|
|
429
|
+
* one-line warning. Reserved name `pdh` → tools `mcp__pdh__*`.
|
|
430
|
+
*
|
|
431
|
+
* Mirrors loadIdeMcp, but PDH has no workspace concept (a device has one
|
|
432
|
+
* server): env CHAINLESSCHAIN_PDH_PORT fast-path, else the newest live lock.
|
|
433
|
+
*
|
|
434
|
+
* @param {object} opts { env?, force? }
|
|
435
|
+
* @param {object} [deps] { writeErr, into, discoverPdhServer, pdhServerToMcpConfig }
|
|
436
|
+
*/
|
|
437
|
+
export async function loadPdhMcp(opts = {}, deps = {}) {
|
|
438
|
+
const discover = deps.discoverPdhServer || discoverPdhServer;
|
|
439
|
+
const toCfg = deps.pdhServerToMcpConfig || pdhServerToMcpConfig;
|
|
440
|
+
const lock = discover({ env: opts.env, force: opts.force === true });
|
|
441
|
+
if (!lock) return deps.into || null;
|
|
442
|
+
if (deps.into?.mcpClient?.servers?.has?.("pdh")) {
|
|
443
|
+
(deps.writeErr || (() => {}))(
|
|
444
|
+
` pdh: server "pdh" already registered explicitly — ` +
|
|
445
|
+
`skipping PDH auto-discovery\n`,
|
|
446
|
+
);
|
|
447
|
+
return deps.into;
|
|
448
|
+
}
|
|
449
|
+
const cfg = toCfg(lock);
|
|
450
|
+
if (!cfg) return deps.into || null;
|
|
451
|
+
const out = await setupMcpFromConfig({ pdh: cfg }, deps);
|
|
452
|
+
// Hot reconnect: the app restarts its bridge on a NEW port + token (process
|
|
453
|
+
// restart / sentinel re-extract). Register a reconnector so a failed
|
|
454
|
+
// mcp__pdh__* call re-scans the lockfiles mid-session and retries — the stale
|
|
455
|
+
// CHAINLESSCHAIN_PDH_PORT no longer matches a live lock, so discovery falls
|
|
456
|
+
// through to the newest live lock (exactly the restarted instance).
|
|
457
|
+
if (out?.mcpClient?.setReconnector) {
|
|
458
|
+
out.mcpClient.setReconnector("pdh", () => {
|
|
459
|
+
const fresh = discover({ env: opts.env, force: opts.force === true });
|
|
460
|
+
return fresh ? toCfg(fresh) : null;
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
return out;
|
|
464
|
+
}
|
|
465
|
+
|
|
380
466
|
/**
|
|
381
467
|
* Discover + connect a project-scoped `.mcp.json` (Claude-Code parity). Reads a
|
|
382
468
|
* `.mcp.json` from the git project root (walked up from cwd, same as the
|
|
@@ -450,14 +536,15 @@ export async function loadProjectMcp(opts = {}, deps = {}) {
|
|
|
450
536
|
* IDE discovery: default ON only inside an IDE integrated terminal; `ide:true`
|
|
451
537
|
* (`--ide`) forces it; `ide:false` (`--no-ide`) disables it.
|
|
452
538
|
*
|
|
453
|
-
* @param {object} args { mcpConfigPath?, db?, includeRegistered=true, allRegistered=false, ide?, cwd?, env? }
|
|
454
|
-
* @param {object} [deps] { writeErr, loadMcpConfig, loadRegisteredMcp, loadIdeMcp, isInIdeTerminal }
|
|
539
|
+
* @param {object} args { mcpConfigPath?, db?, includeRegistered=true, allRegistered=false, ide?, pdh?, cwd?, env? }
|
|
540
|
+
* @param {object} [deps] { writeErr, loadMcpConfig, loadRegisteredMcp, loadIdeMcp, loadPdhMcp, isInIdeTerminal, isInPdhTerminal }
|
|
455
541
|
*/
|
|
456
542
|
export async function resolveAgentMcp(args = {}, deps = {}) {
|
|
457
543
|
const doFile = deps.loadMcpConfig || loadMcpConfig;
|
|
458
544
|
const doReg = deps.loadRegisteredMcp || loadRegisteredMcp;
|
|
459
545
|
const doProject = deps.loadProjectMcp || loadProjectMcp;
|
|
460
546
|
const doIde = deps.loadIdeMcp || loadIdeMcp;
|
|
547
|
+
const doPdh = deps.loadPdhMcp || loadPdhMcp;
|
|
461
548
|
// Thread the agent session id down to setupMcpFromConfig so spawned stdio MCP
|
|
462
549
|
// servers get CC_SESSION_ID / CLAUDE_CODE_SESSION_ID (Claude-Code parity).
|
|
463
550
|
const fwd =
|
|
@@ -500,6 +587,20 @@ export async function resolveAgentMcp(args = {}, deps = {}) {
|
|
|
500
587
|
);
|
|
501
588
|
}
|
|
502
589
|
}
|
|
590
|
+
// PDH bridge auto-discovery (the Android app's device-capability MCP server).
|
|
591
|
+
// Same gating shape as IDE: default ON only when env-wired (app-spawned cc),
|
|
592
|
+
// `pdh:true` (--pdh) forces it, `pdh:false` (--no-pdh) disables it. Reserved
|
|
593
|
+
// name `pdh` → mcp__pdh__*. Skipped under --strict-mcp-config (returned above).
|
|
594
|
+
if (args.pdh !== false) {
|
|
595
|
+
const env = args.env || process.env;
|
|
596
|
+
const inPdh = (deps.isInPdhTerminal || isInPdhTerminal)(env);
|
|
597
|
+
if (args.pdh === true || inPdh) {
|
|
598
|
+
result = await doPdh(
|
|
599
|
+
{ env, force: args.pdh === true },
|
|
600
|
+
{ ...fwd, into: result || undefined },
|
|
601
|
+
);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
503
604
|
return result;
|
|
504
605
|
}
|
|
505
606
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as C,P as c,J as f,U as r,c as h,_ as k,R as n,V as l,K as d,Q as u,S as g,b as t}from"./vendor-BvqAck49.js";import{_ as j}from"./index-oK90a36q.js";import{aG as w}from"./icons-DP3uiYxy.js";const E={__name:"EmailListRenderer",props:{event:{type:Object,required:!0}},setup(_,{expose:m}){m();const a=_,e=t(()=>a.event.content||{}),i=t(()=>a.event.extra||{}),p=t(()=>e.value.from||e.value.sender||e.value.fromName||a.event.actor||"(未知发件人)"),s=t(()=>e.value.subject||e.value.title||"(无主题)"),y=t(()=>e.value.snippet||e.value.preview||e.value.body?.slice(0,100)||null),b=t(()=>Array.isArray(e.value.attachments)?e.value.attachments.length:typeof e.value.attachmentCount=="number"?e.value.attachmentCount:0),x=t(()=>i.value.category||e.value.category),S=t(()=>e.value.unread===!0),T=t(()=>{if(!a.event.occurredAt)return"";const o=new Date(a.event.occurredAt);return`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")} ${String(o.getHours()).padStart(2,"0")}:${String(o.getMinutes()).padStart(2,"0")}`}),v={props:a,c:e,e:i,fromText:p,subjectText:s,snippetText:y,attachmentCount:b,category:x,isUnread:S,formattedTime:T,computed:t,get MailOutlined(){return w}};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}},M={class:"email-row"},N={class:"left"},O={class:"body"},V={class:"head"},A={class:"from"},B={class:"time"},D={class:"subject"},R={key:0,class:"snippet"},L={class:"meta"};function U(_,m,a,e,i,p){const s=C("a-tag");return c(),f("div",M,[r("div",N,[h(e.MailOutlined,{class:k(["icon",{unread:e.isUnread}])},null,8,["class"])]),r("div",O,[r("div",V,[r("span",A,n(e.fromText),1),r("span",B,n(e.formattedTime),1)]),r("div",D,n(e.subjectText),1),e.snippetText?(c(),f("div",R,n(e.snippetText),1)):l("v-if",!0),r("div",L,[h(s,{color:"blue",class:"src"},{default:d(()=>[u(n(a.event.source.adapter),1)]),_:1}),e.attachmentCount>0?(c(),g(s,{key:0,color:"orange"},{default:d(()=>[u(" 📎 "+n(e.attachmentCount),1)]),_:1})):l("v-if",!0),e.category?(c(),g(s,{key:1},{default:d(()=>[u(n(e.category),1)]),_:1})):l("v-if",!0)])])])}const q=j(E,[["render",U],["__scopeId","data-v-e4ddf632"],["__file","/tmp/cc-web-panel-EbDQZE/repo/packages/web-panel/src/components/pdh/renderers/EmailListRenderer.vue"]]);export{q as default};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ChatBubbleRenderer-CBQYVCUs.js","./vendor-BvqAck49.js","./index-oK90a36q.js","./icons-DP3uiYxy.js","./index-Cq93VfoF.css","./ChatBubbleRenderer-gy5SDGw2.css","./OrderTableRenderer-PNYP-hFh.js","./OrderTableRenderer-CfrDjSHT.css","./TimelineRenderer-Dd9CmQ-l.js","./TimelineRenderer-BlTAtkOc.css","./EmailListRenderer-DKCmhw1W.js","./EmailListRenderer-DTPZPx_S.css","./GenericCardRenderer-CUVA-qrZ.js","./GenericCardRenderer-o85VDYQS.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{E as ue,r as R,b as w,I as y,P as u,J as O,U as v,c,S as C,V as k,_ as M,F as V,Z as se,a0 as le,R as x,K as m,Q as b,W as A,o as Q}from"./vendor-BvqAck49.js";import{u as J}from"./usePersonalDataHub-4h3Apiwr.js";import{_ as F,e as L,d as P}from"./index-oK90a36q.js";import{a9 as q,af as U,M as z,aH as G,u as Z,aG as H,ap as K,ab as W,e as de,d as fe,k as pe,ah as me,az as _e,R as ge}from"./icons-DP3uiYxy.js";const I=Object.freeze({q:"",category:null,adapter:null,subtype:null,since:null,until:null}),B=50,Y=300,X=ue("pdhBrowser",()=>{const r=R({...I}),t=R([]),n=R(null),e=R(!1),o=R(!1),l=R(null),a=R(null),s=R(!1),i=R({byCategory:{},byAdapter:{},bySubtype:{},total:0});let d=0,_=null;const D=w(()=>t.value.length>0),j=w(()=>n.value!=null);function h(S={}){const p={},f=r.value;return f.q&&f.q.trim()&&(p.q=f.q.trim()),f.category&&(p.category=f.category),f.adapter&&(p.adapter=f.adapter),f.subtype&&(p.subtype=f.subtype),Number.isFinite(f.since)&&(p.since=f.since),Number.isFinite(f.until)&&(p.until=f.until),{...p,...S}}async function g(){const S=++d;e.value=!0,l.value=null;const p=J();try{const[f,T]=await Promise.all([p.searchEvents(h({limit:B})),p.facetCounts({...r.value.q&&r.value.q.trim()?{q:r.value.q.trim()}:{},...Number.isFinite(r.value.since)?{since:r.value.since}:{},...Number.isFinite(r.value.until)?{until:r.value.until}:{}})]);if(S!==d)return;t.value=f.rows||[],n.value=f.nextCursor||null,a.value=f.mode||"like",s.value=!!f.shortQuery,i.value={byCategory:T.byCategory||{},byAdapter:T.byAdapter||{},bySubtype:T.bySubtype||{},total:T.total||0}}catch(f){if(S!==d)return;l.value=f&&f.message?f.message:String(f),t.value=[],n.value=null}finally{S===d&&(e.value=!1)}}async function E(){if(!n.value||o.value)return;o.value=!0,l.value=null;const S=J();try{const p=await S.searchEvents(h({cursor:n.value,limit:B}));t.value=t.value.concat(p.rows||[]),n.value=p.nextCursor||null,a.value=p.mode||a.value}catch(p){l.value=p&&p.message?p.message:String(p)}finally{o.value=!1}}function ae(S,p){if(!(S in I))throw new Error(`pdhBrowser.setFilter: unknown key "${S}"`);r.value={...r.value,[S]:p},_&&clearTimeout(_),_=setTimeout(()=>{_=null,g()},Y)}function ie(S){return r.value={...I,...S},_&&(clearTimeout(_),_=null),g()}function ce(){r.value={...I},t.value=[],n.value=null,l.value=null,i.value={byCategory:{},byAdapter:{},bySubtype:{},total:0}}return{filters:r,results:t,cursor:n,isLoading:e,isAppending:o,error:l,mode:a,shortQuery:s,facets:i,hasResults:D,canLoadMore:j,search:g,loadMore:E,setFilter:ae,setFilters:ie,reset:ce,PAGE_SIZE:B,SEARCH_DEBOUNCE_MS:Y}}),ye=Object.freeze(["chat","social","email","shopping","travel","system","ai-chat","other"]),ve=Object.freeze({chat:"社交聊天",social:"内容平台",email:"邮件",shopping:"支付订单",travel:"出行",system:"系统数据","ai-chat":"AI 对话",other:"其他"});function N(r){return ve[r]||r||"未知"}const be=Object.freeze([["wechat","chat"],["messaging-","chat"],["social-","social"],["email-","email"],["shopping-","shopping"],["alipay-","shopping"],["travel-","travel"],["system-data","system"],["browser-","system"],["vscode","system"],["win-recent","system"],["git-activity","system"],["shell-history","system"],["local-files","system"],["ai-chat-","ai-chat"]]);function $(r){if(typeof r!="string"||r.length===0)return"other";for(const[t,n]of be)if(t.endsWith("-")||t==="system-data"){if(r.startsWith(t))return n}else if(r===t)return n;return"other"}const he={__name:"CategorySidebar",props:{selected:{type:String,default:null},facets:{type:Object,default:()=>({byCategory:{},total:0})}},emits:["select"],setup(r,{expose:t}){t();const n=r,e=w(()=>n.facets.total||0),o={chat:W,social:K,email:H,shopping:Z,travel:G,system:z,"ai-chat":U,other:q};function l(i){return o[i]||q}function a(i){return i?{backgroundColor:"#fff",color:"#1677ff"}:{backgroundColor:"#f0f0f0",color:"#666"}}const s={props:n,total:e,ICONS:o,iconFor:l,badgeStyle:a,computed:w,get AppstoreOutlined(){return q},get MessageOutlined(){return W},get PlayCircleOutlined(){return K},get MailOutlined(){return H},get ShoppingOutlined(){return Z},get CarOutlined(){return G},get MobileOutlined(){return z},get RobotOutlined(){return U},get CATEGORIES(){return ye},get categoryLabel(){return N}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},Se={class:"pdh-sidebar"},Oe=["onClick"],we={class:"label"};function Ce(r,t,n,e,o,l){const a=y("a-badge");return u(),O("div",Se,[t[2]||(t[2]=v("div",{class:"sidebar-title"},"数据类型",-1)),v("div",{class:M(["cat-item",{active:n.selected===null}]),onClick:t[0]||(t[0]=s=>r.$emit("select",null))},[c(e.AppstoreOutlined,{class:"icon"}),t[1]||(t[1]=v("span",{class:"label"},"全部",-1)),e.total>0?(u(),C(a,{key:0,count:e.total,"number-style":e.badgeStyle(n.selected===null),"overflow-count":9999},null,8,["count","number-style"])):k("v-if",!0)],2),(u(!0),O(V,null,se(e.CATEGORIES,s=>(u(),O("div",{key:s,class:M(["cat-item",{active:n.selected===s,dim:!n.facets.byCategory[s]}]),onClick:i=>r.$emit("select",s)},[(u(),C(le(e.iconFor(s)),{class:"icon"})),v("span",we,x(e.categoryLabel(s)),1),n.facets.byCategory[s]?(u(),C(a,{key:0,count:n.facets.byCategory[s],"number-style":e.badgeStyle(n.selected===s),"overflow-count":9999},null,8,["count","number-style"])):k("v-if",!0)],10,Oe))),128))])}const Ee=F(he,[["render",Ce],["__scopeId","data-v-6b62a22e"],["__file","/tmp/cc-web-panel-EbDQZE/repo/packages/web-panel/src/components/pdh/CategorySidebar.vue"]]),ke={__name:"SearchFilterBar",props:{filters:{type:Object,required:!0},facets:{type:Object,default:()=>({byAdapter:{}})},isLoading:{type:Boolean,default:!1},mode:{type:String,default:null},shortQuery:{type:Boolean,default:!1}},emits:["set-filter","reset"],setup(r,{expose:t,emit:n}){t();const e=r,o=n,l=w(()=>e.filters.category?`在「${e.filters.category}」类目内搜索…`:"搜索关键词(如:支付宝、罗技、Kotlin)…"),a=w(()=>Object.entries(e.facets.byAdapter||{}).sort((g,E)=>E[1]-g[1]).map(([g,E])=>({value:g,label:`${g} (${E})`}))),s=w(()=>!e.filters.since&&!e.filters.until?null:[e.filters.since?new Date(e.filters.since):null,e.filters.until?new Date(e.filters.until):null]),i=w(()=>!!(e.filters.q||e.filters.adapter||e.filters.subtype||e.filters.since||e.filters.until));function d(h){o("set-filter","q",h||"")}function _(h){o("set-filter","q",h||"")}function D(h){if(!h||h.length===0){o("set-filter","since",null),o("set-filter","until",null);return}const[g,E]=h;o("set-filter","since",g?+g:null),o("set-filter","until",E?+E:null)}const j={props:e,emit:o,placeholderText:l,adapterOptions:a,dateRangeValue:s,hasActiveFilters:i,onQInput:d,onSearch:_,onDateChange:D,computed:w,get SearchOutlined(){return pe},get CloseCircleOutlined(){return fe},get InfoCircleOutlined(){return de}};return Object.defineProperty(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},Re={class:"pdh-filter-bar"},xe={key:1,class:"hint"},De={key:2,class:"hint"};function je(r,t,n,e,o,l){const a=y("a-input-search"),s=y("a-select"),i=y("a-range-picker"),d=y("a-button");return u(),O("div",Re,[c(a,{value:n.filters.q,placeholder:e.placeholderText,"enter-button":"搜索","allow-clear":"",loading:n.isLoading,style:{flex:"1","max-width":"480px"},"onUpdate:value":e.onQInput,onSearch:e.onSearch},{prefix:m(()=>[c(e.SearchOutlined)]),_:1},8,["value","placeholder","loading"]),c(s,{value:n.filters.adapter,placeholder:"所有 adapter","allow-clear":"",options:e.adapterOptions,style:{width:"200px"},"onUpdate:value":t[0]||(t[0]=_=>r.$emit("set-filter","adapter",_||null))},null,8,["value","options"]),c(i,{value:e.dateRangeValue,placeholder:["开始日期","结束日期"],style:{width:"280px"},"onUpdate:value":e.onDateChange},null,8,["value"]),e.hasActiveFilters?(u(),C(d,{key:0,type:"link",danger:"",onClick:t[1]||(t[1]=_=>r.$emit("reset"))},{icon:m(()=>[c(e.CloseCircleOutlined)]),default:m(()=>[t[2]||(t[2]=b(" 清空筛选 ",-1))]),_:1})):k("v-if",!0),n.shortQuery?(u(),O("span",xe,[c(e.InfoCircleOutlined),t[3]||(t[3]=b(" 关键词需至少 3 字 (FTS5 trigram 限制) ",-1))])):n.mode==="like"?(u(),O("span",De,[c(e.InfoCircleOutlined),t[4]||(t[4]=b(" 当前为 LIKE 兜底模式 ",-1))])):k("v-if",!0)])}const Ae=F(ke,[["render",je],["__scopeId","data-v-d7cce6e9"],["__file","/tmp/cc-web-panel-EbDQZE/repo/packages/web-panel/src/components/pdh/SearchFilterBar.vue"]]),Le={__name:"RendererDispatcher",props:{event:{type:Object,required:!0}},setup(r,{expose:t}){t();const n=A(()=>L(()=>import("./ChatBubbleRenderer-CBQYVCUs.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),e=A(()=>L(()=>import("./OrderTableRenderer-PNYP-hFh.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)),o=A(()=>L(()=>import("./TimelineRenderer-Dd9CmQ-l.js"),__vite__mapDeps([8,1,2,3,4,9]),import.meta.url)),l=A(()=>L(()=>import("./EmailListRenderer-DKCmhw1W.js"),__vite__mapDeps([10,1,2,3,4,11]),import.meta.url)),a=A(()=>L(()=>import("./GenericCardRenderer-CUVA-qrZ.js"),__vite__mapDeps([12,1,2,3,4,13]),import.meta.url));function s(d){const _=d&&d.source&&d.source.adapter;switch($(_)){case"chat":case"ai-chat":return n;case"shopping":return e;case"travel":return o;case"email":return l;default:return a}}const i={ChatBubbleRenderer:n,OrderTableRenderer:e,TimelineRenderer:o,EmailListRenderer:l,GenericCardRenderer:a,rendererFor:s,defineAsyncComponent:A,get getCategory(){return $}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}};function Fe(r,t,n,e,o,l){return u(),C(le(e.rendererFor(n.event)),{event:n.event},null,8,["event"])}const Te=F(Le,[["render",Fe],["__file","/tmp/cc-web-panel-EbDQZE/repo/packages/web-panel/src/components/pdh/renderers/RendererDispatcher.vue"]]);function ee(r){return JSON.stringify(r,null,2)}function te(r){return r.map(t=>JSON.stringify(t)).join(`
|
|
3
|
-
`)+`
|
|
4
|
-
`}function ne(r){const n=["id","subtype","occurredAt","occurredAtIso","actor","place","adapter","summary","contentJson","extraJson"].join(","),e=r.map(o=>{const l=Number.isFinite(o.occurredAt)?o.occurredAt:null,a=l?new Date(l).toISOString():"",s=o.source&&o.source.adapter||"",i=o.content&&(o.content.text||o.content.title||o.content.subject)||"";return[o.id||"",o.subtype||"",l!=null?String(l):"",a,o.actor||"",o.place||"",s,i,o.content?JSON.stringify(o.content):"",o.extra?JSON.stringify(o.extra):""].map(Ie).join(",")});return[n,...e].join(`
|
|
5
|
-
`)+`
|
|
6
|
-
`}function Ie(r){const t=String(r??"");return t.includes(",")||t.includes('"')||t.includes(`
|
|
7
|
-
`)||t.includes("\r")?'"'+t.replace(/"/g,'""')+'"':t}function re(r,t,n="application/octet-stream"){if(typeof window>"u"||typeof document>"u")return t;const e=new Blob([r],{type:n}),o=URL.createObjectURL(e),l=document.createElement("a");return l.href=o,l.download=t,document.body.appendChild(l),l.click(),document.body.removeChild(l),setTimeout(()=>URL.revokeObjectURL(o),1e3),t}function oe(r,t=null){const n=new Date,e=n.getFullYear(),o=String(n.getMonth()+1).padStart(2,"0"),l=String(n.getDate()).padStart(2,"0"),a=r==="ndjson"?"ndjson":r,s=t?`-${t}`:"";return`pdh-events-${e}-${o}-${l}${s}.${a}`}const Pe={__name:"ExportDropdown",props:{events:{type:Array,required:!0},category:{type:String,default:null}},setup(r,{expose:t}){t();const n=r,e=w(()=>n.events.length>0),o={json:"application/json;charset=utf-8",ndjson:"application/x-ndjson;charset=utf-8",csv:"text/csv;charset=utf-8"};function l(i){switch(i){case"json":return ee(n.events);case"ndjson":return te(n.events);case"csv":return ne(n.events);default:throw new Error(`unknown format: ${i}`)}}function a({key:i}){try{const d=l(i),_=oe(i,n.category);re(d,_,o[i]),P.success(`已导出 ${n.events.length} 条到 ${_}`)}catch(d){P.error(`导出失败: ${d.message||d}`)}}const s={props:n,hasResults:e,MIME:o,serialize:l,onClick:a,computed:w,get DownloadOutlined(){return _e},get DownOutlined(){return me},get message(){return P},get eventsToJson(){return ee},get eventsToNdjson(){return te},get eventsToCsv(){return ne},get downloadAs(){return re},get suggestFilename(){return oe}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}};function qe(r,t,n,e,o,l){const a=y("a-button"),s=y("a-menu-item"),i=y("a-menu"),d=y("a-dropdown");return u(),C(d,{disabled:!e.hasResults},{overlay:m(()=>[c(i,{onClick:e.onClick},{default:m(()=>[c(s,{key:"json"},{default:m(()=>[...t[0]||(t[0]=[b("JSON (.json)",-1)])]),_:1}),c(s,{key:"ndjson"},{default:m(()=>[...t[1]||(t[1]=[b("NDJSON (.ndjson)",-1)])]),_:1}),c(s,{key:"csv"},{default:m(()=>[...t[2]||(t[2]=[b("CSV (.csv)",-1)])]),_:1})]),_:1})]),default:m(()=>[c(a,{disabled:!e.hasResults},{icon:m(()=>[c(e.DownloadOutlined)]),default:m(()=>[b(" 导出 ("+x(n.events.length)+") ",1),c(e.DownOutlined)]),_:1},8,["disabled"])]),_:1},8,["disabled"])}const Be=F(Pe,[["render",qe],["__file","/tmp/cc-web-panel-EbDQZE/repo/packages/web-panel/src/components/pdh/ExportDropdown.vue"]]),Ve={__name:"PdhVaultBrowser",setup(r,{expose:t}){t();const n=X(),e=w(()=>n.filters.q?`没有匹配 "${n.filters.q}" 的事件 — 试试更短的关键词或换个类目`:n.filters.category?`「${N(n.filters.category)}」类目下还没有数据 — 去采集页同步对应 adapter`:"Vault 里还没有数据 — 去「个人数据中台」页面同步任意 adapter");function o(s){n.filters.category=s,n.search()}function l(s,i){n.setFilter(s,i)}Q(()=>{!n.hasResults&&!n.isLoading&&n.search()});const a={store:n,emptyHint:e,onCategorySelect:o,onSetFilter:l,onMounted:Q,computed:w,get ReloadOutlined(){return ge},get usePdhBrowserStore(){return X},get categoryLabel(){return N},CategorySidebar:Ee,SearchFilterBar:Ae,RendererDispatcher:Te,ExportDropdown:Be};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}},Ne={class:"pdh-browser-page"},Me={class:"page-header"},Qe={class:"main-pane"},Je={class:"results-summary"},Ue={key:0},ze={key:0},Ge={key:1},Ze={class:"loaded-of"},He={class:"results-list"},Ke={key:2,class:"load-more"};function We(r,t,n,e,o,l){const a=y("a-tag"),s=y("a-button"),i=y("a-space"),d=y("a-col"),_=y("a-spin"),D=y("a-alert"),j=y("a-empty"),h=y("a-row");return u(),O("div",Ne,[v("div",Me,[t[6]||(t[6]=v("div",null,[v("h2",{class:"page-title"},"数据浏览器"),v("p",{class:"page-sub"}," Vault 里所有已采集的数据,按类目浏览 / 全文检索 / 时间窗口筛选。 完全离线,不外传。 ")],-1)),c(i,null,{default:m(()=>[e.store.mode==="fts5"?(u(),C(a,{key:0,color:"green"},{default:m(()=>[...t[3]||(t[3]=[b("FTS5 trigram",-1)])]),_:1})):e.store.mode==="like"?(u(),C(a,{key:1,color:"orange"},{default:m(()=>[...t[4]||(t[4]=[b("LIKE 兜底",-1)])]),_:1})):k("v-if",!0),c(e.ExportDropdown,{events:e.store.results,category:e.store.filters.category},null,8,["events","category"]),c(s,{onClick:t[0]||(t[0]=g=>e.store.search()),loading:e.store.isLoading},{icon:m(()=>[c(e.ReloadOutlined)]),default:m(()=>[t[5]||(t[5]=b(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),c(h,{gutter:16,class:"browser-layout"},{default:m(()=>[c(d,{xs:24,sm:24,md:6,lg:5,xl:4},{default:m(()=>[c(e.CategorySidebar,{selected:e.store.filters.category,facets:e.store.facets,onSelect:e.onCategorySelect},null,8,["selected","facets"])]),_:1}),c(d,{xs:24,sm:24,md:18,lg:19,xl:20},{default:m(()=>[v("div",Qe,[c(e.SearchFilterBar,{filters:e.store.filters,facets:e.store.facets,"is-loading":e.store.isLoading,mode:e.store.mode,"short-query":e.store.shortQuery,onSetFilter:e.onSetFilter,onReset:t[1]||(t[1]=g=>{e.store.reset(),e.store.search()})},null,8,["filters","facets","is-loading","mode","short-query"]),v("div",Je,[e.store.isLoading&&e.store.results.length===0?(u(),O("span",Ue,[c(_,{size:"small"}),t[7]||(t[7]=b(" 载入中… ",-1))])):(u(),O(V,{key:1},[v("strong",null,x(e.store.facets.total),1),t[11]||(t[11]=b(" 条事件 ",-1)),e.store.filters.category?(u(),O("span",ze,[t[8]||(t[8]=b(" / 当前类目 ",-1)),v("strong",null,x(e.categoryLabel(e.store.filters.category)),1),v("strong",null,x(e.store.facets.byCategory[e.store.filters.category]||0),1)])):k("v-if",!0),e.store.filters.q?(u(),O("span",Ge,[t[9]||(t[9]=b(' / 关键词 "',-1)),v("em",null,x(e.store.filters.q),1),t[10]||(t[10]=b('"',-1))])):k("v-if",!0),v("span",Ze," / 已显示 "+x(e.store.results.length),1)],64))]),e.store.error?(u(),C(D,{key:0,type:"error","show-icon":"",message:e.store.error,closable:"",style:{margin:"12px 0"}},null,8,["message"])):k("v-if",!0),!e.store.isLoading&&e.store.results.length===0&&!e.store.error?(u(),C(j,{key:1,description:e.emptyHint,style:{"margin-top":"40px"}},null,8,["description"])):k("v-if",!0),v("div",He,[(u(!0),O(V,null,se(e.store.results,(g,E)=>(u(),C(e.RendererDispatcher,{key:`r-${E}-${g.id}`,event:g},null,8,["event"]))),128))]),e.store.canLoadMore?(u(),O("div",Ke,[c(s,{loading:e.store.isAppending,onClick:t[2]||(t[2]=g=>e.store.loadMore()),block:""},{default:m(()=>[...t[12]||(t[12]=[b(" 加载下一页 (50 条) ",-1)])]),_:1},8,["loading"])])):k("v-if",!0)])]),_:1})]),_:1})])}const tt=F(Ve,[["render",We],["__scopeId","data-v-0f7c02cd"],["__file","/tmp/cc-web-panel-EbDQZE/repo/packages/web-panel/src/views/PdhVaultBrowser.vue"]]);export{tt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as m,J as p,U as v,R as s,c as o,K as n,V as d,S as x,o as me,b as se,a as te,r as _,P as u,Q as f,F as E,Z as L,_ as Pe,$ as pe}from"./vendor-BvqAck49.js";import{_ as Be,b as fe,u as ye,E as be,d as g}from"./index-oK90a36q.js";import{s as he}from"./community-parser-CO25nZFt.js";import ve from"./index-DdXLG_Lh.js";import{aU as Ve,l as Je,L as Ye,q as We,at as qe,ak as Ke,$ as Ze,am as He,as as Ge,R as Qe}from"./icons-DP3uiYxy.js";import"./KeyCode-D63Tfrq7.js";import"./omit-DnFKewM5.js";import"./pickAttrs-C6Y6tV6C.js";import"./initDefaultProps-BTUpF0QI.js";import"./motion-2WeVnnEL.js";import"./raf-Deuc0E8-.js";import"./index-C6QoSIPt.js";import"./index-Bp4RaoTi.js";import"./isVisible-C7tPsqfj.js";import"./useState-BK4hy8Ma.js";import"./devWarning-B1b-Rehg.js";import"./compact-item-BZff7uOC.js";import"./createContext-pWYC3gCE.js";import"./Compact-D31wUdGx.js";import"./_getTag-DnrRH4E6.js";import"./styleChecker-D4lnP6aI.js";import"./zoom-D1RKjeeJ.js";import"./ActionButton-BcIs1DhT.js";import"./vnode-BKpoqKhe.js";function q(l){const t=he(l);if(!t)return null;try{return JSON.parse(t)}catch{}const r=t.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(!r)return null;try{return JSON.parse(r[0])}catch{return null}}const Oe=Object.freeze(["accuracy","fairness","resilience","convergence_speed"]),Xe=Object.freeze(["none","exponential","linear","step"]),$e=Object.freeze(["z_score","iqr"]),ze=Object.freeze(["running","complete","applied","failed","cancelled"]),et=Object.freeze(["generic","task","review","vote"]);function k(l,t=0){return typeof l=="number"&&Number.isFinite(l)?l:t}function N(l){if(!l)return{noDb:!1,error:""};const t=he(l),r=/Database not available/i.test(t);return{noDb:r,error:r?"Database not available":""}}function tt(l,t=0){if(!l||typeof l!="object")return null;const r=l.did||"";return r?{key:r,did:r,score:k(l.score,0),observations:k(l.observations,0),decay:String(l.decay||"none"),weightTotal:k(l.weightTotal,0),_idx:t}:null}function ce(l){const t=q(l);return Array.isArray(t)?t.map(tt).filter(Boolean):[]}function Ae(l,t=0){if(!l||typeof l!="object")return null;const r=l.did||"";return r?{key:`${r}-${t}`,did:r,score:k(l.score,0),reason:String(l.reason||""),zScore:typeof l.zScore=="number"?l.zScore:null,lower:typeof l.lower=="number"?l.lower:null,upper:typeof l.upper=="number"?l.upper:null}:null}function _e(l){const t=q(l);if(!t||typeof t!="object"||Array.isArray(t))return{method:"",threshold:0,totalSamples:0,anomalies:[],summary:"",message:""};const r=Array.isArray(t.anomalies)?t.anomalies.map(Ae).filter(Boolean):[];return{method:String(t.method||""),threshold:k(t.threshold,0),totalSamples:k(t.totalSamples,0),anomalies:r,summary:t.summary?String(t.summary):"",message:t.message?String(t.message):""}}function Re(l,t=0){if(!l||typeof l!="object")return null;const r=l.runId||"";return r?{key:r,runId:r,objective:String(l.objective||""),iterations:k(l.iterations,0),paramSpace:l.paramSpace??null,bestParams:l.bestParams??null,bestScore:k(l.bestScore,0),status:String(l.status||"complete").toLowerCase(),createdAt:l.createdAt??null,completedAt:l.completedAt??null,analytics:l.analytics??null,errorMessage:l.errorMessage??"",_idx:t}:null}function ge(l){const t=q(l);return Array.isArray(t)?t.map(Re).filter(Boolean):[]}function xe(l){const t=q(l);return!t||typeof t!="object"||Array.isArray(t)?null:Re(t,0)}function ke(l){const t=q(l);if(!t||typeof t!="object"||Array.isArray(t))return null;const r=t.reputationDistribution||{};return{analyticsId:String(t.analyticsId||""),runId:String(t.runId||""),reputationDistribution:{buckets:Array.isArray(r.buckets)?r.buckets.filter(e=>e&&typeof e=="object").map(e=>({label:String(e.label||""),count:k(e.count,0),min:typeof e.min=="number"?e.min:null,max:typeof e.max=="number"?e.max:null})):[],mean:typeof r.mean=="number"?r.mean:null,stdDev:typeof r.stdDev=="number"?r.stdDev:null},anomalies:t.anomalies&&typeof t.anomalies=="object"?{method:String(t.anomalies.method||""),totalSamples:k(t.anomalies.totalSamples,0),anomalies:Array.isArray(t.anomalies.anomalies)?t.anomalies.anomalies.map(Ae).filter(Boolean):[],summary:t.anomalies.summary?String(t.anomalies.summary):"",message:t.anomalies.message?String(t.anomalies.message):""}:{method:"",totalSamples:0,anomalies:[],summary:"",message:""},recommendations:Array.isArray(t.recommendations)?t.recommendations.filter(e=>typeof e=="string"):[]}}const ot={totalRuns:0,activeRuns:0,maxConcurrentOptimizations:0,byStatus:{},byObjective:{},observations:{totalObservations:0,totalDids:0},bestScoreEver:0};function Se(l){const t=JSON.parse(JSON.stringify(ot));for(const e of ze)t.byStatus[e]=0;for(const e of Oe)t.byObjective[e]=0;const r=q(l);if(!r||typeof r!="object"||Array.isArray(r))return t;if(t.totalRuns=k(r.totalRuns,0),t.activeRuns=k(r.activeRuns,0),t.maxConcurrentOptimizations=k(r.maxConcurrentOptimizations,0),t.bestScoreEver=k(r.bestScoreEver,0),r.byStatus&&typeof r.byStatus=="object")for(const[e,w]of Object.entries(r.byStatus))typeof w=="number"&&Number.isFinite(w)&&(t.byStatus[e]=w);if(r.byObjective&&typeof r.byObjective=="object")for(const[e,w]of Object.entries(r.byObjective))typeof w=="number"&&Number.isFinite(w)&&(t.byObjective[e]=w);return r.observations&&typeof r.observations=="object"&&(t.observations.totalObservations=k(r.observations.totalObservations,0),t.observations.totalDids=k(r.observations.totalDids,0)),t}function at(l){if(l==null||l==="")return"—";const t=typeof l=="number"?new Date(l):new Date(String(l));return isNaN(t.getTime())?String(l):t.toLocaleString("zh-CN",{hour12:!1})}const nt={__name:"Reputation",setup(l,{expose:t}){t();const{t:r}=fe(),e=ye(),w=be.PRESENTED_IMAGE_SIMPLE,Q=_(!1),R=_(!1),K=_(!1),U=_(!1),A=_(!1),O=_([]),z=_([]),V=_({totalRuns:0,activeRuns:0,maxConcurrentOptimizations:0,byStatus:{},byObjective:{},observations:{totalObservations:0,totalDids:0},bestScoreEver:0}),P=_({noDb:!1,error:""}),X=_("scores"),F=_("none"),Z=_(!1),J=_(!1),j=_(!1),H=_(!1),S=te({did:"",score:.8,kind:"generic",weight:1}),h=te({objective:"accuracy",iterations:50}),D=te({method:"z_score",threshold:2.5,decay:"none"}),T=_(null),I=_(null),B=_(null),Y=se(()=>[{title:r("reputation.scoreColumns.rank"),key:"rank",width:"60px"},{title:r("reputation.scoreColumns.did"),key:"did"},{title:r("reputation.scoreColumns.score"),key:"score",width:"220px"},{title:r("reputation.scoreColumns.observations"),key:"observations",width:"100px"},{title:r("reputation.scoreColumns.weightTotal"),key:"weightTotal",width:"100px"}]),oe=se(()=>[{title:r("reputation.runColumns.runId"),key:"runId",width:"140px"},{title:r("reputation.runColumns.objective"),key:"objective",width:"140px"},{title:r("reputation.runColumns.iterations"),key:"iterations",width:"80px"},{title:r("reputation.runColumns.bestScore"),key:"bestScore",width:"110px"},{title:r("reputation.runColumns.status"),key:"status",width:"100px"},{title:r("reputation.runColumns.createdAt"),key:"createdAt",width:"160px"},{title:r("reputation.runColumns.action"),key:"action",width:"160px"}]);function ae(i){const c=`reputation.decay.${i}`,y=r(c);return y===c?i:y}function $(i){const c=`reputation.kind.${i}`,y=r(c);return y===c?i:y}function ee(i){const c=`reputation.objective.${i}`,y=r(c);return y===c?i:y}function C(i){return{accuracy:"blue",fairness:"green",resilience:"purple",convergence_speed:"orange"}[i]||"default"}function ne(i){return{accuracy:"#1677ff",fairness:"#52c41a",resilience:"#722ed1",convergence_speed:"#fa8c16"}[i]||"#888"}function re(i){const c=`reputation.objectiveDesc.${i}`,y=r(c);return y===c?"":y}function a(i){const c=`reputation.status.${i}`,y=r(c);return y===c?i:y}function b(i){return{running:"processing",complete:"blue",applied:"green",failed:"red",cancelled:"default"}[i]||"default"}function W(i){return{running:"#1677ff",complete:"#13c2c2",applied:"#52c41a",failed:"#ff4d4f",cancelled:"#888"}[i]||"#888"}function we(i){return i===0?"gold":i===1?"silver":i===2?"bronze":""}function je(i){return i>=.8?"#52c41a":i>=.5?"#1677ff":i>=.3?"#faad14":"#ff4d4f"}function Ce(i,c){return c?Math.round(i/c*100):0}function De(i){const c=I.value?.reputationDistribution.buckets.reduce((y,M)=>y+M.count,0)||0;return c?Math.round(i.count/c*100):0}function Te(i){if(typeof i=="string")return i;try{return JSON.stringify(i,null,2)}catch{return String(i)}}async function G(){Q.value=!0,P.value={noDb:!1,error:""};try{const[i,c,y]=await Promise.all([e.execute(`reputation list --decay ${F.value} --json`,1e4).catch(()=>({output:""})),e.execute("reputation runs --limit 50 --json",1e4).catch(()=>({output:""})),e.execute("reputation stats-v2 --json",8e3).catch(()=>({output:""}))]),M=[i,c,y].map(le=>N(le.output)).find(le=>le.noDb);M&&(P.value=M),O.value=ce(i.output),z.value=ge(c.output),V.value=Se(y.output)}catch(i){g.error(r("reputation.messages.loadFailed",{err:i?.message||i}))}finally{Q.value=!1}}async function Ee(){try{const{output:i}=await e.execute(`reputation list --decay ${F.value} --json`,1e4),c=N(i);if(c.noDb){P.value=c;return}O.value=ce(i)}catch(i){g.error(r("reputation.messages.loadScoresFailed",{err:i?.message||i}))}}async function Fe(){if(!S.did.trim()){g.warning(r("reputation.messages.didRequired"));return}if(S.score<0||S.score>1){g.warning(r("reputation.messages.scoreRange"));return}R.value=!0;try{const i=[`reputation observe "${S.did.trim().replace(/"/g,'\\"')}"`,String(S.score),`-k ${S.kind}`,`-w ${S.weight}`,"--json"],{output:c}=await e.execute(i.join(" "),1e4);if(N(c).noDb){g.error(r("reputation.messages.needInit"));return}if(!/"did"/.test(c)){g.error(r("reputation.messages.observeFailed",{err:c.slice(0,120)}));return}g.success(r("reputation.messages.observeOk")),Z.value=!1,ue(),await G()}catch(i){g.error(r("reputation.messages.observeFailed",{err:i?.message||i}))}finally{R.value=!1}}async function Ie(){K.value=!0;try{const i=["reputation optimize",`-o ${h.objective}`,`-i ${h.iterations}`,"--json"],{output:c}=await e.execute(i.join(" "),6e4);if(N(c).noDb){g.error(r("reputation.messages.needInit"));return}const M=xe(c);if(!M){g.error(r("reputation.messages.optimizeFailed",{err:c.slice(0,120)}));return}J.value=!1,g.success(r("reputation.messages.optimizeOk",{score:M.bestScore.toFixed(4)})),await G(),T.value=M,H.value=!0,await ie()}catch(i){g.error(r("reputation.messages.optimizeFailed",{err:i?.message||i}))}finally{K.value=!1}}async function Me(i){ve.confirm({title:r("reputation.applyConfirm.title"),content:r("reputation.applyConfirm.content",{runId:i.runId.slice(0,12)}),okText:r("reputation.applyConfirm.ok"),cancelText:r("reputation.applyConfirm.cancel"),onOk:async()=>{try{const{output:c}=await e.execute(`reputation apply ${i.runId}`,8e3);if(N(c).noDb){g.error(r("reputation.messages.needInit"));return}if(/Failed|Error/i.test(c)&&!/Applied/i.test(c)){g.error(r("reputation.messages.applyFailed",{err:c.slice(0,120)}));return}g.success(r("reputation.messages.applyOk")),await G()}catch(c){g.error(r("reputation.messages.applyFailed",{err:c?.message||c}))}}})}async function Le(i){T.value=i,I.value=null,H.value=!0,await ie()}async function ie(){if(T.value){A.value=!0;try{const{output:i}=await e.execute(`reputation analytics ${T.value.runId} --json`,8e3);if(N(i).noDb)return;I.value=ke(i)}catch{}finally{A.value=!1}}}function Ne(){B.value=null,j.value=!0}async function Ue(){U.value=!0;try{const i=["reputation anomalies",`-m ${D.method}`,`-t ${D.threshold}`,`-d ${D.decay}`,"--json"],{output:c}=await e.execute(i.join(" "),1e4);if(N(c).noDb){g.error(r("reputation.messages.needInit"));return}B.value=_e(c)}catch(i){g.error(r("reputation.messages.detectFailed",{err:i?.message||i}))}finally{U.value=!1}}function ue(){S.did="",S.score=.8,S.kind="generic",S.weight=1}me(G);const de={t:r,ws:e,EMPTY_IMG:w,loading:Q,observing:R,optimizing:K,detectingAnomalies:U,loadingAnalytics:A,scores:O,runs:z,stats:V,errorState:P,activeTab:X,decayFilter:F,showObserveModal:Z,showOptimizeModal:J,showAnomaliesModal:j,showAnalyticsModal:H,observeForm:S,optimizeForm:h,anomalyForm:D,currentRun:T,currentAnalytics:I,anomalyResult:B,scoreColumns:Y,runColumns:oe,decayLabel:ae,kindLabel:$,objectiveLabel:ee,objectiveColor:C,objectiveBarColor:ne,objectiveDesc:re,statusLabel:a,statusColor:b,statusBarColor:W,rankClass:we,scoreColor:je,pctOfTotal:Ce,bucketPct:De,formatParams:Te,loadAll:G,loadScores:Ee,submitObservation:Fe,submitOptimization:Ie,applyRun:Me,viewRunAnalytics:Le,loadAnalyticsForCurrentRun:ie,openAnomaliesModal:Ne,runAnomalyDetection:Ue,resetObserveForm:ue,ref:_,onMounted:me,reactive:te,computed:se,get useI18n(){return fe},get ReloadOutlined(){return Qe},get PlusOutlined(){return Ge},get WarningOutlined(){return He},get ThunderboltOutlined(){return Ze},get UserOutlined(){return Ke},get EyeOutlined(){return qe},get ExperimentOutlined(){return We},get LoadingOutlined(){return Ye},get TrophyOutlined(){return Je},get ArrowRightOutlined(){return Ve},get message(){return g},get Modal(){return ve},get Empty(){return be},get useWsStore(){return ye},get parseScores(){return ce},get parseAnomalies(){return _e},get parseRun(){return xe},get parseRuns(){return ge},get parseAnalytics(){return ke},get parseStatsV2(){return Se},get detectReputationError(){return N},get formatReputationTime(){return at},get OPTIMIZATION_OBJECTIVES(){return Oe},get DECAY_MODELS(){return Xe},get ANOMALY_METHODS(){return $e},get RUN_STATUSES(){return ze},get OBSERVATION_KINDS(){return et}};return Object.defineProperty(de,"__isScriptSetup",{enumerable:!1,value:!0}),de}},rt={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},it={class:"page-title"},lt={class:"page-sub"},st={class:"filter-bar"},ct={style:{color:"var(--text-secondary)","font-size":"12px"}},ut={key:1,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},dt={key:3,style:{color:"var(--text-secondary)"}},mt={key:4,style:{color:"var(--text-secondary)","font-family":"monospace","font-size":"12px"}},pt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},ft={key:0,style:{color:"var(--text-primary)","font-family":"monospace","font-size":"12px"}},yt={key:2,style:{color:"var(--text-secondary)"}},bt={key:5,style:{color:"var(--text-secondary)","font-size":"11px"}},vt={style:{padding:"40px",color:"var(--text-muted)","text-align":"center"}},_t={style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},gt={style:{color:"var(--text-muted)","font-size":"11px","margin-top":"4px"}},xt={style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},kt={style:{"padding-top":"8px"}},St={style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"12px"}},ht={key:1},Ot={style:{"font-family":"monospace","font-size":"12px",color:"var(--text-primary)"}},zt={style:{"margin-left":"8px",color:"var(--text-secondary)","font-size":"12px"}},At={key:0,style:{"margin-left":"8px",color:"var(--text-muted)","font-size":"11px"}},Rt={key:0,style:{"padding-top":"8px"}},wt={class:"params-pre"},jt={style:{color:"#ff4d4f"}},Ct={key:0,style:{"margin-top":"16px"}},Dt={style:{color:"var(--text-primary)","font-size":"13px",margin:"0 0 10px"}},Tt={class:"bucket-label"},Et={key:0,style:{"margin-top":"8px",color:"var(--text-secondary)","font-size":"12px"}},Ft={key:0,style:{"margin-left":"12px"}};function It(l,t,r,e,w,Q){const R=m("a-button"),K=m("a-space"),U=m("a-alert"),A=m("a-statistic"),O=m("a-card"),z=m("a-col"),V=m("a-row"),P=m("a-radio-button"),X=m("a-radio-group"),F=m("a-progress"),Z=m("a-table"),J=m("a-tab-pane"),j=m("a-tag"),H=m("a-tabs"),S=m("a-input"),h=m("a-form-item"),D=m("a-input-number"),T=m("a-select-option"),I=m("a-select"),B=m("a-form"),Y=m("a-modal"),oe=m("a-divider"),ae=m("a-empty"),$=m("a-list-item"),ee=m("a-list"),C=m("a-descriptions-item"),ne=m("a-descriptions"),re=m("a-spin");return u(),p("div",null,[v("div",rt,[v("div",null,[v("h2",it,s(e.t("reputation.title")),1),v("p",lt,s(e.t("reputation.subtitle")),1)]),o(K,null,{default:n(()=>[o(R,{loading:e.loading,onClick:e.loadAll},{icon:n(()=>[o(e.ReloadOutlined)]),default:n(()=>[f(" "+s(e.t("reputation.refresh")),1)]),_:1},8,["loading"]),o(R,{onClick:e.openAnomaliesModal},{icon:n(()=>[o(e.WarningOutlined)]),default:n(()=>[f(" "+s(e.t("reputation.actions.anomalies")),1)]),_:1}),o(R,{type:"primary",onClick:t[0]||(t[0]=a=>e.showOptimizeModal=!0)},{icon:n(()=>[o(e.ThunderboltOutlined)]),default:n(()=>[f(" "+s(e.t("reputation.actions.optimize")),1)]),_:1})]),_:1})]),d(" noDb banner "),e.errorState.noDb?(u(),x(U,{key:0,type:"info","show-icon":"",message:e.t("reputation.noDb.message"),description:e.t("reputation.noDb.description"),style:{"margin-bottom":"16px"}},null,8,["message","description"])):d("v-if",!0),d(" Stat cards "),o(V,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:n(()=>[o(z,{xs:12,sm:8,lg:5},{default:n(()=>[o(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(A,{title:e.t("reputation.stats.trackedDids"),value:e.stats.observations.totalDids,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:n(()=>[o(e.UserOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(z,{xs:12,sm:8,lg:5},{default:n(()=>[o(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(A,{title:e.t("reputation.stats.totalObservations"),value:e.stats.observations.totalObservations,"value-style":{color:"#722ed1",fontSize:"20px"}},{prefix:n(()=>[o(e.EyeOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(z,{xs:12,sm:8,lg:5},{default:n(()=>[o(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(A,{title:e.t("reputation.stats.optimizationRuns"),value:e.stats.totalRuns,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:n(()=>[o(e.ExperimentOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1}),o(z,{xs:12,sm:8,lg:5},{default:n(()=>[o(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(A,{title:e.t("reputation.stats.active"),value:e.stats.activeRuns,"value-style":{color:e.stats.activeRuns>0?"#1677ff":"#888",fontSize:"20px"},suffix:`/ ${e.stats.maxConcurrentOptimizations}`},{prefix:n(()=>[o(e.LoadingOutlined)]),_:1},8,["title","value","value-style","suffix"])]),_:1})]),_:1}),o(z,{xs:24,sm:8,lg:4},{default:n(()=>[o(O,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[o(A,{title:e.t("reputation.stats.bestEver"),value:e.stats.bestScoreEver,precision:3,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:n(()=>[o(e.TrophyOutlined)]),_:1},8,["title","value"])]),_:1})]),_:1})]),_:1}),d(" Tabs "),o(H,{activeKey:e.activeTab,"onUpdate:activeKey":t[3]||(t[3]=a=>e.activeTab=a),class:"reputation-tabs"},{default:n(()=>[d(" ── Scores tab ──────────────────────────────────────────── "),o(J,{key:"scores",tab:e.t("reputation.tabs.scores")},{default:n(()=>[v("div",st,[v("span",ct,s(e.t("reputation.filter.decayLabel")),1),o(X,{value:e.decayFilter,"onUpdate:value":t[1]||(t[1]=a=>e.decayFilter=a),size:"small","button-style":"solid",onChange:e.loadScores},{default:n(()=>[(u(!0),p(E,null,L(e.DECAY_MODELS,a=>(u(),x(P,{key:a,value:a},{default:n(()=>[f(s(e.decayLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),o(R,{size:"small",onClick:t[2]||(t[2]=a=>e.showObserveModal=!0)},{icon:n(()=>[o(e.PlusOutlined)]),default:n(()=>[f(" "+s(e.t("reputation.filter.addObservation")),1)]),_:1})]),o(Z,{columns:e.scoreColumns,"data-source":e.scores,pagination:{pageSize:20,showTotal:a=>e.t("reputation.totals.dids",{count:a})},size:"small",loading:e.loading,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:a,record:b,index:W})=>[a.key==="rank"?(u(),p("span",{key:0,class:Pe(["rank-pill",e.rankClass(W)])},s(W+1),3)):d("v-if",!0),a.key==="did"?(u(),p("span",ut,s(b.did),1)):d("v-if",!0),a.key==="score"?(u(),x(F,{key:2,percent:Math.round(b.score*100),"stroke-color":e.scoreColor(b.score),size:"small",format:()=>b.score.toFixed(4)},null,8,["percent","stroke-color","format"])):d("v-if",!0),a.key==="observations"?(u(),p("span",dt,s(b.observations),1)):d("v-if",!0),a.key==="weightTotal"?(u(),p("span",mt,s(b.weightTotal.toFixed(2)),1)):d("v-if",!0)]),emptyText:n(()=>[v("div",pt,[o(e.UserOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),f(" "+s(e.t("reputation.empty.scores")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),d(" ── Runs tab ────────────────────────────────────────────── "),o(J,{key:"runs",tab:e.t("reputation.tabs.runs")},{default:n(()=>[o(Z,{columns:e.runColumns,"data-source":e.runs,pagination:{pageSize:20,showTotal:a=>e.t("reputation.totals.rows",{count:a})},size:"small",loading:e.loading,style:{background:"var(--bg-card)"}},{bodyCell:n(({column:a,record:b})=>[a.key==="runId"?(u(),p("span",ft,s(b.runId.slice(0,12)),1)):d("v-if",!0),a.key==="objective"?(u(),x(j,{key:1,color:e.objectiveColor(b.objective),style:{"font-family":"monospace"}},{default:n(()=>[f(s(e.objectiveLabel(b.objective)),1)]),_:2},1032,["color"])):d("v-if",!0),a.key==="iterations"?(u(),p("span",yt,s(b.iterations),1)):d("v-if",!0),a.key==="bestScore"?(u(),p("span",{key:3,style:pe({color:e.scoreColor(b.bestScore),fontWeight:500,fontFamily:"monospace"})},s(b.bestScore.toFixed(4)),5)):d("v-if",!0),a.key==="status"?(u(),x(j,{key:4,color:e.statusColor(b.status)},{default:n(()=>[f(s(e.statusLabel(b.status)),1)]),_:2},1032,["color"])):d("v-if",!0),a.key==="createdAt"?(u(),p("span",bt,s(e.formatReputationTime(b.createdAt)),1)):d("v-if",!0),a.key==="action"?(u(),p(E,{key:6},[o(R,{size:"small",type:"link",onClick:W=>e.viewRunAnalytics(b)},{default:n(()=>[f(s(e.t("reputation.rowActions.analyze")),1)]),_:1},8,["onClick"]),b.status==="complete"?(u(),x(R,{key:0,size:"small",type:"link",style:{color:"#52c41a"},onClick:W=>e.applyRun(b)},{default:n(()=>[f(s(e.t("reputation.rowActions.apply")),1)]),_:1},8,["onClick"])):d("v-if",!0)],64)):d("v-if",!0)]),emptyText:n(()=>[v("div",vt,[o(e.ExperimentOutlined,{style:{"font-size":"36px","margin-bottom":"10px",display:"block"}}),f(" "+s(e.t("reputation.empty.runs")),1)])]),_:1},8,["columns","data-source","pagination","loading"])]),_:1},8,["tab"]),d(" ── Breakdown tab ───────────────────────────────────────── "),o(J,{key:"breakdown",tab:e.t("reputation.tabs.breakdown")},{default:n(()=>[o(V,{gutter:[16,16]},{default:n(()=>[o(z,{xs:24,lg:12},{default:n(()=>[o(O,{title:e.t("reputation.breakdown.byStatus"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[(u(!0),p(E,null,L(e.RUN_STATUSES,a=>(u(),p("div",{key:a,class:"bd-row"},[o(j,{color:e.statusColor(a),style:{"min-width":"80px","text-align":"center"}},{default:n(()=>[f(s(e.statusLabel(a)),1)]),_:2},1032,["color"]),o(F,{percent:e.pctOfTotal(e.stats.byStatus[a]||0,e.stats.totalRuns),"stroke-color":e.statusBarColor(a),format:()=>`${e.stats.byStatus[a]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1},8,["title"])]),_:1}),o(z,{xs:24,lg:12},{default:n(()=>[o(O,{title:e.t("reputation.breakdown.byObjective"),size:"small",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:n(()=>[(u(!0),p(E,null,L(e.OPTIMIZATION_OBJECTIVES,a=>(u(),p("div",{key:a,class:"bd-row"},[o(j,{color:e.objectiveColor(a),style:{"min-width":"100px","text-align":"center","font-family":"monospace"}},{default:n(()=>[f(s(e.objectiveLabel(a)),1)]),_:2},1032,["color"]),o(F,{percent:e.pctOfTotal(e.stats.byObjective[a]||0,e.stats.totalRuns),"stroke-color":e.objectiveBarColor(a),format:()=>`${e.stats.byObjective[a]||0}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128))]),_:1},8,["title"])]),_:1})]),_:1})]),_:1},8,["tab"])]),_:1},8,["activeKey"]),d(" ── Add observation modal ──────────────────────────────── "),o(Y,{open:e.showObserveModal,"onUpdate:open":t[8]||(t[8]=a=>e.showObserveModal=a),title:e.t("reputation.observe.title"),"confirm-loading":e.observing,width:540,"ok-text":e.t("reputation.observe.ok"),"cancel-text":e.t("common.cancel"),onOk:e.submitObservation,onCancel:e.resetObserveForm},{default:n(()=>[o(B,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[o(h,{label:e.t("reputation.observe.didLabel"),required:""},{default:n(()=>[o(S,{value:e.observeForm.did,"onUpdate:value":t[4]||(t[4]=a=>e.observeForm.did=a),placeholder:e.t("reputation.observe.didPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),o(h,{label:e.t("reputation.observe.scoreLabel"),required:""},{default:n(()=>[o(D,{value:e.observeForm.score,"onUpdate:value":t[5]||(t[5]=a=>e.observeForm.score=a),min:0,max:1,step:.05,style:{width:"160px"}},null,8,["value"]),v("span",_t,s(e.t("reputation.observe.scoreRange")),1)]),_:1},8,["label"]),o(h,{label:e.t("reputation.observe.kindLabel")},{default:n(()=>[o(I,{value:e.observeForm.kind,"onUpdate:value":t[6]||(t[6]=a=>e.observeForm.kind=a)},{default:n(()=>[(u(!0),p(E,null,L(e.OBSERVATION_KINDS,a=>(u(),x(T,{key:a,value:a},{default:n(()=>[f(s(e.kindLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(h,{label:e.t("reputation.observe.weightLabel")},{default:n(()=>[o(D,{value:e.observeForm.weight,"onUpdate:value":t[7]||(t[7]=a=>e.observeForm.weight=a),min:.1,step:.1,style:{width:"120px"}},null,8,["value"])]),_:1},8,["label"])]),_:1})]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),d(" ── Optimize modal ─────────────────────────────────────── "),o(Y,{open:e.showOptimizeModal,"onUpdate:open":t[11]||(t[11]=a=>e.showOptimizeModal=a),title:e.t("reputation.optimize.title"),"confirm-loading":e.optimizing,width:540,"ok-text":e.t("reputation.optimize.ok"),"cancel-text":e.t("common.cancel"),onOk:e.submitOptimization},{default:n(()=>[o(B,{"label-col":{span:5},"wrapper-col":{span:19},style:{"margin-top":"16px"}},{default:n(()=>[o(h,{label:e.t("reputation.optimize.objectiveLabel"),required:""},{default:n(()=>[o(I,{value:e.optimizeForm.objective,"onUpdate:value":t[9]||(t[9]=a=>e.optimizeForm.objective=a)},{default:n(()=>[(u(!0),p(E,null,L(e.OPTIMIZATION_OBJECTIVES,a=>(u(),x(T,{key:a,value:a},{default:n(()=>[f(s(e.objectiveLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"]),v("div",gt,s(e.objectiveDesc(e.optimizeForm.objective)),1)]),_:1},8,["label"]),o(h,{label:e.t("reputation.optimize.iterationsLabel")},{default:n(()=>[o(D,{value:e.optimizeForm.iterations,"onUpdate:value":t[10]||(t[10]=a=>e.optimizeForm.iterations=a),min:1,max:1e3,step:10,style:{width:"160px"}},null,8,["value"]),v("span",xt,s(e.t("reputation.optimize.iterationsRange")),1)]),_:1},8,["label"])]),_:1}),o(U,{type:"info","show-icon":"",message:e.t("reputation.optimize.syncMessage"),description:e.t("reputation.optimize.syncDescription"),style:{"margin-top":"12px"}},null,8,["message","description"])]),_:1},8,["open","title","confirm-loading","ok-text","cancel-text"]),d(" ── Anomaly detection modal ────────────────────────────── "),o(Y,{open:e.showAnomaliesModal,"onUpdate:open":t[15]||(t[15]=a=>e.showAnomaliesModal=a),title:e.t("reputation.anomaly.title"),width:640,footer:null},{default:n(()=>[v("div",kt,[o(B,{"label-col":{span:5},"wrapper-col":{span:19}},{default:n(()=>[o(h,{label:e.t("reputation.anomaly.methodLabel")},{default:n(()=>[o(X,{value:e.anomalyForm.method,"onUpdate:value":t[12]||(t[12]=a=>e.anomalyForm.method=a),"button-style":"solid"},{default:n(()=>[(u(!0),p(E,null,L(e.ANOMALY_METHODS,a=>(u(),x(P,{key:a,value:a},{default:n(()=>[f(s(a==="z_score"?e.t("reputation.anomaly.zScoreLabel"):e.t("reputation.anomaly.iqrLabel")),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(h,{label:e.t("reputation.anomaly.thresholdLabel")},{default:n(()=>[o(D,{value:e.anomalyForm.threshold,"onUpdate:value":t[13]||(t[13]=a=>e.anomalyForm.threshold=a),min:.5,step:.1,style:{width:"120px"}},null,8,["value"]),v("span",St,s(e.t("reputation.anomaly.thresholdHint")),1)]),_:1},8,["label"]),o(h,{label:e.t("reputation.anomaly.decayLabel")},{default:n(()=>[o(I,{value:e.anomalyForm.decay,"onUpdate:value":t[14]||(t[14]=a=>e.anomalyForm.decay=a),style:{width:"200px"}},{default:n(()=>[(u(!0),p(E,null,L(e.DECAY_MODELS,a=>(u(),x(T,{key:a,value:a},{default:n(()=>[f(s(e.decayLabel(a)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),_:1},8,["label"]),o(h,{"wrapper-col":{offset:5,span:19}},{default:n(()=>[o(R,{type:"primary",loading:e.detectingAnomalies,onClick:e.runAnomalyDetection},{icon:n(()=>[o(e.WarningOutlined)]),default:n(()=>[f(" "+s(e.t("reputation.anomaly.start")),1)]),_:1},8,["loading"])]),_:1})]),_:1}),o(oe),e.anomalyResult?(u(),p("div",ht,[o(V,{gutter:12,style:{"margin-bottom":"12px"}},{default:n(()=>[o(z,{span:8},{default:n(()=>[o(A,{title:e.t("reputation.anomaly.totalSamples"),value:e.anomalyResult.totalSamples,"value-style":{fontSize:"16px"}},null,8,["title","value"])]),_:1}),o(z,{span:8},{default:n(()=>[o(A,{title:e.t("reputation.anomaly.threshold"),value:e.anomalyResult.threshold,precision:2,"value-style":{fontSize:"16px"}},null,8,["title","value"])]),_:1}),o(z,{span:8},{default:n(()=>[o(A,{title:e.t("reputation.anomaly.anomalies"),value:e.anomalyResult.anomalies.length,"value-style":{color:e.anomalyResult.anomalies.length>0?"#ff4d4f":"#52c41a",fontSize:"16px"}},null,8,["title","value","value-style"])]),_:1})]),_:1}),e.anomalyResult.message?(u(),x(U,{key:0,message:e.anomalyResult.message,type:"warning","show-icon":"",style:{"margin-bottom":"12px"}},null,8,["message"])):d("v-if",!0),e.anomalyResult.anomalies.length?(u(),x(ee,{key:1,size:"small","data-source":e.anomalyResult.anomalies},{renderItem:n(({item:a})=>[o($,null,{default:n(()=>[v("span",Ot,s(a.did),1),o(j,{color:"red",style:{"margin-left":"8px"}},{default:n(()=>[f(s(e.t("reputation.anomaly.scoreTag",{score:a.score.toFixed(4)})),1)]),_:2},1024),v("span",zt,s(a.reason),1),a.zScore!==null?(u(),p("span",At,s(e.t("reputation.anomaly.zNote",{value:a.zScore.toFixed(2)})),1)):d("v-if",!0)]),_:2},1024)]),_:1},8,["data-source"])):d("v-if",!0)])):(u(),x(ae,{key:0,description:e.t("reputation.anomaly.notDetected"),image:e.EMPTY_IMG},null,8,["description","image"]))])]),_:1},8,["open","title"]),d(" ── Run analytics / details modal ──────────────────────── "),o(Y,{open:e.showAnalyticsModal,"onUpdate:open":t[16]||(t[16]=a=>e.showAnalyticsModal=a),title:e.t("reputation.analytics.title",{runId:e.currentRun?.runId?.slice(0,12)||""}),width:780,footer:null},{default:n(()=>[e.currentRun?(u(),p("div",Rt,[o(ne,{column:2,size:"small",bordered:""},{default:n(()=>[o(C,{label:e.t("reputation.analytics.objective")},{default:n(()=>[o(j,{color:e.objectiveColor(e.currentRun.objective)},{default:n(()=>[f(s(e.objectiveLabel(e.currentRun.objective)),1)]),_:1},8,["color"])]),_:1},8,["label"]),o(C,{label:e.t("reputation.analytics.status")},{default:n(()=>[o(j,{color:e.statusColor(e.currentRun.status)},{default:n(()=>[f(s(e.statusLabel(e.currentRun.status)),1)]),_:1},8,["color"])]),_:1},8,["label"]),o(C,{label:e.t("reputation.analytics.iterations")},{default:n(()=>[f(s(e.currentRun.iterations),1)]),_:1},8,["label"]),o(C,{label:e.t("reputation.analytics.bestScore")},{default:n(()=>[v("span",{style:pe({color:e.scoreColor(e.currentRun.bestScore),fontWeight:500,fontFamily:"monospace"})},s(e.currentRun.bestScore.toFixed(4)),5)]),_:1},8,["label"]),o(C,{label:e.t("reputation.analytics.createdAt")},{default:n(()=>[f(s(e.formatReputationTime(e.currentRun.createdAt)),1)]),_:1},8,["label"]),e.currentRun.completedAt?(u(),x(C,{key:0,label:e.t("reputation.analytics.completedAt")},{default:n(()=>[f(s(e.formatReputationTime(e.currentRun.completedAt)),1)]),_:1},8,["label"])):d("v-if",!0),e.currentRun.bestParams?(u(),x(C,{key:1,label:e.t("reputation.analytics.bestParams"),span:2},{default:n(()=>[v("pre",wt,s(e.formatParams(e.currentRun.bestParams)),1)]),_:1},8,["label"])):d("v-if",!0),e.currentRun.errorMessage?(u(),x(C,{key:2,label:e.t("reputation.analytics.errorMessage"),span:2},{default:n(()=>[v("span",jt,s(e.currentRun.errorMessage),1)]),_:1},8,["label"])):d("v-if",!0)]),_:1}),o(re,{spinning:e.loadingAnalytics},{default:n(()=>[e.currentAnalytics?(u(),p("div",Ct,[v("h4",Dt,s(e.t("reputation.analytics.distributionTitle")),1),o(O,{size:"small",style:{"margin-bottom":"12px"}},{default:n(()=>[(u(!0),p(E,null,L(e.currentAnalytics.reputationDistribution.buckets,a=>(u(),p("div",{key:a.label,class:"bucket-row"},[v("span",Tt,s(a.label),1),o(F,{percent:e.bucketPct(a),"stroke-color":a.count>0?"#1677ff":"#d9d9d9",format:()=>`${a.count}`,size:"small",style:{flex:"1","margin-left":"12px"}},null,8,["percent","stroke-color","format"])]))),128)),e.currentAnalytics.reputationDistribution.mean!==null?(u(),p("div",Et,[f(s(e.t("reputation.analytics.mean",{value:e.currentAnalytics.reputationDistribution.mean.toFixed(4)}))+" ",1),e.currentAnalytics.reputationDistribution.stdDev!==null?(u(),p("span",Ft,s(e.t("reputation.analytics.stdDev",{value:e.currentAnalytics.reputationDistribution.stdDev.toFixed(4)})),1)):d("v-if",!0)])):d("v-if",!0)]),_:1}),e.currentAnalytics.recommendations.length?(u(),x(O,{key:0,title:e.t("reputation.analytics.recommendations"),size:"small"},{default:n(()=>[o(ee,{size:"small","data-source":e.currentAnalytics.recommendations},{renderItem:n(({item:a})=>[o($,null,{default:n(()=>[o(e.ArrowRightOutlined,{style:{color:"#faad14","margin-right":"8px"}}),f(" "+s(a),1)]),_:2},1024)]),_:1},8,["data-source"])]),_:1},8,["title"])):d("v-if",!0)])):d("v-if",!0)]),_:1},8,["spinning"])])):d("v-if",!0)]),_:1},8,["open","title"])])}const io=Be(nt,[["render",It],["__scopeId","data-v-c4829a4e"],["__file","/tmp/cc-web-panel-EbDQZE/repo/packages/web-panel/src/views/Reputation.vue"]]);export{io as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E,b as w,r as b,I as m,J as y,U as a,R as g,c as i,K as u,V as h,F as C,Z as L,N as O,o as M,P as p,Q as S,S as R}from"./vendor-BvqAck49.js";import{u as I,_ as N}from"./index-oK90a36q.js";import{u as P}from"./useShellMode-CgR0wCYM.js";import{p as Q}from"./parsers-UEvh_ShA.js";import{u as z}from"./chat-ClEx1qbW.js";import{a9 as V,ap as j,R as q}from"./icons-DP3uiYxy.js";const A=E("skills",()=>{const _=b(!1),t=b([]),n=b(""),e=b("all"),k=w(()=>{const o=new Set(["all"]);return t.value.forEach(l=>{l.category&&o.add(l.category),l.executionMode&&o.add(l.executionMode)}),[...o]}),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=I();_.value=!0;try{if(P().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=Q(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}}),B={__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}},F={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},U={class:"page-sub"},D={style:{display:"flex",gap:"12px","margin-bottom":"20px","flex-wrap":"wrap"}},T={key:0,style:{"text-align":"center",padding:"60px"}},Z={class:"skills-grid"},G={style:{display:"flex","justify-content":"space-between","align-items":"flex-start"}},J={style:{flex:"1","min-width":"0"}},K={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px","font-family":"monospace"}},W={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",F,[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",D,[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",Z,[(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",K,g(s.name),1),a("div",W,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=N(B,[["render",$],["__scopeId","data-v-d64d43f5"],["__file","/tmp/cc-web-panel-EbDQZE/repo/packages/web-panel/src/views/Skills.vue"]]);export{ie as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{E as V,b as D,r as z,I as p,J as c,U as _,c as n,K as a,S as T,V as w,o as P,x as E,P as i,Q as g,R as r,F as h,Z as B}from"./vendor-BvqAck49.js";import{u as R,_ as F}from"./index-oK90a36q.js";import{R as O}from"./icons-DP3uiYxy.js";const I=V("tasks",()=>{const k=z([]),l=z(!1);let u=null,e=null;const b=D(()=>k.value.filter(t=>t.status==="running")),x=D(()=>k.value.filter(t=>t.status==="pending")),y=D(()=>k.value.filter(t=>t.status==="completed"||t.status==="failed"||t.status==="timeout"));async function f(){const t=R();l.value=!0;try{const s=await t.sendRaw({type:"tasks-list"});s&&Array.isArray(s.tasks)&&(k.value=s.tasks)}catch{}finally{l.value=!1}}async function o(t){const s=R();try{await s.sendRaw({type:"tasks-stop",taskId:t})}catch{}finally{await f()}}const d=z(null);function m(t=5e3){v(),f(),u=setInterval(f,t),C()}function v(){u&&(clearInterval(u),u=null),e&&(e(),e=null)}function C(){const t=R();if(e)return;const s=S=>{S.type==="task:notification"&&S.payload?.task&&(d.value=S.payload.task,f(),setTimeout(()=>{d.value=null},8e3))};e=t.onRuntimeEvent(s)}function N(t){return!t||t<0?"-":t<1e3?`${t}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:`${(t/6e4).toFixed(1)}m`}function A(t){switch(t){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:k,loading:l,running:b,pending:x,completed:y,lastNotification:d,fetchTasks:f,stopTask:o,startPolling:m,stopPolling:v,formatDuration:N,getStatusColor:A}}),U={__name:"Tasks",setup(k,{expose:l}){l();const u=I(),e=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function b(o){return o.status==="running"&&o.startedAt?u.formatDuration(Date.now()-o.startedAt):o.completedAt&&o.startedAt?u.formatDuration(o.completedAt-o.startedAt):"-"}function x(o){return o?new Date(o).toLocaleString():"-"}function y(o,d){return o?o.length>d?`${o.slice(0,d)}...`:o:""}P(()=>u.startPolling(5e3)),E(()=>u.stopPolling());const f={store:u,columns:e,getDuration:b,formatTime:x,truncate:y,onMounted:P,onUnmounted:E,get ReloadOutlined(){return O},get useTasksStore(){return I}};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}},L={class:"page-header"},Q={key:0,class:"error-text"},Z={key:1},j={class:"task-header"},J={class:"task-desc"},K={class:"task-id"},M={class:"task-meta"},W=["title"],q={key:0,class:"error-text"},G={key:1,class:"success-text"},H={key:2,class:"muted-text"};function X(k,l,u,e,b,x){const y=p("a-button"),f=p("a-space"),o=p("a-alert"),d=p("a-statistic"),m=p("a-card"),v=p("a-col"),C=p("a-row"),N=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",L,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(f,null,{default:a(()=>[n(y,{ghost:"",loading:e.store.loading,onClick:l[0]||(l[0]=t=>e.store.fetchTasks())},{icon:a(()=>[n(e.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.store.lastNotification?(i(),T(o,{key:0,type:e.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=t=>e.store.lastNotification=null)},{message:a(()=>[g(" 任务"+r(e.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(e.store.lastNotification.description||e.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[e.store.lastNotification.error?(i(),c("span",Q,r(e.store.lastNotification.error),1)):e.store.lastNotification.result?(i(),c("span",Z,r(e.truncate(String(e.store.lastNotification.result),120)),1)):w("v-if",!0)]),_:1},8,["type"])):w("v-if",!0),n(C,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"全部任务",value:e.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"运行中",value:e.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"等待中",value:e.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(v,{xs:12,sm:6},{default:a(()=>[n(m,{class:"stat-card",size:"small"},{default:a(()=>[n(d,{title:"已完成",value:e.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),e.store.running.length>0?(i(),T(m,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(h,null,B(e.store.running,t=>(i(),c("div",{key:t.id,class:"task-item running"},[_("div",j,[n(N,{color:e.store.getStatusColor(t.status)},{default:a(()=>[g(r(t.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",J,r(t.description),1),_("span",K,r(t.id.slice(0,16)),1)]),_("div",M,[_("span",null,"类型: "+r(t.type||"-"),1),_("span",null,"已运行: "+r(e.store.formatDuration(Date.now()-t.startedAt)),1),n(y,{size:"small",danger:"",onClick:s=>e.store.stopTask(t.id)},{default:a(()=>[...l[4]||(l[4]=[g("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):w("v-if",!0),n(m,{class:"panel-card"},{default:a(()=>[n(A,{columns:e.columns,"data-source":e.store.tasks,pagination:{pageSize:15,size:"small"},loading:e.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:t,record:s})=>[t.key==="status"?(i(),T(N,{key:0,color:e.store.getStatusColor(s.status)},{default:a(()=>[g(r(s.status),1)]),_:2},1032,["color"])):t.key==="description"?(i(),c("span",{key:1,title:s.command},r(s.description),9,W)):t.key==="duration"?(i(),c(h,{key:2},[g(r(e.getDuration(s)),1)],64)):t.key==="createdAt"?(i(),c(h,{key:3},[g(r(e.formatTime(s.createdAt)),1)],64)):t.key==="result"?(i(),c(h,{key:4},[s.error?(i(),c("span",q,r(e.truncate(s.error,60)),1)):s.result?(i(),c("span",G,r(e.truncate(String(s.result),60)),1)):(i(),c("span",H,"-"))],64)):t.key==="action"?(i(),c(h,{key:5},[s.status==="running"?(i(),T(y,{key:0,size:"small",danger:"",onClick:S=>e.store.stopTask(s.id)},{default:a(()=>[...l[5]||(l[5]=[g(" 停止 ",-1)])]),_:1},8,["onClick"])):w("v-if",!0)],64)):w("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const et=F(U,[["render",X],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-EbDQZE/repo/packages/web-panel/src/views/Tasks.vue"]]);export{et as default};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./xterm-BZcWGsqw.js","./markdown-CsiA8-E5.js","./markdown-Dfs9RUU9.css","./addon-fit-CK6X9sAG.js","./xterm-DFuMZ0ql.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{u as fe,_ as me,d as V,e as U}from"./index-oK90a36q.js";import{I as z,J as x,U as _,Q as P,S as J,K as T,V as R,c as A,F as K,Z as Y,R as E,o as G,f as H,w as $,n as q,b as ee,r as S,P as y,_ as ve,a2 as we,a3 as he,a4 as _e}from"./vendor-BvqAck49.js";import{R as ye,b as pe,as as ge}from"./icons-DP3uiYxy.js";const k=new Map,C=new Map,N=new Set,F=new Set;let te=!1;function xe(c){te||(te=!0,c.onMessage(o=>{if(!(!o||typeof o.type!="string")){if(o.type==="terminal.stdout"){const{sessionId:s,data:e,seq:i}=o.payload||{};if(!s)return;let w;try{const d=atob(e||""),f=new Uint8Array(d.length);for(let n=0;n<d.length;n++)f[n]=d.charCodeAt(n);w=new TextDecoder("utf-8").decode(f)}catch{w=""}const u={sessionId:s,data:w,seq:i};k.get(s)?.forEach(d=>d(u)),N.forEach(d=>d(u))}else if(o.type==="terminal.exit"){const{sessionId:s,exitCode:e,signal:i}=o.payload||{};if(!s)return;const w={sessionId:s,exitCode:e,signal:i};C.get(s)?.forEach(u=>u(w)),F.forEach(u=>u(w))}}}))}function ne(c){const o=new TextEncoder().encode(c);let s="";for(let e=0;e<o.length;e++)s+=String.fromCharCode(o[e]);return btoa(s)}function ae(c){const o=atob(c||""),s=new Uint8Array(o.length);for(let e=0;e<o.length;e++)s[e]=o.charCodeAt(e);return new TextDecoder("utf-8").decode(s)}function oe(){const c=fe();xe(c);async function o(n={}){const a=await c.sendRaw({type:"terminal.create",payload:{shell:n.shell,cwd:n.cwd,env:n.env,cols:n.cols,rows:n.rows}});if(a.ok===!1)throw new Error(a.error||"terminal_create_failed");return a.result??a}async function s(){const n=await c.sendRaw({type:"terminal.list",payload:{}});if(n.ok===!1)throw new Error(n.error||"terminal_list_failed");const a=n.result??n;return Array.isArray(a.sessions)?a.sessions:[]}async function e(n,a){const r=await c.sendRaw({type:"terminal.stdin",payload:{sessionId:n,data:ne(String(a))}});if(r.ok===!1)throw new Error(r.error||"terminal_stdin_failed");return r.result??r}async function i(n,a,r){const h=await c.sendRaw({type:"terminal.resize",payload:{sessionId:n,cols:a,rows:r}});if(h.ok===!1)throw new Error(h.error||"terminal_resize_failed");return h.result??h}async function w(n){const a=await c.sendRaw({type:"terminal.close",payload:{sessionId:n}});if(a.ok===!1)throw new Error(a.error||"terminal_close_failed");return a.result??a}async function u(n,a=0){const r=await c.sendRaw({type:"terminal.history",payload:{sessionId:n,fromSeq:a}});if(r.ok===!1)throw new Error(r.error||"terminal_history_failed");const h=r.result??r;return{truncated:!!h.truncated,chunks:(h.chunks||[]).map(D=>({seq:D.seq,data:ae(D.data)}))}}function d(n,a){return n?(k.has(n)||k.set(n,new Set),k.get(n).add(a),()=>{k.get(n)?.delete(a),k.get(n)?.size===0&&k.delete(n)}):(N.add(a),()=>N.delete(a))}function f(n,a){return n?(C.has(n)||C.set(n,new Set),C.get(n).add(a),()=>{C.get(n)?.delete(a),C.get(n)?.size===0&&C.delete(n)}):(F.add(a),()=>F.delete(a))}return{create:o,list:s,stdin:e,resize:i,close:w,history:u,onStdout:d,onExit:f,_internal:{stdoutSubs:k,exitSubs:C,toBase64Utf8:ne,fromBase64Utf8:ae}}}const Se={__name:"Terminal",setup(c,{expose:o}){o();const s=oe(),e=S([]),i=S(null),w=S("pwsh"),u=S(!1),d=S(!1),f=S(""),n=S(""),a=S([]),r=[{value:"pwsh",label:"PowerShell"},{value:"cmd",label:"CMD"},{value:"bash",label:"Bash"},{value:"wsl",label:"WSL"}],h=ee(()=>e.value.find(t=>t.id===i.value));function D(t){return t?t.slice(0,8):""}let O=null,M=null;async function I(){if(O)return{xtermMod:O,fitAddonMod:M};try{O=await U(()=>import("./xterm-BZcWGsqw.js").then(t=>t.x),__vite__mapDeps([0,1,2]),import.meta.url),M=await U(()=>import("./addon-fit-CK6X9sAG.js").then(t=>t.a),__vite__mapDeps([3,1,2]),import.meta.url),await U(()=>Promise.resolve({}),__vite__mapDeps([4]),import.meta.url)}catch(t){throw n.value="xterm 资源加载失败:"+(t?.message||"未知错误"),t}return{xtermMod:O,fitAddonMod:M}}async function B(t){await q();const{xtermMod:l,fitAddonMod:p}=await I(),b=a.value.find(v=>v?.dataset?.sessionId===t.id);if(!b)return;const m=new l.Terminal({cursorBlink:!0,fontFamily:'Consolas, "Courier New", monospace',fontSize:13,theme:{background:"#1e1e1e",foreground:"#d4d4d4"},convertEol:!1}),L=new p.FitAddon;m.loadAddon(L),m.open(b);try{L.fit()}catch{}t.xterm=m,t.fitAddon=L;const ie=m.onData(v=>{s.stdin(t.id,v).catch(g=>{String(g?.message||"").includes("dangerous_keyword_blocked")?V.warning("该命令被桌面端拦截(高危关键字)"):V.error("stdin 失败: "+(g?.message||g))})}),ce=s.onStdout(t.id,({data:v,seq:g})=>{t.lastSeq=g,m.write(v)}),de=s.onExit(t.id,({exitCode:v,signal:g})=>{t.alive=!1,t.exitCode=v,t.signal=g,m.writeln(`\r
|
|
3
|
-
\x1B[33m[session exited, code=${v}, signal=${g??"-"}]\x1B[0m`)});t.offs=()=>{try{ie.dispose?.()}catch{}ce(),de()};try{const{chunks:v,truncated:g}=await s.history(t.id,0);g&&m.writeln("\x1B[2m[history truncated — earlier output was evicted]\x1B[0m");for(const j of v)m.write(j.data),t.lastSeq=j.seq}catch(v){m.writeln(`\x1B[31m[history fetch failed: ${v?.message||v}]\x1B[0m`)}const Z=new ResizeObserver(()=>{try{L.fit(),s.resize(t.id,m.cols,m.rows).catch(()=>{})}catch{}});Z.observe(b);const ue=t.offs;t.offs=()=>{try{Z.disconnect()}catch{}ue()}}async function re(){u.value=!0,f.value="";try{const t=await s.create({shell:w.value,cols:80,rows:24}),l={id:t.sessionId,shell:t.shell,cwd:"",alive:!0,lastSeq:0,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(l),i.value=l.id,await B(l)}catch(t){f.value=t?.message||String(t)}finally{u.value=!1}}async function se(t){try{await s.close(t)}catch(l){f.value=l?.message||String(l)}setTimeout(()=>W(t),500)}function W(t){const l=e.value.findIndex(b=>b.id===t);if(l===-1)return;const p=e.value[l];try{p.offs?.()}catch{}try{p.xterm?.dispose?.()}catch{}e.value.splice(l,1),i.value===t&&(i.value=e.value[0]?.id||null)}function le(t){i.value=t,q(()=>{const l=e.value.find(p=>p.id===t);try{l?.fitAddon?.fit()}catch{}})}async function Q(){d.value=!0,f.value="";try{const t=await s.list();for(const l of t){const p=e.value.find(m=>m.id===l.id);if(p){p.alive=l.alive,p.lastSeq=l.lastSeq;continue}const b={id:l.id,shell:l.shell,cwd:l.cwd,alive:l.alive,lastSeq:l.lastSeq,exitCode:null,xterm:null,fitAddon:null,offs:()=>{}};e.value.push(b),await B(b)}!i.value&&e.value.length>0&&(i.value=e.value[0].id)}catch(t){f.value=t?.message||String(t)}finally{d.value=!1}}G(async()=>{await Q()}),H(()=>{for(const t of e.value){try{t.offs?.()}catch{}try{t.xterm?.dispose?.()}catch{}}}),$(i,()=>{q(()=>{const t=h.value;try{t?.fitAddon?.fit()}catch{}})});const X={term:s,sessions:e,activeId:i,newShell:w,creating:u,loadingList:d,error:f,warning:n,xtermContainers:a,shellOptions:r,active:h,shortId:D,get xtermMod(){return O},set xtermMod(t){O=t},get fitAddonMod(){return M},set fitAddonMod(t){M=t},loadXterm:I,mountXterm:B,onCreate:re,onClose:se,removeSession:W,activate:le,refreshList:Q,ref:S,computed:ee,onMounted:G,onBeforeUnmount:H,nextTick:q,watch:$,get message(){return V},get PlusOutlined(){return ge},get CloseOutlined(){return pe},get ReloadOutlined(){return ye},get useTerminal(){return oe}};return Object.defineProperty(X,"__isScriptSetup",{enumerable:!1,value:!0}),X}},be={class:"terminal-page"},ke={class:"terminal-header"},Ce={class:"page-sub"},Ae={class:"terminal-body"},Ee={class:"session-tabs"},Oe=["onClick"],Te={class:"session-shell"},Re={class:"session-id"},Me={key:0,class:"session-empty"},ze={class:"xterm-host"},De=["data-session-id"],Le={key:0,class:"xterm-placeholder"},Pe={key:1,class:"terminal-footer"},qe={key:0,class:"footer-exit"};function Be(c,o,s,e,i,w){const u=z("a-tag"),d=z("a-select"),f=z("a-button"),n=z("a-space"),a=z("a-alert");return y(),x("div",be,[_("div",ke,[_("div",null,[o[3]||(o[3]=_("h2",{class:"page-title"},"远程终端",-1)),_("p",Ce,[o[2]||(o[2]=P(" 桌面端托管的 PTY 会话;Android 端可远程操控同一通道 ",-1)),e.warning?(y(),J(u,{key:0,color:"orange",style:{"margin-left":"8px"}},{default:T(()=>[P(E(e.warning),1)]),_:1})):R("v-if",!0)])]),A(n,null,{default:T(()=>[A(d,{value:e.newShell,"onUpdate:value":o[0]||(o[0]=r=>e.newShell=r),style:{width:"130px"},size:"small",options:e.shellOptions},null,8,["value"]),A(f,{type:"primary",size:"small",loading:e.creating,onClick:e.onCreate},{icon:T(()=>[A(e.PlusOutlined)]),default:T(()=>[o[4]||(o[4]=P(" 新会话 ",-1))]),_:1},8,["loading"]),A(f,{size:"small",loading:e.loadingList,onClick:e.refreshList},{icon:T(()=>[A(e.ReloadOutlined)]),default:T(()=>[o[5]||(o[5]=P(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),e.error?(y(),J(a,{key:0,message:e.error,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"12px"},onClose:o[1]||(o[1]=r=>e.error="")},null,8,["message"])):R("v-if",!0),_("div",Ae,[_("div",Ee,[(y(!0),x(K,null,Y(e.sessions,r=>(y(),x("div",{key:r.id,class:ve(["session-tab",{active:r.id===e.activeId,dead:!r.alive}]),onClick:h=>e.activate(r.id)},[_("span",Te,E(r.shell),1),_("span",Re,E(e.shortId(r.id)),1),A(e.CloseOutlined,{class:"session-close",onClick:we(h=>e.onClose(r.id),["stop"])},null,8,["onClick"])],10,Oe))),128)),e.sessions.length===0?(y(),x("div",Me,' 点击 "新会话" 创建第一个终端 ')):R("v-if",!0)]),_("div",ze,[(y(!0),x(K,null,Y(e.sessions,r=>he((y(),x("div",{key:r.id,ref_for:!0,ref:"xtermContainers","data-session-id":r.id,class:"xterm-container"},null,8,De)),[[_e,r.id===e.activeId]])),128)),e.sessions.length===0?(y(),x("div",Le,[...o[6]||(o[6]=[_("span",null,"无活跃会话",-1)])])):R("v-if",!0)])]),e.active?(y(),x("div",Pe,[_("span",null,E(e.active.shell)+" · "+E(e.active.cwd||"(默认 cwd)")+" · seq "+E(e.active.lastSeq),1),e.active.alive?R("v-if",!0):(y(),x("span",qe,"已退出 (code="+E(e.active.exitCode??"-")+")",1))])):R("v-if",!0)])}const Fe=me(Se,[["render",Be],["__scopeId","data-v-65366a29"],["__file","/tmp/cc-web-panel-EbDQZE/repo/packages/web-panel/src/views/Terminal.vue"]]);export{Fe as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{O as r}from"./index-oK90a36q.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-CfFRxFir.js";import{U as t}from"./index-oK90a36q.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-DGmwHltc.js";import"./useFlexGapSupport-DiMKO4Xv.js";import"./styleChecker-D4lnP6aI.js";import"./index-Dt3yAuCK.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-Df317HUo.js";import{U as t}from"./index-oK90a36q.js";import"./vendor-BvqAck49.js";import"./index-Dt3yAuCK.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};
|