chainlesschain 0.156.5 → 0.156.7

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 (188) hide show
  1. package/README.md +24 -0
  2. package/bin/chainlesschain.js +0 -0
  3. package/package.json +2 -1
  4. package/src/assets/web-panel/.build-hash +1 -1
  5. package/src/assets/web-panel/assets/ActionButton-Cs4QdjYb.js +1 -0
  6. package/src/assets/web-panel/assets/{Analytics-DQ135mAd.js → Analytics-Xot0e9TT.js} +2 -2
  7. package/src/assets/web-panel/assets/AppLayout-3qsE1-pz.js +1 -0
  8. package/src/assets/web-panel/assets/AppLayout-nff99EgA.css +1 -0
  9. package/src/assets/web-panel/assets/Backup-Cih5dXcD.js +1 -0
  10. package/src/assets/web-panel/assets/BaseInput-Tg40P4JM.js +1 -0
  11. package/src/assets/web-panel/assets/Chat-CRfTuSl8.js +2 -0
  12. package/src/assets/web-panel/assets/Chat-DmX5bWvL.css +1 -0
  13. package/src/assets/web-panel/assets/Checkbox-CheA2Ety.js +1 -0
  14. package/src/assets/web-panel/assets/Col-Cdfsmnaq.js +1 -0
  15. package/src/assets/web-panel/assets/Compact-D3LSgEpW.js +1 -0
  16. package/src/assets/web-panel/assets/Cowork-BLRUoSoO.js +6 -0
  17. package/src/assets/web-panel/assets/Cowork-DsOst4XK.css +1 -0
  18. package/src/assets/web-panel/assets/{Cron-3P0eVLTV.js → Cron-9MV6k-MV.js} +2 -2
  19. package/src/assets/web-panel/assets/{Dashboard-DVNslD3Z.js → Dashboard-A1TZC5_t.js} +2 -2
  20. package/src/assets/web-panel/assets/Dropdown-DZxUTZvw.js +1 -0
  21. package/src/assets/web-panel/assets/FormItemContext-C3_-j_SR.js +1 -0
  22. package/src/assets/web-panel/assets/Git-Cw-gW-kh.js +2 -0
  23. package/src/assets/web-panel/assets/KeyCode-D63Tfrq7.js +1 -0
  24. package/src/assets/web-panel/assets/Keyframes-C7fCrnlS.js +1 -0
  25. package/src/assets/web-panel/assets/Logs-0SXs6Eyx.js +2 -0
  26. package/src/assets/web-panel/assets/{McpTools-CsGIijNe.js → McpTools-VVSCkpV2.js} +3 -3
  27. package/src/assets/web-panel/assets/Memory-CMweTJyn.js +2 -0
  28. package/src/assets/web-panel/assets/Notes-B_W3BfZF.js +2 -0
  29. package/src/assets/web-panel/assets/{Organization-Bny6yOPV.js → Organization-Dz_jGbAM.js} +4 -4
  30. package/src/assets/web-panel/assets/Overflow-Dka3nWV9.js +1 -0
  31. package/src/assets/web-panel/assets/OverrideContext-7M2Kv4Ru.js +1 -0
  32. package/src/assets/web-panel/assets/P2P-DGPIG-9j.js +2 -0
  33. package/src/assets/web-panel/assets/Permissions-DvXVIlHX.js +4 -0
  34. package/src/assets/web-panel/assets/Portal-CFB5Y97t.js +1 -0
  35. package/src/assets/web-panel/assets/Projects-Bzn-dJ59.js +2 -0
  36. package/src/assets/web-panel/assets/Providers-DUfX_ynl.js +2 -0
  37. package/src/assets/web-panel/assets/ResizeObserver.es-D6qJbdzf.js +1 -0
  38. package/src/assets/web-panel/assets/Row-DZhDSo2Q.js +1 -0
  39. package/src/assets/web-panel/assets/RssFeed-CHQpUl3h.js +3 -0
  40. package/src/assets/web-panel/assets/Security-FUSOn89T.js +4 -0
  41. package/src/assets/web-panel/assets/Services-CDh7r75R.js +2 -0
  42. package/src/assets/web-panel/assets/Skeleton-DxmZ7zRw.js +8 -0
  43. package/src/assets/web-panel/assets/Skills-Dk9Cp1NG.js +1 -0
  44. package/src/assets/web-panel/assets/Tasks-CfHL1NrP.js +1 -0
  45. package/src/assets/web-panel/assets/Templates-BVbmyn38.js +1 -0
  46. package/src/assets/web-panel/assets/Trigger-xAvohiq9.js +1 -0
  47. package/src/assets/web-panel/assets/VideoEditing-BUWYQv2y.js +1 -0
  48. package/src/assets/web-panel/assets/{Wallet-CsRgnjJY.js → Wallet-BDYdEwFf.js} +4 -4
  49. package/src/assets/web-panel/assets/WebAuthn-CvpuagtK.js +5 -0
  50. package/src/assets/web-panel/assets/WorkflowEditor-BR7W5cjw.js +1 -0
  51. package/src/assets/web-panel/assets/_arrayIncludes-B8uzE354.js +1 -0
  52. package/src/assets/web-panel/assets/_getTag-CWA3v-Ds.js +1 -0
  53. package/src/assets/web-panel/assets/chat-B2uGA8wN.js +1 -0
  54. package/src/assets/web-panel/assets/collapseMotion-DnZigkzG.js +3 -0
  55. package/src/assets/web-panel/assets/colors-C5kDbQCi.js +1 -0
  56. package/src/assets/web-panel/assets/compact-item-Bo_1zDrX.js +1 -0
  57. package/src/assets/web-panel/assets/createContext-CniPpJsG.js +1 -0
  58. package/src/assets/web-panel/assets/debounce-Q0BOJsYd.js +1 -0
  59. package/src/assets/web-panel/assets/devWarning-CNIS3FrJ.js +1 -0
  60. package/src/assets/web-panel/assets/favicon-FSU2gSy6.ico +0 -0
  61. package/src/assets/web-panel/assets/firstNotUndefined-CLFzEa0p.js +1 -0
  62. package/src/assets/web-panel/assets/hasIn-ClDc6Sz8.js +1 -0
  63. package/src/assets/web-panel/assets/icons-CpgFsfkd.js +57 -0
  64. package/src/assets/web-panel/assets/index--lcO-bOn.js +3 -0
  65. package/src/assets/web-panel/assets/index-6tQekF0Y.js +7 -0
  66. package/src/assets/web-panel/assets/index-8qWxPHSb.js +1 -0
  67. package/src/assets/web-panel/assets/index-B7nGNm_C.js +55 -0
  68. package/src/assets/web-panel/assets/index-B8y0NO-M.js +1 -0
  69. package/src/assets/web-panel/assets/index-BAlSSCbs.js +1 -0
  70. package/src/assets/web-panel/assets/index-BCXFoTAw.js +3 -0
  71. package/src/assets/web-panel/assets/index-BHruTebo.js +10 -0
  72. package/src/assets/web-panel/assets/index-BJx6C3J8.js +1 -0
  73. package/src/assets/web-panel/assets/index-BUTCJTbj.js +1 -0
  74. package/src/assets/web-panel/assets/index-BYShDlZ0.js +1 -0
  75. package/src/assets/web-panel/assets/index-Bv2OmZAS.js +1 -0
  76. package/src/assets/web-panel/assets/index-C92K4iDE.js +1 -0
  77. package/src/assets/web-panel/assets/index-CCdb36il.js +12 -0
  78. package/src/assets/web-panel/assets/index-CKR2ITFk.js +1 -0
  79. package/src/assets/web-panel/assets/index-CMcGcbea.js +3 -0
  80. package/src/assets/web-panel/assets/index-CTetsi8W.js +1 -0
  81. package/src/assets/web-panel/assets/index-CXxLp7Aw.js +13 -0
  82. package/src/assets/web-panel/assets/index-CeSV8f3b.js +6 -0
  83. package/src/assets/web-panel/assets/index-Ch5mAXeh.js +14 -0
  84. package/src/assets/web-panel/assets/index-CwhWEkmA.js +21 -0
  85. package/src/assets/web-panel/assets/index-D2fe9a6f.js +21 -0
  86. package/src/assets/web-panel/assets/index-D3UDIt7h.js +1 -0
  87. package/src/assets/web-panel/assets/index-D90sLw5Q.js +1 -0
  88. package/src/assets/web-panel/assets/index-D9bolkbl.js +13 -0
  89. package/src/assets/web-panel/assets/index-DNY0K7iI.js +1 -0
  90. package/src/assets/web-panel/assets/index-DSiHmo4b.js +19 -0
  91. package/src/assets/web-panel/assets/index-DTYnvYqB.js +12 -0
  92. package/src/assets/web-panel/assets/index-DaLYbr0E.js +31 -0
  93. package/src/assets/web-panel/assets/index-DkSNIJhM.js +1 -0
  94. package/src/assets/web-panel/assets/index-DnQkqOZj.js +1 -0
  95. package/src/assets/web-panel/assets/index-Dn_OQQaV.js +36 -0
  96. package/src/assets/web-panel/assets/index-Dtfrhky9.js +7 -0
  97. package/src/assets/web-panel/assets/index-JNbd08FN.js +2 -0
  98. package/src/assets/web-panel/assets/index-PT376OZM.js +1 -0
  99. package/src/assets/web-panel/assets/index-U4Zd5IK6.js +8 -0
  100. package/src/assets/web-panel/assets/index-cIgCeEqo.js +12 -0
  101. package/src/assets/web-panel/assets/index-vBi4x_6g.js +1 -0
  102. package/src/assets/web-panel/assets/index-xL8gcpmy.js +1 -0
  103. package/src/assets/web-panel/assets/initDefaultProps-DMfJaUzk.js +1 -0
  104. package/src/assets/web-panel/assets/injectionKey-BXVc-oGP.js +1 -0
  105. package/src/assets/web-panel/assets/isMobile--2fOlCHx.js +1 -0
  106. package/src/assets/web-panel/assets/isNumeric-DjvBa-1E.js +1 -0
  107. package/src/assets/web-panel/assets/isPlainObject-DSTnI585.js +1 -0
  108. package/src/assets/web-panel/assets/isSymbol-CsP9Ob42.js +1 -0
  109. package/src/assets/web-panel/assets/isVisible-C7tPsqfj.js +1 -0
  110. package/src/assets/web-panel/assets/logo-DBCYUiWP.png +0 -0
  111. package/src/assets/web-panel/assets/markdown-vYH_ziAO.js +1 -0
  112. package/src/assets/web-panel/assets/markdown-xjUYbPSW.js +50 -0
  113. package/src/assets/web-panel/assets/motion-sEbWmOWo.js +11 -0
  114. package/src/assets/web-panel/assets/move-DIWXVs--.js +4 -0
  115. package/src/assets/web-panel/assets/omit-D7mkMPhu.js +1 -0
  116. package/src/assets/web-panel/assets/pickAttrs-B25NUX4k.js +18 -0
  117. package/src/assets/web-panel/assets/placementArrow-By1Bkq1d.js +1 -0
  118. package/src/assets/web-panel/assets/raf-Deuc0E8-.js +1 -0
  119. package/src/assets/web-panel/assets/responsiveObserve-B3aCQz5r.js +1 -0
  120. package/src/assets/web-panel/assets/slide-eR-f56FQ.js +4 -0
  121. package/src/assets/web-panel/assets/statusUtils-zcNWczhN.js +1 -0
  122. package/src/assets/web-panel/assets/styleChecker-u9Z0IfRy.js +1 -0
  123. package/src/assets/web-panel/assets/transition-gRK4XSlW.js +1 -0
  124. package/src/assets/web-panel/assets/useConfigInject-ZEunuNHN.js +2 -0
  125. package/src/assets/web-panel/assets/useFlexGapSupport-BpbEJfeh.js +1 -0
  126. package/src/assets/web-panel/assets/useMergedState-CXfbNKuO.js +1 -0
  127. package/src/assets/web-panel/assets/useRefs-DwsdQTxa.js +1 -0
  128. package/src/assets/web-panel/assets/useState-DRbnp348.js +1 -0
  129. package/src/assets/web-panel/assets/vendor-C5RM7MZO.js +1 -0
  130. package/src/assets/web-panel/assets/vnode-DVHvXn9F.js +1 -0
  131. package/src/assets/web-panel/assets/warning-Pq00owYb.js +1 -0
  132. package/src/assets/web-panel/assets/ws-D-sl0vsW.js +1 -0
  133. package/src/assets/web-panel/assets/zoom-ByzgJIn6.js +4 -0
  134. package/src/assets/web-panel/index.html +4 -4
  135. package/src/commands/pack.js +463 -0
  136. package/src/commands/ui.js +6 -0
  137. package/src/gateways/ws/ws-server.js +29 -3
  138. package/src/index.js +34 -1
  139. package/src/lib/governance-v2-helpers.js +109 -0
  140. package/src/lib/packer/config-template-builder.js +151 -0
  141. package/src/lib/packer/errors.js +30 -0
  142. package/src/lib/packer/index.js +383 -0
  143. package/src/lib/packer/manifest-writer.js +93 -0
  144. package/src/lib/packer/native-prebuild-collector.js +305 -0
  145. package/src/lib/packer/pack-update-applier.js +203 -0
  146. package/src/lib/packer/pack-update-checker.js +185 -0
  147. package/src/lib/packer/pack-update-downloader.js +162 -0
  148. package/src/lib/packer/pkg-config-generator.js +325 -0
  149. package/src/lib/packer/pkg-runner.js +139 -0
  150. package/src/lib/packer/precheck.js +273 -0
  151. package/src/lib/packer/project-assets-collector.js +0 -0
  152. package/src/lib/packer/smoke-runner.js +339 -0
  153. package/src/lib/packer/web-panel-builder.js +157 -0
  154. package/src/lib/web-ui-server.js +95 -2
  155. package/src/lib/ws-server.js +1 -0
  156. package/src/runtime/agent-runtime.js +1 -0
  157. package/src/runtime/policies/agent-policy.js +1 -0
  158. package/src/assets/web-panel/assets/AppLayout-BudVJQjq.js +0 -1
  159. package/src/assets/web-panel/assets/AppLayout-CZQuPcF0.css +0 -1
  160. package/src/assets/web-panel/assets/Backup-DbVRG5vE.js +0 -1
  161. package/src/assets/web-panel/assets/Chat-DfR76jyX.css +0 -1
  162. package/src/assets/web-panel/assets/Chat-wVhrFK9C.js +0 -1
  163. package/src/assets/web-panel/assets/Cowork-CXuhlHew.css +0 -1
  164. package/src/assets/web-panel/assets/Cowork-lOC25IW2.js +0 -7
  165. package/src/assets/web-panel/assets/Git-CrDCcBig.js +0 -2
  166. package/src/assets/web-panel/assets/Logs-BfTE8urP.js +0 -2
  167. package/src/assets/web-panel/assets/Memory-BXX_yMKJ.js +0 -2
  168. package/src/assets/web-panel/assets/Notes-DU6Vf2cL.js +0 -2
  169. package/src/assets/web-panel/assets/P2P-BxFZ1Bit.js +0 -2
  170. package/src/assets/web-panel/assets/Permissions-B1j3Mtms.js +0 -4
  171. package/src/assets/web-panel/assets/Projects-D-CGscDu.js +0 -2
  172. package/src/assets/web-panel/assets/Providers-r6NaBYMf.js +0 -2
  173. package/src/assets/web-panel/assets/RssFeed-D7b68C5q.js +0 -3
  174. package/src/assets/web-panel/assets/Security-MJfKv0EJ.js +0 -4
  175. package/src/assets/web-panel/assets/Services-Yb_Q1V3d.js +0 -2
  176. package/src/assets/web-panel/assets/Skills-DLTHcH5T.js +0 -1
  177. package/src/assets/web-panel/assets/Tasks-CqycpPjS.js +0 -1
  178. package/src/assets/web-panel/assets/Templates-y01u2Zis.js +0 -1
  179. package/src/assets/web-panel/assets/VideoEditing-B_nPKw6B.js +0 -1
  180. package/src/assets/web-panel/assets/WebAuthn-DWoR5ADp.js +0 -5
  181. package/src/assets/web-panel/assets/WorkflowEditor-DBJhFPMN.js +0 -1
  182. package/src/assets/web-panel/assets/antd-Dh2t0vGq.js +0 -474
  183. package/src/assets/web-panel/assets/chat-BYmuDvol.js +0 -1
  184. package/src/assets/web-panel/assets/index-CI_aB8Px.js +0 -2
  185. package/src/assets/web-panel/assets/markdown-CBnGGMzE.js +0 -55
  186. package/src/assets/web-panel/assets/vendor-CN0Iv_qZ.js +0 -1
  187. package/src/assets/web-panel/assets/ws-Dma34ig_.js +0 -1
  188. /package/src/assets/web-panel/assets/{github-dark-Dfs9RUU9.css → markdown-Dfs9RUU9.css} +0 -0
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Phase 2: web-panel-builder
3
+ *
4
+ * Ensures packages/cli/src/assets/web-panel/ (or packages/web-panel/dist)
5
+ * has a built Vue panel ready to embed. If missing or stale, runs
6
+ * `npm run build:web-panel` from the CLI package root.
7
+ *
8
+ * Stale = source files in packages/web-panel/src newer than dist/index.html.
9
+ */
10
+
11
+ import fs from "node:fs";
12
+ import path from "node:path";
13
+ import { spawnSync } from "node:child_process";
14
+ import { PackError, EXIT } from "./errors.js";
15
+
16
+ /**
17
+ * @param {object} ctx
18
+ * @param {string} ctx.cliRoot packages/cli absolute path
19
+ * @param {boolean} ctx.skipBuild reuse existing dist
20
+ * @param {object} [ctx.logger] optional logger.log(msg)
21
+ * @returns {{distDir:string, rebuilt:boolean, assetCount:number}}
22
+ */
23
+ export function ensureWebPanel(ctx) {
24
+ const { cliRoot, skipBuild, logger } = ctx;
25
+ const log = logger?.log || (() => {});
26
+
27
+ const candidates = [
28
+ path.join(cliRoot, "src", "assets", "web-panel"),
29
+ path.resolve(cliRoot, "..", "web-panel", "dist"),
30
+ ];
31
+
32
+ let distDir = candidates.find((d) =>
33
+ fs.existsSync(path.join(d, "index.html")),
34
+ );
35
+
36
+ // Decide if a rebuild is needed
37
+ let rebuilt = false;
38
+ let needsBuild = !distDir;
39
+ if (distDir && !skipBuild) {
40
+ needsBuild = isDistStale(distDir);
41
+ }
42
+
43
+ if (needsBuild && skipBuild) {
44
+ throw new PackError(
45
+ "web-panel/dist is missing or stale, but --skip-web-panel-build was passed.",
46
+ EXIT.WEB_PANEL,
47
+ );
48
+ }
49
+
50
+ if (needsBuild) {
51
+ log(" [web-panel] Building Vue panel via 'npm run build:web-panel'...");
52
+ const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
53
+ const res = spawnSync(npmCmd, ["run", "build:web-panel"], {
54
+ cwd: cliRoot,
55
+ stdio: "inherit",
56
+ windowsHide: true,
57
+ });
58
+ if (res.status !== 0) {
59
+ throw new PackError(
60
+ `'npm run build:web-panel' exited with code ${res.status}`,
61
+ EXIT.WEB_PANEL,
62
+ );
63
+ }
64
+ rebuilt = true;
65
+ distDir = candidates.find((d) => fs.existsSync(path.join(d, "index.html")));
66
+ }
67
+
68
+ if (!distDir) {
69
+ throw new PackError(
70
+ "web-panel build did not produce dist/index.html in any expected location.",
71
+ EXIT.WEB_PANEL,
72
+ );
73
+ }
74
+
75
+ const assetCount = countAssets(distDir);
76
+ if (assetCount < 2) {
77
+ throw new PackError(
78
+ `web-panel dist looks empty (only ${assetCount} files). Build may be broken.`,
79
+ EXIT.WEB_PANEL,
80
+ );
81
+ }
82
+
83
+ return { distDir, rebuilt, assetCount };
84
+ }
85
+
86
+ /**
87
+ * dist is stale if any source file is newer than dist/index.html.
88
+ * Source roots tried in order; missing roots are skipped.
89
+ */
90
+ function isDistStale(distDir) {
91
+ const indexHtml = path.join(distDir, "index.html");
92
+ if (!fs.existsSync(indexHtml)) return true;
93
+ const builtAt = fs.statSync(indexHtml).mtimeMs;
94
+
95
+ const sourceRoots = [
96
+ path.resolve(distDir, "..", "..", "..", "web-panel", "src"),
97
+ path.resolve(distDir, "..", "src"),
98
+ ];
99
+ for (const root of sourceRoots) {
100
+ if (!fs.existsSync(root)) continue;
101
+ if (latestMTimeRecursive(root, builtAt) > builtAt) return true;
102
+ }
103
+ return false;
104
+ }
105
+
106
+ /**
107
+ * Walk dir; return earliest mtime that exceeds threshold.
108
+ * Short-circuits on first hit.
109
+ */
110
+ function latestMTimeRecursive(dir, threshold) {
111
+ let max = 0;
112
+ const stack = [dir];
113
+ while (stack.length) {
114
+ const cur = stack.pop();
115
+ let entries;
116
+ try {
117
+ entries = fs.readdirSync(cur, { withFileTypes: true });
118
+ } catch {
119
+ continue;
120
+ }
121
+ for (const e of entries) {
122
+ const full = path.join(cur, e.name);
123
+ try {
124
+ const st = fs.statSync(full);
125
+ if (e.isDirectory()) {
126
+ stack.push(full);
127
+ } else if (st.mtimeMs > max) {
128
+ max = st.mtimeMs;
129
+ if (max > threshold) return max;
130
+ }
131
+ } catch {
132
+ /* skip */
133
+ }
134
+ }
135
+ }
136
+ return max;
137
+ }
138
+
139
+ function countAssets(distDir) {
140
+ let count = 0;
141
+ const stack = [distDir];
142
+ while (stack.length) {
143
+ const cur = stack.pop();
144
+ let entries;
145
+ try {
146
+ entries = fs.readdirSync(cur, { withFileTypes: true });
147
+ } catch {
148
+ continue;
149
+ }
150
+ for (const e of entries) {
151
+ const full = path.join(cur, e.name);
152
+ if (e.isDirectory()) stack.push(full);
153
+ else count++;
154
+ }
155
+ }
156
+ return count;
157
+ }
@@ -4,8 +4,16 @@
4
4
  * The UI is a self-contained single-page app with an embedded WebSocket client.
5
5
  *
6
6
  * Usage:
7
- * const server = createWebUIServer({ wsPort, wsToken, wsHost, projectRoot, projectName, mode });
7
+ * const server = createWebUIServer({ wsPort, wsToken, wsHost, projectRoot, projectName, mode, uiMode });
8
8
  * server.listen(18810, '127.0.0.1');
9
+ *
10
+ * uiMode controls which front-end is served:
11
+ * - "auto" (default): SPA if web-panel/dist exists, else embedded HTML
12
+ * - "full": SPA only — throws if web-panel/dist is missing
13
+ * - "minimal": embedded HTML only, even if SPA is available
14
+ *
15
+ * `cc pack` artifacts always set uiMode="full" so the bundled exe never
16
+ * silently degrades to the minimal HTML when assets failed to bundle.
9
17
  */
10
18
 
11
19
  import http from "http";
@@ -13,6 +21,7 @@ import fs from "fs";
13
21
  import path from "path";
14
22
  import { fileURLToPath } from "url";
15
23
  import { getInlineSource as getEnvelopeInlineSource } from "./web-ui-envelope.js";
24
+ import { CLISkillLoader } from "./skill-loader.js";
16
25
 
17
26
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
18
27
 
@@ -1209,6 +1218,67 @@ function findWebPanelDist(staticDir) {
1209
1218
  return null;
1210
1219
  }
1211
1220
 
1221
+ /**
1222
+ * Handle `/api/*` routes. Returns `true` if the request was handled (caller
1223
+ * must stop further processing) and `false` for everything else (caller
1224
+ * continues with the static/SPA handler).
1225
+ *
1226
+ * Currently exposes a single read-only endpoint:
1227
+ *
1228
+ * GET /api/skills → 200 { schema: 1, skills: [{name, source, category,
1229
+ * description, version}] }
1230
+ *
1231
+ * The smoke-runner's project-mode probe (packer/smoke-runner.js) hits this
1232
+ * to verify bundled skills were materialized and registered. The shape is
1233
+ * deliberately minimal — the Web UI's richer skill views use WS.
1234
+ *
1235
+ * @param {import("http").IncomingMessage} req
1236
+ * @param {import("http").ServerResponse} res
1237
+ * @returns {boolean} true if handled, false if the caller should continue
1238
+ */
1239
+ export function handleApiRequest(req, res) {
1240
+ const urlPath = req.url.split("?")[0];
1241
+ if (!urlPath.startsWith("/api/")) return false;
1242
+
1243
+ if (urlPath === "/api/skills") {
1244
+ if (req.method !== "GET") {
1245
+ res.writeHead(405, { "Content-Type": "application/json" });
1246
+ res.end(JSON.stringify({ error: "Method Not Allowed" }));
1247
+ return true;
1248
+ }
1249
+ try {
1250
+ const loader = new CLISkillLoader();
1251
+ const resolved = loader.loadAll();
1252
+ const skills = resolved.map((s) => ({
1253
+ name: s.id,
1254
+ displayName: s.displayName,
1255
+ source: s.source,
1256
+ category: s.category,
1257
+ description: s.description,
1258
+ version: s.version,
1259
+ }));
1260
+ res.writeHead(200, {
1261
+ "Content-Type": "application/json; charset=utf-8",
1262
+ "Cache-Control": "no-store",
1263
+ "X-Content-Type-Options": "nosniff",
1264
+ });
1265
+ res.end(JSON.stringify({ schema: 1, skills }));
1266
+ } catch (err) {
1267
+ res.writeHead(500, { "Content-Type": "application/json" });
1268
+ res.end(
1269
+ JSON.stringify({ error: "Skill load failed", detail: err.message }),
1270
+ );
1271
+ }
1272
+ return true;
1273
+ }
1274
+
1275
+ // Unknown /api/* path — explicit 404 so callers (smoke-runner) can tell
1276
+ // "endpoint not implemented" from "server broken".
1277
+ res.writeHead(404, { "Content-Type": "application/json" });
1278
+ res.end(JSON.stringify({ error: "Not Found", path: urlPath }));
1279
+ return true;
1280
+ }
1281
+
1212
1282
  /**
1213
1283
  * Create and return a Node.js HTTP server that serves the Web UI.
1214
1284
  *
@@ -1223,16 +1293,37 @@ function findWebPanelDist(staticDir) {
1223
1293
  * @param {string|null} opts.projectRoot
1224
1294
  * @param {string|null} opts.projectName
1225
1295
  * @param {"project"|"global"} opts.mode
1296
+ * @param {"auto"|"full"|"minimal"} [opts.uiMode="auto"]
1226
1297
  * @param {string|null} [opts.staticDir] - Optional override for dist directory
1227
1298
  * @returns {import("http").Server}
1228
1299
  */
1229
1300
  export function createWebUIServer(opts) {
1230
- const distDir = findWebPanelDist(opts.staticDir || null);
1301
+ const uiMode = opts.uiMode || "auto";
1302
+ if (uiMode !== "auto" && uiMode !== "full" && uiMode !== "minimal") {
1303
+ throw new Error(
1304
+ `Invalid uiMode "${uiMode}". Expected "auto", "full", or "minimal".`,
1305
+ );
1306
+ }
1307
+
1308
+ const distDir =
1309
+ uiMode === "minimal" ? null : findWebPanelDist(opts.staticDir || null);
1310
+
1311
+ if (uiMode === "full" && !distDir) {
1312
+ throw new Error(
1313
+ 'uiMode="full" requires a built web-panel dist directory, but none was found. ' +
1314
+ "Run `npm run build:web-panel` in packages/cli, or pass `staticDir` to override.",
1315
+ );
1316
+ }
1317
+
1231
1318
  const configJson = buildConfigJson(opts);
1232
1319
 
1233
1320
  if (distDir) {
1234
1321
  // ── Serve built Vue3 web panel ──────────────────────────────────────────
1235
1322
  return http.createServer((req, res) => {
1323
+ // /api/* routes are handled before the static file logic so GET /api/skills
1324
+ // doesn't accidentally resolve to index.html via the SPA fallback.
1325
+ if (handleApiRequest(req, res)) return;
1326
+
1236
1327
  if (req.method !== "GET") {
1237
1328
  res.writeHead(405, { "Content-Type": "text/plain" });
1238
1329
  res.end("Method Not Allowed");
@@ -1290,6 +1381,8 @@ export function createWebUIServer(opts) {
1290
1381
  // ── Fallback: embedded classic single-page HTML ─────────────────────────
1291
1382
  const html = buildHtml(opts);
1292
1383
  return http.createServer((req, res) => {
1384
+ if (handleApiRequest(req, res)) return;
1385
+
1293
1386
  const urlPath = req.url.split("?")[0];
1294
1387
  if (
1295
1388
  req.method !== "GET" ||
@@ -13,4 +13,5 @@
13
13
  export {
14
14
  ChainlessChainWSServer,
15
15
  tokenizeCommand,
16
+ isCommandBlocked,
16
17
  } from "../gateways/ws/ws-server.js";
@@ -495,6 +495,7 @@ export class AgentRuntime {
495
495
  projectName,
496
496
  mode,
497
497
  staticDir: this.policy.webPanelDir,
498
+ uiMode: this.policy.uiMode,
498
499
  });
499
500
 
500
501
  await new Promise((resolve, reject) => {
@@ -51,5 +51,6 @@ export function resolveUiPolicy(overrides = {}) {
51
51
  open: overrides.open !== false,
52
52
  token: overrides.token || null,
53
53
  webPanelDir: overrides.webPanelDir || null,
54
+ uiMode: overrides.uiMode || "auto",
54
55
  };
55
56
  }
@@ -1 +0,0 @@
1
- import{o as ge,W as f,Z as t,X as d,$ as be,a0 as Oe,Y as i,k as e,a1 as a,a2 as w,a3 as r,a4 as S,F as T,u as s,a5 as v,G as l,a6 as Ce,a7 as we,f as Te,c as y}from"./vendor-CN0Iv_qZ.js";import{u as je}from"./ws-Dma34ig_.js";import{u as Se,T as Be}from"./index-CI_aB8Px.js";import{_ as Re}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as B,G as R,D as M,M as P,R as V,C as A,b as F,c as I,d as K,e as D,B as G,f as W,h as E,i as U,T as z,S as $,L as H,W as X,j as Y,k as Z,P as q,l as J,m as Q,n as h,o as ee,V as xe,p as te,K as oe,I as Ne}from"./antd-Dh2t0vGq.js";const Le={key:0,class:"logo-text"},Me={key:0,class:"mode-banner project"},Pe={class:"banner-info"},Ve={class:"banner-name"},Ae={key:1,class:"mode-banner global"},Fe=["title"],Ie={key:0,class:"footer-text"},Ke={class:"header-left"},De={class:"header-right"},Ge={class:"theme-switcher"},We=["data-theme-key","onClick"],Ee={class:"version-tag"},Ue={__name:"AppLayout",setup(ze){const se=be(),ne=Oe(),b=je(),j=Se(),u=Te(!1),k=window.__CC_CONFIG__||{},p=y(()=>k.mode==="project"),le="v5.0.2.43",ae=y(()=>j.current),ie=y(()=>j.config.vars["--menu-mode"]),x=y(()=>{const c=ne.name?.toLowerCase()||"dashboard";return[{mcptools:"mcp"}[c]||c]}),O=y(()=>b.status),de=y(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[b.status]||"default"),ue=y(()=>({connected:"已连接",connecting:"连接中...",error:"连接错误",disconnected:"未连接"})[b.status]||"未知");function re(c){j.setTheme(c)}function ce({key:c}){se.push({mcp:"/mcp"}[c]||`/${c}`)}return ge(()=>b.connect()),(c,o)=>{const n=d("a-menu-item"),m=d("a-menu-item-group"),g=d("a-menu-divider"),pe=d("a-menu"),me=d("a-badge"),ye=d("a-layout-sider"),N=d("a-tooltip"),ke=d("a-tag"),_e=d("a-layout-header"),fe=d("router-view"),ve=d("a-layout-content"),L=d("a-layout");return i(),f(L,{class:"app-root"},{default:t(()=>[e(ye,{collapsed:u.value,"onUpdate:collapsed":o[1]||(o[1]=_=>u.value=_),collapsible:"","collapsed-width":56,width:216,class:"sidebar"},{default:t(()=>[a("div",{class:w(["logo",{collapsed:u.value}])},[o[2]||(o[2]=a("span",{class:"logo-icon"},"⛓",-1)),u.value?S("",!0):(i(),r("span",Le,"ChainlessChain"))],2),u.value?(i(),r("div",{key:1,class:"mode-icon-sm",title:p.value?s(k).projectName:"全局模式"},[p.value?(i(),f(s(B),{key:0,style:{color:"#1677ff"}})):(i(),f(s(R),{key:1,style:{color:"#722ed1"}}))],8,Fe)):(i(),r(T,{key:0},[p.value?(i(),r("div",Me,[e(s(B),{class:"banner-icon"}),a("div",Pe,[a("div",Ve,v(s(k).projectName||"项目"),1),o[3]||(o[3]=a("div",{class:"banner-sub"},"项目级面板",-1))])])):(i(),r("div",Ae,[e(s(R),{class:"banner-icon"}),o[4]||(o[4]=a("span",{class:"banner-name"},"全局模式",-1))]))],64)),e(pe,{selectedKeys:x.value,"onUpdate:selectedKeys":o[0]||(o[0]=_=>x.value=_),theme:ie.value,mode:"inline","inline-collapsed":u.value,class:"side-menu",onClick:ce},{default:t(()=>[u.value?(i(),r(T,{key:1},[e(n,{key:"dashboard"},{icon:t(()=>[e(s(M))]),_:1}),e(n,{key:"chat"},{icon:t(()=>[e(s(P))]),_:1}),e(n,{key:"cowork"},{icon:t(()=>[e(s(V))]),_:1}),e(n,{key:"services"},{icon:t(()=>[e(s(A))]),_:1}),e(n,{key:"logs"},{icon:t(()=>[e(s(F))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"skills"},{icon:t(()=>[e(s(I))]),_:1}),e(n,{key:"providers"},{icon:t(()=>[e(s(K))]),_:1}),e(n,{key:"mcp"},{icon:t(()=>[e(s(D))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"notes"},{icon:t(()=>[e(s(G))]),_:1}),e(n,{key:"memory"},{icon:t(()=>[e(s(W))]),_:1}),e(n,{key:"cron"},{icon:t(()=>[e(s(E))]),_:1}),e(n,{key:"workflow"},{icon:t(()=>[e(s(U))]),_:1}),e(n,{key:"tasks"},{icon:t(()=>[e(s(z))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"security"},{icon:t(()=>[e(s($))]),_:1}),e(n,{key:"permissions"},{icon:t(()=>[e(s(H))]),_:1}),e(n,{key:"p2p"},{icon:t(()=>[e(s(X))]),_:1}),e(n,{key:"backup"},{icon:t(()=>[e(s(Y))]),_:1}),e(n,{key:"git"},{icon:t(()=>[e(s(Z))]),_:1}),e(n,{key:"projects"},{icon:t(()=>[e(s(q))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"wallet"},{icon:t(()=>[e(s(J))]),_:1}),e(n,{key:"organization"},{icon:t(()=>[e(s(Q))]),_:1}),e(n,{key:"analytics"},{icon:t(()=>[e(s(h))]),_:1}),e(n,{key:"templates"},{icon:t(()=>[e(s(ee))]),_:1}),e(g,{class:"divider-sm"}),e(n,{key:"rssfeed"},{icon:t(()=>[e(s(te))]),_:1}),e(n,{key:"webauthn"},{icon:t(()=>[e(s(oe))]),_:1})],64)):(i(),r(T,{key:0},[e(m,null,{title:t(()=>[...o[5]||(o[5]=[a("span",{class:"group-label"},"概 览",-1)])]),default:t(()=>[e(n,{key:"dashboard"},{icon:t(()=>[e(s(M))]),default:t(()=>[o[6]||(o[6]=l("仪表板",-1))]),_:1}),e(n,{key:"chat"},{icon:t(()=>[e(s(P))]),default:t(()=>[o[7]||(o[7]=l("AI 对话",-1))]),_:1}),e(n,{key:"cowork"},{icon:t(()=>[e(s(V))]),default:t(()=>[o[8]||(o[8]=l("日常协作",-1))]),_:1}),e(n,{key:"services"},{icon:t(()=>[e(s(A))]),default:t(()=>[o[9]||(o[9]=l("服务管理",-1))]),_:1}),e(n,{key:"logs"},{icon:t(()=>[e(s(F))]),default:t(()=>[o[10]||(o[10]=l("日志查看",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[11]||(o[11]=[a("span",{class:"group-label"},"配 置",-1)])]),default:t(()=>[e(n,{key:"skills"},{icon:t(()=>[e(s(I))]),default:t(()=>[o[12]||(o[12]=l("技能管理",-1))]),_:1}),e(n,{key:"providers"},{icon:t(()=>[e(s(K))]),default:t(()=>[o[13]||(o[13]=l("LLM 配置",-1))]),_:1}),e(n,{key:"mcp"},{icon:t(()=>[e(s(D))]),default:t(()=>[o[14]||(o[14]=l("MCP 工具",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[15]||(o[15]=[a("span",{class:"group-label"},"数 据",-1)])]),default:t(()=>[e(n,{key:"notes"},{icon:t(()=>[e(s(G))]),default:t(()=>[o[16]||(o[16]=l("笔记管理",-1))]),_:1}),e(n,{key:"memory"},{icon:t(()=>[e(s(W))]),default:t(()=>[o[17]||(o[17]=l("记忆文件",-1))]),_:1}),e(n,{key:"cron"},{icon:t(()=>[e(s(E))]),default:t(()=>[o[18]||(o[18]=l("定时任务",-1))]),_:1}),e(n,{key:"workflow"},{icon:t(()=>[e(s(U))]),default:t(()=>[o[19]||(o[19]=l("工作流编辑",-1))]),_:1}),e(n,{key:"tasks"},{icon:t(()=>[e(s(z))]),default:t(()=>[o[20]||(o[20]=l("后台任务",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[21]||(o[21]=[a("span",{class:"group-label"},"高 级",-1)])]),default:t(()=>[e(n,{key:"security"},{icon:t(()=>[e(s($))]),default:t(()=>[o[22]||(o[22]=l("安全中心",-1))]),_:1}),e(n,{key:"permissions"},{icon:t(()=>[e(s(H))]),default:t(()=>[o[23]||(o[23]=l("权限管理",-1))]),_:1}),e(n,{key:"p2p"},{icon:t(()=>[e(s(X))]),default:t(()=>[o[24]||(o[24]=l("P2P 网络",-1))]),_:1}),e(n,{key:"backup"},{icon:t(()=>[e(s(Y))]),default:t(()=>[o[25]||(o[25]=l("备份同步",-1))]),_:1}),e(n,{key:"git"},{icon:t(()=>[e(s(Z))]),default:t(()=>[o[26]||(o[26]=l("Git 与数据",-1))]),_:1}),e(n,{key:"projects"},{icon:t(()=>[e(s(q))]),default:t(()=>[o[27]||(o[27]=l("项目管理",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[28]||(o[28]=[a("span",{class:"group-label"},"企 业",-1)])]),default:t(()=>[e(n,{key:"wallet"},{icon:t(()=>[e(s(J))]),default:t(()=>[o[29]||(o[29]=l("钱包管理",-1))]),_:1}),e(n,{key:"organization"},{icon:t(()=>[e(s(Q))]),default:t(()=>[o[30]||(o[30]=l("组织管理",-1))]),_:1}),e(n,{key:"analytics"},{icon:t(()=>[e(s(h))]),default:t(()=>[o[31]||(o[31]=l("使用分析",-1))]),_:1}),e(n,{key:"templates"},{icon:t(()=>[e(s(ee))]),default:t(()=>[o[32]||(o[32]=l("模板中心",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[33]||(o[33]=[a("span",{class:"group-label"},"媒 体",-1)])]),default:t(()=>[e(n,{key:"video"},{icon:t(()=>[e(s(xe))]),default:t(()=>[o[34]||(o[34]=l("视频剪辑",-1))]),_:1})]),_:1}),e(m,null,{title:t(()=>[...o[35]||(o[35]=[a("span",{class:"group-label"},"扩 展",-1)])]),default:t(()=>[e(n,{key:"rssfeed"},{icon:t(()=>[e(s(te))]),default:t(()=>[o[36]||(o[36]=l("RSS 订阅",-1))]),_:1}),e(n,{key:"webauthn"},{icon:t(()=>[e(s(oe))]),default:t(()=>[o[37]||(o[37]=l("身份认证",-1))]),_:1})]),_:1})],64))]),_:1},8,["selectedKeys","theme","inline-collapsed"]),a("div",{class:w(["sidebar-footer",{collapsed:u.value}])},[e(me,{status:de.value},null,8,["status"]),u.value?S("",!0):(i(),r("span",Ie,v(ue.value),1))],2)]),_:1},8,["collapsed"]),e(L,{class:"main-area"},{default:t(()=>[e(_e,{class:"app-header"},{default:t(()=>[a("div",Ke,[a("div",{class:w(["scope-tag",p.value?"project":"global"])},[(i(),f(Ce(p.value?s(B):s(R)))),a("span",null,v(p.value?s(k).projectName||"项目":"全局模式"),1),p.value&&s(k).projectRoot?(i(),f(N,{key:0,title:s(k).projectRoot},{default:t(()=>[e(s(Ne),{class:"info-icon"})]),_:1},8,["title"])):S("",!0)],2)]),a("div",De,[a("div",Ge,[(i(!0),r(T,null,we(s(Be),(_,C)=>(i(),f(N,{key:C,title:_.label},{default:t(()=>[a("button",{class:w(["theme-btn",{active:ae.value===C}]),"data-theme-key":C,onClick:$e=>re(C)},v(_.icon),11,We)]),_:2},1032,["title"]))),128))]),a("span",Ee,v(s(le)),1),e(ke,{color:O.value==="connected"?"green":O.value==="connecting"?"orange":"red",class:"ws-tag"},{default:t(()=>[l(v(O.value==="connected"?"已连接":O.value==="connecting"?"连接中":"断开"),1)]),_:1},8,["color"])])]),_:1}),e(ve,{class:"page-content"},{default:t(()=>[e(fe)]),_:1})]),_:1})]),_:1})}}},Je=Re(Ue,[["__scopeId","data-v-b5e07843"]]);export{Je as default};
@@ -1 +0,0 @@
1
- .app-root[data-v-b5e07843]{min-height:100vh;background:var(--bg-base)}.sidebar[data-v-b5e07843]{background:var(--bg-sidebar)!important;border-right:1px solid var(--border-color);transition:background .25s}[data-v-b5e07843] .ant-layout-sider-children{display:flex;flex-direction:column;overflow:hidden}.main-area[data-v-b5e07843]{background:var(--bg-base)}.logo[data-v-b5e07843]{height:52px;display:flex;align-items:center;padding:0 18px;gap:10px;border-bottom:1px solid var(--border-color);overflow:hidden;white-space:nowrap;flex-shrink:0}.logo.collapsed[data-v-b5e07843]{padding:0;justify-content:center}.logo-icon[data-v-b5e07843]{font-size:20px;flex-shrink:0}.logo-text[data-v-b5e07843]{color:var(--logo-text);font-weight:700;font-size:14px;letter-spacing:.01em}.mode-banner[data-v-b5e07843]{display:flex;align-items:center;gap:8px;padding:7px 10px;margin:8px 8px 4px;border-radius:7px;overflow:hidden}.mode-banner.project[data-v-b5e07843]{background:#1677ff1a;border:1px solid rgba(22,119,255,.2)}.mode-banner.global[data-v-b5e07843]{background:#722ed11a;border:1px solid rgba(114,46,209,.2)}.banner-icon[data-v-b5e07843]{font-size:13px;flex-shrink:0;color:#1677ff}.mode-banner.global .banner-icon[data-v-b5e07843]{color:#722ed1}.banner-info[data-v-b5e07843]{flex:1;min-width:0}.banner-name[data-v-b5e07843]{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.banner-sub[data-v-b5e07843]{font-size:10px;color:#1677ff;margin-top:1px}.mode-banner.global .banner-name[data-v-b5e07843]{color:#c084fc}.mode-icon-sm[data-v-b5e07843]{display:flex;justify-content:center;padding:8px 0;font-size:14px}.side-menu[data-v-b5e07843]{border:none!important;margin-top:2px;-webkit-user-select:none;user-select:none;background:transparent!important;flex:1;overflow-y:auto;overflow-x:hidden}.group-label[data-v-b5e07843]{color:var(--group-title);font-size:10px;font-weight:700;letter-spacing:.12em;padding-left:6px}[data-v-b5e07843] .ant-menu-item-group-title{padding:8px 16px 2px!important}[data-v-b5e07843] .ant-menu-item{height:38px!important;line-height:38px!important;margin:1px 4px!important;border-radius:6px!important}.divider-sm[data-v-b5e07843]{margin:4px 0!important}.sidebar-footer[data-v-b5e07843]{flex-shrink:0;padding:8px 18px;display:flex;align-items:center;gap:8px;border-top:1px solid var(--border-color)}.sidebar-footer.collapsed[data-v-b5e07843]{justify-content:center;padding:8px 0}.footer-text[data-v-b5e07843]{color:var(--text-secondary);font-size:11px}.app-header[data-v-b5e07843]{background:var(--bg-header)!important;padding:0 20px!important;border-bottom:1px solid var(--border-color);height:50px!important;line-height:50px!important;display:flex!important;align-items:center!important;justify-content:space-between!important;box-shadow:0 1px 4px #0000000f}.header-left[data-v-b5e07843],.header-right[data-v-b5e07843]{display:flex;align-items:center;gap:10px}.scope-tag[data-v-b5e07843]{display:flex;align-items:center;gap:5px;padding:3px 10px;border-radius:5px;font-size:12px;font-weight:500}.scope-tag.project[data-v-b5e07843]{background:#1677ff1a;color:#1677ff;border:1px solid rgba(22,119,255,.2)}.scope-tag.global[data-v-b5e07843]{background:#722ed11a;color:#722ed1;border:1px solid rgba(114,46,209,.2)}.info-icon[data-v-b5e07843]{opacity:.45;cursor:help;margin-left:2px}.theme-switcher[data-v-b5e07843]{display:flex;align-items:center;gap:4px;background:var(--bg-card);border:1px solid var(--border-color);border-radius:20px;padding:3px 6px}.theme-btn[data-v-b5e07843]{width:26px;height:26px;border:none;border-radius:50%;cursor:pointer;background:transparent;font-size:14px;line-height:1;display:flex;align-items:center;justify-content:center;transition:background .15s,transform .15s;opacity:.55}.theme-btn[data-v-b5e07843]:hover{opacity:.9;transform:scale(1.15);background:var(--bg-card-hover)}.theme-btn.active[data-v-b5e07843]{opacity:1;transform:scale(1.1);background:var(--bg-card-hover);outline:2px solid var(--text-secondary)}.version-tag[data-v-b5e07843]{color:var(--text-muted);font-size:11px}.ws-tag[data-v-b5e07843]{margin:0!important;font-size:11px}.page-content[data-v-b5e07843]{padding:24px;overflow:auto;background:var(--bg-base);min-height:calc(100vh - 50px)}
@@ -1 +0,0 @@
1
- import{u as Me}from"./ws-Dma34ig_.js";import{_ as Ne}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{q as je,O as me,j as re,U as N,a7 as U,a5 as Le}from"./antd-Dh2t0vGq.js";import{o as Te,a3 as s,a1 as p,k as a,Z as o,f as n,X as y,Y as l,G as f,u as v,W as b,a4 as r,a5 as u,F as Re}from"./vendor-CN0Iv_qZ.js";const De={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ee={key:0,style:{"text-align":"center",padding:"30px"}},Ue={key:0,style:{"font-family":"monospace",color:"var(--text-muted)","font-size":"12px"}},Ke={key:1},Ve={key:2,style:{color:"var(--text-secondary)","font-size":"12px"}},Je={key:3,style:{"margin-top":"16px"}},Ge={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","max-height":"200px","overflow-y":"auto","white-space":"pre-wrap"}},We={key:4,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},qe={key:0,style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px","margin-top":"8px"}},He={style:{"font-family":"monospace"}},Xe={key:0},Ye={key:1,style:{"margin-top":"12px"}},Ze={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","white-space":"pre-wrap"}},Qe={key:0,style:{"text-align":"center",padding:"30px"}},et={key:0,style:{"margin-bottom":"16px"}},tt={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","max-height":"200px","overflow-y":"auto","white-space":"pre-wrap"}},at={key:0,style:{"font-family":"monospace","font-size":"12px"}},ot={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},lt={key:0,style:{"text-align":"center",padding:"30px"}},nt={key:2,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},st={key:0,style:{"text-align":"center",padding:"30px"}},rt={key:0,style:{"font-family":"monospace",color:"var(--text-muted)","font-size":"12px"}},it={key:1},ut={key:2},ct={key:3,style:{color:"var(--text-secondary)","font-size":"12px"}},dt={key:3,style:{"margin-top":"12px",color:"#ff4d4f","font-size":"12px"}},pt={key:0,style:{"margin-top":"12px"}},vt={style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","border-radius":"6px",padding:"12px",color:"#aaa","font-size":"12px","white-space":"pre-wrap"}},yt={__name:"Backup",setup(ft){const g=Me(),ie=n("backup"),K=n(!1),V=n(!1),J=n(!1),B=n(""),w=n([]),_=n(""),be=[{title:"备份 ID",key:"id"},{title:"大小",key:"size",width:120},{title:"创建时间",key:"createdAt"},{title:"操作",key:"action",width:100}];async function ue(){V.value=!0,B.value="";try{const{output:t}=await g.execute("backup list --json",15e3),e=M(t);Array.isArray(e)?w.value=e:e&&Array.isArray(e.backups)?w.value=e.backups:(w.value=[],t&&t.trim()&&(_.value=t))}catch(t){B.value=`加载备份列表失败: ${t.message}`}finally{V.value=!1}}async function xe(){J.value=!0,_.value="",B.value="";try{const{output:t}=await g.execute("backup create --json",3e4);_.value=t||"备份已创建",await ue()}catch(t){_.value=`创建备份失败: ${t.message}`}finally{J.value=!1}}const G=n(!1),W=n(!1),k=n(null),z=n("");function _e(t){k.value=t,z.value="",G.value=!0}async function ke(){if(k.value){W.value=!0,z.value="";try{const{output:t}=await g.execute(`backup restore ${k.value.id}`,6e4);z.value=t||"恢复完成"}catch(t){z.value=`恢复失败: ${t.message}`}finally{W.value=!1}}}const q=n(!1),j=n(""),I=n(!1),L=n("未知"),T=n(0),H=n(""),x=n(""),X=n(!1),Y=n(!1),S=n([]),he=[{title:"文件路径",key:"path"},{title:"冲突类型",key:"type",width:120}];async function Z(){q.value=!0,j.value="";try{const{output:t}=await g.execute("sync status --json",15e3),e=M(t);e?(I.value=e.online||e.synced||e.status==="online"||!1,L.value=I.value?"已同步":"未同步",T.value=e.pending??e.pendingChanges??0,H.value=e.lastSync||e.lastSyncTime||""):we(t)}catch(t){j.value=`加载同步状态失败: ${t.message}`}finally{q.value=!1}}function we(t){if(!t){L.value="未知";return}I.value=/synced|online|up.to.date/i.test(t),L.value=I.value?"已同步":"未同步";const e=t.match(/pending[:\s]+(\d+)/i);T.value=e?parseInt(e[1]):0;const c=t.match(/last[:\s]+(.+)/i);c&&(H.value=c[1].trim())}async function ze(){X.value=!0,x.value="";try{const{output:t}=await g.execute("sync push",3e4);x.value=t||"推送完成",await Z()}catch(t){x.value=`推送失败: ${t.message}`}finally{X.value=!1}}async function Se(){Y.value=!0,x.value="";try{const{output:t}=await g.execute("sync pull",3e4);x.value=t||"拉取完成",await Z()}catch(t){x.value=`拉取失败: ${t.message}`}finally{Y.value=!1}}async function Ce(){try{const{output:t}=await g.execute("sync conflicts --json",15e3),e=M(t);Array.isArray(e)?S.value=e:e&&Array.isArray(e.conflicts)?S.value=e.conflicts:S.value=[]}catch{S.value=[]}}const Q=n(!1),R=n(""),C=n(!1),ee=n(""),te=n(!1),O=n(""),A=n([]),Ae=[{title:"CID",key:"cid"},{title:"名称",key:"name"},{title:"大小",key:"size",width:120},{title:"固定时间",key:"pinnedAt"},{title:"操作",key:"action",width:120}];async function Pe(){Q.value=!0,R.value="";try{const{output:t}=await g.execute("ipfs status --json",15e3),e=M(t);if(e)C.value=e.online||e.status==="online"||e.connected||!1,ee.value=e.peerId||e.id||"";else{C.value=t?/online|connected|running/i.test(t):!1;const c=t?t.match(/(?:peer\s*id|id)[:\s]+(\S+)/i):null;ee.value=c?c[1]:""}}catch(t){R.value=`加载 IPFS 状态失败: ${t.message}`}finally{Q.value=!1}}async function ae(){te.value=!0,O.value="";try{const{output:t}=await g.execute("ipfs pins --json",15e3),e=M(t);Array.isArray(e)?A.value=e:e&&Array.isArray(e.pins)?A.value=e.pins:A.value=[]}catch(t){O.value=`加载固定列表失败: ${t.message}`}finally{te.value=!1}}const oe=n(!1),le=n(!1),D=n(""),F=n("");async function ce(){if(D.value.trim()){le.value=!0,F.value="";try{const{output:t}=await g.execute(`ipfs pin "${D.value.trim()}"`,3e4);F.value=t||"固定成功",await ae()}catch(t){F.value=`固定失败: ${t.message}`}finally{le.value=!1}}}async function $e(t){try{await g.execute(`ipfs unpin ${t.cid}`,15e3),await ae()}catch(e){O.value=`取消固定失败: ${e.message}`}}function M(t){if(!t||!t.trim())return null;try{return JSON.parse(t.trim())}catch{const c=t.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(c)try{return JSON.parse(c[0])}catch{}return null}}function de(t){if(t==null||isNaN(t))return"-";const e=Number(t);if(e===0)return"0 B";const c=["B","KB","MB","GB","TB"],h=Math.floor(Math.log(e)/Math.log(1024));return(e/Math.pow(1024,h)).toFixed(h>0?1:0)+" "+c[h]}async function pe(){K.value=!0;try{await Promise.all([ue(),Z(),Ce(),Pe(),ae()])}finally{K.value=!1}}return Te(pe),(t,e)=>{const c=y("a-button"),h=y("a-space"),E=y("a-spin"),ve=y("a-empty"),ne=y("a-table"),m=y("a-card"),ye=y("a-modal"),se=y("a-tab-pane"),P=y("a-statistic"),$=y("a-col"),fe=y("a-row"),ge=y("a-tag"),Be=y("a-popconfirm"),Ie=y("a-input"),Oe=y("a-tabs");return l(),s("div",null,[p("div",De,[e[6]||(e[6]=p("div",null,[p("h2",{class:"page-title"},"备份与同步"),p("p",{class:"page-sub"},"备份管理 / 数据同步 / IPFS")],-1)),a(c,{type:"primary",ghost:"",loading:K.value,onClick:pe},{icon:o(()=>[a(v(je))]),default:o(()=>[e[5]||(e[5]=f(" 刷新 ",-1))]),_:1},8,["loading"])]),a(Oe,{activeKey:ie.value,"onUpdate:activeKey":e[4]||(e[4]=i=>ie.value=i),type:"card"},{default:o(()=>[a(se,{key:"backup"},{tab:o(()=>[a(v(re)),e[7]||(e[7]=f(" 备份管理",-1))]),default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{title:o(()=>[a(h,null,{default:o(()=>[a(v(re)),e[8]||(e[8]=p("span",null,"备份操作",-1))]),_:1})]),extra:o(()=>[a(c,{type:"primary",loading:J.value,onClick:xe},{icon:o(()=>[a(v(me))]),default:o(()=>[e[9]||(e[9]=f(" 创建备份 ",-1))]),_:1},8,["loading"])]),default:o(()=>[V.value?(l(),s("div",Ee,[a(E)])):w.value.length===0&&!_.value?(l(),b(ve,{key:1,description:"暂无备份记录"})):r("",!0),w.value.length>0?(l(),b(ne,{key:2,columns:be,"data-source":w.value,pagination:!1,size:"small","row-key":"id"},{bodyCell:o(({column:i,record:d})=>[i.key==="id"?(l(),s("span",Ue,u(d.id.length>20?d.id.slice(0,20)+"...":d.id),1)):r("",!0),i.key==="size"?(l(),s("span",Ke,u(de(d.size)),1)):r("",!0),i.key==="createdAt"?(l(),s("span",Ve,u(d.createdAt||"-"),1)):r("",!0),i.key==="action"?(l(),b(c,{key:3,size:"small",type:"link",onClick:Fe=>_e(d)},{default:o(()=>[...e[10]||(e[10]=[f(" 恢复 ",-1)])]),_:1},8,["onClick"])):r("",!0)]),_:1},8,["data-source"])):r("",!0),_.value?(l(),s("div",Je,[e[11]||(e[11]=p("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},"最近操作结果",-1)),p("pre",Ge,u(_.value),1)])):r("",!0),B.value?(l(),s("div",We,u(B.value),1)):r("",!0)]),_:1}),a(ye,{open:G.value,"onUpdate:open":e[0]||(e[0]=i=>G.value=i),title:"确认恢复备份","ok-text":"确认恢复","cancel-text":"取消","confirm-loading":W.value,onOk:ke,"ok-type":"danger"},{default:o(()=>[e[15]||(e[15]=p("p",{style:{color:"var(--text-secondary)"}}," 确定要恢复以下备份吗?此操作将覆盖当前数据。 ",-1)),k.value?(l(),s("div",qe,[p("div",null,[e[12]||(e[12]=p("strong",null,"备份 ID:",-1)),e[13]||(e[13]=f()),p("span",He,u(k.value.id),1)]),k.value.createdAt?(l(),s("div",Xe,[e[14]||(e[14]=p("strong",null,"创建时间:",-1)),f(" "+u(k.value.createdAt),1)])):r("",!0)])):r("",!0),z.value?(l(),s("div",Ye,[p("pre",Ze,u(z.value),1)])):r("",!0)]),_:1},8,["open","confirm-loading"])]),_:1}),a(se,{key:"sync"},{tab:o(()=>[a(v(N)),e[16]||(e[16]=f(" 数据同步",-1))]),default:o(()=>[q.value?(l(),s("div",Qe,[a(E)])):(l(),s(Re,{key:1},[a(fe,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:o(()=>[a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"同步状态",value:L.value,"value-style":{color:I.value?"#52c41a":"#888",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"待同步变更",value:T.value,"value-style":{color:T.value>0?"#faad14":"#52c41a",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"最近同步",value:H.value||"无","value-style":{color:"var(--text-secondary)",fontSize:"16px"}},{prefix:o(()=>[a(v(N))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),a(h,{style:{"margin-bottom":"16px"}},{default:o(()=>[a(c,{loading:X.value,onClick:ze,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(re))]),default:o(()=>[e[17]||(e[17]=f(" 推送 ",-1))]),_:1},8,["loading"]),a(c,{loading:Y.value,onClick:Se,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(N))]),default:o(()=>[e[18]||(e[18]=f(" 拉取 ",-1))]),_:1},8,["loading"])]),_:1}),x.value?(l(),s("div",et,[e[19]||(e[19]=p("div",{style:{color:"var(--text-secondary)","font-size":"11px","margin-bottom":"6px"}},"操作结果",-1)),p("pre",tt,u(x.value),1)])):r("",!0),S.value.length>0?(l(),b(m,{key:1,title:"冲突列表",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(ne,{columns:he,"data-source":S.value,pagination:!1,size:"small","row-key":"path"},{bodyCell:o(({column:i,record:d})=>[i.key==="path"?(l(),s("span",at,u(d.path),1)):r("",!0),i.key==="type"?(l(),b(ge,{key:1,color:"red"},{default:o(()=>[f(u(d.type||"冲突"),1)]),_:2},1024)):r("",!0)]),_:1},8,["data-source"])]),_:1})):r("",!0)],64)),j.value?(l(),s("div",ot,u(j.value),1)):r("",!0)]),_:1}),a(se,{key:"ipfs"},{tab:o(()=>[a(v(U)),e[20]||(e[20]=f(" IPFS 存储",-1))]),default:o(()=>[a(m,{title:"IPFS 状态",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"20px"}},{extra:o(()=>[a(ge,{color:C.value?"green":"default"},{default:o(()=>[f(u(C.value?"在线":"离线"),1)]),_:1},8,["color"])]),default:o(()=>[Q.value?(l(),s("div",lt,[a(E)])):(l(),b(fe,{key:1,gutter:[16,16]},{default:o(()=>[a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"节点状态",value:C.value?"已连接":"未连接","value-style":{color:C.value?"#52c41a":"#888",fontSize:"16px"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"已固定文件",value:A.value.length,"value-style":{fontSize:"16px"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value"])]),_:1})]),_:1}),a($,{xs:24,sm:8},{default:o(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:o(()=>[a(P,{title:"Peer ID",value:ee.value||"-","value-style":{color:"var(--text-muted)",fontSize:"12px",fontFamily:"monospace"}},{prefix:o(()=>[a(v(U))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1})),R.value?(l(),s("div",nt,u(R.value),1)):r("",!0)]),_:1}),a(m,{title:"固定文件列表",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{extra:o(()=>[a(c,{size:"small",onClick:e[1]||(e[1]=i=>oe.value=!0),style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)"}},{icon:o(()=>[a(v(me))]),default:o(()=>[e[21]||(e[21]=f(" 固定文件 ",-1))]),_:1})]),default:o(()=>[te.value?(l(),s("div",st,[a(E)])):A.value.length===0?(l(),b(ve,{key:1,description:"暂无固定文件"})):(l(),b(ne,{key:2,columns:Ae,"data-source":A.value,pagination:{pageSize:10},size:"small","row-key":"cid"},{bodyCell:o(({column:i,record:d})=>[i.key==="cid"?(l(),s("span",rt,u(d.cid.length>24?d.cid.slice(0,24)+"...":d.cid),1)):r("",!0),i.key==="name"?(l(),s("span",it,u(d.name||"-"),1)):r("",!0),i.key==="size"?(l(),s("span",ut,u(de(d.size)),1)):r("",!0),i.key==="pinnedAt"?(l(),s("span",ct,u(d.pinnedAt||"-"),1)):r("",!0),i.key==="action"?(l(),b(Be,{key:4,title:"确定取消固定?","ok-text":"确定","cancel-text":"取消",onConfirm:Fe=>$e(d)},{default:o(()=>[a(c,{size:"small",type:"link",danger:""},{default:o(()=>[a(v(Le)),e[22]||(e[22]=f(" 取消固定 ",-1))]),_:1})]),_:1},8,["onConfirm"])):r("",!0)]),_:1},8,["data-source"])),O.value?(l(),s("div",dt,u(O.value),1)):r("",!0)]),_:1}),a(ye,{open:oe.value,"onUpdate:open":e[3]||(e[3]=i=>oe.value=i),title:"固定文件到 IPFS","confirm-loading":le.value,onOk:ce,"ok-text":"固定","cancel-text":"取消"},{default:o(()=>[e[23]||(e[23]=p("div",{style:{"margin-bottom":"12px",color:"var(--text-secondary)"}},"请输入要固定的文件路径",-1)),a(Ie,{value:D.value,"onUpdate:value":e[2]||(e[2]=i=>D.value=i),placeholder:"文件路径,例如: /path/to/file.txt",onPressEnter:ce},null,8,["value"]),F.value?(l(),s("div",pt,[p("pre",vt,u(F.value),1)])):r("",!0)]),_:1},8,["open","confirm-loading"])]),_:1})]),_:1},8,["activeKey"])])}}},_t=Ne(yt,[["__scopeId","data-v-3d5d81e6"]]);export{_t as default};
@@ -1 +0,0 @@
1
- .session-item[data-v-8392b2d7]{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;cursor:pointer;transition:background .15s;margin-bottom:4px}.session-item[data-v-8392b2d7]:hover{background:var(--bg-card-hover)}.session-item.active[data-v-8392b2d7]{background:#1677ff20;border:1px solid #1677ff40}.session-icon[data-v-8392b2d7]{font-size:16px}.session-info[data-v-8392b2d7]{flex:1;min-width:0}.session-title[data-v-8392b2d7]{color:#ccc;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.session-meta[data-v-8392b2d7]{color:var(--text-muted);font-size:11px;margin-top:2px}.message-row[data-v-8392b2d7]{margin-bottom:16px}.user-msg[data-v-8392b2d7]{display:flex;justify-content:flex-end}.assistant-msg[data-v-8392b2d7]{display:flex;gap:10px;align-items:flex-start}.avatar[data-v-8392b2d7]{width:32px;height:32px;border-radius:50%;background:#1677ff;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;color:var(--text-primary);flex-shrink:0}.bubble[data-v-8392b2d7]{padding:10px 14px;border-radius:12px;max-width:80%;line-height:1.6;font-size:14px}.bubble.user[data-v-8392b2d7]{background:#1677ff;color:var(--text-primary);border-bottom-right-radius:4px}.bubble.assistant[data-v-8392b2d7]{background:var(--bg-card-hover);color:var(--text-primary);border-bottom-left-radius:4px}.bubble.streaming[data-v-8392b2d7]:after{content:"▋";animation:blink-8392b2d7 .7s step-start infinite;color:#1677ff}@keyframes blink-8392b2d7{50%{opacity:0}}.tool-msg[data-v-8392b2d7]{margin:8px 0}.question-card[data-v-8392b2d7]{background:var(--bg-card-hover);border:1px solid #1677ff40;border-radius:10px;padding:14px 16px;margin-top:8px}.question-text[data-v-8392b2d7]{color:#aaa;font-size:13px}[data-v-8392b2d7] .bubble.assistant pre{background:var(--bg-base);border-radius:6px;padding:12px;overflow-x:auto;font-size:12px}[data-v-8392b2d7] .bubble.assistant code:not(pre code){background:var(--bg-card-hover);padding:1px 5px;border-radius:3px;font-size:12px;color:#f0a500}[data-v-8392b2d7] .bubble.assistant p{margin:0 0 8px}[data-v-8392b2d7] .bubble.assistant p:last-child{margin:0}
@@ -1 +0,0 @@
1
- import{w as Q,o as R,a3 as n,a1 as s,k as i,u as r,a5 as u,Z as d,F as S,a7 as z,G as c,a4 as y,W as T,a9 as V,A as q,c as x,X as f,f as $,Y as o,a2 as A,n as J}from"./vendor-CN0Iv_qZ.js";import{m as H,H as M}from"./markdown-CBnGGMzE.js";/* empty css */import{u as K}from"./chat-BYmuDvol.js";import{_ as D}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as P,G as U,M as W,r as X,v as Y}from"./antd-Dh2t0vGq.js";import"./ws-Dma34ig_.js";const Z={style:{display:"flex",height:"calc(100vh - 56px - 48px)",gap:"16px"}},ee={style:{width:"240px","flex-shrink":"0",background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)",display:"flex","flex-direction":"column",overflow:"hidden"}},te={key:0,style:{padding:"6px 12px 4px","font-size":"11px",color:"#1677ff",background:"rgba(22,119,255,.07)","border-bottom":"1px solid rgba(22,119,255,.15)",display:"flex","align-items":"center",gap:"4px"}},se=["title"],oe={key:1,style:{padding:"6px 12px 4px","font-size":"11px",color:"#722ed1",background:"rgba(114,46,209,.07)","border-bottom":"1px solid rgba(114,46,209,.15)",display:"flex","align-items":"center",gap:"4px"}},ne={style:{padding:"10px 12px","border-bottom":"1px solid var(--border-color)",display:"flex",gap:"8px"}},ae={style:{flex:"1","overflow-y":"auto",padding:"8px"}},le=["onClick"],ie={class:"session-icon"},re={class:"session-info"},de={class:"session-title"},pe={class:"session-meta"},ue={key:0,style:{"text-align":"center",color:"var(--text-muted)",padding:"24px 0","font-size":"13px"}},ce={style:{flex:"1",background:"var(--bg-card)","border-radius":"8px",border:"1px solid var(--border-color)",display:"flex","flex-direction":"column",overflow:"hidden"}},ve={key:0,style:{flex:"1",display:"flex","flex-direction":"column","align-items":"center","justify-content":"center",color:"var(--text-muted)"}},xe={style:{"margin-top":"24px",display:"flex",gap:"12px"}},ge={key:0,class:"tool-msg"},ye={style:{margin:"0","font-size":"11px",color:"#aaa","white-space":"pre-wrap"}},fe={key:0,style:{"margin-top":"8px","padding-top":"8px","border-top":"1px solid var(--border-color)"}},_e={style:{margin:"0","font-size":"11px",color:"#52c41a","white-space":"pre-wrap"}},me={key:1,class:"user-msg"},be={class:"bubble user"},he={key:2,class:"assistant-msg"},ke=["innerHTML"],we={key:0,class:"assistant-msg"},Ce=["innerHTML"],Se={key:1,class:"question-card"},ze={class:"question-text"},Me={key:0,style:{display:"flex","flex-wrap":"wrap",gap:"8px","margin-top":"10px"}},Oe={key:2,style:{padding:"16px","border-top":"1px solid var(--border-color)"}},Ie={style:{display:"flex",gap:"8px","align-items":"flex-end"}},Le={__name:"Chat",setup(Ne){const k=window.__CC_CONFIG__||{},j=x(()=>k.mode==="project");H.setOptions({highlight:(a,e)=>e&&M.getLanguage(e)?M.highlight(a,{language:e}).value:M.highlightAuto(a).value,breaks:!0});const l=K(),_=$(null),g=$(""),p=x(()=>l.currentSessionId),O=x(()=>p.value?l.getMessages(p.value):[]),w=x(()=>{const a=l.streaming[p.value];return a?.active?a.content:null}),m=x(()=>l.pendingQuestion[p.value]),b=x(()=>l.isLoading);function I(a){try{return H(a||"")}catch{return a||""}}async function h(a){await l.createSession(a)}async function L(){if(!g.value.trim()||b.value||!p.value)return;const a=g.value;g.value="",await l.sendMessage(p.value,a)}function N(a){l.answerQuestion(p.value,a)}return Q([O,w],()=>{J(()=>{_.value&&(_.value.scrollTop=_.value.scrollHeight)})},{deep:!0}),R(()=>{l.loadSessions()}),(a,e)=>{const v=f("a-button"),E=f("a-collapse-panel"),F=f("a-collapse"),B=f("a-input-search"),G=f("a-textarea");return o(),n("div",Z,[s("div",ee,[j.value?(o(),n("div",te,[i(r(P)),s("span",{style:{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"},title:r(k).projectRoot},u(r(k).projectName||"项目"),9,se)])):(o(),n("div",oe,[i(r(U)),e[5]||(e[5]=s("span",null,"全局会话",-1))])),s("div",ne,[i(v,{type:"primary",size:"small",style:{flex:"1"},onClick:e[0]||(e[0]=t=>h("chat"))},{icon:d(()=>[i(r(W))]),default:d(()=>[e[6]||(e[6]=c(" Chat ",-1))]),_:1}),i(v,{size:"small",style:{flex:"1"},onClick:e[1]||(e[1]=t=>h("agent"))},{icon:d(()=>[i(r(X))]),default:d(()=>[e[7]||(e[7]=c(" Agent ",-1))]),_:1})]),s("div",ae,[(o(!0),n(S,null,z(r(l).sessions,t=>(o(),n("div",{key:t.id,class:A(["session-item",{active:t.id===r(l).currentSessionId}]),onClick:C=>r(l).switchSession(t.id)},[s("span",ie,u(t.type==="agent"?"🤖":"💬"),1),s("div",re,[s("div",de,u(t.title||"新对话"),1),s("div",pe,u(t.messageCount||0)+" 条消息",1)])],10,le))),128)),r(l).sessions.length?y("",!0):(o(),n("div",ue,[...e[8]||(e[8]=[c(" 点击上方按钮",-1),s("br",null,null,-1),c("开始新对话 ",-1)])]))])]),s("div",ce,[p.value?(o(),n("div",{key:1,style:{flex:"1","overflow-y":"auto",padding:"20px"},ref_key:"messagesEl",ref:_},[(o(!0),n(S,null,z(O.value,(t,C)=>(o(),n("div",{key:C,class:A(["message-row",t.role])},[t.role==="tool"?(o(),n("div",ge,[i(F,{ghost:"",size:"small"},{default:d(()=>[i(E,{header:`🔧 ${t.tool} ${t.status==="running"?"(执行中...)":"✓"}`,style:{border:"1px solid var(--border-color)","border-radius":"6px",background:"var(--bg-card)"}},{default:d(()=>[s("pre",ye,u(JSON.stringify(t.input,null,2)),1),t.result?(o(),n("div",fe,[s("pre",_e,u(typeof t.result=="string"?t.result:JSON.stringify(t.result,null,2)),1)])):y("",!0)]),_:2},1032,["header"])]),_:2},1024)])):t.role==="user"?(o(),n("div",me,[s("div",be,u(t.content),1)])):(o(),n("div",he,[e[14]||(e[14]=s("div",{class:"avatar"},"AI",-1)),s("div",{class:"bubble assistant",innerHTML:I(t.content)},null,8,ke)]))],2))),128)),w.value?(o(),n("div",we,[e[15]||(e[15]=s("div",{class:"avatar"},"AI",-1)),s("div",{class:"bubble assistant streaming",innerHTML:I(w.value)},null,8,Ce)])):y("",!0),m.value?(o(),n("div",Se,[s("div",ze,u(m.value.question),1),m.value.choices?.length?(o(),n("div",Me,[(o(!0),n(S,null,z(m.value.choices,t=>(o(),T(v,{key:t,size:"small",onClick:C=>N(t)},{default:d(()=>[c(u(t),1)]),_:2},1032,["onClick"]))),128))])):(o(),T(B,{key:1,placeholder:"输入回答...","enter-button":"发送",style:{"margin-top":"10px"},onSearch:N}))])):y("",!0)],512)):(o(),n("div",ve,[e[11]||(e[11]=s("div",{style:{"font-size":"48px","margin-bottom":"16px"}},"💬",-1)),e[12]||(e[12]=s("div",{style:{"font-size":"16px","margin-bottom":"8px",color:"#777"}},"开始 AI 对话",-1)),e[13]||(e[13]=s("div",{style:{"font-size":"13px",color:"var(--text-muted)"}},"选择左侧会话或创建新对话",-1)),s("div",xe,[i(v,{type:"primary",onClick:e[2]||(e[2]=t=>h("chat"))},{default:d(()=>[...e[9]||(e[9]=[c("新建 Chat",-1)])]),_:1}),i(v,{style:{},onClick:e[3]||(e[3]=t=>h("agent"))},{default:d(()=>[...e[10]||(e[10]=[c("新建 Agent",-1)])]),_:1})])])),p.value?(o(),n("div",Oe,[s("div",Ie,[i(G,{value:g.value,"onUpdate:value":e[4]||(e[4]=t=>g.value=t),placeholder:b.value?"等待响应中...":"输入消息,Shift+Enter 换行,Enter 发送","auto-size":{minRows:1,maxRows:6},disabled:b.value,style:{background:"var(--bg-card-hover)","border-color":"var(--border-color)",color:"var(--text-primary)",resize:"none",flex:"1"},onKeydown:V(q(L,["exact","prevent"]),["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),i(v,{type:"primary",loading:b.value,onClick:L,style:{height:"40px"}},{icon:d(()=>[i(r(Y))]),_:1},8,["loading"])])])):y("",!0)])])}}},Be=D(Le,[["__scopeId","data-v-8392b2d7"]]);export{Be as default};
@@ -1 +0,0 @@
1
- .cowork-root[data-v-68912dc6]{display:flex;height:calc(100vh - 104px);gap:16px}.template-panel[data-v-68912dc6]{width:280px;flex-shrink:0;background:var(--bg-card);border-radius:8px;border:1px solid var(--border-color);display:flex;flex-direction:column;overflow:hidden}.template-header[data-v-68912dc6]{padding:16px 16px 8px;display:flex;align-items:center;gap:8px;font-size:16px;font-weight:600;color:var(--text-primary)}.header-icon[data-v-68912dc6]{font-size:18px;color:#1677ff}.template-hint[data-v-68912dc6]{padding:0 16px 12px;font-size:12px;color:var(--text-muted);border-bottom:1px solid var(--border-color)}.template-list[data-v-68912dc6]{flex:1;overflow-y:auto;padding:8px}.template-card[data-v-68912dc6]{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border-radius:8px;cursor:pointer;transition:all .15s;margin-bottom:4px;border:1px solid transparent}.template-card[data-v-68912dc6]:hover{background:var(--bg-card-hover)}.template-card.active[data-v-68912dc6]{background:#1677ff14;border-color:#1677ff4d}.template-card.free .card-icon[data-v-68912dc6]{color:#faad14}.card-icon[data-v-68912dc6]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;font-size:16px;color:#1677ff;background:#1677ff14;border-radius:8px;flex-shrink:0;margin-top:2px}.card-name[data-v-68912dc6]{font-size:13px;font-weight:500;color:var(--text-primary)}.card-desc[data-v-68912dc6]{font-size:11px;color:var(--text-muted);margin-top:2px;line-height:1.4}.file-zone[data-v-68912dc6]{padding:12px;border-top:1px solid var(--border-color);text-align:center;transition:background .2s}.file-zone.dragging[data-v-68912dc6]{background:#1677ff14}.drop-icon[data-v-68912dc6]{font-size:20px;color:var(--text-muted)}.drop-text[data-v-68912dc6]{font-size:11px;color:var(--text-muted);margin:4px 0 8px}.file-list[data-v-68912dc6]{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px;justify-content:center}.file-tag[data-v-68912dc6]{max-width:140px;overflow:hidden;text-overflow:ellipsis;font-size:11px}.path-input[data-v-68912dc6]{font-size:11px}.exec-panel[data-v-68912dc6]{flex:1;background:var(--bg-card);border-radius:8px;border:1px solid var(--border-color);display:flex;flex-direction:column;overflow:hidden}.empty-state[data-v-68912dc6],.ready-state[data-v-68912dc6]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 24px}.empty-icon[data-v-68912dc6]{font-size:48px;color:#1677ff40;margin-bottom:16px}.empty-title[data-v-68912dc6]{font-size:16px;color:var(--text-primary);margin-bottom:6px}.empty-sub[data-v-68912dc6]{font-size:13px;color:var(--text-muted);margin-bottom:24px}.ready-header[data-v-68912dc6]{display:flex;align-items:center;gap:10px;margin-bottom:20px}.ready-icon[data-v-68912dc6]{font-size:28px;color:#1677ff}.ready-name[data-v-68912dc6]{font-size:18px;font-weight:600;color:var(--text-primary)}.parallel-toggle[data-v-68912dc6]{display:flex;align-items:center;gap:8px;margin-bottom:16px;padding:8px 14px;background:var(--bg-card-hover);border-radius:8px;border:1px solid var(--border-color)}.parallel-label[data-v-68912dc6]{font-size:13px;color:var(--text-primary)}.agent-count[data-v-68912dc6]{width:60px}.parallel-hint[data-v-68912dc6]{font-size:12px;color:var(--text-muted)}.ready-examples[data-v-68912dc6]{text-align:center}.example-label[data-v-68912dc6]{font-size:13px;color:var(--text-muted);margin-bottom:12px}.example-grid[data-v-68912dc6]{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;max-width:500px}.example-chip[data-v-68912dc6]{padding:6px 14px;border-radius:16px;font-size:12px;color:var(--text-primary);background:var(--bg-card-hover);border:1px solid var(--border-color);cursor:pointer;transition:all .15s}.example-chip[data-v-68912dc6]:hover{border-color:#1677ff;background:#1677ff14;color:#1677ff}.messages-area[data-v-68912dc6]{flex:1;overflow-y:auto;padding:20px}.message-row[data-v-68912dc6]{margin-bottom:16px}.user-msg[data-v-68912dc6]{display:flex;justify-content:flex-end}.assistant-msg[data-v-68912dc6]{display:flex;gap:10px;align-items:flex-start}.avatar[data-v-68912dc6]{width:32px;height:32px;border-radius:50%;background:#1677ff;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;color:var(--text-primary);flex-shrink:0}.bubble[data-v-68912dc6]{padding:10px 14px;border-radius:12px;max-width:80%;line-height:1.6;font-size:14px}.bubble.user[data-v-68912dc6]{background:#1677ff;color:var(--text-primary);border-bottom-right-radius:4px}.bubble.assistant[data-v-68912dc6]{background:var(--bg-card-hover);color:var(--text-primary);border-bottom-left-radius:4px}.bubble.streaming[data-v-68912dc6]:after{content:"○";animation:blink-68912dc6 .7s step-start infinite;color:#1677ff}@keyframes blink-68912dc6{50%{opacity:0}}.tool-msg[data-v-68912dc6]{margin:8px 0}.tool-collapse[data-v-68912dc6]{border:1px solid var(--border-color);border-radius:6px;background:var(--bg-card)}.tool-input[data-v-68912dc6]{margin:0;font-size:11px;color:#aaa;white-space:pre-wrap}.tool-result-box[data-v-68912dc6]{margin-top:8px;padding-top:8px;border-top:1px solid var(--border-color)}.tool-result[data-v-68912dc6]{margin:0;font-size:11px;color:#52c41a;white-space:pre-wrap}.question-card[data-v-68912dc6]{background:var(--bg-card-hover);border:1px solid #1677ff40;border-radius:10px;padding:14px 16px;margin-top:8px}.question-text[data-v-68912dc6]{color:#aaa;font-size:13px}.question-choices[data-v-68912dc6]{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.debate-panel[data-v-68912dc6]{border-top:1px solid var(--border-color);padding:12px 16px;background:var(--bg-card-hover)}.debate-verdict[data-v-68912dc6]{display:flex;align-items:center;gap:12px;margin-bottom:8px;font-size:13px}.consensus[data-v-68912dc6]{color:var(--text-muted);font-size:12px}.review-collapse[data-v-68912dc6]{border-bottom:1px solid var(--border-color)}.review-body[data-v-68912dc6]{font-size:12px;line-height:1.6;color:var(--text-primary);padding:4px 0}.task-stats[data-v-68912dc6]{display:flex;gap:6px;padding:6px 16px;border-top:1px solid var(--border-color);justify-content:flex-end}.input-area[data-v-68912dc6]{padding:12px 16px 16px;border-top:1px solid var(--border-color)}.input-context[data-v-68912dc6]{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px}.context-tag[data-v-68912dc6]{font-size:11px}.context-tag.file[data-v-68912dc6]{background:var(--bg-card-hover)}.input-row[data-v-68912dc6]{display:flex;gap:8px;align-items:flex-end}.msg-input[data-v-68912dc6]{flex:1;background:var(--bg-card-hover);border-color:var(--border-color);color:var(--text-primary);resize:none}.send-btn[data-v-68912dc6]{height:40px}[data-v-68912dc6] .bubble.assistant pre{background:var(--bg-base);border-radius:6px;padding:12px;overflow-x:auto;font-size:12px}[data-v-68912dc6] .bubble.assistant code:not(pre code){background:var(--bg-card-hover);padding:1px 5px;border-radius:3px;font-size:12px;color:#f0a500}[data-v-68912dc6] .bubble.assistant p{margin:0 0 8px}[data-v-68912dc6] .bubble.assistant p:last-child{margin:0}.history-section[data-v-68912dc6]{margin-top:12px;border-top:1px solid var(--border-color);padding-top:8px}.history-header[data-v-68912dc6]{display:flex;align-items:center;gap:6px;font-size:12px;color:#888;cursor:pointer;padding:4px 0}.history-header[data-v-68912dc6]:hover{color:#1677ff}.history-list[data-v-68912dc6]{max-height:200px;overflow-y:auto}.history-item[data-v-68912dc6]{padding:6px 8px;border-radius:6px;margin-bottom:4px;background:var(--bg-card-hover);cursor:default}.history-item.failed[data-v-68912dc6]{border-left:2px solid #ff4d4f}.history-item.completed[data-v-68912dc6]{border-left:2px solid #52c41a}.history-summary[data-v-68912dc6]{font-size:12px;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.history-meta[data-v-68912dc6]{display:flex;justify-content:space-between;font-size:10px;color:#888;margin-top:2px}
@@ -1,7 +0,0 @@
1
- import{V as Tn,w as an,f as w,c as We,o as En,a3 as h,a1 as d,k as D,u as a,F as oe,a7 as ie,a2 as Ne,A as dt,a5 as A,a4 as N,G as U,W as $,a6 as pt,Z as k,a9 as An,X as le,Y as u,n as Vt}from"./vendor-CN0Iv_qZ.js";import{m as Xt,H as ft}from"./markdown-CBnGGMzE.js";/* empty css */import{u as mt}from"./ws-Dma34ig_.js";import{u as _e}from"./chat-BYmuDvol.js";import{_ as vn}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{R as Pe,T as yn,w as jt,H as Sn,S as bn,p as On,G as Rn,s as wn,k as Cn,x as Dn,y as kn,n as Ln,z as Mn,b as In,t as xn,v as Nn}from"./antd-Dh2t0vGq.js";const{entries:on,setPrototypeOf:qt,isFrozen:Pn,getPrototypeOf:Fn,getOwnPropertyDescriptor:Un}=Object;let{freeze:z,seal:q,create:Be}=Object,{apply:vt,construct:yt}=typeof Reflect<"u"&&Reflect;z||(z=function(t){return t});q||(q=function(t){return t});vt||(vt=function(t,c){for(var r=arguments.length,T=new Array(r>2?r-2:0),E=2;E<r;E++)T[E-2]=arguments[E];return t.apply(c,T)});yt||(yt=function(t){for(var c=arguments.length,r=new Array(c>1?c-1:0),T=1;T<c;T++)r[T-1]=arguments[T];return new t(...r)});const Fe=G(Array.prototype.forEach),Hn=G(Array.prototype.lastIndexOf),Kt=G(Array.prototype.pop),Ue=G(Array.prototype.push),zn=G(Array.prototype.splice),Ze=G(String.prototype.toLowerCase),_t=G(String.prototype.toString),gt=G(String.prototype.match),Oe=G(String.prototype.replace),Gn=G(String.prototype.indexOf),Bn=G(String.prototype.trim),Q=G(Object.prototype.hasOwnProperty),H=G(RegExp.prototype.test),He=Wn(TypeError);function G(f){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var c=arguments.length,r=new Array(c>1?c-1:0),T=1;T<c;T++)r[T-1]=arguments[T];return vt(f,t,r)}}function Wn(f){return function(){for(var t=arguments.length,c=new Array(t),r=0;r<t;r++)c[r]=arguments[r];return yt(f,c)}}function _(f,t){let c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Ze;qt&&qt(f,null);let r=t.length;for(;r--;){let T=t[r];if(typeof T=="string"){const E=c(T);E!==T&&(Pn(t)||(t[r]=E),T=E)}f[T]=!0}return f}function Yn(f){for(let t=0;t<f.length;t++)Q(f,t)||(f[t]=null);return f}function ne(f){const t=Be(null);for(const[c,r]of on(f))Q(f,c)&&(Array.isArray(r)?t[c]=Yn(r):r&&typeof r=="object"&&r.constructor===Object?t[c]=ne(r):t[c]=r);return t}function ze(f,t){for(;f!==null;){const r=Un(f,t);if(r){if(r.get)return G(r.get);if(typeof r.value=="function")return G(r.value)}f=Fn(f)}function c(){return null}return c}const Qt=z(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","search","section","select","shadow","slot","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),ht=z(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","enterkeyhint","exportparts","filter","font","g","glyph","glyphref","hkern","image","inputmode","line","lineargradient","marker","mask","metadata","mpath","part","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),Tt=z(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),$n=z(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),Et=z(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),Vn=z(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),Zt=z(["#text"]),Jt=z(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","exportparts","face","for","headers","height","hidden","high","href","hreflang","id","inert","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","part","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","slot","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),At=z(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","mask-type","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),en=z(["accent","accentunder","align","bevelled","close","columnalign","columnlines","columnspacing","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lquote","lspace","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),Qe=z(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),Xn=q(/\{\{[\w\W]*|[\w\W]*\}\}/gm),jn=q(/<%[\w\W]*|[\w\W]*%>/gm),qn=q(/\$\{[\w\W]*/gm),Kn=q(/^data-[\-\w.\u00B7-\uFFFF]+$/),Qn=q(/^aria-[\-\w]+$/),ln=q(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Zn=q(/^(?:\w+script|data):/i),Jn=q(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),rn=q(/^html$/i),es=q(/^[a-z][.\w]*(-[.\w]+)+$/i);var tn=Object.freeze({__proto__:null,ARIA_ATTR:Qn,ATTR_WHITESPACE:Jn,CUSTOM_ELEMENT:es,DATA_ATTR:Kn,DOCTYPE_NAME:rn,ERB_EXPR:jn,IS_ALLOWED_URI:ln,IS_SCRIPT_OR_DATA:Zn,MUSTACHE_EXPR:Xn,TMPLIT_EXPR:qn});const Ge={element:1,text:3,progressingInstruction:7,comment:8,document:9},ts=function(){return typeof window>"u"?null:window},ns=function(t,c){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let r=null;const T="data-tt-policy-suffix";c&&c.hasAttribute(T)&&(r=c.getAttribute(T));const E="dompurify"+(r?"#"+r:"");try{return t.createPolicy(E,{createHTML(F){return F},createScriptURL(F){return F}})}catch{return console.warn("TrustedTypes policy "+E+" could not be created."),null}},nn=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function cn(){let f=arguments.length>0&&arguments[0]!==void 0?arguments[0]:ts();const t=l=>cn(l);if(t.version="3.4.0",t.removed=[],!f||!f.document||f.document.nodeType!==Ge.document||!f.Element)return t.isSupported=!1,t;let{document:c}=f;const r=c,T=r.currentScript,{DocumentFragment:E,HTMLTemplateElement:F,Node:y,Element:W,NodeFilter:V,NamedNodeMap:ge=f.NamedNodeMap||f.MozNamedAttrMap,HTMLFormElement:he,DOMParser:ue,trustedTypes:X}=f,j=W.prototype,Te=ze(j,"cloneNode"),Ee=ze(j,"remove"),Re=ze(j,"nextSibling"),de=ze(j,"childNodes"),se=ze(j,"parentNode");if(typeof F=="function"){const l=c.createElement("template");l.content&&l.content.ownerDocument&&(c=l.content.ownerDocument)}let p,i="";const{implementation:b,createNodeIterator:we,createDocumentFragment:Ce,getElementsByTagName:De}=c,{importNode:Ae}=r;let O=nn();t.isSupported=typeof on=="function"&&typeof se=="function"&&b&&b.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:Z,ERB_EXPR:m,TMPLIT_EXPR:g,DATA_ATTR:s,ARIA_ATTR:M,IS_SCRIPT_OR_DATA:J,ATTR_WHITESPACE:ke,CUSTOM_ELEMENT:un}=tn;let{IS_ALLOWED_URI:St}=tn,L=null;const bt=_({},[...Qt,...ht,...Tt,...Et,...Zt]);let I=null;const Ot=_({},[...Jt,...At,...en,...Qe]);let S=Object.seal(Be(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Le=null,Ye=null;const re=Object.seal(Be(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let Rt=!0,Je=!0,wt=!1,Ct=!0,pe=!1,Me=!0,fe=!1,et=!1,tt=!1,ve=!1,$e=!1,Ve=!1,Dt=!0,kt=!1;const dn="user-content-";let nt=!0,Ie=!1,ye={},ee=null;const st=_({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Lt=null;const Mt=_({},["audio","video","img","source","image","track"]);let at=null;const It=_({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Xe="http://www.w3.org/1998/Math/MathML",je="http://www.w3.org/2000/svg",te="http://www.w3.org/1999/xhtml";let Se=te,ot=!1,it=null;const pn=_({},[Xe,je,te],_t);let qe=_({},["mi","mo","mn","ms","mtext"]),Ke=_({},["annotation-xml"]);const fn=_({},["title","style","font","a","script"]);let xe=null;const mn=["application/xhtml+xml","text/html"],_n="text/html";let C=null,be=null;const gn=c.createElement("form"),xt=function(e){return e instanceof RegExp||e instanceof Function},lt=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(be&&be===e)){if((!e||typeof e!="object")&&(e={}),e=ne(e),xe=mn.indexOf(e.PARSER_MEDIA_TYPE)===-1?_n:e.PARSER_MEDIA_TYPE,C=xe==="application/xhtml+xml"?_t:Ze,L=Q(e,"ALLOWED_TAGS")?_({},e.ALLOWED_TAGS,C):bt,I=Q(e,"ALLOWED_ATTR")?_({},e.ALLOWED_ATTR,C):Ot,it=Q(e,"ALLOWED_NAMESPACES")?_({},e.ALLOWED_NAMESPACES,_t):pn,at=Q(e,"ADD_URI_SAFE_ATTR")?_(ne(It),e.ADD_URI_SAFE_ATTR,C):It,Lt=Q(e,"ADD_DATA_URI_TAGS")?_(ne(Mt),e.ADD_DATA_URI_TAGS,C):Mt,ee=Q(e,"FORBID_CONTENTS")?_({},e.FORBID_CONTENTS,C):st,Le=Q(e,"FORBID_TAGS")?_({},e.FORBID_TAGS,C):ne({}),Ye=Q(e,"FORBID_ATTR")?_({},e.FORBID_ATTR,C):ne({}),ye=Q(e,"USE_PROFILES")?e.USE_PROFILES:!1,Rt=e.ALLOW_ARIA_ATTR!==!1,Je=e.ALLOW_DATA_ATTR!==!1,wt=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Ct=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,pe=e.SAFE_FOR_TEMPLATES||!1,Me=e.SAFE_FOR_XML!==!1,fe=e.WHOLE_DOCUMENT||!1,ve=e.RETURN_DOM||!1,$e=e.RETURN_DOM_FRAGMENT||!1,Ve=e.RETURN_TRUSTED_TYPE||!1,tt=e.FORCE_BODY||!1,Dt=e.SANITIZE_DOM!==!1,kt=e.SANITIZE_NAMED_PROPS||!1,nt=e.KEEP_CONTENT!==!1,Ie=e.IN_PLACE||!1,St=e.ALLOWED_URI_REGEXP||ln,Se=e.NAMESPACE||te,qe=e.MATHML_TEXT_INTEGRATION_POINTS||qe,Ke=e.HTML_INTEGRATION_POINTS||Ke,S=e.CUSTOM_ELEMENT_HANDLING||Be(null),e.CUSTOM_ELEMENT_HANDLING&&xt(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(S.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&xt(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(S.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(S.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),pe&&(Je=!1),$e&&(ve=!0),ye&&(L=_({},Zt),I=Be(null),ye.html===!0&&(_(L,Qt),_(I,Jt)),ye.svg===!0&&(_(L,ht),_(I,At),_(I,Qe)),ye.svgFilters===!0&&(_(L,Tt),_(I,At),_(I,Qe)),ye.mathMl===!0&&(_(L,Et),_(I,en),_(I,Qe))),re.tagCheck=null,re.attributeCheck=null,e.ADD_TAGS&&(typeof e.ADD_TAGS=="function"?re.tagCheck=e.ADD_TAGS:(L===bt&&(L=ne(L)),_(L,e.ADD_TAGS,C))),e.ADD_ATTR&&(typeof e.ADD_ATTR=="function"?re.attributeCheck=e.ADD_ATTR:(I===Ot&&(I=ne(I)),_(I,e.ADD_ATTR,C))),e.ADD_URI_SAFE_ATTR&&_(at,e.ADD_URI_SAFE_ATTR,C),e.FORBID_CONTENTS&&(ee===st&&(ee=ne(ee)),_(ee,e.FORBID_CONTENTS,C)),e.ADD_FORBID_CONTENTS&&(ee===st&&(ee=ne(ee)),_(ee,e.ADD_FORBID_CONTENTS,C)),nt&&(L["#text"]=!0),fe&&_(L,["html","head","body"]),L.table&&(_(L,["tbody"]),delete Le.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!="function")throw He('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw He('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');p=e.TRUSTED_TYPES_POLICY,i=p.createHTML("")}else p===void 0&&(p=ns(X,T)),p!==null&&typeof i=="string"&&(i=p.createHTML(""));z&&z(e),be=e}},Nt=_({},[...ht,...Tt,...$n]),Pt=_({},[...Et,...Vn]),hn=function(e){let n=se(e);(!n||!n.tagName)&&(n={namespaceURI:Se,tagName:"template"});const o=Ze(e.tagName),v=Ze(n.tagName);return it[e.namespaceURI]?e.namespaceURI===je?n.namespaceURI===te?o==="svg":n.namespaceURI===Xe?o==="svg"&&(v==="annotation-xml"||qe[v]):!!Nt[o]:e.namespaceURI===Xe?n.namespaceURI===te?o==="math":n.namespaceURI===je?o==="math"&&Ke[v]:!!Pt[o]:e.namespaceURI===te?n.namespaceURI===je&&!Ke[v]||n.namespaceURI===Xe&&!qe[v]?!1:!Pt[o]&&(fn[o]||!Nt[o]):!!(xe==="application/xhtml+xml"&&it[e.namespaceURI]):!1},K=function(e){Ue(t.removed,{element:e});try{se(e).removeChild(e)}catch{Ee(e)}},me=function(e,n){try{Ue(t.removed,{attribute:n.getAttributeNode(e),from:n})}catch{Ue(t.removed,{attribute:null,from:n})}if(n.removeAttribute(e),e==="is")if(ve||$e)try{K(n)}catch{}else try{n.setAttribute(e,"")}catch{}},Ft=function(e){let n=null,o=null;if(tt)e="<remove></remove>"+e;else{const R=gt(e,/^[\r\n\t ]+/);o=R&&R[0]}xe==="application/xhtml+xml"&&Se===te&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");const v=p?p.createHTML(e):e;if(Se===te)try{n=new ue().parseFromString(v,xe)}catch{}if(!n||!n.documentElement){n=b.createDocument(Se,"template",null);try{n.documentElement.innerHTML=ot?i:v}catch{}}const P=n.body||n.documentElement;return e&&o&&P.insertBefore(c.createTextNode(o),P.childNodes[0]||null),Se===te?De.call(n,fe?"html":"body")[0]:fe?n.documentElement:P},Ut=function(e){return we.call(e.ownerDocument||e,e,V.SHOW_ELEMENT|V.SHOW_COMMENT|V.SHOW_TEXT|V.SHOW_PROCESSING_INSTRUCTION|V.SHOW_CDATA_SECTION,null)},rt=function(e){return e instanceof he&&(typeof e.nodeName!="string"||typeof e.textContent!="string"||typeof e.removeChild!="function"||!(e.attributes instanceof ge)||typeof e.removeAttribute!="function"||typeof e.setAttribute!="function"||typeof e.namespaceURI!="string"||typeof e.insertBefore!="function"||typeof e.hasChildNodes!="function")},ct=function(e){return typeof y=="function"&&e instanceof y};function ae(l,e,n){Fe(l,o=>{o.call(t,e,n,be)})}const Ht=function(e){let n=null;if(ae(O.beforeSanitizeElements,e,null),rt(e))return K(e),!0;const o=C(e.nodeName);if(ae(O.uponSanitizeElement,e,{tagName:o,allowedTags:L}),Me&&e.hasChildNodes()&&!ct(e.firstElementChild)&&H(/<[/\w!]/g,e.innerHTML)&&H(/<[/\w!]/g,e.textContent)||Me&&e.namespaceURI===te&&o==="style"&&ct(e.firstElementChild)||e.nodeType===Ge.progressingInstruction||Me&&e.nodeType===Ge.comment&&H(/<[/\w]/g,e.data))return K(e),!0;if(Le[o]||!(re.tagCheck instanceof Function&&re.tagCheck(o))&&!L[o]){if(!Le[o]&&Gt(o)&&(S.tagNameCheck instanceof RegExp&&H(S.tagNameCheck,o)||S.tagNameCheck instanceof Function&&S.tagNameCheck(o)))return!1;if(nt&&!ee[o]){const v=se(e)||e.parentNode,P=de(e)||e.childNodes;if(P&&v){const R=P.length;for(let B=R-1;B>=0;--B){const Y=Te(P[B],!0);Y.__removalCount=(e.__removalCount||0)+1,v.insertBefore(Y,Re(e))}}}return K(e),!0}return e instanceof W&&!hn(e)||(o==="noscript"||o==="noembed"||o==="noframes")&&H(/<\/no(script|embed|frames)/i,e.innerHTML)?(K(e),!0):(pe&&e.nodeType===Ge.text&&(n=e.textContent,Fe([Z,m,g],v=>{n=Oe(n,v," ")}),e.textContent!==n&&(Ue(t.removed,{element:e.cloneNode()}),e.textContent=n)),ae(O.afterSanitizeElements,e,null),!1)},zt=function(e,n,o){if(Ye[n]||Dt&&(n==="id"||n==="name")&&(o in c||o in gn))return!1;if(!(Je&&!Ye[n]&&H(s,n))){if(!(Rt&&H(M,n))){if(!(re.attributeCheck instanceof Function&&re.attributeCheck(n,e))){if(!I[n]||Ye[n]){if(!(Gt(e)&&(S.tagNameCheck instanceof RegExp&&H(S.tagNameCheck,e)||S.tagNameCheck instanceof Function&&S.tagNameCheck(e))&&(S.attributeNameCheck instanceof RegExp&&H(S.attributeNameCheck,n)||S.attributeNameCheck instanceof Function&&S.attributeNameCheck(n,e))||n==="is"&&S.allowCustomizedBuiltInElements&&(S.tagNameCheck instanceof RegExp&&H(S.tagNameCheck,o)||S.tagNameCheck instanceof Function&&S.tagNameCheck(o))))return!1}else if(!at[n]){if(!H(St,Oe(o,ke,""))){if(!((n==="src"||n==="xlink:href"||n==="href")&&e!=="script"&&Gn(o,"data:")===0&&Lt[e])){if(!(wt&&!H(J,Oe(o,ke,"")))){if(o)return!1}}}}}}}return!0},Gt=function(e){return e!=="annotation-xml"&&gt(e,un)},Bt=function(e){ae(O.beforeSanitizeAttributes,e,null);const{attributes:n}=e;if(!n||rt(e))return;const o={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:I,forceKeepAttr:void 0};let v=n.length;for(;v--;){const P=n[v],{name:R,namespaceURI:B,value:Y}=P,ce=C(R),ut=Y;let x=R==="value"?ut:Bn(ut);if(o.attrName=ce,o.attrValue=x,o.keepAttr=!0,o.forceKeepAttr=void 0,ae(O.uponSanitizeAttribute,e,o),x=o.attrValue,kt&&(ce==="id"||ce==="name")&&(me(R,e),x=dn+x),Me&&H(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,x)){me(R,e);continue}if(ce==="attributename"&&gt(x,"href")){me(R,e);continue}if(o.forceKeepAttr)continue;if(!o.keepAttr){me(R,e);continue}if(!Ct&&H(/\/>/i,x)){me(R,e);continue}pe&&Fe([Z,m,g],$t=>{x=Oe(x,$t," ")});const Yt=C(e.nodeName);if(!zt(Yt,ce,x)){me(R,e);continue}if(p&&typeof X=="object"&&typeof X.getAttributeType=="function"&&!B)switch(X.getAttributeType(Yt,ce)){case"TrustedHTML":{x=p.createHTML(x);break}case"TrustedScriptURL":{x=p.createScriptURL(x);break}}if(x!==ut)try{B?e.setAttributeNS(B,R,x):e.setAttribute(R,x),rt(e)?K(e):Kt(t.removed)}catch{me(R,e)}}ae(O.afterSanitizeAttributes,e,null)},Wt=function(e){let n=null;const o=Ut(e);for(ae(O.beforeSanitizeShadowDOM,e,null);n=o.nextNode();)ae(O.uponSanitizeShadowNode,n,null),Ht(n),Bt(n),n.content instanceof E&&Wt(n.content);ae(O.afterSanitizeShadowDOM,e,null)};return t.sanitize=function(l){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=null,o=null,v=null,P=null;if(ot=!l,ot&&(l="<!-->"),typeof l!="string"&&!ct(l))if(typeof l.toString=="function"){if(l=l.toString(),typeof l!="string")throw He("dirty is not a string, aborting")}else throw He("toString is not a function");if(!t.isSupported)return l;if(et||lt(e),t.removed=[],typeof l=="string"&&(Ie=!1),Ie){if(l.nodeName){const Y=C(l.nodeName);if(!L[Y]||Le[Y])throw He("root node is forbidden and cannot be sanitized in-place")}}else if(l instanceof y)n=Ft("<!---->"),o=n.ownerDocument.importNode(l,!0),o.nodeType===Ge.element&&o.nodeName==="BODY"||o.nodeName==="HTML"?n=o:n.appendChild(o);else{if(!ve&&!pe&&!fe&&l.indexOf("<")===-1)return p&&Ve?p.createHTML(l):l;if(n=Ft(l),!n)return ve?null:Ve?i:""}n&&tt&&K(n.firstChild);const R=Ut(Ie?l:n);for(;v=R.nextNode();)Ht(v),Bt(v),v.content instanceof E&&Wt(v.content);if(Ie)return l;if(ve){if(pe){n.normalize();let Y=n.innerHTML;Fe([Z,m,g],ce=>{Y=Oe(Y,ce," ")}),n.innerHTML=Y}if($e)for(P=Ce.call(n.ownerDocument);n.firstChild;)P.appendChild(n.firstChild);else P=n;return(I.shadowroot||I.shadowrootmode)&&(P=Ae.call(r,P,!0)),P}let B=fe?n.outerHTML:n.innerHTML;return fe&&L["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&H(rn,n.ownerDocument.doctype.name)&&(B="<!DOCTYPE "+n.ownerDocument.doctype.name+`>
2
- `+B),pe&&Fe([Z,m,g],Y=>{B=Oe(B,Y," ")}),p&&Ve?p.createHTML(B):B},t.setConfig=function(){let l=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};lt(l),et=!0},t.clearConfig=function(){be=null,et=!1},t.isValidAttribute=function(l,e,n){be||lt({});const o=C(l),v=C(e);return zt(o,v,n)},t.addHook=function(l,e){typeof e=="function"&&Ue(O[l],e)},t.removeHook=function(l,e){if(e!==void 0){const n=Hn(O[l],e);return n===-1?void 0:zn(O[l],n,1)[0]}return Kt(O[l])},t.removeHooks=function(l){O[l]=[]},t.removeAllHooks=function(){O=nn()},t}var sn=cn();const ss=[{id:"doc-convert",name:"文档格式转换",icon:"FileTextOutlined",category:"document",description:"Word、Markdown、HTML、PDF 之间的格式互转",examples:["把 report.docx 转成 PDF","合并多个 Markdown 为一个文档"],acceptsFiles:!0},{id:"media-process",name:"音视频处理",icon:"PlayCircleOutlined",category:"media",description:"视频压缩、音频提取、格式转换、剪辑",examples:["提取 MP4 的音频","压缩视频到 50MB 以内"],acceptsFiles:!0},{id:"data-analysis",name:"数据分析",icon:"BarChartOutlined",category:"data",description:"CSV/Excel 分析、统计、可视化图表",examples:["分析 sales.csv 的月度趋势"],acceptsFiles:!0},{id:"web-research",name:"信息检索与调研",icon:"SearchOutlined",category:"research",description:"网页抓取、API 调用、多源信息汇总",examples:["调研 AI Agent 框架对比"],acceptsFiles:!1},{id:"image-process",name:"图片处理",icon:"PictureOutlined",category:"media",description:"批量压缩、格式转换、加水印、OCR",examples:["批量压缩到 500KB"],acceptsFiles:!0},{id:"code-helper",name:"代码辅助",icon:"CodeOutlined",category:"development",description:"生成脚本、调试代码、自动化任务",examples:["写一个批量重命名脚本"],acceptsFiles:!0},{id:"system-admin",name:"系统运维",icon:"DesktopOutlined",category:"system",description:"磁盘分析、进程管理、日志分析",examples:["查看磁盘使用情况"],acceptsFiles:!1},{id:"file-organize",name:"文件整理",icon:"FolderOpenOutlined",category:"file",description:"批量重命名、分类整理、查找重复",examples:["按文件类型分类整理"],acceptsFiles:!1},{id:"network-tools",name:"网络工具",icon:"GlobalOutlined",category:"network",description:"API 调试、网页抓取、网络诊断",examples:["测试 API 接口"],acceptsFiles:!1},{id:"learning-assist",name:"学习辅助",icon:"ReadOutlined",category:"learning",description:"文档翻译、内容总结、论文分析",examples:["翻译 PDF 摘要"],acceptsFiles:!0}],as=Tn("cowork",()=>{const f=w(ss),t=w(null),c=w([]),r=w(!1),T=w([]),E=w([]),F=w(null),y=w(null),W=w(null),V=w([]),ge=w(!1),he=w(3),ue=w(!1),X=w([]),j=_e();an(()=>j.isLoading,m=>{!m&&y.value&&(r.value=!1)});function Te(m){t.value=m,Ee()}function Ee(){T.value=[],E.value=[],F.value=null,r.value=!1,y.value=null,W.value=null}function Re(m){c.value.includes(m)||c.value.push(m)}function de(m){c.value=c.value.filter(g=>g!==m)}async function se(){const m=mt();try{await m.waitConnected(5e3);const g=await m.sendRaw({type:"cowork-templates"},1e4);g?.templates?.length&&(f.value=g.templates)}catch{}}async function p(){const m=mt();try{await m.waitConnected(5e3);const g=await m.sendRaw({type:"cowork-history",limit:50},1e4);g?.entries&&(V.value=g.entries)}catch{}}async function i(m){W.value={mode:"session",message:m},r.value=!0;const g=t.value;let s="";g&&(s=`## 当前任务类型: ${g.name}
3
- ${g.description||""}`);let M=m;c.value.length&&(M+=`
4
-
5
- [用户提供的文件: ${c.value.join(", ")}]`),E.value.push({role:"user",content:m,timestamp:Date.now()});const J={systemPromptExtension:s};g?.shellPolicyOverrides&&(J.shellPolicyOverrides=g.shellPolicyOverrides);const ke=await j.createSession("agent",J);y.value=ke,await j.sendMessage(ke,M)}async function b(m){W.value={mode:"direct",message:m};const g=mt();r.value=!0,E.value.push({role:"user",content:m,timestamp:Date.now()});try{await g.waitConnected(8e3);const s={type:"cowork-task",templateId:t.value?.id||null,userMessage:m,files:c.value};ge.value&&(s.parallel=!0,s.agents=he.value);const M=t.value;(ue.value||M?.mode==="debate")&&(s.mode="debate",X.value.length&&(s.perspectives=X.value));const J=await g.sendRaw(s,3e5);E.value.push({role:"assistant",content:J.summary||"(No output)",timestamp:Date.now(),toolsUsed:J.toolsUsed||[],iterationCount:J.iterationCount||0}),F.value=J}catch(s){E.value.push({role:"assistant",content:`Error: ${s.message}`,timestamp:Date.now()})}finally{r.value=!1}}const we=We(()=>y.value?_e().getMessages(y.value):[]),Ce=We(()=>{if(!y.value)return null;const g=_e().streaming[y.value];return g?.active?g.content:null}),De=We(()=>y.value&&_e().pendingQuestion[y.value]||null);function Ae(m){if(!y.value)return;_e().answerQuestion(y.value,m)}async function O(){if(!W.value)return;const{mode:m,message:g}=W.value;m==="direct"?await b(g):await i(g)}async function Z(m){if(!y.value)return;const g=_e();E.value.push({role:"user",content:m,timestamp:Date.now()});let s=m;c.value.length&&(s+=`
6
-
7
- [用户提供的文件: ${c.value.join(", ")}]`),await g.sendMessage(y.value,s)}return{selectedTemplate:t,files:c,isRunning:r,steps:T,messages:E,result:F,agentSessionId:y,currentAgentMessages:we,currentStreaming:Ce,currentQuestion:De,selectTemplate:Te,reset:Ee,addFile:Re,removeFile:de,execute:i,executeDirectWs:b,sendFollowUp:Z,answerQuestion:Ae,loadTemplates:se,templates:f,lastRequest:W,retry:O,history:V,loadHistory:p,parallelMode:ge,parallelAgents:he,debateMode:ue,debatePerspectives:X}}),os={class:"cowork-root"},is={class:"template-panel"},ls={class:"template-header"},rs={class:"template-list"},cs=["onClick"],us={class:"card-icon"},ds={class:"card-body"},ps={class:"card-name"},fs={class:"card-desc"},ms={class:"card-icon"},_s={class:"drop-text"},gs={key:0,class:"file-list"},hs={key:1,class:"history-section"},Ts={key:0,class:"history-list"},Es={class:"history-summary"},As={class:"history-meta"},vs={class:"exec-panel"},ys={key:0,class:"empty-state"},Ss={class:"empty-icon"},bs={class:"example-grid"},Os=["onClick"],Rs={key:1,class:"ready-state"},ws={class:"ready-header"},Cs={class:"ready-name"},Ds={key:0,class:"parallel-toggle"},ks={key:1,class:"parallel-hint"},Ls={class:"ready-examples"},Ms=["onClick"],Is={key:0,class:"tool-msg"},xs={class:"tool-input"},Ns={key:0,class:"tool-result-box"},Ps={class:"tool-result"},Fs={key:1,class:"user-msg"},Us={class:"bubble user"},Hs={key:2,class:"assistant-msg"},zs=["innerHTML"],Gs={key:0,class:"assistant-msg"},Bs=["innerHTML"],Ws={key:1,class:"question-card"},Ys={class:"question-text"},$s={key:0,class:"question-choices"},Vs={key:3,class:"debate-panel"},Xs={class:"debate-verdict"},js={class:"consensus"},qs=["innerHTML"],Ks={key:4,class:"task-stats"},Qs={class:"input-area"},Zs={key:0,class:"input-context"},Js={class:"input-row"},ea={__name:"Cowork",setup(f){Xt.setOptions({highlight:(p,i)=>i&&ft.getLanguage(i)?ft.highlight(p,{language:i}).value:ft.highlightAuto(p).value,breaks:!0});const t=as(),c=_e(),r=w(""),T=w(null),E=w(!1),F=w(""),y=w(!1),W=w(!1),V={FileTextOutlined:In,PlayCircleOutlined:Mn,BarChartOutlined:Ln,SearchOutlined:kn,PictureOutlined:Dn,CodeOutlined:Cn,DesktopOutlined:wn,FolderOpenOutlined:jt,GlobalOutlined:Rn,ReadOutlined:On,SafetyCertificateOutlined:bn},ge=["把 report.docx 转成 PDF","压缩视频到 50MB","分析 CSV 生成图表","查询今天的汇率","批量压缩图片","写一个自动化脚本"],he=We(()=>c.isLoading?"等待响应中...":t.selectedTemplate?t.selectedTemplate.examples?.[0]||"描述你的需求...":"描述你想完成的任务,Agent 会帮你搞定"),ue=We(()=>t.currentAgentMessages);function X(p){try{return sn.sanitize(Xt(p||""))}catch{return sn.sanitize(p||"")}}function j(p){return p==="APPROVE"?"green":p==="REJECT"?"red":p==="ERROR"?"default":"orange"}function Te(p){return p.split(/[\\/]/).pop()||p}function Ee(p){E.value=!1;const i=p.dataTransfer?.files;if(i)for(const b of i)t.addFile(b.path||b.name)}function Re(){const p=F.value.trim();p&&(t.addFile(p),F.value="")}async function de(){const p=r.value.trim();!p||c.isLoading||(r.value="",t.agentSessionId?await t.sendFollowUp(p):await t.execute(p))}function se(p){r.value=p,Vt(()=>de())}return an([ue,()=>t.currentStreaming],()=>{Vt(()=>{T.value&&(T.value.scrollTop=T.value.scrollHeight)})},{deep:!0}),En(()=>{c.loadSessions(),t.loadTemplates(),t.loadHistory()}),(p,i)=>{const b=le("a-tag"),we=le("a-input"),Ce=le("a-switch"),De=le("a-input-number"),Ae=le("a-collapse-panel"),O=le("a-collapse"),Z=le("a-button"),m=le("a-input-search"),g=le("a-textarea");return u(),h("div",os,[d("div",is,[d("div",ls,[D(a(Pe),{class:"header-icon"}),i[9]||(i[9]=d("span",{class:"header-title"},"日常协作",-1))]),i[11]||(i[11]=d("div",{class:"template-hint"},"选择任务类型,或直接输入需求",-1)),d("div",rs,[(u(!0),h(oe,null,ie(a(t).templates,s=>(u(),h("div",{key:s.id,class:Ne(["template-card",{active:a(t).selectedTemplate?.id===s.id}]),onClick:M=>a(t).selectTemplate(s)},[d("div",us,[(u(),$(pt(V[s.icon]||a(Pe))))]),d("div",ds,[d("div",ps,A(s.name),1),d("div",fs,A(s.description),1)])],10,cs))),128)),d("div",{class:Ne(["template-card free",{active:a(t).selectedTemplate===null&&y.value}]),onClick:i[0]||(i[0]=s=>{a(t).selectTemplate(null),y.value=!0})},[d("div",ms,[D(a(yn))]),i[10]||(i[10]=d("div",{class:"card-body"},[d("div",{class:"card-name"},"自由提问"),d("div",{class:"card-desc"},"任意任务,Agent 自主完成")],-1))],2)]),a(t).selectedTemplate?.acceptsFiles!==!1?(u(),h("div",{key:0,class:Ne(["file-zone",{dragging:E.value}]),onDragover:i[2]||(i[2]=dt(s=>E.value=!0,["prevent"])),onDragleave:i[3]||(i[3]=s=>E.value=!1),onDrop:dt(Ee,["prevent"])},[D(a(jt),{class:"drop-icon"}),d("div",_s,A(E.value?"松开以添加文件":"拖拽文件到此处"),1),a(t).files.length?(u(),h("div",gs,[(u(!0),h(oe,null,ie(a(t).files,s=>(u(),$(b,{key:s,closable:"",onClose:M=>a(t).removeFile(s),class:"file-tag"},{default:k(()=>[U(A(Te(s)),1)]),_:2},1032,["onClose"]))),128))])):N("",!0),D(we,{value:F.value,"onUpdate:value":i[1]||(i[1]=s=>F.value=s),placeholder:"或输入文件路径,按 Enter 添加",size:"small",class:"path-input",onPressEnter:Re},null,8,["value"])],34)):N("",!0),a(t).history.length?(u(),h("div",hs,[d("div",{class:"history-header",onClick:i[4]||(i[4]=s=>W.value=!W.value)},[D(a(Sn)),U(" 历史记录 ("+A(a(t).history.length)+") ",1)]),W.value?(u(),h("div",Ts,[(u(!0),h(oe,null,ie(a(t).history.slice().reverse().slice(0,20),(s,M)=>(u(),h("div",{key:M,class:Ne(["history-item",s.status])},[d("div",Es,A(s.userMessage),1),d("div",As,[d("span",null,A(s.templateName||"自由模式"),1),d("span",null,A(s.status),1)])],2))),128))])):N("",!0)])):N("",!0)]),d("div",vs,[!a(t).agentSessionId&&!a(t).selectedTemplate?(u(),h("div",ys,[d("div",Ss,[D(a(Pe))]),i[12]||(i[12]=d("div",{class:"empty-title"},"选择一个任务模板开始",-1)),i[13]||(i[13]=d("div",{class:"empty-sub"},"或选择「自由提问」处理任何问题",-1)),d("div",bs,[(u(),h(oe,null,ie(ge,s=>d("div",{key:s,class:"example-chip",onClick:M=>se(s)},A(s),9,Os)),64))])])):a(t).selectedTemplate&&!a(t).agentSessionId?(u(),h("div",Rs,[d("div",ws,[(u(),$(pt(V[a(t).selectedTemplate.icon]||a(Pe)),{class:"ready-icon"})),d("span",Cs,A(a(t).selectedTemplate.name),1)]),a(t).selectedTemplate.parallelStrategy&&a(t).selectedTemplate.parallelStrategy!=="none"?(u(),h("div",Ds,[D(Ce,{checked:a(t).parallelMode,"onUpdate:checked":i[5]||(i[5]=s=>a(t).parallelMode=s),size:"small"},null,8,["checked"]),i[14]||(i[14]=d("span",{class:"parallel-label"},"多 Agent 并行",-1)),a(t).parallelMode?(u(),$(De,{key:0,value:a(t).parallelAgents,"onUpdate:value":i[6]||(i[6]=s=>a(t).parallelAgents=s),min:2,max:10,size:"small",class:"agent-count"},null,8,["value"])):N("",!0),a(t).parallelMode?(u(),h("span",ks,"个 Agent")):N("",!0)])):N("",!0),d("div",Ls,[i[15]||(i[15]=d("div",{class:"example-label"},"试试这些:",-1)),(u(!0),h(oe,null,ie(a(t).selectedTemplate.examples,s=>(u(),h("div",{key:s,class:"example-chip",onClick:M=>se(s)},A(s),9,Ms))),128))])])):(u(),h("div",{key:2,class:"messages-area",ref_key:"messagesEl",ref:T},[(u(!0),h(oe,null,ie(ue.value,(s,M)=>(u(),h("div",{key:M,class:Ne(["message-row",s.role])},[s.role==="tool"?(u(),h("div",Is,[D(O,{ghost:"",size:"small"},{default:k(()=>[D(Ae,{class:"tool-collapse"},{header:k(()=>[D(a(xn)),U(" "+A(s.tool)+" "+A(s.status==="running"?"(执行中...)":"✓"),1)]),default:k(()=>[d("pre",xs,A(JSON.stringify(s.input,null,2)),1),s.result?(u(),h("div",Ns,[d("pre",Ps,A(typeof s.result=="string"?s.result:JSON.stringify(s.result,null,2)),1)])):N("",!0)]),_:2},1024)]),_:2},1024)])):s.role==="user"?(u(),h("div",Fs,[d("div",Us,A(s.content),1)])):(u(),h("div",Hs,[i[17]||(i[17]=d("div",{class:"avatar"},"AI",-1)),d("div",{class:"bubble assistant",innerHTML:X(s.content)},null,8,zs),s.content?.startsWith("Error:")&&!a(t).isRunning&&a(t).lastRequest?(u(),$(Z,{key:0,size:"small",type:"link",onClick:i[7]||(i[7]=J=>a(t).retry())},{default:k(()=>[...i[16]||(i[16]=[U(" 重试 ",-1)])]),_:1})):N("",!0)]))],2))),128)),a(t).currentStreaming?(u(),h("div",Gs,[i[18]||(i[18]=d("div",{class:"avatar"},"AI",-1)),d("div",{class:"bubble assistant streaming",innerHTML:X(a(t).currentStreaming)},null,8,Bs)])):N("",!0),a(t).currentQuestion?(u(),h("div",Ws,[d("div",Ys,A(a(t).currentQuestion.question),1),a(t).currentQuestion.choices?.length?(u(),h("div",$s,[(u(!0),h(oe,null,ie(a(t).currentQuestion.choices,s=>(u(),$(Z,{key:s,size:"small",onClick:M=>a(t).answerQuestion(s)},{default:k(()=>[U(A(s),1)]),_:2},1032,["onClick"]))),128))])):(u(),$(m,{key:1,placeholder:"输入回答...","enter-button":"发送",style:{"margin-top":"10px"},onSearch:a(t).answerQuestion},null,8,["onSearch"]))])):N("",!0)],512)),a(t).result?.mode==="debate"&&!a(t).isRunning?(u(),h("div",Vs,[d("div",Xs,[D(b,{color:j(a(t).result.verdict)},{default:k(()=>[U(A(a(t).result.verdict),1)]),_:1},8,["color"]),d("span",js,"共识 "+A(a(t).result.consensusScore||0)+"/100",1)]),D(O,{ghost:"",size:"small"},{default:k(()=>[(u(!0),h(oe,null,ie(a(t).result.reviews||[],(s,M)=>(u(),$(Ae,{key:M,class:"review-collapse"},{header:k(()=>[D(b,{color:j(s.verdict)},{default:k(()=>[U(A(s.verdict),1)]),_:2},1032,["color"]),U(" "+A(s.role),1)]),default:k(()=>[d("div",{class:"review-body",innerHTML:X(s.review)},null,8,qs)]),_:2},1024))),128))]),_:1})])):N("",!0),a(t).result&&!a(t).isRunning?(u(),h("div",Ks,[a(t).result.mode==="debate"?(u(),$(b,{key:0,color:"magenta"},{default:k(()=>[...i[19]||(i[19]=[U("debate",-1)])]),_:1})):N("",!0),a(t).result.parallel?(u(),$(b,{key:1,color:"purple"},{default:k(()=>[U(A(a(t).result.subtaskCount||0)+" subtasks",1)]),_:1})):N("",!0),D(b,{color:"geekblue"},{default:k(()=>[U(A(a(t).result.iterationCount||0)+" iterations",1)]),_:1}),D(b,{color:"cyan"},{default:k(()=>[U("~"+A((a(t).result.tokenCount||0).toLocaleString())+" tokens",1)]),_:1}),a(t).result.toolsUsed?.length?(u(),$(b,{key:2,color:"green"},{default:k(()=>[U(A(a(t).result.toolsUsed.length)+" tools",1)]),_:1})):N("",!0)])):N("",!0),d("div",Qs,[a(t).selectedTemplate?(u(),h("div",Zs,[D(b,{color:"blue",class:"context-tag"},{default:k(()=>[(u(),$(pt(V[a(t).selectedTemplate.icon]||a(Pe)))),U(" "+A(a(t).selectedTemplate.name),1)]),_:1}),(u(!0),h(oe,null,ie(a(t).files,s=>(u(),$(b,{key:s,class:"context-tag file"},{default:k(()=>[U(A(Te(s)),1)]),_:2},1024))),128))])):N("",!0),d("div",Js,[D(g,{value:r.value,"onUpdate:value":i[8]||(i[8]=s=>r.value=s),placeholder:he.value,"auto-size":{minRows:1,maxRows:6},disabled:a(c).isLoading,class:"msg-input",onKeydown:An(dt(de,["exact","prevent"]),["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),D(Z,{type:"primary",loading:a(c).isLoading,class:"send-btn",onClick:de},{icon:k(()=>[D(a(Nn))]),_:1},8,["loading"])])])])])}}},ra=vn(ea,[["__scopeId","data-v-68912dc6"]]);export{ra as default};
@@ -1,2 +0,0 @@
1
- import{u as ee}from"./ws-Dma34ig_.js";import{_ as te}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{q as ae,Z as oe,f as P,_ as T,$ as le,N as v}from"./antd-Dh2t0vGq.js";import{a3 as W,a1 as s,k as a,Z as t,f as l,X as u,Y as p,G as i,u as g,W as m,a5 as V,a4 as b}from"./vendor-CN0Iv_qZ.js";const se={key:0,style:{"margin-bottom":"16px"}},ne={style:{"white-space":"pre-wrap","word-break":"break-all",color:"var(--text-primary)","font-family":"'Cascadia Code', 'Fira Code', Consolas, monospace","font-size":"13px","line-height":"1.7",margin:"0"}},re={style:{display:"flex",gap:"12px","align-items":"flex-end","flex-wrap":"wrap"}},ie={style:{flex:"1","min-width":"200px"}},ue={style:{"min-width":"140px"}},de={style:{display:"flex",gap:"12px","align-items":"flex-end","flex-wrap":"wrap"}},pe={style:{flex:"1","min-width":"200px"}},ce={style:{"white-space":"pre-wrap","word-break":"break-all",color:"var(--text-primary)","font-family":"'Cascadia Code', 'Fira Code', Consolas, monospace","font-size":"13px","line-height":"1.7",margin:"0"}},ve={__name:"Git",setup(me){const G=ee(),D=l("git"),L=l(!1),w=l(""),h=l(""),C=l(0),B=l(!1),x=l(""),O=l(!1),E=l(!1),M=l(""),$=l("markdown"),z=l(!1),S=l("./site"),A=l(!1),c=l(""),_=l(!1),k=l("");function Z(o){const e=o.split(`
2
- `);let n="",r=0;for(const f of e){const y=f.match(/On branch\s+(.+)/)||f.match(/分支\s+(.+)/);y&&(n=y[1].trim());const U=f.trim();/^(M|A|D|R|C|U|\?\?|MM|AM|AD)\s/.test(U)&&r++,/^(modified|new file|deleted|renamed):/i.test(U)&&r++}return{branch:n,changed:r}}async function F(){L.value=!0;try{const{output:o}=await G.execute("git status",15e3);w.value=o;const e=Z(o);h.value=e.branch,C.value=e.changed}catch(o){v.error("获取 Git 状态失败: "+o.message),w.value=""}finally{L.value=!1}}function j(){E.value=!0}async function q(){E.value=!1,B.value=!0,x.value="";try{const{output:o}=await G.execute("git auto-commit",3e4);x.value=o,O.value=!o.includes("✖")&&!o.toLowerCase().includes("error"),O.value&&v.success("自动提交完成"),await F()}catch(o){x.value="提交失败: "+o.message,O.value=!1,v.error("自动提交失败")}finally{B.value=!1}}async function X(){const o=M.value.trim();if(!o){v.warning("请输入文件路径");return}z.value=!0,c.value="",k.value="";try{const e=`import ${$.value} ${o}`,{output:n}=await G.execute(e,6e4);k.value=n;const r=n.includes("✖")||n.toLowerCase().includes("error");_.value=!r,c.value=r?"导入过程中可能存在问题,请查看输出":"导入完成",r||v.success("导入成功")}catch(e){c.value="导入失败: "+e.message,_.value=!1,v.error("导入失败")}finally{z.value=!1}}async function Y(){const o=S.value.trim();if(!o){v.warning("请输入输出路径");return}A.value=!0,c.value="",k.value="";try{const e=`export site -o ${o}`,{output:n}=await G.execute(e,6e4);k.value=n;const r=n.includes("✖")||n.toLowerCase().includes("error");_.value=!r,c.value=r?"导出过程中可能存在问题,请查看输出":"导出完成",r||v.success("导出成功")}catch(e){c.value="导出失败: "+e.message,_.value=!1,v.error("导出失败")}finally{A.value=!1}}return(o,e)=>{const n=u("a-button"),r=u("a-space"),f=u("a-tag"),y=u("a-card"),U=u("a-empty"),R=u("a-alert"),I=u("a-tab-pane"),K=u("a-input"),N=u("a-select-option"),H=u("a-select"),J=u("a-tabs"),Q=u("a-modal");return p(),W("div",null,[e[21]||(e[21]=s("div",{style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},[s("div",null,[s("h2",{class:"page-title"},"Git 与数据"),s("p",{class:"page-sub"},"版本控制 / 导入导出")])],-1)),a(J,{activeKey:D.value,"onUpdate:activeKey":e[5]||(e[5]=d=>D.value=d),type:"card"},{default:t(()=>[a(I,{key:"git"},{tab:t(()=>[a(g(P)),e[7]||(e[7]=i(" Git 仓库 ",-1))]),default:t(()=>[a(r,{style:{"margin-bottom":"16px"}},{default:t(()=>[a(n,{type:"primary",loading:L.value,onClick:F},{icon:t(()=>[a(g(ae))]),default:t(()=>[e[8]||(e[8]=i(" 刷新状态 ",-1))]),_:1},8,["loading"]),a(n,{loading:B.value,onClick:j},{icon:t(()=>[a(g(oe))]),default:t(()=>[e[9]||(e[9]=i(" 自动提交 ",-1))]),_:1},8,["loading"])]),_:1}),h.value||C.value>0?(p(),W("div",se,[a(r,null,{default:t(()=>[h.value?(p(),m(f,{key:0,color:"blue"},{default:t(()=>[a(g(P)),i(" "+V(h.value),1)]),_:1})):b("",!0),C.value>0?(p(),m(f,{key:1,color:"orange"},{default:t(()=>[i(V(C.value)+" 个文件变更",1)]),_:1})):w.value&&C.value===0?(p(),m(f,{key:2,color:"green"},{default:t(()=>[...e[10]||(e[10]=[i("工作区干净",-1)])]),_:1})):b("",!0)]),_:1})])):b("",!0),w.value?(p(),m(y,{key:1,bordered:!1,style:{background:"var(--bg-base)",border:"1px solid var(--border-color)"}},{default:t(()=>[s("pre",ne,V(w.value),1)]),_:1})):L.value?b("",!0):(p(),m(U,{key:2,description:"点击刷新状态查看 Git 信息",style:{padding:"60px 0"}})),x.value?(p(),m(R,{key:3,message:O.value?"提交成功":"提交结果",description:x.value,type:O.value?"success":"info","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[0]||(e[0]=d=>x.value="")},null,8,["message","description","type"])):b("",!0)]),_:1}),a(I,{key:"io"},{tab:t(()=>[a(g(T)),e[11]||(e[11]=i(" 导入导出 ",-1))]),default:t(()=>[a(y,{title:"导入数据",bordered:!1,style:{background:"var(--bg-card)",border:"1px solid var(--border-color)","margin-bottom":"16px"}},{default:t(()=>[s("div",re,[s("div",ie,[e[12]||(e[12]=s("label",{style:{display:"block","margin-bottom":"6px",color:"var(--text-secondary)","font-size":"13px"}},"文件路径",-1)),a(K,{value:M.value,"onUpdate:value":e[1]||(e[1]=d=>M.value=d),placeholder:"输入文件或目录路径,如 ./docs","allow-clear":""},null,8,["value"])]),s("div",ue,[e[16]||(e[16]=s("label",{style:{display:"block","margin-bottom":"6px",color:"var(--text-secondary)","font-size":"13px"}},"格式",-1)),a(H,{value:$.value,"onUpdate:value":e[2]||(e[2]=d=>$.value=d),style:{width:"140px"}},{default:t(()=>[a(N,{value:"markdown"},{default:t(()=>[...e[13]||(e[13]=[i("Markdown",-1)])]),_:1}),a(N,{value:"pdf"},{default:t(()=>[...e[14]||(e[14]=[i("PDF",-1)])]),_:1}),a(N,{value:"evernote"},{default:t(()=>[...e[15]||(e[15]=[i("Evernote",-1)])]),_:1})]),_:1},8,["value"])]),a(n,{type:"primary",loading:z.value,disabled:!M.value.trim(),onClick:X},{icon:t(()=>[a(g(T))]),default:t(()=>[e[17]||(e[17]=i(" 导入 ",-1))]),_:1},8,["loading","disabled"])])]),_:1}),a(y,{title:"导出站点",bordered:!1,style:{background:"var(--bg-card)",border:"1px solid var(--border-color)","margin-bottom":"16px"}},{default:t(()=>[s("div",de,[s("div",pe,[e[18]||(e[18]=s("label",{style:{display:"block","margin-bottom":"6px",color:"var(--text-secondary)","font-size":"13px"}},"输出路径",-1)),a(K,{value:S.value,"onUpdate:value":e[3]||(e[3]=d=>S.value=d),placeholder:"输出目录,如 ./site","allow-clear":""},null,8,["value"])]),a(n,{type:"primary",loading:A.value,disabled:!S.value.trim(),onClick:Y},{icon:t(()=>[a(g(le))]),default:t(()=>[e[19]||(e[19]=i(" 导出为静态站点 ",-1))]),_:1},8,["loading","disabled"])])]),_:1}),c.value?(p(),m(R,{key:0,message:_.value?"操作成功":"操作结果",description:c.value,type:_.value?"success":"info","show-icon":"",closable:"",style:{"margin-top":"16px"},onClose:e[4]||(e[4]=d=>c.value="")},null,8,["message","description","type"])):b("",!0),k.value?(p(),m(y,{key:1,title:"命令输出",bordered:!1,style:{background:"var(--bg-base)",border:"1px solid var(--border-color)","margin-top":"16px"}},{default:t(()=>[s("pre",ce,V(k.value),1)]),_:1})):b("",!0)]),_:1})]),_:1},8,["activeKey"]),a(Q,{open:E.value,"onUpdate:open":e[6]||(e[6]=d=>E.value=d),title:"确认自动提交","ok-text":"确认提交","cancel-text":"取消","confirm-loading":B.value,onOk:q},{default:t(()=>[...e[20]||(e[20]=[s("p",{style:{color:"var(--text-secondary)"}},[i(" 将执行 "),s("code",null,"git auto-commit"),i(" 自动提交当前所有变更。请确认工作区文件已准备就绪。 ")],-1)])]),_:1},8,["open","confirm-loading"])])}}},xe=te(ve,[["__scopeId","data-v-1f28d00c"]]);export{xe as default};