@jsbot-tellus/core 2.8.0 → 2.9.1

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 (64) hide show
  1. package/dist/app/runtime.d.ts +1 -0
  2. package/dist/app/runtime.d.ts.map +1 -1
  3. package/dist/app/runtime.js +1 -0
  4. package/dist/app/runtime.js.map +1 -1
  5. package/dist/app.js +6 -1
  6. package/dist/app.js.map +1 -1
  7. package/dist/core/web/config-store.d.ts.map +1 -1
  8. package/dist/core/web/config-store.js +14 -10
  9. package/dist/core/web/config-store.js.map +1 -1
  10. package/dist/core/web/routes/plugins.d.ts.map +1 -1
  11. package/dist/core/web/routes/plugins.js +73 -15
  12. package/dist/core/web/routes/plugins.js.map +1 -1
  13. package/dist/core/web/types.d.ts +6 -0
  14. package/dist/core/web/types.d.ts.map +1 -1
  15. package/dist/webui/assets/ActionsView-CdRiwzyc.css +1 -0
  16. package/dist/webui/assets/{ActionsView-B3Q3rh2X.js → ActionsView-DpOwcpkP.js} +1 -1
  17. package/dist/webui/assets/ConfigView-BwDaxNs6.css +1 -0
  18. package/dist/webui/assets/ConfigView-C8W7Taes.js +1 -0
  19. package/dist/webui/assets/DashboardView-FAQEqfkT.css +1 -0
  20. package/dist/webui/assets/DashboardView-XR4MljXP.js +1 -0
  21. package/dist/webui/assets/EventsView-D6uxp8iJ.css +1 -0
  22. package/dist/webui/assets/EventsView-dsacXF6v.js +1 -0
  23. package/dist/webui/assets/KvView-ClHfDapd.css +1 -0
  24. package/dist/webui/assets/KvView-CleDcxJm.js +1 -0
  25. package/dist/webui/assets/LoginView-auw7iDds.js +1 -0
  26. package/dist/webui/assets/LoginView-rwItauSQ.css +1 -0
  27. package/dist/webui/assets/LogsView-Crns4wd2.css +1 -0
  28. package/dist/webui/assets/{LogsView-K7nWoSFe.js → LogsView-D94DH0eL.js} +1 -1
  29. package/dist/webui/assets/MainLayout-BLJl7wIh.css +1 -0
  30. package/dist/webui/assets/MainLayout-BSmZGVVc.js +1 -0
  31. package/dist/webui/assets/PluginsView-BrrSON7o.js +1 -0
  32. package/dist/webui/assets/PluginsView-BwP5MkvC.css +1 -0
  33. package/dist/webui/assets/SessionsView-CboU4cCN.js +1 -0
  34. package/dist/webui/assets/SessionsView-DOUCUUrw.css +1 -0
  35. package/dist/webui/assets/index-BX3-wbu2.css +1 -0
  36. package/dist/webui/assets/{index-CFz4VL67.js → index-BjnuYVEl.js} +2 -2
  37. package/dist/webui/assets/use-ui-scale-DvdJkOwB.js +1 -0
  38. package/dist/webui/index.html +8 -7
  39. package/docs/webui.md +1 -1
  40. package/package.json +1 -1
  41. package/src/app/runtime.ts +2 -0
  42. package/src/app.ts +6 -1
  43. package/src/core/web/config-store.ts +18 -12
  44. package/src/core/web/routes/plugins.ts +101 -21
  45. package/src/core/web/types.ts +7 -0
  46. package/dist/webui/assets/ActionsView-Ciib5lC6.css +0 -1
  47. package/dist/webui/assets/ConfigView-Baeqfi8s.js +0 -1
  48. package/dist/webui/assets/ConfigView-CrEpss2y.css +0 -1
  49. package/dist/webui/assets/DashboardView-DLKD8DqF.js +0 -1
  50. package/dist/webui/assets/DashboardView-DR6yCaqs.css +0 -1
  51. package/dist/webui/assets/EventsView-CGUPPvRI.js +0 -1
  52. package/dist/webui/assets/EventsView-PMkYKxZ-.css +0 -1
  53. package/dist/webui/assets/KvView-CaMvbxUz.css +0 -1
  54. package/dist/webui/assets/KvView-CeovApuA.js +0 -1
  55. package/dist/webui/assets/LoginView-BVnFkwSW.css +0 -1
  56. package/dist/webui/assets/LoginView-C2cfmXmS.js +0 -1
  57. package/dist/webui/assets/LogsView-NR4L1-XY.css +0 -1
  58. package/dist/webui/assets/MainLayout-bySbvMWB.js +0 -1
  59. package/dist/webui/assets/MainLayout-qhsp--2k.css +0 -1
  60. package/dist/webui/assets/PluginsView-DL9OxGph.css +0 -1
  61. package/dist/webui/assets/PluginsView-DQZu8in1.js +0 -1
  62. package/dist/webui/assets/SessionsView-C0vTCqqE.js +0 -1
  63. package/dist/webui/assets/SessionsView-p-u3JGTV.css +0 -1
  64. package/dist/webui/assets/index-Cs8jafCm.css +0 -1
@@ -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}