@jsbot-tellus/core 2.8.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.
- package/dist/core/web/routes/plugins.d.ts.map +1 -1
- package/dist/core/web/routes/plugins.js +51 -4
- package/dist/core/web/routes/plugins.js.map +1 -1
- package/dist/webui/assets/ActionsView-CdRiwzyc.css +1 -0
- package/dist/webui/assets/{ActionsView-B3Q3rh2X.js → ActionsView-DpOwcpkP.js} +1 -1
- package/dist/webui/assets/ConfigView-BwDaxNs6.css +1 -0
- package/dist/webui/assets/ConfigView-C8W7Taes.js +1 -0
- package/dist/webui/assets/DashboardView-FAQEqfkT.css +1 -0
- package/dist/webui/assets/DashboardView-XR4MljXP.js +1 -0
- package/dist/webui/assets/EventsView-D6uxp8iJ.css +1 -0
- package/dist/webui/assets/EventsView-dsacXF6v.js +1 -0
- package/dist/webui/assets/KvView-ClHfDapd.css +1 -0
- package/dist/webui/assets/KvView-CleDcxJm.js +1 -0
- package/dist/webui/assets/LoginView-auw7iDds.js +1 -0
- package/dist/webui/assets/LoginView-rwItauSQ.css +1 -0
- package/dist/webui/assets/LogsView-Crns4wd2.css +1 -0
- package/dist/webui/assets/{LogsView-K7nWoSFe.js → LogsView-D94DH0eL.js} +1 -1
- package/dist/webui/assets/MainLayout-BLJl7wIh.css +1 -0
- package/dist/webui/assets/MainLayout-BSmZGVVc.js +1 -0
- package/dist/webui/assets/PluginsView-BrrSON7o.js +1 -0
- package/dist/webui/assets/PluginsView-BwP5MkvC.css +1 -0
- package/dist/webui/assets/SessionsView-CboU4cCN.js +1 -0
- package/dist/webui/assets/SessionsView-DOUCUUrw.css +1 -0
- package/dist/webui/assets/index-BX3-wbu2.css +1 -0
- package/dist/webui/assets/{index-CFz4VL67.js → index-BjnuYVEl.js} +2 -2
- package/dist/webui/assets/use-ui-scale-DvdJkOwB.js +1 -0
- package/dist/webui/index.html +8 -7
- package/package.json +1 -1
- package/src/core/web/routes/plugins.ts +75 -6
- package/dist/webui/assets/ActionsView-Ciib5lC6.css +0 -1
- package/dist/webui/assets/ConfigView-Baeqfi8s.js +0 -1
- package/dist/webui/assets/ConfigView-CrEpss2y.css +0 -1
- package/dist/webui/assets/DashboardView-DLKD8DqF.js +0 -1
- package/dist/webui/assets/DashboardView-DR6yCaqs.css +0 -1
- package/dist/webui/assets/EventsView-CGUPPvRI.js +0 -1
- package/dist/webui/assets/EventsView-PMkYKxZ-.css +0 -1
- package/dist/webui/assets/KvView-CaMvbxUz.css +0 -1
- package/dist/webui/assets/KvView-CeovApuA.js +0 -1
- package/dist/webui/assets/LoginView-BVnFkwSW.css +0 -1
- package/dist/webui/assets/LoginView-C2cfmXmS.js +0 -1
- package/dist/webui/assets/LogsView-NR4L1-XY.css +0 -1
- package/dist/webui/assets/MainLayout-bySbvMWB.js +0 -1
- package/dist/webui/assets/MainLayout-qhsp--2k.css +0 -1
- package/dist/webui/assets/PluginsView-DL9OxGph.css +0 -1
- package/dist/webui/assets/PluginsView-DQZu8in1.js +0 -1
- package/dist/webui/assets/SessionsView-C0vTCqqE.js +0 -1
- package/dist/webui/assets/SessionsView-p-u3JGTV.css +0 -1
- package/dist/webui/assets/index-Cs8jafCm.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{qi as e}from"./api-Bm2KUKXH.js";import{i as t,s as n}from"./index-BjnuYVEl.js";var r=e(t().uiScale??1);n(()=>{r.value=t().uiScale??1});function i(e){return Math.round(e*r.value)}export{i as t};
|
package/dist/webui/index.html
CHANGED
|
@@ -87,22 +87,23 @@
|
|
|
87
87
|
) {
|
|
88
88
|
root.style.setProperty('--app-radius', a.radius + 'rem')
|
|
89
89
|
}
|
|
90
|
-
|
|
90
|
+
var uiScale =
|
|
91
|
+
a.v === 2 &&
|
|
91
92
|
typeof a.uiScale === 'number' &&
|
|
92
93
|
a.uiScale >= 0.5 &&
|
|
93
94
|
a.uiScale <= 2
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
? a.uiScale
|
|
96
|
+
: 1
|
|
97
|
+
root.style.fontSize =
|
|
98
|
+
Math.round(16 * uiScale * 100) / 100 + 'px'
|
|
98
99
|
} catch (e) {
|
|
99
100
|
/* ignore — fall back to the default theme */
|
|
100
101
|
}
|
|
101
102
|
})()
|
|
102
103
|
</script>
|
|
103
|
-
<script type="module" crossorigin src="/assets/index-
|
|
104
|
+
<script type="module" crossorigin src="/assets/index-BjnuYVEl.js"></script>
|
|
104
105
|
<link rel="modulepreload" crossorigin href="/assets/api-Bm2KUKXH.js">
|
|
105
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
106
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BX3-wbu2.css">
|
|
106
107
|
</head>
|
|
107
108
|
<body>
|
|
108
109
|
<div id="app"></div>
|
package/package.json
CHANGED
|
@@ -1,9 +1,45 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { formatConfigIssues } from '../../config/schema.js'
|
|
1
3
|
import { stripPluginEnvelope } from '../../plugin/host.js'
|
|
4
|
+
import type { AnyPluginDefinition } from '../../plugin/types.js'
|
|
2
5
|
import { HttpError, isRecord, readJsonBody, sendData } from '../http.js'
|
|
3
6
|
import { asRecord, requireRuntime, type ApiContext } from './shared.js'
|
|
4
7
|
|
|
5
8
|
const ENVELOPE_KEYS = new Set(['enabled', 'private', 'groups'])
|
|
6
9
|
|
|
10
|
+
/**
|
|
11
|
+
* JSON Schema for a plugin's options, derived from its Zod input schema once
|
|
12
|
+
* per definition. `null` means the schema cannot be represented and the WebUI
|
|
13
|
+
* falls back to raw JSON editing.
|
|
14
|
+
*/
|
|
15
|
+
const jsonSchemaCache = new WeakMap<
|
|
16
|
+
AnyPluginDefinition,
|
|
17
|
+
Record<string, unknown> | null
|
|
18
|
+
>()
|
|
19
|
+
|
|
20
|
+
function pluginJsonSchema(
|
|
21
|
+
definition: AnyPluginDefinition
|
|
22
|
+
): Record<string, unknown> | null {
|
|
23
|
+
if (jsonSchemaCache.has(definition)) {
|
|
24
|
+
return jsonSchemaCache.get(definition) ?? null
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let result: Record<string, unknown> | null = null
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
result = z.toJSONSchema(definition.manifest.configSchema, {
|
|
31
|
+
io: 'input',
|
|
32
|
+
unrepresentable: 'any',
|
|
33
|
+
}) as Record<string, unknown>
|
|
34
|
+
} catch {
|
|
35
|
+
result = null
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
jsonSchemaCache.set(definition, result)
|
|
39
|
+
|
|
40
|
+
return result
|
|
41
|
+
}
|
|
42
|
+
|
|
7
43
|
export async function handlePluginsList(ctx: ApiContext): Promise<void> {
|
|
8
44
|
const runtime = requireRuntime(ctx.deps)
|
|
9
45
|
const statuses = new Map(
|
|
@@ -16,6 +52,11 @@ export async function handlePluginsList(ctx: ApiContext): Promise<void> {
|
|
|
16
52
|
string,
|
|
17
53
|
unknown
|
|
18
54
|
>
|
|
55
|
+
// `safeStringify` treats shared references as circular; cloning keeps
|
|
56
|
+
// `config` and `options` from aliasing the same nested objects.
|
|
57
|
+
const options = structuredClone(
|
|
58
|
+
stripPluginEnvelope(envelope as never)
|
|
59
|
+
) as Record<string, unknown>
|
|
19
60
|
|
|
20
61
|
return {
|
|
21
62
|
id,
|
|
@@ -26,10 +67,8 @@ export async function handlePluginsList(ctx: ApiContext): Promise<void> {
|
|
|
26
67
|
enabled: status?.enabled ?? false,
|
|
27
68
|
loaded: status?.loaded ?? false,
|
|
28
69
|
config: envelope,
|
|
29
|
-
options
|
|
30
|
-
|
|
31
|
-
unknown
|
|
32
|
-
>,
|
|
70
|
+
options,
|
|
71
|
+
configSchema: pluginJsonSchema(definition),
|
|
33
72
|
}
|
|
34
73
|
})
|
|
35
74
|
const installed = runtime.installer.enabled
|
|
@@ -76,12 +115,42 @@ export async function handlePluginConfigPut(ctx: ApiContext): Promise<void> {
|
|
|
76
115
|
throw new HttpError(400, 'options must be an object')
|
|
77
116
|
}
|
|
78
117
|
|
|
118
|
+
const runtime = ctx.deps.getRuntime()
|
|
119
|
+
const definition = runtime?.plugins.find(
|
|
120
|
+
(plugin) => plugin.manifest.id === id
|
|
121
|
+
)
|
|
122
|
+
const options: Record<string, unknown> = {}
|
|
123
|
+
|
|
124
|
+
for (const [key, value] of Object.entries(body['options'])) {
|
|
125
|
+
if (!ENVELOPE_KEYS.has(key)) options[key] = value
|
|
126
|
+
}
|
|
127
|
+
|
|
79
128
|
for (const key of Object.keys(next)) {
|
|
80
129
|
if (!ENVELOPE_KEYS.has(key)) delete next[key]
|
|
81
130
|
}
|
|
82
131
|
|
|
83
|
-
|
|
84
|
-
|
|
132
|
+
if (definition === undefined) {
|
|
133
|
+
// Without a live runtime there is no schema to enforce; the config
|
|
134
|
+
// store still owns envelope validation.
|
|
135
|
+
Object.assign(next, options)
|
|
136
|
+
} else {
|
|
137
|
+
const parsed = definition.manifest.configSchema.safeParse(options)
|
|
138
|
+
|
|
139
|
+
if (!parsed.success) {
|
|
140
|
+
throw new HttpError(
|
|
141
|
+
400,
|
|
142
|
+
formatConfigIssues(parsed.error, `plugins.${id}`)
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (!isRecord(parsed.data)) {
|
|
147
|
+
throw new HttpError(
|
|
148
|
+
400,
|
|
149
|
+
`plugins.${id}: config schema must produce an object`
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
Object.assign(next, parsed.data)
|
|
85
154
|
}
|
|
86
155
|
}
|
|
87
156
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.block[data-v-ceeaf662]{margin-bottom:16px}.result[data-v-ceeaf662]{background:var(--app-bg);border:1px solid var(--app-border);color:var(--app-text);white-space:pre-wrap;border-radius:10px;min-height:80px;margin:0;padding:12px;font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;font-size:12px}
|
|
@@ -1 +0,0 @@
|
|
|
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":`140px`,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:`160px`}},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:`200px`}},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:`240px`}},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-3e321bed`]]);export{C as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.form[data-v-3e321bed]{max-width:640px}.block[data-v-3e321bed]{margin-top:12px}.json-editor[data-v-3e321bed]{font-family:monospace}.issues[data-v-3e321bed]{margin:0;padding-left:18px;font-size:12px}
|
|
@@ -1 +0,0 @@
|
|
|
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 E,zi as D}from"./api-Bm2KUKXH.js";var O={class:`error-text`},ee={class:`stat`},te={class:`chip sky`},k={class:`value small`},A={class:`sub`},j={class:`stat`},M={class:`chip emerald`},N={class:`value`},P={class:`sub`},F={class:`stat`},I={class:`chip violet`},L={class:`value`},R={class:`unit`},z={class:`sub`},B={class:`stat`},V={class:`chip amber`},H={class:`value`},U={class:`unit`},W={class:`sub`},G={key:0,class:`sub warn-text`},K=f(w({__name:`DashboardView`,setup(f){let w=_(null),K=_([]),q=_([]),J=_(!1),Y=S(()=>w.value?.runtime??null),X=S(()=>Y.value?C(Y.value.uptimeMs):`-`),Z=async()=>{try{w.value=await l()}catch(e){d(e)}},ne=async()=>{J.value=!0;try{await v(`/api/runtime/restart`),await Z()}catch(e){d(e)}finally{J.value=!1}},re=async()=>{try{await v(`/api/runtime/pause`),await Z()}catch(e){d(e)}},ie=async()=>{try{await v(`/api/runtime/resume`),await Z()}catch(e){d(e)}},Q=null,$=null;return n(async()=>{await Z(),K.value=await b().catch(()=>[]),Q=s(`/api/events/stream?limit=20`,e=>{q.value.unshift(e),q.value.length>30&&q.value.pop()});let e=setInterval(()=>void Z(),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:D(()=>[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,{gutter:16,class:`block`},{default:D(()=>[h(_,{span:6},{default:D(()=>[h(f,{class:`stat-card`},{default:D(()=>[g(`div`,ee,[g(`div`,te,[h(d,{size:18},{default:D(()=>[h(x(e))]),_:1})]),g(`div`,null,[s[0]||=g(`p`,{class:`label`},`连接状态`,-1),g(`p`,k,o(Y.value?.connected?`已连接`:`未连接`),1),g(`p`,A,o(Y.value?.login?`${Y.value.login.nickname} · ${Y.value.login.userId}`:`—`),1)])])]),_:1})]),_:1}),h(_,{span:6},{default:D(()=>[h(f,{class:`stat-card`},{default:D(()=>[g(`div`,j,[g(`div`,M,[h(d,{size:18},{default:D(()=>[h(x(E))]),_:1})]),g(`div`,null,[s[1]||=g(`p`,{class:`label`},`运行时长`,-1),g(`p`,N,o(X.value),1),g(`p`,P,` state: `+o(Y.value?.state??`—`)+` · gen `+o(Y.value?.generation??`—`),1)])])]),_:1})]),_:1}),h(_,{span:6},{default:D(()=>[h(f,{class:`stat-card`},{default:D(()=>[g(`div`,F,[g(`div`,I,[h(d,{size:18},{default:D(()=>[h(x(a))]),_:1})]),g(`div`,null,[s[2]||=g(`p`,{class:`label`},`插件`,-1),g(`p`,L,[u(o(Y.value?.counts.loadedPlugins??`—`),1),g(`span`,R,` / `+o(Y.value?.counts.plugins??`—`)+` 已加载`,1)]),g(`p`,z,` 启用 `+o(Y.value?.counts.enabledPlugins??`—`),1)])])]),_:1})]),_:1}),h(_,{span:6},{default:D(()=>[h(f,{class:`stat-card`},{default:D(()=>[g(`div`,B,[g(`div`,V,[h(d,{size:18},{default:D(()=>[h(x(i))]),_:1})]),g(`div`,null,[s[3]||=g(`p`,{class:`label`},`会话`,-1),g(`p`,H,[u(o(Y.value?.counts.sessions??`—`),1),g(`span`,U,` · `+o(Y.value?.counts.kvPlugins??`—`)+` KV 插件`,1)]),s[4]||=g(`p`,{class:`sub`},`session 记录数`,-1)])])]),_:1})]),_:1})]),_:1}),h(f,{class:`block`},{header:D(()=>[...s[5]||=[u(`运行时控制`,-1)]]),default:D(()=>[h(S,null,{default:D(()=>[h(b,{type:`danger`,loading:J.value,onClick:ne},{default:D(()=>[...s[6]||=[u(` 重启运行时 `,-1)]]),_:1},8,[`loading`]),h(b,{onClick:re},{default:D(()=>[...s[7]||=[u(`暂停`,-1)]]),_:1}),h(b,{onClick:ie},{default:D(()=>[...s[8]||=[u(`恢复`,-1)]]),_:1})]),_:1}),g(`p`,W,` version: `+o(w.value?.version??`-`)+` · paths: `+o(w.value?.paths.config),1),w.value?.webui.requiresProcessRestart?(r(),c(`p`,G,` webui 绑定配置已修改,需要重启进程生效。 `)):p(``,!0)]),_:1}),h(f,{class:`block`},{header:D(()=>[...s[9]||=[u(`命令列表`,-1)]]),default:D(()=>[h(T,{data:K.value,size:`small`,"max-height":`320`},{default:D(()=>[h(C,{prop:`id`,label:`命令`,width:`220`}),h(C,{prop:`pluginId`,label:`插件`,width:`180`}),h(C,{prop:`description`,label:`说明`})]),_:1},8,[`data`])]),_:1}),h(f,{class:`block`},{header:D(()=>[...s[10]||=[u(`最近事件`,-1)]]),default:D(()=>[h(T,{data:q.value,size:`small`,"max-height":`320`},{default:D(()=>[h(C,{label:`时间`,width:`170`},{default:D(({row:e})=>[u(o(x(m)(e.time)),1)]),_:1}),h(C,{prop:`type`,label:`类型`,width:`100`}),h(C,{prop:`summary`,label:`摘要`})]),_:1},8,[`data`])]),_:1})])}}}),[[`__scopeId`,`data-v-5b803405`]]);export{K as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.block[data-v-5b803405]{margin-bottom:16px}.stat[data-v-5b803405]{align-items:flex-start;gap:14px;display:flex}.chip[data-v-5b803405]{border-radius:11px;flex:none;justify-content:center;align-items:center;width:40px;height:40px;display:flex}.chip.sky[data-v-5b803405]{color:color-mix(in oklab, var(--app-accent) 85%, black);background:color-mix(in oklab, var(--app-accent) 12%, transparent)}.chip.emerald[data-v-5b803405]{color:var(--app-ok);background:color-mix(in oklab, var(--app-ok) 12%, transparent)}.chip.violet[data-v-5b803405]{color:var(--app-violet);background:color-mix(in oklab, var(--app-violet) 12%, transparent)}.chip.amber[data-v-5b803405]{color:var(--app-warn);background:color-mix(in oklab, var(--app-warn) 12%, transparent)}.label[data-v-5b803405]{color:var(--app-muted);margin:0;font-size:12.5px}.value[data-v-5b803405]{color:var(--app-text);margin:6px 0 0;font-size:21px;font-weight:700;line-height:1.25}.value.small[data-v-5b803405]{font-size:16px}.unit[data-v-5b803405]{color:var(--app-muted);font-size:12px;font-weight:500}.sub[data-v-5b803405]{color:var(--app-muted);word-break:break-all;margin:4px 0 0;font-size:11.5px}.warn-text[data-v-5b803405]{color:var(--app-warn)}.error-text[data-v-5b803405]{white-space:pre-wrap;margin:8px 0 0;font-size:12px}
|
|
@@ -1 +0,0 @@
|
|
|
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";var y={class:`json`},b=l(g({__name:`EventsView`,setup(l){let g=m(``),b=m(`on`),x=m([]),S=m(!1),C=m(``),w=async()=>{try{let e=new URLSearchParams({limit:`300`});g.value&&e.set(`type`,g.value),x.value=await f(`/api/events?${e.toString()}`)}catch(e){c(e)}},T=null,E=()=>{T?.(),T=null,b.value===`on`&&(T=a(`/api/events/stream`,e=>{let t=e;g.value&&t.type!==g.value||(x.value.unshift(t),x.value.length>500&&(x.value.length=500))}))};r(b,E),r(g,async()=>{await w(),E()});let D=e=>{C.value=JSON.stringify(e.event,void 0,2),S.value=!0};return t(async()=>{await w(),E()}),_(()=>{T?.()}),(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`),T=e(`el-table`),E=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:`140px`},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:b.value,"onUpdate:modelValue":r[1]||=e=>b.value=e,style:{width:`90px`}},{default:v(()=>[d(a,{label:`实时`,value:`on`}),d(a,{label:`暂停`,value:`off`})]),_:1},8,[`modelValue`]),d(l,{type:`primary`,onClick:w},{default:v(()=>[...r[3]||=[s(`刷新`,-1)]]),_:1})]),_:1})]),_:1}),d(m,null,{default:v(()=>[d(T,{data:x.value,size:`small`,"max-height":`640`},{default:v(()=>[d(_,{label:`时间`,width:`170`},{default:v(({row:e})=>[s(i(h(u)(e.time)),1)]),_:1}),d(_,{prop:`type`,label:`类型`,width:`100`}),d(_,{prop:`summary`,label:`摘要`,"show-overflow-tooltip":``}),d(_,{label:`详情`,width:`90`},{default:v(({row:e})=>[d(l,{size:`small`,onClick:t=>D(e)},{default:v(()=>[...r[4]||=[s(` 查看 `,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])]),_:1}),d(E,{modelValue:S.value,"onUpdate:modelValue":r[2]||=e=>S.value=e,title:`事件详情`,size:`50%`},{default:v(()=>[p(`pre`,y,i(C.value),1)]),_:1},8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-ffa9bb28`]]);export{b as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.block[data-v-ffa9bb28]{margin-bottom:16px}.json[data-v-ffa9bb28]{white-space:pre-wrap;font-size:12px}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.block[data-v-6e1ecb0b]{margin-bottom:12px}.pager[data-v-6e1ecb0b]{margin-top:12px}
|
|
@@ -1 +0,0 @@
|
|
|
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";var T=50,E=d(C({__name:`KvView`,setup(d){let C=y([]),E=y(``),D=y(``),O=y([]),k=y(0),A=y(1),j=y(!1),M=y(!1),N=y(``),P=y(``),F=y(`create`),I=async()=>{if(E.value){j.value=!0;try{let e=(A.value-1)*T,t=new URLSearchParams({pluginId:E.value,limit:String(T),offset:String(e)});D.value&&t.set(`prefix`,D.value);let n=await _(`/api/kv?${t.toString()}`);O.value=n.items,k.value=n.total}catch(e){u(e)}finally{j.value=!1}}},L=e=>{A.value=e,I()},R=()=>{F.value=`create`,N.value=``,P.value=`null`,M.value=!0},z=e=>{F.value=`update`,N.value=e.key,P.value=JSON.stringify(e.value,void 0,2),M.value=!0},B=async()=>{let e;try{e=JSON.parse(P.value)}catch{v.error(`不是合法的 JSON`);return}try{await f(`/api/kv`,{pluginId:E.value,key:N.value,value:e}),M.value=!1,await I()}catch(e){u(e)}},V=async e=>{try{await x(`/api/kv?pluginId=${encodeURIComponent(E.value)}&key=${encodeURIComponent(e.key)}`),await I()}catch(e){u(e)}},H=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&&(E.value=C.value[0]?.pluginId??``,await I())}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`),U=e(`el-table-column`),W=e(`el-table`),G=e(`el-pagination`),K=e(`el-form-item`),q=e(`el-form`),J=e(`el-dialog`),Y=m(`loading`);return r(),c(`div`,null,[g(_,{class:`block`},{default:w(()=>[g(f,{modelValue:E.value,"onUpdate:modelValue":u[0]||=e=>E.value=e,placeholder:`选择插件`,style:{width:`240px`},onChange:I},{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}),E.value?(r(),b(_,{key:0},{default:w(()=>[g(x,{class:`block`},{default:w(()=>[g(v,{modelValue:D.value,"onUpdate:modelValue":u[1]||=e=>D.value=e,placeholder:`key 前缀过滤`,style:{width:`200px`},onKeyup:i(I,[`enter`])},null,8,[`modelValue`]),g(y,{onClick:I},{default:w(()=>[...u[6]||=[l(`过滤`,-1)]]),_:1}),g(y,{type:`primary`,onClick:R},{default:w(()=>[...u[7]||=[l(`新增 KV`,-1)]]),_:1})]),_:1}),t((r(),b(W,{data:O.value,size:`small`},{default:w(()=>[g(U,{prop:`key`,label:`Key`,"show-overflow-tooltip":``}),g(U,{label:`Value`,"show-overflow-tooltip":``},{default:w(({row:e})=>[l(s(H(e.value)),1)]),_:1}),g(U,{label:`更新时间`,width:`180`},{default:w(({row:e})=>[l(s(S(h)(e.updatedAt)),1)]),_:1}),g(U,{label:`操作`,width:`150`},{default:w(({row:e})=>[g(y,{size:`small`,onClick:t=>z(e)},{default:w(()=>[...u[8]||=[l(`编辑`,-1)]]),_:1},8,[`onClick`]),g(y,{size:`small`,type:`danger`,onClick:t=>V(e)},{default:w(()=>[...u[9]||=[l(`删除`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[Y,j.value]]),g(G,{class:`pager`,layout:`total, prev, pager, next`,total:k.value,"page-size":T,"current-page":A.value,onCurrentChange:L},null,8,[`total`,`current-page`])]),_:1})):p(``,!0),g(J,{modelValue:M.value,"onUpdate:modelValue":u[5]||=e=>M.value=e,title:`KV 编辑`,width:`560px`},{footer:w(()=>[g(y,{onClick:u[4]||=e=>M.value=!1},{default:w(()=>[...u[10]||=[l(`取消`,-1)]]),_:1}),g(y,{type:`primary`,onClick:B},{default:w(()=>[...u[11]||=[l(`保存`,-1)]]),_:1})]),default:w(()=>[g(q,{"label-width":`80px`},{default:w(()=>[g(K,{label:`key`},{default:w(()=>[g(v,{modelValue:N.value,"onUpdate:modelValue":u[2]||=e=>N.value=e,disabled:F.value===`update`},null,8,[`modelValue`,`disabled`])]),_:1}),g(K,{label:`value (JSON)`},{default:w(()=>[g(v,{modelValue:P.value,"onUpdate:modelValue":u[3]||=e=>P.value=e,type:`textarea`,rows:6,spellcheck:`false`},null,8,[`modelValue`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-6e1ecb0b`]]);export{E as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.login-page[data-v-57590040]{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-57590040]{z-index:1;background:var(--app-glass);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);width:372px;box-shadow:var(--card-shadow), 0 32px 80px -40px oklch(0% 0 0/.35);position:relative}.brand[data-v-57590040]{text-align:center;margin-bottom:26px}.logo[data-v-57590040]{width:52px;height:52px;color:var(--app-accent-fg);background:linear-gradient(135deg,oklch(68.5% .155 230),oklch(56% .15 250));border-radius:15px;justify-content:center;align-items:center;margin-bottom:16px;font-size:22px;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-57590040]{color:var(--app-text);letter-spacing:.02em;margin:0;font-size:18px}.brand p[data-v-57590040]{color:var(--app-muted);margin:6px 0 0;font-size:13px}.submit[data-v-57590040]{letter-spacing:.35em;width:100%;margin-top:6px;font-weight:600}
|
|
@@ -1 +0,0 @@
|
|
|
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-CFz4VL67.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-57590040><path d="M-40 250 C 180 180, 360 320, 620 250 S 1080 180, 1480 260" data-v-57590040></path><path d="M-40 420 C 200 340, 420 480, 700 410 S 1120 330, 1480 430" data-v-57590040></path><path d="M-40 580 C 220 500, 400 640, 660 570 S 1100 490, 1480 590" data-v-57590040></path><path d="M-40 730 C 180 660, 380 790, 640 725 S 1080 650, 1480 740" data-v-57590040></path><path d="M-40 130 C 240 70, 440 190, 720 125 S 1120 40, 1480 140" data-v-57590040></path></svg>`,1),c(x,{class:`login-card`,"body-style":{padding:`36px 32px 32px`}},{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-57590040`]]);export{_ as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.term-content[data-v-c504421e]{--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) + 2px);background:var(--app-bg);height:calc(100vh - 192px);min-height:420px;box-shadow:var(--card-shadow);scrollbar-gutter:stable both-edges;flex-direction:column;display:flex;position:relative;overflow:hidden}.container[data-v-c504421e]{flex-direction:column;display:flex}.term-bar[data-v-c504421e]{border-bottom:1px solid var(--app-border);background:var(--app-panel);flex:none;align-items:center;gap:10px;padding:8px 12px;display:flex}.term-traffic[data-v-c504421e]{flex:none;gap:6px;display:flex}.dot[data-v-c504421e]{background:var(--app-dot-off);opacity:.55;border-radius:999px;width:10px;height:10px}.term-title[data-v-c504421e]{color:var(--app-text);font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;font-size:12.5px;font-weight:600}.term-title .dim[data-v-c504421e]{color:var(--app-muted);font-weight:400}.term-spacer[data-v-c504421e]{flex:1}.ctl[data-v-c504421e]{flex:none;width:128px}.sel-level[data-v-c504421e]{width:108px}.sel-live[data-v-c504421e]{width:104px}.refresh[data-v-c504421e]{width:auto}.term-body[data-v-c504421e]{font-variant-numeric:tabular-nums;scrollbar-color:color-mix(in oklab, var(--app-text) 22%, transparent) transparent;flex:1;padding:10px 14px 14px;font-family:SF Mono,ui-monospace,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:12px;line-height:1.7;position:relative;overflow-y:auto}.term-empty[data-v-c504421e]{text-align:center;color:var(--app-muted);padding:48px 0;font-size:12px}.log-row[data-v-c504421e]{content-visibility:auto;contain-intrinsic-size:auto 24px;white-space:pre-wrap;word-break:break-word;border-radius:6px;align-items:baseline;gap:10px;padding:0 6px;display:flex}.log-row[data-v-c504421e]:hover{background:color-mix(in oklab, var(--app-accent) 6%, transparent)}.lt[data-v-c504421e]{color:color-mix(in oklab, var(--app-muted) 70%, transparent);flex:none}.lv[data-v-c504421e]{letter-spacing:.02em;flex:none;width:52px;font-size:11px;font-weight:600}.ls[data-v-c504421e]{color:color-mix(in oklab, var(--app-muted) 85%, transparent);flex:none}.lm[data-v-c504421e]{min-width:0;color:var(--app-text)}.l-debug .lv[data-v-c504421e],.l-debug .lm[data-v-c504421e]{color:color-mix(in oklab, var(--app-muted) 78%, transparent)}.l-info .lv[data-v-c504421e]{color:var(--app-log-info)}.l-warn .lv[data-v-c504421e]{color:var(--app-log-warn)}.l-error .lv[data-v-c504421e],.l-error .lm[data-v-c504421e]{color:var(--app-log-error)}.log-fade-both[data-v-c504421e]{-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-c504421e]{animation:.2s cubic-bezier(.16,1,.3,1) terminal-row-in-c504421e}@keyframes terminal-row-in-c504421e{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.jump-latest[data-v-c504421e]{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:999px;padding:6px 14px;font-size:12px;font-weight:500;transition:opacity .15s;position:absolute;bottom:14px;left:50%;translate:-50%}.jump-latest[data-v-c504421e]:hover{border-color:color-mix(in oklab, var(--app-accent) 30%, transparent)}.pill-enter-active[data-v-c504421e],.pill-leave-active[data-v-c504421e]{transition:opacity .15s,translate .15s}.pill-enter-from[data-v-c504421e],.pill-leave-to[data-v-c504421e]{opacity:0;translate:-50% 6px}@media (prefers-reduced-motion:reduce){.rowIn[data-v-c504421e]{animation-duration:.01ms}}
|
|
@@ -1 +0,0 @@
|
|
|
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-CFz4VL67.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={1:`100%`},_=()=>{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:`336px`,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))+`% `,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-3773df04`]]),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:`232px`,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:17},{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:17},{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:17},{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-be073727`]]);export{he as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.panel[data-v-3773df04]{flex-direction:column;gap:20px;display:flex}.group[data-v-3773df04]{flex-direction:column;gap:10px;display:flex}.group h4[data-v-3773df04]{color:var(--app-muted);letter-spacing:.02em;margin:0;font-size:12.5px;font-weight:600}.slider-row[data-v-3773df04]{justify-content:space-between;align-items:center;display:flex}.slider-value[data-v-3773df04]{font-variant-numeric:tabular-nums;color:var(--app-accent);font-size:12.5px}.group .el-switch[data-v-3773df04]{width:fit-content}.reset[data-v-3773df04]{color:var(--app-muted);align-self:flex-start}.layout[data-v-be073727]{background:var(--app-bg);height:100%}.sidebar[data-v-be073727]{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-be073727]{align-items:center;gap:12px;padding:22px 20px 18px;display:flex}.logo[data-v-be073727]{color:#fff;width:36px;height:36px;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:10px;flex:none;justify-content:center;align-items:center;font-weight:700;display:flex}.brand-text h2[data-v-be073727]{color:var(--app-text);letter-spacing:.02em;margin:0;font-size:14.5px}.brand-text p[data-v-be073727]{color:var(--app-muted);margin:3px 0 0;font-size:11px}.nav[data-v-be073727]{flex-direction:column;flex:1;gap:2px;margin-top:4px;padding:6px 12px;display:flex}.nav-item[data-v-be073727]{border-radius:9px;align-items:center;gap:10px;padding:9px 13px;font-size:13.5px;text-decoration:none;transition:background .14s,color .14s;display:flex;position:relative;color:var(--app-muted)!important}.nav-item[data-v-be073727]:hover{background:var(--app-nav-hover);color:var(--app-text)!important}.nav-item.active[data-v-be073727]{background:color-mix(in oklab, var(--app-accent) 12%, transparent);color:var(--app-accent)!important}.nav-item.active[data-v-be073727]:before{content:"";background:linear-gradient(oklch(68.5% .155 230),oklch(56% .15 250));border-radius:999px;width:3px;position:absolute;top:20%;bottom:20%;left:-12px}.sidebar-footer[data-v-be073727]{border-top:1px solid var(--app-border);align-items:center;gap:8px;padding:14px 20px;font-size:12px;display:flex}.status-dot[data-v-be073727]{border-radius:999px;width:8px;height:8px}.status-dot.ok[data-v-be073727]{background:var(--app-ok);box-shadow:0 0 10px color-mix(in oklab, var(--app-ok) 70%, transparent)}.status-dot.off[data-v-be073727]{background:var(--app-dot-off)}.header[data-v-be073727]{background:var(--app-glass);border-bottom:1px solid var(--app-border);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);align-items:center;height:58px;padding:0 24px;display:flex}.title[data-v-be073727]{color:var(--app-text);font-size:14.5px;font-weight:600}.spacer[data-v-be073727]{flex:1}.theme-toggle[data-v-be073727]{color:var(--app-muted);margin-right:6px}.user[data-v-be073727]{color:var(--app-text);cursor:pointer;border-radius:999px;align-items:center;gap:9px;padding:4px 6px 4px 4px;transition:background .14s;display:flex}.user[data-v-be073727]:hover{background:var(--app-nav-hover)}.avatar[data-v-be073727]{color:#fff;background:linear-gradient(135deg,oklch(68.5% .155 230),oklch(56% .15 250));border-radius:999px;justify-content:center;align-items:center;width:28px;height:28px;font-size:12.5px;font-weight:700;display:flex}.username[data-v-be073727]{font-size:13px}.main[data-v-be073727]{padding:22px 24px}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.opts-form[data-v-cabdd1c5]{flex-direction:column;gap:10px;display:flex}.row[data-v-cabdd1c5]{align-items:flex-start;gap:10px;display:flex}.row .key[data-v-cabdd1c5]{flex:0 0 148px}.row .type[data-v-cabdd1c5]{flex:0 0 96px}.row .value[data-v-cabdd1c5]{flex:1;min-width:0}.row .num[data-v-cabdd1c5]{width:100%}.row .raw[data-v-cabdd1c5] textarea{font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;font-size:12px;line-height:1.6}.row>.drop[data-v-cabdd1c5]{color:var(--app-muted);flex:none}.row>.drop[data-v-cabdd1c5]:hover{color:var(--app-log-error)}.key.dup[data-v-cabdd1c5] .el-input__wrapper{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)}.null-mark[data-v-cabdd1c5]{background:color-mix(in oklab, var(--app-muted) 14%, transparent);color:var(--app-muted);border-radius:7px;padding:2px 10px;font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;font-size:12px;display:inline-flex}.add[data-v-cabdd1c5]{color:var(--app-accent);align-self:flex-start}.mono[data-v-cabdd1c5] textarea{font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.65}.mono.bad[data-v-cabdd1c5] 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-cabdd1c5]{color:var(--app-muted);margin:0;font-size:12px}.hint.bad[data-v-cabdd1c5]{color:var(--app-log-error)}.empty[data-v-cabdd1c5]{color:var(--app-muted);padding:18px 0;font-size:12.5px}.block[data-v-c65df5c0]{margin-bottom:16px}.card-header[data-v-c65df5c0]{justify-content:space-between;align-items:center;display:flex}.cfg-mode[data-v-c65df5c0]{margin:0 0 14px 4px}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Ai as e,Bi as t,Ci as n,Ei as r,Gi as i,J as a,Li as o,Oi as s,Zr as c,_a as l,ai as u,ci as d,ct as f,d as p,f as m,i as h,ii as g,ji as _,li as v,ma as y,n as b,ni as x,p as S,qi as C,r as w,ri as T,ta as E,ti as D,ui as O,zi as k}from"./api-Bm2KUKXH.js";var A={class:`opts-form`},j={key:0,class:`empty`},M={class:`value`},N={key:3,class:`null-mark`},P=m(O({__name:`PluginOptionsForm`,props:{options:{}},setup(t,{expose:n}){let p=t,m=C(`form`),h=i([]),_=C(``),b=e=>{let t={key:``,type:`json`,text:``,num:void 0,bool:!1,raw:``};return e===null?t.type=`null`:typeof e==`string`?(t.type=`string`,t.text=e):typeof e==`number`?(t.type=`number`,t.num=e):typeof e==`boolean`?(t.type=`boolean`,t.bool=e):(t.type=`json`,t.raw=JSON.stringify(e,null,4)),t};o(()=>p.options,()=>{h.length=0;for(let[e,t]of Object.entries(p.options??{})){let n=b(t);n.key=e,h.push(n)}_.value=JSON.stringify(p.options??{},null,4)},{immediate:!0,deep:!1});let S=e=>h.filter(t=>t.key===h[e]?.key).length>1,w=()=>{let e=1;for(;h.some(t=>t.key===`新字段${e}`);)e+=1;h.push({key:`新字段${e}`,type:`string`,text:``,num:void 0,bool:!1,raw:``})},O=e=>{if(e.type!==`json`)return!1;try{JSON.parse(e.raw)}catch{return!0}return!1},P=e=>e.trim().length===0?null:JSON.parse(e),F=()=>{let e={};for(let t of h)t.key.trim().length!==0&&(e[t.key]=I(t));return e},I=e=>e.type===`null`?null:e.type===`json`?P(e.raw):e.type===`number`?e.num??0:e.type===`boolean`?e.bool:e.text,L=D(()=>{try{P(_.value);let e=JSON.parse(_.value);return!(typeof e==`object`&&e)}catch{return!0}});return n({collect:()=>{if(m.value===`json`)return L.value?{ok:!1,message:`JSON 格式错误`}:{ok:!0,options:JSON.parse(_.value)};let e=new Map;for(let t of h){if(t.key.trim().length===0)return{ok:!1,message:`有字段没有名字,请为每个字段命名`};if(e.set(t.key,(e.get(t.key)??0)+1),t.type===`json`&&O(t))return{ok:!1,message:`字段「${t.key}」的 JSON 有格式错误`}}let t=[...e.entries()].find(([,e])=>e>1);return t===void 0?{ok:!0,options:F()}:{ok:!1,message:`字段名「${t[0]}」重复,请先改名`}},mode:m,switchMode:e=>{if(e===m.value)return{ok:!0};if(e===`json`){for(let e of h)if(e.type===`json`&&O(e))return{ok:!1,message:`字段「${e.key}」的 JSON 有格式错误,无法切到 JSON 模式`};return _.value=JSON.stringify(F(),null,4),m.value=`json`,{ok:!0}}if(L.value)return{ok:!1,message:`JSON 里有格式错误,修好了才能切回表单`};let t=JSON.parse(_.value);if(Array.isArray(t))return{ok:!1,message:`数组根无法用表单呈现,请继续用 JSON 编辑`};h.length=0;for(let[e,n]of Object.entries(t)){let t=b(n);t.key=e,h.push(t)}return m.value=`form`,{ok:!0}}}),(t,n)=>{let i=e(`el-input`),o=e(`el-option`),p=e(`el-select`),b=e(`el-input-number`),C=e(`el-switch`),D=e(`el-button`);return r(),u(`div`,A,[m.value===`form`?(r(),u(c,{key:0},[h.length===0?(r(),u(`div`,j,` 该插件暂无配置。点「添加字段」创建第一个,或切到 JSON 直接编辑。 `)):g(``,!0),(r(!0),u(c,null,s(h,(e,t)=>(r(),u(`div`,{key:t,class:`row`},[v(i,{modelValue:e.key,"onUpdate:modelValue":t=>e.key=t,class:y([`key`,{dup:S(t)}]),placeholder:`字段名`},null,8,[`modelValue`,`onUpdate:modelValue`,`class`]),v(p,{modelValue:e.type,"onUpdate:modelValue":t=>e.type=t,class:`type`},{default:k(()=>[v(o,{label:`字符串`,value:`string`}),v(o,{label:`数字`,value:`number`}),v(o,{label:`开关`,value:`boolean`}),v(o,{label:`JSON`,value:`json`}),v(o,{label:`null`,value:`null`})]),_:1},8,[`modelValue`,`onUpdate:modelValue`]),x(`div`,M,[e.type===`string`?(r(),T(i,{key:0,modelValue:e.text,"onUpdate:modelValue":t=>e.text=t,placeholder:`字符串`},null,8,[`modelValue`,`onUpdate:modelValue`])):e.type===`number`?(r(),T(b,{key:1,modelValue:e.num,"onUpdate:modelValue":t=>e.num=t,step:1,class:`num`},null,8,[`modelValue`,`onUpdate:modelValue`])):e.type===`boolean`?(r(),T(C,{key:2,modelValue:e.bool,"onUpdate:modelValue":t=>e.bool=t},null,8,[`modelValue`,`onUpdate:modelValue`])):e.type===`null`?(r(),u(`span`,N,`null`)):(r(),T(i,{key:4,modelValue:e.raw,"onUpdate:modelValue":t=>e.raw=t,type:`textarea`,rows:3,spellcheck:`false`,class:y([`raw`,O(e)?`bad`:``]),placeholder:`数组或对象,JSON 格式`},null,8,[`modelValue`,`onUpdate:modelValue`,`class`]))]),v(D,{class:`drop`,text:``,icon:E(a),onClick:e=>h.splice(t,1)},null,8,[`icon`,`onClick`])]))),128)),v(D,{class:`add`,text:``,icon:E(f),onClick:w},{default:k(()=>[...n[1]||=[d(` 添加字段 `,-1)]]),_:1},8,[`icon`])],64)):(r(),u(c,{key:1},[v(i,{modelValue:_.value,"onUpdate:modelValue":n[0]||=e=>_.value=e,type:`textarea`,rows:14,spellcheck:`false`,class:y([`mono`,L.value?`bad`:``]),placeholder:`{}`},null,8,[`modelValue`,`class`]),x(`p`,{class:y([`hint`,{bad:L.value}])},l(L.value?`JSON 格式错误,顶层必须是对象或数组`:`JSON 校验通过——保存时会以这份 JSON 为准`),3)],64))])}}}),[[`__scopeId`,`data-v-cabdd1c5`]]),F={class:`card-header`},I={class:`card-header`},L={class:`cfg-mode`},R=m(O({__name:`PluginsView`,setup(i){let a=C([]),o=C([]),s=C(!0),c=C(!1),f=C(``),m=C(!1),y=C(`form`),E=C(``),D=C(``),O=C({}),A=C(null),j=async()=>{c.value=!0;try{let e=await b(`/api/plugins`);a.value=e.plugins,o.value=e.installed,s.value=e.installerEnabled,D.value=e.configHash}catch(e){p(e)}finally{c.value=!1}},M=async(e,t)=>{try{await h(`/api/plugins/${encodeURIComponent(e.id)}/config`,{enabled:!!t}),await j()}catch(e){p(e)}},N=e=>{E.value=e.id,O.value=e.options??{},y.value=`form`,m.value=!0},R=e=>{let t=A.value;if(t===null)return;let n=e===`json`?`json`:`form`,r=t.switchMode(n);r.ok?y.value=n:S.warning(r.message??`无法切换模式`)},z=async()=>{if(c.value)return;let e=A.value;if(e===null)return;let t=e.collect();if(!t.ok)S.warning(t.message??`配置未能通过校验`);else{c.value=!0;try{await h(`/api/plugins/${encodeURIComponent(E.value)}/config`,{options:t.options??{},baseHash:D.value}),m.value=!1,S.success(`配置已保存`),await j()}catch(e){p(e)}finally{c.value=!1}}},B=async()=>{if(f.value){c.value=!0;try{await w(`/api/plugins/install`,{spec:f.value}),S.success(`安装完成,请自行重启运行时使其生效`),f.value=``,await j()}catch(e){p(e)}finally{c.value=!1}}},V=async()=>{c.value=!0;try{await w(`/api/plugins/update`,{}),await j()}catch(e){p(e)}finally{c.value=!1}},H=async e=>{c.value=!0;try{await w(`/api/plugins/remove`,{target:e.packageName}),await j()}catch(e){p(e)}finally{c.value=!1}};return n(()=>void j()),(n,i)=>{let p=e(`el-alert`),h=e(`el-button`),b=e(`el-table-column`),S=e(`el-tag`),C=e(`el-switch`),w=e(`el-table`),D=e(`el-card`),U=e(`el-space`),W=e(`el-input`),G=e(`el-radio-button`),K=e(`el-radio-group`),q=e(`el-drawer`),J=_(`loading`);return r(),u(`div`,null,[s.value?g(``,!0):(r(),T(p,{key:0,title:`插件安装器未启用(installer.enabled = false)`,type:`info`,closable:!1,class:`block`})),v(D,{class:`block`},{header:k(()=>[x(`div`,F,[i[4]||=x(`span`,null,`已加载插件`,-1),v(h,{size:`small`,onClick:j},{default:k(()=>[...i[3]||=[d(`刷新`,-1)]]),_:1})])]),default:k(()=>[t((r(),T(w,{data:a.value,size:`small`},{default:k(()=>[v(b,{prop:`id`,label:`ID`,width:`160`}),v(b,{prop:`version`,label:`版本`,width:`100`}),v(b,{prop:`description`,label:`说明`}),v(b,{label:`状态`,width:`110`},{default:k(({row:e})=>[v(S,{size:`small`,type:e.loaded?`success`:`info`},{default:k(()=>[d(l(e.loaded?`已加载`:`未加载`),1)]),_:2},1032,[`type`])]),_:1}),v(b,{label:`启用`,width:`80`},{default:k(({row:e})=>[v(C,{"model-value":e.enabled,onChange:t=>M(e,!!t)},null,8,[`model-value`,`onChange`])]),_:1}),v(b,{label:`操作`,width:`190`},{default:k(({row:e})=>[v(h,{size:`small`,onClick:t=>N(e)},{default:k(()=>[...i[5]||=[d(` 配置 `,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[J,c.value]])]),_:1}),v(D,null,{header:k(()=>[x(`div`,I,[i[7]||=x(`span`,null,`已安装 npm 包`,-1),v(U,null,{default:k(()=>[v(h,{size:`small`,onClick:V},{default:k(()=>[...i[6]||=[d(` 全部更新 `,-1)]]),_:1})]),_:1})])]),default:k(()=>[v(w,{data:o.value,size:`small`},{default:k(()=>[v(b,{prop:`packageName`,label:`包名`}),v(b,{prop:`version`,label:`版本`,width:`110`}),v(b,{label:`插件 ID`,width:`200`},{default:k(({row:e})=>[d(l((e.pluginIds??[]).join(`, `)),1)]),_:1}),v(b,{label:`卸载`,width:`110`},{default:k(({row:e})=>[v(h,{size:`small`,type:`danger`,onClick:t=>H(e)},{default:k(()=>[...i[8]||=[d(` 卸载 `,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])]),_:1}),v(D,{class:`block`},{default:k(()=>[v(U,null,{default:k(()=>[v(W,{modelValue:f.value,"onUpdate:modelValue":i[0]||=e=>f.value=e,placeholder:`包名,如 @scope/jsbot-plugin-xxx`,style:{width:`320px`}},null,8,[`modelValue`]),v(h,{type:`primary`,loading:c.value,onClick:B},{default:k(()=>[...i[9]||=[d(` 安装 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1}),v(q,{modelValue:m.value,"onUpdate:modelValue":i[2]||=e=>m.value=e,size:`620px`,title:`插件配置 · `+E.value},{footer:k(()=>[v(h,{onClick:i[1]||=e=>m.value=!1},{default:k(()=>[...i[12]||=[d(`取消`,-1)]]),_:1}),v(h,{type:`primary`,loading:c.value,onClick:z},{default:k(()=>[...i[13]||=[d(` 保存 `,-1)]]),_:1},8,[`loading`])]),default:k(()=>[x(`div`,L,[v(K,{"model-value":y.value,size:`small`,onChange:R},{default:k(()=>[v(G,{value:`form`},{default:k(()=>[...i[10]||=[d(`表单`,-1)]]),_:1}),v(G,{value:`json`},{default:k(()=>[...i[11]||=[d(`JSON`,-1)]]),_:1})]),_:1},8,[`model-value`])]),v(P,{ref_key:`formRef`,ref:A,options:O.value},null,8,[`options`])]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-c65df5c0`]]);export{R as default};
|
|
@@ -1 +0,0 @@
|
|
|
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 ee,_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 _,ni as v,p as y,qi as b,r as x,ri as S,t as C,ta as w,ui as T,zi as E}from"./api-Bm2KUKXH.js";var D={key:0},O={class:`message-content`},k={key:0,class:`sub`},A=20,j=d(T({__name:`SessionsView`,setup(d){let T=b([]),j=b(0),M=b(1),N=b(``),P=b(!1),F=b(!1),I=b(null),L=b(``),R=b({provider:``,model:``,persona:``}),z=b(``),B=b(``),V=b(!0),H=b(!1),U=async()=>{P.value=!0;try{let e=(M.value-1)*A,t=new URLSearchParams({limit:String(A),offset:String(e)});N.value&&t.set(`query`,N.value);let n=await _(`/api/sessions?${t.toString()}`);T.value=n.items,j.value=n.total}catch(e){u(e)}finally{P.value=!1}},W=e=>{M.value=e,U()},G=async e=>{try{let t=await _(`/api/sessions/${encodeURIComponent(e.sessionId)}`);I.value=t,L.value=e.sessionId,R.value={provider:t.provider??``,model:t.model??``,persona:t.persona??``},F.value=!0}catch(e){u(e)}},K=async()=>{if(I.value!==null)try{I.value=await f(`/api/sessions/${encodeURIComponent(L.value)}`,{provider:R.value.provider||null,model:R.value.model||null,persona:R.value.persona||null}),y.success(`已保存`),await U()}catch(e){u(e)}},q=async()=>{if(I.value!==null&&z.value)try{I.value=await x(`/api/sessions/${encodeURIComponent(L.value)}/messages`,{role:`user`,content:z.value}),z.value=``}catch(e){u(e)}},J=async()=>{if(B.value){H.value=!0;try{await x(`/api/sessions/${encodeURIComponent(L.value)}/send`,{message:B.value,autoEscape:V.value}),y.success(`已发送`),B.value=``}catch(e){u(e)}finally{H.value=!1}}},Y=async()=>{try{await C(`/api/sessions/${encodeURIComponent(L.value)}`),I.value=null,F.value=!1,await U()}catch(e){u(e)}},X=async e=>{try{await C(`/api/sessions/${encodeURIComponent(e.sessionId)}`),await U()}catch(e){u(e)}},Z=e=>e===`assistant`?`success`:e===`system`?`warning`:`primary`;return n(()=>void U()),(n,u)=>{let d=e(`el-input`),f=e(`el-button`),_=e(`el-space`),y=e(`el-card`),b=e(`el-table-column`),x=e(`el-table`),C=e(`el-pagination`),Q=e(`el-form-item`),te=e(`el-form`),$=e(`el-divider`),ne=e(`el-tag`),re=e(`el-checkbox`),ie=e(`el-drawer`),ae=m(`loading`);return r(),c(`div`,null,[g(y,{class:`block`},{default:E(()=>[g(_,null,{default:E(()=>[g(d,{modelValue:N.value,"onUpdate:modelValue":u[0]||=e=>N.value=e,placeholder:`搜索 session id`,clearable:``,style:{width:`260px`},onKeyup:i(U,[`enter`])},null,8,[`modelValue`]),g(f,{type:`primary`,onClick:U},{default:E(()=>[...u[8]||=[l(`搜索`,-1)]]),_:1})]),_:1})]),_:1}),g(y,null,{default:E(()=>[t((r(),S(x,{data:T.value,size:`small`,onRowClick:G},{default:E(()=>[g(b,{prop:`sessionId`,label:`Session ID`,"show-overflow-tooltip":``}),g(b,{label:`消息数`,width:`90`},{default:E(({row:e})=>[l(s(e.messageCount),1)]),_:1}),g(b,{label:`更新时间`,width:`180`},{default:E(({row:e})=>[l(s(w(h)(e.updatedAt)),1)]),_:1}),g(b,{label:`操作`,width:`160`},{default:E(({row:e})=>[g(f,{size:`small`,onClick:o(t=>G(e),[`stop`])},{default:E(()=>[...u[9]||=[l(` 详情 `,-1)]]),_:1},8,[`onClick`]),g(f,{size:`small`,type:`danger`,onClick:o(t=>X(e),[`stop`])},{default:E(()=>[...u[10]||=[l(` 清空 `,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[ae,P.value]]),g(C,{class:`pager`,layout:`total, prev, pager, next`,total:j.value,"page-size":A,"current-page":M.value,onCurrentChange:W},null,8,[`total`,`current-page`])]),_:1}),g(ie,{modelValue:F.value,"onUpdate:modelValue":u[7]||=e=>F.value=e,size:`45%`,title:`会话 `+L.value},{default:E(()=>[I.value?(r(),c(`div`,D,[g(te,{"label-width":`90px`,size:`small`},{default:E(()=>[g(Q,{label:`provider`},{default:E(()=>[g(d,{modelValue:R.value.provider,"onUpdate:modelValue":u[1]||=e=>R.value.provider=e},null,8,[`modelValue`])]),_:1}),g(Q,{label:`model`},{default:E(()=>[g(d,{modelValue:R.value.model,"onUpdate:modelValue":u[2]||=e=>R.value.model=e},null,8,[`modelValue`])]),_:1}),g(Q,{label:`persona`},{default:E(()=>[g(d,{modelValue:R.value.persona,"onUpdate:modelValue":u[3]||=e=>R.value.persona=e,type:`textarea`,rows:3},null,8,[`modelValue`])]),_:1}),g(Q,null,{default:E(()=>[g(f,{type:`primary`,onClick:K},{default:E(()=>[...u[11]||=[l(` 保存 `,-1)]]),_:1})]),_:1})]),_:1}),g($,null,{default:E(()=>[...u[12]||=[l(`LLM 消息`,-1)]]),_:1}),(r(!0),c(ee,null,a(I.value.messages,(e,t)=>(r(),c(`div`,{key:t,class:`message`},[g(ne,{size:`small`,type:Z(e.role)},{default:E(()=>[l(s(e.role),1)]),_:2},1032,[`type`]),v(`pre`,O,s(e.content),1)]))),128)),I.value.messages.length===0?(r(),c(`p`,k,`无消息`)):p(``,!0),g(d,{modelValue:z.value,"onUpdate:modelValue":u[4]||=e=>z.value=e,type:`textarea`,rows:3,placeholder:`追加 role=user 消息`,class:`block`},null,8,[`modelValue`]),g(f,{size:`small`,onClick:q},{default:E(()=>[...u[13]||=[l(`追加`,-1)]]),_:1}),g($,null,{default:E(()=>[...u[14]||=[l(`发送 QQ 消息`,-1)]]),_:1}),g(d,{modelValue:B.value,"onUpdate:modelValue":u[5]||=e=>B.value=e,type:`textarea`,rows:3,placeholder:`发送到此 session(等同机器人回复)`,class:`block`},null,8,[`modelValue`]),g(_,null,{default:E(()=>[g(f,{type:`primary`,size:`small`,loading:H.value,onClick:J},{default:E(()=>[...u[15]||=[l(` 发送 `,-1)]]),_:1},8,[`loading`]),g(re,{modelValue:V.value,"onUpdate:modelValue":u[6]||=e=>V.value=e},{default:E(()=>[...u[16]||=[l(`autoEscape`,-1)]]),_:1},8,[`modelValue`]),g(f,{type:`danger`,size:`small`,onClick:Y},{default:E(()=>[...u[17]||=[l(` 清空会话 `,-1)]]),_:1})]),_:1})])):p(``,!0)]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-6382784b`]]);export{j as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.block[data-v-6382784b]{margin-bottom:16px}.pager[data-v-6382784b]{margin-top:12px}.message[data-v-6382784b]{margin:8px 0}.message-content[data-v-6382784b]{background:var(--app-panel-2);border:1px solid var(--app-border);color:var(--app-text);white-space:pre-wrap;border-radius:8px;margin:4px 0 0;padding:8px;font-size:12px}.sub[data-v-6382784b]{color:var(--app-muted);font-size:12px}
|