chainlesschain 0.45.9 → 0.45.11

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 (55) hide show
  1. package/bin/chainlesschain.js +0 -0
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/assets/AppLayout-19ZC8w11.js +1 -0
  4. package/src/assets/web-panel/assets/AppLayout-CjgO-ML6.css +1 -0
  5. package/src/assets/web-panel/assets/Chat-5f__rMCR.js +1 -0
  6. package/src/assets/web-panel/assets/Chat-DB46afPg.css +1 -0
  7. package/src/assets/web-panel/assets/Cron-C4mrNC4c.js +2 -0
  8. package/src/assets/web-panel/assets/Dashboard-CRFnDUFh.css +1 -0
  9. package/src/assets/web-panel/assets/Dashboard-DsjXpZor.js +3 -0
  10. package/src/assets/web-panel/assets/Logs-CC_Zuh66.js +2 -0
  11. package/src/assets/web-panel/assets/Logs-Gf_Mv9Nx.css +1 -0
  12. package/src/assets/web-panel/assets/McpTools-B15GiN3u.js +4 -0
  13. package/src/assets/web-panel/assets/McpTools-CyhSLDwf.css +1 -0
  14. package/src/assets/web-panel/assets/Memory-DRghrGJr.css +1 -0
  15. package/src/assets/web-panel/assets/Memory-Dbd7oLOH.js +2 -0
  16. package/src/assets/web-panel/assets/Notes-BG69sJKi.css +1 -0
  17. package/src/assets/web-panel/assets/Notes-CEkc49fY.js +2 -0
  18. package/src/assets/web-panel/assets/Providers-Brm-S_hS.css +1 -0
  19. package/src/assets/web-panel/assets/Providers-CjyPHW00.js +1 -0
  20. package/src/assets/web-panel/assets/Services-C8Qs6KXv.css +1 -0
  21. package/src/assets/web-panel/assets/Services-XFzHMRRd.js +2 -0
  22. package/src/assets/web-panel/assets/Skills-BdjRyorN.css +1 -0
  23. package/src/assets/web-panel/assets/Skills-D8oxmB3U.js +1 -0
  24. package/src/assets/web-panel/assets/{antd-BhDHu4KM.js → antd-ChLPLhSn.js} +89 -89
  25. package/src/assets/web-panel/assets/chat-C_hu-qNs.js +1 -0
  26. package/src/assets/web-panel/assets/index-CyGyEIVX.css +1 -0
  27. package/src/assets/web-panel/assets/index-DQ5xXK7O.js +2 -0
  28. package/src/assets/web-panel/assets/{markdown-CNQE8HeM.js → markdown-DtbPhnFe.js} +1 -1
  29. package/src/assets/web-panel/assets/parsers-DftYMnlk.js +3 -0
  30. package/src/assets/web-panel/assets/vendor-CN0Iv_qZ.js +1 -0
  31. package/src/assets/web-panel/assets/ws-DwluTqT5.js +1 -0
  32. package/src/assets/web-panel/index.html +4 -4
  33. package/src/commands/config.js +44 -0
  34. package/src/constants.js +1 -0
  35. package/src/lib/background-task-manager.js +305 -0
  36. package/src/lib/background-task-worker.js +50 -0
  37. package/src/lib/feature-flags.js +182 -0
  38. package/src/lib/jsonl-session-store.js +237 -0
  39. package/src/lib/prompt-compressor.js +351 -0
  40. package/src/lib/worktree-isolator.js +231 -0
  41. package/src/repl/agent-repl.js +38 -2
  42. package/src/assets/web-panel/assets/AppLayout-CZDQcPAA.css +0 -1
  43. package/src/assets/web-panel/assets/AppLayout-D-KJRC1s.js +0 -1
  44. package/src/assets/web-panel/assets/Chat-BsgVc34I.js +0 -1
  45. package/src/assets/web-panel/assets/Chat-V-g0UHcr.css +0 -1
  46. package/src/assets/web-panel/assets/Dashboard-Bmgu7fEn.js +0 -2
  47. package/src/assets/web-panel/assets/Providers-DlC9S5Nf.js +0 -2
  48. package/src/assets/web-panel/assets/Providers-YRgg8NIn.css +0 -1
  49. package/src/assets/web-panel/assets/Skills--YIq8avF.js +0 -2
  50. package/src/assets/web-panel/assets/Skills-BC4Yu_4f.css +0 -1
  51. package/src/assets/web-panel/assets/chat-_a36nOu_.js +0 -1
  52. package/src/assets/web-panel/assets/index-B6snAd4S.css +0 -1
  53. package/src/assets/web-panel/assets/index-Ze9tR-zc.js +0 -2
  54. package/src/assets/web-panel/assets/vendor-Ks18OpWK.js +0 -1
  55. package/src/assets/web-panel/assets/ws-Bve9vKht.js +0 -1
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Worktree Isolator — git worktree-based task isolation.
3
+ *
4
+ * Creates temporary git worktrees for parallel agent tasks,
5
+ * ensuring file operations don't interfere with the main working tree.
6
+ *
7
+ * Feature-flag gated: WORKTREE_ISOLATION
8
+ */
9
+
10
+ import { execSync } from "node:child_process";
11
+ import { existsSync, rmSync } from "node:fs";
12
+ import { join, resolve } from "node:path";
13
+ import { isGitRepo, gitExec } from "./git-integration.js";
14
+
15
+ const WORKTREE_DIR = ".worktrees";
16
+
17
+ // ── Low-level worktree operations ───────────────────────────────────────
18
+
19
+ /**
20
+ * Create a new git worktree with a new branch.
21
+ * @param {string} repoDir — Root of the git repository
22
+ * @param {string} branchName — Branch name (e.g. "agent/task-123")
23
+ * @param {string} [baseBranch] — Base branch (default: HEAD)
24
+ * @returns {{ path: string, branch: string }}
25
+ */
26
+ export function createWorktree(repoDir, branchName, baseBranch) {
27
+ if (!isGitRepo(repoDir)) {
28
+ throw new Error("Not a git repository");
29
+ }
30
+
31
+ const worktreePath = resolve(
32
+ repoDir,
33
+ WORKTREE_DIR,
34
+ branchName.replace(/\//g, "-"),
35
+ );
36
+
37
+ if (existsSync(worktreePath)) {
38
+ throw new Error(`Worktree already exists: ${worktreePath}`);
39
+ }
40
+
41
+ const base = baseBranch || "HEAD";
42
+ gitExec(`worktree add "${worktreePath}" -b "${branchName}" ${base}`, repoDir);
43
+
44
+ return { path: worktreePath, branch: branchName };
45
+ }
46
+
47
+ /**
48
+ * Remove a git worktree and its branch.
49
+ * @param {string} repoDir
50
+ * @param {string} worktreePath — Absolute path to the worktree
51
+ * @param {object} [options]
52
+ * @param {boolean} [options.deleteBranch=true] — Also delete the branch
53
+ */
54
+ export function removeWorktree(repoDir, worktreePath, options = {}) {
55
+ const deleteBranch = options.deleteBranch !== false;
56
+
57
+ // Get branch name before removal
58
+ let branch = null;
59
+ if (deleteBranch) {
60
+ try {
61
+ branch = execSync("git rev-parse --abbrev-ref HEAD", {
62
+ cwd: worktreePath,
63
+ encoding: "utf-8",
64
+ }).trim();
65
+ } catch (_e) {
66
+ // Can't determine branch — skip branch deletion
67
+ }
68
+ }
69
+
70
+ try {
71
+ gitExec(`worktree remove "${worktreePath}" --force`, repoDir);
72
+ } catch (_e) {
73
+ // If git worktree remove fails, try manual cleanup
74
+ if (existsSync(worktreePath)) {
75
+ rmSync(worktreePath, { recursive: true, force: true });
76
+ }
77
+ gitExec("worktree prune", repoDir);
78
+ }
79
+
80
+ // Delete the branch
81
+ if (
82
+ deleteBranch &&
83
+ branch &&
84
+ branch !== "HEAD" &&
85
+ !branch.startsWith("main") &&
86
+ !branch.startsWith("master")
87
+ ) {
88
+ try {
89
+ gitExec(`branch -D "${branch}"`, repoDir);
90
+ } catch (_e) {
91
+ // Branch might already be deleted
92
+ }
93
+ }
94
+ }
95
+
96
+ /**
97
+ * List all worktrees.
98
+ * @param {string} repoDir
99
+ * @returns {Array<{path: string, branch: string, head: string}>}
100
+ */
101
+ export function listWorktrees(repoDir) {
102
+ if (!isGitRepo(repoDir)) return [];
103
+
104
+ try {
105
+ const output = gitExec("worktree list --porcelain", repoDir);
106
+ const worktrees = [];
107
+ let current = {};
108
+
109
+ for (const line of output.split("\n")) {
110
+ if (line.startsWith("worktree ")) {
111
+ if (current.path) worktrees.push(current);
112
+ current = { path: line.slice(9) };
113
+ } else if (line.startsWith("HEAD ")) {
114
+ current.head = line.slice(5);
115
+ } else if (line.startsWith("branch ")) {
116
+ current.branch = line.slice(7).replace("refs/heads/", "");
117
+ } else if (line === "bare") {
118
+ current.bare = true;
119
+ }
120
+ }
121
+ if (current.path) worktrees.push(current);
122
+
123
+ return worktrees;
124
+ } catch (_e) {
125
+ return [];
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Prune stale worktrees (where directory no longer exists).
131
+ * @param {string} repoDir
132
+ * @returns {number} Number pruned
133
+ */
134
+ export function pruneWorktrees(repoDir) {
135
+ if (!isGitRepo(repoDir)) return 0;
136
+
137
+ const before = listWorktrees(repoDir).length;
138
+ gitExec("worktree prune", repoDir);
139
+ const after = listWorktrees(repoDir).length;
140
+ return before - after;
141
+ }
142
+
143
+ // ── High-level isolation API ────────────────────────────────────────────
144
+
145
+ /**
146
+ * Run a function in an isolated git worktree.
147
+ *
148
+ * Creates a worktree → executes fn(worktreePath) → cleans up.
149
+ * If fn throws, the worktree is still cleaned up.
150
+ *
151
+ * @param {string} repoDir — Root of the git repository
152
+ * @param {string} taskId — Used to generate branch name: agent/{taskId}
153
+ * @param {Function} fn — async (worktreePath) => result
154
+ * @returns {Promise<{result, branch, merged}>}
155
+ */
156
+ export async function isolateTask(repoDir, taskId, fn) {
157
+ const branchName = `agent/${taskId}`;
158
+ const { path: worktreePath } = createWorktree(repoDir, branchName);
159
+
160
+ try {
161
+ const result = await fn(worktreePath);
162
+
163
+ // Check if the worktree has any changes
164
+ const hasChanges = _hasUncommittedChanges(worktreePath);
165
+
166
+ return {
167
+ result,
168
+ branch: branchName,
169
+ worktreePath,
170
+ hasChanges,
171
+ };
172
+ } finally {
173
+ // Always clean up the worktree (but keep branch if there are commits)
174
+ try {
175
+ const hasCommits = _hasBranchCommits(repoDir, branchName);
176
+ removeWorktree(repoDir, worktreePath, {
177
+ deleteBranch: !hasCommits,
178
+ });
179
+ } catch (_e) {
180
+ // Best-effort cleanup
181
+ }
182
+ }
183
+ }
184
+
185
+ /**
186
+ * Clean up all agent worktrees (e.g. after crash recovery).
187
+ * @param {string} repoDir
188
+ * @returns {number} Number of worktrees cleaned
189
+ */
190
+ export function cleanupAgentWorktrees(repoDir) {
191
+ const worktrees = listWorktrees(repoDir);
192
+ let cleaned = 0;
193
+
194
+ for (const wt of worktrees) {
195
+ if (wt.branch && wt.branch.startsWith("agent/")) {
196
+ try {
197
+ removeWorktree(repoDir, wt.path, { deleteBranch: true });
198
+ cleaned++;
199
+ } catch (_e) {
200
+ // Skip if can't clean
201
+ }
202
+ }
203
+ }
204
+
205
+ pruneWorktrees(repoDir);
206
+ return cleaned;
207
+ }
208
+
209
+ // ── Internal helpers ────────────────────────────────────────────────────
210
+
211
+ function _hasUncommittedChanges(worktreePath) {
212
+ try {
213
+ const output = execSync("git status --porcelain", {
214
+ cwd: worktreePath,
215
+ encoding: "utf-8",
216
+ });
217
+ return output.trim().length > 0;
218
+ } catch (_e) {
219
+ return false;
220
+ }
221
+ }
222
+
223
+ function _hasBranchCommits(repoDir, branchName) {
224
+ try {
225
+ // Check if branch has commits not in HEAD
226
+ const output = gitExec(`log HEAD..${branchName} --oneline`, repoDir);
227
+ return output.trim().length > 0;
228
+ } catch (_e) {
229
+ return false;
230
+ }
231
+ }
@@ -38,6 +38,8 @@ import {
38
38
  } from "../lib/task-model-selector.js";
39
39
  import { CLIPermanentMemory } from "../lib/permanent-memory.js";
40
40
  import { CLIAutonomousAgent, GoalStatus } from "../lib/autonomous-agent.js";
41
+ import { PromptCompressor } from "../lib/prompt-compressor.js";
42
+ import { feature } from "../lib/feature-flags.js";
41
43
  import {
42
44
  AGENT_TOOLS,
43
45
  buildSystemPrompt,
@@ -50,6 +52,7 @@ import {
50
52
  * Reference to the runtime DB for hook execution (set during startAgentRepl)
51
53
  */
52
54
  let _hookDb = null;
55
+ let _compressor = null;
53
56
 
54
57
  /**
55
58
  * Execute a tool call — delegates to agent-core with REPL's hookDb and cwd.
@@ -105,6 +108,11 @@ export async function startAgentRepl(options = {}) {
105
108
  // Continue without DB — static prompt fallback
106
109
  }
107
110
 
111
+ // Initialize prompt compressor
112
+ if (feature("PROMPT_COMPRESSOR")) {
113
+ _compressor = new PromptCompressor({ maxMessages: 20, maxTokens: 8000 });
114
+ }
115
+
108
116
  // Initialize permanent memory
109
117
  let permanentMemory = null;
110
118
  try {
@@ -373,7 +381,15 @@ export async function startAgentRepl(options = {}) {
373
381
  }
374
382
 
375
383
  if (trimmed === "/compact") {
376
- if (contextEngine && messages.length > 5) {
384
+ if (_compressor && messages.length > 3) {
385
+ const { messages: compacted, stats } =
386
+ await _compressor.compress(messages);
387
+ messages.length = 0;
388
+ messages.push(...compacted);
389
+ logger.info(
390
+ `Compacted: ${stats.originalMessages} → ${stats.compressedMessages} messages, saved ${stats.saved} tokens (${stats.strategy})`,
391
+ );
392
+ } else if (contextEngine && messages.length > 5) {
377
393
  const compacted = contextEngine.smartCompact(messages);
378
394
  messages.length = 0;
379
395
  messages.push(...compacted);
@@ -381,7 +397,6 @@ export async function startAgentRepl(options = {}) {
381
397
  `Compacted to ${messages.length} messages (importance-based)`,
382
398
  );
383
399
  } else if (messages.length > 5) {
384
- // Fallback: original logic
385
400
  const systemMsg = messages[0];
386
401
  const recent = messages.slice(-4);
387
402
  messages.length = 0;
@@ -1044,6 +1059,27 @@ export async function startAgentRepl(options = {}) {
1044
1059
  // Non-critical
1045
1060
  }
1046
1061
  }
1062
+ // Auto-compact when context grows too large
1063
+ if (
1064
+ feature("PROMPT_COMPRESSOR") &&
1065
+ _compressor &&
1066
+ _compressor.shouldAutoCompact(messages)
1067
+ ) {
1068
+ try {
1069
+ const { messages: compacted, stats } =
1070
+ await _compressor.compress(messages);
1071
+ messages.length = 0;
1072
+ messages.push(...compacted);
1073
+ if (stats.saved > 0) {
1074
+ logger.verbose(
1075
+ `Auto-compacted: ${stats.strategy} (saved ${stats.saved} tokens)`,
1076
+ );
1077
+ }
1078
+ } catch (_e) {
1079
+ // Non-critical — continue with uncompacted messages
1080
+ }
1081
+ }
1082
+
1047
1083
  // Store as episodic memory
1048
1084
  if (db) {
1049
1085
  try {
@@ -1 +0,0 @@
1
- .logo[data-v-4627205d]{height:52px;display:flex;align-items:center;padding:0 20px;gap:10px;border-bottom:1px solid #262626;overflow:hidden;white-space:nowrap}.logo.collapsed[data-v-4627205d]{padding:0;justify-content:center}.logo-icon[data-v-4627205d]{font-size:22px;flex-shrink:0}.logo-text[data-v-4627205d]{color:#fff;font-weight:600;font-size:15px}.project-banner[data-v-4627205d]{display:flex;align-items:center;gap:8px;padding:8px 16px;margin:6px 8px;background:#0d1b2e;border:1px solid #1677ff30;border-radius:6px;overflow:hidden}.project-info[data-v-4627205d]{flex:1;min-width:0}.project-name[data-v-4627205d]{color:#91caff;font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.project-scope[data-v-4627205d]{color:#1677ff;font-size:10px;margin-top:1px}.global-banner[data-v-4627205d]{display:flex;align-items:center;gap:8px;padding:7px 16px;margin:6px 8px;background:#1a0d2e;border:1px solid #722ed130;border-radius:6px}.global-label[data-v-4627205d]{color:#c084fc;font-size:12px}.mode-icon-collapsed[data-v-4627205d]{display:flex;justify-content:center;padding:8px 0;font-size:14px}.sidebar-footer[data-v-4627205d]{position:absolute;bottom:48px;left:0;right:0;padding:10px 20px;display:flex;align-items:center;gap:8px;border-top:1px solid #222}.sidebar-footer.collapsed[data-v-4627205d]{justify-content:center;padding:10px 0}.status-text[data-v-4627205d]{color:#666;font-size:11px}.app-header[data-v-4627205d]{background:#1c1c1c;padding:0 20px;border-bottom:1px solid #262626;height:52px;line-height:52px;display:flex;align-items:center;justify-content:space-between}.header-left[data-v-4627205d]{display:flex;align-items:center}.header-right[data-v-4627205d]{display:flex;align-items:center;gap:12px}.scope-tag[data-v-4627205d]{display:flex;align-items:center;gap:6px;padding:3px 10px;border-radius:4px;font-size:12px;font-weight:500}.scope-tag.project[data-v-4627205d]{background:#0d1b2e;color:#91caff;border:1px solid #1677ff25}.scope-tag.global[data-v-4627205d]{background:#1a0d2e;color:#c084fc;border:1px solid #722ed125}
@@ -1 +0,0 @@
1
- import{o as D,V as v,Y as t,W as c,_ as F,$ as S,X as n,k as o,a0 as s,a1 as j,a2 as d,a3 as y,u as a,a4 as f,G as T,f as U,c as i}from"./vendor-Ks18OpWK.js";import{u as W}from"./ws-Bve9vKht.js";import{_ as $}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as b,G as x,D as E,M as P,a as X,b as Y,I as q}from"./antd-BhDHu4KM.js";const H={key:0,class:"logo-text"},J={key:0,class:"project-banner"},Q={class:"project-info"},Z={class:"project-name"},ee={key:1,class:"global-banner"},oe=["title"],te={key:0,class:"status-text"},se={class:"header-left"},ae={key:0,class:"scope-tag project"},ne={key:1,class:"scope-tag global"},le={class:"header-right"},ce={__name:"AppLayout",setup(de){const w=F(),N=S(),p=W(),l=U(!1),r=window.__CC_CONFIG__||{},u=i(()=>r.mode==="project"),C=i(()=>[N.name?.toLowerCase()||"dashboard"]),_=i(()=>p.status),O=i(()=>({connected:"success",connecting:"processing",error:"error",disconnected:"default"})[p.status]||"default"),A=i(()=>({connected:"已连接",connecting:"连接中...",error:"连接错误",disconnected:"未连接"})[p.status]||"未知");function B({key:g}){w.push(`/${g}`)}return D(()=>{p.connect()}),(g,e)=>{const m=c("a-menu-item"),I=c("a-menu"),L=c("a-badge"),M=c("a-layout-sider"),V=c("a-tooltip"),z=c("a-tag"),G=c("a-layout-header"),K=c("router-view"),R=c("a-layout-content"),h=c("a-layout");return n(),v(h,{style:{"min-height":"100vh",background:"#141414"}},{default:t(()=>[o(M,{collapsed:l.value,"onUpdate:collapsed":e[1]||(e[1]=k=>l.value=k),collapsible:"","collapsed-width":64,width:220,style:{background:"#1c1c1c","border-right":"1px solid #303030"}},{default:t(()=>[s("div",{class:j(["logo",{collapsed:l.value}])},[e[2]||(e[2]=s("span",{class:"logo-icon"},"⛓",-1)),l.value?y("",!0):(n(),d("span",H,"ChainlessChain"))],2),u.value&&!l.value?(n(),d("div",J,[o(a(b),{style:{color:"#1677ff","font-size":"12px"}}),s("div",Q,[s("div",Z,f(a(r).projectName||"项目"),1),e[3]||(e[3]=s("div",{class:"project-scope"},"项目级面板",-1))])])):!u.value&&!l.value?(n(),d("div",ee,[o(a(x),{style:{color:"#722ed1","font-size":"12px"}}),e[4]||(e[4]=s("span",{class:"global-label"},"全局模式",-1))])):l.value?(n(),d("div",{key:2,class:"mode-icon-collapsed",title:u.value?a(r).projectName:"全局模式"},[u.value?(n(),v(a(b),{key:0,style:{color:"#1677ff"}})):(n(),v(a(x),{key:1,style:{color:"#722ed1"}}))],8,oe)):y("",!0),o(I,{selectedKeys:C.value,"onUpdate:selectedKeys":e[0]||(e[0]=k=>C.value=k),theme:"dark",mode:"inline","inline-collapsed":l.value,style:{background:"#1c1c1c",border:"none","margin-top":"4px"},onClick:B},{default:t(()=>[o(m,{key:"dashboard"},{icon:t(()=>[o(a(E))]),default:t(()=>[e[5]||(e[5]=s("span",null,"仪表板",-1))]),_:1}),o(m,{key:"chat"},{icon:t(()=>[o(a(P))]),default:t(()=>[e[6]||(e[6]=s("span",null,"AI 对话",-1))]),_:1}),o(m,{key:"skills"},{icon:t(()=>[o(a(X))]),default:t(()=>[e[7]||(e[7]=s("span",null,"技能管理",-1))]),_:1}),o(m,{key:"providers"},{icon:t(()=>[o(a(Y))]),default:t(()=>[e[8]||(e[8]=s("span",null,"LLM 配置",-1))]),_:1})]),_:1},8,["selectedKeys","inline-collapsed"]),s("div",{class:j(["sidebar-footer",{collapsed:l.value}])},[o(L,{status:O.value},null,8,["status"]),l.value?y("",!0):(n(),d("span",te,f(A.value),1))],2)]),_:1},8,["collapsed"]),o(h,{style:{background:"#141414"}},{default:t(()=>[o(G,{class:"app-header"},{default:t(()=>[s("div",se,[u.value?(n(),d("div",ae,[o(a(b)),s("span",null,f(a(r).projectName||"项目"),1),a(r).projectRoot?(n(),v(V,{key:0,title:a(r).projectRoot},{default:t(()=>[o(a(q),{style:{opacity:"0.5",cursor:"help"}})]),_:1},8,["title"])):y("",!0)])):(n(),d("div",ne,[o(a(x)),e[9]||(e[9]=s("span",null,"全局模式",-1))]))]),s("div",le,[e[10]||(e[10]=s("span",{style:{color:"#444","font-size":"11px"}},"v5.0.2.5",-1)),o(z,{color:_.value==="connected"?"green":_.value==="connecting"?"orange":"red",style:{margin:"0"}},{default:t(()=>[T(f(_.value==="connected"?"已连接":_.value==="connecting"?"连接中":"断开"),1)]),_:1},8,["color"])])]),_:1}),o(R,{style:{padding:"24px",overflow:"auto"}},{default:t(()=>[o(K)]),_:1})]),_:1})]),_:1})}}},_e=$(ce,[["__scopeId","data-v-4627205d"]]);export{_e as default};
@@ -1 +0,0 @@
1
- import{w as G,o as Q,a2 as n,a0 as s,k as l,u as r,a4 as u,Y as d,F as S,a6 as z,G as c,a3 as g,V as T,a7 as R,A as q,c as x,W as y,f as $,X as o,a1 as A,n as J}from"./vendor-Ks18OpWK.js";import{m as H,H as M}from"./markdown-CNQE8HeM.js";import{u as K}from"./chat-_a36nOu_.js";import{_ as D}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{F as P,G as U,M as W,c as X,S as Y}from"./antd-BhDHu4KM.js";import"./ws-Bve9vKht.js";const Z={style:{display:"flex",height:"calc(100vh - 56px - 48px)",gap:"16px"}},ee={style:{width:"240px","flex-shrink":"0",background:"#1c1c1c","border-radius":"8px",border:"1px solid #303030",display:"flex","flex-direction":"column",overflow:"hidden"}},te={key:0,style:{padding:"6px 12px 4px","font-size":"11px",color:"#4a7eb5",background:"#0d1b2e","border-bottom":"1px solid #1677ff20",display:"flex","align-items":"center",gap:"4px"}},se=["title"],oe={key:1,style:{padding:"6px 12px 4px","font-size":"11px",color:"#7c4fa5",background:"#1a0d2e","border-bottom":"1px solid #722ed120",display:"flex","align-items":"center",gap:"4px"}},ne={style:{padding:"10px 12px","border-bottom":"1px solid #252525",display:"flex",gap:"8px"}},ae={style:{flex:"1","overflow-y":"auto",padding:"8px"}},ie=["onClick"],le={class:"session-icon"},re={class:"session-info"},de={class:"session-title"},pe={class:"session-meta"},ue={key:0,style:{"text-align":"center",color:"#555",padding:"24px 0","font-size":"13px"}},ce={style:{flex:"1",background:"#1c1c1c","border-radius":"8px",border:"1px solid #303030",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:"#555"}},xe={style:{"margin-top":"24px",display:"flex",gap:"12px"}},fe={key:0,class:"tool-msg"},ge={style:{margin:"0","font-size":"11px",color:"#aaa","white-space":"pre-wrap"}},ye={key:0,style:{"margin-top":"8px","padding-top":"8px","border-top":"1px solid #252525"}},_e={style:{margin:"0","font-size":"11px",color:"#52c41a","white-space":"pre-wrap"}},me={key:1,class:"user-msg"},he={class:"bubble user"},be={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 #252525"}},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 i=K(),_=$(null),f=$(""),p=x(()=>i.currentSessionId),O=x(()=>p.value?i.getMessages(p.value):[]),w=x(()=>{const a=i.streaming[p.value];return a?.active?a.content:null}),m=x(()=>i.pendingQuestion[p.value]),h=x(()=>i.isLoading);function I(a){try{return H(a||"")}catch{return a||""}}async function b(a){await i.createSession(a)}async function L(){if(!f.value.trim()||h.value||!p.value)return;const a=f.value;f.value="",await i.sendMessage(p.value,a)}function N(a){i.answerQuestion(p.value,a)}return G([O,w],()=>{J(()=>{_.value&&(_.value.scrollTop=_.value.scrollHeight)})},{deep:!0}),Q(()=>{i.loadSessions()}),(a,e)=>{const v=y("a-button"),E=y("a-collapse-panel"),F=y("a-collapse"),V=y("a-input-search"),B=y("a-textarea");return o(),n("div",Z,[s("div",ee,[j.value?(o(),n("div",te,[l(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,[l(r(U)),e[5]||(e[5]=s("span",null,"全局会话",-1))])),s("div",ne,[l(v,{type:"primary",size:"small",style:{flex:"1"},onClick:e[0]||(e[0]=t=>b("chat"))},{icon:d(()=>[l(r(W))]),default:d(()=>[e[6]||(e[6]=c(" Chat ",-1))]),_:1}),l(v,{size:"small",style:{flex:"1",background:"#2a2a2a","border-color":"#444"},onClick:e[1]||(e[1]=t=>b("agent"))},{icon:d(()=>[l(r(X))]),default:d(()=>[e[7]||(e[7]=c(" Agent ",-1))]),_:1})]),s("div",ae,[(o(!0),n(S,null,z(r(i).sessions,t=>(o(),n("div",{key:t.id,class:A(["session-item",{active:t.id===r(i).currentSessionId}]),onClick:C=>r(i).switchSession(t.id)},[s("span",le,u(t.type==="agent"?"🤖":"💬"),1),s("div",re,[s("div",de,u(t.title||"新对话"),1),s("div",pe,u(t.messageCount||0)+" 条消息",1)])],10,ie))),128)),r(i).sessions.length?g("",!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",fe,[l(F,{ghost:"",size:"small"},{default:d(()=>[l(E,{header:`🔧 ${t.tool} ${t.status==="running"?"(执行中...)":"✓"}`,style:{border:"1px solid #2d2d2d","border-radius":"6px",background:"#1a1a1a"}},{default:d(()=>[s("pre",ge,u(JSON.stringify(t.input,null,2)),1),t.result?(o(),n("div",ye,[s("pre",_e,u(typeof t.result=="string"?t.result:JSON.stringify(t.result,null,2)),1)])):g("",!0)]),_:2},1032,["header"])]),_:2},1024)])):t.role==="user"?(o(),n("div",me,[s("div",he,u(t.content),1)])):(o(),n("div",be,[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)])):g("",!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(V,{key:1,placeholder:"输入回答...","enter-button":"��送",style:{"margin-top":"10px"},onSearch:N}))])):g("",!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:"#444"}},"选择左侧会话或创建新对话",-1)),s("div",xe,[l(v,{type:"primary",onClick:e[2]||(e[2]=t=>b("chat"))},{default:d(()=>[...e[9]||(e[9]=[c("新建 Chat",-1)])]),_:1}),l(v,{style:{background:"#2a2a2a","border-color":"#444"},onClick:e[3]||(e[3]=t=>b("agent"))},{default:d(()=>[...e[10]||(e[10]=[c("新建 Agent",-1)])]),_:1})])])),p.value?(o(),n("div",Oe,[s("div",Ie,[l(B,{value:f.value,"onUpdate:value":e[4]||(e[4]=t=>f.value=t),placeholder:h.value?"等待响应中...":"输入消息,Shift+Enter 换行,Enter 发送","auto-size":{minRows:1,maxRows:6},disabled:h.value,style:{background:"#252525","border-color":"#3d3d3d",color:"#ddd",resize:"none",flex:"1"},onKeydown:R(q(L,["exact","prevent"]),["enter"])},null,8,["value","placeholder","disabled","onKeydown"]),l(v,{type:"primary",loading:h.value,onClick:L,style:{height:"40px"}},{icon:d(()=>[l(r(Y))]),_:1},8,["loading"])])])):g("",!0)])])}}},Fe=D(Le,[["__scopeId","data-v-06fff6c1"]]);export{Fe as default};
@@ -1 +0,0 @@
1
- pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}.session-item[data-v-06fff6c1]{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-06fff6c1]:hover{background:#252525}.session-item.active[data-v-06fff6c1]{background:#1677ff20;border:1px solid #1677ff40}.session-icon[data-v-06fff6c1]{font-size:16px}.session-info[data-v-06fff6c1]{flex:1;min-width:0}.session-title[data-v-06fff6c1]{color:#ccc;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.session-meta[data-v-06fff6c1]{color:#555;font-size:11px;margin-top:2px}.message-row[data-v-06fff6c1]{margin-bottom:16px}.user-msg[data-v-06fff6c1]{display:flex;justify-content:flex-end}.assistant-msg[data-v-06fff6c1]{display:flex;gap:10px;align-items:flex-start}.avatar[data-v-06fff6c1]{width:32px;height:32px;border-radius:50%;background:#1677ff;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;color:#fff;flex-shrink:0}.bubble[data-v-06fff6c1]{padding:10px 14px;border-radius:12px;max-width:80%;line-height:1.6;font-size:14px}.bubble.user[data-v-06fff6c1]{background:#1677ff;color:#fff;border-bottom-right-radius:4px}.bubble.assistant[data-v-06fff6c1]{background:#252525;color:#ddd;border-bottom-left-radius:4px}.bubble.streaming[data-v-06fff6c1]:after{content:"▋";animation:blink-06fff6c1 .7s step-start infinite;color:#1677ff}@keyframes blink-06fff6c1{50%{opacity:0}}.tool-msg[data-v-06fff6c1]{margin:8px 0}.question-card[data-v-06fff6c1]{background:#1a1f35;border:1px solid #1677ff40;border-radius:10px;padding:14px 16px;margin-top:8px}.question-text[data-v-06fff6c1]{color:#aaa;font-size:13px}[data-v-06fff6c1] .bubble.assistant pre{background:#1a1a1a;border-radius:6px;padding:12px;overflow-x:auto;font-size:12px}[data-v-06fff6c1] .bubble.assistant code:not(pre code){background:#2a2a2a;padding:1px 5px;border-radius:3px;font-size:12px;color:#f0a500}[data-v-06fff6c1] .bubble.assistant p{margin:0 0 8px}[data-v-06fff6c1] .bubble.assistant p:last-child{margin:0}
@@ -1,2 +0,0 @@
1
- import{a5 as E,f as L,o as H,a2 as X,a0 as a,a4 as n,u as o,k as t,Y as e,V as C,c as M,W as i,_ as Y,X as y,G as c,a3 as N}from"./vendor-Ks18OpWK.js";import{u as T}from"./ws-Bve9vKht.js";import{u as q}from"./chat-_a36nOu_.js";import{R as J,F as K,I as Q,b as A,c as $,a as I,M as R}from"./antd-BhDHu4KM.js";const U=E("dashboard",()=>{const g=L(!1),u=L({wsStatus:"disconnected",activeLlm:null,activeModel:null,skillCount:0,sessionCount:0,providerCount:0});async function S(){const f=T();g.value=!0,u.value.wsStatus=f.status;try{const{output:b}=await f.execute("llm providers"),x=b.match(/active[:\s]+(\S+)/i);x&&(u.value.activeLlm=x[1]);const{output:d}=await f.execute("skill sources"),_=d.match(/(\d+)\s*(?:skills|技能)/i);if(_)u.value.skillCount=parseInt(_[1]);else{const r=d.split(`
2
- `).filter(k=>k.trim()&&!k.startsWith("─"));u.value.skillCount=Math.max(r.length-3,0)*10}const l=await f.listSessions();u.value.sessionCount=l.length}catch{}finally{g.value=!1}}return{loading:g,stats:u,refresh:S}}),Z={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},tt={style:{margin:"4px 0 0",color:"#666","font-size":"13px"}},et={style:{display:"flex","align-items":"center",gap:"16px","flex-wrap":"wrap"}},ot={style:{color:"#91caff","font-weight":"600","font-size":"15px"}},st={style:{color:"#4a6fa5","font-size":"11px","font-family":"monospace","margin-top":"2px"}},at={style:{"margin-left":"auto"}},lt={style:{"margin-top":"24px"}},nt={style:{"margin-top":"24px"}},rt={style:{color:"#91caff"}},it={style:{color:"#555","font-family":"monospace","font-size":"11px"}},ct={style:{color:"#888","font-family":"monospace","font-size":"12px"}},mt={__name:"Dashboard",setup(g){const u=T(),S=U(),f=q(),b=Y(),{loading:x,stats:d,refresh:_}=S,l=window.__CC_CONFIG__||{},r=M(()=>l.mode==="project"),k=M(()=>({connected:"已连接",connecting:"连接中",error:"错误",disconnected:"未连接"})[u.status]||"未知"),V=M(()=>({connected:"#52c41a",connecting:"#faad14",error:"#ff4d4f",disconnected:"#888"})[u.status]||"#888");async function W(){await f.createSession("agent"),b.push("/chat")}return H(()=>{setTimeout(_,500)}),(z,s)=>{const v=i("a-button"),O=i("a-tag"),B=i("a-tooltip"),p=i("a-card"),D=i("a-alert"),w=i("a-statistic"),h=i("a-col"),F=i("a-row"),G=i("a-space"),m=i("a-descriptions-item"),P=i("a-descriptions");return y(),X("div",null,[a("div",Z,[a("div",null,[s[3]||(s[3]=a("h2",{style:{margin:"0",color:"#fff","font-size":"20px"}},"仪表板",-1)),a("p",tt,n(r.value?`项目「${o(l).projectName||"未命名"}」的系统概览`:"全局系统概览"),1)]),t(v,{type:"primary",ghost:"",loading:o(x),onClick:o(_)},{icon:e(()=>[t(o(J))]),default:e(()=>[s[4]||(s[4]=c(" 刷新 ",-1))]),_:1},8,["loading","onClick"])]),r.value?(y(),C(p,{key:0,style:{background:"#0d1b2e","border-color":"#1677ff30","margin-bottom":"20px"},size:"small"},{default:e(()=>[a("div",et,[t(o(K),{style:{color:"#1677ff","font-size":"20px"}}),a("div",null,[a("div",ot,n(o(l).projectName||"项目"),1),a("div",st,n(o(l).projectRoot),1)]),a("div",at,[t(O,{color:"blue"},{default:e(()=>[...s[5]||(s[5]=[c("项目级面板",-1)])]),_:1}),t(B,{title:"此面板的 AI 对话、技能运行均在此项目目录范围内"},{default:e(()=>[t(o(Q),{style:{color:"#555",cursor:"help","margin-left":"6px"}})]),_:1})])])]),_:1})):(y(),C(D,{key:1,type:"info",style:{"margin-bottom":"20px",background:"#1a0d2e","border-color":"#722ed130"},"show-icon":""},{message:e(()=>[...s[6]||(s[6]=[a("span",{style:{color:"#c084fc"}},"全局模式",-1),a("span",{style:{color:"#888","margin-left":"8px","font-size":"12px"}},[c(" — 在项目目录下运行 "),a("code",{style:{background:"#2a2a2a",padding:"1px 5px","border-radius":"3px"}},"chainlesschain ui"),c(" 可切换到项目级面板 ")],-1)])]),_:1})),t(F,{gutter:[16,16]},{default:e(()=>[t(h,{xs:24,sm:12,lg:6},{default:e(()=>[t(p,{style:{background:"#1f1f1f","border-color":"#303030"}},{default:e(()=>[t(w,{title:"WebSocket",value:k.value,"value-style":{color:V.value,fontSize:"18px"}},{prefix:e(()=>[t(o(A))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),t(h,{xs:24,sm:12,lg:6},{default:e(()=>[t(p,{style:{background:"#1f1f1f","border-color":"#303030"}},{default:e(()=>[t(w,{title:"活跃 LLM",value:o(d).activeLlm||"未配置","value-style":{color:o(d).activeLlm?"#52c41a":"#888",fontSize:"18px"}},{prefix:e(()=>[t(o($))]),_:1},8,["value","value-style"])]),_:1})]),_:1}),t(h,{xs:24,sm:12,lg:6},{default:e(()=>[t(p,{style:{background:"#1f1f1f","border-color":"#303030"}},{default:e(()=>[t(w,{title:"可用技能",value:o(d).skillCount||"—","value-style":"color: #1677ff; font-size: 18px;"},{prefix:e(()=>[t(o(I))]),_:1},8,["value"])]),_:1})]),_:1}),t(h,{xs:24,sm:12,lg:6},{default:e(()=>[t(p,{style:{background:"#1f1f1f","border-color":"#303030"}},{default:e(()=>[t(w,{title:"AI 会话",value:o(d).sessionCount,"value-style":"color: #722ed1; font-size: 18px;"},{prefix:e(()=>[t(o(R))]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),a("div",lt,[s[8]||(s[8]=a("h3",{style:{color:"#ccc","font-size":"15px","margin-bottom":"12px"}},"快速操作",-1)),t(G,{wrap:""},{default:e(()=>[t(v,{type:"primary",onClick:s[0]||(s[0]=j=>z.$router.push("/chat"))},{icon:e(()=>[t(o(R))]),default:e(()=>[c(" "+n(r.value?"项目 Chat":"新建对话"),1)]),_:1}),t(v,{onClick:W,style:{background:"#2a2a2a","border-color":"#444"}},{icon:e(()=>[t(o($))]),default:e(()=>[c(" "+n(r.value?"项目 Agent":"Agent 模式"),1)]),_:1}),t(v,{onClick:s[1]||(s[1]=j=>z.$router.push("/skills")),style:{background:"#2a2a2a","border-color":"#444"}},{icon:e(()=>[t(o(I))]),default:e(()=>[c(" "+n(r.value?"项目技能":"浏览技能"),1)]),_:1}),t(v,{onClick:s[2]||(s[2]=j=>z.$router.push("/providers")),style:{background:"#2a2a2a","border-color":"#444"}},{icon:e(()=>[t(o(A))]),default:e(()=>[s[7]||(s[7]=c(" LLM 配置 ",-1))]),_:1})]),_:1})]),a("div",nt,[s[10]||(s[10]=a("h3",{style:{color:"#ccc","font-size":"15px","margin-bottom":"12px"}},"运行信息",-1)),t(p,{style:{background:"#1f1f1f","border-color":"#303030"}},{default:e(()=>[t(P,{column:{xs:1,sm:2},size:"small"},{default:e(()=>[t(m,{label:"面板模式"},{default:e(()=>[t(O,{color:r.value?"blue":"purple"},{default:e(()=>[c(n(r.value?"项目级":"全局"),1)]),_:1},8,["color"])]),_:1}),r.value?(y(),C(m,{key:0,label:"项目名称"},{default:e(()=>[a("span",rt,n(o(l).projectName||"—"),1)]),_:1})):N("",!0),r.value?(y(),C(m,{key:1,label:"项目路径"},{default:e(()=>[a("span",it,n(o(l).projectRoot),1)]),_:1})):N("",!0),t(m,{label:"WebSocket"},{default:e(()=>[a("span",ct," ws://"+n(o(l).wsHost||"127.0.0.1")+":"+n(o(l).wsPort||18800),1)]),_:1}),t(m,{label:"认证"},{default:e(()=>[t(O,{color:o(l).wsToken?"green":"default",style:{"font-size":"11px"}},{default:e(()=>[c(n(o(l).wsToken?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),t(m,{label:"版本"},{default:e(()=>[...s[9]||(s[9]=[a("span",{style:{color:"#555"}},"v5.0.2.5",-1)])]),_:1})]),_:1})]),_:1})])])}}};export{mt as default};
@@ -1,2 +0,0 @@
1
- import{a5 as O,f as b,o as G,a2 as w,a0 as i,k as p,Y as r,u as m,V as v,a3 as M,F as S,a6 as V,W as f,X as c,G as g,a4 as y,a1 as B}from"./vendor-Ks18OpWK.js";import{u as $}from"./ws-Bve9vKht.js";import{_ as E}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{R as I,d as z}from"./antd-BhDHu4KM.js";const N=O("providers",()=>{const h=b(!1),l=b(null),u=b([]),P=b([]),d=b(null);async function t(){const o=$();h.value=!0;try{const{output:n}=await o.execute("llm providers",15e3);u.value=_(n);const a=u.value.find(e=>e.active);a&&(d.value=a.name);const{output:s}=await o.execute("llm models",15e3);P.value=C(s)}catch(n){console.error("Failed to load providers:",n)}finally{h.value=!1}}function _(o){const n=[{name:"anthropic",label:"Anthropic (Claude)",icon:"🤖"},{name:"openai",label:"OpenAI (GPT)",icon:"🧠"},{name:"ollama",label:"Ollama (本地)",icon:"🦙"},{name:"gemini",label:"Google Gemini",icon:"✨"},{name:"deepseek",label:"DeepSeek",icon:"���"},{name:"qianwen",label:"通义千问",icon:"🌊"},{name:"zhipu",label:"智谱 GLM",icon:"📐"},{name:"moonshot",label:"Moonshot Kimi",icon:"🌙"},{name:"baidu",label:"百度文心",icon:"🌸"},{name:"groq",label:"Groq",icon:"⚡"}],a=[];for(const s of n){const e=o.toLowerCase().includes(s.name);o.match(new RegExp(`\\*?\\s*${s.name}`,"i"))&&o.includes("*")&&o.indexOf("*")<o.toLowerCase().indexOf(s.name)+20,a.push({...s,configured:e||o.includes("active")&&o.toLowerCase().includes(s.name),active:o.match(new RegExp(`\\*\\s*${s.name}`,"i"))!==null,status:"unknown"})}if(!a.find(s=>s.active)&&a.length>0){const s=o.match(/active[:\s]+(\w+)/i);if(s){const e=a.find(k=>k.name===s[1].toLowerCase());e&&(e.active=!0)}}return a}function C(o){return o.split(`
2
- `).map(n=>n.trim()).filter(n=>n&&!n.startsWith("#")&&!n.startsWith("─")&&n.includes(":")).map(n=>({name:n,size:""})).slice(0,20)}async function L(o){await $().execute(`llm switch ${o}`,1e4),u.value.forEach(a=>a.active=a.name===o),d.value=o}async function x(o){const n=$();l.value=o;try{const{output:a,exitCode:s}=await n.execute("llm test",3e4),e=u.value.find(k=>k.name===o);return e&&(e.status=s===0?"ok":"error"),s===0}catch{const a=u.value.find(s=>s.name===o);return a&&(a.status="error"),!1}finally{l.value=null}}return{loading:h,testing:l,providers:u,localModels:P,activeProvider:d,loadProviders:t,switchProvider:L,testProvider:x}}),R={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},W={key:1,style:{"text-align":"center",padding:"60px"}},q={key:2},A={class:"providers-grid"},F={style:{display:"flex","align-items":"center",gap:"12px","margin-bottom":"12px"}},j={style:{"font-size":"24px"}},D={style:{flex:"1"}},T={style:{color:"#e0e0e0","font-weight":"500"}},K={style:{color:"#888","font-size":"11px","font-family":"monospace"}},X={style:{display:"flex",gap:"8px","justify-content":"flex-end"}},Y={key:0,style:{"margin-top":"24px"}},H={style:{color:"#ccc","font-family":"monospace","font-size":"13px"}},J={__name:"Providers",setup(h){const l=N();async function u(d){try{await l.switchProvider(d),z.success(`已切换到 ${d}`)}catch(t){z.error(`切换失败: ${t.message}`)}}async function P(d){await l.testProvider(d)?z.success(`${d} 连接正常`):z.warning(`${d} 连接失败,请检查配置`)}return G(()=>{l.loadProviders()}),(d,t)=>{const _=f("a-button"),C=f("a-alert"),L=f("a-spin"),x=f("a-tag"),o=f("a-badge"),n=f("a-card"),a=f("a-list-item"),s=f("a-list");return c(),w("div",null,[i("div",R,[t[2]||(t[2]=i("div",null,[i("h2",{style:{margin:"0",color:"#fff","font-size":"20px"}},"LLM 配置"),i("p",{style:{margin:"4px 0 0",color:"#666","font-size":"13px"}},"管理 AI 服务提供商")],-1)),p(_,{type:"primary",ghost:"",loading:m(l).loading,onClick:t[0]||(t[0]=e=>m(l).loadProviders())},{icon:r(()=>[p(m(I))]),default:r(()=>[t[1]||(t[1]=g(" 刷新 ",-1))]),_:1},8,["loading"])]),m(l).activeProvider?(c(),v(C,{key:0,type:"success",style:{"margin-bottom":"20px",background:"#162312","border-color":"#274916"},"show-icon":""},{message:r(()=>[i("span",null,[t[3]||(t[3]=g("当前激活:",-1)),i("strong",null,y(m(l).activeProvider),1)])]),_:1})):M("",!0),m(l).loading?(c(),w("div",W,[p(L,{size:"large"}),t[4]||(t[4]=i("div",{style:{color:"#555","margin-top":"12px"}},"加载 LLM 信息中...",-1))])):(c(),w("div",q,[i("div",A,[(c(!0),w(S,null,V(m(l).providers,e=>(c(),v(n,{key:e.name,class:B(["provider-card",{active:e.active}]),style:{background:"#1f1f1f"},size:"small"},{default:r(()=>[i("div",F,[i("span",j,y(e.icon),1),i("div",D,[i("div",T,y(e.label),1),i("div",K,y(e.name),1)]),i("div",null,[e.active?(c(),v(x,{key:0,color:"green"},{default:r(()=>[...t[5]||(t[5]=[g("活跃",-1)])]),_:1})):e.status==="ok"?(c(),v(o,{key:1,status:"success",text:""})):e.status==="error"?(c(),v(o,{key:2,status:"error",text:""})):M("",!0)])]),i("div",X,[p(_,{size:"small",style:{background:"#252525","border-color":"#3d3d3d"},loading:m(l).testing===e.name,onClick:k=>P(e.name)},{default:r(()=>[...t[6]||(t[6]=[g(" 测试 ",-1)])]),_:1},8,["loading","onClick"]),e.active?(c(),v(x,{key:1,color:"green",style:{margin:"0","line-height":"24px"}},{default:r(()=>[...t[8]||(t[8]=[g("当前",-1)])]),_:1})):(c(),v(_,{key:0,size:"small",type:"primary",ghost:"",onClick:k=>u(e.name)},{default:r(()=>[...t[7]||(t[7]=[g(" 切换 ",-1)])]),_:1},8,["onClick"]))])]),_:2},1032,["class"]))),128))]),m(l).localModels.length?(c(),w("div",Y,[t[9]||(t[9]=i("h3",{style:{color:"#ccc","font-size":"15px","margin-bottom":"12px"}}," 🦙 本地模型(Ollama) ",-1)),p(s,{"data-source":m(l).localModels,size:"small",style:{background:"#1f1f1f","border-radius":"8px",border:"1px solid #303030"}},{renderItem:r(({item:e})=>[p(a,{style:{padding:"10px 16px","border-color":"#252525"}},{actions:r(()=>[p(x,{color:"cyan",style:{"font-size":"10px"}},{default:r(()=>[g(y(e.size||"local"),1)]),_:2},1024)]),default:r(()=>[i("span",H,y(e.name),1)]),_:2},1024)]),_:1},8,["data-source"])])):M("",!0)]))])}}},te=E(J,[["__scopeId","data-v-2589c425"]]);export{te as default};
@@ -1 +0,0 @@
1
- .providers-grid[data-v-2589c425]{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}.provider-card[data-v-2589c425]{border:1px solid #303030!important;transition:border-color .2s}.provider-card[data-v-2589c425]:hover{border-color:#444!important}.provider-card.active[data-v-2589c425]{border-color:#52c41a!important;background:#162312!important}
@@ -1,2 +0,0 @@
1
- import{a5 as V,f as k,c as z,o as W,a2 as y,a0 as a,a4 as g,u as n,k as r,Y as u,F as L,a6 as M,W as f,_ as $,X as p,G as x,V as q}from"./vendor-Ks18OpWK.js";import{u as j}from"./ws-Bve9vKht.js";import{u as A}from"./chat-_a36nOu_.js";import{_ as F}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{a as N,R as Q,P as R}from"./antd-BhDHu4KM.js";const E=V("skills",()=>{const v=k(!1),o=k([]),d=k(""),m=k("all"),h=z(()=>{const l=new Set(["all"]);return o.value.forEach(e=>{e.category&&l.add(e.category),e.executionMode&&l.add(e.executionMode)}),[...l]}),b=z(()=>{let l=o.value;if(m.value!=="all"&&(l=l.filter(e=>e.category===m.value||e.executionMode===m.value)),d.value){const e=d.value.toLowerCase();l=l.filter(t=>t.name?.toLowerCase().includes(e)||t.description?.toLowerCase().includes(e)||t.title?.toLowerCase().includes(e))}return l});async function S(){const l=j();v.value=!0;try{const{output:e}=await l.execute("skill list",2e4),t=C(e);o.value=t}catch(e){console.error("Failed to load skills:",e)}finally{v.value=!1}}function C(l){const e=l.split(`
2
- `),t=[];let c="built-in";for(const w of e){const i=w.trim();if(!i||i.startsWith("─")||i.startsWith("="))continue;if(i.match(/^[📦🔧⚡💡🌐🔒🏢🔗]+\s/)){c=i.replace(/^[^\s]+\s/,"").toLowerCase().replace(/[()]/g,"").trim();continue}const _=i.match(/^([a-z][a-z0-9-]+)\s+[-–]\s+(.+)/)||i.match(/^([a-z][a-z0-9-]+)\s{2,}(.+)/);_?t.push({name:_[1],description:_[2],category:c,executionMode:c.includes("agent")?"agent":c.includes("llm")?"llm-query":c.includes("cli")?"cli-direct":"built-in"}):i.match(/^[a-z][a-z0-9-]+$/)&&t.push({name:i,description:"",category:c,executionMode:"built-in"})}return t}return{loading:v,allSkills:o,searchQuery:d,selectedCategory:m,categories:h,filteredSkills:b,loadSkills:S}}),P={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},T={style:{margin:"4px 0 0",color:"#666","font-size":"13px"}},U={style:{display:"flex",gap:"12px","margin-bottom":"20px","flex-wrap":"wrap"}},D={key:0,style:{"text-align":"center",padding:"60px"}},G={key:1,class:"skills-grid"},X={style:{display:"flex","justify-content":"space-between","align-items":"flex-start"}},Y={style:{flex:"1","min-width":"0"}},H={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px","font-family":"monospace"}},J={style:{color:"#888","font-size":"12px","line-height":"1.5"}},K={style:{"margin-left":"12px","flex-shrink":"0"}},Z={style:{"margin-top":"10px",display:"flex","justify-content":"flex-end"}},ee={key:2,style:{"text-align":"center",padding:"60px",color:"#555"}},te={__name:"Skills",setup(v){const o=E(),d=A(),m=$(),h=z(()=>o.categories.filter(e=>e!=="all").slice(0,6));function b(e){return{"built-in":"内置","cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合",workspace:"工作区",marketplace:"市场"}[e]||e}function S(e){return{"cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合","built-in":"内置"}[e]||e||"未知"}function C(e){return{"cli-direct":"cyan",agent:"purple","llm-query":"blue",hybrid:"orange","built-in":"green"}[e]||"default"}async function l(e){await d.createSession("agent"),m.push("/chat"),setTimeout(()=>{d.currentSessionId&&d.sendMessage(d.currentSessionId,`/skill run ${e}`)},300)}return W(()=>{o.allSkills.length||o.loadSkills()}),(e,t)=>{const c=f("a-button"),w=f("a-input-search"),i=f("a-radio-button"),_=f("a-radio-group"),I=f("a-spin"),B=f("a-tag"),O=f("a-card");return p(),y("div",null,[a("div",P,[a("div",null,[t[3]||(t[3]=a("h2",{style:{margin:"0",color:"#fff","font-size":"20px"}},"技能管理",-1)),a("p",T,g(n(o).allSkills.length)+" 个可用技能",1)]),r(c,{type:"primary",ghost:"",loading:n(o).loading,onClick:t[0]||(t[0]=s=>n(o).loadSkills())},{icon:u(()=>[r(n(Q))]),default:u(()=>[t[4]||(t[4]=x(" 刷新 ",-1))]),_:1},8,["loading"])]),a("div",U,[r(w,{value:n(o).searchQuery,"onUpdate:value":t[1]||(t[1]=s=>n(o).searchQuery=s),placeholder:"搜索技能名称或描述...",style:{width:"300px"},"allow-clear":""},null,8,["value"]),r(_,{value:n(o).selectedCategory,"onUpdate:value":t[2]||(t[2]=s=>n(o).selectedCategory=s),"button-style":"solid"},{default:u(()=>[r(i,{value:"all"},{default:u(()=>[...t[5]||(t[5]=[x("全部",-1)])]),_:1}),(p(!0),y(L,null,M(h.value,s=>(p(),q(i,{key:s,value:s},{default:u(()=>[x(g(b(s)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),n(o).loading?(p(),y("div",D,[r(I,{size:"large"}),t[6]||(t[6]=a("div",{style:{color:"#555","margin-top":"12px"}},"加载技能中...",-1))])):n(o).filteredSkills.length?(p(),y("div",G,[(p(!0),y(L,null,M(n(o).filteredSkills,s=>(p(),q(O,{key:s.name,class:"skill-card",size:"small",hoverable:"",style:{background:"#1f1f1f","border-color":"#303030",cursor:"default"}},{default:u(()=>[a("div",X,[a("div",Y,[a("div",H,g(s.name),1),a("div",J,g(s.description||"暂无描述"),1)]),a("div",K,[r(B,{color:C(s.executionMode),style:{"font-size":"10px"}},{default:u(()=>[x(g(S(s.executionMode)),1)]),_:2},1032,["color"])])]),a("div",Z,[r(c,{size:"small",type:"primary",ghost:"",onClick:oe=>l(s.name)},{icon:u(()=>[r(n(R))]),default:u(()=>[t[7]||(t[7]=x(" 运行 ",-1))]),_:1},8,["onClick"])])]),_:2},1024))),128))])):(p(),y("div",ee,[r(n(N),{style:{"font-size":"48px","margin-bottom":"16px",display:"block"}}),a("div",null,g(n(o).allSkills.length?"没有匹配的技能":"点击刷新加载技能列表"),1)]))])}}},re=F(te,[["__scopeId","data-v-330f2378"]]);export{re as default};
@@ -1 +0,0 @@
1
- .skills-grid[data-v-330f2378]{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}.skill-card[data-v-330f2378]{transition:border-color .2s,transform .2s}.skill-card[data-v-330f2378]:hover{border-color:#1677ff!important;transform:translateY(-1px)}
@@ -1 +0,0 @@
1
- import{a5 as k,f as w,r as h}from"./vendor-Ks18OpWK.js";import{u as i}from"./ws-Bve9vKht.js";const A=k("chat",()=>{const u=w([]),f=w(null),s=h({}),o=h({}),r=h({}),p=w(!1);function v(t){return s[t]||(s[t]=[]),s[t]}async function q(){const t=i();u.value=await t.listSessions()}async function y(t="chat"){const e=i(),n=await e.createSession(t);return u.value.unshift({id:n,type:t,title:t==="chat"?"新对话":"新 Agent",createdAt:Date.now(),messageCount:0}),e.onSession(n,a=>S(n,a)),f.value=n,s[n]=[],o[n]={content:"",active:!1},n}function S(t,e){const n=v(t);if(e.type==="response-token")o[t]||(o[t]={content:"",active:!0}),o[t].content+=e.token||"",o[t].active=!0;else if(e.type==="response-complete"){const a=e.content||o[t]?.content||"";n.push({role:"assistant",content:a,timestamp:Date.now()}),o[t]&&(o[t].content="",o[t].active=!1);const c=u.value.find(l=>l.id===t);if(c&&c.title.startsWith("新")){const l=n.find(g=>g.role==="user");l&&(c.title=l.content.slice(0,30))}p.value=!1}else if(e.type==="tool-executing")n.push({role:"tool",tool:e.tool,input:e.input,status:"running",timestamp:Date.now()});else if(e.type==="tool-result"){const a=[...n].reverse().find(c=>c.role==="tool"&&c.tool===e.tool);a&&(a.result=e.result,a.status="done")}else e.type==="question"&&(r[t]={requestId:e.requestId||e.id,question:e.question,choices:e.choices||[]})}async function D(t,e){const n=i();v(t).push({role:"user",content:e,timestamp:Date.now()}),o[t]||(o[t]={content:"",active:!1}),o[t].active=!0,p.value=!0,n.sendSessionMessage(t,e)}function M(t,e){const n=i(),a=r[t];a&&(n.answerQuestion(t,a.requestId,e),delete r[t])}async function Q(t){f.value=t,s[t]||(s[t]=[],o[t]={content:"",active:!1},i().onSession(t,n=>S(t,n)))}return{sessions:u,currentSessionId:f,messages:s,streaming:o,pendingQuestion:r,isLoading:p,loadSessions:q,createSession:y,sendMessage:D,answerQuestion:M,switchSession:Q,getMessages:v}});export{A as u};
@@ -1 +0,0 @@
1
- html,body{width:100%;height:100%}input::-ms-clear,input::-ms-reveal{display:none}*,*:before,*:after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}body{margin:0}[tabindex="-1"]:focus{outline:none}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5em;font-weight:500}p{margin-top:0;margin-bottom:1em}abbr[title],abbr[data-original-title]{-webkit-text-decoration:underline dotted;text-decoration:underline;text-decoration:underline dotted;border-bottom:0;cursor:help}address{margin-bottom:1em;font-style:normal;line-height:inherit}input[type=text],input[type=password],input[type=number],textarea{-webkit-appearance:none}ol,ul,dl{margin-top:0;margin-bottom:1em}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5em;margin-left:0}blockquote{margin:0 0 1em}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}pre,code,kbd,samp{font-size:1em;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace}pre{margin-top:0;margin-bottom:1em;overflow:auto}figure{margin:0 0 1em}img{vertical-align:middle;border-style:none}a,area,button,[role=button],input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75em;padding-bottom:.3em;text-align:left;caption-side:bottom}input,button,select,optgroup,textarea{margin:0;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;margin:0;padding:0;border:0}legend{display:block;width:100%;max-width:100%;margin-bottom:.5em;padding:0;color:inherit;font-size:1.5em;line-height:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}mark{padding:.2em;background-color:#feffe6}
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./AppLayout-D-KJRC1s.js","./vendor-Ks18OpWK.js","./ws-Bve9vKht.js","./_plugin-vue_export-helper-DlAUqK2U.js","./antd-BhDHu4KM.js","./AppLayout-CZDQcPAA.css","./Dashboard-Bmgu7fEn.js","./chat-_a36nOu_.js","./Chat-BsgVc34I.js","./markdown-CNQE8HeM.js","./Chat-V-g0UHcr.css","./Skills--YIq8avF.js","./Skills-BC4Yu_4f.css","./Providers-DlC9S5Nf.js","./Providers-YRgg8NIn.css"])))=>i.map(i=>d[i]);
2
- import{S as E,U as P,V as L,W as g,X as b,Y as A,k as B,R as O,Z as k}from"./vendor-Ks18OpWK.js";import{t as w,A as R}from"./antd-BhDHu4KM.js";(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))l(e);new MutationObserver(e=>{for(const t of e)if(t.type==="childList")for(const r of t.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&l(r)}).observe(document,{childList:!0,subtree:!0});function a(e){const t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?t.credentials="include":e.crossOrigin==="anonymous"?t.credentials="omit":t.credentials="same-origin",t}function l(e){if(e.ep)return;e.ep=!0;const t=a(e);fetch(e.href,t)}})();const S="modulepreload",I=function(p,n){return new URL(p,n).href},y={},d=function(n,a,l){let e=Promise.resolve();if(a&&a.length>0){let v=function(o){return Promise.all(o.map(i=>Promise.resolve(i).then(u=>({status:"fulfilled",value:u}),u=>({status:"rejected",reason:u}))))};const r=document.getElementsByTagName("link"),s=document.querySelector("meta[property=csp-nonce]"),_=s?.nonce||s?.getAttribute("nonce");e=v(a.map(o=>{if(o=I(o,l),o in y)return;y[o]=!0;const i=o.endsWith(".css"),u=i?'[rel="stylesheet"]':"";if(l)for(let m=r.length-1;m>=0;m--){const f=r[m];if(f.href===o&&(!i||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${u}`))return;const c=document.createElement("link");if(c.rel=i?"stylesheet":S,i||(c.as="script"),c.crossOrigin="",c.href=o,_&&c.setAttribute("nonce",_),document.head.appendChild(c),i)return new Promise((m,f)=>{c.addEventListener("load",m),c.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${o}`)))})}))}function t(r){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=r,window.dispatchEvent(s),!s.defaultPrevented)throw r}return e.then(r=>{for(const s of r||[])s.status==="rejected"&&t(s.reason);return n().catch(t)})},C=[{path:"/",component:()=>d(()=>import("./AppLayout-D-KJRC1s.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url),children:[{path:"",redirect:"/dashboard"},{path:"dashboard",name:"Dashboard",component:()=>d(()=>import("./Dashboard-Bmgu7fEn.js"),__vite__mapDeps([6,1,2,7,4]),import.meta.url)},{path:"chat",name:"Chat",component:()=>d(()=>import("./Chat-BsgVc34I.js"),__vite__mapDeps([8,1,9,4,7,2,3,10]),import.meta.url)},{path:"skills",name:"Skills",component:()=>d(()=>import("./Skills--YIq8avF.js"),__vite__mapDeps([11,1,2,7,3,4,12]),import.meta.url)},{path:"providers",name:"Providers",component:()=>d(()=>import("./Providers-DlC9S5Nf.js"),__vite__mapDeps([13,1,2,3,4,14]),import.meta.url)}]}],N=E({history:P(),routes:C}),T={__name:"App",setup(p){const n={algorithm:w.darkAlgorithm,token:{colorPrimary:"#1677ff",colorBgBase:"#141414",colorBgContainer:"#1f1f1f",colorBgElevated:"#2a2a2a",borderRadius:8,fontFamily:'system-ui, -apple-system, "Segoe UI", sans-serif'},components:{Layout:{siderBg:"#1c1c1c",headerBg:"#1c1c1c",bodyBg:"#141414"},Menu:{darkItemBg:"#1c1c1c",darkSubMenuItemBg:"#171717"}}};return(a,l)=>{const e=g("router-view"),t=g("a-config-provider");return b(),L(t,{theme:n},{default:A(()=>[B(e)]),_:1})}}},h=O(T);h.use(k());h.use(N);h.use(R);h.mount("#app");