@semiont/cli 0.4.18 → 0.4.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +14 -42
- package/dist/frontend/dist/assets/{CookiePreferences-ebe4eB-e.js → CookiePreferences-BBb5XMuG.js} +2 -2
- package/dist/frontend/dist/assets/{CookiePreferences-ebe4eB-e.js.map → CookiePreferences-BBb5XMuG.js.map} +1 -1
- package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-CHDCGQBR-BGx2owZ0.js → PdfAnnotationCanvas.client-CHDCGQBR-mCGxablw.js} +2 -2
- package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-CHDCGQBR-BGx2owZ0.js.map → PdfAnnotationCanvas.client-CHDCGQBR-mCGxablw.js.map} +1 -1
- package/dist/frontend/dist/assets/ToolbarPanels-CfaOVIc9.js +2 -0
- package/dist/frontend/dist/assets/ToolbarPanels-CfaOVIc9.js.map +1 -0
- package/dist/frontend/dist/assets/{client-8eRsF4aG.js → client-CWwdB0xQ.js} +2 -2
- package/dist/frontend/dist/assets/{client-8eRsF4aG.js.map → client-CWwdB0xQ.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-D4vbUf7k.js → client-Cgz-uiSd.js} +2 -2
- package/dist/frontend/dist/assets/{client-D4vbUf7k.js.map → client-Cgz-uiSd.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-Zl8uXOB2.js → client-D3W9xTBT.js} +2 -2
- package/dist/frontend/dist/assets/{client-Zl8uXOB2.js.map → client-D3W9xTBT.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-BwxrodJP.js → client-DeL0szs5.js} +2 -2
- package/dist/frontend/dist/assets/{client-BwxrodJP.js.map → client-DeL0szs5.js.map} +1 -1
- package/dist/frontend/dist/assets/{index-DESF7by4.js → index-C5oI0kaf.js} +49 -49
- package/dist/frontend/dist/assets/index-C5oI0kaf.js.map +1 -0
- package/dist/frontend/dist/assets/{layout-BInmmVVD.js → layout-B_JLc3yI.js} +2 -2
- package/dist/frontend/dist/assets/{layout-BInmmVVD.js.map → layout-B_JLc3yI.js.map} +1 -1
- package/dist/frontend/dist/assets/{layout-DvfgC4ds.js → layout-DJI7aibW.js} +2 -2
- package/dist/frontend/dist/assets/{layout-DvfgC4ds.js.map → layout-DJI7aibW.js.map} +1 -1
- package/dist/frontend/dist/assets/{layout-Bc0HvP9q.js → layout-DXY8hCsB.js} +2 -2
- package/dist/frontend/dist/assets/{layout-Bc0HvP9q.js.map → layout-DXY8hCsB.js.map} +1 -1
- package/dist/frontend/dist/assets/{layout-CFCI5ndn.js → layout-VBQ97DvJ.js} +2 -2
- package/dist/frontend/dist/assets/{layout-CFCI5ndn.js.map → layout-VBQ97DvJ.js.map} +1 -1
- package/dist/frontend/dist/assets/{not-found-B-h8U0AW.js → not-found-BKG2_Fv3.js} +2 -2
- package/dist/frontend/dist/assets/{not-found-B-h8U0AW.js.map → not-found-BKG2_Fv3.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CwB528Up.js → page-8OrS1-4-.js} +2 -2
- package/dist/frontend/dist/assets/{page-CwB528Up.js.map → page-8OrS1-4-.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BRnMt7o2.js → page-B4Qu9WPd.js} +2 -2
- package/dist/frontend/dist/assets/{page-BRnMt7o2.js.map → page-B4Qu9WPd.js.map} +1 -1
- package/dist/frontend/dist/assets/page-BNJp__R7.js +2 -0
- package/dist/frontend/dist/assets/{page-DLQK_cX5.js.map → page-BNJp__R7.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CkjHPT8p.js → page-BRTi-f95.js} +2 -2
- package/dist/frontend/dist/assets/{page-CkjHPT8p.js.map → page-BRTi-f95.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-B4bD7iN0.js → page-BSB8GP79.js} +2 -2
- package/dist/frontend/dist/assets/{page-B4bD7iN0.js.map → page-BSB8GP79.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-zo4BeIjA.js → page-Bx8QAzic.js} +2 -2
- package/dist/frontend/dist/assets/{page-zo4BeIjA.js.map → page-Bx8QAzic.js.map} +1 -1
- package/dist/frontend/dist/assets/page-CDSGl6uY.js +2 -0
- package/dist/frontend/dist/assets/{page-EgwcfkeK.js.map → page-CDSGl6uY.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-DRQxmzY-.js → page-CJLuuiG8.js} +2 -2
- package/dist/frontend/dist/assets/{page-DRQxmzY-.js.map → page-CJLuuiG8.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CNftu-l4.js → page-CyFJt2nP.js} +2 -2
- package/dist/frontend/dist/assets/{page-CNftu-l4.js.map → page-CyFJt2nP.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CnYCXW-A.js → page-D1q6VB02.js} +2 -2
- package/dist/frontend/dist/assets/{page-CnYCXW-A.js.map → page-D1q6VB02.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-DFS-DvYi.js → page-D3THDsqd.js} +2 -2
- package/dist/frontend/dist/assets/{page-DFS-DvYi.js.map → page-D3THDsqd.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-4JzRN2Q4.js → page-DCxg1lHk.js} +2 -2
- package/dist/frontend/dist/assets/{page-4JzRN2Q4.js.map → page-DCxg1lHk.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-hTDMMHds.js → page-DbwQv5n_.js} +2 -2
- package/dist/frontend/dist/assets/{page-hTDMMHds.js.map → page-DbwQv5n_.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-tm2w2bTu.js → page-DddZ9Yxm.js} +2 -2
- package/dist/frontend/dist/assets/{page-tm2w2bTu.js.map → page-DddZ9Yxm.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BeWKvJpC.js → page-DzoXV-AN.js} +2 -2
- package/dist/frontend/dist/assets/{page-BeWKvJpC.js.map → page-DzoXV-AN.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BD_lMtdf.js → page-IgGNB4a9.js} +2 -2
- package/dist/frontend/dist/assets/{page-BD_lMtdf.js.map → page-IgGNB4a9.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BKt53Kee.js → page-aKPxuWo3.js} +2 -2
- package/dist/frontend/dist/assets/{page-BKt53Kee.js.map → page-aKPxuWo3.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BRpbSm6U.js → page-jxC42AIR.js} +2 -2
- package/dist/frontend/dist/assets/{page-BRpbSm6U.js.map → page-jxC42AIR.js.map} +1 -1
- package/dist/frontend/dist/assets/{privacy-DS6wXZXA.js → privacy-BAxopuZI.js} +2 -2
- package/dist/frontend/dist/assets/{privacy-DS6wXZXA.js.map → privacy-BAxopuZI.js.map} +1 -1
- package/dist/frontend/dist/assets/{routing-DDJ3KSPT.js → routing-Cm_oCwum.js} +2 -2
- package/dist/frontend/dist/assets/{routing-DDJ3KSPT.js.map → routing-Cm_oCwum.js.map} +1 -1
- package/dist/frontend/dist/assets/{routing-NOxgO9NV.js → routing-rYtBowvy.js} +2 -2
- package/dist/frontend/dist/assets/{routing-NOxgO9NV.js.map → routing-rYtBowvy.js.map} +1 -1
- package/dist/frontend/dist/index.html +1 -1
- package/dist/frontend/dist/messages/ar.json +2 -1
- package/dist/frontend/dist/messages/bn.json +2 -1
- package/dist/frontend/dist/messages/cs.json +2 -1
- package/dist/frontend/dist/messages/da.json +2 -1
- package/dist/frontend/dist/messages/de.json +2 -1
- package/dist/frontend/dist/messages/el.json +2 -1
- package/dist/frontend/dist/messages/en.json +2 -1
- package/dist/frontend/dist/messages/es.json +2 -1
- package/dist/frontend/dist/messages/fa.json +2 -1
- package/dist/frontend/dist/messages/fi.json +2 -1
- package/dist/frontend/dist/messages/fr.json +2 -1
- package/dist/frontend/dist/messages/he.json +2 -1
- package/dist/frontend/dist/messages/hi.json +2 -1
- package/dist/frontend/dist/messages/id.json +2 -1
- package/dist/frontend/dist/messages/it.json +2 -1
- package/dist/frontend/dist/messages/ja.json +2 -1
- package/dist/frontend/dist/messages/ko.json +2 -1
- package/dist/frontend/dist/messages/ms.json +2 -1
- package/dist/frontend/dist/messages/nl.json +2 -1
- package/dist/frontend/dist/messages/no.json +2 -1
- package/dist/frontend/dist/messages/pl.json +2 -1
- package/dist/frontend/dist/messages/pt.json +2 -1
- package/dist/frontend/dist/messages/ro.json +2 -1
- package/dist/frontend/dist/messages/sv.json +2 -1
- package/dist/frontend/dist/messages/th.json +2 -1
- package/dist/frontend/dist/messages/tr.json +2 -1
- package/dist/frontend/dist/messages/uk.json +2 -1
- package/dist/frontend/dist/messages/vi.json +2 -1
- package/dist/frontend/dist/messages/zh.json +2 -1
- package/dist/frontend/package.json +1 -1
- package/package.json +7 -7
- package/dist/frontend/dist/assets/ToolbarPanels-C9r6ZyGY.js +0 -2
- package/dist/frontend/dist/assets/ToolbarPanels-C9r6ZyGY.js.map +0 -1
- package/dist/frontend/dist/assets/index-DESF7by4.js.map +0 -1
- package/dist/frontend/dist/assets/page-DLQK_cX5.js +0 -2
- package/dist/frontend/dist/assets/page-EgwcfkeK.js +0 -2
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./query-B6BuIB0M.js";import{r as a}from"./vendor-DJo4KD8w.js";import{u as T,e as G,ae as Q,af as Y,ag as V,a9 as _,ah as J,ai as X,aj as q,ak as ee,al as te,am as se,an as ne,i as ae,ao as ie,ap as re,aq as oe}from"./index-DESF7by4.js";import{u as O,a as le,b as ce}from"./routing-DDJ3KSPT.js";import{u as B}from"./i18n-BbpF47i1.js";import{a as de,F as me}from"./XMarkIcon-KMKD47CF.js";function ue({title:n,titleId:t,...i},r){return a.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:r,"aria-labelledby":t},i),n?a.createElement("title",{id:t},n):null,a.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15m3 0 3-3m0 0-3-3m3 3H9"}))}const he=a.forwardRef(ue);function ge({title:n,titleId:t,...i},r){return a.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:r,"aria-labelledby":t},i),n?a.createElement("title",{id:t},n):null,a.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"m4.5 12.75 6 6 9-13.5"}))}const pe=a.forwardRef(ge);function xe({title:n,titleId:t,...i},r){return a.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:r,"aria-labelledby":t},i),n?a.createElement("title",{id:t},n):null,a.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4.5v15m7.5-7.5h-15"}))}const fe=a.forwardRef(xe),P="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==";function je(){const{t:n}=B(),t=(x,f)=>n(`UserPanel.${x}`,f),{displayName:i,avatarUrl:r,userDomain:m,isAdmin:u,isModerator:h,activeKnowledgeBase:o,signOut:l}=T(),j=G(),v=O(),[c,p]=a.useState(!1),{timeRemaining:N}=Q(),I=V(N)??"Unknown",S=(()=>{if(!r||c)return P;const x=Y(r);return x||(console.warn("Invalid profile image URL detected, using fallback"),P)})(),A=async()=>{try{await j.logout()}catch{}o&&l(o.id),v.push("/")};return e.jsxs("div",{className:"semiont-user-panel",children:[e.jsx("h3",{className:"semiont-user-panel__title",children:t("account")}),o&&e.jsx("div",{style:{padding:"0 0.75rem 0.5rem",fontSize:"0.8rem",color:"var(--semiont-color-neutral-400)"},children:o.label}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("img",{src:S,alt:t("profileAlt",{name:i||t("user")}),width:48,height:48,className:"w-12 h-12 rounded-full object-cover",onError:()=>p(!0)}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"semiont-panel-text",children:i||t("user")}),m&&e.jsxs("div",{className:"semiont-panel-text-secondary",children:["@",m]})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"semiont-panel-label",children:t("session")}),e.jsx("div",{className:"semiont-session-box",children:e.jsx("div",{className:"semiont-panel-hint",children:t("expiresIn",{time:I})})})]}),(u||h)&&e.jsxs("div",{children:[e.jsx("label",{className:"semiont-panel-label",children:t("privileges")}),e.jsxs("div",{className:"space-y-1",children:[u&&e.jsx("div",{className:"semiont-privilege-badge semiont-privilege-badge--admin",children:e.jsx("span",{className:"semiont-privilege-text",children:t("administrator")})}),h&&e.jsx("div",{className:"semiont-privilege-badge semiont-privilege-badge--moderator",children:e.jsx("span",{className:"semiont-privilege-text",children:t("moderator")})})]})]}),e.jsx("div",{className:"semiont-panel-divider",children:e.jsx("button",{onClick:A,className:"semiont-signout-button",children:t("signOut")})})]})]})}const ve={authenticated:"var(--semiont-color-success-500, #22c55e)",expired:"var(--semiont-color-warning-500, #eab308)","signed-out":"var(--semiont-color-neutral-400, #9ca3af)",unreachable:"var(--semiont-color-error-500, #ef4444)"},ye={authenticated:"statusConnected",expired:"statusExpired","signed-out":"statusSignedOut",unreachable:"statusUnreachable"};function be({status:n,t}){return e.jsx("span",{title:t(ye[n]),style:{width:"0.5rem",height:"0.5rem",borderRadius:"50%",backgroundColor:ve[n],flexShrink:0}})}function we({t:n,onSubmit:t,onCancel:i,error:r,isSubmitting:m,autoFocus:u,pulsing:h,initialHost:o="localhost",initialPort:l=4e3,initialEmail:j="admin@example.com"}){const[v,c]=a.useState(o),[p,N]=a.useState(String(l)),[I,S]=a.useState(j),[A,x]=a.useState("");return e.jsxs("div",{className:h?"semiont-panel__login-form--pulsing":"",style:{margin:"0.5rem",padding:"0.75rem",border:"1px solid var(--semiont-color-neutral-200, #e5e7eb)",borderRadius:"var(--semiont-panel-border-radius, 0.5rem)",background:"var(--semiont-bg-secondary, transparent)"},children:[e.jsx("h3",{style:{fontSize:"0.8rem",fontWeight:600,marginBottom:"0.5rem"},children:n("connectTitle")}),e.jsxs("form",{onSubmit:f=>{f.preventDefault(),t(v,parseInt(p,10)||4e3,I,A)},style:{display:"flex",flexDirection:"column",gap:"0.5rem"},children:[e.jsxs("div",{style:{display:"flex",gap:"0.5rem"},children:[e.jsx("input",{type:"text",value:v,onChange:f=>c(f.target.value),placeholder:"Host",className:"semiont-input",style:{flex:1},autoFocus:u}),e.jsx("input",{type:"number",value:p,onChange:f=>N(f.target.value),placeholder:"Port",className:"semiont-input",style:{width:"5rem"}})]}),e.jsx("input",{type:"email",value:I,onChange:f=>S(f.target.value),placeholder:"Email",className:"semiont-input"}),e.jsx("input",{type:"password",value:A,onChange:f=>x(f.target.value),placeholder:"Password",className:"semiont-input"}),r&&e.jsx("div",{style:{color:"var(--semiont-color-error-500, #ef4444)",fontSize:"0.75rem"},children:r}),e.jsxs("div",{style:{display:"flex",gap:"0.5rem"},children:[e.jsx("button",{type:"submit",className:"semiont-button semiont-button--primary",style:{flex:1},disabled:m,children:n(m?"connecting":"connect")}),e.jsx("button",{type:"button",className:"semiont-button",onClick:i,children:e.jsx(me,{style:{width:"1rem",height:"1rem"}})})]})]})]})}function Ne({t:n,kb:t,onSubmit:i,onCancel:r,error:m,isSubmitting:u}){const[h,o]=a.useState("");return e.jsxs("form",{onSubmit:l=>{l.preventDefault(),i(h)},style:{padding:"0.5rem 0.75rem",display:"flex",flexDirection:"column",gap:"0.375rem"},children:[e.jsx("div",{style:{fontSize:"0.75rem",color:"var(--semiont-color-neutral-400)"},children:t.email}),e.jsx("input",{type:"password",value:h,onChange:l=>o(l.target.value),placeholder:"Password",className:"semiont-input",style:{fontSize:"0.8rem"},autoFocus:!0}),m&&e.jsx("div",{style:{color:"var(--semiont-color-error-500, #ef4444)",fontSize:"0.75rem"},children:m}),e.jsxs("div",{style:{display:"flex",gap:"0.375rem"},children:[e.jsx("button",{type:"submit",className:"semiont-button semiont-button--primary",style:{flex:1,fontSize:"0.8rem"},disabled:u,children:n(u?"signingIn":"signIn")}),e.jsx("button",{type:"button",className:"semiont-button",onClick:r,style:{fontSize:"0.8rem"},children:n("cancel")})]})]})}async function z(n,t,i,r,m){const u=`${i}://${n}:${t}`,h=new J({baseUrl:q(u),eventBus:new X}),o=await h.authenticatePassword(ee(r),m),l=o.token??o.accessToken,j=o.refreshToken;if(!l)throw new Error("No access token received");if(!j)throw new Error("No refresh token received");let v=`${n}:${t}`,c;try{const p=await h.getStatus({auth:te(l)});p.projectName&&(v=p.projectName),p.gitBranch&&(c=p.gitBranch)}catch{}return{token:l,refreshToken:j,label:v,...c?{gitBranch:c}:{}}}function Se(){const{t:n}=B(),t=(s,g)=>n(`KnowledgeBasePanel.${s}`,g),{knowledgeBases:i,activeKnowledgeBase:r,setActiveKnowledgeBase:m,addKnowledgeBase:u,removeKnowledgeBase:h,updateKnowledgeBase:o,signIn:l,signOut:j}=T(),[v,c]=a.useState(!1),[p,N]=a.useState(null),[I,S]=a.useState(!1),[A,x]=a.useState(null),[f,k]=a.useState(null),[U,D]=a.useState(!1),[K,M]=a.useState(null),[,F]=a.useState(0);a.useEffect(()=>{i.length===0&&c(!0)},[i.length]),a.useEffect(()=>{const s=setInterval(()=>F(g=>g+1),3e4);return()=>clearInterval(s)},[]);const W=()=>{c(!0),x(null),N(null)},$=async(s,g,y,b)=>{N(null),S(!0);const w=se(s),E=i.find(d=>d.host===s&&d.port===g);if(E){try{const{token:d,refreshToken:R,gitBranch:C}=await z(s,g,w,y,b);o(E.id,{...C?{gitBranch:C}:{}}),l(E.id,d,R),c(!1)}catch(d){N(d instanceof Error?d.message:String(d))}finally{S(!1)}return}try{const{token:d,refreshToken:R,label:C,gitBranch:L}=await z(s,g,w,y,b);u({label:C,host:s,port:g,protocol:w,email:y,...L?{gitBranch:L}:{}},d,R),c(!1)}catch(d){N(d instanceof Error?d.message:String(d))}finally{S(!1)}},Z=async(s,g)=>{const y=i.find(b=>b.id===s);if(y){k(null),D(!0);try{const{token:b,refreshToken:w,label:E,gitBranch:d}=await z(y.host,y.port,y.protocol,y.email,g);o(s,{label:E,...d?{gitBranch:d}:{}}),l(s,b,w),x(null)}catch(b){k(b instanceof Error?b.message:String(b))}finally{D(!1)}}},H=s=>{_(s.id)==="authenticated"?m(s.id):(x(s.id),c(!1),k(null))};return e.jsxs("div",{className:"semiont-panel",children:[e.jsx("div",{className:"semiont-panel-header",children:e.jsxs("h2",{className:"semiont-panel-header__title",children:[e.jsx("span",{className:"semiont-panel-header__text",children:t("title")}),e.jsxs("span",{className:"semiont-panel-header__count",children:["(",i.length,")"]})]})}),e.jsxs("div",{className:"semiont-panel__content",children:[e.jsx("div",{className:"semiont-panel__list",children:i.map(s=>{const g=_(s.id),y=s.id===(r==null?void 0:r.id),b=A===s.id;return e.jsxs("div",{children:[e.jsxs("div",{className:`semiont-panel-item semiont-panel-item--clickable${y?" semiont-panel-item--selected":""}`,style:{display:"flex",flexDirection:"column",gap:"0.25rem",cursor:"pointer",padding:"0.5rem 0.75rem"},onClick:()=>H(s),children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:[e.jsx(be,{status:g,t}),e.jsx("span",{className:"semiont-panel-text",style:{flex:1,fontWeight:500},children:s.label}),y&&e.jsx(pe,{style:{width:"1rem",height:"1rem",color:"var(--semiont-color-primary-500)",flexShrink:0}}),g==="authenticated"&&e.jsx("button",{onClick:w=>{w.stopPropagation(),j(s.id)},title:t("signOut"),style:{background:"none",border:"none",cursor:"pointer",padding:"0.125rem",color:"var(--semiont-color-neutral-400)"},children:e.jsx(he,{style:{width:"0.875rem",height:"0.875rem"}})}),e.jsx("button",{onClick:w=>{w.stopPropagation(),M(s.id)},title:t("remove"),style:{background:"none",border:"none",cursor:"pointer",padding:"0.125rem",color:"var(--semiont-color-neutral-400)"},children:e.jsx(de,{style:{width:"0.875rem",height:"0.875rem"}})})]}),e.jsxs("span",{className:"semiont-panel-text-secondary",style:{fontSize:"0.7rem",paddingLeft:"1rem"},children:[s.host,":",s.port,s.gitBranch?` · ${s.gitBranch}`:""]})]}),K===s.id&&e.jsxs("div",{style:{padding:"0.5rem 0.75rem",fontSize:"0.8rem",display:"flex",alignItems:"center",gap:"0.5rem",background:"var(--semiont-bg-secondary, #f9fafb)",borderBottom:"1px solid var(--semiont-color-neutral-200, #e5e7eb)"},children:[e.jsx("span",{style:{flex:1,color:"var(--semiont-color-neutral-500)"},children:t("removeConfirm",{label:s.label})}),e.jsx("button",{onClick:()=>{h(s.id),M(null)},className:"semiont-button",style:{fontSize:"0.75rem",padding:"0.2rem 0.5rem",color:"var(--semiont-color-error-500, #ef4444)"},children:t("remove")}),e.jsx("button",{onClick:()=>M(null),className:"semiont-button",style:{fontSize:"0.75rem",padding:"0.2rem 0.5rem"},children:t("cancel")})]}),b&&e.jsx(Ne,{t,kb:s,onSubmit:w=>Z(s.id,w),onCancel:()=>x(null),error:f,isSubmitting:U})]},s.id)})}),v&&e.jsx(we,{t,onSubmit:$,onCancel:()=>c(!1),error:p,isSubmitting:I,autoFocus:i.length===0,pulsing:i.length===0})]}),!v&&e.jsx("div",{className:"semiont-panel-footer",children:e.jsxs("button",{onClick:W,className:"semiont-panel-item semiont-panel-item--clickable",style:{width:"100%",display:"flex",alignItems:"center",gap:"0.5rem",color:"var(--semiont-color-primary-600)"},children:[e.jsx(fe,{style:{width:"1rem",height:"1rem",flexShrink:0}}),e.jsx("span",{className:"semiont-panel-text",style:{color:"inherit"},children:t("addKnowledgeBase")})]})})]})}function Re({activePanel:n,theme:t,showLineNumbers:i,hoverDelayMs:r,children:m}){const{t:u}=B(),{isAuthenticated:h}=T(),o=le(),l=O(),j=ce(),[v,c]=a.useTransition(),{width:p,setWidth:N,minWidth:I,maxWidth:S}=ne(),A=a.useCallback(({locale:x})=>{j&&c(()=>{l.replace(j,{locale:x})})},[j,l,c]);return ae({"settings:locale-changed":A}),!n||!m&&!ie.includes(n)?null:e.jsxs("div",{className:"semiont-toolbar-panels",style:{width:`${p}px`,position:"relative"},children:[e.jsx(re,{onResize:N,minWidth:I,maxWidth:S,position:"left",ariaLabel:"Resize right panel"}),e.jsxs("div",{className:"semiont-toolbar-panels__content",children:[m,n==="knowledge-base"&&e.jsx(Se,{}),n==="user"&&(h?e.jsx(je,{}):e.jsxs("div",{className:"semiont-panel",children:[e.jsx("div",{className:"semiont-panel-header",children:e.jsx("h2",{className:"semiont-panel-header__title",children:e.jsx("span",{className:"semiont-panel-header__text",children:u("UserPanel.account")})})}),e.jsx("div",{className:"semiont-panel__content",style:{padding:"1rem",textAlign:"center"},children:e.jsx("p",{style:{color:"var(--semiont-color-neutral-400)",fontSize:"0.85rem",lineHeight:1.5},children:u("AccountPanel.notAuthenticated")})})]})),n==="settings"&&e.jsx(oe,{showLineNumbers:i,theme:t,hoverDelayMs:r,locale:o,isPendingLocaleChange:v})]})]})}export{fe as F,Re as T};
|
|
2
|
-
//# sourceMappingURL=ToolbarPanels-C9r6ZyGY.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarPanels-C9r6ZyGY.js","sources":["../../../../node_modules/@heroicons/react/24/outline/esm/ArrowRightStartOnRectangleIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/CheckIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/PlusIcon.js","../../src/components/UserPanel.tsx","../../src/components/KnowledgeBasePanel.tsx","../../src/components/toolbar/ToolbarPanels.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction ArrowRightStartOnRectangleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15m3 0 3-3m0 0-3-3m3 3H9\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ArrowRightStartOnRectangleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction CheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m4.5 12.75 6 6 9-13.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CheckIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction PlusIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M12 4.5v15m7.5-7.5h-15\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(PlusIcon);\nexport default ForwardRef;","import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n sanitizeImageURL,\n useSessionExpiry,\n formatTime,\n useApiClient,\n useKnowledgeBaseSession,\n} from '@semiont/react-ui';\nimport { useRouter } from '@/i18n/routing';\n\n// Fallback avatar when image fails to load or is invalid\nconst FALLBACK_AVATAR = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==';\n\nexport function UserPanel() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`UserPanel.${k}`, p as any) as string;\n const {\n displayName,\n avatarUrl,\n userDomain,\n isAdmin,\n isModerator,\n activeKnowledgeBase,\n signOut,\n } = useKnowledgeBaseSession();\n const apiClient = useApiClient();\n const router = useRouter();\n const [imageError, setImageError] = useState(false);\n const { timeRemaining } = useSessionExpiry();\n const sessionTimeFormatted = formatTime(timeRemaining) ?? 'Unknown';\n\n // Sanitize and validate the profile image URL\n const profileImageUrl = (() => {\n if (!avatarUrl || imageError) {\n return FALLBACK_AVATAR;\n }\n\n const sanitized = sanitizeImageURL(avatarUrl);\n if (!sanitized) {\n console.warn('Invalid profile image URL detected, using fallback');\n return FALLBACK_AVATAR;\n }\n\n return sanitized;\n })();\n\n const handleSignOut = async () => {\n try {\n await apiClient.logout();\n } catch {\n // best-effort — cookie already cleared server-side\n }\n if (activeKnowledgeBase) {\n signOut(activeKnowledgeBase.id);\n }\n router.push('/');\n };\n\n return (\n <div className=\"semiont-user-panel\">\n <h3 className=\"semiont-user-panel__title\">\n {t('account')}\n </h3>\n\n {activeKnowledgeBase && (\n <div style={{ padding: '0 0.75rem 0.5rem', fontSize: '0.8rem', color: 'var(--semiont-color-neutral-400)' }}>\n {activeKnowledgeBase.label}\n </div>\n )}\n\n <div className=\"space-y-4\">\n {/* User Profile */}\n <div className=\"flex items-center gap-3\">\n <img\n src={profileImageUrl}\n alt={t('profileAlt', { name: displayName || t('user') })}\n width={48}\n height={48}\n className=\"w-12 h-12 rounded-full object-cover\"\n onError={() => setImageError(true)}\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"semiont-panel-text\">\n {displayName || t('user')}\n </div>\n {userDomain && (\n <div className=\"semiont-panel-text-secondary\">\n @{userDomain}\n </div>\n )}\n </div>\n </div>\n\n {/* Session Info */}\n <div>\n <label className=\"semiont-panel-label\">\n {t('session')}\n </label>\n <div className=\"semiont-session-box\">\n <div className=\"semiont-panel-hint\">\n {t('expiresIn', { time: sessionTimeFormatted })}\n </div>\n </div>\n </div>\n\n {/* Privileges */}\n {(isAdmin || isModerator) && (\n <div>\n <label className=\"semiont-panel-label\">\n {t('privileges')}\n </label>\n <div className=\"space-y-1\">\n {isAdmin && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--admin\">\n <span className=\"semiont-privilege-text\">\n {t('administrator')}\n </span>\n </div>\n )}\n {isModerator && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--moderator\">\n <span className=\"semiont-privilege-text\">\n {t('moderator')}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Sign Out Button */}\n <div className=\"semiont-panel-divider\">\n <button\n onClick={handleSignOut}\n className=\"semiont-signout-button\"\n >\n {t('signOut')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CheckIcon, PlusIcon, ArrowRightStartOnRectangleIcon, XMarkIcon, TrashIcon } from '@heroicons/react/24/outline';\nimport { SemiontApiClient } from '@semiont/api-client';\nimport { baseUrl, email as makeEmail, accessToken, EventBus } from '@semiont/core';\nimport {\n useKnowledgeBaseSession,\n defaultProtocol,\n getKbSessionStatus,\n type KnowledgeBase,\n type KbSessionStatus,\n} from '@semiont/react-ui';\n\ntype T = (key: string, params?: Record<string, unknown>) => string;\n\nconst STATUS_COLORS: Record<KbSessionStatus, string> = {\n authenticated: 'var(--semiont-color-success-500, #22c55e)',\n expired: 'var(--semiont-color-warning-500, #eab308)',\n 'signed-out': 'var(--semiont-color-neutral-400, #9ca3af)',\n unreachable: 'var(--semiont-color-error-500, #ef4444)',\n};\n\nconst STATUS_KEYS: Record<KbSessionStatus, string> = {\n authenticated: 'statusConnected',\n expired: 'statusExpired',\n 'signed-out': 'statusSignedOut',\n unreachable: 'statusUnreachable',\n};\n\nfunction StatusDot({ status, t }: { status: KbSessionStatus; t: T }) {\n return (\n <span\n title={t(STATUS_KEYS[status])}\n style={{\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '50%',\n backgroundColor: STATUS_COLORS[status],\n flexShrink: 0,\n }}\n />\n );\n}\n\nfunction LoginForm({ t, onSubmit, onCancel, error, isSubmitting, autoFocus, pulsing, initialHost = 'localhost', initialPort = 4000, initialEmail = 'admin@example.com' }: {\n t: T;\n onSubmit: (host: string, port: number, email: string, password: string) => Promise<void>;\n onCancel: () => void;\n error: string | null;\n isSubmitting: boolean;\n autoFocus?: boolean;\n pulsing?: boolean;\n initialHost?: string;\n initialPort?: number;\n initialEmail?: string;\n}) {\n const [host, setHost] = useState(initialHost);\n const [port, setPort] = useState(String(initialPort));\n const [email, setEmail] = useState(initialEmail);\n const [password, setPassword] = useState('');\n\n return (\n <div\n className={pulsing ? 'semiont-panel__login-form--pulsing' : ''}\n style={{\n margin: '0.5rem',\n padding: '0.75rem',\n border: '1px solid var(--semiont-color-neutral-200, #e5e7eb)',\n borderRadius: 'var(--semiont-panel-border-radius, 0.5rem)',\n background: 'var(--semiont-bg-secondary, transparent)',\n }}\n >\n <h3 style={{ fontSize: '0.8rem', fontWeight: 600, marginBottom: '0.5rem' }}>{t('connectTitle')}</h3>\n <form onSubmit={(e) => { e.preventDefault(); onSubmit(host, parseInt(port, 10) || 4000, email, password); }} style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <input type=\"text\" value={host} onChange={e => setHost(e.target.value)} placeholder=\"Host\" className=\"semiont-input\" style={{ flex: 1 }} autoFocus={autoFocus} />\n <input type=\"number\" value={port} onChange={e => setPort(e.target.value)} placeholder=\"Port\" className=\"semiont-input\" style={{ width: '5rem' }} />\n </div>\n <input type=\"email\" value={email} onChange={e => setEmail(e.target.value)} placeholder=\"Email\" className=\"semiont-input\" />\n <input type=\"password\" value={password} onChange={e => setPassword(e.target.value)} placeholder=\"Password\" className=\"semiont-input\" />\n {error && <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{error}</div>}\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <button type=\"submit\" className=\"semiont-button semiont-button--primary\" style={{ flex: 1 }} disabled={isSubmitting}>\n {isSubmitting ? t('connecting') : t('connect')}\n </button>\n <button type=\"button\" className=\"semiont-button\" onClick={onCancel}>\n <XMarkIcon style={{ width: '1rem', height: '1rem' }} />\n </button>\n </div>\n </form>\n </div>\n );\n}\n\nfunction ReauthForm({ t, kb, onSubmit, onCancel, error, isSubmitting }: {\n t: T;\n kb: KnowledgeBase;\n onSubmit: (password: string) => Promise<void>;\n onCancel: () => void;\n error: string | null;\n isSubmitting: boolean;\n}) {\n const [password, setPassword] = useState('');\n\n return (\n <form onSubmit={(e) => { e.preventDefault(); onSubmit(password); }} style={{ padding: '0.5rem 0.75rem', display: 'flex', flexDirection: 'column', gap: '0.375rem' }}>\n <div style={{ fontSize: '0.75rem', color: 'var(--semiont-color-neutral-400)' }}>{kb.email}</div>\n <input type=\"password\" value={password} onChange={e => setPassword(e.target.value)} placeholder=\"Password\" className=\"semiont-input\" style={{ fontSize: '0.8rem' }} autoFocus />\n {error && <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{error}</div>}\n <div style={{ display: 'flex', gap: '0.375rem' }}>\n <button type=\"submit\" className=\"semiont-button semiont-button--primary\" style={{ flex: 1, fontSize: '0.8rem' }} disabled={isSubmitting}>\n {isSubmitting ? t('signingIn') : t('signIn')}\n </button>\n <button type=\"button\" className=\"semiont-button\" onClick={onCancel} style={{ fontSize: '0.8rem' }}>\n {t('cancel')}\n </button>\n </div>\n </form>\n );\n}\n\nasync function authenticateWithBackend(host: string, port: number, protocol: 'http' | 'https', emailStr: string, password: string): Promise<{ token: string; refreshToken: string; label: string; gitBranch?: string }> {\n const origin = `${protocol}://${host}:${port}`;\n const client = new SemiontApiClient({ baseUrl: baseUrl(origin), eventBus: new EventBus() });\n\n const authResult = await client.authenticatePassword(makeEmail(emailStr), password);\n const token = (authResult as any).token ?? (authResult as any).accessToken;\n const refreshToken = (authResult as any).refreshToken;\n if (!token) throw new Error('No access token received');\n if (!refreshToken) throw new Error('No refresh token received');\n\n let label = `${host}:${port}`;\n let gitBranch: string | undefined;\n try {\n const status = await client.getStatus({ auth: accessToken(token) });\n if ((status as any).projectName) label = (status as any).projectName;\n if ((status as any).gitBranch) gitBranch = (status as any).gitBranch;\n } catch { /* use default label */ }\n\n return { token, refreshToken, label, ...(gitBranch ? { gitBranch } : {}) };\n}\n\nexport function KnowledgeBasePanel() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`KnowledgeBasePanel.${k}`, p as any) as string;\n const {\n knowledgeBases,\n activeKnowledgeBase,\n setActiveKnowledgeBase,\n addKnowledgeBase,\n removeKnowledgeBase,\n updateKnowledgeBase,\n signIn,\n signOut,\n } = useKnowledgeBaseSession();\n const [showAddForm, setShowAddForm] = useState(false);\n const [addError, setAddError] = useState<string | null>(null);\n const [addSubmitting, setAddSubmitting] = useState(false);\n const [reauthKbId, setReauthKbId] = useState<string | null>(null);\n const [reauthError, setReauthError] = useState<string | null>(null);\n const [reauthSubmitting, setReauthSubmitting] = useState(false);\n const [confirmRemoveKbId, setConfirmRemoveKbId] = useState<string | null>(null);\n const [, setTick] = useState(0);\n\n useEffect(() => {\n if (knowledgeBases.length === 0) setShowAddForm(true);\n }, [knowledgeBases.length]);\n\n useEffect(() => {\n const interval = setInterval(() => setTick(t => t + 1), 30_000);\n return () => clearInterval(interval);\n }, []);\n\n const openAddForm = () => {\n setShowAddForm(true);\n setReauthKbId(null);\n setAddError(null);\n };\n\n const handleAdd = async (host: string, port: number, email: string, password: string) => {\n setAddError(null);\n setAddSubmitting(true);\n const protocol = defaultProtocol(host);\n const existing = knowledgeBases.find(kb => kb.host === host && kb.port === port);\n if (existing) {\n try {\n const { token, refreshToken, gitBranch } = await authenticateWithBackend(host, port, protocol, email, password);\n updateKnowledgeBase(existing.id, { ...(gitBranch ? { gitBranch } : {}) });\n signIn(existing.id, token, refreshToken);\n setShowAddForm(false);\n } catch (err) {\n setAddError(err instanceof Error ? err.message : String(err));\n } finally {\n setAddSubmitting(false);\n }\n return;\n }\n try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithBackend(host, port, protocol, email, password);\n addKnowledgeBase({ label, host, port, protocol, email, ...(gitBranch ? { gitBranch } : {}) }, token, refreshToken);\n setShowAddForm(false);\n } catch (err) {\n setAddError(err instanceof Error ? err.message : String(err));\n } finally {\n setAddSubmitting(false);\n }\n };\n\n const handleReauth = async (kbId: string, password: string) => {\n const kb = knowledgeBases.find(k => k.id === kbId);\n if (!kb) return;\n setReauthError(null);\n setReauthSubmitting(true);\n try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithBackend(kb.host, kb.port, kb.protocol, kb.email, password);\n updateKnowledgeBase(kbId, { label, ...(gitBranch ? { gitBranch } : {}) });\n signIn(kbId, token, refreshToken);\n setReauthKbId(null);\n } catch (err) {\n setReauthError(err instanceof Error ? err.message : String(err));\n } finally {\n setReauthSubmitting(false);\n }\n };\n\n const handleKbClick = (kb: KnowledgeBase) => {\n const status = getKbSessionStatus(kb.id);\n if (status === 'authenticated') {\n setActiveKnowledgeBase(kb.id);\n } else {\n setReauthKbId(kb.id);\n setShowAddForm(false);\n setReauthError(null);\n }\n };\n\n return (\n <div className=\"semiont-panel\">\n <div className=\"semiont-panel-header\">\n <h2 className=\"semiont-panel-header__title\">\n <span className=\"semiont-panel-header__text\">{t('title')}</span>\n <span className=\"semiont-panel-header__count\">({knowledgeBases.length})</span>\n </h2>\n </div>\n <div className=\"semiont-panel__content\">\n <div className=\"semiont-panel__list\">\n {knowledgeBases.map((kb: KnowledgeBase) => {\n const status = getKbSessionStatus(kb.id);\n const isActive = kb.id === activeKnowledgeBase?.id;\n const isReauthing = reauthKbId === kb.id;\n\n return (\n <div key={kb.id}>\n <div\n className={`semiont-panel-item semiont-panel-item--clickable${isActive ? ' semiont-panel-item--selected' : ''}`}\n style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem', cursor: 'pointer', padding: '0.5rem 0.75rem' }}\n onClick={() => handleKbClick(kb)}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <StatusDot status={status} t={t} />\n <span className=\"semiont-panel-text\" style={{ flex: 1, fontWeight: 500 }}>{kb.label}</span>\n {isActive && (\n <CheckIcon style={{ width: '1rem', height: '1rem', color: 'var(--semiont-color-primary-500)', flexShrink: 0 }} />\n )}\n {status === 'authenticated' && (\n <button\n onClick={(e) => { e.stopPropagation(); signOut(kb.id); }}\n title={t('signOut')}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '0.125rem', color: 'var(--semiont-color-neutral-400)' }}\n >\n <ArrowRightStartOnRectangleIcon style={{ width: '0.875rem', height: '0.875rem' }} />\n </button>\n )}\n <button\n onClick={(e) => { e.stopPropagation(); setConfirmRemoveKbId(kb.id); }}\n title={t('remove')}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '0.125rem', color: 'var(--semiont-color-neutral-400)' }}\n >\n <TrashIcon style={{ width: '0.875rem', height: '0.875rem' }} />\n </button>\n </div>\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem' }}>\n {kb.host}:{kb.port}{kb.gitBranch ? ` · ${kb.gitBranch}` : ''}\n </span>\n </div>\n {confirmRemoveKbId === kb.id && (\n <div style={{\n padding: '0.5rem 0.75rem',\n fontSize: '0.8rem',\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n background: 'var(--semiont-bg-secondary, #f9fafb)',\n borderBottom: '1px solid var(--semiont-color-neutral-200, #e5e7eb)',\n }}>\n <span style={{ flex: 1, color: 'var(--semiont-color-neutral-500)' }}>{t('removeConfirm', { label: kb.label })}</span>\n <button\n onClick={() => { removeKnowledgeBase(kb.id); setConfirmRemoveKbId(null); }}\n className=\"semiont-button\"\n style={{ fontSize: '0.75rem', padding: '0.2rem 0.5rem', color: 'var(--semiont-color-error-500, #ef4444)' }}\n >\n {t('remove')}\n </button>\n <button\n onClick={() => setConfirmRemoveKbId(null)}\n className=\"semiont-button\"\n style={{ fontSize: '0.75rem', padding: '0.2rem 0.5rem' }}\n >\n {t('cancel')}\n </button>\n </div>\n )}\n {isReauthing && (\n <ReauthForm\n t={t}\n kb={kb}\n onSubmit={(password) => handleReauth(kb.id, password)}\n onCancel={() => setReauthKbId(null)}\n error={reauthError}\n isSubmitting={reauthSubmitting}\n />\n )}\n </div>\n );\n })}\n </div>\n\n {showAddForm && (\n <LoginForm\n t={t}\n onSubmit={handleAdd}\n onCancel={() => setShowAddForm(false)}\n error={addError}\n isSubmitting={addSubmitting}\n autoFocus={knowledgeBases.length === 0}\n pulsing={knowledgeBases.length === 0}\n />\n )}\n </div>\n\n {!showAddForm && (\n <div className=\"semiont-panel-footer\">\n <button\n onClick={openAddForm}\n className=\"semiont-panel-item semiont-panel-item--clickable\"\n style={{ width: '100%', display: 'flex', alignItems: 'center', gap: '0.5rem', color: 'var(--semiont-color-primary-600)' }}\n >\n <PlusIcon style={{ width: '1rem', height: '1rem', flexShrink: 0 }} />\n <span className=\"semiont-panel-text\" style={{ color: 'inherit' }}>{t('addKnowledgeBase')}</span>\n </button>\n </div>\n )}\n </div>\n );\n}\n","import React, { useTransition, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n SettingsPanel,\n ResizeHandle,\n usePanelWidth,\n useEventSubscriptions,\n useKnowledgeBaseSession,\n} from '@semiont/react-ui';\nimport { UserPanel } from '../UserPanel';\nimport { KnowledgeBasePanel } from '../KnowledgeBasePanel';\nimport { useLocale } from '@/i18n/routing';\nimport { usePathname, useRouter } from '@/i18n/routing';\nimport { COMMON_PANELS } from '@semiont/react-ui';\nimport type { ToolbarPanelType } from '@semiont/react-ui';\n\ninterface ToolbarPanelsProps {\n activePanel: ToolbarPanelType | null;\n /** Theme setting */\n theme: 'light' | 'dark' | 'system';\n /** Line numbers setting */\n showLineNumbers: boolean;\n /** Hover delay setting */\n hoverDelayMs: number;\n /** Custom panel content for context-specific panels */\n children?: React.ReactNode;\n}\n\n/**\n * Renders the toolbar panel container with common panels (user, settings)\n * and any context-specific panels passed as children.\n *\n * Settings changes are handled via GlobalSettingsEventBus - no callbacks needed.\n *\n * @example\n * // Simple context (compose, discover, moderate, admin pages)\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\n * />\n *\n * @example\n * // Document context with custom panels\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\n * >\n * {activePanel === 'annotations' && <UnifiedAnnotationsPanel ... />}\n * {activePanel === 'history' && <AnnotationHistory ... />}\n * {activePanel === 'info' && <ResourceInfoPanel ... />}\n * {activePanel === 'collaboration' && <CollaborationPanel ... />}\n * {activePanel === 'jsonld' && <JsonLdPanel ... />}\n * </ToolbarPanels>\n */\nexport function ToolbarPanels({\n activePanel,\n theme,\n showLineNumbers,\n hoverDelayMs,\n children\n}: ToolbarPanelsProps) {\n const { t: _t } = useTranslation();\n const { isAuthenticated } = useKnowledgeBaseSession();\n const locale = useLocale();\n const router = useRouter();\n const pathname = usePathname();\n const [isPending, startTransition] = useTransition();\n\n // Panel width management with localStorage persistence\n const { width, setWidth, minWidth, maxWidth } = usePanelWidth();\n\n // Handle locale change events\n const handleLocaleChanged = useCallback(({ locale: newLocale }: { locale: string }) => {\n if (!pathname) return;\n\n startTransition(() => {\n // The router from @/i18n/routing is locale-aware and will handle the locale prefix\n router.replace(pathname, { locale: newLocale });\n });\n }, [pathname, router, startTransition]);\n\n // Subscribe to locale change events\n useEventSubscriptions({\n 'settings:locale-changed': handleLocaleChanged,\n });\n\n // Don't render container if no panel is active\n if (!activePanel) {\n return null;\n }\n\n // In simple context (no children), only user and settings panels are valid.\n // If a resource-specific panel is still active from a previous route, hide the container.\n if (!children && !COMMON_PANELS.includes(activePanel)) {\n return null;\n }\n\n return (\n <div className=\"semiont-toolbar-panels\" style={{ width: `${width}px`, position: 'relative' }}>\n {/* Resize handle on left edge */}\n <ResizeHandle\n onResize={setWidth}\n minWidth={minWidth}\n maxWidth={maxWidth}\n position=\"left\"\n ariaLabel=\"Resize right panel\"\n />\n\n {/* Custom context-specific panels */}\n <div className=\"semiont-toolbar-panels__content\">\n {children}\n\n {/* Knowledge Base Panel - common to all contexts */}\n {activePanel === 'knowledge-base' && (\n <KnowledgeBasePanel />\n )}\n\n {/* User Panel - requires authentication */}\n {activePanel === 'user' && (\n isAuthenticated ? (\n <UserPanel />\n ) : (\n <div className=\"semiont-panel\">\n <div className=\"semiont-panel-header\">\n <h2 className=\"semiont-panel-header__title\">\n <span className=\"semiont-panel-header__text\">{_t('UserPanel.account')}</span>\n </h2>\n </div>\n <div className=\"semiont-panel__content\" style={{ padding: '1rem', textAlign: 'center' }}>\n <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5 }}>\n {_t('AccountPanel.notAuthenticated')}\n </p>\n </div>\n </div>\n )\n )}\n\n {/* Settings Panel - common to all contexts */}\n {activePanel === 'settings' && (\n <SettingsPanel\n showLineNumbers={showLineNumbers}\n theme={theme}\n hoverDelayMs={hoverDelayMs}\n locale={locale}\n isPendingLocaleChange={isPending}\n />\n )}\n </div>\n </div>\n );\n}\n"],"names":["ArrowRightStartOnRectangleIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","CheckIcon","PlusIcon","FALLBACK_AVATAR","UserPanel","_t","useTranslation","k","p","displayName","avatarUrl","userDomain","isAdmin","isModerator","activeKnowledgeBase","signOut","useKnowledgeBaseSession","apiClient","useApiClient","router","useRouter","imageError","setImageError","useState","timeRemaining","useSessionExpiry","sessionTimeFormatted","formatTime","profileImageUrl","sanitized","sanitizeImageURL","handleSignOut","jsxs","jsx","STATUS_COLORS","STATUS_KEYS","StatusDot","status","LoginForm","t","onSubmit","onCancel","error","isSubmitting","autoFocus","pulsing","initialHost","initialPort","initialEmail","host","setHost","port","setPort","email","setEmail","password","setPassword","e","XMarkIcon","ReauthForm","kb","authenticateWithBackend","protocol","emailStr","origin","client","SemiontApiClient","baseUrl","EventBus","authResult","makeEmail","token","refreshToken","label","gitBranch","accessToken","KnowledgeBasePanel","knowledgeBases","setActiveKnowledgeBase","addKnowledgeBase","removeKnowledgeBase","updateKnowledgeBase","signIn","showAddForm","setShowAddForm","addError","setAddError","addSubmitting","setAddSubmitting","reauthKbId","setReauthKbId","reauthError","setReauthError","reauthSubmitting","setReauthSubmitting","confirmRemoveKbId","setConfirmRemoveKbId","setTick","useEffect","interval","openAddForm","handleAdd","defaultProtocol","existing","err","handleReauth","kbId","handleKbClick","getKbSessionStatus","isActive","isReauthing","TrashIcon","ToolbarPanels","activePanel","theme","showLineNumbers","hoverDelayMs","children","isAuthenticated","locale","useLocale","pathname","usePathname","isPending","startTransition","useTransition","width","setWidth","minWidth","maxWidth","usePanelWidth","handleLocaleChanged","useCallback","newLocale","useEventSubscriptions","COMMON_PANELS","ResizeHandle","SettingsPanel"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|