chainlesschain 0.166.29 → 0.166.30

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 (161) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-D4Dhiipq.js → AIOps-D0L1OM_i.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-P6fPjlUB.js → ActionButton-CeZUkX_V.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-CzeKpXdh.js → Analytics-P_7CIOew.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-Cj8CqntA.js → AppLayout-NuqDYrlO.js} +3 -3
  6. package/src/assets/web-panel/assets/{Artifacts-BOe7lviy.js → Artifacts-D1BTQqJM.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-D6kxPJyo.js → Audit-D9XL6DVf.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-OVuYY65D.js → BackgroundAgents-Ci2DB2gV.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-UAlkEXOa.js → Backup-CreK3Yqn.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-DikQWFIL.js → BaseInput-BkIRKFXX.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-CEpqrZcV.js → Chat-BoJjlCDT.js} +5 -5
  12. package/src/assets/web-panel/assets/ChatBubbleRenderer-D68YIuni.js +1 -0
  13. package/src/assets/web-panel/assets/{Checkbox-D2mdaw7o.js → Checkbox-BbA932P3.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-CJ2LEcdr.js → Codegen-BS_f3kQy.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-ej56LWvr.js → Col-BJ1tzpRh.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-D9neNmTp.js → Community-DYsZZlgI.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-BzWfgovR.js → Compact-Cq41A43W.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-dStoa8Mw.js → Compliance-CBqSz1op.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-BxYPXbQl.js → Cowork-ZAn8buD_.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-DxOQIcrL.js → Cron-DM4WTZQT.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BYyOjqVA.js → Crosschain-S65sJZwe.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-c81gsUZq.js → DID-0Av7FTMv.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-CHIjYxb2.js → Dashboard-D-1vFtiV.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-C7hRZzkL.js → Dropdown-BZufOCir.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer--h_ShKAT.js → EmailListRenderer-DJE8szQZ.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Bq68asD0.js → FamilyGuardDashboard-BqqPHaZn.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-DGKsWpUO.js → Federation-CslSyj60.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-1HbCXJAf.js → FormItemContext-uTfAl63o.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-BlKJ93Fy.js → GenericCardRenderer-BIP2obER.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-DJA-kxuw.js → Git-CoVpUKSg.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-BWZPtzHj.js → Governance-zW6mlFcK.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-D3QXUTYP.js → Inference-zfu2tMaa.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-BM37hWOP.js → KnowledgeGraph-Dd38pMCe.js} +1 -1
  34. package/src/assets/web-panel/assets/Logs-BhX28L73.js +2 -0
  35. package/src/assets/web-panel/assets/MarkdownRenderer-CbOmzhyX.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-BZe0jmAU.js → Marketplace-DGBKtVL6.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-_q_nfUnU.js → McpTools-C0jSXrYN.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-CIzcovHt.js → Memory-_xyOJV55.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-DZzo5UjF.js → MobileBridge-DGm6cS5Y.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-DVZr9bVO.js → MobileProjects-DqNyu4pO.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-pULSsEOx.js → Mtc-CSfoeF9f.js} +6 -6
  42. package/src/assets/web-panel/assets/{MtcAudit-BLz9fiz0.js → MtcAudit-DuXFbCYL.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-B1qxfPkT.js → Multisig-CdnOBFhs.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-Bkb9YB7P.js → NLProgramming-C0URZ4u4.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-N0G87PD1.js → Notes-CJznx6ft.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-D0jB-hRv.js → NotificationSettings-DJcqYoZP.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-soFvgov0.js → OrderTableRenderer-CEQJHoU9.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-BNBL1-7S.js → Organization-ucvP5Gzp.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-yqaJxwEo.js → Overflow-Be3DoWvY.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-1JHDOnl3.js → P2P-BXV17CWM.js} +2 -2
  51. package/src/assets/web-panel/assets/PdhVaultBrowser-CZDiOia9.js +7 -0
  52. package/src/assets/web-panel/assets/{Permissions-DOQh1Wzv.js → Permissions-Bn0mjFJA.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-SVa21bUw.js → PersonalDataHub-CQ2uLeuD.js} +4 -4
  54. package/src/assets/web-panel/assets/{Pipeline-Du3gCATi.js → Pipeline-DWv7KJKL.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-CPW8EDaC.js → Privacy-B4I0G5_J.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-CAu5N0A_.js → ProjectInit-CDGy6B7j.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-DVTow6ty.js → ProjectSettings-CXUq9nGH.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-CBUF9hPa.js → Projects-B-IA5qsB.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-B7pNEoaY.js → Providers-Card8pXM.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-BHs1Kx7e.js → QrScannerModal-DrU0hFRp.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-IBrdC5B5.js → QuickAsk-cB-AFOxA.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-BtkLuO-e.js → Recommend-CvAvFr0u.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-Du4_izg3.js → RemoteSession-BIrtatCm.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-IEbMZN6v.js → Reputation-CrRpi112.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-D5UM_ivw.js → Row-DmaenKNU.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-DTTNnkdJ.js → RssFeed-CGZBcNLM.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-B5f7ggJE.js → Search-Bvxjc4AU.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CsZp2uGu.js → Security-1Z-5c2n6.js} +3 -3
  69. package/src/assets/web-panel/assets/{Services-BJhguqIh.js → Services-3zYh5_28.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-CAwO2JUK.js → Skeleton-DEyGi_mq.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-hKJcP390.js → Skills-BjWR0303.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-BCFiB8oS.js → Sla-C6rE_C6V.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-Bi1Y-Tgf.js → SpeechSettings-DJ1DtDuf.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-ZHYDv46g.js → SyncSettings-B2j0LEry.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-BMCSrUy-.js → Tasks-ClYwVLRE.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-DF_FOEH8.js → Templates-Eb0UjdGe.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-C7Q2LriV.js → Tenant-BlkC3jZ8.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-C59ckWXW.js → Terminal-MMaa8P6V.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-Biu1m6Uf.js → TimelineRenderer-B4EsSPro.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-CoHYWg3-.js → Tokens-Chk0rule.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-DglXXzEp.js → Trigger-Cww9ZKjK.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-CBBLh73r.js → Trust-xSwx_Zhk.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-DuNdKeiD.js → UkeySign-CNaC0gRj.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-BizHWVrh.js → VideoEditing-gpoRF70F.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-ClUQGSKi.js → Wallet-eSjvqmUV.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-zyD7K5f5.js → WebAuthn-C4T03Dyz.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-qbTI37Fi.js → WorkflowEditor-eR0JIHbW.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-CHv66tBY.js → chat-CPRK3APB.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-vBsvcJjY.js → colors-BP4ZS2SA.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-CdBQZWFX.js → compact-item-C2bvxEX0.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-CLE2XsPX.js → createContext-DfgFYASc.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-CahG3JuS.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-Du5rnUSg.js → hasIn-BlwCGOVd.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-Ca0WeKz1.js → index-5b_mMYB_.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BY0Jg8JC.js → index-9VWjFlVU.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Cz48QuqC.js → index-AbVd9bHP.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-Cuvyt0vv.js → index-B-ubYfKF.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DHhNie07.js → index-B0HiXNYh.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CigkcWWh.js → index-B2D-mqRz.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BDaW0C3l.js → index-BENgpvOm.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DzYEc47A.js → index-BO1fPYye.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CKoOU-ne.js → index-BPezy3IJ.js} +1 -1
  103. package/src/assets/web-panel/assets/index-BZ3kGfit.js +1 -0
  104. package/src/assets/web-panel/assets/{index-DADajBnD.js → index-B_LuOKcc.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Bdfg7CY3.js → index-BgUnGGL8.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Cc53mZoS.js → index-Bg_1EOhP.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BrFwv-2v.js → index-C2n5VKtr.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-x_0JRAO3.js → index-C3qzM-P9.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CxmlGwpv.js → index-C6Zbp8DY.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CvHjeRw2.js → index-CBJrpDfv.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-dEhWAtoe.js → index-CKZNLHhD.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-9nDAQkO-.js → index-CZHYspFu.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-aYAtijnz.js → index-CyMwW_p5.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BojUN0eY.js → index-DDGliY6u.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DHdrZp_q.js → index-DDavuQ3n.js} +3 -3
  116. package/src/assets/web-panel/assets/{index-DsyYG63S.js → index-DEohnDSJ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BuSZyAD0.js → index-DLTzHq3a.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Bwqa-FcB.js → index-DQ-CB1zc.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CRiOcWZ1.js → index-DR2Tg8uN.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-uHX8ZrJ9.js → index-DZbQQtMn.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BnZkmomS.js → index-DdaniU1x.js} +1 -1
  122. package/src/assets/web-panel/assets/index-Dm5MZg8A.js +1 -0
  123. package/src/assets/web-panel/assets/{index-Dv9b_iFq.js → index-DnD3N8YJ.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-sLcRd9pi.js → index-Dx3HnzcX.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Bu3v3PRU.js → index-DzHzRE9E.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D-jjL85C.js → index-IYshwMo1.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-sz6sGerd.js → index-JhYgZWbg.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-q3sGyZnD.js → index-QE8jhGyd.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DnB7oqAR.js → index-Sk-fx_32.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-B-3GrN7D.js → index-WSC6WoDZ.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-D-KoBLmE.js → index-XBrnfoX6.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-ByEfQiLz.js → index-_5mGFZRu.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-CThtsKhS.js → initDefaultProps-CmR0B8Wx.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-BoqT16ZT.js → motion-BC0UJWJb.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-1Jf6ZXg5.js → move-cvEJQRZ_.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-DjfCYvnq.js → mtc-parser-0ZPAo5px.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-BaJPeP5Y.js → omit-UBXYakkw.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-B7nqrfVR.js → pickAttrs-CRZgdSvi.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-Dmb7i435.js → placementArrow-B_Y8sKr_.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-B0TqfHJR.js → responsiveObserve-CFgbiMsJ.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-C9PINvAM.js → slide-CF6LYcYS.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-DAug5z5S.js → statusUtils-Cj2PusGV.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-o6QvGnrq.js → styleChecker-Czg7dDLr.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-CtZwQFCt.js → useFlexGapSupport-Bhi9P67E.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-B0HVNsmA.js → useFs-X9lqJXBc.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-CbLIg5eO.js → usePersonalDataHub-iL34aL71.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-uOK2NMHj.js → vnode-DJ7TA9fc.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-BhyA2sIv.js → zoom-DfQDsJXd.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +1 -1
  151. package/src/commands/llm.js +32 -60
  152. package/src/data/changelog.json +13 -0
  153. package/src/lib/llm-connection-config.js +131 -0
  154. package/src/lib/llm-connection-probe.js +85 -0
  155. package/src/assets/web-panel/assets/ChatBubbleRenderer-BLE9L1yw.js +0 -1
  156. package/src/assets/web-panel/assets/Logs-Bpu4Of_0.js +0 -2
  157. package/src/assets/web-panel/assets/MarkdownRenderer-DAZcw_ZS.js +0 -1
  158. package/src/assets/web-panel/assets/PdhVaultBrowser-D1FgaOLV.js +0 -7
  159. package/src/assets/web-panel/assets/devWarning-DRQGMdYB.js +0 -1
  160. package/src/assets/web-panel/assets/index-CPJgV0Ho.js +0 -1
  161. package/src/assets/web-panel/assets/index-OtXVaszG.js +0 -1
@@ -0,0 +1,131 @@
1
+ import { BUILT_IN_PROVIDERS } from "./llm-providers.js";
2
+ import {
3
+ setSecretConfigValue,
4
+ updateConfigAtomically,
5
+ } from "./config-manager.js";
6
+
7
+ export function normalizeLlmConnection(input) {
8
+ if (
9
+ !input ||
10
+ typeof input !== "object" ||
11
+ Array.isArray(input) ||
12
+ Object.keys(input).some(
13
+ (k) =>
14
+ ![
15
+ "provider",
16
+ "model",
17
+ "baseUrl",
18
+ "visionModel",
19
+ "apiKey",
20
+ "allowHttp",
21
+ ].includes(k),
22
+ )
23
+ )
24
+ throw new Error("Invalid LLM connection fields");
25
+ const value = {};
26
+ for (const key of ["provider", "model", "baseUrl", "visionModel", "apiKey"]) {
27
+ if (input[key] != null && typeof input[key] !== "string")
28
+ throw new Error(`Invalid ${key}`);
29
+ value[key] = (input[key] || "").trim();
30
+ if (value[key].length > (key === "apiKey" ? 8192 : 2048))
31
+ throw new Error(`${key} is too long`);
32
+ }
33
+ if (!Object.hasOwn(BUILT_IN_PROVIDERS, value.provider))
34
+ throw new Error("Choose a supported provider/protocol");
35
+ if (!value.model || /[\r\n\0]/.test(value.model + value.visionModel))
36
+ throw new Error("A valid model name is required");
37
+ let url;
38
+ try {
39
+ url = new URL(value.baseUrl);
40
+ } catch {
41
+ throw new Error("Invalid LLM Base URL");
42
+ }
43
+ if (
44
+ !["http:", "https:"].includes(url.protocol) ||
45
+ url.username ||
46
+ url.password ||
47
+ url.search ||
48
+ url.hash
49
+ )
50
+ throw new Error(
51
+ "Base URL must be HTTP(S), without credentials, query or fragment",
52
+ );
53
+ if (
54
+ url.protocol === "http:" &&
55
+ !["localhost", "127.0.0.1", "[::1]"].includes(url.hostname) &&
56
+ input.allowHttp !== true
57
+ )
58
+ throw new Error("Confirm unencrypted HTTP before using a remote endpoint");
59
+ if (
60
+ /\/(chat\/completions|messages|responses|api\/generate)\/?$/.test(
61
+ url.pathname,
62
+ )
63
+ )
64
+ throw new Error(
65
+ "Use the API base path, not a completion/messages endpoint",
66
+ );
67
+ value.baseUrl = url.href.replace(/\/+$/, "");
68
+ return value;
69
+ }
70
+
71
+ export function saveLlmConnection(input, { storage = "auto" } = {}) {
72
+ if (!["auto", "keychain", "file"].includes(storage))
73
+ throw new Error("Secret storage must be auto, keychain, or file");
74
+ const value = normalizeLlmConnection(input);
75
+ const mutate = (config) => {
76
+ const current = config.llm || {};
77
+ const sameEndpoint =
78
+ current.provider === value.provider &&
79
+ String(
80
+ current.baseUrl || BUILT_IN_PROVIDERS[current.provider]?.baseUrl || "",
81
+ ).replace(/\/+$/, "") === value.baseUrl;
82
+ if (
83
+ value.provider !== "ollama" &&
84
+ !value.apiKey &&
85
+ (!sameEndpoint || !current.apiKey)
86
+ )
87
+ throw new Error(
88
+ "A new endpoint requires its own API key; the existing key was not reused",
89
+ );
90
+ config.llm = {
91
+ ...current,
92
+ provider: value.provider,
93
+ model: value.model,
94
+ baseUrl: value.baseUrl,
95
+ visionModel: value.visionModel || null,
96
+ };
97
+ };
98
+ // A single lock and atomic rename bind endpoint and credential together.
99
+ // An interrupted save cannot route the old credential to the new endpoint.
100
+ if (value.apiKey)
101
+ setSecretConfigValue("llm.apiKey", value.apiKey, {
102
+ storage,
103
+ configMutator: mutate,
104
+ });
105
+ else updateConfigAtomically(mutate);
106
+ return {
107
+ provider: value.provider,
108
+ model: value.model,
109
+ baseUrl: value.baseUrl,
110
+ visionModel: value.visionModel || null,
111
+ };
112
+ }
113
+
114
+ export async function readLlmConnectionInput(stream = process.stdin) {
115
+ if (stream.isTTY)
116
+ throw new Error("Send the LLM configuration JSON through stdin");
117
+ const chunks = [];
118
+ let size = 0;
119
+ for await (const chunk of stream) {
120
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
121
+ size += buffer.length;
122
+ if (size > 32768) throw new Error("LLM configuration input is too large");
123
+ chunks.push(buffer);
124
+ }
125
+ const input = Buffer.concat(chunks).toString("utf8");
126
+ try {
127
+ return JSON.parse(input);
128
+ } catch {
129
+ throw new Error("LLM configuration input must be valid JSON");
130
+ }
131
+ }
@@ -0,0 +1,85 @@
1
+ import { formatProviderResponseError } from "./provider-http-error.js";
2
+
3
+ export async function probeLlmConnection(
4
+ target,
5
+ { fetchImpl = fetch, timeoutMs = 20_000 } = {},
6
+ ) {
7
+ const base = target.baseUrl.replace(/\/+$/, "");
8
+ const headers = { "Content-Type": "application/json" };
9
+ let url, body;
10
+ if (target.provider === "ollama") {
11
+ url = `${base}/api/generate`;
12
+ body = {
13
+ model: target.model,
14
+ prompt: "Say hi in one word.",
15
+ stream: false,
16
+ };
17
+ } else {
18
+ if (!target.apiKey) throw new Error("API key required");
19
+ if (target.provider === "anthropic") {
20
+ url = `${base}/messages`;
21
+ headers["x-api-key"] = target.apiKey;
22
+ headers["anthropic-version"] = "2023-06-01";
23
+ body = {
24
+ model: target.model,
25
+ max_tokens: 16,
26
+ messages: [{ role: "user", content: "Say hi in one word." }],
27
+ };
28
+ } else if (target.provider === "gemini") {
29
+ url = `${base}/models/${encodeURIComponent(target.model)}:generateContent`;
30
+ headers["x-goog-api-key"] = target.apiKey;
31
+ body = {
32
+ contents: [{ parts: [{ text: "Say hi in one word." }] }],
33
+ generationConfig: { maxOutputTokens: 16 },
34
+ };
35
+ } else {
36
+ url = `${base}/chat/completions`;
37
+ headers.Authorization = `Bearer ${target.apiKey}`;
38
+ body = {
39
+ model: target.model,
40
+ messages: [{ role: "user", content: "Say hi in one word." }],
41
+ max_tokens: 16,
42
+ };
43
+ }
44
+ }
45
+ const controller = new AbortController();
46
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
47
+ try {
48
+ const response = await fetchImpl(url, {
49
+ method: "POST",
50
+ headers,
51
+ body: JSON.stringify(body),
52
+ signal: controller.signal,
53
+ redirect: "error",
54
+ });
55
+ if (!response.ok)
56
+ throw new Error(
57
+ await formatProviderResponseError(target.provider, response),
58
+ );
59
+ const data = await response.json();
60
+ const text =
61
+ target.provider === "ollama"
62
+ ? data.response
63
+ : target.provider === "anthropic"
64
+ ? data.content
65
+ ?.filter((p) => p.type === "text")
66
+ .map((p) => p.text)
67
+ .join("")
68
+ : target.provider === "gemini"
69
+ ? data.candidates?.[0]?.content?.parts
70
+ ?.map((p) => p.text || "")
71
+ .join("")
72
+ : data.choices?.[0]?.message?.content;
73
+ if (typeof text !== "string" || !text.trim())
74
+ throw new Error(
75
+ "The endpoint returned no model text; check the protocol and model",
76
+ );
77
+ return text.trim().slice(0, 100);
78
+ } catch (error) {
79
+ if (controller.signal.aborted)
80
+ throw new Error(`Connection test timed out after ${timeoutMs / 1000}s`);
81
+ throw error;
82
+ } finally {
83
+ clearTimeout(timer);
84
+ }
85
+ }
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as S,U as s,R as a,S as y,K as C,Q as x,V as w,_ as B,b as n}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-DHdrZp_q.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=n(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=n(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=n(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=n(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=n(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:n};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},q={class:"meta"},M={class:"actor"},R={class:"time"},V={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[s("div",T,[s("div",q,[s("span",M,a(r.actorLabel),1),s("span",R,a(r.formattedTime),1)]),s("div",V,a(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-0FqnGa/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
@@ -1,2 +0,0 @@
1
- import{I as s,J as g,U as d,c as o,K as _,V as k,S as W,R as S,F as K,Z as Q,w as M,n as C,o as R,b as T,r,P as p,Q as O,_ as U}from"./vendor-Bn1JzzAn.js";import{_ as q,u as N}from"./index-DHdrZp_q.js";import{R as E}from"./icons-DG5UD-6K.js";const F={__name:"Logs",setup(V,{expose:a}){a();const x=N(),e=r("status"),y=r(!1),v=r(""),i=r(""),c=r(""),f=r(!0),n=r(null),h={status:"status",doctor:"doctor","skill-sources":"skill sources","llm-providers":"llm providers"},m=T(()=>i.value.split(`
2
- `)),b=T(()=>{if(!c.value)return m.value;const t=c.value.toLowerCase();return m.value.filter(u=>u.toLowerCase().includes(t))});function L(t){return t.includes("✖")||t.includes("error")||t.includes("Error")||t.includes("failed")?"line-error":t.includes("✔")||t.includes("✓")||t.includes("success")||t.includes("running")?"line-success":t.includes("warn")||t.includes("Warn")||t.includes("○")?"line-warn":t.startsWith(" ")||t.startsWith(" ")?"line-indent":""}function l(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function w(t){if(!c.value)return t;const u=c.value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return t.replace(new RegExp(`(${u})`,"gi"),"<mark>$1</mark>")}async function B(){y.value=!0,v.value="",i.value="";const t=h[e.value]||"status";try{const{output:u}=await x.execute(t,3e4);i.value=u,f.value&&(await C(),n.value&&(n.value.scrollTop=n.value.scrollHeight))}catch(u){v.value=`执行失败: ${u.message}`,i.value=v.value}finally{y.value=!1}}M(b,async()=>{f.value&&(await C(),n.value&&(n.value.scrollTop=n.value.scrollHeight))}),R(B);const H={ws:x,activeTab:e,loading:y,error:v,rawOutput:i,searchQuery:c,autoScroll:f,logContainer:n,TAB_COMMANDS:h,allLines:m,filteredLines:b,lineClass:L,escapeHtml:l,highlightSearch:w,loadLog:B,ref:r,computed:T,watch:M,nextTick:C,onMounted:R,get ReloadOutlined(){return E},get useWsStore(){return N}};return Object.defineProperty(H,"__isScriptSetup",{enumerable:!1,value:!0}),H}},j={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},z={style:{display:"flex",gap:"10px",margin:"12px 0"}},A={ref:"logContainer",class:"log-box"},D={key:0,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)"}},I={key:1,style:{"text-align":"center",padding:"40px",color:"var(--text-muted)"}},P={key:2},G=["innerHTML"];function J(V,a,x,e,y,v){const i=s("a-checkbox"),c=s("a-button"),f=s("a-space"),n=s("a-tab-pane"),h=s("a-tabs"),m=s("a-input-search"),b=s("a-tag"),L=s("a-spin");return p(),g("div",null,[d("div",j,[a[5]||(a[5]=d("div",null,[d("h2",{class:"page-title"},"日志查看"),d("p",{class:"page-sub"},"系统运行日志与诊断输出")],-1)),o(f,null,{default:_(()=>[o(i,{checked:e.autoScroll,"onUpdate:checked":a[0]||(a[0]=l=>e.autoScroll=l)},{default:_(()=>[...a[3]||(a[3]=[O("自动滚动",-1)])]),_:1},8,["checked"]),o(c,{type:"primary",ghost:"",loading:e.loading,onClick:e.loadLog},{icon:_(()=>[o(e.ReloadOutlined)]),default:_(()=>[a[4]||(a[4]=O(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),k(" Tab Selector "),o(h,{activeKey:e.activeTab,"onUpdate:activeKey":a[1]||(a[1]=l=>e.activeTab=l),onChange:e.loadLog,style:{"margin-bottom":"0"}},{default:_(()=>[o(n,{key:"status",tab:"系统状态"}),o(n,{key:"doctor",tab:"环境诊断"}),o(n,{key:"skill-sources",tab:"技能来源"}),o(n,{key:"llm-providers",tab:"LLM 提供商"})]),_:1},8,["activeKey"]),k(" Search Bar "),d("div",z,[o(m,{value:e.searchQuery,"onUpdate:value":a[2]||(a[2]=l=>e.searchQuery=l),placeholder:"搜索日志内容...","allow-clear":"",style:{flex:"1"}},null,8,["value"]),e.filteredLines.length!==e.allLines.length?(p(),W(b,{key:0,color:"blue"},{default:_(()=>[O(S(e.filteredLines.length)+" / "+S(e.allLines.length)+" 行 ",1)]),_:1})):k("v-if",!0)]),k(" Log Output "),d("div",A,[e.loading?(p(),g("div",D,[o(L,{size:"large"}),a[6]||(a[6]=d("div",{style:{"margin-top":"10px"}},"加载中...",-1))])):e.filteredLines.length?(p(),g("div",P,[(p(!0),g(K,null,Q(e.filteredLines,(l,w)=>(p(),g("div",{key:w,class:U(["log-line",e.lineClass(l)]),innerHTML:e.highlightSearch(e.escapeHtml(l))},null,10,G))),128))])):(p(),g("div",I,S(e.error||"暂无日志内容,点击刷新加载"),1))],512)])}const $=q(F,[["render",J],["__scopeId","data-v-8c2906e0"],["__file","/tmp/cc-web-panel-0FqnGa/repo/packages/web-panel/src/views/Logs.vue"]]);export{$ as default};
@@ -1 +0,0 @@
1
- import{P as c,J as p,b as a}from"./vendor-Bn1JzzAn.js";import{r as s}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-DHdrZp_q.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=a(()=>s(e.content||"")),n={props:e,rendered:r,computed:a,get renderMarkdown(){return s}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-0FqnGa/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
@@ -1,7 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ChatBubbleRenderer-BLE9L1yw.js","./vendor-Bn1JzzAn.js","./index-DHdrZp_q.js","./icons-DG5UD-6K.js","./index-Cq93VfoF.css","./ChatBubbleRenderer-gy5SDGw2.css","./OrderTableRenderer-soFvgov0.js","./OrderTableRenderer-CfrDjSHT.css","./TimelineRenderer-Biu1m6Uf.js","./TimelineRenderer-BlTAtkOc.css","./EmailListRenderer--h_ShKAT.js","./EmailListRenderer-DTPZPx_S.css","./GenericCardRenderer-BlKJ93Fy.js","./GenericCardRenderer-o85VDYQS.css"])))=>i.map(i=>d[i]);
2
- import{E as ue,r as R,b as w,I as g,P as u,J as O,U as v,c,S as C,V as E,_ as M,F as V,Z as se,a0 as ae,R as x,K as m,Q as b,W as A,o as G}from"./vendor-Bn1JzzAn.js";import{u as J}from"./usePersonalDataHub-CbLIg5eO.js";import{_ as D,e as L,d as q}from"./index-DHdrZp_q.js";import{aa as P,ag as U,M as Q,aI as z,v as H,aH as K,aq as W,ac as Y,e as de,d as fe,k as pe,ai as me,aA as _e,R as ye}from"./icons-DG5UD-6K.js";import"./useShellMode-CgR0wCYM.js";const I=Object.freeze({q:"",category:null,adapter:null,subtype:null,since:null,until:null}),B=50,Z=300,X=ue("pdhBrowser",()=>{const r=R({...I}),t=R([]),n=R(null),e=R(!1),o=R(!1),a=R(null),l=R(null),s=R(!1),i=R({byCategory:{},byAdapter:{},bySubtype:{},total:0});let d=0,_=null;const F=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 y(){const S=++d;e.value=!0,a.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,l.value=f.mode||"like",s.value=!!f.shortQuery,i.value={byCategory:T.byCategory||{},byAdapter:T.byAdapter||{},bySubtype:T.bySubtype||{},total:T.total||0}}catch(f){if(S!==d)return;a.value=f&&f.message?f.message:String(f),t.value=[],n.value=null}finally{S===d&&(e.value=!1)}}async function k(){if(!n.value||o.value)return;o.value=!0,a.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,l.value=p.mode||l.value}catch(p){a.value=p&&p.message?p.message:String(p)}finally{o.value=!1}}function le(S,p){if(!(S in I))throw new Error(`pdhBrowser.setFilter: unknown key "${S}"`);r.value={...r.value,[S]:p},_&&clearTimeout(_),_=setTimeout(()=>{_=null,y()},Z)}function ie(S){return r.value={...I,...S},_&&(clearTimeout(_),_=null),y()}function ce(){r.value={...I},t.value=[],n.value=null,a.value=null,i.value={byCategory:{},byAdapter:{},bySubtype:{},total:0}}return{filters:r,results:t,cursor:n,isLoading:e,isAppending:o,error:a,mode:l,shortQuery:s,facets:i,hasResults:F,canLoadMore:j,search:y,loadMore:k,setFilter:le,setFilters:ie,reset:ce,PAGE_SIZE:B,SEARCH_DEBOUNCE_MS:Z}}),ge=Object.freeze(["chat","social","email","shopping","travel","system","ai-chat","other"]),ve=Object.freeze({chat:"社交聊天",social:"内容平台",email:"邮件",shopping:"支付订单",travel:"出行",system:"系统数据","ai-chat":"AI 对话",other:"其他"});function N(r){return ve[r]||r||"未知"}const be=Object.freeze([["wechat","chat"],["messaging-","chat"],["social-","social"],["email-","email"],["shopping-","shopping"],["alipay-","shopping"],["travel-","travel"],["system-data","system"],["browser-","system"],["meeting-","system"],["vscode","system"],["vscodium","system"],["jetbrains-ide","system"],["win-recent","system"],["git-activity","system"],["shell-history","system"],["hbuilderx","system"],["local-files","system"],["cursor","ai-chat"],["claude-code","ai-chat"],["ai-chat-","ai-chat"]]);function $(r){if(typeof r!="string"||r.length===0)return"other";for(const[t,n]of be)if(t.endsWith("-")||t==="system-data"){if(r.startsWith(t))return n}else if(r===t)return n;return"other"}const he={__name:"CategorySidebar",props:{selected:{type:String,default:null},facets:{type:Object,default:()=>({byCategory:{},total:0})}},emits:["select"],setup(r,{expose:t}){t();const n=r,e=w(()=>n.facets.total||0),o={chat:Y,social:W,email:K,shopping:H,travel:z,system:Q,"ai-chat":U,other:P};function a(i){return o[i]||P}function l(i){return i?{backgroundColor:"#fff",color:"#1677ff"}:{backgroundColor:"#f0f0f0",color:"#666"}}const s={props:n,total:e,ICONS:o,iconFor:a,badgeStyle:l,computed:w,get AppstoreOutlined(){return P},get MessageOutlined(){return Y},get PlayCircleOutlined(){return W},get MailOutlined(){return K},get ShoppingOutlined(){return H},get CarOutlined(){return z},get MobileOutlined(){return Q},get RobotOutlined(){return U},get CATEGORIES(){return ge},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,a){const l=g("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(l,{key:0,count:e.total,"number-style":e.badgeStyle(n.selected===null),"overflow-count":9999},null,8,["count","number-style"])):E("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(ae(e.iconFor(s)),{class:"icon"})),v("span",we,x(e.categoryLabel(s)),1),n.facets.byCategory[s]?(u(),C(l,{key:0,count:n.facets.byCategory[s],"number-style":e.badgeStyle(n.selected===s),"overflow-count":9999},null,8,["count","number-style"])):E("v-if",!0)],10,Oe))),128))])}const ke=D(he,[["render",Ce],["__scopeId","data-v-6b62a22e"],["__file","/tmp/cc-web-panel-0FqnGa/repo/packages/web-panel/src/components/pdh/CategorySidebar.vue"]]),Ee={__name:"SearchFilterBar",props:{filters:{type:Object,required:!0},facets:{type:Object,default:()=>({byAdapter:{}})},isLoading:{type:Boolean,default:!1},mode:{type:String,default:null},shortQuery:{type:Boolean,default:!1}},emits:["set-filter","reset"],setup(r,{expose:t,emit:n}){t();const e=r,o=n,a=w(()=>e.filters.category?`在「${e.filters.category}」类目内搜索…`:"搜索关键词(如:支付宝、罗技、Kotlin)…"),l=w(()=>Object.entries(e.facets.byAdapter||{}).sort((y,k)=>k[1]-y[1]).map(([y,k])=>({value:y,label:`${y} (${k})`}))),s=w(()=>!e.filters.since&&!e.filters.until?null:[e.filters.since?new Date(e.filters.since):null,e.filters.until?new Date(e.filters.until):null]),i=w(()=>!!(e.filters.q||e.filters.adapter||e.filters.subtype||e.filters.since||e.filters.until));function d(h){o("set-filter","q",h||"")}function _(h){o("set-filter","q",h||"")}function F(h){if(!h||h.length===0){o("set-filter","since",null),o("set-filter","until",null);return}const[y,k]=h;o("set-filter","since",y?+y:null),o("set-filter","until",k?+k:null)}const j={props:e,emit:o,placeholderText:a,adapterOptions:l,dateRangeValue:s,hasActiveFilters:i,onQInput:d,onSearch:_,onDateChange:F,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"},Fe={key:2,class:"hint"};function je(r,t,n,e,o,a){const l=g("a-input-search"),s=g("a-select"),i=g("a-range-picker"),d=g("a-button");return u(),O("div",Re,[c(l,{value:n.filters.q,placeholder:e.placeholderText,"enter-button":"搜索","allow-clear":"",loading:n.isLoading,style:{flex:"1","max-width":"480px"},"onUpdate:value":e.onQInput,onSearch:e.onSearch},{prefix:m(()=>[c(e.SearchOutlined)]),_:1},8,["value","placeholder","loading"]),c(s,{value:n.filters.adapter,placeholder:"所有 adapter","allow-clear":"",options:e.adapterOptions,style:{width:"200px"},"onUpdate:value":t[0]||(t[0]=_=>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})):E("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",Fe,[c(e.InfoCircleOutlined),t[4]||(t[4]=b(" 当前为 LIKE 兜底模式 ",-1))])):E("v-if",!0)])}const Ae=D(Ee,[["render",je],["__scopeId","data-v-d7cce6e9"],["__file","/tmp/cc-web-panel-0FqnGa/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-BLE9L1yw.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)),e=A(()=>L(()=>import("./OrderTableRenderer-soFvgov0.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)),o=A(()=>L(()=>import("./TimelineRenderer-Biu1m6Uf.js"),__vite__mapDeps([8,1,2,3,4,9]),import.meta.url)),a=A(()=>L(()=>import("./EmailListRenderer--h_ShKAT.js"),__vite__mapDeps([10,1,2,3,4,11]),import.meta.url)),l=A(()=>L(()=>import("./GenericCardRenderer-BlKJ93Fy.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 a;default:return l}}const i={ChatBubbleRenderer:n,OrderTableRenderer:e,TimelineRenderer:o,EmailListRenderer:a,GenericCardRenderer:l,rendererFor:s,defineAsyncComponent:A,get getCategory(){return $}};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}};function De(r,t,n,e,o,a){return u(),C(ae(e.rendererFor(n.event)),{event:n.event},null,8,["event"])}const Te=D(Le,[["render",De],["__file","/tmp/cc-web-panel-0FqnGa/repo/packages/web-panel/src/components/pdh/renderers/RendererDispatcher.vue"]]);function ee(r){return JSON.stringify(r,null,2)}function te(r){return r.map(t=>JSON.stringify(t)).join(`
3
- `)+`
4
- `}function ne(r){const n=["id","subtype","occurredAt","occurredAtIso","actor","place","adapter","summary","contentJson","extraJson"].join(","),e=r.map(o=>{const a=Number.isFinite(o.occurredAt)?o.occurredAt:null,l=a?new Date(a).toISOString():"",s=o.source&&o.source.adapter||"",i=o.content&&(o.content.text||o.content.title||o.content.subject)||"";return[o.id||"",o.subtype||"",a!=null?String(a):"",l,o.actor||"",o.place||"",s,i,o.content?JSON.stringify(o.content):"",o.extra?JSON.stringify(o.extra):""].map(Ie).join(",")});return[n,...e].join(`
5
- `)+`
6
- `}function Ie(r){const t=String(r??"");return t.includes(",")||t.includes('"')||t.includes(`
7
- `)||t.includes("\r")?'"'+t.replace(/"/g,'""')+'"':t}function re(r,t,n="application/octet-stream"){if(typeof window>"u"||typeof document>"u")return t;const e=new Blob([r],{type:n}),o=URL.createObjectURL(e),a=document.createElement("a");return a.href=o,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),setTimeout(()=>URL.revokeObjectURL(o),1e3),t}function oe(r,t=null){const n=new Date,e=n.getFullYear(),o=String(n.getMonth()+1).padStart(2,"0"),a=String(n.getDate()).padStart(2,"0"),l=r==="ndjson"?"ndjson":r,s=t?`-${t}`:"";return`pdh-events-${e}-${o}-${a}${s}.${l}`}const qe={__name:"ExportDropdown",props:{events:{type:Array,required:!0},category:{type:String,default:null}},setup(r,{expose:t}){t();const n=r,e=w(()=>n.events.length>0),o={json:"application/json;charset=utf-8",ndjson:"application/x-ndjson;charset=utf-8",csv:"text/csv;charset=utf-8"};function a(i){switch(i){case"json":return ee(n.events);case"ndjson":return te(n.events);case"csv":return ne(n.events);default:throw new Error(`unknown format: ${i}`)}}function l({key:i}){try{const d=a(i),_=oe(i,n.category);re(d,_,o[i]),q.success(`已导出 ${n.events.length} 条到 ${_}`)}catch(d){q.error(`导出失败: ${d.message||d}`)}}const s={props:n,hasResults:e,MIME:o,serialize:a,onClick:l,computed:w,get DownloadOutlined(){return _e},get DownOutlined(){return me},get message(){return q},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 Pe(r,t,n,e,o,a){const l=g("a-button"),s=g("a-menu-item"),i=g("a-menu"),d=g("a-dropdown");return u(),C(d,{disabled:!e.hasResults},{overlay:m(()=>[c(i,{onClick:e.onClick},{default:m(()=>[c(s,{key:"json"},{default:m(()=>[...t[0]||(t[0]=[b("JSON (.json)",-1)])]),_:1}),c(s,{key:"ndjson"},{default:m(()=>[...t[1]||(t[1]=[b("NDJSON (.ndjson)",-1)])]),_:1}),c(s,{key:"csv"},{default:m(()=>[...t[2]||(t[2]=[b("CSV (.csv)",-1)])]),_:1})]),_:1})]),default:m(()=>[c(l,{disabled:!e.hasResults},{icon:m(()=>[c(e.DownloadOutlined)]),default:m(()=>[b(" 导出 ("+x(n.events.length)+") ",1),c(e.DownOutlined)]),_:1},8,["disabled"])]),_:1},8,["disabled"])}const Be=D(qe,[["render",Pe],["__file","/tmp/cc-web-panel-0FqnGa/repo/packages/web-panel/src/components/pdh/ExportDropdown.vue"]]),Ve={__name:"PdhVaultBrowser",setup(r,{expose:t}){t();const n=X(),e=w(()=>n.filters.q?`没有匹配 "${n.filters.q}" 的事件 — 试试更短的关键词或换个类目`:n.filters.category?`「${N(n.filters.category)}」类目下还没有数据 — 去采集页同步对应 adapter`:"Vault 里还没有数据 — 去「个人数据中台」页面同步任意 adapter");function o(s){n.filters.category=s,n.search()}function a(s,i){n.setFilter(s,i)}G(()=>{!n.hasResults&&!n.isLoading&&n.search()});const l={store:n,emptyHint:e,onCategorySelect:o,onSetFilter:a,onMounted:G,computed:w,get ReloadOutlined(){return ye},get usePdhBrowserStore(){return X},get categoryLabel(){return N},CategorySidebar:ke,SearchFilterBar:Ae,RendererDispatcher:Te,ExportDropdown:Be};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}},Ne={class:"pdh-browser-page"},Me={class:"page-header"},Ge={class:"main-pane"},Je={class:"results-summary"},Ue={key:0},Qe={key:0},ze={key:1},He={class:"loaded-of"},Ke={class:"results-list"},We={key:2,class:"load-more"};function Ye(r,t,n,e,o,a){const l=g("a-tag"),s=g("a-button"),i=g("a-space"),d=g("a-col"),_=g("a-spin"),F=g("a-alert"),j=g("a-empty"),h=g("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(l,{key:0,color:"green"},{default:m(()=>[...t[3]||(t[3]=[b("FTS5 trigram",-1)])]),_:1})):e.store.mode==="like"?(u(),C(l,{key:1,color:"orange"},{default:m(()=>[...t[4]||(t[4]=[b("LIKE 兜底",-1)])]),_:1})):E("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]=y=>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",Ge,[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]=y=>{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",Qe,[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)])):E("v-if",!0),e.store.filters.q?(u(),O("span",ze,[t[9]||(t[9]=b(' / 关键词 "',-1)),v("em",null,x(e.store.filters.q),1),t[10]||(t[10]=b('"',-1))])):E("v-if",!0),v("span",He," / 已显示 "+x(e.store.results.length),1)],64))]),e.store.error?(u(),C(F,{key:0,type:"error","show-icon":"",message:e.store.error,closable:"",style:{margin:"12px 0"}},null,8,["message"])):E("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"])):E("v-if",!0),v("div",Ke,[(u(!0),O(V,null,se(e.store.results,(y,k)=>(u(),C(e.RendererDispatcher,{key:`r-${k}-${y.id}`,event:y},null,8,["event"]))),128))]),e.store.canLoadMore?(u(),O("div",We,[c(s,{loading:e.store.isAppending,onClick:t[2]||(t[2]=y=>e.store.loadMore()),block:""},{default:m(()=>[...t[12]||(t[12]=[b(" 加载下一页 (50 条) ",-1)])]),_:1},8,["loading"])])):E("v-if",!0)])]),_:1})]),_:1})])}const nt=D(Ve,[["render",Ye],["__scopeId","data-v-0f7c02cd"],["__file","/tmp/cc-web-panel-0FqnGa/repo/packages/web-panel/src/views/PdhVaultBrowser.vue"]]);export{nt as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-DHdrZp_q.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-ej56LWvr.js";import{a0 as t}from"./index-DHdrZp_q.js";import"./vendor-Bn1JzzAn.js";import"./index-BrFwv-2v.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-D5UM_ivw.js";import{a0 as t}from"./index-DHdrZp_q.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-B0TqfHJR.js";import"./useFlexGapSupport-CtZwQFCt.js";import"./styleChecker-o6QvGnrq.js";import"./index-BrFwv-2v.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};