PageSourceSearch

https://seitai.co.jp/_nuxt/C--D0Yz1.js

js seitai.co.jp collected 2026-10-08 16:23:08 UTC 20,260 bytes, 1 lines download raw bytes

1import{d as Y,a as Z,r as n,h as tt,j as et,k as st,l as a,m as t,n as p,f as o,t as i,q as N,L as z,p as v,F as g,v as m,E as H,G as at,H as W,R as rt,o as r}from"#entry";import{u as lt}from"./BpJd073O.js";import"./BawYfsl-.js";import"./i1t3RLeJ.js";const it={class:"p-6"},ot={class:"mb-6"},dt={key:0,class:"mt-2 text-gray-600"},nt={key:1,class:"mt-2 text-gray-600"},xt={key:0,class:"mb-6 rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700"},ct={class:"mb-6 overflow-hidden rounded-lg border border-indigo-200 bg-indigo-50",open:""},pt={class:"border-t border-indigo-200 bg-white px-5 py-4"},ut={class:"mt-4"},gt={class:"mt-1 flex flex-wrap items-center gap-2"},mt={class:"min-w-0 flex-1 select-all break-all rounded-lg border border-gray-300 bg-gray-50 px-3 py-2 font-mono text-sm text-gray-800"},yt=["disabled"],_t={key:1,class:"mx-auto max-w-2xl bg-white rounded-lg shadow p-5"},ht={key:0,class:"mt-5 text-sm text-gray-500"},vt={key:1,class:"mt-5 rounded-lg border border-dashed border-gray-300 p-6 text-center text-sm text-gray-500"},ft={key:2,class:"mt-5 space-y-3"},bt={class:"flex items-start justify-between gap-3"},wt={class:"flex items-center gap-2"},kt={class:"text-sm font-medium text-gray-900"},Ct={key:0,class:"rounded-full bg-red-100 px-2 py-0.5 text-xs font-semibold text-red-800"},At={class:"mt-1 text-xs text-gray-500"},St={class:"mt-1 text-xs text-gray-500"},It=["onClick"],Ut={key:1,class:"text-xs text-gray-500"},Lt={class:"mt-3"},$t={class:"mt-1 flex flex-wrap gap-1"},Dt=["title"],Rt={key:2,class:"grid gap-6 lg:grid-cols-[minmax(0,1fr)_420px] lg:h-[calc(100vh-16rem)] lg:min-h-[28rem] lg:items-start"},Tt={class:"bg-white rounded-lg shadow overflow-hidden lg:h-full lg:flex lg:flex-col"},Mt={class:"border-b border-gray-200 p-4 shrink-0"},Ot={class:"flex gap-3"},Nt={class:"lg:flex-1 lg:overflow-y-auto lg:min-h-0"},Vt={key:0,class:"p-8 text-center text-gray-600"},jt={key:1,class:"p-8 text-center text-gray-500"},Et={key:2,class:"min-w-full divide-y divide-gray-200"},Bt={class:"bg-white divide-y divide-gray-200"},Ft={class:"px-6 py-4 whitespace-nowrap text-sm text-gray-900"},Pt={class:"px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900"},zt={class:"px-6 py-4 whitespace-nowrap text-sm text-gray-500"},Ht={class:"px-6 py-4 whitespace-nowrap text-sm text-gray-500"},Wt={class:"px-6 py-4 whitespace-nowrap"},qt={key:0,class:"px-2 py-1 text-xs font-semibold rounded-full bg-gray-100 text-gray-700",title:"以前の方式でAI専用として登録されたアカウントです。現在はトークン名でAIの操作を判別するため、新しく付くことはありません。"},Gt={key:1,class:"text-xs text-gray-400"},Jt={class:"px-6 py-4 whitespace-nowrap text-right text-sm font-medium"},Qt=["onClick"],Kt={class:"space-y-6 lg:h-full lg:overflow-y-auto lg:min-h-0 lg:pr-1"},Xt={class:"bg-white rounded-lg shadow p-5"},Yt={key:0,class:"mt-4 rounded-lg bg-gray-50 p-3 text-sm"},Zt={class:"font-medium text-gray-900"},te={class:"text-gray-500"},ee={key:1,class:"mt-4 text-sm text-gray-500"},se={key:2,class:"mt-4 text-sm text-gray-500"},ae={key:3,class:"mt-4 text-sm text-gray-500"},re={key:4,class:"mt-4 space-y-3"},le={class:"flex items-start justify-between gap-3"},ie={class:"flex items-center gap-2"},oe={class:"text-sm font-medium text-gray-900"},de={key:0,class:"rounded-full bg-red-100 px-2 py-0.5 text-xs font-semibold text-red-800"},ne={class:"mt-1 text-xs text-gray-500"},xe={class:"mt-1 text-xs text-gray-500"},ce=["onClick"],pe={class:"mt-2 flex flex-wrap gap-1"},ue=["title"],ge={key:3,class:"mt-6 bg-white rounded-lg shadow overflow-hidden"},me={class:"flex flex-wrap items-center justify-between gap-3 border-b border-gray-200 p-4"},ye={class:"flex items-center gap-3"},_e={class:"flex cursor-pointer items-center gap-2 text-sm text-gray-700"},he={key:0,class:"p-8 text-center text-gray-600"},ve={key:1,class:"p-8 text-center text-sm text-gray-500"},fe={key:2,class:"overflow-x-auto"},be={class:"min-w-full divide-y divide-gray-200"},we={class:"divide-y divide-gray-200 bg-white"},ke={class:"px-4 py-4 align-top"},Ce={class:"text-sm font-medium text-gray-900"},Ae={class:"text-xs text-gray-500"},Se={class:"text-xs text-gray-400"},Ie={class:"px-4 py-4 align-top text-sm text-gray-500"},Ue={class:"px-4 py-4 align-top"},Le={class:"text-sm text-gray-900"},$e={class:"max-w-[16rem] break-all font-mono text-xs text-gray-400"},De={class:"px-4 py-4 align-top"},Re={key:0,class:"text-xs text-gray-400"},Te={key:1,class:"flex max-w-[18rem] flex-wrap gap-1"},Me={class:"px-4 py-4 align-top text-xs text-gray-500"},Oe={class:"px-4 py-4 align-top text-xs text-gray-500"},Ne={class:"px-4 py-4 align-top text-xs text-gray-500"},Ve={class:"px-4 py-4 align-top"},je={key:0,class:"mt-1 text-xs text-gray-400"},Ee={class:"px-4 py-4 align-top text-right"},Be=["onClick"],Fe={key:1,class:"text-xs text-gray-400"},Ge=Y({__name:"index",setup(Pe){const{get:L,delete:V}=Z(),k=n([]),y=n([]),x=n(null),$=n(!1),C=n(!1),c=n(null),f=n(""),D=n([]),R=n(!1),_=n(!1),j=n({}),b=n(""),A=n(""),T=n(!1),E=s=>j.value[s]??s,B=s=>
1s.name.startsWith("ai-oauth-"),S=s=>!!s.expires_at&&new Date(s.expires_at).getTime()<=Date.now(),M=async()=>{$.value=!0,c.value=null;try{const s=new URLSearchParams;f.value.trim()&&s.append("search",f.value.trim());const l=await L(`/admin/ai-tokens/users?${s.toString()}`);k.value=l.data||[],x.value&&(x.value=k.value.find(e=>e.id===x.value?.id)||null)}catch(s){c.value=s?.data?.message||s?.data?.error||s?.message||"ユーザーの取得に失敗しました"}finally{$.value=!1}},I=async()=>{if(!x.value){y.value=[];return}C.value=!0,c.value=null;try{const s=await L(`/admin/ai-tokens?user_id=${x.value.id}`);y.value=s.data||[],j.value=s.ability_labels||{}}catch(s){c.value=s?.data?.message||s?.data?.error||s?.message||"トークンの取得に失敗しました"}finally{C.value=!1}},U=async()=>{R.value=!0,c.value=null;try{const s=new URLSearchParams;_.value&&s.append("include_revoked","1");const l=await L(`/admin/ai-tokens/connections?${s.toString()}`);D.value=l.data||[]}catch(s){c.value=s?.data?.message||s?.data?.error||s?.message||"連携中のアカウントの取得に失敗しました"}finally{R.value=!1}},q=s=>s==="revoked"?"失効済み":s==="expired"?"期限切れ":"有効",G=s=>s==="revoked"?"bg-gray-100 text-gray-700":s==="expired"?"bg-red-100 text-red-800":"bg-green-100 text-green-800",J=async s=>{x.value=s,await I()},F=async s=>{if(confirm(`トークン「${s.name}」を失効してもよろしいですか?`)){c.value=null;try{await V(`/admin/ai-tokens/${s.id}`),await I()}catch(l){c.value=l?.data?.message||l?.data?.error||l?.message||"トークンの失効に失敗しました"}}},Q=async s=>{if(!s.access_token_id)return;const l=s.client_name||s.client_id,e=s.user.name||`ID: ${s.user.id}`;if(confirm(`${e} の「${l}」との連携を失効してもよろしいですか?`)){c.value=null;try{await V(`/admin/ai-tokens/${s.access_token_id}`),await U(),x.value&&await I()}catch(d){c.value=d?.data?.message||d?.data?.error||d?.message||"連携の失効に失敗しました"}}},K=async()=>{if(b.value)try{await navigator.clipboard.writeText(b.value),T.value=!1,A.value="コピーしました"}catch{T.value=!0,A.value="コピーできませんでした。上のURLを選択してコピーしてください"}},u=s=>new Date(s).toLocaleString("ja-JP"),O=s=>s?u(s):"-",P=(()=>{let s=null;return()=>{s&&clearTimeout(s),s=setTimeout(()=>{M()},400)}})(),{user:w}=lt(),h=tt(()=>Number(w.value?.id)===139),X=s=>String(s?.name??"").startsWith("ai-oauth-");return et(_,()=>{h.value&&U()}),st(async()=>{if(b.value=`${window.location.origin}/api/mcp`,h.value){M(),U();return}x.value={id:Number(w.value?.id),name:String(w.value?.name??""),email:String(w.value?.email??""),role:String(w.value?.role??""),is_active:!0,is_ai_agent:!1,tenant:null},await I()}),(s,l)=>(r(),a("div",it,[t("div",ot,[l[3]||(l[3]=t("h1",{class:"text-3xl font-bold text-gray-900"},"AI連携",-1)),o(h)?(r(),a("p",dt,"繋がっているAI連携を確認し、不要になったものを失効させます(Claude から接続すると、ここに OAuth 経由のトークンが並びます)")):(r(),a("p",nt,"あなたが接続を許可したAIアプリを確認・失効できます"))]),o(c)?(r(),a("div",xt,i(o(c)),1)):p("",!0),t("details",ct,[l[7]||(l[7]=t("summary",{class:"group flex cursor-pointer list-none items-center gap-2 px-5 py-4 text-sm font-semibold text-indigo-900 marker:content-none"},[t("span",{class:"transition-transform group-open:rotate-90","aria-hidden":"true"},"▶"),N(" Claude との連携手順(Claude ならトークンの発行は不要です) ")],-1)),t("div",pt,[l[5]||(l[5]=t("p",{class:"text-sm text-gray-700"},[N(" Claude の「カスタムコネクタ」に下のURLを登録すると、ログインと許可だけで接続できます。"),t("strong",{class:"font-semibold"},"トークンの発行は不要です。")],-1)),t("div",ut,[l[4]||(l[4]=t("p",{class:"text-sm font-medium text-gray-700"},"接続URL",-1)),t("div",gt,[t("code",mt,i(o(b)||"読み込み中..."),1),t("button",{type:"button",disabled:!o(b),class:"shrink-0 rounded-lg border border-gray-300 px-3 py-2 text-sm text-blue-600 hover:bg-gray-50 disabled:opacity-50",onClick:K}," コピー ",8,yt)]),o(A)?(r(),a("p",{key:0,class:v(["mt-2 text-sm",o(T)?"text-red-600":"text-green-700"])},i(o(A)),3)):p("",!0)]),l[6]||(l[6]=z('<div class="mt-5 grid gap-5 lg:grid-cols-2"><div><h3 class="text-sm font-semibold text-gray-900">Claude での手順</h3><ol class="mt-2 list-decimal space-y-1 pl-5 text-sm text-gray-700"><li>Claude の 設定 → コネクタ → 「カスタムコネクタを追加」を開く</li><li>上の接続URLを貼る(認証とOAuthクライアントの選択は自動で検出されるので、そのままで大丈夫でã
1™ï¼‰</li><li>追加するとブラウザで認可画面が開くので、Hub Cook CMS にログインする</li><li>使わせたい機能(コラム / お知らせ / スタッフ / セクション / CSS / 画像)を選んで「許可する」</li><li>完了です。トークンの発行はしません</li></ol><h3 class="mt-4 text-sm font-semibold text-gray-900">注意</h3><ul class="mt-2 list-disc space-y-1 pl-5 text-sm text-gray-700"><li> 許可できるのは <span class="font-semibold">tenant_admin</span> のアカウントだけです。 </li><li>接続をやめたいときは、この画面から失効できます</li></ul></div><div><h3 class="text-sm font-semibold text-gray-900">AIにできること</h3><ul class="mt-2 list-disc space-y-1 pl-5 text-sm text-gray-700"><li>下書き提案の作成(記事・お知らせ・スタッフ・店舗トップのセクション・共通CSS)</li><li>既存記事の公開/非公開の<span class="font-semibold">提案</span></li></ul><h3 class="mt-4 text-sm font-semibold text-gray-900">AIにできないこと</h3><ul class="mt-2 list-disc space-y-1 pl-5 text-sm text-gray-700"><li>公開・非公開の切り替えそのもの、削除。反映は必ず人間が「AI下書きレビュー」画面で承認します</li><li> AIが読めるのは、許可した機能のコンテンツ(記事・お知らせ・スタッフ紹介・店舗トップのセクション・共通CSS)だけです。下書きも含まれます。問い合わせの個人情報・ユーザー情報・監査ログにはアクセスできません </li></ul></div></div>',1))])]),o(h)?p("",!0):(r(),a("section",_t,[l[9]||(l[9]=z('<h2 class="text-lg font-semibold text-gray-900">このアカウントのAI連携</h2><p class="mt-2 text-sm text-gray-600"> あなたのアカウントで有効になっているAI連携の一覧です。ここに出ているものは、AIアプリからCMSを操作できる状態です。 <strong class="font-semibold">身に覚えのないものがあれば管理者に連絡してください。</strong></p><p class="mt-2 text-sm text-gray-600"> あなたが「許可する」を押して接続したものは、この画面から失効できます。失効すると、そのアプリからの接続がすぐに切れます。 </p><p class="mt-2 text-xs text-gray-500"> 新しく接続するときは、AIアプリ側にこのCMSのURLを登録してください。この画面から接続を作ることはできません。 </p>',4)),o(C)?(r(),a("div",ht,"読み込み中...")):o(y).length===0?(r(),a("div",vt," このアカウントにAI連携はありません ")):(r(),a("div",ft,[(r(!0),a(g,null,m(o(y),e=>(r(),a("div",{key:e.id,class:"rounded-lg border border-gray-200 p-4"},[t("div",bt,[t("div",null,[t("div",wt,[t("span",kt,i(e.name),1),S(e)?(r(),a("span",Ct," 期限切れ ")):p("",!0)]),t("div",At,"接続した日: "+i(u(e.created_at)),1),t("div",{class:v(["mt-1 text-xs",S(e)?"text-red-600":"text-gray-500"])}," 有効期限: "+i(e.expires_at?u(e.expires_at):"無期限"),3),t("div",St,"最終利用: "+i(e.last_used_at?u(e.last_used_at):"-"),1)]),X(e)?(r(),a("button",{key:0,class:"text-sm text-red-600 hover:text-red-900",onClick:d=>F(e)},"失効",8,It)):(r(),a("span",Ut,"管理者が発行した古いトークンです"))]),t("div",Lt,[l[8]||(l[8]=t("p",{class:"text-xs font-medium text-gray-700"},"許可した機能",-1)),t("div",$t,[(r(!0),a(g,null,m(e.abilities,d=>(r(),a("span",{key:d,title:d,class:"rounded bg-gray-100 px-2 py-1 text-xs text-gray-700"},i(E(d)),9,Dt))),128))])])]))),128))]))])),o(h)?(r(),a("div",Rt,[t("section",Tt,[t("div",Mt,[t("div",Ot,[H(t("input",{"onUpdate:modelValue":l[0]||(l[0]=e=>W(f)?f.value=e:null),type:"text",placeholder:"名前またはメールアドレスで検索...",class:"flex-1 px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent",onInput:l[1]||(l[1]=(...e)=>o(P)&&o(P)(...e))},null,544),[[at,o(f)]]),t("button",{type:"button",class:"px-4 py-2 border border-gray-300 rounded-lg hover:bg-gray-50",onClick:M}," 再読み込み ")])]),t("div",Nt,[o($)?(r(),a("div",Vt,"読み込み中...")):o(k).length===0?(r(),a("div",jt,"対象ユーザーがありません")):(r(),a("table",Et,[l[10]||(l[10]=t("thead",{class:"bg-gray-50 sticky top-0 z-10"},[t("tr",null,[t("th",{class:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"},"ID"),t("th",{class:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"},"名前"),t("th",{class:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"},"メール"),t("th",{class:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"},"テナント"),t("th",{class:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"},"備考"),t("th",{class:"px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider"},"操作")])],-1)),t("tbody",Bt,[(r(!0),a(g,null,m(o(k),e=>(r(),a("tr",{key:e.id,class:v(["hover:bg-gray-50",{"bg-blue-50":o(x)?.id===e.id}])},[t("td",Ft,i(e.id),1),t("td",Pt,i(e.name),1),t("td",zt,i(e.email),1),t("td",Ht,i(e.tenant?.name||"-"),1),t("td",Wt,[e.is_ai_agent?(r(),a("span",qt," 旧AI専用アカウント ")):(r(),a("span",Gt,"-"))]),t("td",Jt,[t("button",{class:"text-blue-600 hover:text-blue-900",onClick:d=>J(e)},"選択",8,Qt)])],2))),128))])]))])]),t("aside",Kt,[t("section",Xt,[l[11]||(l[11]=t("h2",{class:"text-lg font-semibold text-gray-900"},"選択したアカウントのAI連携",-1)),l[12]||(l[12]=t("p",{class:"mt-2 text-xs leading-relaxed text-gray-500"}," この画面からトークンを発行することはできません。Claude は接続URLを登録して許可するだけで繋がります(OAuth)。ここでは残っているトークンを確認し、不要なものを失効させてください。 ",-1)),o(x)?(r(),a("div",Yt,[t("div",Zt,i(o(x).name),1),t("div",te,i(o(x).email),1)])):p("",!0),o(x)?o(C)?(r(),a("div",se,"読み込み中...")):o(y).length===0?(r(),a("div",ae,"このアカウントにAI連携はありません")):(r(),a("div",re,[(r(!0),a(g,null,m(o(y),e=>(r(),a("div",{key:e.id,class:"rounded-lg border border-gray-200 p-3"},[t("div",le,[t("div",null,[t("div",ie,[t("span",oe,i(e.name),1),t("span",{class:v(["rounded-full px-2 py-0.5 text-xs font-semibold",B(e)?"bg-indigo-100 text-indigo-800":"bg-gray-100 text-gray-700"])},i(B(e)?"OAuth":"手動(廃止済み)"),3),S(e)?(r(),a("span",de," 期限切れ ")):p("",!0)]),t("div",ne,"作成: "+i(u(e.created_at)),1),t("div",{class:v(["mt-1 text-xs",S(e)?"text-red-600":"text-gray-500"])}," 有効期限: "+i(e.expires_at?u(e.expires_at):"無期限"),3),t("div",xe,"最終利用: "+i(e.last_used_at?u(e.last_used_at):"-"),1)]),t("button",{class:"text-sm text-red-600 hover:text-red-900",onClick:d=>F(e)},"失効",8,ce)]),t("div",pe,[(r(!0),a(g,null,m(e.abilities,d=>(r(),a("span",{key:d,title:d,class:"rounded bg-gray-100 px-2 py-1 text-xs text-gray-700"},i(E(d)),9,ue))),128))])]))),128))])):(r(),a("div",ee,"ユーザーを選択してください"))])])])):p("",!0),o(h)?(r(),a("section",ge,[t("div",me,[l[14]||(l[14]=t("div",null,[t("h2",{class:"text-lg font-semibold text-gray-900"},"連携中のアカウント一覧"),t("p",{class:"mt-1 text-xs text-gray-500"}," OAuth(AIアプリからの接続許可)で繋がっているアカウントの一覧です。1行が1回の接続なので、同じ人が繋ぎ直すと複数行並びます。 ")],-1)),t("div",ye,[t("label",_e,[H(t("input",{"onUpdate:modelValue":l[2]||(l[2]=e=>
1W(_)?_.value=e:null),type:"checkbox",class:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500"},null,512),[[rt,o(_)]]),l[13]||(l[13]=N(" 失効済みも表示 ",-1))]),t("button",{type:"button",class:"rounded-lg border border-gray-300 px-3 py-2 text-sm hover:bg-gray-50",onClick:U}," 再読み込み ")])]),o(R)?(r(),a("div",he,"読み込み中...")):o(D).length===0?(r(),a("div",ve,i(o(_)?"連携の記録がありません":"有効な連携はありません(失効済みを見るには上のチェックを入れてください)"),1)):(r(),a("div",fe,[t("table",be,[l[15]||(l[15]=t("thead",{class:"bg-gray-50"},[t("tr",null,[t("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500"},"ユーザー"),t("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500"},"テナント"),t("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500"},"接続元アプリ"),t("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500"},"許可した機能"),t("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500"},"接続日"),t("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500"},"最終利用"),t("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500"},"有効期限"),t("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500"},"状態"),t("th",{class:"px-4 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-500"},"操作")])],-1)),t("tbody",we,[(r(!0),a(g,null,m(o(D),e=>(r(),a("tr",{key:e.id,class:"hover:bg-gray-50"},[t("td",ke,[t("div",Ce,i(e.user.name||"(削除済み)"),1),t("div",Ae,i(e.user.email||"-"),1),t("div",Se,"ID: "+i(e.user.id)+" / "+i(e.user.role||"-"),1)]),t("td",Ie,i(e.user.tenant_name||"-"),1),t("td",Ue,[t("div",Le,i(e.client_name||"(名前なし)"),1),t("div",$e,i(e.client_id),1)]),t("td",De,[e.features.length===0?(r(),a("div",Re,"-")):(r(),a("div",Te,[(r(!0),a(g,null,m(e.features,d=>(r(),a("span",{key:d,class:"rounded bg-gray-100 px-2 py-1 text-xs text-gray-700"},i(d),1))),128))]))]),t("td",Me,i(O(e.connected_at)),1),t("td",Oe,i(O(e.last_used_at)),1),t("td",Ne,i(O(e.expires_at)),1),t("td",Ve,[t("span",{class:v(["inline-block whitespace-nowrap rounded-full px-2 py-0.5 text-xs font-semibold",G(e.status)])},i(q(e.status)),3),e.revoked_at?(r(),a("div",je,i(u(e.revoked_at)),1)):p("",!0)]),t("td",Ee,[e.status!=="revoked"&&e.access_token_id?(r(),a("button",{key:0,type:"button",class:"text-sm text-red-600 hover:text-red-900",onClick:d=>Q(e)}," 失効 ",8,Be)):(r(),a("span",Fe,"-"))])]))),128))])])]))])):p("",!0)]))}});export{Ge as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.