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 CHANGED
@@ -89,7 +89,7 @@ guest
89
89
  - 以角色为入口的指令权限编辑;
90
90
  - 全局默认和单群作用域切换;
91
91
  - 待配置指令审查和角色勾选分配;
92
- - 旧 `authority` 建议与基于 ChatLuna 默认模型的 AI 分配审查表;
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 且设置默认模型后,newauth 会把指令元数据和角色列表交给 ChatLuna 默认模型,让模型返回允许的角色;WebUI 会先显示审查表并填入勾选项,只有管理员点击保存后才写入策略。模型不可用或返回无效时回退到旧 `authority` 建议。
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?: AutoAssignPayload): Promise<{
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, mode?: 'legacy' | 'advisor'): Promise<NewAuthCommandRecord>;
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', mode = 'legacy') {
469
+ async applySuggestedPolicy(input, scope = 'global') {
466
470
  const command = await this.resolveCommandInput(input);
467
- const suggestion = mode === 'advisor'
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, 'legacy');
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
- hasAiAdvisor() {
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
- && typeof defaultModel === 'string'
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
- if (!this.hasAiAdvisor()) {
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 defaultModel = chatluna.currentConfig?.defaultModel ?? chatluna.config?.defaultModel;
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
@@ -1454,5 +1454,5 @@ authority 只做建议,不直接授权;
1454
1454
 
1455
1455
  ---
1456
1456
 
1457
- KOISHI侧边栏的图标不使用默认的 使用“⌗”
1457
+ KOISHI侧边栏的图标不使用默认的 使用区别于默认图标的图标 保证可见
1458
1458
  同时根据F:\chatluna-1.4.0-alpha.17 为指令权限限制制作一个AI自动分配(即:让AI来配置节点应该给哪个组)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "koishi-plugin-new-auth",
3
- "version": "0.4.4",
3
+ "version": "0.4.6",
4
4
  "description": "Koishi 的角色与作用域指令权限系统。",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",