@semiont/browser 0.5.32 → 0.5.34
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/assets/{CookiePreferences-CWZIFYNC.js → CookiePreferences--yB7lQIF.js} +2 -2
- package/dist/assets/{CookiePreferences-CWZIFYNC.js.map → CookiePreferences--yB7lQIF.js.map} +1 -1
- package/dist/assets/{KeyboardShortcutsContext-CSFk3vP6.js → KeyboardShortcutsContext-Bb3ZQ4QP.js} +2 -2
- package/dist/assets/{KeyboardShortcutsContext-CSFk3vP6.js.map → KeyboardShortcutsContext-Bb3ZQ4QP.js.map} +1 -1
- package/dist/assets/{PdfAnnotationCanvas.client-LSH3PZPY-D-7UQNP4.js → PdfAnnotationCanvas.client-7EYCQF6V-DjhntiNY.js} +2 -2
- package/dist/assets/{PdfAnnotationCanvas.client-LSH3PZPY-D-7UQNP4.js.map → PdfAnnotationCanvas.client-7EYCQF6V-DjhntiNY.js.map} +1 -1
- package/dist/assets/{ToolbarPanels-CbF3qEos.js → ToolbarPanels-DMK1LAo0.js} +2 -2
- package/dist/assets/{ToolbarPanels-CbF3qEos.js.map → ToolbarPanels-DMK1LAo0.js.map} +1 -1
- package/dist/assets/ar-PYOTZERT-CXqLatkw.js +2 -0
- package/dist/assets/ar-PYOTZERT-CXqLatkw.js.map +1 -0
- package/dist/assets/{bn-CCEW6AOS-BCI1FG86.js → bn-5SYTY67O-Dv_vM9LW.js} +2 -2
- package/dist/assets/bn-5SYTY67O-Dv_vM9LW.js.map +1 -0
- package/dist/assets/{client-CXKycZZZ.js → client-Bb60uCwR.js} +2 -2
- package/dist/assets/{client-CXKycZZZ.js.map → client-Bb60uCwR.js.map} +1 -1
- package/dist/assets/{client-CiXdSyqF.js → client-CBa3uasO.js} +2 -2
- package/dist/assets/{client-CiXdSyqF.js.map → client-CBa3uasO.js.map} +1 -1
- package/dist/assets/cs-BCA77OVY-rF_afyOb.js +2 -0
- package/dist/assets/cs-BCA77OVY-rF_afyOb.js.map +1 -0
- package/dist/assets/da-LFLFOUMU-4AyVJTUL.js +2 -0
- package/dist/assets/da-LFLFOUMU-4AyVJTUL.js.map +1 -0
- package/dist/assets/de-55TAX5Q2-C6iRza4E.js +2 -0
- package/dist/assets/de-55TAX5Q2-C6iRza4E.js.map +1 -0
- package/dist/assets/el-PZ7OBJZD-gTMe4-os.js +2 -0
- package/dist/assets/el-PZ7OBJZD-gTMe4-os.js.map +1 -0
- package/dist/assets/{en-R5XA26NF-BxJGw0oZ.js → en-H4MQUZWO-BbOPkiNi.js} +1 -1
- package/dist/assets/es-PSVJOIBC-Clv0XkZb.js +2 -0
- package/dist/assets/es-PSVJOIBC-Clv0XkZb.js.map +1 -0
- package/dist/assets/{fa-G7HN6B32-DdDi1TG_.js → fa-CFR54IER-CEInmDtD.js} +2 -2
- package/dist/assets/fa-CFR54IER-CEInmDtD.js.map +1 -0
- package/dist/assets/fi-E7YPW5B3-DmqNh-vH.js +2 -0
- package/dist/assets/fi-E7YPW5B3-DmqNh-vH.js.map +1 -0
- package/dist/assets/fr-4OOHYZSV-B95joHYO.js +2 -0
- package/dist/assets/fr-4OOHYZSV-B95joHYO.js.map +1 -0
- package/dist/assets/he-TWJR3AKD-qwzE23x8.js +2 -0
- package/dist/assets/he-TWJR3AKD-qwzE23x8.js.map +1 -0
- package/dist/assets/hi-F6RRLYIK-iRKIq5ZZ.js +2 -0
- package/dist/assets/hi-F6RRLYIK-iRKIq5ZZ.js.map +1 -0
- package/dist/assets/id-JRC3ZLJW-1KAIhpsi.js +2 -0
- package/dist/assets/id-JRC3ZLJW-1KAIhpsi.js.map +1 -0
- package/dist/assets/{index-C6tZC9XN.css → index-DUd0z7O4.css} +1 -1
- package/dist/assets/{index-cHWd4mGO.js → index-Ojc52FmW.js} +50 -50
- package/dist/assets/index-Ojc52FmW.js.map +1 -0
- package/dist/assets/it-IWYDLO43-BP5ovqTQ.js +2 -0
- package/dist/assets/it-IWYDLO43-BP5ovqTQ.js.map +1 -0
- package/dist/assets/ja-YETT5V5B-CeAre0UH.js +2 -0
- package/dist/assets/ja-YETT5V5B-CeAre0UH.js.map +1 -0
- package/dist/assets/ko-YX5NVOG4-BecWz7kN.js +2 -0
- package/dist/assets/ko-YX5NVOG4-BecWz7kN.js.map +1 -0
- package/dist/assets/{layout-B4A7CIsE.js → layout-B20iBPm-.js} +2 -2
- package/dist/assets/{layout-B4A7CIsE.js.map → layout-B20iBPm-.js.map} +1 -1
- package/dist/assets/{layout-CGq5doN0.js → layout-CneiUXGM.js} +2 -2
- package/dist/assets/{layout-CGq5doN0.js.map → layout-CneiUXGM.js.map} +1 -1
- package/dist/assets/{layout-3T2CwuLU.js → layout-DhqPRPc7.js} +2 -2
- package/dist/assets/{layout-3T2CwuLU.js.map → layout-DhqPRPc7.js.map} +1 -1
- package/dist/assets/{layout-DSvS5iO0.js → layout-YkO4-GqS.js} +2 -2
- package/dist/assets/{layout-DSvS5iO0.js.map → layout-YkO4-GqS.js.map} +1 -1
- package/dist/assets/ms-3FAOUVYS-B5WSIC5e.js +2 -0
- package/dist/assets/ms-3FAOUVYS-B5WSIC5e.js.map +1 -0
- package/dist/assets/nl-UYCI5TXI-oz-H334v.js +2 -0
- package/dist/assets/nl-UYCI5TXI-oz-H334v.js.map +1 -0
- package/dist/assets/no-ZR3EQ2NI-DFXui17p.js +2 -0
- package/dist/assets/no-ZR3EQ2NI-DFXui17p.js.map +1 -0
- package/dist/assets/{not-found-k9OeYO0z.js → not-found-D1Vs29Pd.js} +2 -2
- package/dist/assets/{not-found-k9OeYO0z.js.map → not-found-D1Vs29Pd.js.map} +1 -1
- package/dist/assets/{page-BhPjX09z.js → page--ktG80Hk.js} +2 -2
- package/dist/assets/{page-BhPjX09z.js.map → page--ktG80Hk.js.map} +1 -1
- package/dist/assets/{page-CJnENX8F.js → page-B06y4XtB.js} +2 -2
- package/dist/assets/{page-CJnENX8F.js.map → page-B06y4XtB.js.map} +1 -1
- package/dist/assets/{page-bR7KMw9p.js → page-B7Vp80w2.js} +2 -2
- package/dist/assets/{page-bR7KMw9p.js.map → page-B7Vp80w2.js.map} +1 -1
- package/dist/assets/{page-DLiS_avb.js → page-BD2asFxe.js} +2 -2
- package/dist/assets/{page-DLiS_avb.js.map → page-BD2asFxe.js.map} +1 -1
- package/dist/assets/{page-DS47DLy5.js → page-BJnX_yAg.js} +2 -2
- package/dist/assets/{page-DS47DLy5.js.map → page-BJnX_yAg.js.map} +1 -1
- package/dist/assets/{page-DYcAqNIR.js → page-BXynYvhE.js} +2 -2
- package/dist/assets/{page-DYcAqNIR.js.map → page-BXynYvhE.js.map} +1 -1
- package/dist/assets/{page-Bk2UhTqA.js → page-BgzC_t5l.js} +2 -2
- package/dist/assets/{page-Bk2UhTqA.js.map → page-BgzC_t5l.js.map} +1 -1
- package/dist/assets/{page-OhVx5cMH.js → page-BuW3aSm_.js} +2 -2
- package/dist/assets/{page-OhVx5cMH.js.map → page-BuW3aSm_.js.map} +1 -1
- package/dist/assets/{page-BfbTxteF.js → page-C0dhB8e1.js} +2 -2
- package/dist/assets/{page-BfbTxteF.js.map → page-C0dhB8e1.js.map} +1 -1
- package/dist/assets/{page-XISoI7Ji.js → page-C6IDcAg_.js} +2 -2
- package/dist/assets/{page-XISoI7Ji.js.map → page-C6IDcAg_.js.map} +1 -1
- package/dist/assets/{page-Ct7GNMjQ.js → page-CB1Zkhf_.js} +2 -2
- package/dist/assets/{page-Ct7GNMjQ.js.map → page-CB1Zkhf_.js.map} +1 -1
- package/dist/assets/{page-De7BG-0h.js → page-COYp-fvx.js} +2 -2
- package/dist/assets/{page-De7BG-0h.js.map → page-COYp-fvx.js.map} +1 -1
- package/dist/assets/{page-DYqW4iWr.js → page-CW0mYluf.js} +2 -2
- package/dist/assets/{page-DYqW4iWr.js.map → page-CW0mYluf.js.map} +1 -1
- package/dist/assets/{page-BWTL-Lea.js → page-CZj-I3Ya.js} +2 -2
- package/dist/assets/{page-BWTL-Lea.js.map → page-CZj-I3Ya.js.map} +1 -1
- package/dist/assets/{page-BNXN9uWs.js → page-DNCSUWUQ.js} +2 -2
- package/dist/assets/{page-BNXN9uWs.js.map → page-DNCSUWUQ.js.map} +1 -1
- package/dist/assets/{page-DwyBQfbg.js → page-DVjeBr3D.js} +2 -2
- package/dist/assets/{page-DwyBQfbg.js.map → page-DVjeBr3D.js.map} +1 -1
- package/dist/assets/{page-CywSuXyN.js → page-IQiRcQOl.js} +2 -2
- package/dist/assets/{page-CywSuXyN.js.map → page-IQiRcQOl.js.map} +1 -1
- package/dist/assets/{page-D-_kPKxI.js → page-Ln_Qh0ju.js} +2 -2
- package/dist/assets/{page-D-_kPKxI.js.map → page-Ln_Qh0ju.js.map} +1 -1
- package/dist/assets/pl-FPLBWLWX-DIXNldJ9.js +2 -0
- package/dist/assets/pl-FPLBWLWX-DIXNldJ9.js.map +1 -0
- package/dist/assets/pt-JOJPVHDL-Eea3ZrF_.js +2 -0
- package/dist/assets/pt-JOJPVHDL-Eea3ZrF_.js.map +1 -0
- package/dist/assets/ro-WHNIABHY-BPaTMqDU.js +2 -0
- package/dist/assets/{ro-3CGVMOC6-wdwqXMaO.js.map → ro-WHNIABHY-BPaTMqDU.js.map} +1 -1
- package/dist/assets/{routing-D-GkAfgE.js → routing-CjmlBUw_.js} +2 -2
- package/dist/assets/{routing-D-GkAfgE.js.map → routing-CjmlBUw_.js.map} +1 -1
- package/dist/assets/{routing-D5d0e59H.js → routing-DMkxvd2j.js} +2 -2
- package/dist/assets/{routing-D5d0e59H.js.map → routing-DMkxvd2j.js.map} +1 -1
- package/dist/assets/sv-KWSW2ERR-DegRdizd.js +2 -0
- package/dist/assets/sv-KWSW2ERR-DegRdizd.js.map +1 -0
- package/dist/assets/{th-NZ4G352Z-ZMBwAbgb.js → th-5OOFP4VL-7EmxRgfL.js} +2 -2
- package/dist/assets/th-5OOFP4VL-7EmxRgfL.js.map +1 -0
- package/dist/assets/tr-NJUOJ2KQ-B4Wv3rtO.js +2 -0
- package/dist/assets/tr-NJUOJ2KQ-B4Wv3rtO.js.map +1 -0
- package/dist/assets/uk-MFJCRRB2-rFn4flwH.js +2 -0
- package/dist/assets/uk-MFJCRRB2-rFn4flwH.js.map +1 -0
- package/dist/assets/vi-TFR4NPYP-DR0dbrnV.js +2 -0
- package/dist/assets/vi-TFR4NPYP-DR0dbrnV.js.map +1 -0
- package/dist/assets/{web-DWjmWGs5.js → web-UYBXFOwL.js} +2 -2
- package/dist/assets/{web-DWjmWGs5.js.map → web-UYBXFOwL.js.map} +1 -1
- package/dist/assets/zh-47SIEPEL-D2lz0Gi3.js +2 -0
- package/dist/assets/zh-47SIEPEL-D2lz0Gi3.js.map +1 -0
- package/dist/index.html +2 -2
- package/dist/messages/ar.json +5 -2
- package/dist/messages/bn.json +5 -2
- package/dist/messages/cs.json +5 -2
- package/dist/messages/da.json +5 -2
- package/dist/messages/de.json +5 -2
- package/dist/messages/el.json +5 -2
- package/dist/messages/en.json +5 -2
- package/dist/messages/es.json +5 -2
- package/dist/messages/fa.json +5 -2
- package/dist/messages/fi.json +5 -2
- package/dist/messages/fr.json +5 -2
- package/dist/messages/he.json +5 -2
- package/dist/messages/hi.json +5 -2
- package/dist/messages/id.json +5 -2
- package/dist/messages/it.json +5 -2
- package/dist/messages/ja.json +5 -2
- package/dist/messages/ko.json +5 -2
- package/dist/messages/ms.json +5 -2
- package/dist/messages/nl.json +5 -2
- package/dist/messages/no.json +5 -2
- package/dist/messages/pl.json +5 -2
- package/dist/messages/pt.json +5 -2
- package/dist/messages/ro.json +5 -2
- package/dist/messages/sv.json +5 -2
- package/dist/messages/th.json +5 -2
- package/dist/messages/tr.json +5 -2
- package/dist/messages/uk.json +5 -2
- package/dist/messages/vi.json +5 -2
- package/dist/messages/zh.json +5 -2
- package/package.json +1 -1
- package/dist/assets/ar-AZBRADEB-CvnkaLQS.js +0 -2
- package/dist/assets/ar-AZBRADEB-CvnkaLQS.js.map +0 -1
- package/dist/assets/bn-CCEW6AOS-BCI1FG86.js.map +0 -1
- package/dist/assets/cs-HXPF2CTE-CbMUDpDp.js +0 -2
- package/dist/assets/cs-HXPF2CTE-CbMUDpDp.js.map +0 -1
- package/dist/assets/da-K5NTK7LH-D2rWDXq3.js +0 -2
- package/dist/assets/da-K5NTK7LH-D2rWDXq3.js.map +0 -1
- package/dist/assets/de-GMRQEDZI-CVlSEip_.js +0 -2
- package/dist/assets/de-GMRQEDZI-CVlSEip_.js.map +0 -1
- package/dist/assets/el-EUB4CI4G-C80i0753.js +0 -2
- package/dist/assets/el-EUB4CI4G-C80i0753.js.map +0 -1
- package/dist/assets/es-Z32DAZ6W-D7UTS3Fx.js +0 -2
- package/dist/assets/es-Z32DAZ6W-D7UTS3Fx.js.map +0 -1
- package/dist/assets/fa-G7HN6B32-DdDi1TG_.js.map +0 -1
- package/dist/assets/fi-3YBLZO7I-B3OjL1PQ.js +0 -2
- package/dist/assets/fi-3YBLZO7I-B3OjL1PQ.js.map +0 -1
- package/dist/assets/fr-VUBH7BBS-CjoeoL9n.js +0 -2
- package/dist/assets/fr-VUBH7BBS-CjoeoL9n.js.map +0 -1
- package/dist/assets/he-WQQEY26B-2RRJq7To.js +0 -2
- package/dist/assets/he-WQQEY26B-2RRJq7To.js.map +0 -1
- package/dist/assets/hi-HJZ6W4JB-DPflxelg.js +0 -2
- package/dist/assets/hi-HJZ6W4JB-DPflxelg.js.map +0 -1
- package/dist/assets/id-ZOGZ37MI-Dd4wSvWi.js +0 -2
- package/dist/assets/id-ZOGZ37MI-Dd4wSvWi.js.map +0 -1
- package/dist/assets/index-cHWd4mGO.js.map +0 -1
- package/dist/assets/it-DT6UW66F-B7ZzCBm1.js +0 -2
- package/dist/assets/it-DT6UW66F-B7ZzCBm1.js.map +0 -1
- package/dist/assets/ja-RUKQCOLO-Br1kLTUs.js +0 -2
- package/dist/assets/ja-RUKQCOLO-Br1kLTUs.js.map +0 -1
- package/dist/assets/ko-ZH5ADKZM-8IO4IU-2.js +0 -2
- package/dist/assets/ko-ZH5ADKZM-8IO4IU-2.js.map +0 -1
- package/dist/assets/ms-Y2AFPZTU-q4v04hSa.js +0 -2
- package/dist/assets/ms-Y2AFPZTU-q4v04hSa.js.map +0 -1
- package/dist/assets/nl-OQEWIXNA-DiHanxnO.js +0 -2
- package/dist/assets/nl-OQEWIXNA-DiHanxnO.js.map +0 -1
- package/dist/assets/no-KPAYJZWY-DdGouMG_.js +0 -2
- package/dist/assets/no-KPAYJZWY-DdGouMG_.js.map +0 -1
- package/dist/assets/pl-WSXK2UUD-DK_ieA8X.js +0 -2
- package/dist/assets/pl-WSXK2UUD-DK_ieA8X.js.map +0 -1
- package/dist/assets/pt-NWRJRUCK-I6-gHOkB.js +0 -2
- package/dist/assets/pt-NWRJRUCK-I6-gHOkB.js.map +0 -1
- package/dist/assets/ro-3CGVMOC6-wdwqXMaO.js +0 -2
- package/dist/assets/sv-HGSEBA7S-2KvJx_dY.js +0 -2
- package/dist/assets/sv-HGSEBA7S-2KvJx_dY.js.map +0 -1
- package/dist/assets/th-NZ4G352Z-ZMBwAbgb.js.map +0 -1
- package/dist/assets/tr-LGGS4DLW-BwMx3CfM.js +0 -2
- package/dist/assets/tr-LGGS4DLW-BwMx3CfM.js.map +0 -1
- package/dist/assets/uk-AIX536L4-cREJjolM.js +0 -2
- package/dist/assets/uk-AIX536L4-cREJjolM.js.map +0 -1
- package/dist/assets/vi-V6CVQZLQ-CXAniXLX.js +0 -2
- package/dist/assets/vi-V6CVQZLQ-CXAniXLX.js.map +0 -1
- package/dist/assets/zh-AGKPGI3L-MsKTx_dK.js +0 -2
- package/dist/assets/zh-AGKPGI3L-MsKTx_dK.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./i18n-CywLsdxn.js";import{t as r}from"./vendor-vK2W55bZ.js";import{At as i,B as a,G as o,H as s,It as c,K as l,Lt as u,Nt as d,Pt as f,Q as p,Rt as m,U as h,X as g,Y as _,Z as v,a as y,cn as b,et as x,h as S,kt as C,on as w,q as T,sn as E,w as D}from"./index-cHWd4mGO.js";import{n as O,t as k}from"./XMarkIcon-Dt8lUQLh.js";import{i as A,n as j,r as M}from"./routing-D-GkAfgE.js";var N=e(t());function P({title:e,titleId:t,...n},r){return N.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},n),e?N.createElement(`title`,{id:t},e):null,N.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`}))}var F=N.forwardRef(P);function I({title:e,titleId:t,...n},r){return N.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},n),e?N.createElement(`title`,{id:t},e):null,N.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`m4.5 12.75 6 6 9-13.5`}))}var ee=N.forwardRef(I);function L({title:e,titleId:t,...n},r){return N.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},n),e?N.createElement(`title`,{id:t},e):null,N.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M12 4.5v15m7.5-7.5h-15`}))}var R=N.forwardRef(L),z=r(),B=`data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==`;function V(){let{t:e}=n(),t=(t,n)=>e(`UserPanel.${t}`,n),r=i(),a=_(r.activeSession$),o=_(a?.user$)??null,c=a?.kb??null,l=o?.name??o?.email?.split(`@`)[0]??`User`,u=o?.image??null,d=o?.domain||o?.email?.split(`@`)[1],f=o?.isAdmin??!1,p=o?.isModerator??!1,[m,g]=(0,N.useState)(!1),{timeRemaining:y}=v(),b=s(y)??`Unknown`,x=!u||m?B:h(u)||(console.warn(`Invalid profile image URL detected, using fallback`),B);return(0,z.jsxs)(`div`,{className:`semiont-user-panel`,children:[(0,z.jsx)(`h3`,{className:`semiont-user-panel__title`,children:t(`account`)}),c&&(0,z.jsx)(`div`,{style:{padding:`0 0.75rem 0.5rem`,fontSize:`0.8rem`,color:`var(--semiont-color-neutral-400)`},children:c.label}),(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,z.jsx)(`img`,{src:x,alt:t(`profileAlt`,{name:l||t(`user`)}),width:48,height:48,className:`w-12 h-12 rounded-full object-cover`,onError:()=>g(!0)}),(0,z.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,z.jsx)(`div`,{className:`semiont-panel-text`,children:l||t(`user`)}),d&&(0,z.jsxs)(`div`,{className:`semiont-panel-text-secondary`,children:[`@`,d]})]})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`label`,{className:`semiont-panel-label`,children:t(`session`)}),(0,z.jsx)(`div`,{className:`semiont-session-box`,children:(0,z.jsx)(`div`,{className:`semiont-panel-hint`,children:t(`expiresIn`,{time:b})})})]}),(f||p)&&(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`label`,{className:`semiont-panel-label`,children:t(`privileges`)}),(0,z.jsxs)(`div`,{className:`space-y-1`,children:[f&&(0,z.jsx)(`div`,{className:`semiont-privilege-badge semiont-privilege-badge--admin`,children:(0,z.jsx)(`span`,{className:`semiont-privilege-text`,children:t(`administrator`)})}),p&&(0,z.jsx)(`div`,{className:`semiont-privilege-badge semiont-privilege-badge--moderator`,children:(0,z.jsx)(`span`,{className:`semiont-privilege-text`,children:t(`moderator`)})})]})]}),a&&(0,z.jsx)(H,{session:a,label:t(`signOut`)},a.id)]})]})}function H({session:e,label:t}){let n=i(),r=A(),o=p(e??void 0,a);return(0,z.jsx)(`div`,{className:`semiont-panel-divider`,children:(0,z.jsx)(`button`,{onClick:async()=>{await o?.logout(),e.kb&&await n.signOut(e.kb.id),r.push(`/`)},className:`semiont-signout-button`,children:t})})}var U={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)`},W={authenticated:`statusConnected`,expired:`statusExpired`,"signed-out":`statusSignedOut`,unreachable:`statusUnreachable`},G=(e,t)=>`${e}:${t}`,K=`–`;function q({placement:e,t}){return(0,z.jsx)(`span`,{title:t(`managedBadge`),style:{fontSize:`0.65rem`,padding:`0 0.375rem`,borderRadius:`9999px`,border:`1px solid var(--semiont-color-primary-500, #3b82f6)`,color:`var(--semiont-color-primary-500, #3b82f6)`,flexShrink:0},children:t(e===`local`?`placementLocal`:`placementCodespace`)})}function te({status:e,t}){return(0,z.jsx)(`span`,{title:t(W[e]),style:{width:`0.5rem`,height:`0.5rem`,borderRadius:`50%`,backgroundColor:U[e],flexShrink:0}})}function ne({t:e,title:t,onSubmit:n,onCancel:r,error:i,isSubmitting:a,autoFocus:o,pulsing:s,initialHost:l=`localhost`,initialPort:u=4e3,initialEmail:d=`admin@example.com`}){let[p,m]=(0,N.useState)(l),[h,g]=(0,N.useState)(String(u)),[_,v]=(0,N.useState)(f(l)),[y,b]=(0,N.useState)(d),[x,S]=(0,N.useState)(``),C=e=>{m(e),v(f(e))};return(0,z.jsxs)(`div`,{className:s?`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:[(0,z.jsx)(`h3`,{style:{fontSize:`0.8rem`,fontWeight:600,marginBottom:`0.5rem`},children:t??e(`connectTitle`)}),(0,z.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),c(p)&&n(p,parseInt(h,10)||4e3,_,y,x)},style:{display:`flex`,flexDirection:`column`,gap:`0.5rem`},children:[(0,z.jsxs)(`select`,{value:_,onChange:e=>v(e.target.value),className:`semiont-input`,children:[(0,z.jsx)(`option`,{value:`http`,children:`HTTP`}),(0,z.jsx)(`option`,{value:`https`,children:`HTTPS`})]}),(0,z.jsx)(`input`,{type:`text`,value:p,onChange:e=>C(e.target.value),placeholder:`Host`,className:`semiont-input`,autoFocus:o}),(0,z.jsx)(`input`,{type:`number`,value:h,onChange:e=>g(e.target.value),placeholder:`Port`,className:`semiont-input`}),p&&!c(p)&&(0,z.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:e(`invalidHost`)}),(0,z.jsx)(`input`,{type:`email`,value:y,onChange:e=>b(e.target.value),placeholder:`Email`,className:`semiont-input`}),(0,z.jsx)(`input`,{type:`password`,value:x,onChange:e=>S(e.target.value),placeholder:`Password`,className:`semiont-input`}),i&&(0,z.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:i}),(0,z.jsxs)(`div`,{style:{display:`flex`,gap:`0.5rem`},children:[(0,z.jsx)(`button`,{type:`submit`,className:`semiont-button semiont-button--primary`,style:{flex:1},disabled:a||!c(p),children:e(a?`connecting`:`connect`)}),(0,z.jsx)(`button`,{type:`button`,className:`semiont-button`,onClick:r,children:(0,z.jsx)(k,{style:{width:`1rem`,height:`1rem`}})})]})]})]})}function re({t:e,kb:t,onSubmit:n,onCancel:r,error:i,isSubmitting:a}){let[o,s]=(0,N.useState)(``);return(0,z.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),n(o)},style:{padding:`0.5rem 0.75rem`,display:`flex`,flexDirection:`column`,gap:`0.375rem`},children:[(0,z.jsx)(`div`,{style:{fontSize:`0.75rem`,color:`var(--semiont-color-neutral-400)`},children:t.email}),(0,z.jsx)(`input`,{type:`password`,value:o,onChange:e=>s(e.target.value),placeholder:`Password`,className:`semiont-input`,style:{fontSize:`0.8rem`},autoFocus:!0}),i&&(0,z.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:i}),(0,z.jsxs)(`div`,{style:{display:`flex`,gap:`0.375rem`},children:[(0,z.jsx)(`button`,{type:`submit`,className:`semiont-button semiont-button--primary`,style:{flex:1,fontSize:`0.8rem`},disabled:a,children:e(a?`signingIn`:`signIn`)}),(0,z.jsx)(`button`,{type:`button`,className:`semiont-button`,onClick:r,style:{fontSize:`0.8rem`},children:e(`cancel`)})]})]})}var J=class extends Error{constructor(e,t){super(t),this.reason=e}};async function Y(e,t,n,r,i){let a=`${n}://${e}:${t}`,o=new b(null),s=new m({baseUrl:E(a),token$:o}),c=new d(s,new u(s),s);try{let e=await c.auth.password(r,i),t=e.token,n=e.refreshToken;if(!t)throw Error(`No access token received`);if(!n)throw Error(`No refresh token received`);o.next(w(t));let a;try{a=await c.admin.status()}catch(e){throw new J(`unreachable`,e instanceof Error?e.message:String(e))}if(!a.did)throw new J(`not-reported`,`status reported no did`);return{token:t,refreshToken:n,did:a.did,label:a.projectName??``,...a.gitBranch?{gitBranch:a.gitBranch}:{}}}finally{s.dispose(),o.complete()}}function X(){let e=M(),{t}=n(),r=(e,n)=>t(`KnowledgeBasePanel.${e}`,n),a=i(),o=_(a.kbs$)??[],s=_(a.activeSession$)?.kb??null,c=t=>{e.startsWith(`/know/resource/`)&&a.emit(`nav:push`,{path:`/know`,reason:`kb-switch`}),a.setActiveKb(t)},l=a.addKb.bind(a),u=a.removeKb.bind(a),d=a.updateKb.bind(a),f=(e,t,n)=>{a.signIn(e,t,n)},p=e=>{a.signOut(e)},[m,h]=(0,N.useState)(null),[g,v]=(0,N.useState)(null),[y,b]=(0,N.useState)(null),[x,S]=(0,N.useState)(!1),[C,w]=(0,N.useState)(null),[E,D]=(0,N.useState)(null),[k,A]=(0,N.useState)(!1),[j,P]=(0,N.useState)(null),[,I]=(0,N.useState)(0),{kbs:L}=T(),B=new Map;for(let e of L){let t=G(e.host,e.port),n=B.get(t);n?n.push(e):B.set(t,[e])}let V=e=>{let t=B.get(e);return t?.length===1?t[0]:void 0},H=e=>{if(e.endpoint.kind!==`http`)return;let t=V(G(e.endpoint.host,e.endpoint.port));return t&&t.did===e.did?t:void 0},U=new Set(o.flatMap(e=>e.endpoint.kind===`http`&&H(e)?[G(e.endpoint.host,e.endpoint.port)]:[])),W=L.filter(e=>!U.has(G(e.host,e.port))),X=new Set(o.map(e=>e.did)),Z=e=>X.has(e.did),ie=[...B.entries()].filter(([,e])=>e.length>1).map(([e,t])=>({address:e,count:t.length})),Q=m?.host!==void 0&&m.port!==void 0?G(m.host,m.port):null,ae=Q!==null&&(B.get(Q)?.length??0)>1;(0,N.useEffect)(()=>{o.length===0&&h({})},[o.length]),(0,N.useEffect)(()=>{let e=setInterval(()=>I(e=>e+1),3e4);return()=>clearInterval(e)},[]);let $=(e={})=>{h(e),w(null),b(null),v(null)},oe=e=>e instanceof J?e.reason===`unreachable`?r(`identityCheckFailed`):r(`identityNotReported`):e instanceof Error?e.message:String(e),se=async(e,t,n,i,a)=>{b(null),S(!0);let s=o.find(n=>n.endpoint.kind===`http`&&n.endpoint.host===e&&n.endpoint.port===t);if(s){try{let{token:r,refreshToken:o,gitBranch:c}=await Y(e,t,n,i,a);d(s.id,{...c?{gitBranch:c}:{}}),f(s.id,r,o),h(null)}catch(e){b(oe(e))}finally{S(!1)}return}try{let{token:o,refreshToken:s,did:c,label:u,gitBranch:d}=await Y(e,t,n,i,a),f=m?.expectedDid;f&&f!==c&&v(r(`connectedToOther`,{actual:u||r(`unknownName`),expected:m?.expectedName||r(`unknownName`)})),l({did:c,label:u,email:i,endpoint:{kind:`http`,host:e,port:t,protocol:n},...d?{gitBranch:d}:{}},o,s),h(null)}catch(e){b(oe(e))}finally{S(!1)}},ce=async(e,t)=>{let n=o.find(t=>t.id===e);if(n){if(D(null),A(!0),n.endpoint.kind!==`http`){D(`Re-auth is HTTP-only; KB endpoint kind "${n.endpoint.kind}" is not supported here.`),A(!1);return}try{let{token:r,refreshToken:i,label:a,gitBranch:o}=await Y(n.endpoint.host,n.endpoint.port,n.endpoint.protocol,n.email,t);d(e,{label:a,...o?{gitBranch:o}:{}}),f(e,r,i),w(null)}catch(e){D(e instanceof Error?e.message:String(e))}finally{A(!1)}}},le=e=>{a.getKbSessionStatus(e.id)===`authenticated`?c(e.id):(w(e.id),h(null),D(null))};return(0,z.jsxs)(`div`,{className:`semiont-panel`,children:[(0,z.jsx)(`div`,{className:`semiont-panel-header`,children:(0,z.jsxs)(`h2`,{className:`semiont-panel-header__title`,children:[(0,z.jsx)(`span`,{className:`semiont-panel-header__text`,children:r(`title`)}),(0,z.jsxs)(`span`,{className:`semiont-panel-header__count`,children:[`(`,o.length,`)`]})]})}),(0,z.jsxs)(`div`,{className:`semiont-panel__content`,children:[(0,z.jsx)(`div`,{className:`semiont-panel__list`,children:o.map(e=>{let t=a.getKbSessionStatus(e.id),n=e.id===s?.id,i=C===e.id,o=H(e);return(0,z.jsxs)(`div`,{children:[(0,z.jsxs)(`div`,{className:`semiont-panel-item semiont-panel-item--clickable${n?` semiont-panel-item--selected`:``}`,style:{display:`flex`,flexDirection:`column`,gap:`0.25rem`,cursor:`pointer`,padding:`0.5rem 0.75rem`},onClick:()=>le(e),children:[(0,z.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`0.5rem`},children:[(0,z.jsx)(te,{status:t,t:r}),(0,z.jsx)(`span`,{className:`semiont-panel-text`,style:{flex:1,fontWeight:500},children:e.label||r(`unknownName`)}),o&&(0,z.jsx)(q,{placement:o.placement,t:r}),n&&(0,z.jsx)(ee,{style:{width:`1rem`,height:`1rem`,color:`var(--semiont-color-primary-500)`,flexShrink:0}}),t===`authenticated`&&(0,z.jsx)(`button`,{onClick:t=>{t.stopPropagation(),p(e.id)},title:r(`signOut`),style:{background:`none`,border:`none`,cursor:`pointer`,padding:`0.125rem`,color:`var(--semiont-color-neutral-400)`},children:(0,z.jsx)(F,{style:{width:`0.875rem`,height:`0.875rem`}})}),(0,z.jsx)(`button`,{onClick:t=>{t.stopPropagation(),P(e.id)},title:r(`remove`),style:{background:`none`,border:`none`,cursor:`pointer`,padding:`0.125rem`,color:`var(--semiont-color-neutral-400)`},children:(0,z.jsx)(O,{style:{width:`0.875rem`,height:`0.875rem`}})})]}),(0,z.jsx)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`},children:e.endpoint.kind===`http`?`${e.endpoint.host}:${e.endpoint.port} · ${e.gitBranch??K}`:`local:${e.endpoint.kbId}`}),o&&(0,z.jsx)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`,whiteSpace:`normal`,overflowWrap:`anywhere`},children:o.repo??K})]}),j===e.id&&(0,z.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:[(0,z.jsx)(`span`,{style:{flex:1,color:`var(--semiont-color-neutral-500)`},children:r(`removeConfirm`,{label:e.label})}),(0,z.jsx)(`button`,{onClick:()=>{u(e.id),P(null)},className:`semiont-button`,style:{fontSize:`0.75rem`,padding:`0.2rem 0.5rem`,color:`var(--semiont-color-error-500, #ef4444)`},children:r(`remove`)}),(0,z.jsx)(`button`,{onClick:()=>P(null),className:`semiont-button`,style:{fontSize:`0.75rem`,padding:`0.2rem 0.5rem`},children:r(`cancel`)})]}),i&&(0,z.jsx)(re,{t:r,kb:e,onSubmit:t=>ce(e.id,t),onCancel:()=>w(null),error:E,isSubmitting:k})]},e.id)})}),W.length>0&&(0,z.jsxs)(`div`,{className:`semiont-panel__list`,children:[(0,z.jsx)(`h3`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.05em`,padding:`0.5rem 0.75rem 0.25rem`},children:r(`discoveredTitle`)}),ie.map(({address:e,count:t})=>(0,z.jsxs)(`div`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,padding:`0 0.75rem 0.375rem`,color:`var(--semiont-color-warning-500, #eab308)`,whiteSpace:`normal`},children:[`⚠ `,r(`addressConflict`,{count:t,address:e})]},`conflict-${e}`)),W.map(e=>(0,z.jsxs)(`div`,{className:`semiont-panel-item semiont-panel-item--clickable`,style:{display:`flex`,flexDirection:`column`,gap:`0.25rem`,cursor:`pointer`,padding:`0.5rem 0.75rem`},onClick:()=>$({host:e.host,port:e.port,expectedDid:e.did,...e.siteName===void 0?{}:{expectedName:e.siteName}}),...e.did===void 0?{}:{title:e.did},children:[(0,z.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`0.5rem`},children:[(0,z.jsx)(`span`,{className:`semiont-panel-text`,style:{flex:1,fontWeight:500},children:e.siteName??K}),(0,z.jsx)(q,{placement:e.placement,t:r})]}),(0,z.jsx)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`},children:G(e.host,e.port)}),(0,z.jsx)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`,whiteSpace:`normal`,overflowWrap:`anywhere`},children:e.repo??K}),Z(e)&&(0,z.jsxs)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`,fontStyle:`italic`,whiteSpace:`normal`},children:[`↳ `,r(`anotherCopy`)]})]},`${e.did}@${G(e.host,e.port)}`))]}),g&&(0,z.jsx)(`div`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.75rem`,padding:`0.5rem 0.75rem`,color:`var(--semiont-color-warning-500, #eab308)`,whiteSpace:`normal`},children:g}),m!==null&&(0,z.jsx)(ne,{t:r,...ae&&Q?{title:r(`connectToAddress`,{address:Q})}:{},onSubmit:se,onCancel:()=>h(null),error:y,isSubmitting:x,autoFocus:o.length===0,pulsing:o.length===0,...m.host===void 0?{}:{initialHost:m.host},...m.port===void 0?{}:{initialPort:m.port}},`${m.host??``}:${m.port??``}`)]}),m===null&&(0,z.jsx)(`div`,{className:`semiont-panel-footer`,children:(0,z.jsxs)(`button`,{onClick:()=>$(),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:[(0,z.jsx)(R,{style:{width:`1rem`,height:`1rem`,flexShrink:0}}),(0,z.jsx)(`span`,{className:`semiont-panel-text`,style:{color:`inherit`},children:r(`addKnowledgeBase`)})]})})]})}function Z({activePanel:e,theme:t,children:r}){let{hoverDelayMs:a}=l(),{t:s}=n(),c=_(i().activeSession$),u=!!_(c?.user$),d=j(),f=A(),p=M(),[m,h]=(0,N.useTransition)(),{width:v,setWidth:b,minWidth:w,maxWidth:T}=g(),E=(0,N.useCallback)(({locale:e})=>{p&&h(()=>{f.replace(p,{locale:e})})},[p,f,h]),{setTheme:O}=x(),{toggleLineNumbers:k}=C(),P=(0,N.useCallback)(({theme:e})=>O(e),[O]),F=(0,N.useCallback)(()=>k(),[k]);return o({"settings:locale-changed":E,"settings:theme-changed":P,"settings:line-numbers-toggled":F}),!e||!r&&!y.includes(e)?null:(0,z.jsxs)(`div`,{className:`semiont-toolbar-panels`,style:{width:`${v}px`,position:`relative`},children:[(0,z.jsx)(S,{onResize:b,minWidth:w,maxWidth:T,position:`left`,ariaLabel:`Resize right panel`}),(0,z.jsxs)(`div`,{className:`semiont-toolbar-panels__content`,children:[r,e===`knowledge-base`&&(0,z.jsx)(X,{}),e===`user`&&(u?(0,z.jsx)(V,{}):(0,z.jsxs)(`div`,{className:`semiont-panel`,children:[(0,z.jsx)(`div`,{className:`semiont-panel-header`,children:(0,z.jsx)(`h2`,{className:`semiont-panel-header__title`,children:(0,z.jsx)(`span`,{className:`semiont-panel-header__text`,children:s(`UserPanel.account`)})})}),(0,z.jsx)(`div`,{className:`semiont-panel__content`,style:{padding:`1rem`,textAlign:`center`},children:(0,z.jsx)(`p`,{style:{color:`var(--semiont-color-neutral-400)`,fontSize:`0.85rem`,lineHeight:1.5},children:s(`AccountPanel.notAuthenticated`)})})]})),e===`settings`&&(0,z.jsx)(D,{theme:t,hoverDelayMs:a,locale:d,isPendingLocaleChange:m})]})]})}export{R as n,Z as t};
|
|
2
|
-
//# sourceMappingURL=ToolbarPanels-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./i18n-CywLsdxn.js";import{t as r}from"./vendor-vK2W55bZ.js";import{At as i,B as a,G as o,H as s,It as c,K as l,Lt as u,Nt as d,Pt as f,Q as p,Rt as m,U as h,X as g,Y as _,Z as v,a as y,cn as b,et as x,h as S,kt as C,on as w,q as T,sn as E,w as D}from"./index-Ojc52FmW.js";import{n as O,t as k}from"./XMarkIcon-Dt8lUQLh.js";import{i as A,n as j,r as M}from"./routing-CjmlBUw_.js";var N=e(t());function P({title:e,titleId:t,...n},r){return N.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},n),e?N.createElement(`title`,{id:t},e):null,N.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`}))}var F=N.forwardRef(P);function I({title:e,titleId:t,...n},r){return N.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},n),e?N.createElement(`title`,{id:t},e):null,N.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`m4.5 12.75 6 6 9-13.5`}))}var ee=N.forwardRef(I);function L({title:e,titleId:t,...n},r){return N.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},n),e?N.createElement(`title`,{id:t},e):null,N.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M12 4.5v15m7.5-7.5h-15`}))}var R=N.forwardRef(L),z=r(),B=`data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==`;function V(){let{t:e}=n(),t=(t,n)=>e(`UserPanel.${t}`,n),r=i(),a=_(r.activeSession$),o=_(a?.user$)??null,c=a?.kb??null,l=o?.name??o?.email?.split(`@`)[0]??`User`,u=o?.image??null,d=o?.domain||o?.email?.split(`@`)[1],f=o?.isAdmin??!1,p=o?.isModerator??!1,[m,g]=(0,N.useState)(!1),{timeRemaining:y}=v(),b=s(y)??`Unknown`,x=!u||m?B:h(u)||(console.warn(`Invalid profile image URL detected, using fallback`),B);return(0,z.jsxs)(`div`,{className:`semiont-user-panel`,children:[(0,z.jsx)(`h3`,{className:`semiont-user-panel__title`,children:t(`account`)}),c&&(0,z.jsx)(`div`,{style:{padding:`0 0.75rem 0.5rem`,fontSize:`0.8rem`,color:`var(--semiont-color-neutral-400)`},children:c.label}),(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,z.jsx)(`img`,{src:x,alt:t(`profileAlt`,{name:l||t(`user`)}),width:48,height:48,className:`w-12 h-12 rounded-full object-cover`,onError:()=>g(!0)}),(0,z.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,z.jsx)(`div`,{className:`semiont-panel-text`,children:l||t(`user`)}),d&&(0,z.jsxs)(`div`,{className:`semiont-panel-text-secondary`,children:[`@`,d]})]})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`label`,{className:`semiont-panel-label`,children:t(`session`)}),(0,z.jsx)(`div`,{className:`semiont-session-box`,children:(0,z.jsx)(`div`,{className:`semiont-panel-hint`,children:t(`expiresIn`,{time:b})})})]}),(f||p)&&(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`label`,{className:`semiont-panel-label`,children:t(`privileges`)}),(0,z.jsxs)(`div`,{className:`space-y-1`,children:[f&&(0,z.jsx)(`div`,{className:`semiont-privilege-badge semiont-privilege-badge--admin`,children:(0,z.jsx)(`span`,{className:`semiont-privilege-text`,children:t(`administrator`)})}),p&&(0,z.jsx)(`div`,{className:`semiont-privilege-badge semiont-privilege-badge--moderator`,children:(0,z.jsx)(`span`,{className:`semiont-privilege-text`,children:t(`moderator`)})})]})]}),a&&(0,z.jsx)(H,{session:a,label:t(`signOut`)},a.id)]})]})}function H({session:e,label:t}){let n=i(),r=A(),o=p(e??void 0,a);return(0,z.jsx)(`div`,{className:`semiont-panel-divider`,children:(0,z.jsx)(`button`,{onClick:async()=>{await o?.logout(),e.kb&&await n.signOut(e.kb.id),r.push(`/`)},className:`semiont-signout-button`,children:t})})}var U={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)`},W={authenticated:`statusConnected`,expired:`statusExpired`,"signed-out":`statusSignedOut`,unreachable:`statusUnreachable`},G=(e,t)=>`${e}:${t}`,K=`–`;function q({placement:e,t}){return(0,z.jsx)(`span`,{title:t(`managedBadge`),style:{fontSize:`0.65rem`,padding:`0 0.375rem`,borderRadius:`9999px`,border:`1px solid var(--semiont-color-primary-500, #3b82f6)`,color:`var(--semiont-color-primary-500, #3b82f6)`,flexShrink:0},children:t(e===`local`?`placementLocal`:`placementCodespace`)})}function te({status:e,t}){return(0,z.jsx)(`span`,{title:t(W[e]),style:{width:`0.5rem`,height:`0.5rem`,borderRadius:`50%`,backgroundColor:U[e],flexShrink:0}})}function ne({t:e,title:t,onSubmit:n,onCancel:r,error:i,isSubmitting:a,autoFocus:o,pulsing:s,initialHost:l=`localhost`,initialPort:u=4e3,initialEmail:d=`admin@example.com`}){let[p,m]=(0,N.useState)(l),[h,g]=(0,N.useState)(String(u)),[_,v]=(0,N.useState)(f(l)),[y,b]=(0,N.useState)(d),[x,S]=(0,N.useState)(``),C=e=>{m(e),v(f(e))};return(0,z.jsxs)(`div`,{className:s?`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:[(0,z.jsx)(`h3`,{style:{fontSize:`0.8rem`,fontWeight:600,marginBottom:`0.5rem`},children:t??e(`connectTitle`)}),(0,z.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),c(p)&&n(p,parseInt(h,10)||4e3,_,y,x)},style:{display:`flex`,flexDirection:`column`,gap:`0.5rem`},children:[(0,z.jsxs)(`select`,{value:_,onChange:e=>v(e.target.value),className:`semiont-input`,children:[(0,z.jsx)(`option`,{value:`http`,children:`HTTP`}),(0,z.jsx)(`option`,{value:`https`,children:`HTTPS`})]}),(0,z.jsx)(`input`,{type:`text`,value:p,onChange:e=>C(e.target.value),placeholder:`Host`,className:`semiont-input`,autoFocus:o}),(0,z.jsx)(`input`,{type:`number`,value:h,onChange:e=>g(e.target.value),placeholder:`Port`,className:`semiont-input`}),p&&!c(p)&&(0,z.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:e(`invalidHost`)}),(0,z.jsx)(`input`,{type:`email`,value:y,onChange:e=>b(e.target.value),placeholder:`Email`,className:`semiont-input`}),(0,z.jsx)(`input`,{type:`password`,value:x,onChange:e=>S(e.target.value),placeholder:`Password`,className:`semiont-input`}),i&&(0,z.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:i}),(0,z.jsxs)(`div`,{style:{display:`flex`,gap:`0.5rem`},children:[(0,z.jsx)(`button`,{type:`submit`,className:`semiont-button semiont-button--primary`,style:{flex:1},disabled:a||!c(p),children:e(a?`connecting`:`connect`)}),(0,z.jsx)(`button`,{type:`button`,className:`semiont-button`,onClick:r,children:(0,z.jsx)(k,{style:{width:`1rem`,height:`1rem`}})})]})]})]})}function re({t:e,kb:t,onSubmit:n,onCancel:r,error:i,isSubmitting:a}){let[o,s]=(0,N.useState)(``);return(0,z.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),n(o)},style:{padding:`0.5rem 0.75rem`,display:`flex`,flexDirection:`column`,gap:`0.375rem`},children:[(0,z.jsx)(`div`,{style:{fontSize:`0.75rem`,color:`var(--semiont-color-neutral-400)`},children:t.email}),(0,z.jsx)(`input`,{type:`password`,value:o,onChange:e=>s(e.target.value),placeholder:`Password`,className:`semiont-input`,style:{fontSize:`0.8rem`},autoFocus:!0}),i&&(0,z.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:i}),(0,z.jsxs)(`div`,{style:{display:`flex`,gap:`0.375rem`},children:[(0,z.jsx)(`button`,{type:`submit`,className:`semiont-button semiont-button--primary`,style:{flex:1,fontSize:`0.8rem`},disabled:a,children:e(a?`signingIn`:`signIn`)}),(0,z.jsx)(`button`,{type:`button`,className:`semiont-button`,onClick:r,style:{fontSize:`0.8rem`},children:e(`cancel`)})]})]})}var J=class extends Error{constructor(e,t){super(t),this.reason=e}};async function Y(e,t,n,r,i){let a=`${n}://${e}:${t}`,o=new b(null),s=new m({baseUrl:E(a),token$:o}),c=new d(s,new u(s),s);try{let e=await c.auth.password(r,i),t=e.token,n=e.refreshToken;if(!t)throw Error(`No access token received`);if(!n)throw Error(`No refresh token received`);o.next(w(t));let a;try{a=await c.admin.status()}catch(e){throw new J(`unreachable`,e instanceof Error?e.message:String(e))}if(!a.did)throw new J(`not-reported`,`status reported no did`);return{token:t,refreshToken:n,did:a.did,label:a.projectName??``,...a.gitBranch?{gitBranch:a.gitBranch}:{}}}finally{s.dispose(),o.complete()}}function X(){let e=M(),{t}=n(),r=(e,n)=>t(`KnowledgeBasePanel.${e}`,n),a=i(),o=_(a.kbs$)??[],s=_(a.activeSession$)?.kb??null,c=t=>{e.startsWith(`/know/resource/`)&&a.emit(`nav:push`,{path:`/know`,reason:`kb-switch`}),a.setActiveKb(t)},l=a.addKb.bind(a),u=a.removeKb.bind(a),d=a.updateKb.bind(a),f=(e,t,n)=>{a.signIn(e,t,n)},p=e=>{a.signOut(e)},[m,h]=(0,N.useState)(null),[g,v]=(0,N.useState)(null),[y,b]=(0,N.useState)(null),[x,S]=(0,N.useState)(!1),[C,w]=(0,N.useState)(null),[E,D]=(0,N.useState)(null),[k,A]=(0,N.useState)(!1),[j,P]=(0,N.useState)(null),[,I]=(0,N.useState)(0),{kbs:L}=T(),B=new Map;for(let e of L){let t=G(e.host,e.port),n=B.get(t);n?n.push(e):B.set(t,[e])}let V=e=>{let t=B.get(e);return t?.length===1?t[0]:void 0},H=e=>{if(e.endpoint.kind!==`http`)return;let t=V(G(e.endpoint.host,e.endpoint.port));return t&&t.did===e.did?t:void 0},U=new Set(o.flatMap(e=>e.endpoint.kind===`http`&&H(e)?[G(e.endpoint.host,e.endpoint.port)]:[])),W=L.filter(e=>!U.has(G(e.host,e.port))),X=new Set(o.map(e=>e.did)),Z=e=>X.has(e.did),ie=[...B.entries()].filter(([,e])=>e.length>1).map(([e,t])=>({address:e,count:t.length})),Q=m?.host!==void 0&&m.port!==void 0?G(m.host,m.port):null,ae=Q!==null&&(B.get(Q)?.length??0)>1;(0,N.useEffect)(()=>{o.length===0&&h({})},[o.length]),(0,N.useEffect)(()=>{let e=setInterval(()=>I(e=>e+1),3e4);return()=>clearInterval(e)},[]);let $=(e={})=>{h(e),w(null),b(null),v(null)},oe=e=>e instanceof J?e.reason===`unreachable`?r(`identityCheckFailed`):r(`identityNotReported`):e instanceof Error?e.message:String(e),se=async(e,t,n,i,a)=>{b(null),S(!0);let s=o.find(n=>n.endpoint.kind===`http`&&n.endpoint.host===e&&n.endpoint.port===t);if(s){try{let{token:r,refreshToken:o,gitBranch:c}=await Y(e,t,n,i,a);d(s.id,{...c?{gitBranch:c}:{}}),f(s.id,r,o),h(null)}catch(e){b(oe(e))}finally{S(!1)}return}try{let{token:o,refreshToken:s,did:c,label:u,gitBranch:d}=await Y(e,t,n,i,a),f=m?.expectedDid;f&&f!==c&&v(r(`connectedToOther`,{actual:u||r(`unknownName`),expected:m?.expectedName||r(`unknownName`)})),l({did:c,label:u,email:i,endpoint:{kind:`http`,host:e,port:t,protocol:n},...d?{gitBranch:d}:{}},o,s),h(null)}catch(e){b(oe(e))}finally{S(!1)}},ce=async(e,t)=>{let n=o.find(t=>t.id===e);if(n){if(D(null),A(!0),n.endpoint.kind!==`http`){D(`Re-auth is HTTP-only; KB endpoint kind "${n.endpoint.kind}" is not supported here.`),A(!1);return}try{let{token:r,refreshToken:i,label:a,gitBranch:o}=await Y(n.endpoint.host,n.endpoint.port,n.endpoint.protocol,n.email,t);d(e,{label:a,...o?{gitBranch:o}:{}}),f(e,r,i),w(null)}catch(e){D(e instanceof Error?e.message:String(e))}finally{A(!1)}}},le=e=>{a.getKbSessionStatus(e.id)===`authenticated`?c(e.id):(w(e.id),h(null),D(null))};return(0,z.jsxs)(`div`,{className:`semiont-panel`,children:[(0,z.jsx)(`div`,{className:`semiont-panel-header`,children:(0,z.jsxs)(`h2`,{className:`semiont-panel-header__title`,children:[(0,z.jsx)(`span`,{className:`semiont-panel-header__text`,children:r(`title`)}),(0,z.jsxs)(`span`,{className:`semiont-panel-header__count`,children:[`(`,o.length,`)`]})]})}),(0,z.jsxs)(`div`,{className:`semiont-panel__content`,children:[(0,z.jsx)(`div`,{className:`semiont-panel__list`,children:o.map(e=>{let t=a.getKbSessionStatus(e.id),n=e.id===s?.id,i=C===e.id,o=H(e);return(0,z.jsxs)(`div`,{children:[(0,z.jsxs)(`div`,{className:`semiont-panel-item semiont-panel-item--clickable${n?` semiont-panel-item--selected`:``}`,style:{display:`flex`,flexDirection:`column`,gap:`0.25rem`,cursor:`pointer`,padding:`0.5rem 0.75rem`},onClick:()=>le(e),children:[(0,z.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`0.5rem`},children:[(0,z.jsx)(te,{status:t,t:r}),(0,z.jsx)(`span`,{className:`semiont-panel-text`,style:{flex:1,fontWeight:500},children:e.label||r(`unknownName`)}),o&&(0,z.jsx)(q,{placement:o.placement,t:r}),n&&(0,z.jsx)(ee,{style:{width:`1rem`,height:`1rem`,color:`var(--semiont-color-primary-500)`,flexShrink:0}}),t===`authenticated`&&(0,z.jsx)(`button`,{onClick:t=>{t.stopPropagation(),p(e.id)},title:r(`signOut`),style:{background:`none`,border:`none`,cursor:`pointer`,padding:`0.125rem`,color:`var(--semiont-color-neutral-400)`},children:(0,z.jsx)(F,{style:{width:`0.875rem`,height:`0.875rem`}})}),(0,z.jsx)(`button`,{onClick:t=>{t.stopPropagation(),P(e.id)},title:r(`remove`),style:{background:`none`,border:`none`,cursor:`pointer`,padding:`0.125rem`,color:`var(--semiont-color-neutral-400)`},children:(0,z.jsx)(O,{style:{width:`0.875rem`,height:`0.875rem`}})})]}),(0,z.jsx)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`},children:e.endpoint.kind===`http`?`${e.endpoint.host}:${e.endpoint.port} · ${e.gitBranch??K}`:`local:${e.endpoint.kbId}`}),o&&(0,z.jsx)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`,whiteSpace:`normal`,overflowWrap:`anywhere`},children:o.repo??K})]}),j===e.id&&(0,z.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:[(0,z.jsx)(`span`,{style:{flex:1,color:`var(--semiont-color-neutral-500)`},children:r(`removeConfirm`,{label:e.label})}),(0,z.jsx)(`button`,{onClick:()=>{u(e.id),P(null)},className:`semiont-button`,style:{fontSize:`0.75rem`,padding:`0.2rem 0.5rem`,color:`var(--semiont-color-error-500, #ef4444)`},children:r(`remove`)}),(0,z.jsx)(`button`,{onClick:()=>P(null),className:`semiont-button`,style:{fontSize:`0.75rem`,padding:`0.2rem 0.5rem`},children:r(`cancel`)})]}),i&&(0,z.jsx)(re,{t:r,kb:e,onSubmit:t=>ce(e.id,t),onCancel:()=>w(null),error:E,isSubmitting:k})]},e.id)})}),W.length>0&&(0,z.jsxs)(`div`,{className:`semiont-panel__list`,children:[(0,z.jsx)(`h3`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.05em`,padding:`0.5rem 0.75rem 0.25rem`},children:r(`discoveredTitle`)}),ie.map(({address:e,count:t})=>(0,z.jsxs)(`div`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,padding:`0 0.75rem 0.375rem`,color:`var(--semiont-color-warning-500, #eab308)`,whiteSpace:`normal`},children:[`⚠ `,r(`addressConflict`,{count:t,address:e})]},`conflict-${e}`)),W.map(e=>(0,z.jsxs)(`div`,{className:`semiont-panel-item semiont-panel-item--clickable`,style:{display:`flex`,flexDirection:`column`,gap:`0.25rem`,cursor:`pointer`,padding:`0.5rem 0.75rem`},onClick:()=>$({host:e.host,port:e.port,expectedDid:e.did,...e.siteName===void 0?{}:{expectedName:e.siteName}}),...e.did===void 0?{}:{title:e.did},children:[(0,z.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`0.5rem`},children:[(0,z.jsx)(`span`,{className:`semiont-panel-text`,style:{flex:1,fontWeight:500},children:e.siteName??K}),(0,z.jsx)(q,{placement:e.placement,t:r})]}),(0,z.jsx)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`},children:G(e.host,e.port)}),(0,z.jsx)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`,whiteSpace:`normal`,overflowWrap:`anywhere`},children:e.repo??K}),Z(e)&&(0,z.jsxs)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`,fontStyle:`italic`,whiteSpace:`normal`},children:[`↳ `,r(`anotherCopy`)]})]},`${e.did}@${G(e.host,e.port)}`))]}),g&&(0,z.jsx)(`div`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.75rem`,padding:`0.5rem 0.75rem`,color:`var(--semiont-color-warning-500, #eab308)`,whiteSpace:`normal`},children:g}),m!==null&&(0,z.jsx)(ne,{t:r,...ae&&Q?{title:r(`connectToAddress`,{address:Q})}:{},onSubmit:se,onCancel:()=>h(null),error:y,isSubmitting:x,autoFocus:o.length===0,pulsing:o.length===0,...m.host===void 0?{}:{initialHost:m.host},...m.port===void 0?{}:{initialPort:m.port}},`${m.host??``}:${m.port??``}`)]}),m===null&&(0,z.jsx)(`div`,{className:`semiont-panel-footer`,children:(0,z.jsxs)(`button`,{onClick:()=>$(),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:[(0,z.jsx)(R,{style:{width:`1rem`,height:`1rem`,flexShrink:0}}),(0,z.jsx)(`span`,{className:`semiont-panel-text`,style:{color:`inherit`},children:r(`addKnowledgeBase`)})]})})]})}function Z({activePanel:e,theme:t,children:r}){let{hoverDelayMs:a}=l(),{t:s}=n(),c=_(i().activeSession$),u=!!_(c?.user$),d=j(),f=A(),p=M(),[m,h]=(0,N.useTransition)(),{width:v,setWidth:b,minWidth:w,maxWidth:T}=g(),E=(0,N.useCallback)(({locale:e})=>{p&&h(()=>{f.replace(p,{locale:e})})},[p,f,h]),{setTheme:O}=x(),{toggleLineNumbers:k}=C(),P=(0,N.useCallback)(({theme:e})=>O(e),[O]),F=(0,N.useCallback)(()=>k(),[k]);return o({"settings:locale-changed":E,"settings:theme-changed":P,"settings:line-numbers-toggled":F}),!e||!r&&!y.includes(e)?null:(0,z.jsxs)(`div`,{className:`semiont-toolbar-panels`,style:{width:`${v}px`,position:`relative`},children:[(0,z.jsx)(S,{onResize:b,minWidth:w,maxWidth:T,position:`left`,ariaLabel:`Resize right panel`}),(0,z.jsxs)(`div`,{className:`semiont-toolbar-panels__content`,children:[r,e===`knowledge-base`&&(0,z.jsx)(X,{}),e===`user`&&(u?(0,z.jsx)(V,{}):(0,z.jsxs)(`div`,{className:`semiont-panel`,children:[(0,z.jsx)(`div`,{className:`semiont-panel-header`,children:(0,z.jsx)(`h2`,{className:`semiont-panel-header__title`,children:(0,z.jsx)(`span`,{className:`semiont-panel-header__text`,children:s(`UserPanel.account`)})})}),(0,z.jsx)(`div`,{className:`semiont-panel__content`,style:{padding:`1rem`,textAlign:`center`},children:(0,z.jsx)(`p`,{style:{color:`var(--semiont-color-neutral-400)`,fontSize:`0.85rem`,lineHeight:1.5},children:s(`AccountPanel.notAuthenticated`)})})]})),e===`settings`&&(0,z.jsx)(D,{theme:t,hoverDelayMs:a,locale:d,isPendingLocaleChange:m})]})]})}export{R as n,Z as t};
|
|
2
|
+
//# sourceMappingURL=ToolbarPanels-DMK1LAo0.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarPanels-CbF3qEos.js","names":["ForwardRef","ForwardRef"],"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 { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n sanitizeImageURL,\n useSessionExpiry,\n formatTime,\n useSemiont,\n useObservable,\n createSessionStateUnit,\n useSessionStateUnit,\n} from '@semiont/react-ui';\nimport type { SemiontSession } from '@semiont/sdk';\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 semiont = useSemiont();\n const session = useObservable(semiont.activeSession$);\n const user = useObservable(session?.user$) ?? null;\n const activeKnowledgeBase = session?.kb ?? null;\n const displayName = user?.name ?? user?.email?.split('@')[0] ?? 'User';\n const avatarUrl = user?.image ?? null;\n const userDomain = user?.domain || user?.email?.split('@')[1];\n const isAdmin = user?.isAdmin ?? false;\n const isModerator = user?.isModerator ?? false;\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 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 — only meaningful with a live session to sign out OF.\n Keyed on the session so the state unit is rebuilt against the\n replacement rather than holding the client it captured at mount. */}\n {session && (\n <SignOutButton\n key={session.id}\n session={session}\n label={t('signOut')}\n />\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Owns the session state unit, so it is only ever constructed where a session\n * is guaranteed. `UserPanel` itself renders inside `ToolbarPanels`, which the\n * unauthenticated knowledge layout also mounts — there, `activeSession$` is\n * null and `createSessionStateUnit(session?.client)` would capture `undefined`\n * and blow up on click.\n * See .plans/bugs/resource-page-frozen-on-disposed-client-after-kb-switch.md\n */\nfunction SignOutButton({ session, label }: { session: SemiontSession; label: string }) {\n const semiont = useSemiont();\n const router = useRouter();\n const sessionStateUnit = useSessionStateUnit(session ?? undefined, createSessionStateUnit);\n\n const handleSignOut = async () => {\n await sessionStateUnit?.logout();\n if (session.kb) {\n await semiont.signOut(session.kb.id);\n }\n router.push('/');\n };\n\n return (\n <div className=\"semiont-panel-divider\">\n <button onClick={handleSignOut} className=\"semiont-signout-button\">\n {label}\n </button>\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CheckIcon, PlusIcon, ArrowRightStartOnRectangleIcon, XMarkIcon, TrashIcon } from '@heroicons/react/24/outline';\nimport { BehaviorSubject } from 'rxjs';\nimport { SemiontClient, defaultProtocol, isValidHostname, type KnowledgeBase, type KbSessionStatus } from '@semiont/sdk';\nimport { usePathname } from '@/i18n/routing';\nimport { HttpContentTransport, HttpTransport } from '@semiont/http-transport';\nimport { accessToken, baseUrl, type AccessToken } from '@semiont/core';\nimport type { DiscoveredKB } from '@semiont/core';\nimport {\n useSemiont,\n useObservable,\n useKBDiscovery,\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\nconst endpointKey = (host: string, port: number) => `${host}:${port}`;\n\n/**\n * Fixed-shape rendering: a field that should be present but isn't renders\n * this placeholder — a visible gap, never a semantic fallback to some other\n * field.\n */\nconst MISSING = '–';\n\n/** Placement badge — also the managed marker on an adopted registered row. */\nfunction PlacementBadge({ placement, t }: { placement: DiscoveredKB['placement']; t: T }) {\n return (\n <span\n title={t('managedBadge')}\n style={{\n fontSize: '0.65rem',\n padding: '0 0.375rem',\n borderRadius: '9999px',\n border: '1px solid var(--semiont-color-primary-500, #3b82f6)',\n color: 'var(--semiont-color-primary-500, #3b82f6)',\n flexShrink: 0,\n }}\n >\n {t(placement === 'local' ? 'placementLocal' : 'placementCodespace')}\n </span>\n );\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, title, onSubmit, onCancel, error, isSubmitting, autoFocus, pulsing, initialHost = 'localhost', initialPort = 4000, initialEmail = 'admin@example.com' }: {\n t: T;\n /** Overrides the generic heading — used to announce a contested ADDRESS (D). */\n title?: string;\n onSubmit: (host: string, port: number, protocol: 'http' | 'https', 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 [protocol, setProtocol] = useState<'http' | 'https'>(defaultProtocol(initialHost));\n const [email, setEmail] = useState(initialEmail);\n const [password, setPassword] = useState('');\n\n const handleHostChange = (newHost: string) => {\n setHost(newHost);\n setProtocol(defaultProtocol(newHost));\n };\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' }}>{title ?? t('connectTitle')}</h3>\n <form onSubmit={(e) => { e.preventDefault(); if (isValidHostname(host)) onSubmit(host, parseInt(port, 10) || 4000, protocol, email, password); }} style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n <select value={protocol} onChange={e => setProtocol(e.target.value as 'http' | 'https')} className=\"semiont-input\">\n <option value=\"http\">HTTP</option>\n <option value=\"https\">HTTPS</option>\n </select>\n <input type=\"text\" value={host} onChange={e => handleHostChange(e.target.value)} placeholder=\"Host\" className=\"semiont-input\" autoFocus={autoFocus} />\n <input type=\"number\" value={port} onChange={e => setPort(e.target.value)} placeholder=\"Port\" className=\"semiont-input\" />\n {host && !isValidHostname(host) && (\n <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{t('invalidHost')}</div>\n )}\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 || !isValidHostname(host)}>\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\n/**\n * Thrown when authentication succeeds but the KB's identity cannot be\n * established. A registered KB REQUIRES a did (KB-IDENTITY-VS-ADDRESS\n * decision 8), and there is nothing legitimate to fall back to: inventing one\n * from the address is the exact category error that document exists to end.\n * Decision 7's third verification outcome, made explicit.\n *\n * The two reasons are kept apart deliberately: collapsing them into one\n * message made a live auth bug undiagnosable from the UI (2026-07-28).\n */\nclass IdentityUnverifiableError extends Error {\n constructor(readonly reason: 'unreachable' | 'not-reported', detail: string) {\n super(detail);\n }\n}\n\nasync function authenticateWithGateway(host: string, port: number, protocol: 'http' | 'https', emailStr: string, password: string): Promise<{ token: string; refreshToken: string; did: string; label: string; gitBranch?: string }> {\n const origin = `${protocol}://${host}:${port}`;\n // `/api/status` REQUIRES authentication, so the transport needs a token\n // source: without one the identity check goes out unauthenticated and 401s\n // on every connect (found live 2026-07-28 — previously swallowed, which is\n // why labels silently fell back to `host:port`). Same pattern the session\n // factory's `performValidate` uses.\n const token$ = new BehaviorSubject<AccessToken | null>(null);\n const transport = new HttpTransport({ baseUrl: baseUrl(origin), token$ });\n const client = new SemiontClient(transport, new HttpContentTransport(transport), transport);\n\n // The cleanup wraps EVERY exit, not just the status call. The transport\n // subscribes to token$ the moment it is constructed, so a throw before the\n // status check — a rejected password, a response missing either token —\n // leaked it. Scoping the finally to the narrow try covered the one failure\n // that happened to be on screen and none of the earlier ones.\n try {\n const authResult = await client.auth!.password(emailStr, password);\n const token = authResult.token;\n const refreshToken = authResult.refreshToken;\n if (!token) throw new Error('No access token received');\n if (!refreshToken) throw new Error('No refresh token received');\n // Every later call on this client is now authenticated.\n token$.next(accessToken(token));\n\n // The KB names itself: identity is read from the KB we actually reached,\n // never inferred from the discovered row the user happened to click.\n let status;\n try {\n status = await client.admin!.status();\n } catch (e) {\n throw new IdentityUnverifiableError('unreachable', e instanceof Error ? e.message : String(e));\n }\n if (!status.did) throw new IdentityUnverifiableError('not-reported', 'status reported no did');\n\n return {\n token,\n refreshToken,\n did: status.did,\n // Absence is stored as absence — the WORD \"Unknown\" is a render concern\n // (decision 7), and `host:port` is an address, never a name.\n label: status.projectName ?? '',\n ...(status.gitBranch ? { gitBranch: status.gitBranch } : {}),\n };\n } finally {\n transport.dispose();\n token$.complete();\n }\n}\n\nexport function KnowledgeBasePanel() {\n const pathname = usePathname();\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`KnowledgeBasePanel.${k}`, p as any) as string;\n const semiont = useSemiont();\n const knowledgeBases = useObservable(semiont.kbs$) ?? [];\n const activeKnowledgeBase = useObservable(semiont.activeSession$)?.kb ?? null;\n const setActiveKnowledgeBase = (id: string) => {\n // Leave a resource route BEFORE switching. The URL carries the CURRENT\n // KB's resource id, which identifies nothing in the KB we're moving to —\n // loading it there earns a 404 and the B14/B15 retry-then-fail chain, and\n // a \"Try Again\" that can never succeed.\n //\n // This has to happen here, at the initiator. The resource page cannot\n // infer it after the fact: `KnowledgeLayout` gates `<Outlet />` on a live\n // session, so the page is unmounted the moment `activeSession$` goes null\n // and remounts fresh against the new KB — from its own point of view no\n // switch ever happened.\n // See .plans/bugs/resource-page-frozen-on-disposed-client-after-kb-switch.md\n if (pathname.startsWith('/know/resource/')) {\n semiont.emit('nav:push', { path: '/know', reason: 'kb-switch' });\n }\n void semiont.setActiveKb(id);\n };\n const addKnowledgeBase = semiont.addKb.bind(semiont);\n const removeKnowledgeBase = semiont.removeKb.bind(semiont);\n const updateKnowledgeBase = semiont.updateKb.bind(semiont);\n const signIn = (id: string, access: string, refresh: string) => { void semiont.signIn(id, access, refresh); };\n const signOut = (id: string) => { void semiont.signOut(id); };\n // null = closed; {} = blank form; {host, port} = prefilled from a discovered\n // row. `expected*` records WHAT THE USER BELIEVED they were connecting to, so\n // the outcome can be verified against the KB that actually answers (C).\n const [addForm, setAddForm] = useState<\n { host?: string; port?: number; expectedDid?: string; expectedName?: string } | null\n >(null);\n // Transient result of that verification — the form has closed by then.\n const [connectNotice, setConnectNotice] = useState<string | null>(null);\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 // Launcher discovery (BROWSER-KB-DISCOVERY P5). The document is launcher\n // BELIEF — health stays this panel's own probe. Collision policy: a\n // discovered KB matching a registered endpoint is ADOPTED render-only (one\n // row, managed badge, registry untouched — fully reversible); removal is\n // projection-only (discovered rows vanish, adopted rows lose the badge).\n const { kbs: discoveredKbs } = useKBDiscovery();\n // The join (KB-IDENTITY-VS-ADDRESS decision 9): **look up by address, verify\n // by did.** The address is what is unique within a document (P1), so it\n // SELECTS; the did then confirms the copy we reached is the KB we meant. A\n // did can match several entries — one KB running in two places is normal and\n // expected — so it can never be the selector. Grouping survives from P0\n // because an older document can still contain duplicate addresses.\n const discoveredByEndpoint = new Map<string, DiscoveredKB[]>();\n for (const d of discoveredKbs) {\n const key = endpointKey(d.host, d.port);\n const bucket = discoveredByEndpoint.get(key);\n if (bucket) bucket.push(d);\n else discoveredByEndpoint.set(key, [d]);\n }\n const unambiguousAt = (key: string): DiscoveredKB | undefined => {\n const bucket = discoveredByEndpoint.get(key);\n return bucket?.length === 1 ? bucket[0] : undefined;\n };\n const managedFor = (kb: KnowledgeBase): DiscoveredKB | undefined => {\n if (kb.endpoint.kind !== 'http') return undefined;\n const entry = unambiguousAt(endpointKey(kb.endpoint.host, kb.endpoint.port));\n // Verification: an entry at my address that is a DIFFERENT knowledge base\n // is not mine to adopt — it is someone else standing where I connected.\n // (A registered KB whose address matches nothing is simply unmanaged; the\n // spelling-mismatch miss is accepted deliberately — see the plan.)\n return entry && entry.did === kb.did ? entry : undefined;\n };\n // Only an ADOPTED endpoint drops out of the discovered list; ambiguous ones\n // keep every claimant visible so the stale record is surfaced, not swallowed.\n const adoptedEndpoints = new Set(\n knowledgeBases.flatMap(kb =>\n kb.endpoint.kind === 'http' && managedFor(kb)\n ? [endpointKey(kb.endpoint.host, kb.endpoint.port)]\n : []),\n );\n const unregisteredDiscovered = discoveredKbs.filter(d => !adoptedEndpoints.has(endpointKey(d.host, d.port)));\n // One KB in two places is normal (decision 9), so a discovered row can carry\n // the same name as a KB you are already connected to. Say why, rather than\n // leaving it looking like a duplicate — the identity is what relates them.\n const registeredDids = new Set(knowledgeBases.map(kb => kb.did));\n const isAnotherCopy = (d: DiscoveredKB): boolean => registeredDids.has(d.did);\n // A duplicated ADDRESS is a conflict: only one process binds a port, so at\n // most one claimant's promise is true (decision 4, narrowed by 9 — a shared\n // DID is not a conflict). Producers no longer emit these; old documents can.\n const conflictedAddresses = [...discoveredByEndpoint.entries()]\n .filter(([, bucket]) => bucket.length > 1)\n .map(([address, bucket]) => ({ address, count: bucket.length }));\n // (D) A click was always an address; when the address is contested, the form\n // says so instead of carrying a KB name that is at most half true.\n const addFormAddress = addForm?.host !== undefined && addForm.port !== undefined\n ? endpointKey(addForm.host, addForm.port)\n : null;\n const addFormContested = addFormAddress !== null\n && (discoveredByEndpoint.get(addFormAddress)?.length ?? 0) > 1;\n\n useEffect(() => {\n if (knowledgeBases.length === 0) setAddForm({});\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 = (prefill: { host?: string; port?: number; expectedDid?: string; expectedName?: string } = {}) => {\n setAddForm(prefill);\n setReauthKbId(null);\n setAddError(null);\n setConnectNotice(null);\n };\n\n // An unreachable identity check and a KB that reports no identity are\n // different problems with different fixes; one message for both hid a live\n // auth bug for a whole release.\n const identityAwareMessage = (err: unknown): string => {\n if (err instanceof IdentityUnverifiableError) {\n return err.reason === 'unreachable' ? t('identityCheckFailed') : t('identityNotReported');\n }\n return err instanceof Error ? err.message : String(err);\n };\n\n const handleAdd = async (host: string, port: number, protocol: 'http' | 'https', email: string, password: string) => {\n setAddError(null);\n setAddSubmitting(true);\n const existing = knowledgeBases.find(\n kb => kb.endpoint.kind === 'http' && kb.endpoint.host === host && kb.endpoint.port === port,\n );\n if (existing) {\n try {\n const { token, refreshToken, gitBranch } = await authenticateWithGateway(host, port, protocol, email, password);\n updateKnowledgeBase(existing.id, { ...(gitBranch ? { gitBranch } : {}) });\n signIn(existing.id, token, refreshToken);\n setAddForm(null);\n } catch (err) {\n setAddError(identityAwareMessage(err));\n } finally {\n setAddSubmitting(false);\n }\n return;\n }\n try {\n const { token, refreshToken, did, label, gitBranch } = await authenticateWithGateway(host, port, protocol, email, password);\n // (C) Verify the outcome against what the user believed they clicked.\n // Reports; never blocks — the KB that answered is the one they reached.\n const expectedDid = addForm?.expectedDid;\n if (expectedDid && expectedDid !== did) {\n setConnectNotice(t('connectedToOther', {\n actual: label || t('unknownName'),\n expected: addForm?.expectedName || t('unknownName'),\n }));\n }\n addKnowledgeBase(\n {\n did,\n label,\n email,\n endpoint: { kind: 'http', host, port, protocol },\n ...(gitBranch ? { gitBranch } : {}),\n },\n token,\n refreshToken,\n );\n setAddForm(null);\n } catch (err) {\n setAddError(identityAwareMessage(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 if (kb.endpoint.kind !== 'http') {\n setReauthError(`Re-auth is HTTP-only; KB endpoint kind \"${kb.endpoint.kind}\" is not supported here.`);\n setReauthSubmitting(false);\n return;\n }\n try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithGateway(\n kb.endpoint.host, kb.endpoint.port, kb.endpoint.protocol, kb.email, password,\n );\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 = semiont.getKbSessionStatus(kb.id);\n if (status === 'authenticated') {\n setActiveKnowledgeBase(kb.id);\n } else {\n setReauthKbId(kb.id);\n setAddForm(null);\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 = semiont.getKbSessionStatus(kb.id);\n const isActive = kb.id === activeKnowledgeBase?.id;\n const isReauthing = reauthKbId === kb.id;\n const managed = managedFor(kb);\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 {/* Decision 7: an unnamed KB reads \"Unknown\" — a state, not a\n blank — while the address stays on the address line below. */}\n <span className=\"semiont-panel-text\" style={{ flex: 1, fontWeight: 500 }}>{kb.label || t('unknownName')}</span>\n {managed && <PlacementBadge placement={managed.placement} t={t} />}\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.endpoint.kind === 'http'\n ? `${kb.endpoint.host}:${kb.endpoint.port} · ${kb.gitBranch ?? MISSING}`\n : `local:${kb.endpoint.kbId}`}\n </span>\n {managed && (\n // The repo gets its own line — vertical space over width;\n // wrap instead of the class's nowrap-ellipsis.\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem', whiteSpace: 'normal', overflowWrap: 'anywhere' }}>\n {managed.repo ?? MISSING}\n </span>\n )}\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 {unregisteredDiscovered.length > 0 && (\n <div className=\"semiont-panel__list\">\n <h3 className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', fontWeight: 600, textTransform: 'uppercase', letterSpacing: '0.05em', padding: '0.5rem 0.75rem 0.25rem' }}>\n {t('discoveredTitle')}\n </h3>\n {conflictedAddresses.map(({ address, count }) => (\n <div\n key={`conflict-${address}`}\n className=\"semiont-panel-text-secondary\"\n style={{ fontSize: '0.7rem', padding: '0 0.75rem 0.375rem', color: 'var(--semiont-color-warning-500, #eab308)', whiteSpace: 'normal' }}\n >\n ⚠ {t('addressConflict', { count, address })}\n </div>\n ))}\n {unregisteredDiscovered.map((d) => (\n <div\n /* Key on the PAIR. Decision 9's table spells out why neither\n half works alone: a did repeats across copies of one KB, an\n address repeats across contested claimants — and this list\n deliberately renders both. Only did+address is unique. */\n key={`${d.did}@${endpointKey(d.host, d.port)}`}\n className=\"semiont-panel-item semiont-panel-item--clickable\"\n style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem', cursor: 'pointer', padding: '0.5rem 0.75rem' }}\n onClick={() => openAddForm({\n host: d.host,\n port: d.port,\n // Record the belief so the outcome can be verified (C) —\n // recording it is not the same as promising it (D).\n expectedDid: d.did,\n ...(d.siteName !== undefined ? { expectedName: d.siteName } : {}),\n })}\n {...(d.did !== undefined ? { title: d.did } : {})}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <span className=\"semiont-panel-text\" style={{ flex: 1, fontWeight: 500 }}>{d.siteName ?? MISSING}</span>\n <PlacementBadge placement={d.placement} t={t} />\n </div>\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem' }}>\n {endpointKey(d.host, d.port)}\n </span>\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem', whiteSpace: 'normal', overflowWrap: 'anywhere' }}>\n {d.repo ?? MISSING}\n </span>\n {isAnotherCopy(d) && (\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem', fontStyle: 'italic', whiteSpace: 'normal' }}>\n ↳ {t('anotherCopy')}\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n\n {connectNotice && (\n <div\n className=\"semiont-panel-text-secondary\"\n style={{ fontSize: '0.75rem', padding: '0.5rem 0.75rem', color: 'var(--semiont-color-warning-500, #eab308)', whiteSpace: 'normal' }}\n >\n {connectNotice}\n </div>\n )}\n\n {addForm !== null && (\n <LoginForm\n key={`${addForm.host ?? ''}:${addForm.port ?? ''}`}\n t={t}\n {...(addFormContested && addFormAddress\n ? { title: t('connectToAddress', { address: addFormAddress }) }\n : {})}\n onSubmit={handleAdd}\n onCancel={() => setAddForm(null)}\n error={addError}\n isSubmitting={addSubmitting}\n autoFocus={knowledgeBases.length === 0}\n pulsing={knowledgeBases.length === 0}\n {...(addForm.host !== undefined ? { initialHost: addForm.host } : {})}\n {...(addForm.port !== undefined ? { initialPort: addForm.port } : {})}\n />\n )}\n </div>\n\n {addForm === null && (\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 useSemiont,\n useObservable,\n useHoverDelay,\n useTheme,\n useLineNumbers,\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 /** 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 * />\n *\n * @example\n * // Document context with custom panels\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\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 children\n}: ToolbarPanelsProps) {\n // Source hover-delay from the shared hook so every page that mounts\n // ToolbarPanels gets the live value without prop-drilling. Previously\n // each page passed `hoverDelayMs` through as a prop; pages that forgot\n // (Discover, Admin, Moderation) rendered the Settings panel with\n // `undefined`, which surfaced as `{undefined}ms delay` after the\n // translation interpolation ran.\n const { hoverDelayMs } = useHoverDelay();\n const { t: _t } = useTranslation();\n const session = useObservable(useSemiont().activeSession$);\n const user = useObservable(session?.user$);\n const isAuthenticated = !!user;\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 // APPLYING the settings this panel emits is this component's job, exactly\n // like locale above. It used to be a per-route subscription — eleven\n // copies — and the signed-out knowledge layout never got one, so Theme and\n // Line Numbers were visibly dead when signed out while Language (handled\n // here) worked. Living here makes \"the panel is mounted\" and \"the panel\n // works\" the same condition; the route copies are deleted, not added to.\n // See .plans/bugs/settings-theme-and-line-numbers-inert-when-signed-out.md\n const { setTheme } = useTheme();\n const { toggleLineNumbers } = useLineNumbers();\n const handleThemeChanged = useCallback(\n ({ theme: newTheme }: { theme: 'light' | 'dark' | 'system' }) => setTheme(newTheme),\n [setTheme],\n );\n const handleLineNumbersToggled = useCallback(() => toggleLineNumbers(), [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:locale-changed': handleLocaleChanged,\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\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 theme={theme}\n hoverDelayMs={hoverDelayMs}\n locale={locale}\n isPendingLocaleChange={isPending}\n />\n )}\n </div>\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ToolbarPanels-DMK1LAo0.js","names":["ForwardRef","ForwardRef"],"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 { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n sanitizeImageURL,\n useSessionExpiry,\n formatTime,\n useSemiont,\n useObservable,\n createSessionStateUnit,\n useSessionStateUnit,\n} from '@semiont/react-ui';\nimport type { SemiontSession } from '@semiont/sdk';\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 semiont = useSemiont();\n const session = useObservable(semiont.activeSession$);\n const user = useObservable(session?.user$) ?? null;\n const activeKnowledgeBase = session?.kb ?? null;\n const displayName = user?.name ?? user?.email?.split('@')[0] ?? 'User';\n const avatarUrl = user?.image ?? null;\n const userDomain = user?.domain || user?.email?.split('@')[1];\n const isAdmin = user?.isAdmin ?? false;\n const isModerator = user?.isModerator ?? false;\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 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 — only meaningful with a live session to sign out OF.\n Keyed on the session so the state unit is rebuilt against the\n replacement rather than holding the client it captured at mount. */}\n {session && (\n <SignOutButton\n key={session.id}\n session={session}\n label={t('signOut')}\n />\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Owns the session state unit, so it is only ever constructed where a session\n * is guaranteed. `UserPanel` itself renders inside `ToolbarPanels`, which the\n * unauthenticated knowledge layout also mounts — there, `activeSession$` is\n * null and `createSessionStateUnit(session?.client)` would capture `undefined`\n * and blow up on click.\n * See .plans/bugs/resource-page-frozen-on-disposed-client-after-kb-switch.md\n */\nfunction SignOutButton({ session, label }: { session: SemiontSession; label: string }) {\n const semiont = useSemiont();\n const router = useRouter();\n const sessionStateUnit = useSessionStateUnit(session ?? undefined, createSessionStateUnit);\n\n const handleSignOut = async () => {\n await sessionStateUnit?.logout();\n if (session.kb) {\n await semiont.signOut(session.kb.id);\n }\n router.push('/');\n };\n\n return (\n <div className=\"semiont-panel-divider\">\n <button onClick={handleSignOut} className=\"semiont-signout-button\">\n {label}\n </button>\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CheckIcon, PlusIcon, ArrowRightStartOnRectangleIcon, XMarkIcon, TrashIcon } from '@heroicons/react/24/outline';\nimport { BehaviorSubject } from 'rxjs';\nimport { SemiontClient, defaultProtocol, isValidHostname, type KnowledgeBase, type KbSessionStatus } from '@semiont/sdk';\nimport { usePathname } from '@/i18n/routing';\nimport { HttpContentTransport, HttpTransport } from '@semiont/http-transport';\nimport { accessToken, baseUrl, type AccessToken } from '@semiont/core';\nimport type { DiscoveredKB } from '@semiont/core';\nimport {\n useSemiont,\n useObservable,\n useKBDiscovery,\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\nconst endpointKey = (host: string, port: number) => `${host}:${port}`;\n\n/**\n * Fixed-shape rendering: a field that should be present but isn't renders\n * this placeholder — a visible gap, never a semantic fallback to some other\n * field.\n */\nconst MISSING = '–';\n\n/** Placement badge — also the managed marker on an adopted registered row. */\nfunction PlacementBadge({ placement, t }: { placement: DiscoveredKB['placement']; t: T }) {\n return (\n <span\n title={t('managedBadge')}\n style={{\n fontSize: '0.65rem',\n padding: '0 0.375rem',\n borderRadius: '9999px',\n border: '1px solid var(--semiont-color-primary-500, #3b82f6)',\n color: 'var(--semiont-color-primary-500, #3b82f6)',\n flexShrink: 0,\n }}\n >\n {t(placement === 'local' ? 'placementLocal' : 'placementCodespace')}\n </span>\n );\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, title, onSubmit, onCancel, error, isSubmitting, autoFocus, pulsing, initialHost = 'localhost', initialPort = 4000, initialEmail = 'admin@example.com' }: {\n t: T;\n /** Overrides the generic heading — used to announce a contested ADDRESS (D). */\n title?: string;\n onSubmit: (host: string, port: number, protocol: 'http' | 'https', 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 [protocol, setProtocol] = useState<'http' | 'https'>(defaultProtocol(initialHost));\n const [email, setEmail] = useState(initialEmail);\n const [password, setPassword] = useState('');\n\n const handleHostChange = (newHost: string) => {\n setHost(newHost);\n setProtocol(defaultProtocol(newHost));\n };\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' }}>{title ?? t('connectTitle')}</h3>\n <form onSubmit={(e) => { e.preventDefault(); if (isValidHostname(host)) onSubmit(host, parseInt(port, 10) || 4000, protocol, email, password); }} style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n <select value={protocol} onChange={e => setProtocol(e.target.value as 'http' | 'https')} className=\"semiont-input\">\n <option value=\"http\">HTTP</option>\n <option value=\"https\">HTTPS</option>\n </select>\n <input type=\"text\" value={host} onChange={e => handleHostChange(e.target.value)} placeholder=\"Host\" className=\"semiont-input\" autoFocus={autoFocus} />\n <input type=\"number\" value={port} onChange={e => setPort(e.target.value)} placeholder=\"Port\" className=\"semiont-input\" />\n {host && !isValidHostname(host) && (\n <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{t('invalidHost')}</div>\n )}\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 || !isValidHostname(host)}>\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\n/**\n * Thrown when authentication succeeds but the KB's identity cannot be\n * established. A registered KB REQUIRES a did (KB-IDENTITY-VS-ADDRESS\n * decision 8), and there is nothing legitimate to fall back to: inventing one\n * from the address is the exact category error that document exists to end.\n * Decision 7's third verification outcome, made explicit.\n *\n * The two reasons are kept apart deliberately: collapsing them into one\n * message made a live auth bug undiagnosable from the UI (2026-07-28).\n */\nclass IdentityUnverifiableError extends Error {\n constructor(readonly reason: 'unreachable' | 'not-reported', detail: string) {\n super(detail);\n }\n}\n\nasync function authenticateWithGateway(host: string, port: number, protocol: 'http' | 'https', emailStr: string, password: string): Promise<{ token: string; refreshToken: string; did: string; label: string; gitBranch?: string }> {\n const origin = `${protocol}://${host}:${port}`;\n // `/api/status` REQUIRES authentication, so the transport needs a token\n // source: without one the identity check goes out unauthenticated and 401s\n // on every connect (found live 2026-07-28 — previously swallowed, which is\n // why labels silently fell back to `host:port`). Same pattern the session\n // factory's `performValidate` uses.\n const token$ = new BehaviorSubject<AccessToken | null>(null);\n const transport = new HttpTransport({ baseUrl: baseUrl(origin), token$ });\n const client = new SemiontClient(transport, new HttpContentTransport(transport), transport);\n\n // The cleanup wraps EVERY exit, not just the status call. The transport\n // subscribes to token$ the moment it is constructed, so a throw before the\n // status check — a rejected password, a response missing either token —\n // leaked it. Scoping the finally to the narrow try covered the one failure\n // that happened to be on screen and none of the earlier ones.\n try {\n const authResult = await client.auth!.password(emailStr, password);\n const token = authResult.token;\n const refreshToken = authResult.refreshToken;\n if (!token) throw new Error('No access token received');\n if (!refreshToken) throw new Error('No refresh token received');\n // Every later call on this client is now authenticated.\n token$.next(accessToken(token));\n\n // The KB names itself: identity is read from the KB we actually reached,\n // never inferred from the discovered row the user happened to click.\n let status;\n try {\n status = await client.admin!.status();\n } catch (e) {\n throw new IdentityUnverifiableError('unreachable', e instanceof Error ? e.message : String(e));\n }\n if (!status.did) throw new IdentityUnverifiableError('not-reported', 'status reported no did');\n\n return {\n token,\n refreshToken,\n did: status.did,\n // Absence is stored as absence — the WORD \"Unknown\" is a render concern\n // (decision 7), and `host:port` is an address, never a name.\n label: status.projectName ?? '',\n ...(status.gitBranch ? { gitBranch: status.gitBranch } : {}),\n };\n } finally {\n transport.dispose();\n token$.complete();\n }\n}\n\nexport function KnowledgeBasePanel() {\n const pathname = usePathname();\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`KnowledgeBasePanel.${k}`, p as any) as string;\n const semiont = useSemiont();\n const knowledgeBases = useObservable(semiont.kbs$) ?? [];\n const activeKnowledgeBase = useObservable(semiont.activeSession$)?.kb ?? null;\n const setActiveKnowledgeBase = (id: string) => {\n // Leave a resource route BEFORE switching. The URL carries the CURRENT\n // KB's resource id, which identifies nothing in the KB we're moving to —\n // loading it there earns a 404 and the B14/B15 retry-then-fail chain, and\n // a \"Try Again\" that can never succeed.\n //\n // This has to happen here, at the initiator. The resource page cannot\n // infer it after the fact: `KnowledgeLayout` gates `<Outlet />` on a live\n // session, so the page is unmounted the moment `activeSession$` goes null\n // and remounts fresh against the new KB — from its own point of view no\n // switch ever happened.\n // See .plans/bugs/resource-page-frozen-on-disposed-client-after-kb-switch.md\n if (pathname.startsWith('/know/resource/')) {\n semiont.emit('nav:push', { path: '/know', reason: 'kb-switch' });\n }\n void semiont.setActiveKb(id);\n };\n const addKnowledgeBase = semiont.addKb.bind(semiont);\n const removeKnowledgeBase = semiont.removeKb.bind(semiont);\n const updateKnowledgeBase = semiont.updateKb.bind(semiont);\n const signIn = (id: string, access: string, refresh: string) => { void semiont.signIn(id, access, refresh); };\n const signOut = (id: string) => { void semiont.signOut(id); };\n // null = closed; {} = blank form; {host, port} = prefilled from a discovered\n // row. `expected*` records WHAT THE USER BELIEVED they were connecting to, so\n // the outcome can be verified against the KB that actually answers (C).\n const [addForm, setAddForm] = useState<\n { host?: string; port?: number; expectedDid?: string; expectedName?: string } | null\n >(null);\n // Transient result of that verification — the form has closed by then.\n const [connectNotice, setConnectNotice] = useState<string | null>(null);\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 // Launcher discovery (BROWSER-KB-DISCOVERY P5). The document is launcher\n // BELIEF — health stays this panel's own probe. Collision policy: a\n // discovered KB matching a registered endpoint is ADOPTED render-only (one\n // row, managed badge, registry untouched — fully reversible); removal is\n // projection-only (discovered rows vanish, adopted rows lose the badge).\n const { kbs: discoveredKbs } = useKBDiscovery();\n // The join (KB-IDENTITY-VS-ADDRESS decision 9): **look up by address, verify\n // by did.** The address is what is unique within a document (P1), so it\n // SELECTS; the did then confirms the copy we reached is the KB we meant. A\n // did can match several entries — one KB running in two places is normal and\n // expected — so it can never be the selector. Grouping survives from P0\n // because an older document can still contain duplicate addresses.\n const discoveredByEndpoint = new Map<string, DiscoveredKB[]>();\n for (const d of discoveredKbs) {\n const key = endpointKey(d.host, d.port);\n const bucket = discoveredByEndpoint.get(key);\n if (bucket) bucket.push(d);\n else discoveredByEndpoint.set(key, [d]);\n }\n const unambiguousAt = (key: string): DiscoveredKB | undefined => {\n const bucket = discoveredByEndpoint.get(key);\n return bucket?.length === 1 ? bucket[0] : undefined;\n };\n const managedFor = (kb: KnowledgeBase): DiscoveredKB | undefined => {\n if (kb.endpoint.kind !== 'http') return undefined;\n const entry = unambiguousAt(endpointKey(kb.endpoint.host, kb.endpoint.port));\n // Verification: an entry at my address that is a DIFFERENT knowledge base\n // is not mine to adopt — it is someone else standing where I connected.\n // (A registered KB whose address matches nothing is simply unmanaged; the\n // spelling-mismatch miss is accepted deliberately — see the plan.)\n return entry && entry.did === kb.did ? entry : undefined;\n };\n // Only an ADOPTED endpoint drops out of the discovered list; ambiguous ones\n // keep every claimant visible so the stale record is surfaced, not swallowed.\n const adoptedEndpoints = new Set(\n knowledgeBases.flatMap(kb =>\n kb.endpoint.kind === 'http' && managedFor(kb)\n ? [endpointKey(kb.endpoint.host, kb.endpoint.port)]\n : []),\n );\n const unregisteredDiscovered = discoveredKbs.filter(d => !adoptedEndpoints.has(endpointKey(d.host, d.port)));\n // One KB in two places is normal (decision 9), so a discovered row can carry\n // the same name as a KB you are already connected to. Say why, rather than\n // leaving it looking like a duplicate — the identity is what relates them.\n const registeredDids = new Set(knowledgeBases.map(kb => kb.did));\n const isAnotherCopy = (d: DiscoveredKB): boolean => registeredDids.has(d.did);\n // A duplicated ADDRESS is a conflict: only one process binds a port, so at\n // most one claimant's promise is true (decision 4, narrowed by 9 — a shared\n // DID is not a conflict). Producers no longer emit these; old documents can.\n const conflictedAddresses = [...discoveredByEndpoint.entries()]\n .filter(([, bucket]) => bucket.length > 1)\n .map(([address, bucket]) => ({ address, count: bucket.length }));\n // (D) A click was always an address; when the address is contested, the form\n // says so instead of carrying a KB name that is at most half true.\n const addFormAddress = addForm?.host !== undefined && addForm.port !== undefined\n ? endpointKey(addForm.host, addForm.port)\n : null;\n const addFormContested = addFormAddress !== null\n && (discoveredByEndpoint.get(addFormAddress)?.length ?? 0) > 1;\n\n useEffect(() => {\n if (knowledgeBases.length === 0) setAddForm({});\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 = (prefill: { host?: string; port?: number; expectedDid?: string; expectedName?: string } = {}) => {\n setAddForm(prefill);\n setReauthKbId(null);\n setAddError(null);\n setConnectNotice(null);\n };\n\n // An unreachable identity check and a KB that reports no identity are\n // different problems with different fixes; one message for both hid a live\n // auth bug for a whole release.\n const identityAwareMessage = (err: unknown): string => {\n if (err instanceof IdentityUnverifiableError) {\n return err.reason === 'unreachable' ? t('identityCheckFailed') : t('identityNotReported');\n }\n return err instanceof Error ? err.message : String(err);\n };\n\n const handleAdd = async (host: string, port: number, protocol: 'http' | 'https', email: string, password: string) => {\n setAddError(null);\n setAddSubmitting(true);\n const existing = knowledgeBases.find(\n kb => kb.endpoint.kind === 'http' && kb.endpoint.host === host && kb.endpoint.port === port,\n );\n if (existing) {\n try {\n const { token, refreshToken, gitBranch } = await authenticateWithGateway(host, port, protocol, email, password);\n updateKnowledgeBase(existing.id, { ...(gitBranch ? { gitBranch } : {}) });\n signIn(existing.id, token, refreshToken);\n setAddForm(null);\n } catch (err) {\n setAddError(identityAwareMessage(err));\n } finally {\n setAddSubmitting(false);\n }\n return;\n }\n try {\n const { token, refreshToken, did, label, gitBranch } = await authenticateWithGateway(host, port, protocol, email, password);\n // (C) Verify the outcome against what the user believed they clicked.\n // Reports; never blocks — the KB that answered is the one they reached.\n const expectedDid = addForm?.expectedDid;\n if (expectedDid && expectedDid !== did) {\n setConnectNotice(t('connectedToOther', {\n actual: label || t('unknownName'),\n expected: addForm?.expectedName || t('unknownName'),\n }));\n }\n addKnowledgeBase(\n {\n did,\n label,\n email,\n endpoint: { kind: 'http', host, port, protocol },\n ...(gitBranch ? { gitBranch } : {}),\n },\n token,\n refreshToken,\n );\n setAddForm(null);\n } catch (err) {\n setAddError(identityAwareMessage(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 if (kb.endpoint.kind !== 'http') {\n setReauthError(`Re-auth is HTTP-only; KB endpoint kind \"${kb.endpoint.kind}\" is not supported here.`);\n setReauthSubmitting(false);\n return;\n }\n try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithGateway(\n kb.endpoint.host, kb.endpoint.port, kb.endpoint.protocol, kb.email, password,\n );\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 = semiont.getKbSessionStatus(kb.id);\n if (status === 'authenticated') {\n setActiveKnowledgeBase(kb.id);\n } else {\n setReauthKbId(kb.id);\n setAddForm(null);\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 = semiont.getKbSessionStatus(kb.id);\n const isActive = kb.id === activeKnowledgeBase?.id;\n const isReauthing = reauthKbId === kb.id;\n const managed = managedFor(kb);\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 {/* Decision 7: an unnamed KB reads \"Unknown\" — a state, not a\n blank — while the address stays on the address line below. */}\n <span className=\"semiont-panel-text\" style={{ flex: 1, fontWeight: 500 }}>{kb.label || t('unknownName')}</span>\n {managed && <PlacementBadge placement={managed.placement} t={t} />}\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.endpoint.kind === 'http'\n ? `${kb.endpoint.host}:${kb.endpoint.port} · ${kb.gitBranch ?? MISSING}`\n : `local:${kb.endpoint.kbId}`}\n </span>\n {managed && (\n // The repo gets its own line — vertical space over width;\n // wrap instead of the class's nowrap-ellipsis.\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem', whiteSpace: 'normal', overflowWrap: 'anywhere' }}>\n {managed.repo ?? MISSING}\n </span>\n )}\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 {unregisteredDiscovered.length > 0 && (\n <div className=\"semiont-panel__list\">\n <h3 className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', fontWeight: 600, textTransform: 'uppercase', letterSpacing: '0.05em', padding: '0.5rem 0.75rem 0.25rem' }}>\n {t('discoveredTitle')}\n </h3>\n {conflictedAddresses.map(({ address, count }) => (\n <div\n key={`conflict-${address}`}\n className=\"semiont-panel-text-secondary\"\n style={{ fontSize: '0.7rem', padding: '0 0.75rem 0.375rem', color: 'var(--semiont-color-warning-500, #eab308)', whiteSpace: 'normal' }}\n >\n ⚠ {t('addressConflict', { count, address })}\n </div>\n ))}\n {unregisteredDiscovered.map((d) => (\n <div\n /* Key on the PAIR. Decision 9's table spells out why neither\n half works alone: a did repeats across copies of one KB, an\n address repeats across contested claimants — and this list\n deliberately renders both. Only did+address is unique. */\n key={`${d.did}@${endpointKey(d.host, d.port)}`}\n className=\"semiont-panel-item semiont-panel-item--clickable\"\n style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem', cursor: 'pointer', padding: '0.5rem 0.75rem' }}\n onClick={() => openAddForm({\n host: d.host,\n port: d.port,\n // Record the belief so the outcome can be verified (C) —\n // recording it is not the same as promising it (D).\n expectedDid: d.did,\n ...(d.siteName !== undefined ? { expectedName: d.siteName } : {}),\n })}\n {...(d.did !== undefined ? { title: d.did } : {})}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <span className=\"semiont-panel-text\" style={{ flex: 1, fontWeight: 500 }}>{d.siteName ?? MISSING}</span>\n <PlacementBadge placement={d.placement} t={t} />\n </div>\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem' }}>\n {endpointKey(d.host, d.port)}\n </span>\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem', whiteSpace: 'normal', overflowWrap: 'anywhere' }}>\n {d.repo ?? MISSING}\n </span>\n {isAnotherCopy(d) && (\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem', fontStyle: 'italic', whiteSpace: 'normal' }}>\n ↳ {t('anotherCopy')}\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n\n {connectNotice && (\n <div\n className=\"semiont-panel-text-secondary\"\n style={{ fontSize: '0.75rem', padding: '0.5rem 0.75rem', color: 'var(--semiont-color-warning-500, #eab308)', whiteSpace: 'normal' }}\n >\n {connectNotice}\n </div>\n )}\n\n {addForm !== null && (\n <LoginForm\n key={`${addForm.host ?? ''}:${addForm.port ?? ''}`}\n t={t}\n {...(addFormContested && addFormAddress\n ? { title: t('connectToAddress', { address: addFormAddress }) }\n : {})}\n onSubmit={handleAdd}\n onCancel={() => setAddForm(null)}\n error={addError}\n isSubmitting={addSubmitting}\n autoFocus={knowledgeBases.length === 0}\n pulsing={knowledgeBases.length === 0}\n {...(addForm.host !== undefined ? { initialHost: addForm.host } : {})}\n {...(addForm.port !== undefined ? { initialPort: addForm.port } : {})}\n />\n )}\n </div>\n\n {addForm === null && (\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 useSemiont,\n useObservable,\n useHoverDelay,\n useTheme,\n useLineNumbers,\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 /** 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 * />\n *\n * @example\n * // Document context with custom panels\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\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 children\n}: ToolbarPanelsProps) {\n // Source hover-delay from the shared hook so every page that mounts\n // ToolbarPanels gets the live value without prop-drilling. Previously\n // each page passed `hoverDelayMs` through as a prop; pages that forgot\n // (Discover, Admin, Moderation) rendered the Settings panel with\n // `undefined`, which surfaced as `{undefined}ms delay` after the\n // translation interpolation ran.\n const { hoverDelayMs } = useHoverDelay();\n const { t: _t } = useTranslation();\n const session = useObservable(useSemiont().activeSession$);\n const user = useObservable(session?.user$);\n const isAuthenticated = !!user;\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 // APPLYING the settings this panel emits is this component's job, exactly\n // like locale above. It used to be a per-route subscription — eleven\n // copies — and the signed-out knowledge layout never got one, so Theme and\n // Line Numbers were visibly dead when signed out while Language (handled\n // here) worked. Living here makes \"the panel is mounted\" and \"the panel\n // works\" the same condition; the route copies are deleted, not added to.\n // See .plans/bugs/settings-theme-and-line-numbers-inert-when-signed-out.md\n const { setTheme } = useTheme();\n const { toggleLineNumbers } = useLineNumbers();\n const handleThemeChanged = useCallback(\n ({ theme: newTheme }: { theme: 'light' | 'dark' | 'system' }) => setTheme(newTheme),\n [setTheme],\n );\n const handleLineNumbersToggled = useCallback(() => toggleLineNumbers(), [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:locale-changed': handleLocaleChanged,\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\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 theme={theme}\n hoverDelayMs={hoverDelayMs}\n locale={locale}\n isPendingLocaleChange={isPending}\n />\n )}\n </div>\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e={close:`إغلاق`,codeLoading:`جارٍ التحميل…`,codeAnalyzing:`جارٍ التوسيم…`,codeAnalyzingTags:`توسيم الوسوم…`,codeDetectingEntities:`جارٍ التوسيم…`,codeCreatingAnnotations:`إنشاء {{count}} تعليقات توضيحية…`,codeCreatingTagAnnotations:`إنشاء {{count}} وسوم…`,codeCompleteCreated:`تم إنشاء {{count}} {{kind}}`,codeGeneratingResource:`جارٍ التوليد…`,codeCreatingResource:`إنشاء المورد…`,codeCompleteGenerated:`تم إنشاء المورد`,codeCompleteGeneratedTruncated:`تم إنشاء المورد — اقتُطع عند حد الطول`,kindHighlight:`تظليلات`,kindComment:`تعليقات`,kindAssessment:`تقييمات`,kindReference:`مراجع`,kindTag:`وسوم`,subject:`{{kind}}: {{label}}`,subjectWithPosition:`{{kind}}: {{label}} ({{done}} من {{total}})`,paramEntityTypes:`أنواع الكيانات`,paramInstructions:`التعليمات`,paramTone:`النبرة`,paramDensity:`الكثافة`,subjectKindEntityType:`نوع الكيان`,subjectKindCategory:`فئة`,cancel:`إلغاء`,inProgress:`جارٍ التوضيح...`},t={loadFailed:`فشل تحميل ملف PDF`,loading:`جارٍ تحميل PDF...`,next:`التالي`,pageLoadFailed:`فشل تحميل الصفحة`,pageOf:`صفحة {{page}} من {{total}}`,pagination:`ترقيم الصفحات`,previous:`السابق`,viewerLoading:`جارٍ تحميل عارض PDF...`},n={annotations:`التعليقات التوضيحية`,history:`السجل`,resourceInfo:`معلومات المورد`,collaboration:`التعاون`,userAccount:`حساب المستخدم`,settings:`الإعدادات`,knowledgeBase:`قاعدة المعرفة`},r={title:`معلومات المورد`,locale:`اللغة المحلية`,notSpecified:`غير محدد`,entityTypeTags:`علامات نوع الكيان`,representation:`التمثيل`,mediaType:`نوع الوسائط`,byteSize:`الحجم`,storageUri:`التخزين`,clone:`استنساخ`,cloneDescription:`إنشاء رابط استنساخ قابل للمشاركة لهذا المورد`,generate:`توليد`,generateDescription:`إنشاء مورد جديد من سياق هذا المورد`,archive:`أرشفة`,archiveDescription:`نقل هذا المورد إلى حالة الأرشيف`,unarchive:`إلغاء الأرشفة`,unarchiveDescription:`استعادة هذا المورد إلى الحالة النشطة`,provenance:`المصدر والسلسلة`,createdAt:`تاريخ الإنشاء`,modifiedAt:`تاريخ التعديل`,attributedTo:`منسوب إلى`,derivedFrom:`مشتق من`},i={title:`التعاون`,connectionStatus:`حالة الاتصال`,live:`مباشر`,disconnected:`غير متصل`,events:`{{count}} أحداث`,lastSync:`آخر مزامنة:`,noActivity:`لا يوجد نشاط بعد`,justNow:`الآن`,secondsAgo:`منذ {{count}} ثوانٍ`,minuteAgo:`منذ دقيقة واحدة`,minutesAgo:`منذ {{count}} دقائق`,hourAgo:`منذ ساعة واحدة`,hoursAgo:`منذ {{count}} ساعات`,realtimeActive:`التحديثات في الوقت الفعلي نشطة`,reconnecting:`جارٍ إعادة الاتصال بالخادم...`,sharing:`المشاركة`,collaborationComingSoon:`ميزات التعاون قادمة قريبًا`,collaborators:`المتعاونون`,ceilings:`{{contextTokens}} إدخال / {{maxOutputTokens}} إخراج`,sharedWindow:`نافذة {{contextTokens}}`},a={history:`السجل`,loading:`جارٍ التحميل...`,user:`المستخدم`,viewOriginal:`عرض الأصل`,viewAnnotation:`عرض التعليق التوضيحي: {{content}}`,resourceCreated:`تم إنشاء المورد`,resourceCloned:`تم الاستنساخ`,resourceArchived:`تمت الأرشفة`,resourceUnarchived:`تم إلغاء الأرشفة`,highlightAdded:`تمت إضافة تمييز`,highlightRemoved:`تمت إزالة التمييز`,referenceCreated:`تم إنشاء مرجع`,referenceResolved:`تم حل المرجع`,referenceDeleted:`تم حذف المرجع`,entitytagAdded:`تمت إضافة علامة`,entitytagRemoved:`تمت إزالة العلامة`,assessmentAdded:`تمت إضافة تقييم`,assessmentRemoved:`تمت إزالة التقييم`,annotationAdded:`تمت إضافة تعليق توضيحي`,annotationRemoved:`تمت إزالة التعليق التوضيحي`,annotationBodyUpdated:`تم تحديث التعليق التوضيحي`,jobEvent:`حدث مهمة`,embeddingComputed:`تم حساب التضمين`,justNow:`الآن`,minutesAgo:`منذ {{count}}د`,hoursAgo:`منذ {{count}}س`,daysAgo:`منذ {{count}}ي`,failed:`تعذّر تحميل السجل.`,retry:`إعادة المحاولة`},o={title:`التعليقات`,noComments:`لا توجد تعليقات بعد. حدد نصًا وانقر على تعليق لإضافة واحد.`,commentPlaceholder:`اكتب تعليقك هنا...`,save:`حفظ`,cancel:`إلغاء`,edit:`تعديل`,annotateComments:`توضيح التعليقات`,instructions:`التعليمات`,optional:`(اختياري)`,instructionsPlaceholder:`مثال: التركيز على المصطلحات التقنية...`,annotate:`توضيح`,annotating:`جارٍ التوضيح...`,toneLabel:`النبرة`,toneOptional:`(اختياري)`,toneScholarly:`أكاديمي`,toneExplanatory:`توضيحي`,toneConversational:`حواري`,toneTechnical:`تقني`,densityLabel:`الكثافة`,densitySparse:`متفرق`,densityDense:`كثيف`,fragmentSelected:`تم تحديد جزء`,imageRegionSelected:`تم تحديد منطقة من الصورة`,complete:`اكتمل التوضيح!`,failed:`فشل التوضيح`,densityPerWords:`{{density}} لكل 2000 كلمة`},s={title:`التمييزات`,noHighlights:`لا توجد تمييزات بعد. استخدم التوضيح بالذكاء الاصطناعي للعثور على الفقرات المهمة.`,annotateHighlights:`توضيح التمييزات`,instructions:`التعليمات`,optional:`(اختياري)`,instructionsPlaceholder:`مثال: التركيز على المفاهيم التقنية الرئيسية...`,annotate:`توضيح`,annotating:`جارٍ التوضيح...`,cancel:`إلغاء`,densityLabel:`الكثافة`,densitySparse:`متفرق`,densityDense:`كثيف`,complete:`اكتمل التوضيح!`,failed:`فشل التوضيح`,densityPerWords:`{{density}} لكل 2000 كلمة`},c={title:`التقييمات`,noAssessments:`لا توجد تقييمات بعد. استخدم التوضيح بالذكاء الاصطناعي لتقييم الفقرات.`,assessmentPlaceholder:`اكتب تقييمك هنا...`,save:`حفظ`,cancel:`إلغاء`,annotateAssessments:`توضيح التقييمات`,instructions:`التعليمات`,optional:`(اختياري)`,instructionsPlaceholder:`مثال: تقييم الادعاءات من حيث الدقة والأدلة...`,annotate:`توضيح`,annotating:`جارٍ التوضيح...`,toneLabel:`النبرة`,toneOptional:`(اختياري)`,toneAnalytical:`تحليلي`,toneCritical:`نقدي`,toneBalanced:`متوازن`,toneConstructive:`بنّاء`,densityLabel:`الكثافة`,densitySparse:`متفرق`,densityDense:`كثيف`,fragmentSelected:`تم تحديد جزء`,imageRegionSelected:`تم تحديد منطقة من الصورة`,complete:`اكتمل التوضيح!`,failed:`فشل التوضيح`,densityPerWords:`{{density}} لكل 2000 كلمة`},l={title:`العلامات`,noTags:`لا توجد علامات بعد. استخدم التوضيح بالذكاء الاصطناعي لتحديد الأدوار الهيكلية.`,noSchemas:"لا توجد مخططات وسوم مسجلة لقاعدة المعارف هذه. يجب على مسؤول قاعدة المعارف تسجيل مخطط تحليل هيكلي واحد على الأقل (مثلاً عبر مهارة `register-tag-schemas`) قبل استخدام الوسم.",annotateTags:`توضيح العلامات`,selectSchema:`اختيار الإطار`,selectCategories:`اختيار الفئات`,annotate:`توضيح`,annotating:`جارٍ التوضيح...`,cancel:`إلغاء`,selectAll:`تحديد الكل`,deselectAll:`إلغاء تحديد الكل`,categoriesSelected:`{count, plural, =0 {لم يتم تحديد فئات} =1 {فئة واحدة محددة} other {# فئات محددة}}`,createTagForSelection:`إنشاء علامة للتحديد`,selectCategory:`اختيار الفئة`,chooseCategory:`اختر فئة...`,fragmentSelected:`تم تحديد جزء`,imageRegionSelected:`تم تحديد منطقة من الصورة`,complete:`اكتمل التوضيح!`,failed:`فشل التوضيح`},u={title:`التعليقات التوضيحية`,statistics:`الإحصائيات`,highlight:`التمييزات`,reference:`المراجع`,assessment:`التقييمات`,comment:`التعليقات`,tag:`العلامات`,annotationsFailed:`تعذّر تحميل التعليقات التوضيحية.`,retry:`إعادة المحاولة`},d={title:`الإحصائيات`,highlights:`التمييزات`,comments:`التعليقات`,assessments:`التقييمات`,tags:`العلامات`,references:`المراجع`,stub:`مبدئي`,resolved:`محلول`,entityTypes:`أنواع الكيانات`},f={title:`المراجع`,noReferences:`لا توجد مراجع بعد. حدد نصًا لإنشاء مراجع لموارد أخرى.`,outgoingReferences:`المراجع الصادرة`,incomingReferences:`المراجع الواردة`,noIncomingReferences:`لا توجد مراجع واردة`,stub:`مرجع مبدئي (غير مربوط)`,resolved:`مرجع محلول (مربوط)`,derived:`مشتق`,open:`فتح`,unlink:`إلغاء الربط`,resolve:`حل المرجع`,cancel:`إلغاء`,createReference:`إنشاء مرجع`,entityTypesOptional:`أنواع الكيانات (اختياري)`,fragmentSelected:`تم تحديد جزء`,annotateReferences:`توضيح المراجع`,selectEntityTypes:`أنواع الكيانات:`,select:`تحديد`,deselect:`إلغاء التحديد`,noEntityTypes:`لا توجد أنواع كيانات متاحة`,typesSelected:`{count, plural, =1 {نوع واحد محدد} other {# أنواع محددة}}`,annotate:`توضيح`,annotating:`جارٍ التوضيح...`,includeDescriptiveReferences:`تضمين المراجع الوصفية`,descriptiveReferencesTooltip:`البحث أيضًا عن عبارات مثل 'الرئيس التنفيذي'، 'عملاق التكنولوجيا'، 'الفيزيائي' (بالإضافة إلى الأسماء)`,found:`تم العثور على {{count}}`,complete:`اكتمل التوضيح!`,failed:`فشل التوضيح`,current:`الحالي: {{entityType}}`,loading:`جارٍ التحميل...`,loadingEllipsis:`جارٍ التحميل...`,untitledResource:`مورد بدون عنوان`,noText:`لا يوجد نص`,incomingReferencesFailed:`تعذّر تحميل المراجع الواردة.`,retry:`إعادة المحاولة`,entityTypesFailed:`تعذّر تحميل أنواع الكيانات.`,tally:`{{found}} من ~{{expected}} كيانًا`},p={title:`اختصارات لوحة المفاتيح`,closeDialog:`إغلاق مربع الحوار`,or:`أو`,navigationTitle:`التنقل`,navOpenSearch:`فتح البحث الشامل`,navOpenSearchAlt:`فتح البحث الشامل (بديل)`,navCreateResource:`إنشاء مورد جديد`,navCloseOverlays:`إغلاق جميع الطبقات العلوية (ضغط مزدوج)`,navShowHelp:`عرض مساعدة اختصارات لوحة المفاتيح`,sidebarTitle:`الشريط الجانبي للمعرفة`,sidebarCollapse:`طي الشريط الجانبي`,sidebarExpand:`توسيع الشريط الجانبي`,sidebarPickup:`التقاط علامة تبويب المورد (عند التركيز)`,sidebarMove:`نقل علامة تبويب المورد (أثناء السحب)`,sidebarDrop:`إفلات علامة تبويب المورد (أثناء السحب)`,sidebarCancel:`إلغاء عملية السحب`,annotationsTitle:`تعليقات المورد التوضيحية`,annotHighlight:`إنشاء تمييز من التعليق التوضيحي (مباشر)`,annotReference:`فتح نافذة المرجع المنبثقة للتعليق التوضيحي`,annotDelete:`حذف التعليق التوضيحي المركّز عليه`,annotNavigate:`التنقل عبر التعليقات التوضيحية`,annotNavigateBack:`التنقل عبر التعليقات التوضيحية للخلف`,listsTitle:`القوائم والشبكات`,listsFilterNav:`التنقل بين مرشحات أنواع الكيانات`,listsGridNav:`التنقل في شبكة الموارد`,listsJumpFirst:`الانتقال إلى العنصر الأول`,listsJumpLast:`الانتقال إلى العنصر الأخير`,searchModalTitle:`في نافذة البحث`,searchNav:`التنقل في نتائج البحث`,searchSelect:`اختيار النتيجة`,searchClose:`إغلاق البحث`,modalTitle:`عناصر التحكم في النوافذ المنبثقة`,modalClose:`إغلاق النافذة المنبثقة النشطة`,modalNavForward:`التنقل للأمام عبر الأزرار`,modalNavBackward:`التنقل للخلف عبر الأزرار`,modalActivate:`تفعيل الزر المركّز عليه`,accessibilityTitle:`إمكانية الوصول`,a11ySkipLinks:`الانتقال إلى روابط التخطي (عند بداية الصفحة)`,a11yFollowLink:`اتباع رابط التخطي`,macNote:`استخدام اختصارات لوحة مفاتيح Mac. ⌘ هو مفتاح Command.`,windowsNote:`استخدام اختصارات لوحة مفاتيح Windows/Linux. Ctrl هو مفتاح التحكم.`,footerHint:`اضغط {{key}} في أي وقت لعرض هذه المساعدة`,close:`إغلاق`},m={modeGroup:`الوضع`,browse:`تصفح`,annotate:`توضيح`,selectionGroup:`الدافع`,clickGroup:`النقر`,shapeGroup:`الشكل`,none:`لا شيء`,linking:`مرجع`,highlighting:`تمييز`,assessing:`تقييم`,commenting:`تعليق`,tagging:`علامة`,detail:`تفصيل`,follow:`متابعة`,deleting:`حذف`,jsonld:`JSON-LD`,rectangle:`مستطيل`,circle:`دائرة`,polygon:`مضلع`},h={title:`التنقل`,collapseSidebar:`طي الشريط الجانبي`,expandSidebar:`توسيع الشريط الجانبي`,dragToReorder:`اسحب لإعادة الترتيب`,dragToReorderDoc:`اسحب لإعادة ترتيب {{name}}`,closeResource:`إغلاق المورد`,dragInstructions:`لإعادة ترتيب الموارد: استخدم Tab للانتقال إلى مورد. اضغط Alt+سهم لأعلى للتحريك لأعلى أو Alt+سهم لأسفل للتحريك لأسفل. للسحب والإفلات: اضغط على شريط المسافة لالتقاط العنصر. استخدم مفاتيح الأسهم لتحريكه. اضغط على شريط المسافة مرة أخرى للإفلات.`},g={deleteConfirmationTitle:`حذف التعليق التوضيحي`,deleteConfirmationMessage:`هل أنت متأكد أنك تريد حذف هذا التعليق التوضيحي؟ لا يمكن التراجع عن هذا الإجراء.`,deleteConfirmationCancel:`إلغاء`,deleteConfirmationDelete:`حذف`},_={title:`الإعدادات`,lineNumbers:`أرقام الأسطر`,lineNumbersVisible:`مرئية`,lineNumbersHidden:`مخفية`,theme:`السمة`,themeLight:`فاتح`,themeDark:`داكن`,themeSystem:`النظام`,themeSystemActive:`النظام ({{mode}})`,themeModeActive:`استخدام وضع {{mode}}`,language:`اللغة`,languageHint:`تغيير اللغة في شريط التنقل الرئيسي`,languageChanging:`جارٍ تغيير اللغة...`,hoverDelay:`تأخير التمرير`,hoverDelayFast:`سريع`,hoverDelaySlow:`بطيء`,hoverDelayDescription:`تأخير {{delay}} ميلي ثانية قبل ظهور تأثيرات التمرير`},v={},y={gatherIntro:`اختر ما تريد تضمينه في السياق المُجمَّع.`,includeContent:`تضمين محتوى المورد`,includeSummary:`تضمين الملخص`,gatherDepth:`العمق`,gatherMaxResources:`الحد الأقصى للموارد`,gatherButton:`جمع`,editGather:`تغيير إعدادات الجمع`,recallLabel:`مضمَّن في الاسترجاع — ألغِ التحديد للاستبعاد`,loadingContext:`جارٍ جمع السياق...`,failedContext:`فشل في جمع السياق`,sourceContextLabel:`المورد`,connectionsLabel:`الاتصالات`,citedByLabel:`مُستشهد به من قِبل`,resourceTitle:`عنوان المورد الجديد`,resourceTitlePlaceholder:`عنوان المورد المُولَّد...`,additionalInstructions:`تعليمات إضافية`,additionalInstructionsPlaceholder:`إرشادات اختيارية للتوليد...`,language:`اللغة`,languageHelp:`لغة المورد المُولَّد`,creativity:`الإبداع`,creativityFocused:`مركّز`,creativityCreative:`إبداعي`,maxLength:`الحد الأقصى للطول`,maxLengthHelp:`العدد الأقصى من الرموز`,generate:`توليد`,maxLengthCeiling:`محدود بـ {{maxOutputTokens}} رمزًا بواسطة {{model}}.`,outputFormat:`الصيغة`,formatExtensionMismatch:`يجب أن ينتهي موقع الحفظ بـ {{extension}} ليطابق الصيغة المحددة.`,graphPaneTitle:`الجوار`,graphEmpty:`لا روابط بعد.`,resourceLinkLabel:`رابط مورد`,corpusPaneTitle:`مقاطع مشابهة`,corpusEmpty:`لم يُعثر على مقاطع مشابهة.`,excludedReceipt:`استُبعد {{types}} من هذا الاسترجاع`,machineRead:`OCR`,score:`درجة`,saveLocation:`موقع الحفظ`,discardDraftPrompt:`هل تريد تجاهل هذه المسودة؟`,discardDraft:`تجاهل`,keepEditing:`متابعة التحرير`,title:`إنشاء من هذا المورد`},b={sourceContextLabel:`سياق التعليق التوضيحي في المورد`,connectionsLabel:`التعليقات التوضيحية للأقران`,citedByLabel:`المورد مُستشهد به من قِبل`,userHintLabel:`تلميح`,userHintPlaceholder:`صف ما يشير إليه هذا التعليق التوضيحي...`,loadingContext:`جارٍ جمع السياق...`,failedContext:`فشل في جمع السياق`,generate:`توليد`,compose:`تأليف`,resolutionStrategyLabel:`استراتيجية الحل`,back:`رجوع`,link:`رابط`,score:`درجة`,noResults:`لم يتم العثور على نتائج`,resourceTitle:`عنوان المورد`,resourceTitlePlaceholder:`أدخل عنوان المورد...`,additionalInstructions:`تعليمات إضافية`,additionalInstructionsPlaceholder:`أدخل تعليمات إضافية...`,language:`اللغة`,languageHelp:`لغة المحتوى المُولَّد`,creativity:`الإبداع`,creativityFocused:`مركّز`,creativityCreative:`إبداعي`,maxLength:`الحد الأقصى للطول`,maxLengthHelp:`العدد الأقصى من الرموز`,maxResults:`الحد الأقصى للنتائج`,semanticScoring:`التقييم الدلالي`,semanticScoringHelp:`استخدام الذكاء الاصطناعي لتقييم النتائج حسب الصلة الدلالية`,searching:`جاري البحث...`,searchFailed:`فشل البحث`,search:`بحث`,maxLengthCeiling:`محدود بـ {{maxOutputTokens}} رمزًا بواسطة {{model}}.`,outputFormat:`الصيغة`,formatExtensionMismatch:`يجب أن ينتهي موقع الحفظ بـ {{extension}} ليطابق الصيغة المحددة.`,graphPaneTitle:`الجوار`,graphEmpty:`لا روابط بعد — حلّ هذه الإشارة ينشئ أول رابط.`,resourceLinkLabel:`رابط مورد`,corpusPaneTitle:`مقاطع مشابهة`,corpusEmpty:`لم يُعثر على مقاطع مشابهة — من غير المرجح أن يُجدي البحث.`,excludedReceipt:`استُبعد {{types}} من هذا الاسترجاع`,machineRead:`OCR`,userHintEffect:`يوجّه البحث والتوليد`,saveLocation:`موقع الحفظ`,entityTypes:`أنواع الكيانات`,contentLabel:`المحتوى`,createAndLink:`إنشاء وربط`,creatingAndLinking:`جارٍ الإنشاء والربط…`,discardDraftPrompt:`هل تريد تجاهل هذه المسودة؟`,discardDraft:`تجاهل`,keepEditing:`متابعة التحرير`,resolveTitle:`حل المرجع`},x={createFailed:`تعذّر إنشاء التعليق التوضيحي: {{detail}}`,deleteFailed:`تعذّر حذف التعليق التوضيحي: {{detail}}`,referenceUpdateFailed:`تعذّر تحديث المرجع: {{detail}}`,unknownError:`خطأ غير معروف`,assistQuiet:`لا يزال قيد التنفيذ — لا تحديث منذ عدة دقائق`,resourceCreatedNamed:`تم إنشاء «{{name}}»`,resourceCreated:`تم إنشاء المورد`,annotationComplete:`اكتمل التوسيم`,annotationFailed:`فشل التوسيم`,generationFailed:`فشل التوليد: {{detail}}`,"decline_no-text-layer":`هذا الملف صورة ممسوحة تعذّر التعرّف على نصها.`,decline_encrypted:`هذا الملف محمي بكلمة مرور، ولا يمكن قراءة نصه.`,decline_corrupt:`تعذّرت قراءة هذا الملف — قد يكون تالفًا.`,"decline_too-large":`هذا المستند أكبر من أن يُستخرج نصه.`,decline_empty:`لا يحتوي هذا المستند على نص لتوسيمه.`,annotationCompletePartial:`اكتمل الكشف جزئيًا — {{pieces}} جزء ناقص الإبلاغ`,annotationFailedPartial:`فشل الكشف — تم الاحتفاظ بنتائج {{kept}} نوع مكتمل`},S={AssistProgress:e,PdfViewer:t,Toolbar:n,ResourceInfoPanel:r,CollaborationPanel:i,AnnotationHistory:a,CommentsPanel:o,HighlightPanel:s,AssessmentPanel:c,TaggingPanel:l,UnifiedAnnotationsPanel:u,StatisticsPanel:d,ReferencesPanel:f,KeyboardShortcuts:p,AnnotateToolbar:m,CollapsibleResourceNavigation:h,ResourceViewer:g,Settings:_,AnnotateView:v,ResourceGenerate:y,ReferenceWizard:b,OutcomeToasts:x};export{m as AnnotateToolbar,v as AnnotateView,a as AnnotationHistory,c as AssessmentPanel,e as AssistProgress,i as CollaborationPanel,h as CollapsibleResourceNavigation,o as CommentsPanel,s as HighlightPanel,p as KeyboardShortcuts,x as OutcomeToasts,t as PdfViewer,b as ReferenceWizard,f as ReferencesPanel,y as ResourceGenerate,r as ResourceInfoPanel,g as ResourceViewer,_ as Settings,d as StatisticsPanel,l as TaggingPanel,n as Toolbar,u as UnifiedAnnotationsPanel,S as default};
|
|
2
|
+
//# sourceMappingURL=ar-PYOTZERT-CXqLatkw.js.map
|