koishi-plugin-new-auth 0.4.4 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.js +1 -1
- package/dist/style.css +1 -1
- package/lib/index.d.ts +17 -21
- package/lib/index.js +58 -37
- package/newauth.md +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -89,7 +89,7 @@ guest
|
|
|
89
89
|
- 以角色为入口的指令权限编辑;
|
|
90
90
|
- 全局默认和单群作用域切换;
|
|
91
91
|
- 待配置指令审查和角色勾选分配;
|
|
92
|
-
- 旧 `authority` 建议与基于 ChatLuna
|
|
92
|
+
- 旧 `authority` 建议与基于 ChatLuna 模型的 AI 分配审查表;
|
|
93
93
|
- 指令状态和群内自治开关;
|
|
94
94
|
- 自定义角色创建、显式成员管理;
|
|
95
95
|
- 从其他角色复制权限;
|
|
@@ -97,4 +97,4 @@ guest
|
|
|
97
97
|
|
|
98
98
|
WebUI 是 Koishi 实例管理员界面,Console 入口和所有事件都要求 `authority: 4`。群主自治只应影响允许自治的单群指令,不等于进入实例管理面板。
|
|
99
99
|
|
|
100
|
-
AI 自动分配不会按关键词硬编码推断。安装并启用 ChatLuna
|
|
100
|
+
AI 自动分配不会按关键词硬编码推断。安装并启用 ChatLuna 后,newauth 会读取 ChatLuna 已加载的聊天模型,WebUI 中选择模型后再把指令元数据和角色列表交给该模型,让模型返回允许的角色;WebUI 会先显示审查表并填入勾选项,只有管理员点击保存后才写入策略。模型不可用或返回无效时回退到旧 `authority` 建议。
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineComponent as Ae,ref as d,computed as c,watch as Y,openBlock as s,createElementBlock as u,createElementVNode as t,toDisplayString as o,withDirectives as p,Fragment as h,renderList as k,vModelSelect as I,normalizeClass as $,createCommentVNode as T,withModifiers as ne,vModelText as N,vModelCheckbox as Re,createTextVNode as K}from"vue";import{store as oe,send as b}from"@koishijs/client";const Pe={class:"new-auth-page"},Ve={class:"topbar"},Ue={class:"top-actions"},xe=["value"],Me=["disabled"],Te=["disabled"],Ne={class:"tabs"},Oe={key:0,class:"error"},Ge={key:1,class:"role-layout"},Be={class:"role-list"},De=["onClick"],Ee=["disabled"],Le={key:0,class:"detail"},Fe={class:"detail-head"},Ke={class:"detail-tools"},je=["value"],qe=["disabled"],ze={class:"check"},He={class:"member-panel"},Je={class:"member-list"},Qe=["disabled","onClick"],We=["value"],Xe=["disabled"],Ye={class:"filters"},Ze={class:"command-list"},el={class:"command-main"},ll={class:"state-buttons"},tl=["onClick"],nl=["onClick"],ol=["onClick"],sl={key:2,class:"pending-panel"},ul={key:0,class:"review-table"},il={class:"role-picker"},al=["checked","onChange"],dl={class:"row-actions"},rl=["disabled","onClick"],vl=["disabled","onClick"],cl=["disabled","onClick"],pl={key:1,class:"empty"},gl={key:3,class:"commands-table"},bl={class:"filters"},fl={class:"plugin-bulk"},hl=["value"],kl=["disabled"],yl=["disabled"],ml=["disabled"],wl=["disabled"],_l={class:"command-main"},Cl={class:"command-controls"},Sl={class:"check"},Il=["checked","onChange"],$l=["value","onChange"],Al=Ae({__name:"new-auth",setup(U){const f=d("roles"),a=d("global"),v=d(""),_=d(""),A=d("all"),j=d(false),r=d(false),O=d(""),R=d(""),x=d(""),q=d("guild"),M=d(""),G=d("global"),B=d(""),C=d(""),y=d({}),z=d({}),m=c(()=>oe.newauth||{roles:[],commands:[],policies:[],members:[],scopes:[{id:"global",name:"全局默认"}],pendingCount:0,autoAssignAvailable:false}),S=c(()=>m.value.roles),D=c(()=>m.value.commands),H=c(()=>m.value.policies),se=c(()=>m.value.members),ue=c(()=>{var n;return(n=m.value.scopes)!=null&&n.length?m.value.scopes:[{id:"global",name:"全局默认"}]}),w=c(()=>D.value.filter(n=>n.status==="pending")),Z=c(()=>w.value.filter(n=>z.value[n.id])),P=c(()=>S.value.find(n=>n.id===v.value)),ee=c(()=>se.value.filter(n=>n.roleId===v.value)),ie=c(()=>S.value.filter(n=>n.id!==v.value)),ae=c(()=>[...new Set(D.value.map(n=>n.plugin))].sort());Y(S,n=>{!v.value&&n.length&&(v.value=n[0].id)},{immediate:true}),Y(a,n=>{G.value=n==="global"?"global":n}),Y([w,H,a],()=>{for(const n of w.value)E(n)},{immediate:true});const le=c(()=>{const n=_.value.toLowerCase();return D.value.filter(l=>A.value!=="all"&&l.status!==A.value?false:n?[l.id,l.name,l.commandPath,l.plugin,l.description].some(e=>e==null?void 0:e.toLowerCase().includes(n)):true)}),de=c(()=>P.value?le.value.filter(n=>{var l,e;return j.value||((l=P.value)==null?void 0:l.id)==="bot-admin"||((e=P.value)==null?void 0:e.scopeType)==="global"?true:n.allowGuildOverride}):[]);function J(n){const l=H.value.find(e=>e.scope===a.value&&e.roleId===v.value&&e.commandId===n);return(l==null?void 0:l.state)||"inherit"}async function g(n){r.value=true,O.value="";try{await n}catch(l){O.value=l instanceof Error?l.message:String(l)}finally{r.value=false}}async function re(){return g((async()=>{const n=await b("newauth/getData");oe.newauth=n})())}function Q(n,l){return g(b("newauth/setPolicy",{scope:a.value,roleId:v.value,commandId:n,state:l}))}function V(n){return`${a.value}:${n}`}function ve(n){const l=H.value.filter(e=>e.scope===a.value&&e.commandId===n.id&&e.state==="allow").map(e=>e.roleId);return l.length?l:[...n.suggestion.roles]}function E(n){const l=V(n.id);y.value[l]||(y.value[l]=ve(n))}function ce(n,l){return E(n),y.value[V(n.id)].includes(l)}function pe(n,l,e){E(n);const i=V(n.id),W=e.target.checked,X=new Set(y.value[i]);W?X.add(l):X.delete(l),y.value[i]=[...X]}function ge(n,l){y.value[V(n.id)]=[...n.suggestion.roles]}function L(n){return z.value[n.id]||n.autoAssign}function be(n){return L(n).roles.map(l=>{var e;return((e=S.value.find(i=>i.id===l))==null?void 0:e.name)||l}).join("、")||"无"}function te(n,l){z.value[n.id]=l,y.value[V(n.id)]=[...l.roles]}function fe(n){return g((async()=>{const l=await b("newauth/generateAiSuggestion",{commandId:n.id});te(n,l)})())}function he(){return g((async()=>{const n=await b("newauth/generateAiSuggestions");for(const l of w.value){const e=n.suggestions[l.id];e&&te(l,e)}})())}function ke(n){return E(n),g(b("newauth/configureCommandRoles",{commandId:n.id,scope:a.value,roleIds:y.value[V(n.id)]}))}function ye(n,l){const e=l.target;return g(b("newauth/setGuildOverride",{commandId:n.id,allowGuildOverride:e.checked}))}function me(n,l){const e=l.target;return g(b("newauth/setCommandStatus",{commandId:n.id,status:e.value}))}function we(){return g((async()=>{await b("newauth/createRole",{id:R.value,name:x.value,scopeType:q.value}),v.value=R.value,R.value="",x.value=""})())}function _e(){return g((async()=>{await b("newauth/addMember",{roleId:v.value,uid:M.value,scope:G.value}),M.value=""})())}function Ce(n){return g(b("newauth/removeMember",{roleId:n.roleId,uid:`${n.platform}:${n.userId}`,scope:n.scope}))}function Se(){return g(b("newauth/copyRolePolicies",{sourceRoleId:B.value,targetRoleId:v.value,scope:a.value}))}function Ie(n){return`${n.roleId}:${n.platform}:${n.userId}:${n.scope}`}function F(n){return g(b("newauth/assignPluginCommands",{plugin:C.value,scope:a.value,target:n}))}function $e(n){return n==="global"?"全局":"群内"}return(n,l)=>(s(),u("main",Pe,[t("header",Ve,[t("div",null,[l[20]||(l[20]=t("h1",null,"新权限",-1)),t("p",null,o(S.value.length)+" 个角色 / "+o(D.value.length)+" 个指令 / "+o(w.value.length)+" 个待配置",1)]),t("div",Ue,[p(t("select",{"onUpdate:modelValue":l[0]||(l[0]=e=>a.value=e),class:"scope-select"},[(s(true),u(h,null,k(ue.value,e=>(s(),u("option",{key:e.id,value:e.id},o(e.name),9,xe))),128))],512),[[I,a.value]]),t("button",{class:"primary",disabled:r.value||!w.value.length||!m.value.autoAssignAvailable,onClick:he}," AI 生成审查表 ",8,Me),t("button",{disabled:r.value,onClick:re},"刷新",8,Te)])]),t("nav",Ne,[t("button",{class:$({active:f.value==="roles"}),onClick:l[1]||(l[1]=e=>f.value="roles")},"角色",2),t("button",{class:$({active:f.value==="pending"}),onClick:l[2]||(l[2]=e=>f.value="pending")},"待配置",2),t("button",{class:$({active:f.value==="commands"}),onClick:l[3]||(l[3]=e=>f.value="commands")},"指令",2)]),O.value?(s(),u("p",Oe,o(O.value),1)):T("v-if",true),f.value==="roles"?(s(),u("section",Ge,[t("aside",Be,[(s(true),u(h,null,k(S.value,e=>(s(),u("button",{key:e.id,class:$(["role-item",{active:e.id===v.value}]),onClick:i=>v.value=e.id},[t("span",null,[t("strong",null,o(e.name),1),t("small",null,o(e.builtin?"内置角色":"自定义角色")+" / "+o($e(e.scopeType)),1)]),t("em",null,o(e.allowCount),1)],10,De))),128)),t("form",{class:"role-create",onSubmit:ne(we,["prevent"])},[p(t("input",{"onUpdate:modelValue":l[4]||(l[4]=e=>R.value=e),placeholder:"custom:music-admin"},null,512),[[N,R.value,void 0,{trim:true}]]),p(t("input",{"onUpdate:modelValue":l[5]||(l[5]=e=>x.value=e),placeholder:"角色名称"},null,512),[[N,x.value,void 0,{trim:true}]]),p(t("select",{"onUpdate:modelValue":l[6]||(l[6]=e=>q.value=e)},[...l[21]||(l[21]=[t("option",{value:"guild"},"群内角色",-1),t("option",{value:"global"},"全局角色",-1)])],512),[[I,q.value]]),t("button",{class:"primary",disabled:r.value||!R.value||!x.value},"创建角色",8,Ee)],32)]),P.value?(s(),u("section",Le,[t("div",Fe,[t("div",null,[t("h2",null,o(P.value.name),1),t("p",null,o(P.value.id),1)]),t("div",Ke,[p(t("select",{"onUpdate:modelValue":l[7]||(l[7]=e=>B.value=e)},[l[22]||(l[22]=t("option",{disabled:"",value:""},"复制来源",-1)),(s(true),u(h,null,k(ie.value,e=>(s(),u("option",{key:e.id,value:e.id},o(e.name),9,je))),128))],512),[[I,B.value]]),t("button",{disabled:r.value||!B.value,onClick:Se},"复制权限",8,qe),t("label",ze,[p(t("input",{type:"checkbox","onUpdate:modelValue":l[8]||(l[8]=e=>j.value=e)},null,512),[[Re,j.value]]),l[23]||(l[23]=K(" 审计模式 ",-1))])])]),t("section",He,[t("div",null,[l[24]||(l[24]=t("strong",null,"成员",-1)),t("small",null,o(ee.value.length)+" 个显式成员",1)]),t("div",Je,[(s(true),u(h,null,k(ee.value,e=>(s(),u("span",{key:Ie(e),class:"member-chip"},[K(o(e.platform)+":"+o(e.userId)+" / "+o(e.scope)+" ",1),t("button",{disabled:r.value,onClick:i=>Ce(e)},"移除",8,Qe)]))),128))]),t("form",{class:"member-add",onSubmit:ne(_e,["prevent"])},[p(t("input",{"onUpdate:modelValue":l[9]||(l[9]=e=>M.value=e),placeholder:"platform:userId"},null,512),[[N,M.value,void 0,{trim:true}]]),p(t("select",{"onUpdate:modelValue":l[10]||(l[10]=e=>G.value=e)},[l[25]||(l[25]=t("option",{value:"global"},"global",-1)),a.value!=="global"?(s(),u("option",{key:0,value:a.value},o(a.value),9,We)):T("v-if",true)],512),[[I,G.value]]),t("button",{class:"primary",disabled:r.value||!M.value},"添加成员",8,Xe)],32)]),t("div",Ye,[p(t("input",{"onUpdate:modelValue":l[11]||(l[11]=e=>_.value=e),placeholder:"搜索指令、插件、描述"},null,512),[[N,_.value,void 0,{trim:true}]]),p(t("select",{"onUpdate:modelValue":l[12]||(l[12]=e=>A.value=e)},[...l[26]||(l[26]=[t("option",{value:"all"},"全部状态",-1),t("option",{value:"pending"},"待配置",-1),t("option",{value:"configured"},"已配置",-1),t("option",{value:"disabled"},"已禁用",-1)])],512),[[I,A.value]])]),t("div",Ze,[(s(true),u(h,null,k(de.value,e=>(s(),u("article",{key:e.id,class:"command-row"},[t("div",el,[t("strong",null,o(e.name),1),t("span",null,o(e.commandPath),1),t("small",null,o(e.plugin)+" / legacy "+o(e.legacyAuthority)+" / "+o(e.suggestion.label),1)]),t("div",ll,[t("button",{class:$({active:J(e.id)==="inherit"}),onClick:i=>Q(e.id,"inherit")}," 继承 ",10,tl),t("button",{class:$({active:J(e.id)==="allow"}),onClick:i=>Q(e.id,"allow")}," 开 ",10,nl),t("button",{class:$({active:J(e.id)==="deny"}),onClick:i=>Q(e.id,"deny")}," 关 ",10,ol)])]))),128))])])):T("v-if",true)])):f.value==="pending"?(s(),u("section",sl,[Z.value.length?(s(),u("table",ul,[l[27]||(l[27]=t("thead",null,[t("tr",null,[t("th",null,"指令"),t("th",null,"建议角色"),t("th",null,"理由")])],-1)),t("tbody",null,[(s(true),u(h,null,k(Z.value,e=>(s(),u("tr",{key:`review:${e.id}`},[t("td",null,o(e.commandPath),1),t("td",null,o(be(e)),1),t("td",null,o(L(e).reason),1)]))),128))])])):T("v-if",true),(s(true),u(h,null,k(w.value,e=>(s(),u("article",{key:e.id,class:"pending-item"},[t("div",null,[t("strong",null,o(e.name),1),t("span",null,o(e.commandPath),1),t("small",null,o(e.plugin)+" / legacy "+o(e.legacyAuthority),1)]),t("dl",null,[l[28]||(l[28]=t("dt",null,"旧建议",-1)),t("dd",null,o(e.suggestion.label),1),l[29]||(l[29]=t("dt",null,"AI 状态",-1)),t("dd",null,o(L(e).label)+":"+o(L(e).reason),1)]),t("div",il,[(s(true),u(h,null,k(S.value,i=>(s(),u("label",{key:`${e.id}:${i.id}`,class:"check"},[t("input",{type:"checkbox",checked:ce(e,i.id),onChange:W=>pe(e,i.id,W)},null,40,al),K(" "+o(i.name),1)]))),128))]),t("div",dl,[t("button",{disabled:r.value,onClick:i=>ge(e)},"填入旧建议",8,rl),t("button",{disabled:r.value||!m.value.autoAssignAvailable,onClick:i=>fe(e)},"AI 生成建议",8,vl),t("button",{class:"primary",disabled:r.value,onClick:i=>ke(e)},"保存分配",8,cl)])]))),128)),w.value.length?T("v-if",true):(s(),u("p",pl,"没有待配置指令。"))])):(s(),u("section",gl,[t("div",bl,[p(t("input",{"onUpdate:modelValue":l[13]||(l[13]=e=>_.value=e),placeholder:"搜索指令、插件、描述"},null,512),[[N,_.value,void 0,{trim:true}]]),p(t("select",{"onUpdate:modelValue":l[14]||(l[14]=e=>A.value=e)},[...l[30]||(l[30]=[t("option",{value:"all"},"全部状态",-1),t("option",{value:"pending"},"待配置",-1),t("option",{value:"configured"},"已配置",-1),t("option",{value:"disabled"},"已禁用",-1)])],512),[[I,A.value]])]),t("div",fl,[p(t("select",{"onUpdate:modelValue":l[15]||(l[15]=e=>C.value=e)},[l[31]||(l[31]=t("option",{disabled:"",value:""},"选择插件",-1)),(s(true),u(h,null,k(ae.value,e=>(s(),u("option",{key:e,value:e},o(e),9,hl))),128))],512),[[I,C.value]]),t("button",{disabled:r.value||!C.value,onClick:l[16]||(l[16]=e=>F("legacy"))},"采用插件建议",8,kl),t("button",{disabled:r.value||!C.value,onClick:l[17]||(l[17]=e=>F("guild-member"))},"给群成员",8,yl),t("button",{disabled:r.value||!C.value,onClick:l[18]||(l[18]=e=>F("guild-admin"))},"给群管理员",8,ml),t("button",{disabled:r.value||!C.value,onClick:l[19]||(l[19]=e=>F("bot-admin"))},"仅 Bot 管理员",8,wl)]),(s(true),u(h,null,k(le.value,e=>(s(),u("article",{key:e.id,class:"command-row"},[t("div",_l,[t("strong",null,o(e.name),1),t("span",null,o(e.id),1),t("small",null,o(e.plugin)+" / "+o(e.commandPath)+" / "+o(e.autoAssign.label),1)]),t("div",Cl,[t("label",Sl,[t("input",{type:"checkbox",checked:e.allowGuildOverride,onChange:i=>ye(e,i)},null,40,Il),l[32]||(l[32]=K(" 群内自治 ",-1))]),t("select",{value:e.status,onChange:i=>me(e,i)},[...l[33]||(l[33]=[t("option",{value:"pending"},"待配置",-1),t("option",{value:"configured"},"已配置",-1),t("option",{value:"disabled"},"已禁用",-1)])],40,$l)])]))),128))]))]))}}),Rl=(U,f)=>{const a=U.__vccOpts||U;for(const[v,_]of f)a[v]=_;return a},Pl=Rl(Al,[["__scopeId","data-v-b9691780"]]),xl=U=>{U.page({name:"新权限",path:"/new-auth",icon:"⌗",fields:["newauth"],authority:4,component:Pl})};export{xl as default};
|
|
1
|
+
import{defineComponent as Te,ref as c,computed as b,watch as Q,resolveComponent as W,openBlock as u,createElementBlock as a,createElementVNode as l,toDisplayString as n,withDirectives as k,Fragment as w,renderList as C,vModelSelect as P,createVNode as i,withCtx as d,createTextVNode as v,createCommentVNode as U,normalizeClass as X,vModelText as F,vModelCheckbox as Oe}from"vue";import{store as ge,send as _}from"@koishijs/client";const Ge={class:"new-auth-page"},Le={class:"page-head"},Be={class:"head-actions"},De={class:"scope-control"},Ee=["value"],Fe={class:"summary-grid"},Ke={class:"summary-item"},je={class:"summary-item"},qe={class:"summary-item warning"},ze={class:"summary-item"},He={key:0,class:"error"},Je={key:1,class:"role-workspace"},Qe={class:"role-rail"},We={class:"rail-title"},Xe=["onClick"],Ye={class:"role-copy"},Ze={class:"role-count"},el={class:"disclosure"},ll={class:"stack compact"},tl={key:0,class:"role-detail"},sl={class:"card-title"},nl={class:"scope-badge"},ol={class:"role-facts"},ul={class:"card-title"},al={class:"inline-check"},il={class:"filters"},dl={class:"search-box"},rl={class:"command-list"},vl={class:"command-main"},cl={class:"state-buttons"},pl=["onClick"],gl=["onClick"],fl=["onClick"],bl={key:0,class:"empty"},ml={class:"disclosure advanced"},kl={class:"advanced-grid"},yl={class:"sub-panel"},_l={class:"sub-head"},hl={class:"member-list"},wl=["disabled","onClick"],Cl={key:0,class:"muted"},Il={class:"inline-form"},Sl=["value"],Al={class:"sub-panel"},$l={class:"sub-head"},Vl={class:"inline-form"},Rl=["value"],Pl={key:2,class:"pending-stack"},Ml={class:"card-title"},xl={class:"ai-controls"},Ul=["disabled"],Nl=["value"],Tl={key:0,class:"review-table"},Ol={class:"pending-list"},Gl={class:"pending-main"},Ll={class:"command-main"},Bl={class:"role-picker"},Dl=["checked","onChange"],El={class:"inline-disclosure"},Fl={class:"row-actions"},Kl={key:0,class:"empty"},jl={key:3,class:"audit-stack"},ql={class:"disclosure advanced"},zl={class:"bulk-panel"},Hl=["value"],Jl={class:"card-title"},Ql={class:"filters"},Wl={class:"search-box"},Xl={class:"audit-list"},Yl={class:"command-main"},Zl={class:"audit-controls"},et={class:"inline-check"},lt=["checked","onChange"],tt=["value","onChange"],st=Te({__name:"new-auth",setup(L){const N=c("roles"),r=c("global"),m=c(""),M=c(""),T=c("all"),Y=c(false),g=c(false),K=c(""),O=c(""),B=c(""),Z=c("guild"),D=c(""),j=c("global"),q=c(""),x=c(""),A=c(""),$=c({}),ee=c({}),h=b(()=>ge.newauth||{roles:[],commands:[],policies:[],members:[],scopes:[{id:"global",name:"全局默认"}],pendingCount:0,autoAssignAvailable:false,aiModels:[],defaultAiModel:""}),V=b(()=>h.value.roles),E=b(()=>h.value.commands),le=b(()=>h.value.policies),fe=b(()=>h.value.members),de=b(()=>{var s;return(s=h.value.scopes)!=null&&s.length?h.value.scopes:[{id:"global",name:"全局默认"}]}),re=b(()=>h.value.aiModels||[]),te=b(()=>{var s;return((s=de.value.find(e=>e.id===r.value))==null?void 0:s.name)||r.value}),I=b(()=>E.value.filter(s=>s.status==="pending")),ve=b(()=>I.value.filter(s=>ee.value[s.id])),S=b(()=>V.value.find(s=>s.id===m.value)),se=b(()=>fe.value.filter(s=>s.roleId===m.value)),be=b(()=>V.value.filter(s=>s.id!==m.value)),me=b(()=>[...new Set(E.value.map(s=>s.plugin))].sort());Q(V,s=>{!m.value&&s.length&&(m.value=s[0].id)},{immediate:true}),Q(r,s=>{j.value=s==="global"?"global":s}),Q(h,s=>{var e,o;A.value||(A.value=s.defaultAiModel||((o=(e=s.aiModels)==null?void 0:e[0])==null?void 0:o.id)||"")},{immediate:true}),Q([I,le,r],()=>{for(const s of I.value)z(s)},{immediate:true});const ne=b(()=>{const s=M.value.toLowerCase();return E.value.filter(e=>T.value!=="all"&&e.status!==T.value?false:s?[e.id,e.name,e.commandPath,e.plugin,e.description].some(o=>o==null?void 0:o.toLowerCase().includes(s)):true)}),oe=b(()=>S.value?ne.value.filter(s=>{var e,o;return Y.value||((e=S.value)==null?void 0:e.id)==="bot-admin"||((o=S.value)==null?void 0:o.scopeType)==="global"?true:s.allowGuildOverride}):[]);function ue(s){const e=le.value.find(o=>o.scope===r.value&&o.roleId===m.value&&o.commandId===s);return(e==null?void 0:e.state)||"inherit"}async function y(s){g.value=true,K.value="";try{await s}catch(e){K.value=e instanceof Error?e.message:String(e)}finally{g.value=false}}async function ke(){return y((async()=>{const s=await _("newauth/getData");ge.newauth=s})())}function ae(s,e){return y(_("newauth/setPolicy",{scope:r.value,roleId:m.value,commandId:s,state:e}))}function G(s){return`${r.value}:${s}`}function ye(s){const e=le.value.filter(o=>o.scope===r.value&&o.commandId===s.id&&o.state==="allow").map(o=>o.roleId);return e.length?e:[...s.suggestion.roles]}function z(s){const e=G(s.id);$.value[e]||($.value[e]=ye(s))}function _e(s,e){return z(s),$.value[G(s.id)].includes(e)}function he(s,e,o){z(s);const p=G(s.id),ie=o.target.checked,R=new Set($.value[p]);ie?R.add(e):R.delete(e),$.value[p]=[...R]}function we(s,e){$.value[G(s.id)]=[...s.suggestion.roles]}function H(s){return ee.value[s.id]||s.autoAssign}function Ce(s){return H(s).roles.map(e=>{var o;return((o=V.value.find(p=>p.id===e))==null?void 0:o.name)||e}).join("、")||"无"}function ce(s,e){ee.value[s.id]=e,$.value[G(s.id)]=[...e.roles]}function Ie(s){return y((async()=>{const e=await _("newauth/generateAiSuggestion",{commandId:s.id,model:A.value});ce(s,e)})())}function Se(){return y((async()=>{const s=await _("newauth/generateAiSuggestions",{model:A.value});for(const e of I.value){const o=s.suggestions[e.id];o&&ce(e,o)}})())}function Ae(s){return z(s),y(_("newauth/configureCommandRoles",{commandId:s.id,scope:r.value,roleIds:$.value[G(s.id)]}))}function $e(s,e){const o=e.target;return y(_("newauth/setGuildOverride",{commandId:s.id,allowGuildOverride:o.checked}))}function Ve(s,e){const o=e.target;return y(_("newauth/setCommandStatus",{commandId:s.id,status:o.value}))}function Re(){return y((async()=>{await _("newauth/createRole",{id:O.value,name:B.value,scopeType:Z.value}),m.value=O.value,O.value="",B.value=""})())}function Pe(){return y((async()=>{await _("newauth/addMember",{roleId:m.value,uid:D.value,scope:j.value}),D.value=""})())}function Me(s){return y(_("newauth/removeMember",{roleId:s.roleId,uid:`${s.platform}:${s.userId}`,scope:s.scope}))}function xe(){return y(_("newauth/copyRolePolicies",{sourceRoleId:q.value,targetRoleId:m.value,scope:r.value}))}function Ue(s){return`${s.roleId}:${s.platform}:${s.userId}:${s.scope}`}function J(s){return y(_("newauth/assignPluginCommands",{plugin:x.value,scope:r.value,target:s}))}function pe(s){return s==="global"?"全局":"群内"}return(s,e)=>{const o=W("k-icon"),p=W("k-button"),ie=W("k-tab"),R=W("k-card");return u(),a("main",Ge,[l("header",Le,[l("div",null,[e[19]||(e[19]=l("h1",null,"新权限",-1)),l("p",null,n(te.value)+" / "+n(I.value.length)+" 个待配置指令",1)]),l("div",Be,[l("label",De,[e[20]||(e[20]=l("span",null,"范围",-1)),k(l("select",{"onUpdate:modelValue":e[0]||(e[0]=t=>r.value=t),class:"control"},[(u(true),a(w,null,C(de.value,t=>(u(),a("option",{key:t.id,value:t.id},n(t.name),9,Ee))),128))],512),[[P,r.value]])]),i(p,{disabled:g.value,onClick:ke},{default:d(()=>[i(o,{name:"redo"}),e[21]||(e[21]=v(" 刷新 ",-1))]),_:1},8,["disabled"])])]),l("section",Fe,[l("div",Ke,[e[22]||(e[22]=l("span",null,"角色",-1)),l("strong",null,n(V.value.length),1)]),l("div",je,[e[23]||(e[23]=l("span",null,"指令",-1)),l("strong",null,n(E.value.length),1)]),l("div",qe,[e[24]||(e[24]=l("span",null,"待配置",-1)),l("strong",null,n(I.value.length),1)]),l("div",ze,[e[25]||(e[25]=l("span",null,"AI",-1)),l("strong",null,n(h.value.autoAssignAvailable?"可用":"未接入"),1)])]),i(ie,{modelValue:N.value,"onUpdate:modelValue":e[1]||(e[1]=t=>N.value=t),data:{roles:"角色",pending:"待配置",commands:"指令审计"}},null,8,["modelValue"]),K.value?(u(),a("p",He,n(K.value),1)):U("v-if",true),N.value==="roles"?(u(),a("section",Je,[l("aside",Qe,[l("div",We,[e[26]||(e[26]=l("strong",null,"角色",-1)),l("span",null,n(V.value.length),1)]),(u(true),a(w,null,C(V.value,t=>(u(),a("button",{key:t.id,class:X(["role-item",{active:t.id===m.value}]),onClick:f=>m.value=t.id},[l("span",Ye,[l("strong",null,n(t.name),1),l("small",null,n(t.builtin?"内置":"自定义")+" / "+n(pe(t.scopeType)),1)]),l("span",Ze,n(t.allowCount),1)],10,Xe))),128)),l("details",el,[l("summary",null,[i(o,{name:"user"}),e[27]||(e[27]=v(" 新建角色 ",-1))]),l("div",ll,[k(l("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>O.value=t),class:"control",placeholder:"custom:music-admin"},null,512),[[F,O.value,void 0,{trim:true}]]),k(l("input",{"onUpdate:modelValue":e[3]||(e[3]=t=>B.value=t),class:"control",placeholder:"角色名称"},null,512),[[F,B.value,void 0,{trim:true}]]),k(l("select",{"onUpdate:modelValue":e[4]||(e[4]=t=>Z.value=t),class:"control"},[...e[28]||(e[28]=[l("option",{value:"guild"},"群内角色",-1),l("option",{value:"global"},"全局角色",-1)])],512),[[P,Z.value]]),i(p,{solid:"",disabled:g.value||!O.value||!B.value,onClick:Re},{default:d(()=>[i(o,{name:"check-full"}),e[29]||(e[29]=v(" 创建 ",-1))]),_:1},8,["disabled"])])])]),S.value?(u(),a("section",tl,[i(R,{class:"role-summary"},{header:d(()=>[l("div",sl,[l("div",null,[l("h2",null,n(S.value.name),1),l("p",null,n(S.value.id),1)]),l("span",nl,n(pe(S.value.scopeType)),1)])]),default:d(()=>[l("div",ol,[l("span",null,n(S.value.builtin?"内置角色":"自定义角色"),1),l("span",null,n(te.value),1),l("span",null,n(S.value.allowCount)+" 个全局允许",1)])]),_:1}),i(R,{class:"permission-card"},{header:d(()=>[l("div",ul,[l("div",null,[e[30]||(e[30]=l("h2",null,"指令权限",-1)),l("p",null,n(oe.value.length)+" 个当前可见指令",1)]),l("label",al,[k(l("input",{type:"checkbox","onUpdate:modelValue":e[5]||(e[5]=t=>Y.value=t)},null,512),[[Oe,Y.value]]),e[31]||(e[31]=v(" 审计模式 ",-1))])])]),default:d(()=>[l("div",il,[l("label",dl,[i(o,{name:"search"}),k(l("input",{"onUpdate:modelValue":e[6]||(e[6]=t=>M.value=t),placeholder:"搜索指令、插件、描述"},null,512),[[F,M.value,void 0,{trim:true}]])]),k(l("select",{"onUpdate:modelValue":e[7]||(e[7]=t=>T.value=t),class:"control"},[...e[32]||(e[32]=[l("option",{value:"all"},"全部状态",-1),l("option",{value:"pending"},"待配置",-1),l("option",{value:"configured"},"已配置",-1),l("option",{value:"disabled"},"已禁用",-1)])],512),[[P,T.value]])]),l("div",rl,[(u(true),a(w,null,C(oe.value,t=>(u(),a("article",{key:t.id,class:"command-row"},[l("div",vl,[l("strong",null,n(t.name),1),l("span",null,n(t.commandPath),1),l("small",null,n(t.plugin)+" / "+n(t.suggestion.label),1)]),l("div",cl,[l("button",{class:X({active:ue(t.id)==="inherit"}),onClick:f=>ae(t.id,"inherit")}," 继承 ",10,pl),l("button",{class:X({active:ue(t.id)==="allow"}),onClick:f=>ae(t.id,"allow")}," 开 ",10,gl),l("button",{class:X({active:ue(t.id)==="deny"}),onClick:f=>ae(t.id,"deny")}," 关 ",10,fl)])]))),128)),oe.value.length?U("v-if",true):(u(),a("p",bl,"没有匹配的指令。"))])]),_:1}),l("details",ml,[l("summary",null,[i(o,{name:"tools"}),e[33]||(e[33]=v(" 高级管理 ",-1))]),l("div",kl,[l("section",yl,[l("div",_l,[e[34]||(e[34]=l("strong",null,"显式成员",-1)),l("span",null,n(se.value.length),1)]),l("div",hl,[(u(true),a(w,null,C(se.value,t=>(u(),a("span",{key:Ue(t),class:"member-chip"},[v(n(t.platform)+":"+n(t.userId)+" / "+n(t.scope)+" ",1),l("button",{disabled:g.value,onClick:f=>Me(t)},"移除",8,wl)]))),128)),se.value.length?U("v-if",true):(u(),a("p",Cl,"无显式成员。"))]),l("div",Il,[k(l("input",{"onUpdate:modelValue":e[8]||(e[8]=t=>D.value=t),class:"control",placeholder:"platform:userId"},null,512),[[F,D.value,void 0,{trim:true}]]),k(l("select",{"onUpdate:modelValue":e[9]||(e[9]=t=>j.value=t),class:"control"},[e[35]||(e[35]=l("option",{value:"global"},"global",-1)),r.value!=="global"?(u(),a("option",{key:0,value:r.value},n(r.value),9,Sl)):U("v-if",true)],512),[[P,j.value]]),i(p,{solid:"",disabled:g.value||!D.value,onClick:Pe},{default:d(()=>[...e[36]||(e[36]=[v("添加",-1)])]),_:1},8,["disabled"])])]),l("section",Al,[l("div",$l,[e[37]||(e[37]=l("strong",null,"复制权限",-1)),l("span",null,n(te.value),1)]),l("div",Vl,[k(l("select",{"onUpdate:modelValue":e[10]||(e[10]=t=>q.value=t),class:"control"},[e[38]||(e[38]=l("option",{disabled:"",value:""},"复制来源",-1)),(u(true),a(w,null,C(be.value,t=>(u(),a("option",{key:t.id,value:t.id},n(t.name),9,Rl))),128))],512),[[P,q.value]]),i(p,{disabled:g.value||!q.value,onClick:xe},{default:d(()=>[i(o,{name:"clipboard-list"}),e[39]||(e[39]=v(" 复制 ",-1))]),_:1},8,["disabled"])])])])])])):U("v-if",true)])):N.value==="pending"?(u(),a("section",Pl,[i(R,null,{header:d(()=>[l("div",Ml,[l("div",null,[e[40]||(e[40]=l("h2",null,"待配置指令",-1)),l("p",null,n(I.value.length)+" 个新增指令等待实例管理员确认",1)]),l("div",xl,[k(l("select",{"onUpdate:modelValue":e[11]||(e[11]=t=>A.value=t),class:"control",disabled:g.value||!re.value.length},[e[41]||(e[41]=l("option",{disabled:"",value:""},"选择 ChatLuna 模型",-1)),(u(true),a(w,null,C(re.value,t=>(u(),a("option",{key:t.id,value:t.id},n(t.id),9,Nl))),128))],8,Ul),[[P,A.value]]),i(p,{solid:"",disabled:g.value||!I.value.length||!h.value.autoAssignAvailable||!A.value,onClick:Se},{default:d(()=>[i(o,{name:"start"}),e[42]||(e[42]=v(" AI 生成审查表 ",-1))]),_:1},8,["disabled"])])])]),default:d(()=>[ve.value.length?(u(),a("table",Tl,[e[43]||(e[43]=l("thead",null,[l("tr",null,[l("th",null,"指令"),l("th",null,"建议角色"),l("th",null,"理由")])],-1)),l("tbody",null,[(u(true),a(w,null,C(ve.value,t=>(u(),a("tr",{key:`review:${t.id}`},[l("td",null,n(t.commandPath),1),l("td",null,n(Ce(t)),1),l("td",null,n(H(t).reason),1)]))),128))])])):U("v-if",true),l("div",Ol,[(u(true),a(w,null,C(I.value,t=>(u(),a("article",{key:t.id,class:"pending-row"},[l("div",Gl,[l("div",Ll,[l("strong",null,n(t.name),1),l("span",null,n(t.commandPath),1),l("small",null,n(t.plugin)+" / legacy "+n(t.legacyAuthority),1)]),l("dl",null,[e[44]||(e[44]=l("dt",null,"旧建议",-1)),l("dd",null,n(t.suggestion.label),1),e[45]||(e[45]=l("dt",null,"AI",-1)),l("dd",null,n(H(t).label)+":"+n(H(t).reason),1)])]),l("div",Bl,[(u(true),a(w,null,C(V.value,f=>(u(),a("label",{key:`${t.id}:${f.id}`,class:"check-tile"},[l("input",{type:"checkbox",checked:_e(t,f.id),onChange:Ne=>he(t,f.id,Ne)},null,40,Dl),v(" "+n(f.name),1)]))),128))]),l("details",El,[e[46]||(e[46]=l("summary",null,"元数据",-1)),l("code",null,n(t.id),1),l("p",null,n(t.description||"无描述"),1)]),l("div",Fl,[i(p,{disabled:g.value,onClick:f=>we(t)},{default:d(()=>[...e[47]||(e[47]=[v("填入旧建议",-1)])]),_:1},8,["disabled","onClick"]),i(p,{disabled:g.value||!h.value.autoAssignAvailable||!A.value,onClick:f=>Ie(t)},{default:d(()=>[i(o,{name:"start"}),e[48]||(e[48]=v(" AI 建议 ",-1))]),_:1},8,["disabled","onClick"]),i(p,{solid:"",disabled:g.value,onClick:f=>Ae(t)},{default:d(()=>[i(o,{name:"check-full"}),e[49]||(e[49]=v(" 保存分配 ",-1))]),_:1},8,["disabled","onClick"])])]))),128)),I.value.length?U("v-if",true):(u(),a("p",Kl,"没有待配置指令。"))])]),_:1})])):(u(),a("section",jl,[l("details",ql,[l("summary",null,[i(o,{name:"tools"}),e[50]||(e[50]=v(" 批量操作 ",-1))]),l("div",zl,[k(l("select",{"onUpdate:modelValue":e[12]||(e[12]=t=>x.value=t),class:"control"},[e[51]||(e[51]=l("option",{disabled:"",value:""},"选择插件",-1)),(u(true),a(w,null,C(me.value,t=>(u(),a("option",{key:t,value:t},n(t),9,Hl))),128))],512),[[P,x.value]]),i(p,{disabled:g.value||!x.value,onClick:e[13]||(e[13]=t=>J("legacy"))},{default:d(()=>[...e[52]||(e[52]=[v("采用插件建议",-1)])]),_:1},8,["disabled"]),i(p,{disabled:g.value||!x.value,onClick:e[14]||(e[14]=t=>J("guild-member"))},{default:d(()=>[...e[53]||(e[53]=[v("给群成员",-1)])]),_:1},8,["disabled"]),i(p,{disabled:g.value||!x.value,onClick:e[15]||(e[15]=t=>J("guild-admin"))},{default:d(()=>[...e[54]||(e[54]=[v("给群管理员",-1)])]),_:1},8,["disabled"]),i(p,{disabled:g.value||!x.value,onClick:e[16]||(e[16]=t=>J("bot-admin"))},{default:d(()=>[...e[55]||(e[55]=[v("仅 Bot 管理员",-1)])]),_:1},8,["disabled"])])]),i(R,null,{header:d(()=>[l("div",Jl,[l("div",null,[e[56]||(e[56]=l("h2",null,"指令审计",-1)),l("p",null,n(ne.value.length)+" / "+n(E.value.length),1)])])]),default:d(()=>[l("div",Ql,[l("label",Wl,[i(o,{name:"search"}),k(l("input",{"onUpdate:modelValue":e[17]||(e[17]=t=>M.value=t),placeholder:"搜索指令、插件、描述"},null,512),[[F,M.value,void 0,{trim:true}]])]),k(l("select",{"onUpdate:modelValue":e[18]||(e[18]=t=>T.value=t),class:"control"},[...e[57]||(e[57]=[l("option",{value:"all"},"全部状态",-1),l("option",{value:"pending"},"待配置",-1),l("option",{value:"configured"},"已配置",-1),l("option",{value:"disabled"},"已禁用",-1)])],512),[[P,T.value]])]),l("div",Xl,[(u(true),a(w,null,C(ne.value,t=>(u(),a("article",{key:t.id,class:"audit-row"},[l("div",Yl,[l("strong",null,n(t.name),1),l("span",null,n(t.commandPath),1),l("small",null,n(t.plugin)+" / "+n(t.id),1)]),l("div",Zl,[l("label",et,[l("input",{type:"checkbox",checked:t.allowGuildOverride,onChange:f=>$e(t,f)},null,40,lt),e[58]||(e[58]=v(" 群内自治 ",-1))]),l("select",{value:t.status,class:"control",onChange:f=>Ve(t,f)},[...e[59]||(e[59]=[l("option",{value:"pending"},"待配置",-1),l("option",{value:"configured"},"已配置",-1),l("option",{value:"disabled"},"已禁用",-1)])],40,tt)])]))),128))])]),_:1})]))])}}}),nt=(L,N)=>{const r=L.__vccOpts||L;for(const[m,M]of N)r[m]=M;return r},ot=nt(st,[["__scopeId","data-v-3935e256"]]),it=L=>{L.page({name:"新权限",path:"/new-auth",icon:"⌗",fields:["newauth"],authority:4,component:ot})};export{it as default};
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.new-auth-page[data-v-b9691780]{min-height:100vh;background:#eef2f6;color:#18222d;padding:20px}.topbar[data-v-b9691780],.detail-head[data-v-b9691780],.filters[data-v-b9691780],.row-actions[data-v-b9691780],.command-controls[data-v-b9691780],.top-actions[data-v-b9691780],.detail-tools[data-v-b9691780],.member-add[data-v-b9691780],.plugin-bulk[data-v-b9691780]{display:flex;align-items:center;gap:12px}.topbar[data-v-b9691780]{justify-content:space-between;border:1px solid #d7dee8;border-radius:8px;background:#fff;box-shadow:0 8px 24px #20304814;padding:16px}h1[data-v-b9691780],h2[data-v-b9691780],p[data-v-b9691780]{margin:0}h1[data-v-b9691780]{font-size:26px;line-height:1.2}h2[data-v-b9691780]{font-size:20px}p[data-v-b9691780],small[data-v-b9691780],span[data-v-b9691780],dd[data-v-b9691780],dt[data-v-b9691780]{color:#607083}button[data-v-b9691780],select[data-v-b9691780],input[data-v-b9691780]{border:1px solid #c9d3df;border-radius:6px;background:#fff;color:#18222d;min-height:34px;padding:0 10px;font:inherit}button[data-v-b9691780]{cursor:pointer;transition:border-color .16s ease,box-shadow .16s ease,background .16s ease}button[data-v-b9691780]:not(:disabled):hover,select[data-v-b9691780]:focus,input[data-v-b9691780]:focus{border-color:#2d6cdf;box-shadow:0 0 0 3px #2d6cdf1f;outline:none}button[data-v-b9691780]:disabled{cursor:not-allowed;opacity:.55}.primary[data-v-b9691780]{background:#1d6f68;border-color:#1d6f68;color:#fff}.tabs[data-v-b9691780]{display:flex;gap:6px;margin:16px 0}.tabs button[data-v-b9691780]{background:#f8fafc}.tabs button.active[data-v-b9691780],.state-buttons button.active[data-v-b9691780]{background:#17202b;border-color:#17202b;color:#fff}.role-layout[data-v-b9691780]{display:grid;grid-template-columns:minmax(220px,280px) 1fr;gap:16px}.role-list[data-v-b9691780]{display:grid;gap:8px;align-content:start}.role-create[data-v-b9691780]{display:grid;gap:8px;border:1px solid #d7dee8;border-radius:8px;background:#fff;padding:10px;box-shadow:0 4px 14px #2030480d}.role-item[data-v-b9691780]{display:flex;justify-content:space-between;align-items:center;min-height:58px;text-align:left}.role-item span[data-v-b9691780],.command-main[data-v-b9691780]{display:grid;gap:3px;min-width:0}.role-item.active[data-v-b9691780]{border-color:#2d6cdf;box-shadow:inset 3px 0 #2d6cdf,0 4px 14px #2d6cdf1f}.role-item em[data-v-b9691780]{font-style:normal;color:#9a5a00}.detail[data-v-b9691780]{min-width:0}.detail-head[data-v-b9691780]{justify-content:space-between;margin-bottom:12px}.detail-tools[data-v-b9691780]{flex-wrap:wrap;justify-content:flex-end}.member-panel[data-v-b9691780]{display:grid;gap:10px;border:1px solid #d7dee8;border-radius:8px;background:#fff;padding:12px;margin-bottom:12px;box-shadow:0 4px 14px #2030480d}.member-panel>div[data-v-b9691780]:first-child{display:flex;justify-content:space-between;gap:12px}.member-list[data-v-b9691780]{display:flex;flex-wrap:wrap;gap:6px;min-height:28px}.member-chip[data-v-b9691780]{display:inline-flex;align-items:center;gap:6px;border:1px solid #c9d3df;border-radius:999px;background:#f8fafc;padding:3px 4px 3px 10px}.member-chip button[data-v-b9691780]{min-height:24px;padding:0 8px;border-radius:999px}.filters[data-v-b9691780]{margin-bottom:12px}.plugin-bulk[data-v-b9691780]{flex-wrap:wrap;border:1px solid #d7dee8;border-radius:8px;background:#fff;padding:10px;margin-bottom:12px;box-shadow:0 4px 14px #2030480d}.filters input[data-v-b9691780]{flex:1;min-width:180px}.command-list[data-v-b9691780],.pending-panel[data-v-b9691780],.commands-table[data-v-b9691780]{display:grid;gap:8px}.command-row[data-v-b9691780],.pending-item[data-v-b9691780]{background:#fff;border:1px solid #d7dee8;border-radius:8px;padding:12px;box-shadow:0 4px 14px #2030480d}.command-row[data-v-b9691780]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:center}.command-main strong[data-v-b9691780],.command-main span[data-v-b9691780],.command-main small[data-v-b9691780]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.state-buttons[data-v-b9691780]{display:grid;grid-template-columns:repeat(3,54px);gap:6px}.pending-panel[data-v-b9691780]{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.review-table[data-v-b9691780]{grid-column:1 / -1;width:100%;border-collapse:collapse;overflow:hidden;border:1px solid #d7dee8;border-radius:8px;background:#fff;box-shadow:0 4px 14px #2030480d}.review-table th[data-v-b9691780],.review-table td[data-v-b9691780]{border-bottom:1px solid #e5ebf1;padding:10px;text-align:left;vertical-align:top}.review-table th[data-v-b9691780]{background:#f8fafc;color:#314155;font-weight:600}.review-table tr:last-child td[data-v-b9691780]{border-bottom:0}.pending-item[data-v-b9691780]{display:grid;gap:10px}.role-picker[data-v-b9691780]{display:grid;grid-template-columns:repeat(auto-fill,minmax(128px,1fr));gap:8px}.role-picker .check[data-v-b9691780]{border:1px solid #d7dee8;border-radius:6px;background:#f8fafc;min-height:32px;padding:0 8px}dl[data-v-b9691780]{display:grid;grid-template-columns:58px 1fr;gap:4px 8px;margin:0}dd[data-v-b9691780]{margin:0}.check[data-v-b9691780]{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}.check input[data-v-b9691780]{min-height:0}.error[data-v-b9691780]{border:1px solid #e2a15d;background:#fff6e9;color:#85510d;border-radius:6px;padding:10px;margin-bottom:12px}.empty[data-v-b9691780]{padding:24px 0}@media (max-width: 760px){.new-auth-page[data-v-b9691780]{padding:12px}.topbar[data-v-b9691780],.detail-head[data-v-b9691780],.command-row[data-v-b9691780]{grid-template-columns:1fr;display:grid}.top-actions[data-v-b9691780],.filters[data-v-b9691780],.command-controls[data-v-b9691780],.detail-tools[data-v-b9691780],.member-add[data-v-b9691780],.plugin-bulk[data-v-b9691780]{flex-wrap:wrap}.role-layout[data-v-b9691780]{grid-template-columns:1fr}.state-buttons[data-v-b9691780]{grid-template-columns:repeat(3,minmax(0,1fr))}}
|
|
1
|
+
.new-auth-page[data-v-3935e256]{min-height:100vh;background:#eef2f6;color:#18222d;padding:20px}.topbar[data-v-3935e256],.detail-head[data-v-3935e256],.filters[data-v-3935e256],.row-actions[data-v-3935e256],.command-controls[data-v-3935e256],.top-actions[data-v-3935e256],.detail-tools[data-v-3935e256],.member-add[data-v-3935e256],.plugin-bulk[data-v-3935e256]{display:flex;align-items:center;gap:12px}.topbar[data-v-3935e256]{justify-content:space-between;border:1px solid #d7dee8;border-radius:8px;background:#fff;box-shadow:0 8px 24px #20304814;padding:16px}h1[data-v-3935e256],h2[data-v-3935e256],p[data-v-3935e256]{margin:0}h1[data-v-3935e256]{font-size:26px;line-height:1.2}h2[data-v-3935e256]{font-size:20px}p[data-v-3935e256],small[data-v-3935e256],span[data-v-3935e256],dd[data-v-3935e256],dt[data-v-3935e256]{color:#607083}button[data-v-3935e256],select[data-v-3935e256],input[data-v-3935e256]{border:1px solid #c9d3df;border-radius:6px;background:#fff;color:#18222d;min-height:34px;padding:0 10px;font:inherit}button[data-v-3935e256]{cursor:pointer;transition:border-color .16s ease,box-shadow .16s ease,background .16s ease}button[data-v-3935e256]:not(:disabled):hover,select[data-v-3935e256]:focus,input[data-v-3935e256]:focus{border-color:#2d6cdf;box-shadow:0 0 0 3px #2d6cdf1f;outline:none}button[data-v-3935e256]:disabled{cursor:not-allowed;opacity:.55}.primary[data-v-3935e256]{background:#1d6f68;border-color:#1d6f68;color:#fff}.tabs[data-v-3935e256]{display:flex;gap:6px;margin:16px 0}.tabs button[data-v-3935e256]{background:#f8fafc}.tabs button.active[data-v-3935e256],.state-buttons button.active[data-v-3935e256]{background:#17202b;border-color:#17202b;color:#fff}.role-layout[data-v-3935e256]{display:grid;grid-template-columns:minmax(220px,280px) 1fr;gap:16px}.role-list[data-v-3935e256]{display:grid;gap:8px;align-content:start}.role-create[data-v-3935e256]{display:grid;gap:8px;border:1px solid #d7dee8;border-radius:8px;background:#fff;padding:10px;box-shadow:0 4px 14px #2030480d}.role-item[data-v-3935e256]{display:flex;justify-content:space-between;align-items:center;min-height:58px;text-align:left}.role-item span[data-v-3935e256],.command-main[data-v-3935e256]{display:grid;gap:3px;min-width:0}.role-item.active[data-v-3935e256]{border-color:#2d6cdf;box-shadow:inset 3px 0 #2d6cdf,0 4px 14px #2d6cdf1f}.role-item em[data-v-3935e256]{font-style:normal;color:#9a5a00}.detail[data-v-3935e256]{min-width:0}.detail-head[data-v-3935e256]{justify-content:space-between;margin-bottom:12px}.detail-tools[data-v-3935e256]{flex-wrap:wrap;justify-content:flex-end}.member-panel[data-v-3935e256]{display:grid;gap:10px;border:1px solid #d7dee8;border-radius:8px;background:#fff;padding:12px;margin-bottom:12px;box-shadow:0 4px 14px #2030480d}.member-panel>div[data-v-3935e256]:first-child{display:flex;justify-content:space-between;gap:12px}.member-list[data-v-3935e256]{display:flex;flex-wrap:wrap;gap:6px;min-height:28px}.member-chip[data-v-3935e256]{display:inline-flex;align-items:center;gap:6px;border:1px solid #c9d3df;border-radius:999px;background:#f8fafc;padding:3px 4px 3px 10px}.member-chip button[data-v-3935e256]{min-height:24px;padding:0 8px;border-radius:999px}.filters[data-v-3935e256]{margin-bottom:12px}.plugin-bulk[data-v-3935e256]{flex-wrap:wrap;border:1px solid #d7dee8;border-radius:8px;background:#fff;padding:10px;margin-bottom:12px;box-shadow:0 4px 14px #2030480d}.filters input[data-v-3935e256]{flex:1;min-width:180px}.command-list[data-v-3935e256],.pending-panel[data-v-3935e256],.commands-table[data-v-3935e256]{display:grid;gap:8px}.command-row[data-v-3935e256],.pending-item[data-v-3935e256]{background:#fff;border:1px solid #d7dee8;border-radius:8px;padding:12px;box-shadow:0 4px 14px #2030480d}.command-row[data-v-3935e256]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:center}.state-buttons[data-v-3935e256]{display:grid;grid-template-columns:repeat(3,54px);gap:6px}.pending-panel[data-v-3935e256]{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.review-table[data-v-3935e256]{grid-column:1 / -1;width:100%;border-collapse:collapse;overflow:hidden;border:1px solid #d7dee8;border-radius:8px;background:#fff;box-shadow:0 4px 14px #2030480d}.review-table th[data-v-3935e256],.review-table td[data-v-3935e256]{border-bottom:1px solid #e5ebf1;padding:10px;text-align:left;vertical-align:top}.review-table th[data-v-3935e256]{background:#f8fafc;color:#314155;font-weight:600}.review-table tr:last-child td[data-v-3935e256]{border-bottom:0}.pending-item[data-v-3935e256]{display:grid;gap:10px}.role-picker[data-v-3935e256]{display:grid;grid-template-columns:repeat(auto-fill,minmax(128px,1fr));gap:8px}.role-picker .check[data-v-3935e256]{border:1px solid #d7dee8;border-radius:6px;background:#f8fafc;min-height:32px;padding:0 8px}dl[data-v-3935e256]{display:grid;grid-template-columns:58px 1fr;gap:4px 8px;margin:0}dd[data-v-3935e256]{margin:0}.check[data-v-3935e256]{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}.check input[data-v-3935e256]{min-height:0}.error[data-v-3935e256]{border:1px solid #e2a15d;background:#fff6e9;color:#85510d;border-radius:6px;padding:10px;margin-bottom:12px}.empty[data-v-3935e256]{padding:24px 0}@media (max-width: 760px){.new-auth-page[data-v-3935e256]{padding:12px}.topbar[data-v-3935e256],.detail-head[data-v-3935e256],.command-row[data-v-3935e256]{grid-template-columns:1fr;display:grid}.top-actions[data-v-3935e256],.filters[data-v-3935e256],.command-controls[data-v-3935e256],.detail-tools[data-v-3935e256],.member-add[data-v-3935e256],.plugin-bulk[data-v-3935e256]{flex-wrap:wrap}.role-layout[data-v-3935e256]{grid-template-columns:1fr}.state-buttons[data-v-3935e256]{grid-template-columns:repeat(3,minmax(0,1fr))}}.new-auth-page[data-v-3935e256]{min-height:100vh;box-sizing:border-box;background:var(--k-page-bg);color:var(--k-text-dark);padding:24px}.page-head[data-v-3935e256],.summary-grid[data-v-3935e256],.role-workspace[data-v-3935e256],.card-title[data-v-3935e256],.head-actions[data-v-3935e256],.filters[data-v-3935e256],.row-actions[data-v-3935e256],.audit-controls[data-v-3935e256],.bulk-panel[data-v-3935e256],.inline-form[data-v-3935e256],.ai-controls[data-v-3935e256],.role-facts[data-v-3935e256]{display:flex;align-items:center;gap:12px}.page-head[data-v-3935e256]{justify-content:space-between;margin-bottom:18px}.page-head h1[data-v-3935e256],.card-title h2[data-v-3935e256]{margin:0;color:var(--k-text-dark);letter-spacing:0}.page-head h1[data-v-3935e256]{font-size:26px;line-height:1.2}.page-head p[data-v-3935e256],.card-title p[data-v-3935e256],.muted[data-v-3935e256],small[data-v-3935e256],dt[data-v-3935e256],dd[data-v-3935e256]{margin:0;color:var(--k-text-normal)}.head-actions[data-v-3935e256]{flex-wrap:wrap;justify-content:flex-end}.scope-control[data-v-3935e256]{display:grid;gap:4px;color:var(--k-text-light);font-size:12px}.control[data-v-3935e256],.search-box input[data-v-3935e256],button[data-v-3935e256]{box-sizing:border-box;border:1px solid var(--k-color-border);border-radius:6px;background:var(--k-card-bg);color:var(--k-text-dark);min-height:32px;font:inherit}.control[data-v-3935e256],.search-box input[data-v-3935e256]{padding:0 10px}.control[data-v-3935e256]:focus,.search-box input[data-v-3935e256]:focus{border-color:var(--k-color-active);box-shadow:0 0 0 2px var(--k-color-primary-fade);outline:none}.summary-grid[data-v-3935e256]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin-bottom:18px}.summary-item[data-v-3935e256]{display:grid;gap:6px;border:1px solid var(--k-card-border);border-radius:8px;background:var(--k-card-bg);box-shadow:var(--k-card-shadow);padding:14px 16px}.summary-item span[data-v-3935e256]{color:var(--k-text-normal)}.summary-item strong[data-v-3935e256]{color:var(--k-text-dark);font-size:24px}.summary-item.warning strong[data-v-3935e256]{color:var(--k-color-warning)}.k-horizontal-tab[data-v-3935e256]{display:inline-block;margin:0 0 18px}.role-workspace[data-v-3935e256]{align-items:flex-start;display:grid;grid-template-columns:minmax(220px,280px) minmax(0,1fr);gap:18px}.role-rail[data-v-3935e256],.role-detail[data-v-3935e256],.pending-stack[data-v-3935e256],.audit-stack[data-v-3935e256]{display:grid;gap:12px}.role-rail[data-v-3935e256]{position:sticky;top:16px}.rail-title[data-v-3935e256]{display:flex;justify-content:space-between;color:var(--k-text-normal);padding:0 2px}.role-item[data-v-3935e256]{width:100%;display:flex;justify-content:space-between;align-items:center;gap:12px;min-height:58px;padding:10px 12px;text-align:left;background:var(--k-card-bg);border-color:var(--k-card-border);box-shadow:var(--k-card-shadow)}.role-item[data-v-3935e256]:hover{background:var(--k-hover-bg)}.role-item.active[data-v-3935e256]{border-color:var(--k-color-active);box-shadow:inset 3px 0 0 var(--k-color-active),var(--k-card-shadow)}.role-copy[data-v-3935e256]{display:grid;gap:3px;min-width:0}.role-copy strong[data-v-3935e256],.command-main strong[data-v-3935e256]{color:var(--k-text-dark)}.role-count[data-v-3935e256],.scope-badge[data-v-3935e256]{color:var(--k-color-warning);font-weight:700}.card-title[data-v-3935e256]{justify-content:space-between;width:100%;align-items:flex-start}.role-facts[data-v-3935e256]{flex-wrap:wrap}.role-facts span[data-v-3935e256],.scope-badge[data-v-3935e256]{border:1px solid var(--k-color-divider);border-radius:999px;padding:3px 9px;background:var(--k-hover-bg)}.filters[data-v-3935e256]{margin:0 0 12px}.search-box[data-v-3935e256]{flex:1;display:flex;align-items:center;gap:8px;border:1px solid var(--k-color-border);border-radius:6px;background:var(--k-card-bg);min-width:220px;padding:0 10px}.search-box input[data-v-3935e256]{flex:1;border:0;box-shadow:none;min-width:0;padding:0}.command-list[data-v-3935e256],.pending-list[data-v-3935e256],.audit-list[data-v-3935e256]{display:grid;gap:8px}.command-row[data-v-3935e256],.pending-row[data-v-3935e256],.audit-row[data-v-3935e256]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:center;border:1px solid var(--k-color-divider);border-radius:8px;background:var(--k-card-bg);padding:12px}.pending-row[data-v-3935e256]{grid-template-columns:minmax(280px,1.1fr) minmax(260px,1fr) auto}.command-main[data-v-3935e256]{display:grid;gap:3px;min-width:0}.command-main strong[data-v-3935e256],.command-main span[data-v-3935e256],.command-main small[data-v-3935e256]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.state-buttons[data-v-3935e256]{display:grid;grid-template-columns:repeat(3,56px);gap:6px}.state-buttons button[data-v-3935e256]{background:transparent;color:var(--k-text-normal);min-height:30px;padding:0 8px}.state-buttons button.active[data-v-3935e256]{background:var(--k-color-active);border-color:var(--k-color-active);color:#fff}.inline-check[data-v-3935e256],.check-tile[data-v-3935e256]{display:inline-flex;align-items:center;gap:6px;color:var(--k-text-normal);white-space:nowrap}.role-picker[data-v-3935e256]{display:grid;grid-template-columns:repeat(auto-fill,minmax(112px,1fr));gap:8px}.check-tile[data-v-3935e256]{border:1px solid var(--k-color-divider);border-radius:6px;background:var(--k-hover-bg);min-height:32px;padding:0 8px}.review-table[data-v-3935e256]{margin-bottom:12px;width:100%;border-collapse:collapse;border:1px solid var(--k-color-divider);border-radius:8px;overflow:hidden;background:var(--k-card-bg)}.review-table th[data-v-3935e256],.review-table td[data-v-3935e256]{border-bottom:1px solid var(--k-color-divider);padding:10px 12px;text-align:left;vertical-align:top}.review-table th[data-v-3935e256]{color:var(--k-text-dark);background:var(--k-hover-bg)}dl[data-v-3935e256]{display:grid;grid-template-columns:58px minmax(0,1fr);gap:4px 10px;margin:8px 0 0}dd[data-v-3935e256]{min-width:0}.disclosure[data-v-3935e256]{border:1px solid var(--k-color-divider);border-radius:8px;background:var(--k-card-bg);box-shadow:var(--k-card-shadow);padding:0}.disclosure summary[data-v-3935e256],.inline-disclosure summary[data-v-3935e256]{display:flex;align-items:center;gap:8px;cursor:pointer;color:var(--k-text-dark);padding:10px 12px;-webkit-user-select:none;user-select:none}.stack[data-v-3935e256],.advanced-grid[data-v-3935e256],.bulk-panel[data-v-3935e256]{padding:0 12px 12px}.stack[data-v-3935e256]{display:grid;gap:8px}.advanced-grid[data-v-3935e256]{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}.sub-panel[data-v-3935e256]{display:grid;gap:10px;border:1px solid var(--k-color-divider);border-radius:8px;padding:12px}.sub-head[data-v-3935e256]{display:flex;justify-content:space-between;color:var(--k-text-normal)}.member-list[data-v-3935e256]{display:flex;flex-wrap:wrap;gap:6px}.member-chip[data-v-3935e256]{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--k-color-divider);border-radius:999px;background:var(--k-hover-bg);padding:3px 4px 3px 10px}.member-chip button[data-v-3935e256]{min-height:24px;border-radius:999px;padding:0 8px}.ai-controls[data-v-3935e256],.bulk-panel[data-v-3935e256],.inline-form[data-v-3935e256],.row-actions[data-v-3935e256],.audit-controls[data-v-3935e256]{flex-wrap:wrap;justify-content:flex-end}.ai-controls .control[data-v-3935e256]{min-width:260px}.inline-disclosure[data-v-3935e256]{color:var(--k-text-normal)}.inline-disclosure summary[data-v-3935e256]{padding:0}.inline-disclosure code[data-v-3935e256]{display:block;margin-top:6px;color:var(--k-text-normal);font-family:var(--font-family-code)}.error[data-v-3935e256]{border:1px solid var(--k-color-warning);background:var(--k-color-warning-fade);color:var(--k-color-warning);border-radius:8px;padding:10px 12px;margin-bottom:12px}.empty[data-v-3935e256]{color:var(--k-text-normal);padding:24px 0}@media (max-width: 900px){.summary-grid[data-v-3935e256]{grid-template-columns:repeat(2,minmax(0,1fr))}.role-workspace[data-v-3935e256],.pending-row[data-v-3935e256],.command-row[data-v-3935e256],.audit-row[data-v-3935e256]{grid-template-columns:1fr}.role-rail[data-v-3935e256]{position:static}.card-title[data-v-3935e256],.page-head[data-v-3935e256]{flex-wrap:wrap}}
|
package/lib/index.d.ts
CHANGED
|
@@ -75,15 +75,8 @@ declare module '@koishijs/plugin-console' {
|
|
|
75
75
|
'newauth/setGuildOverride'(payload: SetGuildOverridePayload): Promise<{
|
|
76
76
|
success: true;
|
|
77
77
|
}>;
|
|
78
|
-
'newauth/applySuggestion'(payload: ApplySuggestionPayload): Promise<{
|
|
79
|
-
success: true;
|
|
80
|
-
}>;
|
|
81
|
-
'newauth/autoAssignPending'(payload?: AutoAssignPayload): Promise<{
|
|
82
|
-
success: true;
|
|
83
|
-
count: number;
|
|
84
|
-
}>;
|
|
85
78
|
'newauth/generateAiSuggestion'(payload: AiSuggestionPayload): Promise<AutoAssignSuggestion>;
|
|
86
|
-
'newauth/generateAiSuggestions'(payload?:
|
|
79
|
+
'newauth/generateAiSuggestions'(payload?: AiSuggestionsPayload): Promise<{
|
|
87
80
|
suggestions: Record<string, AutoAssignSuggestion>;
|
|
88
81
|
}>;
|
|
89
82
|
'newauth/configureCommandRoles'(payload: ConfigureCommandRolesPayload): Promise<{
|
|
@@ -116,6 +109,8 @@ export interface NewAuthConsoleData {
|
|
|
116
109
|
scopes: ScopeView[];
|
|
117
110
|
pendingCount: number;
|
|
118
111
|
autoAssignAvailable: boolean;
|
|
112
|
+
aiModels: AiModelView[];
|
|
113
|
+
defaultAiModel: string;
|
|
119
114
|
}
|
|
120
115
|
export interface RoleView extends NewAuthRoleRecord {
|
|
121
116
|
allowCount: number;
|
|
@@ -137,6 +132,11 @@ export interface AutoAssignSuggestion extends RoleSuggestion {
|
|
|
137
132
|
kind: AutoAssignKind;
|
|
138
133
|
reason: string;
|
|
139
134
|
}
|
|
135
|
+
export interface AiModelView {
|
|
136
|
+
id: string;
|
|
137
|
+
name: string;
|
|
138
|
+
platform: string;
|
|
139
|
+
}
|
|
140
140
|
interface SetPolicyPayload {
|
|
141
141
|
scope: string;
|
|
142
142
|
roleId: string;
|
|
@@ -151,17 +151,12 @@ interface SetGuildOverridePayload {
|
|
|
151
151
|
commandId: string;
|
|
152
152
|
allowGuildOverride: boolean;
|
|
153
153
|
}
|
|
154
|
-
interface ApplySuggestionPayload {
|
|
155
|
-
commandId: string;
|
|
156
|
-
scope?: string;
|
|
157
|
-
mode?: 'legacy' | 'advisor';
|
|
158
|
-
}
|
|
159
|
-
interface AutoAssignPayload {
|
|
160
|
-
scope?: string;
|
|
161
|
-
mode?: 'legacy' | 'advisor';
|
|
162
|
-
}
|
|
163
154
|
interface AiSuggestionPayload {
|
|
164
155
|
commandId: string;
|
|
156
|
+
model?: string;
|
|
157
|
+
}
|
|
158
|
+
interface AiSuggestionsPayload {
|
|
159
|
+
model?: string;
|
|
165
160
|
}
|
|
166
161
|
interface ConfigureCommandRolesPayload {
|
|
167
162
|
commandId: string;
|
|
@@ -274,10 +269,10 @@ export declare class NewAuthService extends Service {
|
|
|
274
269
|
setCommandStatus(input: string, status: CommandStatus): Promise<NewAuthCommandRecord>;
|
|
275
270
|
setCommandGuildOverride(input: string, allowGuildOverride: boolean): Promise<NewAuthCommandRecord>;
|
|
276
271
|
setCommandPolicy(scope: string, roleId: string, input: string, state: PolicyState): Promise<NewAuthCommandRecord>;
|
|
277
|
-
applySuggestedPolicy(input: string, scope?: string
|
|
272
|
+
applySuggestedPolicy(input: string, scope?: string): Promise<NewAuthCommandRecord>;
|
|
278
273
|
configureCommandRoles(input: string, scope?: string, roleIds?: string[]): Promise<NewAuthCommandRecord>;
|
|
279
|
-
generateAiSuggestion(input: string): Promise<AutoAssignSuggestion>;
|
|
280
|
-
generateAiSuggestionsForPending(): Promise<Record<string, AutoAssignSuggestion>>;
|
|
274
|
+
generateAiSuggestion(input: string, model?: string): Promise<AutoAssignSuggestion>;
|
|
275
|
+
generateAiSuggestionsForPending(model?: string): Promise<Record<string, AutoAssignSuggestion>>;
|
|
281
276
|
listGuildManageableCommands(session: Session, query?: string): Promise<{
|
|
282
277
|
command: NewAuthCommandRecord;
|
|
283
278
|
states: string[];
|
|
@@ -286,7 +281,6 @@ export declare class NewAuthService extends Service {
|
|
|
286
281
|
command: NewAuthCommandRecord;
|
|
287
282
|
scope: string;
|
|
288
283
|
}>;
|
|
289
|
-
autoAssignPending(scope?: string, mode?: 'legacy' | 'advisor'): Promise<number>;
|
|
290
284
|
assignPluginCommands(plugin: string, scope?: string, target?: PluginAssignTarget): Promise<number>;
|
|
291
285
|
getCommand(input: string): Promise<NewAuthCommandRecord>;
|
|
292
286
|
private ensureBuiltinRoles;
|
|
@@ -298,6 +292,8 @@ export declare class NewAuthService extends Service {
|
|
|
298
292
|
private getEffectivePolicy;
|
|
299
293
|
private ensureGuildManager;
|
|
300
294
|
private getAutoAssignSuggestion;
|
|
295
|
+
private getDefaultAiModel;
|
|
296
|
+
private listAiModels;
|
|
301
297
|
private hasAiAdvisor;
|
|
302
298
|
private getAiAssignSuggestion;
|
|
303
299
|
private ensureRoleMember;
|
package/lib/index.js
CHANGED
|
@@ -110,7 +110,7 @@ function apply(ctx, config) {
|
|
|
110
110
|
ctx.on('command-updated', command => service.registerCommand(command));
|
|
111
111
|
ctx.before('command/execute', async (argv) => {
|
|
112
112
|
return service.intercept(argv);
|
|
113
|
-
});
|
|
113
|
+
}, true);
|
|
114
114
|
registerManagementCommands(ctx, config, service);
|
|
115
115
|
ctx.inject(['console'], (ctx) => {
|
|
116
116
|
registerConsole(ctx, service);
|
|
@@ -353,6 +353,8 @@ class NewAuthService extends koishi_1.Service {
|
|
|
353
353
|
const globalAllow = new Set(policies
|
|
354
354
|
.filter(policy => policy.scope === 'global' && policy.state === 'allow')
|
|
355
355
|
.map(policy => `${policy.roleId}:${policy.commandId}`));
|
|
356
|
+
const aiModels = this.listAiModels();
|
|
357
|
+
const defaultAiModel = this.getDefaultAiModel();
|
|
356
358
|
return {
|
|
357
359
|
roles: roles.map(role => ({
|
|
358
360
|
...role,
|
|
@@ -369,7 +371,9 @@ class NewAuthService extends koishi_1.Service {
|
|
|
369
371
|
members,
|
|
370
372
|
scopes,
|
|
371
373
|
pendingCount: commands.filter(command => command.status === 'pending').length,
|
|
372
|
-
autoAssignAvailable: this.hasAiAdvisor(),
|
|
374
|
+
autoAssignAvailable: this.hasAiAdvisor(defaultAiModel || aiModels[0]?.id),
|
|
375
|
+
aiModels,
|
|
376
|
+
defaultAiModel,
|
|
373
377
|
};
|
|
374
378
|
}
|
|
375
379
|
async addBotAdmin(uid) {
|
|
@@ -462,11 +466,9 @@ class NewAuthService extends koishi_1.Service {
|
|
|
462
466
|
}
|
|
463
467
|
return command;
|
|
464
468
|
}
|
|
465
|
-
async applySuggestedPolicy(input, scope = 'global'
|
|
469
|
+
async applySuggestedPolicy(input, scope = 'global') {
|
|
466
470
|
const command = await this.resolveCommandInput(input);
|
|
467
|
-
const suggestion =
|
|
468
|
-
? await this.getAiAssignSuggestion(command)
|
|
469
|
-
: getLegacySuggestion(command.legacyAuthority);
|
|
471
|
+
const suggestion = getLegacySuggestion(command.legacyAuthority);
|
|
470
472
|
await this.applyRolesToCommand(scope, command.id, suggestion.roles);
|
|
471
473
|
if (command.status === 'pending') {
|
|
472
474
|
await this.setCommandStatus(command.id, 'configured');
|
|
@@ -481,15 +483,15 @@ class NewAuthService extends koishi_1.Service {
|
|
|
481
483
|
}
|
|
482
484
|
return command;
|
|
483
485
|
}
|
|
484
|
-
async generateAiSuggestion(input) {
|
|
486
|
+
async generateAiSuggestion(input, model) {
|
|
485
487
|
const command = await this.resolveCommandInput(input);
|
|
486
|
-
return this.getAiAssignSuggestion(command);
|
|
488
|
+
return this.getAiAssignSuggestion(command, model);
|
|
487
489
|
}
|
|
488
|
-
async generateAiSuggestionsForPending() {
|
|
490
|
+
async generateAiSuggestionsForPending(model) {
|
|
489
491
|
const commands = await this.listCommands({ pending: true });
|
|
490
492
|
const suggestions = {};
|
|
491
493
|
for (const command of commands) {
|
|
492
|
-
suggestions[command.id] = await this.getAiAssignSuggestion(command);
|
|
494
|
+
suggestions[command.id] = await this.getAiAssignSuggestion(command, model);
|
|
493
495
|
}
|
|
494
496
|
return suggestions;
|
|
495
497
|
}
|
|
@@ -527,19 +529,12 @@ class NewAuthService extends koishi_1.Service {
|
|
|
527
529
|
await this.setPolicy(scope, role.id, command.id, state);
|
|
528
530
|
return { command, scope };
|
|
529
531
|
}
|
|
530
|
-
async autoAssignPending(scope = 'global', mode = 'advisor') {
|
|
531
|
-
const commands = await this.listCommands({ pending: true });
|
|
532
|
-
for (const command of commands) {
|
|
533
|
-
await this.applySuggestedPolicy(command.id, scope, mode);
|
|
534
|
-
}
|
|
535
|
-
return commands.length;
|
|
536
|
-
}
|
|
537
532
|
async assignPluginCommands(plugin, scope = 'global', target = 'legacy') {
|
|
538
533
|
const commands = (await this.listCommands({ all: true }))
|
|
539
534
|
.filter(command => command.plugin === plugin);
|
|
540
535
|
for (const command of commands) {
|
|
541
536
|
if (target === 'legacy') {
|
|
542
|
-
await this.applySuggestedPolicy(command.id, scope
|
|
537
|
+
await this.applySuggestedPolicy(command.id, scope);
|
|
543
538
|
}
|
|
544
539
|
else {
|
|
545
540
|
await this.applyRolesToCommand(scope, command.id, getAssignTargetRoles(target));
|
|
@@ -675,17 +670,52 @@ class NewAuthService extends koishi_1.Service {
|
|
|
675
670
|
reason: '未调用 AI 时只显示旧 authority 建议,不做关键词推断。',
|
|
676
671
|
};
|
|
677
672
|
}
|
|
678
|
-
|
|
673
|
+
getDefaultAiModel() {
|
|
679
674
|
const chatluna = this.ctx.chatluna;
|
|
680
675
|
const defaultModel = chatluna?.currentConfig?.defaultModel ?? chatluna?.config?.defaultModel;
|
|
676
|
+
return typeof defaultModel === 'string' && defaultModel !== '无' ? defaultModel : '';
|
|
677
|
+
}
|
|
678
|
+
listAiModels() {
|
|
679
|
+
const chatluna = this.ctx.chatluna;
|
|
680
|
+
const models = chatluna?.platform?.listAllModels?.(1)?.value ?? [];
|
|
681
|
+
const seen = new Set();
|
|
682
|
+
const result = [];
|
|
683
|
+
for (const model of models) {
|
|
684
|
+
const id = typeof model?.toModelName === 'function'
|
|
685
|
+
? String(model.toModelName())
|
|
686
|
+
: model?.platform && model?.name
|
|
687
|
+
? `${model.platform}/${model.name}`
|
|
688
|
+
: '';
|
|
689
|
+
if (!id || seen.has(id))
|
|
690
|
+
continue;
|
|
691
|
+
seen.add(id);
|
|
692
|
+
result.push({
|
|
693
|
+
id,
|
|
694
|
+
platform: String(model.platform ?? id.split('/')[0] ?? ''),
|
|
695
|
+
name: String(model.name ?? id),
|
|
696
|
+
});
|
|
697
|
+
}
|
|
698
|
+
const defaultModel = this.getDefaultAiModel();
|
|
699
|
+
if (defaultModel && !seen.has(defaultModel)) {
|
|
700
|
+
const index = defaultModel.indexOf('/');
|
|
701
|
+
result.unshift({
|
|
702
|
+
id: defaultModel,
|
|
703
|
+
platform: index > 0 ? defaultModel.slice(0, index) : '',
|
|
704
|
+
name: index > 0 ? defaultModel.slice(index + 1) : defaultModel,
|
|
705
|
+
});
|
|
706
|
+
}
|
|
707
|
+
return result.sort((a, b) => a.id.localeCompare(b.id));
|
|
708
|
+
}
|
|
709
|
+
hasAiAdvisor(model) {
|
|
710
|
+
const chatluna = this.ctx.chatluna;
|
|
711
|
+
const selectedModel = model || this.getDefaultAiModel();
|
|
681
712
|
return typeof chatluna?.createChatModel === 'function'
|
|
682
|
-
&&
|
|
683
|
-
&& !!defaultModel
|
|
684
|
-
&& defaultModel !== '无';
|
|
713
|
+
&& !!selectedModel;
|
|
685
714
|
}
|
|
686
|
-
async getAiAssignSuggestion(command) {
|
|
715
|
+
async getAiAssignSuggestion(command, modelName) {
|
|
687
716
|
const fallback = getLegacySuggestion(command.legacyAuthority);
|
|
688
|
-
|
|
717
|
+
const selectedModel = modelName || this.getDefaultAiModel();
|
|
718
|
+
if (!this.hasAiAdvisor(selectedModel)) {
|
|
689
719
|
return {
|
|
690
720
|
kind: 'legacy',
|
|
691
721
|
roles: fallback.roles,
|
|
@@ -696,8 +726,7 @@ class NewAuthService extends koishi_1.Service {
|
|
|
696
726
|
try {
|
|
697
727
|
const roles = await this.listRoles();
|
|
698
728
|
const chatluna = this.ctx.chatluna;
|
|
699
|
-
const
|
|
700
|
-
const modelRef = await chatluna.createChatModel(defaultModel);
|
|
729
|
+
const modelRef = await chatluna.createChatModel(selectedModel);
|
|
701
730
|
const model = modelRef?.value;
|
|
702
731
|
if (typeof model?.invoke !== 'function')
|
|
703
732
|
throw new Error('ChatLuna 模型未就绪');
|
|
@@ -813,19 +842,11 @@ function registerConsole(ctx, service) {
|
|
|
813
842
|
ctx.console.addListener('newauth/setGuildOverride', async (payload) => {
|
|
814
843
|
return ok(service.setCommandGuildOverride(payload.commandId, payload.allowGuildOverride));
|
|
815
844
|
}, { authority: 4 });
|
|
816
|
-
ctx.console.addListener('newauth/applySuggestion', async (payload) => {
|
|
817
|
-
return ok(service.applySuggestedPolicy(payload.commandId, payload.scope, payload.mode));
|
|
818
|
-
}, { authority: 4 });
|
|
819
|
-
ctx.console.addListener('newauth/autoAssignPending', async (payload = {}) => {
|
|
820
|
-
const count = await service.autoAssignPending(payload.scope, payload.mode);
|
|
821
|
-
ctx.console.refresh('newauth');
|
|
822
|
-
return { success: true, count };
|
|
823
|
-
}, { authority: 4 });
|
|
824
845
|
ctx.console.addListener('newauth/generateAiSuggestion', async (payload) => {
|
|
825
|
-
return service.generateAiSuggestion(payload.commandId);
|
|
846
|
+
return service.generateAiSuggestion(payload.commandId, payload.model);
|
|
826
847
|
}, { authority: 4 });
|
|
827
|
-
ctx.console.addListener('newauth/generateAiSuggestions', async () => {
|
|
828
|
-
const suggestions = await service.generateAiSuggestionsForPending();
|
|
848
|
+
ctx.console.addListener('newauth/generateAiSuggestions', async (payload = {}) => {
|
|
849
|
+
const suggestions = await service.generateAiSuggestionsForPending(payload.model);
|
|
829
850
|
return { suggestions };
|
|
830
851
|
}, { authority: 4 });
|
|
831
852
|
ctx.console.addListener('newauth/configureCommandRoles', async (payload) => {
|
package/newauth.md
CHANGED