chainlesschain 0.45.6 → 0.45.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1007,11 +1007,11 @@ chainlesschain serve --project /path/to/project # Default project root f
1007
1007
 
1008
1008
  ---
1009
1009
 
1010
- ## Web Management Interface (v0.45.0)
1010
+ ## Web Management Interface (v0.45.8)
1011
1011
 
1012
1012
  ### `chainlesschain ui`
1013
1013
 
1014
- Open a browser-based Web management interface — no extra software required.
1014
+ Open a browser-based Web management interface — no extra software required. When a built Vue3 panel (`dist/`) is present it is served as static files; otherwise an embedded single-page app is used as fallback.
1015
1015
 
1016
1016
  ```bash
1017
1017
  chainlesschain ui # Auto-detect mode, open browser
@@ -1020,8 +1020,12 @@ chainlesschain ui --ws-port 18800 # Custom WebSocket port
1020
1020
  chainlesschain ui --no-open # Start server without opening browser
1021
1021
  chainlesschain ui --token <secret> # Enable WebSocket auth token
1022
1022
  chainlesschain ui --host 0.0.0.0 # Bind to all interfaces (remote access)
1023
+ chainlesschain ui --web-panel-dir <dir> # Custom dist/ directory (auto-detected by default)
1023
1024
  ```
1024
1025
 
1026
+ > **npm users**: the Vue3 panel is bundled automatically (via `prepublishOnly`) — no build step needed.
1027
+ > **Source users**: run `npm run build:web-panel` once (from repo root) to build `packages/web-panel/dist/`.
1028
+
1025
1029
  **Two modes** (auto-detected based on current directory):
1026
1030
 
1027
1031
  | Mode | Trigger | Description |
@@ -1029,9 +1033,9 @@ chainlesschain ui --host 0.0.0.0 # Bind to all interfaces (remote access)
1029
1033
  | **Project mode** | Run from a directory with `.chainlesschain/` | AI automatically loads project context (rules, skills, config) |
1030
1034
  | **Global mode** | Run from any non-project directory | General-purpose AI management panel |
1031
1035
 
1032
- **Features**: streaming Markdown output, session management (new/switch/history), Agent/Chat mode toggle, slot-filling interactive dialogs, auto-reconnect (3s), Token auth.
1036
+ **Features**: Vue3 + Ant Design Vue panel (Dashboard / Chat / Skills / Providers), streaming Markdown output, session management (new/switch/history), Agent/Chat mode toggle, slot-filling interactive dialogs, auto-reconnect (3s), Token auth.
1033
1037
 
1034
- **Ports**: HTTP 18810 (Web UI page), WebSocket 18800 (reuses `chainlesschain serve` infrastructure).
1038
+ **Ports**: HTTP 18810 (Web UI page + static assets), WebSocket 18800 (reuses `chainlesschain serve` infrastructure).
1035
1039
 
1036
1040
  **Security**: JSON config embedded with XSS-safe Unicode escaping (`\u003c`/`\u003e`); Token auth via `--token`.
1037
1041
 
@@ -1164,7 +1168,7 @@ Configuration is stored at `~/.chainlesschain/config.json`. The CLI creates and
1164
1168
  ```bash
1165
1169
  cd packages/cli
1166
1170
  npm install
1167
- npm test # Run all tests (3050+ tests across 130+ files)
1171
+ npm test # Run all tests (5200+ tests across 133+ files)
1168
1172
  npm run test:unit # Unit tests only
1169
1173
  npm run test:integration # Integration tests
1170
1174
  npm run test:e2e # End-to-end tests
@@ -1174,20 +1178,23 @@ npm run test:e2e # End-to-end tests
1174
1178
 
1175
1179
  | Category | Files | Tests | Status |
1176
1180
  | ------------------------- | ------- | -------- | --------------- |
1177
- | Unit — lib modules | 70 | 1700+ | All passing |
1181
+ | Unit — lib modules | 71 | 1750+ | All passing |
1178
1182
  | Unit — commands | 17 | 400+ | All passing |
1179
1183
  | Unit — runtime | 1 | 6 | All passing |
1180
1184
  | Unit — WS sessions | 9 | 156 | All passing |
1181
1185
  | Unit — Skill Packs | 2 | 57+ | All passing |
1182
1186
  | Unit — AI Templates | 2 | 130+ | All passing |
1187
+ | Unit — Web UI | 1 | 46 | All passing |
1183
1188
  | Integration | 13 | 230+ | All passing |
1184
1189
  | Integration — WS session | 1 | 12 | All passing |
1185
1190
  | Integration — AI Handlers | 2 | 100+ | All passing |
1191
+ | Integration — Web UI | 1 | 29 | All passing |
1186
1192
  | E2E | 15 | 260+ | All passing |
1187
1193
  | E2E — Skill Packs | 1 | 23+ | All passing |
1188
1194
  | E2E — AI Templates | 4 | 65+ | All passing |
1195
+ | E2E — Web UI | 1 | 24 | All passing |
1189
1196
  | Core packages (external) | — | 118 | All passing |
1190
- | **CLI Total** | **132** | **3056** | **All passing** |
1197
+ | **CLI Total** | **133** | **3155** | **All passing** |
1191
1198
 
1192
1199
  ## License
1193
1200
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chainlesschain",
3
- "version": "0.45.6",
3
+ "version": "0.45.9",
4
4
  "description": "CLI for ChainlessChain - install, configure, and manage your personal AI management system",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,7 +19,9 @@
19
19
  "lint": "eslint src/ bin/ --ext .js",
20
20
  "format": "prettier --write \"src/**/*.js\" \"bin/**/*.js\" \"__tests__/**/*.js\"",
21
21
  "sync-skill-packs": "node --input-type=module -e \"import { generateCliPacks } from './src/lib/skill-packs/generator.js'; const r = await generateCliPacks({ force: false }); console.log('Skill packs synced:', r.generated.length, 'generated,', r.skipped.length, 'skipped');\"",
22
- "postinstall": "node --input-type=module -e \"import { generateCliPacks } from './src/lib/skill-packs/generator.js'; generateCliPacks({ force: false }).catch(() => {});\" 2>/dev/null || true"
22
+ "postinstall": "node --input-type=module -e \"import { generateCliPacks } from './src/lib/skill-packs/generator.js'; generateCliPacks({ force: false }).catch(() => {});\" 2>/dev/null || true",
23
+ "build:web-panel": "cd ../web-panel && npm install --legacy-peer-deps && npm run build && node --input-type=module -e \"import fs from 'fs'; import path from 'path'; const src=path.resolve(process.cwd(),'dist'),dst=path.resolve(process.cwd(),'../cli/src/assets/web-panel'); fs.rmSync(dst,{recursive:true,force:true}); fs.cpSync(src,dst,{recursive:true}); console.log('Web panel bundled to',dst);\"",
24
+ "prepublishOnly": "npm run build:web-panel"
23
25
  },
24
26
  "engines": {
25
27
  "node": ">=22.12.0"
@@ -0,0 +1 @@
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}
@@ -0,0 +1 @@
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};
@@ -0,0 +1 @@
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};
@@ -0,0 +1 @@
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}
@@ -0,0 +1,2 @@
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};
@@ -0,0 +1,2 @@
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};
@@ -0,0 +1 @@
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}
@@ -0,0 +1,2 @@
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};
@@ -0,0 +1 @@
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)}
@@ -0,0 +1 @@
1
+ const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _};