@jsbot-tellus/core 2.7.0 → 2.9.0

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 (53) hide show
  1. package/dist/core/web/routes/plugins.d.ts.map +1 -1
  2. package/dist/core/web/routes/plugins.js +51 -4
  3. package/dist/core/web/routes/plugins.js.map +1 -1
  4. package/dist/webui/assets/ActionsView-CdRiwzyc.css +1 -0
  5. package/dist/webui/assets/ActionsView-DpOwcpkP.js +1 -0
  6. package/dist/webui/assets/ConfigView-BwDaxNs6.css +1 -0
  7. package/dist/webui/assets/ConfigView-C8W7Taes.js +1 -0
  8. package/dist/webui/assets/DashboardView-FAQEqfkT.css +1 -0
  9. package/dist/webui/assets/DashboardView-XR4MljXP.js +1 -0
  10. package/dist/webui/assets/EventsView-D6uxp8iJ.css +1 -0
  11. package/dist/webui/assets/EventsView-dsacXF6v.js +1 -0
  12. package/dist/webui/assets/KvView-ClHfDapd.css +1 -0
  13. package/dist/webui/assets/KvView-CleDcxJm.js +1 -0
  14. package/dist/webui/assets/LoginView-auw7iDds.js +1 -0
  15. package/dist/webui/assets/LoginView-rwItauSQ.css +1 -0
  16. package/dist/webui/assets/LogsView-Crns4wd2.css +1 -0
  17. package/dist/webui/assets/LogsView-D94DH0eL.js +1 -0
  18. package/dist/webui/assets/MainLayout-BLJl7wIh.css +1 -0
  19. package/dist/webui/assets/MainLayout-BSmZGVVc.js +1 -0
  20. package/dist/webui/assets/PluginsView-BrrSON7o.js +1 -0
  21. package/dist/webui/assets/PluginsView-BwP5MkvC.css +1 -0
  22. package/dist/webui/assets/SessionsView-CboU4cCN.js +1 -0
  23. package/dist/webui/assets/SessionsView-DOUCUUrw.css +1 -0
  24. package/dist/webui/assets/api-Bm2KUKXH.js +3 -0
  25. package/dist/webui/assets/index-BX3-wbu2.css +1 -0
  26. package/dist/webui/assets/index-BjnuYVEl.js +50 -0
  27. package/dist/webui/assets/use-ui-scale-DvdJkOwB.js +1 -0
  28. package/dist/webui/index.html +9 -8
  29. package/package.json +2 -2
  30. package/src/core/web/routes/plugins.ts +75 -6
  31. package/dist/webui/assets/ActionsView-BDuXBWG1.js +0 -1
  32. package/dist/webui/assets/ActionsView-Ciib5lC6.css +0 -1
  33. package/dist/webui/assets/ConfigView-B3Gv2uRG.js +0 -1
  34. package/dist/webui/assets/ConfigView-CrEpss2y.css +0 -1
  35. package/dist/webui/assets/DashboardView-DR6yCaqs.css +0 -1
  36. package/dist/webui/assets/DashboardView-n9LGPmQL.js +0 -1
  37. package/dist/webui/assets/EventsView-DhO8twWb.js +0 -1
  38. package/dist/webui/assets/EventsView-PMkYKxZ-.css +0 -1
  39. package/dist/webui/assets/KvView-BCz_dOVC.js +0 -1
  40. package/dist/webui/assets/KvView-CaMvbxUz.css +0 -1
  41. package/dist/webui/assets/LoginView-BVnFkwSW.css +0 -1
  42. package/dist/webui/assets/LoginView-Br3_AC5z.js +0 -1
  43. package/dist/webui/assets/LogsView-Ba_12frI.js +0 -1
  44. package/dist/webui/assets/LogsView-NR4L1-XY.css +0 -1
  45. package/dist/webui/assets/MainLayout-D2LTc57u.js +0 -1
  46. package/dist/webui/assets/MainLayout-glfVNbMz.css +0 -1
  47. package/dist/webui/assets/PluginsView-DL9OxGph.css +0 -1
  48. package/dist/webui/assets/PluginsView-vQKBSCU8.js +0 -1
  49. package/dist/webui/assets/SessionsView-DSl37qpo.js +0 -1
  50. package/dist/webui/assets/SessionsView-p-u3JGTV.css +0 -1
  51. package/dist/webui/assets/api-CNzxhTWe.js +0 -3
  52. package/dist/webui/assets/index-CUvpnClx.js +0 -50
  53. package/dist/webui/assets/index-CePlRZX6.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../../../src/core/web/routes/plugins.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAIvE,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCtE;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA0D1E;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C1E"}
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../../../src/core/web/routes/plugins.ts"],"names":[],"mappings":"AAKA,OAAO,EAA4B,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAqCvE,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCtE;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAwF1E;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C1E"}
@@ -1,7 +1,32 @@
1
+ import { z } from 'zod';
2
+ import { formatConfigIssues } from '../../config/schema.js';
1
3
  import { stripPluginEnvelope } from '../../plugin/host.js';
2
4
  import { HttpError, isRecord, readJsonBody, sendData } from '../http.js';
3
5
  import { asRecord, requireRuntime } from './shared.js';
4
6
  const ENVELOPE_KEYS = new Set(['enabled', 'private', 'groups']);
7
+ /**
8
+ * JSON Schema for a plugin's options, derived from its Zod input schema once
9
+ * per definition. `null` means the schema cannot be represented and the WebUI
10
+ * falls back to raw JSON editing.
11
+ */
12
+ const jsonSchemaCache = new WeakMap();
13
+ function pluginJsonSchema(definition) {
14
+ if (jsonSchemaCache.has(definition)) {
15
+ return jsonSchemaCache.get(definition) ?? null;
16
+ }
17
+ let result = null;
18
+ try {
19
+ result = z.toJSONSchema(definition.manifest.configSchema, {
20
+ io: 'input',
21
+ unrepresentable: 'any',
22
+ });
23
+ }
24
+ catch {
25
+ result = null;
26
+ }
27
+ jsonSchemaCache.set(definition, result);
28
+ return result;
29
+ }
5
30
  export async function handlePluginsList(ctx) {
6
31
  const runtime = requireRuntime(ctx.deps);
7
32
  const statuses = new Map(runtime.kernel.listPlugins().map((entry) => [entry.id, entry]));
@@ -9,6 +34,9 @@ export async function handlePluginsList(ctx) {
9
34
  const id = definition.manifest.id;
10
35
  const status = statuses.get(id);
11
36
  const envelope = asRecord(runtime.config.plugins[id]);
37
+ // `safeStringify` treats shared references as circular; cloning keeps
38
+ // `config` and `options` from aliasing the same nested objects.
39
+ const options = structuredClone(stripPluginEnvelope(envelope));
12
40
  return {
13
41
  id,
14
42
  version: definition.manifest.version,
@@ -18,7 +46,8 @@ export async function handlePluginsList(ctx) {
18
46
  enabled: status?.enabled ?? false,
19
47
  loaded: status?.loaded ?? false,
20
48
  config: envelope,
21
- options: stripPluginEnvelope(envelope),
49
+ options,
50
+ configSchema: pluginJsonSchema(definition),
22
51
  };
23
52
  });
24
53
  const installed = runtime.installer.enabled
@@ -54,13 +83,31 @@ export async function handlePluginConfigPut(ctx) {
54
83
  if (!isRecord(body['options'])) {
55
84
  throw new HttpError(400, 'options must be an object');
56
85
  }
86
+ const runtime = ctx.deps.getRuntime();
87
+ const definition = runtime?.plugins.find((plugin) => plugin.manifest.id === id);
88
+ const options = {};
89
+ for (const [key, value] of Object.entries(body['options'])) {
90
+ if (!ENVELOPE_KEYS.has(key))
91
+ options[key] = value;
92
+ }
57
93
  for (const key of Object.keys(next)) {
58
94
  if (!ENVELOPE_KEYS.has(key))
59
95
  delete next[key];
60
96
  }
61
- for (const [key, value] of Object.entries(body['options'])) {
62
- if (!ENVELOPE_KEYS.has(key))
63
- next[key] = value;
97
+ if (definition === undefined) {
98
+ // Without a live runtime there is no schema to enforce; the config
99
+ // store still owns envelope validation.
100
+ Object.assign(next, options);
101
+ }
102
+ else {
103
+ const parsed = definition.manifest.configSchema.safeParse(options);
104
+ if (!parsed.success) {
105
+ throw new HttpError(400, formatConfigIssues(parsed.error, `plugins.${id}`));
106
+ }
107
+ if (!isRecord(parsed.data)) {
108
+ throw new HttpError(400, `plugins.${id}: config schema must produce an object`);
109
+ }
110
+ Object.assign(next, parsed.data);
64
111
  }
65
112
  }
66
113
  const config = {
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../../../src/core/web/routes/plugins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../../../src/core/web/routes/plugins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ .block[data-v-c0ee4f70]{margin-bottom:1rem}.result[data-v-c0ee4f70]{background:var(--app-bg);border:1px solid var(--app-border);color:var(--app-text);white-space:pre-wrap;border-radius:.625rem;min-height:5rem;margin:0;padding:.75rem;font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;font-size:.75rem}
@@ -0,0 +1 @@
1
+ import{Ai as e,Ci as t,Ei as n,_a as r,ai as i,c as a,ci as o,d as s,f as c,li as l,ni as u,p as d,qi as f,r as p,ui as m,zi as h}from"./api-Bm2KUKXH.js";var g={class:`result`},_=c(m({__name:`ActionsView`,setup(c){let m=f(`get_login_info`),_=f(`{}`),v=f(``),y=f(!1),b=f(!0),x=async()=>{let e={};if(_.value.trim().length>0&&_.value.trim()!==`{}`)try{e=JSON.parse(_.value)}catch{d.error(`params 必须是合法 JSON`);return}y.value=!0;try{let t=await p(`/api/actions`,{action:m.value,params:e});v.value=JSON.stringify(t.result,void 0,2)}catch(e){s(e)}finally{y.value=!1}};return t(()=>{a().then(e=>{b.value=e.runtime===null}).catch(()=>{b.value=!0})}),(t,a)=>{let s=e(`el-alert`),c=e(`el-input`),d=e(`el-form-item`),f=e(`el-button`),p=e(`el-form`),S=e(`el-divider`),C=e(`el-card`);return n(),i(`div`,null,[l(s,{title:`直接向 OneBot 调用任意 action。此功能等同完全特权接口,请谨慎使用。`,type:`warning`,closable:!1,class:`block`}),l(C,{class:`block`},{default:h(()=>[l(p,{"label-width":`6.25rem`,size:`small`},{default:h(()=>[l(d,{label:`action`},{default:h(()=>[l(c,{modelValue:m.value,"onUpdate:modelValue":a[0]||=e=>m.value=e,placeholder:`如 get_login_info / send_private_msg`,style:{width:`20rem`}},null,8,[`modelValue`])]),_:1}),l(d,{label:`params (JSON)`},{default:h(()=>[l(c,{modelValue:_.value,"onUpdate:modelValue":a[1]||=e=>_.value=e,type:`textarea`,rows:5,spellcheck:`false`,placeholder:`{}`},null,8,[`modelValue`])]),_:1}),l(d,null,{default:h(()=>[l(f,{type:`primary`,loading:y.value,disabled:b.value,onClick:x},{default:h(()=>[...a[2]||=[o(` 调用 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1}),l(S,null,{default:h(()=>[...a[3]||=[o(`结果`,-1)]]),_:1}),u(`pre`,g,r(v.value),1)]),_:1})])}}}),[[`__scopeId`,`data-v-c0ee4f70`]]);export{_ as default};
@@ -0,0 +1 @@
1
+ .form[data-v-5964f422]{max-width:40rem}.block[data-v-5964f422]{margin-top:.75rem}.json-editor[data-v-5964f422]{font-family:monospace}.issues[data-v-5964f422]{margin:0;padding-left:1.125rem;font-size:.75rem}
@@ -0,0 +1 @@
1
+ import{Ai as e,Ci as t,Ei as n,Oi as r,Zr as i,_a as a,ai as o,ci as s,d as c,f as l,i as u,ii as d,li as f,n as p,ni as m,p as h,qi as g,r as _,ri as v,ui as y,zi as b}from"./api-Bm2KUKXH.js";var x={class:`block`},S={class:`issues`},C=l(y({__name:`ConfigView`,setup(l){let y=g(`form`),C=g({url:``,accessToken:``,roles:{superadmin:[],admin:[]},message:{charThreshold:50,lineThreshold:3},webui:{enabled:!1,host:`127.0.0.1`,port:8787,username:``,password:``,sessionTtlHours:12,trustProxy:!1},installer:{enabled:!1,registry:`https://registry.npmjs.org/`,allowedPackages:[],allowScripts:!1,timeoutMs:12e4}}),w=g(``),T=g({path:``,hash:``,accessTokenSet:!1,webuiPasswordSet:!1}),E=g(``),D=g([]),O=g(!1),k=()=>{let e=JSON.parse(JSON.stringify(C.value)),t=e.webui;return w.value===``?delete t.password:t.password=w.value,e.accessToken===``&&delete e.accessToken,e},A=()=>{E.value=JSON.stringify(k(),null,4)},j=()=>{try{let e=JSON.parse(E.value),t=e.webui??{};typeof t.password==`string`&&(w.value=t.password===``?``:`00000000`),typeof e.accessToken==`string`&&e.accessToken===``?e.accessToken=``:typeof e.accessToken==`string`&&(e.accessToken=`00000000`),C.value=e,h.success(`已应用到表单`)}catch(e){h.error(`JSON 格式错误`),console.warn(e)}},M=async e=>{let t=await _(`/api/config/validate`,{config:e});return D.value=t.issues,t.ok},N=async()=>{O.value=!0;try{await M(k())&&h.success(`校验通过`)}catch(e){c(e)}finally{O.value=!1}},P=async()=>{let e;try{e=JSON.parse(E.value)}catch{h.error(`JSON 格式错误`);return}await I(e,w.value)},F=async()=>{let e=k();w.value=e.webui.password,await I(e,w.value),D.value=[]},I=async(e,t)=>{O.value=!0;try{if(!await M(e)&&D.value.length>0){h.error(`校验失败`);return}let t=await u(`/api/config`,{config:e,baseHash:T.value.hash});if(!t.ok){h.error(t.error??`保存失败`);return}h.success(`已保存并重启运行时`),await L()}catch(e){c(e)}finally{O.value=!1}},L=async()=>{try{let e=await p(`/api/config`);C.value=e.config,T.value=e.meta,w.value=(e.meta.webuiPasswordSet&&e.config.webui.password,``),E.value=JSON.stringify(e.config,null,4)}catch(e){c(e)}},R=e=>e.join(`, `);function z(e,t,n,r){let i=n.split(/[,,]/).map(e=>e.trim()).filter(e=>e.length>0);e[t]=r?i.map(r):i}return t(()=>void L()),(t,c)=>{let l=e(`el-divider`),u=e(`el-input`),p=e(`el-form-item`),h=e(`el-switch`),g=e(`el-input-number`),_=e(`el-space`),k=e(`el-button`),M=e(`el-form`),I=e(`el-tab-pane`),L=e(`el-tabs`),B=e(`el-alert`);return n(),o(`div`,null,[f(L,{modelValue:y.value,"onUpdate:modelValue":c[19]||=e=>y.value=e},{default:b(()=>[f(I,{label:`常用设置`,name:`form`},{default:b(()=>[f(M,{"label-width":`8.75rem`,size:`small`,class:`form`},{default:b(()=>[f(l,{"content-position":`left`},{default:b(()=>[...c[20]||=[s(`连接`,-1)]]),_:1}),f(p,{label:`ws url`},{default:b(()=>[f(u,{modelValue:C.value.url,"onUpdate:modelValue":c[0]||=e=>C.value.url=e},null,8,[`modelValue`])]),_:1}),f(p,{label:`accessToken`},{default:b(()=>[f(u,{modelValue:C.value.accessToken,"onUpdate:modelValue":c[1]||=e=>C.value.accessToken=e,placeholder:T.value.accessTokenSet?`留空保持不变`:`未设置`},null,8,[`modelValue`,`placeholder`])]),_:1}),f(l,{"content-position":`left`},{default:b(()=>[...c[21]||=[s(`WebUI`,-1)]]),_:1}),f(p,{label:`enabled`},{default:b(()=>[f(h,{modelValue:C.value.webui.enabled,"onUpdate:modelValue":c[2]||=e=>C.value.webui.enabled=e},null,8,[`modelValue`])]),_:1}),f(p,{label:`host / port`},{default:b(()=>[f(_,null,{default:b(()=>[f(u,{modelValue:C.value.webui.host,"onUpdate:modelValue":c[3]||=e=>C.value.webui.host=e,style:{width:`10rem`}},null,8,[`modelValue`]),f(g,{modelValue:C.value.webui.port,"onUpdate:modelValue":c[4]||=e=>C.value.webui.port=e,min:1,max:65535},null,8,[`modelValue`])]),_:1})]),_:1}),f(p,{label:`username`},{default:b(()=>[f(u,{modelValue:C.value.webui.username,"onUpdate:modelValue":c[5]||=e=>C.value.webui.username=e,style:{width:`12.5rem`}},null,8,[`modelValue`])]),_:1}),f(p,{label:`password`},{default:b(()=>[f(u,{modelValue:w.value,"onUpdate:modelValue":c[6]||=e=>w.value=e,"show-password":``,placeholder:T.value.webuiPasswordSet?`留空保持不变`:`未设置`,style:{width:`15rem`}},null,8,[`modelValue`,`placeholder`])]),_:1}),f(p,{label:`sessionTtlHours`},{default:b(()=>[f(g,{modelValue:C.value.webui.sessionTtlHours,"onUpdate:modelValue":c[7]||=e=>C.value.webui.sessionTtlHours=e,min:1,max:720},null,8,[`modelValue`])]),_:1}),f(p,{label:`trustProxy`},{default:b(()=>[f(h,{modelValue:C.value.webui.trustProxy,"onUpdate:modelValue":c[8]||=e=>C.value.webui.trustProxy=e},null,8,[`modelValue`])]),_:1}),f(l,{"content-position":`left`},{default:b(()=>[...c[22]||=[s(`消息聚合`,-1)]]),_:1}),f(p,{label:`charThreshold`},{default:b(()=>[f(g,{modelValue:C.value.message.charThreshold,"onUpdate:modelValue":c[9]||=e=>C.value.message.charThreshold=e,min:1},null,8,[`modelValue`])]),_:1}),f(p,{label:`lineThreshold`},{default:b(()=>[f(g,{modelValue:C.value.message.lineThreshold,"onUpdate:modelValue":c[10]||=e=>C.value.message.lineThreshold=e,min:1},null,8,[`modelValue`])]),_:1}),f(l,{"content-position":`left`},{default:b(()=>[...c[23]||=[s(`安装器`,-1)]]),_:1}),f(p,{label:`enabled`},{default:b(()=>[f(h,{modelValue:C.value.installer.enabled,"onUpdate:modelValue":c[11]||=e=>C.value.installer.enabled=e},null,8,[`modelValue`])]),_:1}),f(p,{label:`registry`},{default:b(()=>[f(u,{modelValue:C.value.installer.registry,"onUpdate:modelValue":c[12]||=e=>C.value.installer.registry=e},null,8,[`modelValue`])]),_:1}),f(p,{label:`allowedPackages`},{default:b(()=>[f(u,{"model-value":R(C.value.installer.allowedPackages),"onUpdate:modelValue":c[13]||=e=>z(C.value.installer,`allowedPackages`,e)},null,8,[`model-value`])]),_:1}),f(p,{label:`allowScripts`},{default:b(()=>[f(h,{modelValue:C.value.installer.allowScripts,"onUpdate:modelValue":c[14]||=e=>C.value.installer.allowScripts=e},null,8,[`modelValue`])]),_:1}),f(p,{label:`timeoutMs`},{default:b(()=>[f(g,{modelValue:C.value.installer.timeoutMs,"onUpdate:modelValue":c[15]||=e=>C.value.installer.timeoutMs=e,min:1e3,max:6e5},null,8,[`modelValue`])]),_:1}),f(l,{"content-position":`left`},{default:b(()=>[...c[24]||=[s(`角色`,-1)]]),_:1}),f(p,{label:`superadmin`},{default:b(()=>[f(u,{"model-value":R(C.value.roles.superadmin),placeholder:`逗号分隔的 QQ 号`,"onUpdate:modelValue":c[16]||=e=>z(C.value.roles,`superadmin`,e,Number)},null,8,[`model-value`])]),_:1}),f(p,{label:`admin`},{default:b(()=>[f(u,{"model-value":R(C.value.roles.admin),placeholder:`逗号分隔的 QQ 号`,"onUpdate:modelValue":c[17]||=e=>z(C.value.roles,`admin`,e,Number)},null,8,[`model-value`])]),_:1}),f(p,null,{default:b(()=>[f(_,null,{default:b(()=>[f(k,{type:`primary`,loading:O.value,onClick:F},{default:b(()=>[...c[25]||=[s(` 校验并保存 `,-1)]]),_:1},8,[`loading`]),f(k,{onClick:N},{default:b(()=>[...c[26]||=[s(` 仅校验 `,-1)]]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),f(I,{label:`JSON 编辑器`,name:`json`},{default:b(()=>[f(u,{modelValue:E.value,"onUpdate:modelValue":c[18]||=e=>E.value=e,type:`textarea`,rows:24,spellcheck:`false`,class:`json-editor`},null,8,[`modelValue`]),m(`div`,x,[f(_,null,{default:b(()=>[f(k,{onClick:A},{default:b(()=>[...c[27]||=[s(`从表单生成`,-1)]]),_:1}),f(k,{onClick:j},{default:b(()=>[...c[28]||=[s(`应用到表单`,-1)]]),_:1}),f(k,{type:`primary`,loading:O.value,onClick:P},{default:b(()=>[...c[29]||=[s(` 校验并保存 `,-1)]]),_:1},8,[`loading`])]),_:1})])]),_:1})]),_:1},8,[`modelValue`]),D.value.length>0?(n(),v(B,{key:0,type:`error`,closable:!1,class:`block`},{default:b(()=>[m(`ul`,S,[(n(!0),o(i,null,r(D.value,(e,t)=>(n(),o(`li`,{key:t},a(e.path?e.path+`: `:``)+a(e.message),1))),128))])]),_:1})):d(``,!0)])}}}),[[`__scopeId`,`data-v-5964f422`]]);export{C as default};
@@ -0,0 +1 @@
1
+ .block[data-v-e2972061]{margin-bottom:1rem}.stat-grid[data-v-e2972061]{grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));gap:1rem;display:grid}.stat-grid[data-v-e2972061] .el-col{flex:none;width:auto;max-width:none;padding:0}.stat[data-v-e2972061]{align-items:flex-start;gap:.875rem;display:flex}.chip[data-v-e2972061]{border-radius:.6875rem;flex:none;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;display:flex}.chip.sky[data-v-e2972061]{color:color-mix(in oklab, var(--app-accent) 85%, black);background:color-mix(in oklab, var(--app-accent) 12%, transparent)}.chip.emerald[data-v-e2972061]{color:var(--app-ok);background:color-mix(in oklab, var(--app-ok) 12%, transparent)}.chip.violet[data-v-e2972061]{color:var(--app-violet);background:color-mix(in oklab, var(--app-violet) 12%, transparent)}.chip.amber[data-v-e2972061]{color:var(--app-warn);background:color-mix(in oklab, var(--app-warn) 12%, transparent)}.label[data-v-e2972061]{color:var(--app-muted);margin:0;font-size:.78125rem}.value[data-v-e2972061]{color:var(--app-text);margin:.375rem 0 0;font-size:1.3125rem;font-weight:700;line-height:1.25}.value.small[data-v-e2972061]{font-size:1rem}.unit[data-v-e2972061]{color:var(--app-muted);font-size:.75rem;font-weight:500}.sub[data-v-e2972061]{color:var(--app-muted);word-break:break-all;margin:.25rem 0 0;font-size:.71875rem}.warn-text[data-v-e2972061]{color:var(--app-warn)}.error-text[data-v-e2972061]{white-space:pre-wrap;margin:.5rem 0 0;font-size:.75rem}
@@ -0,0 +1 @@
1
+ import{$ as e,Ai as t,Ci as n,Ei as r,L as i,M as a,_a as o,a as s,ai as c,c as l,ci as u,d,f,ii as p,l as m,li as h,ni as g,qi as _,r as v,ri as y,s as b,ta as x,ti as S,u as C,ui as w,wi as T,xt as ee,zi as E}from"./api-Bm2KUKXH.js";import{t as D}from"./use-ui-scale-DvdJkOwB.js";var O={class:`error-text`},te={class:`stat`},ne={class:`chip sky`},re={class:`value small`},k={class:`sub`},A={class:`stat`},j={class:`chip emerald`},M={class:`value`},N={class:`sub`},P={class:`stat`},F={class:`chip violet`},I={class:`value`},L={class:`unit`},R={class:`sub`},z={class:`stat`},B={class:`chip amber`},V={class:`value`},H={class:`unit`},U={class:`sub`},W={key:0,class:`sub warn-text`},G=f(w({__name:`DashboardView`,setup(f){let w=_(null),G=_([]),K=_([]),q=_(!1),J=S(()=>w.value?.runtime??null),Y=S(()=>J.value?C(J.value.uptimeMs):`-`),X=async()=>{try{w.value=await l()}catch(e){d(e)}},Z=async()=>{q.value=!0;try{await v(`/api/runtime/restart`),await X()}catch(e){d(e)}finally{q.value=!1}},ie=async()=>{try{await v(`/api/runtime/pause`),await X()}catch(e){d(e)}},ae=async()=>{try{await v(`/api/runtime/resume`),await X()}catch(e){d(e)}},Q=null,$=null;return n(async()=>{await X(),G.value=await b().catch(()=>[]),Q=s(`/api/events/stream?limit=20`,e=>{K.value.unshift(e),K.value.length>30&&K.value.pop()});let e=setInterval(()=>void X(),1e4);$=()=>clearInterval(e)}),T(()=>{Q?.(),$?.()}),(n,s)=>{let l=t(`el-alert`),d=t(`el-icon`),f=t(`el-card`),_=t(`el-col`),v=t(`el-row`),b=t(`el-button`),S=t(`el-space`),C=t(`el-table-column`),T=t(`el-table`);return r(),c(`div`,null,[w.value?.startupError?(r(),y(l,{key:0,title:`运行时启动失败`,type:`error`,closable:!1,class:`block`},{default:E(()=>[g(`pre`,O,o(w.value.startupError),1)]),_:1})):w.value?.restarting?(r(),y(l,{key:1,title:`运行时正在重启…`,type:`warning`,closable:!1,class:`block`})):p(``,!0),h(v,{class:`stat-grid block`},{default:E(()=>[h(_,{span:6},{default:E(()=>[h(f,{class:`stat-card`},{default:E(()=>[g(`div`,te,[g(`div`,ne,[h(d,{size:`1.125rem`},{default:E(()=>[h(x(e))]),_:1})]),g(`div`,null,[s[0]||=g(`p`,{class:`label`},`连接状态`,-1),g(`p`,re,o(J.value?.connected?`已连接`:`未连接`),1),g(`p`,k,o(J.value?.login?`${J.value.login.nickname} · ${J.value.login.userId}`:`—`),1)])])]),_:1})]),_:1}),h(_,{span:6},{default:E(()=>[h(f,{class:`stat-card`},{default:E(()=>[g(`div`,A,[g(`div`,j,[h(d,{size:`1.125rem`},{default:E(()=>[h(x(ee))]),_:1})]),g(`div`,null,[s[1]||=g(`p`,{class:`label`},`运行时长`,-1),g(`p`,M,o(Y.value),1),g(`p`,N,` state: `+o(J.value?.state??`—`)+` · gen `+o(J.value?.generation??`—`),1)])])]),_:1})]),_:1}),h(_,{span:6},{default:E(()=>[h(f,{class:`stat-card`},{default:E(()=>[g(`div`,P,[g(`div`,F,[h(d,{size:`1.125rem`},{default:E(()=>[h(x(a))]),_:1})]),g(`div`,null,[s[2]||=g(`p`,{class:`label`},`插件`,-1),g(`p`,I,[u(o(J.value?.counts.loadedPlugins??`—`),1),g(`span`,L,` / `+o(J.value?.counts.plugins??`—`)+` 已加载`,1)]),g(`p`,R,` 启用 `+o(J.value?.counts.enabledPlugins??`—`),1)])])]),_:1})]),_:1}),h(_,{span:6},{default:E(()=>[h(f,{class:`stat-card`},{default:E(()=>[g(`div`,z,[g(`div`,B,[h(d,{size:`1.125rem`},{default:E(()=>[h(x(i))]),_:1})]),g(`div`,null,[s[3]||=g(`p`,{class:`label`},`会话`,-1),g(`p`,V,[u(o(J.value?.counts.sessions??`—`),1),g(`span`,H,` · `+o(J.value?.counts.kvPlugins??`—`)+` KV 插件`,1)]),s[4]||=g(`p`,{class:`sub`},`session 记录数`,-1)])])]),_:1})]),_:1})]),_:1}),h(f,{class:`block`},{header:E(()=>[...s[5]||=[u(`运行时控制`,-1)]]),default:E(()=>[h(S,null,{default:E(()=>[h(b,{type:`danger`,loading:q.value,onClick:Z},{default:E(()=>[...s[6]||=[u(` 重启运行时 `,-1)]]),_:1},8,[`loading`]),h(b,{onClick:ie},{default:E(()=>[...s[7]||=[u(`暂停`,-1)]]),_:1}),h(b,{onClick:ae},{default:E(()=>[...s[8]||=[u(`恢复`,-1)]]),_:1})]),_:1}),g(`p`,U,` version: `+o(w.value?.version??`-`)+` · paths: `+o(w.value?.paths.config),1),w.value?.webui.requiresProcessRestart?(r(),c(`p`,W,` webui 绑定配置已修改,需要重启进程生效。 `)):p(``,!0)]),_:1}),h(f,{class:`block`},{header:E(()=>[...s[9]||=[u(`命令列表`,-1)]]),default:E(()=>[h(T,{data:G.value,size:`small`,"max-height":`320`},{default:E(()=>[h(C,{prop:`name`,label:`命令`,width:x(D)(220)},null,8,[`width`]),h(C,{label:`别名`,width:x(D)(200)},{default:E(({row:e})=>[u(o((e.aliases??[]).join(`, `)||`—`),1)]),_:1},8,[`width`]),h(C,{prop:`pluginId`,label:`插件`,width:x(D)(220)},null,8,[`width`]),h(C,{label:`说明 / 用法`,"min-width":x(D)(240)},{default:E(({row:e})=>[u(o(e.description||e.usage||`—`),1)]),_:1},8,[`min-width`])]),_:1},8,[`data`])]),_:1}),h(f,{class:`block`},{header:E(()=>[...s[10]||=[u(`最近事件`,-1)]]),default:E(()=>[h(T,{data:K.value,size:`small`,"max-height":`320`},{default:E(()=>[h(C,{label:`时间`,width:x(D)(170)},{default:E(({row:e})=>[u(o(x(m)(e.time)),1)]),_:1},8,[`width`]),h(C,{prop:`type`,label:`类型`,width:x(D)(100)},null,8,[`width`]),h(C,{prop:`summary`,label:`摘要`,"min-width":x(D)(240)},null,8,[`min-width`])]),_:1},8,[`data`])]),_:1})])}}}),[[`__scopeId`,`data-v-e2972061`]]);export{G as default};
@@ -0,0 +1 @@
1
+ .block[data-v-200a56d6]{margin-bottom:1rem}.json[data-v-200a56d6]{white-space:pre-wrap;font-size:.75rem}
@@ -0,0 +1 @@
1
+ import{Ai as e,Ci as t,Ei as n,Li as r,_a as i,a,ai as o,ci as s,d as c,f as l,l as u,li as d,n as f,ni as p,qi as m,ta as h,ui as g,wi as _,zi as v}from"./api-Bm2KUKXH.js";import{t as y}from"./use-ui-scale-DvdJkOwB.js";var b={class:`json`},x=l(g({__name:`EventsView`,setup(l){let g=m(``),x=m(`on`),S=m([]),C=m(!1),w=m(``),T=async()=>{try{let e=new URLSearchParams({limit:`300`});g.value&&e.set(`type`,g.value),S.value=await f(`/api/events?${e.toString()}`)}catch(e){c(e)}},E=null,D=()=>{E?.(),E=null,x.value===`on`&&(E=a(`/api/events/stream`,e=>{let t=e;g.value&&t.type!==g.value||(S.value.unshift(t),S.value.length>500&&(S.value.length=500))}))};r(x,D),r(g,async()=>{await T(),D()});let O=e=>{w.value=JSON.stringify(e.event,void 0,2),C.value=!0};return t(async()=>{await T(),D()}),_(()=>{E?.()}),(t,r)=>{let a=e(`el-option`),c=e(`el-select`),l=e(`el-button`),f=e(`el-space`),m=e(`el-card`),_=e(`el-table-column`),E=e(`el-table`),D=e(`el-drawer`);return n(),o(`div`,null,[d(m,{class:`block`},{default:v(()=>[d(f,null,{default:v(()=>[d(c,{modelValue:g.value,"onUpdate:modelValue":r[0]||=e=>g.value=e,placeholder:`全部类型`,style:{width:`8.75rem`},clearable:``},{default:v(()=>[d(a,{label:`message`,value:`message`}),d(a,{label:`notice`,value:`notice`}),d(a,{label:`request`,value:`request`}),d(a,{label:`meta`,value:`meta`}),d(a,{label:`other`,value:`other`})]),_:1},8,[`modelValue`]),d(c,{modelValue:x.value,"onUpdate:modelValue":r[1]||=e=>x.value=e,style:{width:`5.625rem`}},{default:v(()=>[d(a,{label:`实时`,value:`on`}),d(a,{label:`暂停`,value:`off`})]),_:1},8,[`modelValue`]),d(l,{type:`primary`,onClick:T},{default:v(()=>[...r[3]||=[s(`刷新`,-1)]]),_:1})]),_:1})]),_:1}),d(m,null,{default:v(()=>[d(E,{data:S.value,size:`small`,"max-height":`640`},{default:v(()=>[d(_,{label:`时间`,width:h(y)(170)},{default:v(({row:e})=>[s(i(h(u)(e.time)),1)]),_:1},8,[`width`]),d(_,{prop:`type`,label:`类型`,width:h(y)(100)},null,8,[`width`]),d(_,{prop:`summary`,label:`摘要`,"min-width":h(y)(240),"show-overflow-tooltip":``},null,8,[`min-width`]),d(_,{label:`详情`,width:h(y)(90)},{default:v(({row:e})=>[d(l,{size:`small`,onClick:t=>O(e)},{default:v(()=>[...r[4]||=[s(` 查看 `,-1)]]),_:1},8,[`onClick`])]),_:1},8,[`width`])]),_:1},8,[`data`])]),_:1}),d(D,{modelValue:C.value,"onUpdate:modelValue":r[2]||=e=>C.value=e,title:`事件详情`,size:`50%`},{default:v(()=>[p(`pre`,b,i(w.value),1)]),_:1},8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-200a56d6`]]);export{x as default};
@@ -0,0 +1 @@
1
+ .block[data-v-0e01a2ea]{margin-bottom:.75rem}.pager[data-v-0e01a2ea]{margin-top:.75rem}
@@ -0,0 +1 @@
1
+ import{Ai as e,Bi as t,Ci as n,Ei as r,Jr as i,Oi as a,Zr as o,_a as s,ai as c,ci as l,d as u,f as d,i as f,ii as p,ji as m,l as h,li as g,n as _,p as v,qi as y,ri as b,t as x,ta as S,ui as C,zi as w}from"./api-Bm2KUKXH.js";import{t as T}from"./use-ui-scale-DvdJkOwB.js";var E=50,D=d(C({__name:`KvView`,setup(d){let C=y([]),D=y(``),O=y(``),k=y([]),A=y(0),j=y(1),M=y(!1),N=y(!1),P=y(``),F=y(``),I=y(`create`),L=async()=>{if(D.value){M.value=!0;try{let e=(j.value-1)*E,t=new URLSearchParams({pluginId:D.value,limit:String(E),offset:String(e)});O.value&&t.set(`prefix`,O.value);let n=await _(`/api/kv?${t.toString()}`);k.value=n.items,A.value=n.total}catch(e){u(e)}finally{M.value=!1}}},R=e=>{j.value=e,L()},z=()=>{I.value=`create`,P.value=``,F.value=`null`,N.value=!0},B=e=>{I.value=`update`,P.value=e.key,F.value=JSON.stringify(e.value,void 0,2),N.value=!0},V=async()=>{let e;try{e=JSON.parse(F.value)}catch{v.error(`不是合法的 JSON`);return}try{await f(`/api/kv`,{pluginId:D.value,key:P.value,value:e}),N.value=!1,await L()}catch(e){u(e)}},H=async e=>{try{await x(`/api/kv?pluginId=${encodeURIComponent(D.value)}&key=${encodeURIComponent(e.key)}`),await L()}catch(e){u(e)}},U=e=>typeof e==`string`?e.length>120?e.slice(0,120)+`…`:e:JSON.stringify(e)?.slice(0,120)??``;return n(async()=>{try{C.value=await _(`/api/kv/plugins`),C.value.length>0&&(D.value=C.value[0]?.pluginId??``,await L())}catch(e){u(e)}}),(n,u)=>{let d=e(`el-option`),f=e(`el-select`),_=e(`el-card`),v=e(`el-input`),y=e(`el-button`),x=e(`el-space`),W=e(`el-table-column`),G=e(`el-table`),K=e(`el-pagination`),q=e(`el-form-item`),J=e(`el-form`),Y=e(`el-dialog`),X=m(`loading`);return r(),c(`div`,null,[g(_,{class:`block`},{default:w(()=>[g(f,{modelValue:D.value,"onUpdate:modelValue":u[0]||=e=>D.value=e,placeholder:`选择插件`,style:{width:`15rem`},onChange:L},{default:w(()=>[(r(!0),c(o,null,a(C.value,e=>(r(),b(d,{key:e.pluginId,label:`${e.pluginId} (${e.count})`,value:e.pluginId},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`])]),_:1}),D.value?(r(),b(_,{key:0},{default:w(()=>[g(x,{class:`block`},{default:w(()=>[g(v,{modelValue:O.value,"onUpdate:modelValue":u[1]||=e=>O.value=e,placeholder:`key 前缀过滤`,style:{width:`12.5rem`},onKeyup:i(L,[`enter`])},null,8,[`modelValue`]),g(y,{onClick:L},{default:w(()=>[...u[6]||=[l(`过滤`,-1)]]),_:1}),g(y,{type:`primary`,onClick:z},{default:w(()=>[...u[7]||=[l(`新增 KV`,-1)]]),_:1})]),_:1}),t((r(),b(G,{data:k.value,size:`small`},{default:w(()=>[g(W,{prop:`key`,label:`Key`,"min-width":S(T)(200),"show-overflow-tooltip":``},null,8,[`min-width`]),g(W,{label:`Value`,"min-width":S(T)(240),"show-overflow-tooltip":``},{default:w(({row:e})=>[l(s(U(e.value)),1)]),_:1},8,[`min-width`]),g(W,{label:`更新时间`,width:S(T)(180)},{default:w(({row:e})=>[l(s(S(h)(e.updatedAt)),1)]),_:1},8,[`width`]),g(W,{label:`操作`,width:S(T)(150)},{default:w(({row:e})=>[g(y,{size:`small`,onClick:t=>B(e)},{default:w(()=>[...u[8]||=[l(`编辑`,-1)]]),_:1},8,[`onClick`]),g(y,{size:`small`,type:`danger`,onClick:t=>H(e)},{default:w(()=>[...u[9]||=[l(`删除`,-1)]]),_:1},8,[`onClick`])]),_:1},8,[`width`])]),_:1},8,[`data`])),[[X,M.value]]),g(K,{class:`pager`,layout:`total, prev, pager, next`,total:A.value,"page-size":E,"current-page":j.value,onCurrentChange:R},null,8,[`total`,`current-page`])]),_:1})):p(``,!0),g(Y,{modelValue:N.value,"onUpdate:modelValue":u[5]||=e=>N.value=e,title:`KV 编辑`,width:`min(92vw, 35rem)`},{footer:w(()=>[g(y,{onClick:u[4]||=e=>N.value=!1},{default:w(()=>[...u[10]||=[l(`取消`,-1)]]),_:1}),g(y,{type:`primary`,onClick:V},{default:w(()=>[...u[11]||=[l(`保存`,-1)]]),_:1})]),default:w(()=>[g(J,{"label-width":`5rem`},{default:w(()=>[g(q,{label:`key`},{default:w(()=>[g(v,{modelValue:P.value,"onUpdate:modelValue":u[2]||=e=>P.value=e,disabled:I.value===`update`},null,8,[`modelValue`,`disabled`])]),_:1}),g(q,{label:`value (JSON)`},{default:w(()=>[g(v,{modelValue:F.value,"onUpdate:modelValue":u[3]||=e=>F.value=e,type:`textarea`,rows:6,spellcheck:`false`},null,8,[`modelValue`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-0e01a2ea`]]);export{D as default};
@@ -0,0 +1 @@
1
+ import{Ai as e,Ei as t,Jr as n,Yr as r,ai as i,ci as a,d as o,f as s,li as c,ni as l,qi as u,r as d,si as f,ui as p,zi as m}from"./api-Bm2KUKXH.js";import{n as h}from"./index-BjnuYVEl.js";var g={class:`login-page`},_=s(p({__name:`LoginView`,setup(s){let p=h(),_=u(``),v=u(``),y=u(!1),b=async()=>{if(!y.value){y.value=!0;try{await d(`/api/auth/login`,{username:_.value,password:v.value}),await p.push({name:`dashboard`})}catch(e){o(e)}finally{y.value=!1}}};return(o,s)=>{let u=e(`el-input`),d=e(`el-form-item`),p=e(`el-button`),h=e(`el-form`),x=e(`el-card`);return t(),i(`div`,g,[s[5]||=f(`<svg class="login-waves" viewBox="0 0 1440 900" preserveAspectRatio="xMidYMid slice" aria-hidden="true" data-v-a3fb53fb><path d="M-40 250 C 180 180, 360 320, 620 250 S 1080 180, 1480 260" data-v-a3fb53fb></path><path d="M-40 420 C 200 340, 420 480, 700 410 S 1120 330, 1480 430" data-v-a3fb53fb></path><path d="M-40 580 C 220 500, 400 640, 660 570 S 1100 490, 1480 590" data-v-a3fb53fb></path><path d="M-40 730 C 180 660, 380 790, 640 725 S 1080 650, 1480 740" data-v-a3fb53fb></path><path d="M-40 130 C 240 70, 440 190, 720 125 S 1120 40, 1480 140" data-v-a3fb53fb></path></svg>`,1),c(x,{class:`login-card`,"body-style":{padding:`2.25rem 2rem 2rem`}},{default:m(()=>[s[4]||=l(`div`,{class:`brand`},[l(`div`,{class:`logo`},`J`),l(`h2`,null,`JsBot 控制台`),l(`p`,null,`Tellus 管理后台`)],-1),c(h,{"label-position":`top`,size:`large`,onSubmit:s[2]||=r(()=>{},[`prevent`])},{default:m(()=>[c(d,{label:`用户名`},{default:m(()=>[c(u,{modelValue:_.value,"onUpdate:modelValue":s[0]||=e=>_.value=e,autocomplete:`username`},null,8,[`modelValue`])]),_:1}),c(d,{label:`密码`},{default:m(()=>[c(u,{modelValue:v.value,"onUpdate:modelValue":s[1]||=e=>v.value=e,type:`password`,autocomplete:`current-password`,"show-password":``,onKeyup:n(b,[`enter`])},null,8,[`modelValue`])]),_:1}),c(p,{type:`primary`,size:`large`,class:`submit`,loading:y.value,onClick:b},{default:m(()=>[...s[3]||=[a(` 登 录 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})])}}}),[[`__scopeId`,`data-v-a3fb53fb`]]);export{_ as default};
@@ -0,0 +1 @@
1
+ .login-page[data-v-a3fb53fb]{background:var(--app-bg);justify-content:center;align-items:center;height:100%;min-height:100%;display:flex;position:relative;overflow:hidden}.login-card[data-v-a3fb53fb]{z-index:1;background:var(--app-glass);-webkit-backdrop-filter:blur(1.125rem);backdrop-filter:blur(1.125rem);width:23.25rem;box-shadow:var(--card-shadow), 0 32px 80px -40px oklch(0% 0 0/.35);position:relative}.brand[data-v-a3fb53fb]{text-align:center;margin-bottom:1.625rem}.logo[data-v-a3fb53fb]{width:3.25rem;height:3.25rem;color:var(--app-accent-fg);background:linear-gradient(135deg,oklch(68.5% .155 230),oklch(56% .15 250));border-radius:.9375rem;justify-content:center;align-items:center;margin-bottom:1rem;font-size:1.375rem;font-weight:700;display:inline-flex;box-shadow:inset 0 1px oklch(100% 0 0/.22),0 12px 28px oklch(68.5% .155 230/.4)}.brand h2[data-v-a3fb53fb]{color:var(--app-text);letter-spacing:.02em;margin:0;font-size:1.125rem}.brand p[data-v-a3fb53fb]{color:var(--app-muted);margin:.375rem 0 0;font-size:.8125rem}.submit[data-v-a3fb53fb]{letter-spacing:.35em;width:100%;margin-top:.375rem;font-weight:600}
@@ -0,0 +1 @@
1
+ .term-content[data-v-21e2770a]{--app-bg:oklch(13% .012 250);--app-panel:oklch(17% .02 250);--app-panel-2:oklch(21% .02 250);--app-field:oklch(19% .015 250);--app-text:oklch(95% .01 240);--app-muted:oklch(65% .02 240);--app-border:oklch(27% .02 250);--app-border-strong:oklch(33% .022 250);--app-field-border:oklch(25% .02 250);--app-field-border-hover:oklch(35% .022 250);--app-accent:oklch(75% .14 230);--app-accent-fg:oklch(15% .02 250);--app-accent-soft:oklch(30% .06 230);--app-accent-ring:oklch(75% .14 230/.25);--app-ok:oklch(72% .15 160);--app-warn:oklch(80% .16 80);--app-danger:oklch(62% .2 27);--app-violet:oklch(74% .11 295);--app-log-info:oklch(75% .14 230);--app-log-success:oklch(72% .15 160);--app-log-warn:oklch(80% .16 80);--app-log-error:oklch(62% .2 27);--app-dot-off:oklch(40% .015 250);--card-shadow:0 1px 2px oklch(0% 0 0/.36), 0 16px 38px -24px oklch(0% 0 0/.72), inset 0 1px oklch(100% 0 0/.025);--app-pop-shadow:0 1px 2px oklch(0% 0 0/.4), 0 16px 40px -18px oklch(0% 0 0/.75);--el-bg-color:var(--app-panel);--el-bg-color-overlay:oklch(19% .018 250);--el-bg-color-page:var(--app-bg);--el-fill-color:var(--app-panel-2);--el-fill-color-light:oklch(23% .02 250);--el-fill-color-lighter:oklch(25% .02 250);--el-fill-color-blank:var(--app-panel);--el-text-color-primary:var(--app-text);--el-text-color-regular:var(--app-text);--el-text-color-secondary:var(--app-muted);--el-text-color-placeholder:color-mix(in oklab, var(--app-muted) 72%, transparent);--el-border-color:var(--app-border);--el-border-color-lighter:color-mix(in srgb, var(--app-border) 78%, transparent);--el-border-color-extra-light:color-mix(in srgb, var(--app-border) 62%, transparent);border:1px solid var(--app-border);border-radius:calc(var(--app-radius) + .125rem);background:var(--app-bg);height:calc(100vh - 12rem);min-height:26.25rem;box-shadow:var(--card-shadow);scrollbar-gutter:stable both-edges;flex-direction:column;display:flex;position:relative;overflow:hidden}.container[data-v-21e2770a]{flex-direction:column;display:flex}.term-bar[data-v-21e2770a]{border-bottom:1px solid var(--app-border);background:var(--app-panel);flex:none;align-items:center;gap:.625rem;padding:.5rem .75rem;display:flex}.term-traffic[data-v-21e2770a]{flex:none;gap:.375rem;display:flex}.dot[data-v-21e2770a]{background:var(--app-dot-off);opacity:.55;border-radius:62.4375rem;width:.625rem;height:.625rem}.term-title[data-v-21e2770a]{color:var(--app-text);font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;font-size:.78125rem;font-weight:600}.term-title .dim[data-v-21e2770a]{color:var(--app-muted);font-weight:400}.term-spacer[data-v-21e2770a]{flex:1}.ctl[data-v-21e2770a]{flex:none;width:8rem}.sel-level[data-v-21e2770a]{width:6.75rem}.sel-live[data-v-21e2770a]{width:6.5rem}.refresh[data-v-21e2770a]{width:auto}.term-body[data-v-21e2770a]{font-variant-numeric:tabular-nums;scrollbar-color:color-mix(in oklab, var(--app-text) 22%, transparent) transparent;flex:1;padding:.625rem .875rem .875rem;font-family:SF Mono,ui-monospace,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:.75rem;line-height:1.7;position:relative;overflow-y:auto}.term-empty[data-v-21e2770a]{text-align:center;color:var(--app-muted);padding:3rem 0;font-size:.75rem}.log-row[data-v-21e2770a]{content-visibility:auto;contain-intrinsic-size:auto 1.5rem;white-space:pre-wrap;word-break:break-word;border-radius:.375rem;align-items:baseline;gap:.625rem;padding:0 .375rem;display:flex}.log-row[data-v-21e2770a]:hover{background:color-mix(in oklab, var(--app-accent) 6%, transparent)}.lt[data-v-21e2770a]{color:color-mix(in oklab, var(--app-muted) 70%, transparent);flex:none}.lv[data-v-21e2770a]{letter-spacing:.02em;flex:none;width:3.25rem;font-size:.6875rem;font-weight:600}.ls[data-v-21e2770a]{color:color-mix(in oklab, var(--app-muted) 85%, transparent);flex:none}.lm[data-v-21e2770a]{min-width:0;color:var(--app-text)}.l-debug .lv[data-v-21e2770a],.l-debug .lm[data-v-21e2770a]{color:color-mix(in oklab, var(--app-muted) 78%, transparent)}.l-info .lv[data-v-21e2770a]{color:var(--app-log-info)}.l-warn .lv[data-v-21e2770a]{color:var(--app-log-warn)}.l-error .lv[data-v-21e2770a],.l-error .lm[data-v-21e2770a]{color:var(--app-log-error)}.log-fade-both[data-v-21e2770a]{-webkit-mask-image:linear-gradient(#0000 0,#fff 12px calc(100% - 16px),#0000 100%);mask-image:linear-gradient(#0000 0,#fff 12px calc(100% - 16px),#0000 100%)}.rowIn[data-v-21e2770a]{animation:.2s cubic-bezier(.16,1,.3,1) terminal-row-in-21e2770a}@keyframes terminal-row-in-21e2770a{0%{opacity:0;transform:translateY(.375rem)}to{opacity:1;transform:translateY(0)}}.jump-latest[data-v-21e2770a]{border:1px solid color-mix(in oklab, var(--app-border) 74%, transparent);background:var(--el-bg-color-overlay);color:var(--app-accent);box-shadow:var(--app-pop-shadow);cursor:pointer;border-radius:62.4375rem;padding:.375rem .875rem;font-size:.75rem;font-weight:500;transition:opacity .15s;position:absolute;bottom:.875rem;left:50%;translate:-50%}.jump-latest[data-v-21e2770a]:hover{border-color:color-mix(in oklab, var(--app-accent) 30%, transparent)}.pill-enter-active[data-v-21e2770a],.pill-leave-active[data-v-21e2770a]{transition:opacity .15s,translate .15s}.pill-enter-from[data-v-21e2770a],.pill-leave-to[data-v-21e2770a]{opacity:0;translate:-50% .375rem}@media (prefers-reduced-motion:reduce){.rowIn[data-v-21e2770a]{animation-duration:.01ms}}
@@ -0,0 +1 @@
1
+ import{Ai as e,Br as t,Ci as n,Ei as r,Jr as i,Li as a,Oi as o,Zr as s,_a as c,_i as l,a as u,ai as d,ci as f,d as p,f as m,ii as h,li as g,ma as _,n as v,ni as y,qi as b,ta as x,ti as S,ui as C,ut as w,wi as T,zi as E}from"./api-Bm2KUKXH.js";var D={class:`term container`},O={class:`term-content`},k={class:`term-bar`},A={class:`term-title`},ee={class:`dim`},te={key:0,class:`term-empty`},ne={class:`lt`},re={class:`lv`},j={key:0,class:`ls`},M={class:`lm`},N=500,P=30,F=m(C({__name:`LogsView`,setup(m){let C=b(``),F=b(``),I=b(``),L=b(`on`),R=b([]),z=b(null),B=b(!0),V=e=>({key:`${e.time}|${e.scope}|${e.level}|${e.message}`,time:e.time,level:e.level,scope:e.scope,text:e.message+(e.args.length>0?` `+e.args.join(` `):``),fresh:!1}),H=S(()=>R.value.slice(-500)),U=S(()=>Math.max(0,R.value.length-N)),W=()=>{let e=new URLSearchParams({limit:`500`});return C.value&&e.set(`level`,C.value),F.value&&e.set(`scope`,F.value),I.value&&e.set(`query`,I.value),`/api/logs?${e.toString()}`},G=e=>Number.isNaN(e)?`--:--:--`:new Date(e).toTimeString().slice(0,8),K=()=>{let e=z.value;e!==null&&(e.scrollTop=e.scrollHeight)},q=()=>{let e=z.value;return e===null||e.scrollHeight-e.scrollTop-e.clientHeight<32},J=()=>{B.value=q()},Y=()=>{B.value=!0,K()},X=e=>{let t=new Set(R.value.map(e=>e.key)),n=new Map,r=e.slice(-500).map(e=>{let t=V(e),r=n.get(t.key)??0;return n.set(t.key,r+1),t.key=r>0?`${t.key}#${r}`:t.key,t}),i=r.length;for(let e=r.length-1;e>=0;--e)if(t.has(r[e]?.key??``)){i=e+1;break}for(let e=0;e<r.length;e+=1)r[e]={...r[e],fresh:e>=i&&e>=r.length-P};R.value=r,B.value&&l(K)},Z=async()=>{try{let e=await v(W());X(e)}catch(e){p(e)}},Q=null,$=()=>{Q?.(),Q=null,L.value===`on`&&(Q=u(`/api/logs/stream`,()=>{v(W()).then(e=>{X(e)}).catch(()=>{})}))};return a(L,$),n(async()=>{await Z(),K(),$()}),T(()=>{Q?.()}),(n,a)=>{let l=e(`el-option`),u=e(`el-select`),p=e(`el-input`),m=e(`el-button`);return r(),d(`div`,D,[y(`section`,O,[y(`header`,k,[a[6]||=y(`div`,{class:`term-traffic`},[y(`span`,{class:`dot`}),y(`span`,{class:`dot`}),y(`span`,{class:`dot`})],-1),y(`span`,A,[a[4]||=f(` bot://console`,-1),y(`span`,ee,` · `+c(L.value===`on`?`streaming`:`paused`),1)]),a[7]||=y(`span`,{class:`term-spacer`},null,-1),g(u,{modelValue:C.value,"onUpdate:modelValue":a[0]||=e=>C.value=e,placeholder:`级别`,clearable:``,class:`ctl sel-level`,onChange:Z},{default:E(()=>[g(l,{label:`all`,value:``}),g(l,{label:`debug`,value:`debug`}),g(l,{label:`info`,value:`info`}),g(l,{label:`warn`,value:`warn`}),g(l,{label:`error`,value:`error`})]),_:1},8,[`modelValue`]),g(p,{modelValue:F.value,"onUpdate:modelValue":a[1]||=e=>F.value=e,placeholder:`scope`,class:`ctl`,onKeyup:i(Z,[`enter`])},null,8,[`modelValue`]),g(p,{modelValue:I.value,"onUpdate:modelValue":a[2]||=e=>I.value=e,placeholder:`关键字`,class:`ctl`,onKeyup:i(Z,[`enter`])},null,8,[`modelValue`]),g(u,{modelValue:L.value,"onUpdate:modelValue":a[3]||=e=>L.value=e,class:`ctl sel-live`},{default:E(()=>[g(l,{label:`stream`,value:`on`}),g(l,{label:`paused`,value:`off`})]),_:1},8,[`modelValue`]),g(m,{class:`ctl refresh`,text:``,icon:x(w),onClick:Z},{default:E(()=>[...a[5]||=[f(` 查询 `,-1)]]),_:1},8,[`icon`])]),y(`main`,{ref_key:`scrollEl`,ref:z,class:`term-body log-fade-both`,onScroll:J},[R.value.length===0?(r(),d(`div`,te,` — 暂无日志:试试调整筛选或点击「查询」 — `)):h(``,!0),(r(!0),d(s,null,o(H.value,(e,t)=>(r(),d(`div`,{key:e.key,class:_([`log-row`,[`l-${e.level}`,e.fresh?`rowIn`:``]])},[y(`span`,ne,c(G(e.time)),1),y(`span`,re,c(e.level.toUpperCase()),1),e.scope?(r(),d(`span`,j,`[`+c(e.scope)+`]`,1)):h(``,!0),y(`span`,M,c(e.text),1)],2))),128))],544),g(t,{name:`pill`},{default:E(()=>[!B.value&&R.value.length>0?(r(),d(`button`,{key:0,class:`jump-latest`,onClick:Y},` ↓ 回到最新`+c(U.value>0?`(+${U.value})`:``),1)):h(``,!0)]),_:1})])])}}}),[[`__scopeId`,`data-v-21e2770a`]]);export{F as default};
@@ -0,0 +1 @@
1
+ .panel[data-v-f65096cc]{flex-direction:column;gap:1.25rem;display:flex}.group[data-v-f65096cc]{flex-direction:column;gap:.625rem;display:flex}.group h4[data-v-f65096cc]{color:var(--app-muted);letter-spacing:.02em;margin:0;font-size:.78125rem;font-weight:600}.slider-row[data-v-f65096cc]{justify-content:space-between;align-items:center;display:flex}.slider-value[data-v-f65096cc]{font-variant-numeric:tabular-nums;color:var(--app-accent);font-size:.78125rem}.group .el-switch[data-v-f65096cc]{width:fit-content}.reset[data-v-f65096cc]{color:var(--app-muted);align-self:flex-start}.layout[data-v-b645570c]{background:var(--app-bg);height:100%}.sidebar[data-v-b645570c]{background:var(--app-side-bg);border-right:1px solid var(--app-border);color:var(--app-muted);flex-direction:column;transition:background .2s;display:flex}.brand[data-v-b645570c]{align-items:center;gap:.75rem;padding:1.375rem 1.25rem 1.125rem;display:flex}.logo[data-v-b645570c]{color:#fff;width:2.25rem;height:2.25rem;box-shadow:0 8px 20px color-mix(in oklab, var(--app-accent) 35%, transparent);background:linear-gradient(135deg,oklch(68.5% .155 230),oklch(56% .15 250));border-radius:.625rem;flex:none;justify-content:center;align-items:center;font-weight:700;display:flex}.brand-text h2[data-v-b645570c]{color:var(--app-text);letter-spacing:.02em;margin:0;font-size:.90625rem}.brand-text p[data-v-b645570c]{color:var(--app-muted);margin:.1875rem 0 0;font-size:.6875rem}.nav[data-v-b645570c]{flex-direction:column;flex:1;gap:.125rem;margin-top:.25rem;padding:.375rem .75rem;display:flex;overflow-y:auto}.nav-item[data-v-b645570c]{border-radius:.5625rem;align-items:center;gap:.625rem;padding:.5625rem .8125rem;font-size:.84375rem;text-decoration:none;transition:background .14s,color .14s;display:flex;position:relative;color:var(--app-muted)!important}.nav-item[data-v-b645570c]:hover{background:var(--app-nav-hover);color:var(--app-text)!important}.nav-item.active[data-v-b645570c]{background:color-mix(in oklab, var(--app-accent) 12%, transparent);color:var(--app-accent)!important}.nav-item.active[data-v-b645570c]:before{content:"";background:linear-gradient(oklch(68.5% .155 230),oklch(56% .15 250));border-radius:62.4375rem;width:.1875rem;position:absolute;top:20%;bottom:20%;left:-.75rem}.sidebar-footer[data-v-b645570c]{border-top:1px solid var(--app-border);align-items:center;gap:.5rem;padding:.875rem 1.25rem;font-size:.75rem;display:flex}.status-dot[data-v-b645570c]{border-radius:62.4375rem;width:.5rem;height:.5rem}.status-dot.ok[data-v-b645570c]{background:var(--app-ok);box-shadow:0 0 10px color-mix(in oklab, var(--app-ok) 70%, transparent)}.status-dot.off[data-v-b645570c]{background:var(--app-dot-off)}.header[data-v-b645570c]{background:var(--app-glass);border-bottom:1px solid var(--app-border);-webkit-backdrop-filter:blur(.75rem);backdrop-filter:blur(.75rem);align-items:center;height:3.625rem;padding:0 1.5rem;display:flex}.title[data-v-b645570c]{color:var(--app-text);font-size:.90625rem;font-weight:600}.spacer[data-v-b645570c]{flex:1}.theme-toggle[data-v-b645570c]{color:var(--app-muted);margin-right:.375rem}.user[data-v-b645570c]{color:var(--app-text);cursor:pointer;border-radius:62.4375rem;align-items:center;gap:.5625rem;padding:.25rem .375rem .25rem .25rem;transition:background .14s;display:flex}.user[data-v-b645570c]:hover{background:var(--app-nav-hover)}.avatar[data-v-b645570c]{color:#fff;background:linear-gradient(135deg,oklch(68.5% .155 230),oklch(56% .15 250));border-radius:62.4375rem;justify-content:center;align-items:center;width:1.75rem;height:1.75rem;font-size:.78125rem;font-weight:700;display:flex}.username[data-v-b645570c]{font-size:.8125rem}.main[data-v-b645570c]{padding:1.375rem 1.5rem}
@@ -0,0 +1 @@
1
+ import{Ai as e,Br as t,Ci as n,Ei as r,Fi as i,G as a,Gi as o,L as s,Li as c,M as l,Mi as u,N as d,Oi as f,Y as p,Zr as m,_a as h,ai as g,bt as _,c as v,ci as y,f as b,ht as x,ii as S,it as C,j as w,li as T,ma as E,n as D,ni as O,o as k,qi as A,r as j,ri as M,rt as ee,ta as N,ti as P,tt as te,ui as F,wi as I,zi as L}from"./api-Bm2KUKXH.js";import{a as R,c as z,i as B,n as V,o as H,r as U,s as ne,t as re}from"./index-BjnuYVEl.js";var W={class:`panel`},G={class:`group`},K={key:0,class:`group`},q={class:`group`},J={class:`group`},Y={class:`group`},X={class:`slider-row`},Z={class:`slider-value`},Q={class:`group`},$={class:`slider-row`},ie={class:`slider-value`},ae={class:`group`},oe=b(F({__name:`AppearanceDrawer`,props:{modelValue:{type:Boolean,required:!0},modelModifiers:{}},emits:[`update:modelValue`],setup(t){let n=i(t,`modelValue`),a=B(),s=o({modeKey:a.mode??`system`,intensity:a.darkIntensity??`soft`,density:a.density??`cozy`,sidebarStyle:a.sidebarStyle??`follow`,uiScale:a.uiScale??1,radius:a.radius??.75,highContrast:a.highContrast===!0,reduceMotion:a.reduceMotion===!0,disableMotion:a.disableMotion===!0}),l=P(()=>s.modeKey===`light`);c(n,e=>{if(!e)return;let t=B();s.modeKey=t.mode??`system`,s.intensity=t.darkIntensity??`soft`,s.density=t.density??`cozy`,s.sidebarStyle=t.sidebarStyle??`follow`,s.uiScale=t.uiScale??1,s.radius=t.radius??.75,s.highContrast=t.highContrast===!0,s.reduceMotion=t.reduceMotion===!0,s.disableMotion=t.disableMotion===!0});let u=[{label:`跟随系统`,value:`system`},{label:`亮色`,value:`light`},{label:`暗色`,value:`dark`}],d=[{label:`柔和`,value:`soft`},{label:`纯黑`,value:`black`}],f=[{label:`默认`,value:`cozy`},{label:`紧凑`,value:`compact`}],p=[{label:`跟随画布`,value:`follow`},{label:`独立面板`,value:`panel`},{label:`带品牌色`,value:`accent`}],m={.5:`50%`,1:`100%`,2:`200%`},_=()=>{H({mode:s.modeKey===`system`?void 0:s.modeKey})},v=()=>{H({darkIntensity:s.modeKey===`dark`?s.intensity:void 0})},b=()=>{H({density:s.density})},x=()=>{H({sidebarStyle:s.sidebarStyle})},C=()=>{H({uiScale:s.uiScale})},w=()=>{H({radius:s.radius})},E=()=>{H({mode:s.modeKey===`system`?void 0:s.modeKey,darkIntensity:s.modeKey===`dark`?s.intensity:void 0,density:s.density,sidebarStyle:s.sidebarStyle,uiScale:s.uiScale,radius:s.radius,highContrast:s.highContrast,reduceMotion:s.reduceMotion,disableMotion:s.disableMotion})},D=()=>{R()};return(t,i)=>{let a=e(`el-segmented`),o=e(`el-slider`),c=e(`el-switch`),k=e(`el-button`),A=e(`el-drawer`);return r(),M(A,{modelValue:n.value,"onUpdate:modelValue":i[9]||=e=>n.value=e,title:`外观`,size:`min(94vw, 21rem)`,class:`appearance-drawer`,"append-to-body":!0},{default:L(()=>[O(`div`,W,[O(`section`,G,[i[10]||=O(`h4`,null,`模式`,-1),T(a,{modelValue:s.modeKey,"onUpdate:modelValue":i[0]||=e=>s.modeKey=e,options:u,block:``,onChange:_},null,8,[`modelValue`])]),l.value?S(``,!0):(r(),g(`section`,K,[i[11]||=O(`h4`,null,`暗色强度`,-1),T(a,{modelValue:s.intensity,"onUpdate:modelValue":i[1]||=e=>s.intensity=e,options:d,block:``,onChange:v},null,8,[`modelValue`])])),O(`section`,q,[i[12]||=O(`h4`,null,`密度`,-1),T(a,{modelValue:s.density,"onUpdate:modelValue":i[2]||=e=>s.density=e,options:f,block:``,onChange:b},null,8,[`modelValue`])]),O(`section`,J,[i[13]||=O(`h4`,null,`侧边栏`,-1),T(a,{modelValue:s.sidebarStyle,"onUpdate:modelValue":i[3]||=e=>s.sidebarStyle=e,options:p,block:``,onChange:x},null,8,[`modelValue`])]),O(`section`,Y,[O(`div`,X,[i[14]||=O(`h4`,null,`界面缩放`,-1),O(`span`,Z,h(Math.round(s.uiScale*100))+`% · `+h(Math.round(16*s.uiScale))+`px `,1)]),T(o,{modelValue:s.uiScale,"onUpdate:modelValue":i[4]||=e=>s.uiScale=e,min:.5,max:2,step:.05,marks:m,onInput:C,onChange:E},null,8,[`modelValue`])]),O(`section`,Q,[O(`div`,$,[i[15]||=O(`h4`,null,`圆角`,-1),O(`span`,ie,h(s.radius.toFixed(2))+`rem `,1)]),T(o,{modelValue:s.radius,"onUpdate:modelValue":i[5]||=e=>s.radius=e,min:0,max:2,step:.125,onInput:w},null,8,[`modelValue`])]),O(`section`,ae,[T(c,{modelValue:s.highContrast,"onUpdate:modelValue":i[6]||=e=>s.highContrast=e,"active-text":`高对比度`,onChange:E},null,8,[`modelValue`]),T(c,{modelValue:s.reduceMotion,"onUpdate:modelValue":i[7]||=e=>s.reduceMotion=e,"active-text":`减少动效`,onChange:E},null,8,[`modelValue`]),T(c,{modelValue:s.disableMotion,"onUpdate:modelValue":i[8]||=e=>s.disableMotion=e,"active-text":`关闭全部动效`,onChange:E},null,8,[`modelValue`])]),T(k,{class:`reset`,text:``,onClick:D},{default:L(()=>[...i[16]||=[y(` 恢复默认外观 `,-1)]]),_:1})])]),_:1},8,[`modelValue`])}}}),[[`__scopeId`,`data-v-f65096cc`]]),se={class:`brand`},ce={class:`brand-text`},le={class:`nav`},ue={class:`sidebar-footer`},de={class:`title`},fe={class:`user`,"data-cursor-target":``},pe={class:`avatar`},me={class:`username`},he=b(F({__name:`MainLayout`,setup(i){let o=re(),c=V(),b=[{key:`dashboard`,label:`概览`,icon:ee},{key:`sessions`,label:`会话`,icon:s},{key:`plugins`,label:`插件`,icon:l},{key:`config`,label:`配置`,icon:x},{key:`kv`,label:`KV 存储`,icon:a},{key:`logs`,label:`日志`,icon:p},{key:`events`,label:`事件`,icon:w},{key:`actions`,label:`调试 Action`,icon:te}],S={dashboard:`概览`,sessions:`会话`,plugins:`插件`,config:`配置`,kv:`KV 存储`,logs:`日志`,events:`事件`,actions:`调试 Action`},F=A(``),R=A(`0.0.0`),B=A(!1),H=A(U()),W=A(!1),G=e=>{H.value=z({x:e.clientX,y:e.clientY})},K=()=>{H.value=U()},q=null,J=P(()=>S[o.name]??S[o.path]??`JsBot`),Y=P(()=>F.value?F.value.slice(0,1).toUpperCase():`?`),X=null;n(()=>{D(`/api/auth/me`).then(e=>{F.value=e.username}),Z(),X=setInterval(()=>void Z(),1e4),q=ne(K),H.value=U()}),I(()=>{X!==null&&clearInterval(X),q!==null&&q()});let Z=async()=>{try{let e=await v();R.value=e.version,B.value=e.runtime?.connected??!1}catch{B.value=!1}},Q=e=>{e===`logout`&&$()},$=async()=>{try{await j(`/api/auth/logout`)}catch(e){console.warn(`logout failed:`,k(e))}await c.push({name:`login`})};return(n,i)=>{let a=e(`el-icon`),s=e(`router-link`),c=e(`el-aside`),l=e(`el-button`),p=e(`el-tooltip`),v=e(`el-dropdown-item`),x=e(`el-dropdown-menu`),S=e(`el-dropdown`),w=e(`el-header`),D=e(`router-view`),k=e(`el-main`),A=e(`el-container`);return r(),M(A,{class:`layout`},{default:L(()=>[T(c,{width:`14.5rem`,class:`sidebar`},{default:L(()=>[O(`div`,se,[i[4]||=O(`div`,{class:`logo`},`J`,-1),O(`div`,ce,[i[3]||=O(`h2`,null,`JsBot 控制台`,-1),O(`p`,null,`Tellus · `+h(N(R)),1)])]),O(`nav`,le,[(r(),g(m,null,f(b,e=>T(s,{key:e.key,to:{name:e.key},class:E([`nav-item`,{active:N(o).name===e.key}])},{default:L(()=>[T(a,{size:`1.0625rem`},{default:L(()=>[(r(),M(u(e.icon)))]),_:2},1024),O(`span`,null,h(e.label),1)]),_:2},1032,[`to`,`class`])),64))]),O(`div`,ue,[O(`span`,{class:E([`status-dot`,N(B)?`ok`:`off`])},null,2),O(`span`,null,h(N(B)?`运行时在线`:`运行时离线`),1)])]),_:1}),T(A,null,{default:L(()=>[T(w,{class:`header`},{default:L(()=>[O(`span`,de,h(J.value),1),i[6]||=O(`span`,{class:`spacer`},null,-1),T(p,{content:H.value?`切换到亮色模式`:`切换到暗色模式`,placement:`bottom`},{default:L(()=>[T(l,{text:``,circle:``,class:`theme-toggle`,onClick:i[0]||=e=>G(e)},{default:L(()=>[T(a,{size:`1.0625rem`},{default:L(()=>[H.value?(r(),M(N(_),{key:0})):(r(),M(N(C),{key:1}))]),_:1})]),_:1})]),_:1},8,[`content`]),T(p,{content:`外观设置`,placement:`bottom`},{default:L(()=>[T(l,{text:``,circle:``,class:`theme-toggle`,onClick:i[1]||=e=>W.value=!0},{default:L(()=>[T(a,{size:`1.0625rem`},{default:L(()=>[T(N(d))]),_:1})]),_:1})]),_:1}),T(S,{trigger:`click`,onCommand:Q},{dropdown:L(()=>[T(x,null,{default:L(()=>[T(v,{command:`logout`},{default:L(()=>[...i[5]||=[y(` 退出登录 `,-1)]]),_:1})]),_:1})]),default:L(()=>[O(`span`,fe,[O(`span`,pe,h(Y.value),1),O(`span`,me,h(N(F)),1)])]),_:1})]),_:1}),T(k,{class:`main`},{default:L(()=>[T(D,null,{default:L(({Component:e})=>[T(t,{name:`route-fade`,mode:`out-in`},{default:L(()=>[(r(),M(u(e)))]),_:2},1024)]),_:1})]),_:1})]),_:1}),T(oe,{modelValue:W.value,"onUpdate:modelValue":i[2]||=e=>W.value=e},null,8,[`modelValue`])]),_:1})}}}),[[`__scopeId`,`data-v-b645570c`]]);export{he as default};
@@ -0,0 +1 @@
1
+ import{Ai as e,Bi as t,Ci as n,Ei as r,Gi as i,Li as a,Oi as o,Zr as s,_a as c,ai as l,ci as u,d,f,i as p,ii as m,ji as h,li as g,ma as _,n as v,ni as y,p as b,qi as x,r as S,ri as C,ta as w,ti as T,ui as E,wi as D,zi as O}from"./api-Bm2KUKXH.js";import{t as k}from"./use-ui-scale-DvdJkOwB.js";function A(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function j(e){return JSON.parse(JSON.stringify(e))}function M(e){let{type:t}=e;return Array.isArray(t)?t:typeof t==`string`?[t]:e.properties===void 0?[]:[`object`]}function N(e){return Object.prototype.hasOwnProperty.call(e,`const`)?[e.const]:Array.isArray(e.enum)?e.enum:null}function P(e){if(e.$ref!==void 0)return`json`;let t=N(e);if(t!==null)return t.every(e=>e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)?`enum`:`json`;if(e.anyOf!==void 0||e.oneOf!==void 0||e.allOf!==void 0)return`json`;let n=M(e).filter(e=>e!==`null`);if(n.length!==1)return`json`;let[r]=n;return r===`object`?e.properties===void 0?e.additionalProperties!==void 0&&typeof e.additionalProperties==`object`?`record`:`object`:e.additionalProperties!==void 0&&typeof e.additionalProperties==`object`?`json`:`object`:r===`array`?`array`:r===`string`?`string`:r===`number`||r===`integer`?r:r===`boolean`?`boolean`:`json`}function F(e){return e!==null&&P(e)===`object`}function I(e,t){if(e==null||(t===void 0&&e.default!==void 0&&(t=j(e.default)),P(e)!==`object`||!A(t)))return t;for(let[n,r]of Object.entries(e.properties??{}))t[n]===void 0?r.default!==void 0&&(t[n]=j(r.default)):t[n]=I(r,t[n]);return t}function L(e,t){return e===`null`?t===null:e===`array`?Array.isArray(t):e===`object`?A(t):e===`integer`?Number.isInteger(t):e===`number`?typeof t==`number`&&Number.isFinite(t):e===`string`?typeof t==`string`:e!==`boolean`||typeof t==`boolean`}function R(e){return e.length>0?e:`<root>`}function z(e,t,n,r){if(e==null||t===void 0||e.$ref!==void 0)return;let i=M(e);if(i.length>0&&!i.some(e=>L(e,t))){r.push({path:R(n),message:`类型应为 ${i.join(` | `)}`});return}let a=N(e);if(a!==null){let e=JSON.stringify(t);a.some(t=>JSON.stringify(t)===e)||r.push({path:R(n),message:`可选值为 ${a.map(e=>JSON.stringify(e)).join(`, `)}`})}else if(Array.isArray(t))e.minItems!==void 0&&t.length<e.minItems&&r.push({path:R(n),message:`至少需要 ${e.minItems} 项`}),e.maxItems!==void 0&&t.length>e.maxItems&&r.push({path:R(n),message:`最多允许 ${e.maxItems} 项`}),e.items!==void 0&&!Array.isArray(e.items)&&t.forEach((t,i)=>{z(e.items,t,`${n}[${i}]`,r)});else if(A(t)){let i=e.properties??{};for(let i of e.required??[])t[i]===void 0&&r.push({path:R(n.length>0?`${n}.${i}`:i),message:`必填项`});for(let[a,o]of Object.entries(t)){let t=n.length>0?`${n}.${a}`:a,s=i[a];s===void 0?e.additionalProperties===!1?r.push({path:t,message:`Schema 中不存在该字段`}):e.additionalProperties!==void 0&&typeof e.additionalProperties==`object`&&z(e.additionalProperties,o,t,r):z(s,o,t,r)}}else typeof t==`string`?(e.minLength!==void 0&&t.length<e.minLength&&r.push({path:R(n),message:`长度至少为 ${e.minLength}`}),e.maxLength!==void 0&&t.length>e.maxLength&&r.push({path:R(n),message:`长度最多为 ${e.maxLength}`})):typeof t==`number`&&(e.minimum!==void 0&&t<e.minimum&&r.push({path:R(n),message:`不能小于 ${e.minimum}`}),e.maximum!==void 0&&t>e.maximum&&r.push({path:R(n),message:`不能大于 ${e.maximum}`}),e.multipleOf!==void 0&&e.multipleOf>0&&Math.abs(t/e.multipleOf-Math.round(t/e.multipleOf))>2**-52*100&&r.push({path:R(n),message:`必须是 ${e.multipleOf} 的倍数`}))}var B={key:0,class:`object-head`},V={class:`object-label`},H={key:0,class:`req`},U={key:0,class:`desc`},W={class:`object-body`},G={key:0,class:`empty`},K={key:1,class:`schema-field`},q={class:`field-label`},J={key:0,class:`req`},Y={class:`field-kind`},ee={key:5,class:`desc`},te={key:6,class:`field-error`},X=f(E({__name:`SchemaField`,props:{schema:{},name:{},path:{},required:{type:Boolean,default:!1},modelValue:{default:void 0},depth:{default:0},reportInvalid:{type:Function,default:void 0}},emits:[`update:modelValue`],setup(t,{emit:n}){let i=t,d=n,f=T(()=>P(i.schema)),p=T(()=>i.schema.properties??{}),h=T(()=>new Set(i.schema.required??[])),g=T(()=>i.schema.title??i.name),v={object:`对象`,record:`键值对`,array:`数组`,string:`字符串`,number:`数字`,integer:`整数`,boolean:`开关`,enum:`枚举`,json:`JSON`},b=T(()=>v[f.value]),S=T(()=>A(i.modelValue)?i.modelValue:{}),w=e=>i.path.length>0?`${i.path}.${e}`:e,E=(e,t)=>{let n={...S.value};t===void 0?delete n[e]:n[e]=t,k(n)},k=e=>{d(`update:modelValue`,e)},j=T(()=>N(i.schema)??[]),M=e=>e===null?`null`:typeof e==`string`?e:JSON.stringify(e),F=T(()=>typeof i.modelValue==`number`?i.modelValue:void 0),I=T(()=>i.schema.multipleOf===void 0?f.value===`integer`?1:.1:i.schema.multipleOf),L=T(()=>typeof i.modelValue==`string`?i.modelValue:i.modelValue===null||i.modelValue===void 0?``:String(i.modelValue)),R=T(()=>f.value===`array`?`[]`:f.value===`record`?`{}`:`JSON 值`),z=T(()=>f.value===`json`||f.value===`array`||f.value===`record`),X=e=>{if(e===void 0)return``;try{return JSON.stringify(e,null,2)}catch{return``}},Z=x(``),Q=x(``),$=``,ne=e=>{let t=X(e);t!==$&&($=t,Z.value=t,Q.value=``)};a([()=>i.modelValue,()=>i.schema],()=>{z.value&&ne(i.modelValue)},{immediate:!0});let re=e=>{if(e.trim().length===0)Q.value=``,$=``,k(void 0);else try{let t=JSON.parse(e);Q.value=``,$=X(t),k(t)}catch{Q.value=`JSON 格式错误`}};return a([Q,()=>i.path,z],()=>{z.value?i.reportInvalid?.(i.path,Q.value||null):i.reportInvalid?.(i.path,null)},{immediate:!0}),D(()=>{i.reportInvalid?.(i.path,null)}),(n,i)=>{let a=e(`SchemaField`,!0),d=e(`el-switch`),v=e(`el-option`),x=e(`el-select`),T=e(`el-input-number`),D=e(`el-input`);return f.value===`object`?(r(),l(`div`,{key:0,class:_([`schema-object`,{nested:t.depth>0}])},[t.depth>0?(r(),l(`div`,B,[y(`span`,V,[u(c(g.value)+` `,1),t.required?(r(),l(`span`,H,`*`)):m(``,!0)]),t.schema.description?(r(),l(`span`,U,c(t.schema.description),1)):m(``,!0)])):m(``,!0),y(`div`,W,[(r(!0),l(s,null,o(p.value,(e,n)=>(r(),C(a,{key:n,name:String(n),path:w(String(n)),schema:e,required:h.value.has(String(n)),"model-value":S.value[String(n)],depth:t.depth+1,"report-invalid":t.reportInvalid,"onUpdate:modelValue":e=>E(String(n),e)},null,8,[`name`,`path`,`schema`,`required`,`model-value`,`depth`,`report-invalid`,`onUpdate:modelValue`]))),128)),Object.keys(p.value).length===0?(r(),l(`p`,G,` 没有可配置项 `)):m(``,!0)])],2)):(r(),l(`div`,K,[y(`label`,q,[y(`span`,null,[u(c(g.value)+` `,1),t.required?(r(),l(`span`,J,`*`)):m(``,!0)]),y(`span`,Y,c(b.value),1)]),f.value===`boolean`?(r(),C(d,{key:0,"model-value":t.modelValue===!0,"onUpdate:modelValue":i[0]||=e=>k(!!e)},null,8,[`model-value`])):f.value===`enum`?(r(),C(x,{key:1,"model-value":t.modelValue,class:`enum-select`,"onUpdate:modelValue":k},{default:O(()=>[(r(!0),l(s,null,o(j.value,(e,t)=>(r(),C(v,{key:t,label:M(e),value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`model-value`])):f.value===`number`||f.value===`integer`?(r(),C(T,{key:2,"model-value":F.value,min:t.schema.minimum,max:t.schema.maximum,step:I.value,"controls-position":`right`,class:`number-input`,"onUpdate:modelValue":i[1]||=e=>k(e===null?void 0:e)},null,8,[`model-value`,`min`,`max`,`step`])):f.value===`string`?(r(),C(D,{key:3,"model-value":L.value,maxlength:t.schema.maxLength,"onUpdate:modelValue":i[2]||=e=>k(e)},null,8,[`model-value`,`maxlength`])):(r(),C(D,{key:4,"model-value":Z.value,type:`textarea`,rows:4,spellcheck:`false`,class:_([`mono`,{bad:Q.value}]),placeholder:R.value,"onUpdate:modelValue":re},null,8,[`model-value`,`class`,`placeholder`])),t.schema.description?(r(),l(`p`,ee,c(t.schema.description),1)):m(``,!0),Q.value?(r(),l(`p`,te,c(Q.value),1)):m(``,!0)]))}}}),[[`__scopeId`,`data-v-5b3796e6`]]),Z={class:`opts-form`},Q={key:0,class:`empty`},$={class:`issue-list`},ne={class:`issue-list`},re=f(E({__name:`PluginOptionsForm`,props:{options:{},schema:{}},setup(t,{expose:n}){let d=t,f=x(`form`),p=T(()=>F(d.schema)),h=T(()=>d.schema?.properties??{}),v=T(()=>Object.entries(h.value)),b=T(()=>new Set(d.schema?.required??[])),S=i({}),w=x([]),E=x([]),D=i(new Map),k=x(``),j=x(!1),M=(e,t)=>{t===null?D.delete(e):D.set(e,t)},N=()=>{for(let e of Object.keys(S))delete S[e]},P=e=>{if(d.schema===null)return{known:{...e},unknown:[]};let t=new Set(Object.keys(h.value)),n={},r=[];for(let[i,a]of Object.entries(e))t.has(i)?n[i]=a:r.push(i);return{known:n,unknown:r}},L=e=>{if(N(),A(e))for(let[t,n]of Object.entries(e))n!==void 0&&(S[t]=n)};a([()=>d.options,()=>d.schema],()=>{D.clear(),E.value=[],j.value=!1;let e=d.options??{},{known:t,unknown:n}=P(e);w.value=n,k.value=JSON.stringify(e,null,4),d.schema===null?(L(t),f.value=`json`):(L(I(d.schema,t)),f.value=p.value?`form`:`json`)},{immediate:!0});let R=(e,t)=>{t===void 0?delete S[e]:S[e]=t,E.value=[]},B=()=>JSON.parse(JSON.stringify(S)),V=e=>e.map(e=>`${e.path}:${e.message}`).join(`;`),H=e=>{if(j.value=!1,E.value=[],e.trim().length!==0)try{JSON.parse(e)}catch{j.value=!0}},U=T(()=>j.value?`JSON 格式错误,请先修复再保存。`:d.schema===null?`该插件的 Schema 无法转为表单,只能编辑 JSON。保存时后端仍会严格校验。`:`JSON 格式正确。保存时后端会按插件 Schema 严格校验。`);return n({collect:()=>{if(f.value===`json`){if(j.value)return{ok:!1,message:`JSON 格式错误`};let e={};try{e=k.value.trim().length>0?JSON.parse(k.value):{}}catch{return{ok:!1,message:`JSON 格式错误`}}if(!A(e))return{ok:!1,message:`顶层配置必须是一个对象`};let t=[];return z(d.schema,e,``,t),E.value=t,t.length>0?{ok:!1,message:V(t)}:{ok:!0,options:e}}if(D.size>0)return{ok:!1,message:`以下字段的 JSON 有格式错误:${[...D.keys()].join(`、`)}`};let e=[];return z(d.schema,S,``,e),E.value=e,e.length>0?{ok:!1,message:V(e)}:{ok:!0,options:B()}},mode:f,switchMode:e=>{if(e===f.value)return{ok:!0};if(e===`json`)return D.size>0?{ok:!1,message:`以下字段的 JSON 有格式错误:${[...D.keys()].join(`、`)}`}:(k.value=JSON.stringify(B(),null,4),j.value=!1,E.value=[],f.value=`json`,{ok:!0});if(!p.value)return{ok:!1,message:`该插件的 Schema 无法用表单呈现,请继续使用 JSON`};if(j.value)return{ok:!1,message:`JSON 里有格式错误,修好了才能切回表单`};let t={};try{t=k.value.trim().length>0?JSON.parse(k.value):{}}catch{return{ok:!1,message:`JSON 里有格式错误,修好了才能切回表单`}}if(!A(t))return{ok:!1,message:`顶层配置必须是一个对象,无法用表单呈现`};let{known:n,unknown:r}=P(t);return w.value=r,L(I(d.schema,n)),E.value=[],D.clear(),f.value=`form`,{ok:!0}}}),(t,n)=>{let i=e(`el-alert`),a=e(`el-input`);return r(),l(`div`,Z,[f.value===`form`&&p.value?(r(),l(s,{key:0},[v.value.length===0?(r(),l(`p`,Q,` 该插件的 Schema 没有声明可配置字段。 `)):m(``,!0),(r(!0),l(s,null,o(v.value,([e,t])=>(r(),C(X,{key:e,name:e,path:e,schema:t,required:b.value.has(e),"model-value":S[e],depth:1,"report-invalid":M,"onUpdate:modelValue":t=>R(e,t)},null,8,[`name`,`path`,`schema`,`required`,`model-value`,`onUpdate:modelValue`]))),128)),w.value.length>0?(r(),C(i,{key:1,type:`warning`,closable:!1,"show-icon":``,class:`notice`},{title:O(()=>[u(` Schema 之外的字段已忽略:`+c(w.value.join(`、`)),1)]),_:1})):m(``,!0),E.value.length>0?(r(),C(i,{key:2,type:`error`,closable:!1,"show-icon":``,class:`notice`,title:`配置未通过 Schema 校验`},{default:O(()=>[y(`ul`,$,[(r(!0),l(s,null,o(E.value,(e,t)=>(r(),l(`li`,{key:t},c(e.path)+`:`+c(e.message),1))),128))])]),_:1})):m(``,!0)],64)):(r(),l(s,{key:1},[g(a,{modelValue:k.value,"onUpdate:modelValue":[n[0]||=e=>k.value=e,H],type:`textarea`,rows:14,spellcheck:`false`,class:_([`mono`,j.value?`bad`:``]),placeholder:`{}`},null,8,[`modelValue`,`class`]),y(`p`,{class:_([`hint`,{bad:j.value}])},c(U.value),3),E.value.length>0?(r(),C(i,{key:0,type:`error`,closable:!1,"show-icon":``,title:`配置未通过 Schema 校验`},{default:O(()=>[y(`ul`,ne,[(r(!0),l(s,null,o(E.value,(e,t)=>(r(),l(`li`,{key:t},c(e.path)+`:`+c(e.message),1))),128))])]),_:1})):m(``,!0)],64))])}}}),[[`__scopeId`,`data-v-9440adda`]]),ie={class:`card-header`},ae={class:`card-header`},oe={key:0,class:`cfg-mode`},se={class:`envelope`},ce={class:`group-grid`},le={class:`group-field`},ue={class:`group-field`},de={class:`private-row`},fe={key:0,class:`group-error`},pe=f(E({__name:`PluginsView`,setup(i){let a=x([]),o=x([]),s=x(!0),f=x(!1),_=x(``),E=x(!1),D=x(`form`),A=x(``),j=x(``),M=x({}),N=x(null),P=x(!0),I=x(``),L=x(``),R=x(null),z=T(()=>F(N.value)),B=e=>{let t=e.config?.groups?.allow??[],n=e.config?.groups?.deny??[];return t.length>0?{text:`允许 ${t.length} 群`,type:`success`,detail:`allow: ${t.join(`, `)}`}:n.length>0?{text:`禁止 ${n.length} 群`,type:`warning`,detail:`deny: ${n.join(`, `)}`}:{text:`不限`,type:`info`,detail:`未设置 allow / deny`}},V=(e,t)=>{let n=[];for(let r of e.split(/[\s,,;;]+/u)){if(r.length===0)continue;if(!/^[0-9]+$/u.test(r))return{ids:n,error:`${t}中包含无效群号:${r}`};let e=Number(r);if(!Number.isSafeInteger(e)||e<=0)return{ids:n,error:`${t}中的群号必须是正整数:${r}`};n.includes(e)||n.push(e)}return{ids:n,error:null}},H=T(()=>{let e=V(I.value,`允许群`),t=V(L.value,`禁止群`);return e.error===null?t.error===null?e.ids.length>0&&t.ids.length>0?{allow:e.ids,deny:t.ids,error:`允许群和禁止群不能同时填写,请清空其中一个`}:{allow:e.ids,deny:t.ids,error:null}:{allow:e.ids,deny:t.ids,error:t.error}:{allow:e.ids,deny:[],error:e.error}}),U=T(()=>H.value.error??``),W=async()=>{f.value=!0;try{let e=await v(`/api/plugins`);a.value=e.plugins,o.value=e.installed,s.value=e.installerEnabled,j.value=e.configHash}catch(e){d(e)}finally{f.value=!1}},G=async(e,t)=>{try{await p(`/api/plugins/${encodeURIComponent(e.id)}/config`,{enabled:!!t}),await W()}catch(e){d(e)}},K=e=>{A.value=e.id,M.value=e.options??{},N.value=e.configSchema??null,P.value=e.config?.private??!0,I.value=(e.config?.groups?.allow??[]).join(`, `),L.value=(e.config?.groups?.deny??[]).join(`, `),D.value=F(e.configSchema??null)?`form`:`json`,E.value=!0},q=e=>{let t=R.value;if(t===null)return;let n=e===`json`?`json`:`form`,r=t.switchMode(n);r.ok?D.value=n:b.warning(r.message??`无法切换模式`)},J=async()=>{if(f.value)return;let e=H.value;if(e.error!==null){b.warning(e.error);return}let t=R.value;if(t===null)return;let n=t.collect();if(!n.ok)b.warning(n.message??`配置未能通过校验`);else{f.value=!0;try{await p(`/api/plugins/${encodeURIComponent(A.value)}/config`,{options:n.options??{},private:P.value,groups:{allow:e.allow,deny:e.deny},baseHash:j.value}),E.value=!1,b.success(`配置已保存`),await W()}catch(e){d(e)}finally{f.value=!1}}},Y=async()=>{if(_.value){f.value=!0;try{await S(`/api/plugins/install`,{spec:_.value}),b.success(`安装完成,请自行重启运行时使其生效`),_.value=``,await W()}catch(e){d(e)}finally{f.value=!1}}},ee=async()=>{f.value=!0;try{await S(`/api/plugins/update`,{}),await W()}catch(e){d(e)}finally{f.value=!1}},te=async e=>{f.value=!0;try{await S(`/api/plugins/remove`,{target:e.packageName}),await W()}catch(e){d(e)}finally{f.value=!1}};return n(()=>void W()),(n,i)=>{let d=e(`el-alert`),p=e(`el-button`),v=e(`el-table-column`),b=e(`el-tag`),x=e(`el-switch`),S=e(`el-table`),T=e(`el-card`),j=e(`el-space`),F=e(`el-input`),V=e(`el-radio-button`),H=e(`el-radio-group`),X=e(`el-drawer`),Z=h(`loading`);return r(),l(`div`,null,[s.value?m(``,!0):(r(),C(d,{key:0,title:`插件安装器未启用(installer.enabled = false)`,type:`info`,closable:!1,class:`block`})),g(T,{class:`block`},{header:O(()=>[y(`div`,ie,[i[7]||=y(`span`,null,`已加载插件`,-1),g(p,{size:`small`,onClick:W},{default:O(()=>[...i[6]||=[u(`刷新`,-1)]]),_:1})])]),default:O(()=>[t((r(),C(S,{data:a.value,size:`small`},{default:O(()=>[g(v,{prop:`id`,label:`ID`,width:w(k)(260)},null,8,[`width`]),g(v,{prop:`version`,label:`版本`,width:w(k)(100)},null,8,[`width`]),g(v,{prop:`description`,label:`说明`,"min-width":w(k)(260)},null,8,[`min-width`]),g(v,{label:`状态`,width:w(k)(110)},{default:O(({row:e})=>[g(b,{size:`small`,type:e.loaded?`success`:`info`},{default:O(()=>[u(c(e.loaded?`已加载`:`未加载`),1)]),_:2},1032,[`type`])]),_:1},8,[`width`]),g(v,{label:`群限制`,width:w(k)(110)},{default:O(({row:e})=>[g(b,{size:`small`,type:B(e).type,title:B(e).detail},{default:O(()=>[u(c(B(e).text),1)]),_:2},1032,[`type`,`title`])]),_:1},8,[`width`]),g(v,{label:`启用`,width:w(k)(80)},{default:O(({row:e})=>[g(x,{"model-value":e.enabled,onChange:t=>G(e,!!t)},null,8,[`model-value`,`onChange`])]),_:1},8,[`width`]),g(v,{label:`操作`,width:w(k)(190)},{default:O(({row:e})=>[g(p,{size:`small`,onClick:t=>K(e)},{default:O(()=>[...i[8]||=[u(` 配置 `,-1)]]),_:1},8,[`onClick`])]),_:1},8,[`width`])]),_:1},8,[`data`])),[[Z,f.value]])]),_:1}),g(T,null,{header:O(()=>[y(`div`,ae,[i[10]||=y(`span`,null,`已安装 npm 包`,-1),g(j,null,{default:O(()=>[g(p,{size:`small`,onClick:ee},{default:O(()=>[...i[9]||=[u(` 全部更新 `,-1)]]),_:1})]),_:1})])]),default:O(()=>[g(S,{data:o.value,size:`small`},{default:O(()=>[g(v,{prop:`packageName`,label:`包名`,"min-width":w(k)(260)},null,8,[`min-width`]),g(v,{prop:`version`,label:`版本`,width:w(k)(110)},null,8,[`width`]),g(v,{label:`插件 ID`,width:w(k)(200)},{default:O(({row:e})=>[u(c((e.pluginIds??[]).join(`, `)),1)]),_:1},8,[`width`]),g(v,{label:`卸载`,width:w(k)(110)},{default:O(({row:e})=>[g(p,{size:`small`,type:`danger`,onClick:t=>te(e)},{default:O(()=>[...i[11]||=[u(` 卸载 `,-1)]]),_:1},8,[`onClick`])]),_:1},8,[`width`])]),_:1},8,[`data`])]),_:1}),g(T,{class:`block`},{default:O(()=>[g(j,null,{default:O(()=>[g(F,{modelValue:_.value,"onUpdate:modelValue":i[0]||=e=>_.value=e,placeholder:`包名,如 @scope/jsbot-plugin-xxx`,style:{width:`20rem`}},null,8,[`modelValue`]),g(p,{type:`primary`,loading:f.value,onClick:Y},{default:O(()=>[...i[12]||=[u(` 安装 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1}),g(X,{modelValue:E.value,"onUpdate:modelValue":i[5]||=e=>E.value=e,size:`min(94vw, 38.75rem)`,title:`插件配置 · `+A.value},{footer:O(()=>[g(p,{onClick:i[4]||=e=>E.value=!1},{default:O(()=>[...i[19]||=[u(`取消`,-1)]]),_:1}),g(p,{type:`primary`,loading:f.value,onClick:J},{default:O(()=>[...i[20]||=[u(` 保存 `,-1)]]),_:1},8,[`loading`])]),default:O(()=>[z.value?(r(),l(`div`,oe,[g(H,{"model-value":D.value,size:`small`,onChange:q},{default:O(()=>[g(V,{value:`form`},{default:O(()=>[...i[13]||=[u(`表单`,-1)]]),_:1}),g(V,{value:`json`},{default:O(()=>[...i[14]||=[u(`JSON`,-1)]]),_:1})]),_:1},8,[`model-value`])])):(r(),C(d,{key:1,type:`info`,closable:!1,"show-icon":``,class:`cfg-note`,title:`该插件的 Schema 无法转换为表单,请直接编辑 JSON;保存时仍会严格校验。`})),y(`section`,se,[i[18]||=y(`div`,{class:`envelope-head`},[y(`h4`,null,`群限制`),y(`span`,{class:`envelope-hint`},` allow / deny 不能同时非空;留空表示不限制 `)],-1),y(`div`,ce,[y(`div`,le,[i[15]||=y(`span`,{class:`group-label`},[u(` 仅允许这些群 `),y(`code`,null,`allow`)],-1),g(F,{modelValue:I.value,"onUpdate:modelValue":i[1]||=e=>I.value=e,type:`textarea`,rows:2,spellcheck:`false`,placeholder:`群号,逗号或换行分隔`},null,8,[`modelValue`])]),y(`div`,ue,[i[16]||=y(`span`,{class:`group-label`},[u(` 禁止这些群 `),y(`code`,null,`deny`)],-1),g(F,{modelValue:L.value,"onUpdate:modelValue":i[2]||=e=>L.value=e,type:`textarea`,rows:2,spellcheck:`false`,placeholder:`群号,逗号或换行分隔`},null,8,[`modelValue`])])]),y(`div`,de,[i[17]||=y(`div`,null,[y(`span`,{class:`group-label`},`允许私聊`),y(`p`,{class:`envelope-hint`},`关闭后该插件只处理群消息`)],-1),g(x,{modelValue:P.value,"onUpdate:modelValue":i[3]||=e=>P.value=e},null,8,[`modelValue`])]),U.value?(r(),l(`p`,fe,c(U.value),1)):m(``,!0)]),g(re,{ref_key:`formRef`,ref:R,options:M.value,schema:N.value},null,8,[`options`,`schema`])]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-4c61c83b`]]);export{pe as default};
@@ -0,0 +1 @@
1
+ .schema-object[data-v-5b3796e6]{flex-direction:column;gap:.5rem;display:flex}.schema-object.nested[data-v-5b3796e6]{border-left:2px solid var(--app-border);padding-left:.75rem}.object-head[data-v-5b3796e6]{flex-direction:column;gap:.125rem;display:flex}.object-label[data-v-5b3796e6]{color:var(--app-text);font-size:.875rem;font-weight:600}.object-body[data-v-5b3796e6]{flex-direction:column;gap:.75rem;display:flex}.schema-field[data-v-5b3796e6]{flex-direction:column;gap:.375rem;display:flex}.field-label[data-v-5b3796e6]{color:var(--app-text);justify-content:space-between;align-items:baseline;gap:.5rem;font-size:.875rem;font-weight:600;display:flex}.field-kind[data-v-5b3796e6]{color:var(--app-muted);flex:none;font-size:.6875rem;font-weight:500}.req[data-v-5b3796e6]{color:var(--app-danger);margin-left:.125rem}.desc[data-v-5b3796e6]{color:var(--app-muted);margin:0;font-size:.75rem;line-height:1.5}.field-error[data-v-5b3796e6]{color:var(--app-log-error);margin:0;font-size:.75rem}.enum-select[data-v-5b3796e6],.number-input[data-v-5b3796e6]{width:100%}.mono[data-v-5b3796e6] textarea{font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;font-size:.8125rem;line-height:1.6}.mono.bad[data-v-5b3796e6] textarea:focus{box-shadow:0 0 0 1px var(--app-log-error) inset, 0 0 0 3px color-mix(in oklab, var(--app-log-error) 16%, transparent)}.empty[data-v-5b3796e6]{color:var(--app-muted);margin:0;font-size:.8125rem}.opts-form[data-v-9440adda]{flex-direction:column;gap:.875rem;display:flex}.notice[data-v-9440adda]{margin-top:.25rem}.issue-list[data-v-9440adda]{margin:.25rem 0 0;padding-left:1.25rem;font-size:.75rem;line-height:1.6}.mono[data-v-9440adda] textarea{font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;font-size:.8125rem;line-height:1.65}.mono.bad[data-v-9440adda] textarea:focus{box-shadow:0 0 0 1px var(--app-log-error) inset, 0 0 0 3px color-mix(in oklab, var(--app-log-error) 16%, transparent)}.hint[data-v-9440adda]{color:var(--app-muted);margin:0;font-size:.75rem}.hint.bad[data-v-9440adda]{color:var(--app-log-error)}.empty[data-v-9440adda]{color:var(--app-muted);margin:0;padding:.5rem 0;font-size:.8125rem}.block[data-v-4c61c83b]{margin-bottom:1rem}.card-header[data-v-4c61c83b]{justify-content:space-between;align-items:center;display:flex}.cfg-mode[data-v-4c61c83b]{margin:0 0 .875rem .25rem}.cfg-note[data-v-4c61c83b]{margin-bottom:.875rem}.envelope[data-v-4c61c83b]{border-bottom:1px solid var(--app-border);flex-direction:column;gap:.75rem;margin-bottom:.875rem;padding-bottom:.875rem;display:flex}.envelope-head[data-v-4c61c83b]{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.25rem .75rem;display:flex}.envelope-head h4[data-v-4c61c83b]{color:var(--app-text);margin:0;font-size:.875rem;font-weight:600}.group-grid[data-v-4c61c83b]{grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem;display:grid}.group-field[data-v-4c61c83b]{flex-direction:column;gap:.375rem;display:flex}.group-label[data-v-4c61c83b]{color:var(--app-text);font-size:.8125rem;font-weight:600}.group-label code[data-v-4c61c83b]{color:var(--app-muted);font-size:.6875rem;font-weight:500}.envelope-hint[data-v-4c61c83b]{color:var(--app-muted);margin:0;font-size:.75rem}.private-row[data-v-4c61c83b]{justify-content:space-between;align-items:center;gap:1rem;display:flex}.private-row p[data-v-4c61c83b]{margin:.125rem 0 0}.group-error[data-v-4c61c83b]{color:var(--app-log-error);margin:0;font-size:.75rem}
@@ -0,0 +1 @@
1
+ import{Ai as e,Bi as t,Ci as n,Ei as r,Jr as i,Oi as a,Yr as o,Zr as s,_a as c,ai as l,ci as u,d,f,i as p,ii as m,ji as h,l as g,li as _,n as v,ni as y,p as b,qi as x,r as S,ri as C,t as w,ta as T,ui as E,zi as D}from"./api-Bm2KUKXH.js";import{t as O}from"./use-ui-scale-DvdJkOwB.js";var k={key:0},A={class:`message-content`},j={key:0,class:`sub`},M=20,N=f(E({__name:`SessionsView`,setup(f){let E=x([]),N=x(0),P=x(1),F=x(``),I=x(!1),L=x(!1),R=x(null),z=x(``),B=x({provider:``,model:``,persona:``}),V=x(``),H=x(``),U=x(!0),W=x(!1),G=async()=>{I.value=!0;try{let e=(P.value-1)*M,t=new URLSearchParams({limit:String(M),offset:String(e)});F.value&&t.set(`query`,F.value);let n=await v(`/api/sessions?${t.toString()}`);E.value=n.items,N.value=n.total}catch(e){d(e)}finally{I.value=!1}},K=e=>{P.value=e,G()},q=async e=>{try{let t=await v(`/api/sessions/${encodeURIComponent(e.sessionId)}`);R.value=t,z.value=e.sessionId,B.value={provider:t.provider??``,model:t.model??``,persona:t.persona??``},L.value=!0}catch(e){d(e)}},J=async()=>{if(R.value!==null)try{R.value=await p(`/api/sessions/${encodeURIComponent(z.value)}`,{provider:B.value.provider||null,model:B.value.model||null,persona:B.value.persona||null}),b.success(`已保存`),await G()}catch(e){d(e)}},Y=async()=>{if(R.value!==null&&V.value)try{R.value=await S(`/api/sessions/${encodeURIComponent(z.value)}/messages`,{role:`user`,content:V.value}),V.value=``}catch(e){d(e)}},X=async()=>{if(H.value){W.value=!0;try{await S(`/api/sessions/${encodeURIComponent(z.value)}/send`,{message:H.value,autoEscape:U.value}),b.success(`已发送`),H.value=``}catch(e){d(e)}finally{W.value=!1}}},Z=async()=>{try{await w(`/api/sessions/${encodeURIComponent(z.value)}`),R.value=null,L.value=!1,await G()}catch(e){d(e)}},ee=async e=>{try{await w(`/api/sessions/${encodeURIComponent(e.sessionId)}`),await G()}catch(e){d(e)}},te=e=>e===`assistant`?`success`:e===`system`?`warning`:`primary`;return n(()=>void G()),(n,d)=>{let f=e(`el-input`),p=e(`el-button`),v=e(`el-space`),b=e(`el-card`),x=e(`el-table-column`),S=e(`el-table`),w=e(`el-pagination`),Q=e(`el-form-item`),ne=e(`el-form`),$=e(`el-divider`),re=e(`el-tag`),ie=e(`el-checkbox`),ae=e(`el-drawer`),oe=h(`loading`);return r(),l(`div`,null,[_(b,{class:`block`},{default:D(()=>[_(v,null,{default:D(()=>[_(f,{modelValue:F.value,"onUpdate:modelValue":d[0]||=e=>F.value=e,placeholder:`搜索 session id`,clearable:``,style:{width:`16.25rem`},onKeyup:i(G,[`enter`])},null,8,[`modelValue`]),_(p,{type:`primary`,onClick:G},{default:D(()=>[...d[8]||=[u(`搜索`,-1)]]),_:1})]),_:1})]),_:1}),_(b,null,{default:D(()=>[t((r(),C(S,{data:E.value,size:`small`,onRowClick:q},{default:D(()=>[_(x,{prop:`sessionId`,label:`Session ID`,"min-width":T(O)(260),"show-overflow-tooltip":``},null,8,[`min-width`]),_(x,{label:`消息数`,width:T(O)(90)},{default:D(({row:e})=>[u(c(e.messageCount),1)]),_:1},8,[`width`]),_(x,{label:`更新时间`,width:T(O)(180)},{default:D(({row:e})=>[u(c(T(g)(e.updatedAt)),1)]),_:1},8,[`width`]),_(x,{label:`操作`,width:T(O)(160)},{default:D(({row:e})=>[_(p,{size:`small`,onClick:o(t=>q(e),[`stop`])},{default:D(()=>[...d[9]||=[u(` 详情 `,-1)]]),_:1},8,[`onClick`]),_(p,{size:`small`,type:`danger`,onClick:o(t=>ee(e),[`stop`])},{default:D(()=>[...d[10]||=[u(` 清空 `,-1)]]),_:1},8,[`onClick`])]),_:1},8,[`width`])]),_:1},8,[`data`])),[[oe,I.value]]),_(w,{class:`pager`,layout:`total, prev, pager, next`,total:N.value,"page-size":M,"current-page":P.value,onCurrentChange:K},null,8,[`total`,`current-page`])]),_:1}),_(ae,{modelValue:L.value,"onUpdate:modelValue":d[7]||=e=>L.value=e,size:`45%`,title:`会话 `+z.value},{default:D(()=>[R.value?(r(),l(`div`,k,[_(ne,{"label-width":`5.625rem`,size:`small`},{default:D(()=>[_(Q,{label:`provider`},{default:D(()=>[_(f,{modelValue:B.value.provider,"onUpdate:modelValue":d[1]||=e=>B.value.provider=e},null,8,[`modelValue`])]),_:1}),_(Q,{label:`model`},{default:D(()=>[_(f,{modelValue:B.value.model,"onUpdate:modelValue":d[2]||=e=>B.value.model=e},null,8,[`modelValue`])]),_:1}),_(Q,{label:`persona`},{default:D(()=>[_(f,{modelValue:B.value.persona,"onUpdate:modelValue":d[3]||=e=>B.value.persona=e,type:`textarea`,rows:3},null,8,[`modelValue`])]),_:1}),_(Q,null,{default:D(()=>[_(p,{type:`primary`,onClick:J},{default:D(()=>[...d[11]||=[u(` 保存 `,-1)]]),_:1})]),_:1})]),_:1}),_($,null,{default:D(()=>[...d[12]||=[u(`LLM 消息`,-1)]]),_:1}),(r(!0),l(s,null,a(R.value.messages,(e,t)=>(r(),l(`div`,{key:t,class:`message`},[_(re,{size:`small`,type:te(e.role)},{default:D(()=>[u(c(e.role),1)]),_:2},1032,[`type`]),y(`pre`,A,c(e.content),1)]))),128)),R.value.messages.length===0?(r(),l(`p`,j,`无消息`)):m(``,!0),_(f,{modelValue:V.value,"onUpdate:modelValue":d[4]||=e=>V.value=e,type:`textarea`,rows:3,placeholder:`追加 role=user 消息`,class:`block`},null,8,[`modelValue`]),_(p,{size:`small`,onClick:Y},{default:D(()=>[...d[13]||=[u(`追加`,-1)]]),_:1}),_($,null,{default:D(()=>[...d[14]||=[u(`发送 QQ 消息`,-1)]]),_:1}),_(f,{modelValue:H.value,"onUpdate:modelValue":d[5]||=e=>H.value=e,type:`textarea`,rows:3,placeholder:`发送到此 session(等同机器人回复)`,class:`block`},null,8,[`modelValue`]),_(v,null,{default:D(()=>[_(p,{type:`primary`,size:`small`,loading:W.value,onClick:X},{default:D(()=>[...d[15]||=[u(` 发送 `,-1)]]),_:1},8,[`loading`]),_(ie,{modelValue:U.value,"onUpdate:modelValue":d[6]||=e=>U.value=e},{default:D(()=>[...d[16]||=[u(`autoEscape`,-1)]]),_:1},8,[`modelValue`]),_(p,{type:`danger`,size:`small`,onClick:Z},{default:D(()=>[...d[17]||=[u(` 清空会话 `,-1)]]),_:1})]),_:1})])):m(``,!0)]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-e9a3988e`]]);export{N as default};
@@ -0,0 +1 @@
1
+ .block[data-v-e9a3988e]{margin-bottom:1rem}.pager[data-v-e9a3988e]{margin-top:.75rem}.message[data-v-e9a3988e]{margin:.5rem 0}.message-content[data-v-e9a3988e]{background:var(--app-panel-2);border:1px solid var(--app-border);color:var(--app-text);white-space:pre-wrap;border-radius:.5rem;margin:.25rem 0 0;padding:.5rem;font-size:.75rem}.sub[data-v-e9a3988e]{color:var(--app-muted);font-size:.75rem}