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.
Files changed (168) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-BB5mADdi.js → AIOps-DLvvkb9x.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BcIs1DhT.js → ActionButton-BxhQTwqd.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-CNhfaUbF.js → Analytics-C4oUXzhG.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-D1T07CY4.js → AppLayout-CjzKJdv3.js} +5 -5
  7. package/src/assets/web-panel/assets/{Audit-Et29_1F4.js → Audit-B-MrugUs.js} +1 -1
  8. package/src/assets/web-panel/assets/{Backup-B0ggFwOy.js → Backup-ecIfEpIZ.js} +1 -1
  9. package/src/assets/web-panel/assets/{BaseInput-ChTsFhxU.js → BaseInput-BUcSfWnx.js} +1 -1
  10. package/src/assets/web-panel/assets/{Chat-H5DMwE1E.js → Chat-DIc1n_Lk.js} +6 -6
  11. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CBQYVCUs.js → ChatBubbleRenderer-BGzg7oVA.js} +1 -1
  12. package/src/assets/web-panel/assets/{Checkbox-DBsH3Plc.js → Checkbox-BQ3Ueff-.js} +1 -1
  13. package/src/assets/web-panel/assets/{Codegen-gGtw6sXf.js → Codegen-CvSGLnqE.js} +1 -1
  14. package/src/assets/web-panel/assets/{Col-Df317HUo.js → Col-Br9IXZcE.js} +1 -1
  15. package/src/assets/web-panel/assets/{Community-CSERdOno.js → Community-tPuLOf0r.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compact-D31wUdGx.js → Compact-vMWH73BE.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compliance-92p7-fAe.js → Compliance-Ct9z699x.js} +1 -1
  18. package/src/assets/web-panel/assets/{Cowork-B_HJ_3fc.js → Cowork-Bxs1kL1y.js} +3 -3
  19. package/src/assets/web-panel/assets/{Cron-DIAgns-d.js → Cron-QEpr2k4U.js} +2 -2
  20. package/src/assets/web-panel/assets/{Crosschain--pT2fZrx.js → Crosschain-u4xbUw6O.js} +1 -1
  21. package/src/assets/web-panel/assets/{DID-BR_apx67.js → DID-DXTEvyrW.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dashboard-CIv6YbX3.js → Dashboard-C4pZgzkg.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dropdown-BByKNFqx.js → Dropdown-LRuqREGe.js} +1 -1
  24. package/src/assets/web-panel/assets/EmailListRenderer-D7XI1yBM.js +1 -0
  25. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CA9WH0R8.js → FamilyGuardDashboard-3y_SuAMQ.js} +1 -1
  26. package/src/assets/web-panel/assets/{Federation-CnOtOrN0.js → Federation-DbjbJJCW.js} +1 -1
  27. package/src/assets/web-panel/assets/{FormItemContext-CW4kzO3J.js → FormItemContext-WPpMZcUw.js} +1 -1
  28. package/src/assets/web-panel/assets/{GenericCardRenderer-CUVA-qrZ.js → GenericCardRenderer-nNT9Tn4E.js} +1 -1
  29. package/src/assets/web-panel/assets/{Git-Dl9HG9Yo.js → Git-DqDaVzwV.js} +2 -2
  30. package/src/assets/web-panel/assets/{Governance-BgieRKC3.js → Governance-BquBZpcg.js} +1 -1
  31. package/src/assets/web-panel/assets/{Inference-55hVpHm_.js → Inference-RcPPYijs.js} +1 -1
  32. package/src/assets/web-panel/assets/{KnowledgeGraph-BCSm8nT7.js → KnowledgeGraph-ByXfZV13.js} +1 -1
  33. package/src/assets/web-panel/assets/{Logs-DPR2qyoe.js → Logs-CHT3DUcq.js} +2 -2
  34. package/src/assets/web-panel/assets/{Marketplace-DSfYHaLe.js → Marketplace-Bi0HJ9pN.js} +1 -1
  35. package/src/assets/web-panel/assets/{McpTools-DvP_EW02.js → McpTools-QCBxPRRc.js} +4 -4
  36. package/src/assets/web-panel/assets/{Memory-vpNLjkQh.js → Memory-D4RlxGXn.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileBridge-DXT2hsiu.js → MobileBridge-CU_PV7e-.js} +2 -2
  38. package/src/assets/web-panel/assets/{MobileProjects-wh6wAgGH.js → MobileProjects-c1CMFD8z.js} +1 -1
  39. package/src/assets/web-panel/assets/{Mtc-hLUm4hEi.js → Mtc-BezDB1-s.js} +5 -5
  40. package/src/assets/web-panel/assets/{MtcAudit-DapBAJjs.js → MtcAudit-CgLpiHpE.js} +6 -6
  41. package/src/assets/web-panel/assets/{Multisig-hQs0FE-E.js → Multisig-vx6bz-bA.js} +3 -3
  42. package/src/assets/web-panel/assets/{NLProgramming-JHOgd9cA.js → NLProgramming-CGOagg3-.js} +1 -1
  43. package/src/assets/web-panel/assets/{Notes-CRF8S0xK.js → Notes-BcuDGYRS.js} +4 -4
  44. package/src/assets/web-panel/assets/{NotificationSettings-VYaLm62h.js → NotificationSettings-ZAGCDUpc.js} +1 -1
  45. package/src/assets/web-panel/assets/{OrderTableRenderer-PNYP-hFh.js → OrderTableRenderer-B5onE0eX.js} +1 -1
  46. package/src/assets/web-panel/assets/{Organization-DnrXiOjr.js → Organization-y_y20-5Y.js} +4 -4
  47. package/src/assets/web-panel/assets/{Overflow-y0VkBEmD.js → Overflow-BEICS31D.js} +1 -1
  48. package/src/assets/web-panel/assets/{P2P-jK93QK2m.js → P2P-D_WRMzh4.js} +2 -2
  49. package/src/assets/web-panel/assets/PdhVaultBrowser-C8f5NbbI.js +7 -0
  50. package/src/assets/web-panel/assets/{Permissions-6u2dj6z7.js → Permissions-3aqCc_4f.js} +4 -4
  51. package/src/assets/web-panel/assets/{PersonalDataHub-E0j19ibV.js → PersonalDataHub-DT3R9g9Y.js} +3 -3
  52. package/src/assets/web-panel/assets/{Pipeline-2YSzaqHA.js → Pipeline-MiMWIhw0.js} +1 -1
  53. package/src/assets/web-panel/assets/{Privacy-jhYDq4eK.js → Privacy-C3JsLuDa.js} +1 -1
  54. package/src/assets/web-panel/assets/{ProjectInit-C4UBpmgK.js → ProjectInit-EhHVi1ff.js} +2 -2
  55. package/src/assets/web-panel/assets/{ProjectSettings-B-BYxXeT.js → ProjectSettings-D_dNEA37.js} +2 -2
  56. package/src/assets/web-panel/assets/{Projects-Dn-wcIfk.js → Projects-CXydUXp8.js} +1 -1
  57. package/src/assets/web-panel/assets/{Providers-B9oU5w2Y.js → Providers-CPEhi2iZ.js} +1 -1
  58. package/src/assets/web-panel/assets/{QuickAsk-BSEAjKKg.js → QuickAsk-BFQpMleX.js} +1 -1
  59. package/src/assets/web-panel/assets/{Recommend-B2G2qN0o.js → Recommend-DzbovRC8.js} +1 -1
  60. package/src/assets/web-panel/assets/Reputation-DoBeV3TD.js +1 -0
  61. package/src/assets/web-panel/assets/{Row-CfFRxFir.js → Row-DthhwX_B.js} +1 -1
  62. package/src/assets/web-panel/assets/{RssFeed-Cr7P2tEV.js → RssFeed-Dsf5U0lP.js} +3 -3
  63. package/src/assets/web-panel/assets/{Search-DU23Ncv0.js → Search-CJPB8kKl.js} +1 -1
  64. package/src/assets/web-panel/assets/{Security-XlP_XKyJ.js → Security-DI9MfpdD.js} +4 -4
  65. package/src/assets/web-panel/assets/{Services-CvmT7pHE.js → Services-BdG0TFGf.js} +2 -2
  66. package/src/assets/web-panel/assets/{Skeleton-r38WJidJ.js → Skeleton-DSYazY_B.js} +1 -1
  67. package/src/assets/web-panel/assets/Skills-BD309VTT.js +1 -0
  68. package/src/assets/web-panel/assets/{Sla-D4EOWYSw.js → Sla-CaUlw4_6.js} +1 -1
  69. package/src/assets/web-panel/assets/{SpeechSettings-COVO-nuO.js → SpeechSettings-CZAPkR7H.js} +1 -1
  70. package/src/assets/web-panel/assets/{SyncSettings-CFworQPJ.js → SyncSettings-CFRSowN3.js} +2 -2
  71. package/src/assets/web-panel/assets/Tasks-Di8EOluc.js +1 -0
  72. package/src/assets/web-panel/assets/{Templates-CXcol1Sm.js → Templates-B5FTziwi.js} +1 -1
  73. package/src/assets/web-panel/assets/{Tenant-DthNkjQO.js → Tenant-Dj3XYfBg.js} +1 -1
  74. package/src/assets/web-panel/assets/Terminal-CznH_rJT.js +3 -0
  75. package/src/assets/web-panel/assets/{TimelineRenderer-Dd9CmQ-l.js → TimelineRenderer-DTHzaXPt.js} +1 -1
  76. package/src/assets/web-panel/assets/{Tokens-DoV9Eaxw.js → Tokens-Bo56nuML.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trigger-t0b7L2h7.js → Trigger-pyVUVBwb.js} +1 -1
  78. package/src/assets/web-panel/assets/{Trust-fXDFZevl.js → Trust-Cp7jMkKN.js} +1 -1
  79. package/src/assets/web-panel/assets/{UkeySign-c7zmwDuv.js → UkeySign-aPcZCdpz.js} +1 -1
  80. package/src/assets/web-panel/assets/{VideoEditing-AxUsMrpY.js → VideoEditing-DAv5j--w.js} +1 -1
  81. package/src/assets/web-panel/assets/{Wallet-BB6Hkf9D.js → Wallet-DRhK7IDR.js} +4 -4
  82. package/src/assets/web-panel/assets/{WebAuthn-JBl4_qBv.js → WebAuthn-B2yQJuq8.js} +4 -4
  83. package/src/assets/web-panel/assets/{WorkflowEditor-BMOyglO4.js → WorkflowEditor-D98DhR54.js} +1 -1
  84. package/src/assets/web-panel/assets/{chat-ClEx1qbW.js → chat-BXrRNi8C.js} +1 -1
  85. package/src/assets/web-panel/assets/{colors-DBawfCLx.js → colors-jQ94T_qn.js} +1 -1
  86. package/src/assets/web-panel/assets/{compact-item-BZff7uOC.js → compact-item-KqUJLlF2.js} +1 -1
  87. package/src/assets/web-panel/assets/{createContext-pWYC3gCE.js → createContext-DxM3zuQW.js} +1 -1
  88. package/src/assets/web-panel/assets/devWarning-Bo1r5_zX.js +1 -0
  89. package/src/assets/web-panel/assets/{hasIn-lX6sY5PY.js → hasIn-BGm946KV.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-Dm_BVdZG.js → index-1P0sXNhG.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-DdXLG_Lh.js → index-B-2HpfWo.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-CRhurdyB.js → index-B4b7KjRq.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-B2m7AQfe.js → index-BAPk6ntc.js} +1 -1
  94. package/src/assets/web-panel/assets/index-BCU6dVQ-.js +1 -0
  95. package/src/assets/web-panel/assets/{index-OYqduj3d.js → index-BGjCjsf1.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BdKd25BC.js → index-BMp41Q1Y.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-Dt3yAuCK.js → index-BXMZLfd8.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-5ER-NP_g.js → index-BaU_fSK7.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BYgqlm3l.js → index-BbS0cBU9.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-oETPgXwU.js → index-BnEZfi5D.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-C6QoSIPt.js → index-C5NQai7O.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BkUBHiXd.js → index-C7Z2m28C.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-B0xNvq3Z.js → index-C7sBLech.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DH58L6nn.js → index-CbQvgx2e.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Cd3KxxFO.js → index-Ce-YoL4x.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Dj-c7GTQ.js → index-CfE3jxrT.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DE0RpNJf.js → index-CghRL1dh.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Oirvb-h0.js → index-CreXAr5Y.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-B0cwx_ly.js → index-Crw76vIF.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CXBf3t5D.js → index-Cz_SFSix.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-B7xkvbtG.js → index-D1VWL6Lc.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Bxy05j6q.js → index-DOYcemym.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Bvcasgi2.js → index-DRzsaWQy.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Bp4RaoTi.js → index-DSzb9VOG.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DQTfwMek.js → index-DTUs9t5F.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-oK90a36q.js → index-DWcd5zDG.js} +3 -3
  117. package/src/assets/web-panel/assets/{index-Cewjdty4.js → index-DZMzj4ay.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-D4tHr9Y9.js → index-DZpVYD4j.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-E7dpMseg.js → index-DboUBf6R.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CEc3MwP8.js → index-Dgzw6eKr.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CXBvWyps.js → index-Dib0FsTT.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DPXnMie3.js → index-FSYz5aww.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CdXWNqWZ.js → index-LWTZAud0.js} +1 -1
  124. package/src/assets/web-panel/assets/index-N_oOFphx.js +1 -0
  125. package/src/assets/web-panel/assets/{index-mBBrUDzF.js → index-T4UJiTi3.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-F4__gs9X.js → index-aOLXuHpG.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CI6hB8lg.js → index-mZNLT2SP.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CLqR3qaE.js → index-yavsyHif.js} +1 -1
  129. package/src/assets/web-panel/assets/{initDefaultProps-BTUpF0QI.js → initDefaultProps-BDoZJI7g.js} +1 -1
  130. package/src/assets/web-panel/assets/{motion-2WeVnnEL.js → motion-sceLjgp-.js} +1 -1
  131. package/src/assets/web-panel/assets/{move-WjKqLduO.js → move-CTWQpFa7.js} +1 -1
  132. package/src/assets/web-panel/assets/{omit-DnFKewM5.js → omit-dr-NCrHZ.js} +1 -1
  133. package/src/assets/web-panel/assets/{pickAttrs-C6Y6tV6C.js → pickAttrs-DK-GX_Z2.js} +1 -1
  134. package/src/assets/web-panel/assets/{placementArrow-5GZUx8Lr.js → placementArrow-BIPf--18.js} +1 -1
  135. package/src/assets/web-panel/assets/{responsiveObserve-DGmwHltc.js → responsiveObserve-BzrWT5tV.js} +1 -1
  136. package/src/assets/web-panel/assets/{slide-RbVe2IlW.js → slide-D5XhxlET.js} +1 -1
  137. package/src/assets/web-panel/assets/{statusUtils-CqyCtZXh.js → statusUtils-6DI-k-9E.js} +1 -1
  138. package/src/assets/web-panel/assets/{styleChecker-D4lnP6aI.js → styleChecker-DMw-eyn9.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFlexGapSupport-DiMKO4Xv.js → useFlexGapSupport-D4oVdliM.js} +1 -1
  140. package/src/assets/web-panel/assets/{useFs--HqUmdpU.js → useFs-D3PPZnvy.js} +1 -1
  141. package/src/assets/web-panel/assets/{usePersonalDataHub-4h3Apiwr.js → usePersonalDataHub-Gh5ba4KP.js} +1 -1
  142. package/src/assets/web-panel/assets/{vnode-BKpoqKhe.js → vnode-CVEM1u4x.js} +1 -1
  143. package/src/assets/web-panel/assets/{zoom-D1RKjeeJ.js → zoom-ClT_-9RZ.js} +1 -1
  144. package/src/assets/web-panel/index.html +1 -1
  145. package/src/commands/pdh.js +162 -0
  146. package/src/harness/mcp-client.js +19 -2
  147. package/src/harness/mock-llm-provider.js +14 -0
  148. package/src/index.js +2 -0
  149. package/src/lib/claude-code-bridge.js +14 -2
  150. package/src/lib/file-checkpoint.js +30 -4
  151. package/src/lib/pdh-bridge.js +266 -0
  152. package/src/lib/repl-completer.js +5 -1
  153. package/src/lib/session-tail.js +6 -1
  154. package/src/lib/skill-mcp.js +10 -4
  155. package/src/repl/agent-repl.js +13 -6
  156. package/src/runtime/agent-core.js +25 -0
  157. package/src/runtime/headless-runner.js +39 -5
  158. package/src/runtime/headless-stream.js +92 -1
  159. package/src/runtime/mcp-config.js +104 -3
  160. package/src/assets/web-panel/assets/EmailListRenderer-DKCmhw1W.js +0 -1
  161. package/src/assets/web-panel/assets/PdhVaultBrowser-BITZbGtU.js +0 -7
  162. package/src/assets/web-panel/assets/Reputation-cdXZrYdH.js +0 -1
  163. package/src/assets/web-panel/assets/Skills-Bd49FHct.js +0 -1
  164. package/src/assets/web-panel/assets/Tasks-mWQgh-Xq.js +0 -1
  165. package/src/assets/web-panel/assets/Terminal-BuX3TG_s.js +0 -3
  166. package/src/assets/web-panel/assets/devWarning-B1b-Rehg.js +0 -1
  167. package/src/assets/web-panel/assets/index-Bv1uJXTd.js +0 -1
  168. 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 += typeof chunk === "string" ? chunk : chunk.toString("utf-8");
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
- writeErr(` mcp: failed to connect "${name}": ${err.message}\n`);
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};