@tequila99/githuman 0.9.1 → 0.11.0

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.
Files changed (237) hide show
  1. package/README.md +50 -9
  2. package/dist/cli/config.js +35 -2
  3. package/dist/cli/index.js +2 -1
  4. package/dist/cli/server-runtime.js +14 -11
  5. package/dist/cli/startup-message.js +5 -4
  6. package/dist/server/app.js +48 -5
  7. package/dist/server/db/migrations.js +19 -0
  8. package/dist/server/errors/devices.js +7 -0
  9. package/dist/server/errors/http.js +1 -0
  10. package/dist/server/hooks/access/local-request.js +21 -0
  11. package/dist/server/hooks/access/require-access.js +93 -0
  12. package/dist/server/hooks/agents/local-origin.js +9 -26
  13. package/dist/server/hooks/notes/same-origin.js +7 -34
  14. package/dist/server/hooks/terminal/local-origin.js +8 -22
  15. package/dist/server/repositories/device.repo.js +74 -0
  16. package/dist/server/routes/agent.js +11 -2
  17. package/dist/server/routes/devices.js +130 -0
  18. package/dist/server/routes/events.js +7 -1
  19. package/dist/server/routes/notes.js +3 -3
  20. package/dist/server/routes/terminal.js +10 -2
  21. package/dist/server/services/device-connections.js +79 -0
  22. package/dist/server/services/device.service.js +222 -0
  23. package/dist/server/services/notes-external-assets.service.js +5 -5
  24. package/dist/server/services/notes-identity.service.js +4 -2
  25. package/dist/server/services/terminal/tokens.js +1 -1
  26. package/dist/server/utils/address-key.js +33 -0
  27. package/dist/server/utils/allowed-hosts.js +38 -0
  28. package/dist/server/utils/device-name.js +27 -0
  29. package/dist/server/utils/lan-addresses.js +35 -0
  30. package/dist/server/utils/remote-asset-request.js +9 -2
  31. package/dist/server/utils/request-origin.js +105 -0
  32. package/dist/shared/devices/constants.js +16 -0
  33. package/dist/shared/devices/name.js +12 -0
  34. package/dist/shared/devices/schemas.js +67 -0
  35. package/dist/shared/devices/types.js +1 -0
  36. package/dist/shared/events/types.js +2 -1
  37. package/dist/shared/network/address-url.js +4 -0
  38. package/dist/shared/utils/date.js +3 -0
  39. package/dist/web/assets/AccessPage-_OKn9U0P.js +1 -0
  40. package/dist/web/assets/AccessPage-l5Yiiw9T.css +1 -0
  41. package/dist/web/assets/AppPage-oQ9Rz0be.js +1 -0
  42. package/dist/web/assets/CreateButton-D1EtoicG.js +1 -0
  43. package/dist/web/assets/CreateReviewFabButton-B2Td8Wno.css +1 -0
  44. package/dist/web/assets/CreateReviewFabButton-BxvT3i9e.js +1 -0
  45. package/dist/web/assets/ErrorNotFound-DtnO85PU.js +1 -0
  46. package/dist/web/assets/IndexPage-D5PvyGrX.css +1 -0
  47. package/dist/web/assets/IndexPage-gdD7BHxA.js +1 -0
  48. package/dist/web/assets/MainLayout-47PTLKZf.js +6 -0
  49. package/dist/web/assets/MainLayout-ikSrFqBh.css +1 -0
  50. package/dist/web/assets/NoteVisualEditor-BQ6mVfj0.js +1054 -0
  51. package/dist/web/assets/{NoteVisualEditor-IH3s3d3W.css → NoteVisualEditor-BYikrY7Q.css} +1 -1
  52. package/dist/web/assets/NotesPage-DNR9iW_G.js +4 -0
  53. package/dist/web/assets/NotesPage-_8naQciW.css +1 -0
  54. package/dist/web/assets/PanelResize-CAQFVc8b.js +1 -0
  55. package/dist/web/assets/PanelResize-XjrbOj2S.css +1 -0
  56. package/dist/web/assets/{PdfPreview-DgwnGJ2E.js → PdfPreview-kL_nk9my.js} +2 -2
  57. package/dist/web/assets/PdfPreview-l_xzsLJ_.css +1 -0
  58. package/dist/web/assets/{QBtn-DoggJe1Q.js → QBtn-CB-yw_iP.js} +1 -1
  59. package/dist/web/assets/QExpansionItem-Dr5oXO0m.js +4 -0
  60. package/dist/web/assets/QFab-DPz8RiP0.js +1 -0
  61. package/dist/web/assets/QForm-CASiKhGm.js +1 -0
  62. package/dist/web/assets/{QInput-DJgTh2Qy.js → QInput-k34nCPWg.js} +1 -1
  63. package/dist/web/assets/QSelect-CaKn9Tkg.js +1 -0
  64. package/dist/web/assets/QSpace-Di_bZQY6.js +1 -0
  65. package/dist/web/assets/QVirtualScroll-oGN_Tl5J.js +1 -0
  66. package/dist/web/assets/ReviewDetailPage-BKgIprY0.js +1 -0
  67. package/dist/web/assets/ReviewsPage-6PJ6wofN.js +1 -0
  68. package/dist/web/assets/{StatusSwitcher-BCv_9MtI.css → StatusSwitcher-D6i8_OfR.css} +1 -1
  69. package/dist/web/assets/StatusSwitcher-s9w6iKpR.js +1 -0
  70. package/dist/web/assets/{TerminalView-C1jFlfLH.css → TerminalView-617DZuPt.css} +1 -1
  71. package/dist/web/assets/TerminalView-BsO_SZut.js +19 -0
  72. package/dist/web/assets/{abnfDiagram-O67JEVCF-BYlDf7LI.js → abnfDiagram-O67JEVCF-qUSrlp_c.js} +1 -1
  73. package/dist/web/assets/access-store-Q8nkv4Nb.js +1 -0
  74. package/dist/web/assets/agent-store-D2jgeBgi.js +113 -0
  75. package/dist/web/assets/architecture-7GRP2DOG-D6PShS0_.js +1 -0
  76. package/dist/web/assets/{architectureDiagram-NJMV4G6O-CC0SmfK_.js → architectureDiagram-NJMV4G6O-D7RC6OS2.js} +1 -1
  77. package/dist/web/assets/{blockDiagram-BEXU5L5S-C1Ny76Gc.js → blockDiagram-BEXU5L5S-CmNtTpfK.js} +1 -1
  78. package/dist/web/assets/{c4Diagram-YGBWAQC7-CP2if62Y.js → c4Diagram-YGBWAQC7-CKCcu1qx.js} +1 -1
  79. package/dist/web/assets/channel-D6lb5DbY.js +1 -0
  80. package/dist/web/assets/{chunk-3FUC2YCW-cjM6hj3T.js → chunk-3FUC2YCW-Drz6oeKx.js} +1 -1
  81. package/dist/web/assets/{chunk-5DYCD2WN-DAW_EwWQ.js → chunk-5DYCD2WN-RItzEgV_.js} +1 -1
  82. package/dist/web/assets/{chunk-742MDFTN-nkStFRF-.js → chunk-742MDFTN-D6hKdOv7.js} +1 -1
  83. package/dist/web/assets/{chunk-7INBJB4K-EQQsEy8I.js → chunk-7INBJB4K-Dk7-Eior.js} +1 -1
  84. package/dist/web/assets/{chunk-7M6MHVWA-DUJ2C21w.js → chunk-7M6MHVWA-Cw8E0Nkn.js} +1 -1
  85. package/dist/web/assets/{chunk-7PRAP22T-C1Bj5-NO.js → chunk-7PRAP22T-t-mTeNXF.js} +1 -1
  86. package/dist/web/assets/{chunk-GTNCS2PH-DW39t1bj.js → chunk-GTNCS2PH-C7j2atV8.js} +1 -1
  87. package/dist/web/assets/{chunk-GWA4HPMP-i49YwHnS.js → chunk-GWA4HPMP-CH9T9LZO.js} +1 -1
  88. package/dist/web/assets/{chunk-MBY4JIJT-C4mXlV61.js → chunk-MBY4JIJT-yXOO37xD.js} +1 -1
  89. package/dist/web/assets/{chunk-NETBCI7D-DoRSO-kq.js → chunk-NETBCI7D-C-s2UtAR.js} +1 -1
  90. package/dist/web/assets/{chunk-O7XYJQB3-D38ZePQT.js → chunk-O7XYJQB3-5Me_aV8o.js} +1 -1
  91. package/dist/web/assets/{chunk-UA2S7LBM-DmOI-u6c.js → chunk-UA2S7LBM-BQaibeff.js} +1 -1
  92. package/dist/web/assets/{chunk-WEXAMYUT-Dv710fF3.js → chunk-WEXAMYUT-UBcOE4Lf.js} +1 -1
  93. package/dist/web/assets/{chunk-Z7XXMR3K-CWHlAHIu.js → chunk-Z7XXMR3K-BsA8o3Pt.js} +1 -1
  94. package/dist/web/assets/{chunk-ZIGJFQKS-Bid5tGRk.js → chunk-ZIGJFQKS--KwSI1U0.js} +1 -1
  95. package/dist/web/assets/{classDiagram-v2-NBCMYWYE-C1770G1t.js → classDiagram-v2-NBCMYWYE-pMF8oCmq.js} +1 -1
  96. package/dist/web/assets/create-B9Tn5Xvi.js +1 -0
  97. package/dist/web/assets/{cynefin-OW5HDTMX-CWxF4ZIN.js → cynefin-OW5HDTMX-DFgtXolF.js} +1 -1
  98. package/dist/web/assets/{cynefinDiagram-VND7K2PF-DcFBTI6m.js → cynefinDiagram-VND7K2PF-CPY0JRyq.js} +1 -1
  99. package/dist/web/assets/{dagre-6A5THRUB-CP5wTvgN.js → dagre-6A5THRUB-KdjJKAB7.js} +1 -1
  100. package/dist/web/assets/devices-store-CrZ4MxyY.js +1 -0
  101. package/dist/web/assets/{diagram-22UHCM2B-mLUm1v32.js → diagram-22UHCM2B-BDcOcvF_.js} +1 -1
  102. package/dist/web/assets/{diagram-3UASUU5V-CP0OFpuS.js → diagram-3UASUU5V-6j2nlZL3.js} +1 -1
  103. package/dist/web/assets/{diagram-ATOU4E4O-DolFulHH.js → diagram-ATOU4E4O-BN8cdxED.js} +1 -1
  104. package/dist/web/assets/{diagram-CDSNMT55-Bs17AhwI.js → diagram-CDSNMT55-cWPiXHkr.js} +1 -1
  105. package/dist/web/assets/{diagram-MLGK6HIB-BfhsJwV7.js → diagram-MLGK6HIB-DcgkH_Vl.js} +1 -1
  106. package/dist/web/assets/{diagram-MPIPVDR6-B1c-Ikp-.js → diagram-MPIPVDR6-D_e86L99.js} +1 -1
  107. package/dist/web/assets/diff-store-ByxMCKoa.js +93 -0
  108. package/dist/web/assets/{dist-CyyHluOV.js → dist-BMFtkY2y.js} +1 -1
  109. package/dist/web/assets/{dist-d8yBJi6g.js → dist-BP40mvwJ.js} +1 -1
  110. package/dist/web/assets/{dist-zqKz9Qrf.js → dist-BVVhgjWT.js} +1 -1
  111. package/dist/web/assets/{dist-BsjKEQwP.js → dist-Bdsq-Ze1.js} +1 -1
  112. package/dist/web/assets/{dist-Bm8OAr9J.js → dist-BwpyANeW.js} +1 -1
  113. package/dist/web/assets/{dist-DkKvAWYi.js → dist-Bz40Nd9I.js} +1 -1
  114. package/dist/web/assets/{dist-yQ-fH4og.js → dist-C9enVshI.js} +1 -1
  115. package/dist/web/assets/{dist-DuW-c5so.js → dist-CLCP7f3x.js} +1 -1
  116. package/dist/web/assets/{dist-C6YiC_nY.js → dist-CU43ytsh.js} +1 -1
  117. package/dist/web/assets/{dist-g0NXSFab.js → dist-CjkUzU4s.js} +1 -1
  118. package/dist/web/assets/{dist-D6WXR3TF.js → dist-MUQaJRtC.js} +1 -1
  119. package/dist/web/assets/{ebnfDiagram-ZINNZB2B-BvQ60ZD9.js → ebnfDiagram-ZINNZB2B-D8xHOFOi.js} +1 -1
  120. package/dist/web/assets/{elk-276RUBZZ-C27WMGnY.js → elk-276RUBZZ-JiDwNyLy.js} +1 -1
  121. package/dist/web/assets/{erDiagram-OPXOYQCR-CdfkOXb9.js → erDiagram-OPXOYQCR-D3J6u81a.js} +1 -1
  122. package/dist/web/assets/eventmodeling-NTZA5JFV-QCwZLvmm.js +1 -0
  123. package/dist/web/assets/flowDiagram-KWPJA3E3-CgF90hDi.js +1 -0
  124. package/dist/web/assets/{ganttDiagram-FUAMR5RP-CuKNmNbv.js → ganttDiagram-FUAMR5RP-nvAVhbgI.js} +1 -1
  125. package/dist/web/assets/{gitGraph-4MIJSDKK-DBGr6EfP.js → gitGraph-4MIJSDKK-Bv_wkB2T.js} +1 -1
  126. package/dist/web/assets/{gitGraphDiagram-X574FWY7-BUZgiyYd.js → gitGraphDiagram-X574FWY7-DxxwadhH.js} +1 -1
  127. package/dist/web/assets/i18n-DDCqtTTW.js +1 -0
  128. package/dist/web/assets/index-BNHt6zmP.js +2 -0
  129. package/dist/web/assets/index-BwbM_RKi.css +1 -0
  130. package/dist/web/assets/{info-A6RAGUB7-CjnEima-.js → info-A6RAGUB7-Dw18yeIE.js} +1 -1
  131. package/dist/web/assets/{infoDiagram-VRGFBTTK-D91sa8do.js → infoDiagram-VRGFBTTK-C3BrgjYg.js} +1 -1
  132. package/dist/web/assets/init-app-BouXTk8p.js +1 -0
  133. package/dist/web/assets/{is-CE4jkrGQ.js → is-D0waCELe.js} +1 -1
  134. package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-2K-kH65E.js → ishikawaDiagram-OU5B5YK6-DU2p9szX.js} +1 -1
  135. package/dist/web/assets/{journeyDiagram-ZHPQQLJL-CkENPVJA.js → journeyDiagram-ZHPQQLJL-Bs2zQnew.js} +1 -1
  136. package/dist/web/assets/{kanban-definition-PNTS6WVX-BHJODz7s.js → kanban-definition-PNTS6WVX-pqXd5uNi.js} +1 -1
  137. package/dist/web/assets/{line-C6VvIL_x.js → line-CN4Dxpei.js} +1 -1
  138. package/dist/web/assets/{markdown-192Ev3_O.js → markdown-jR0fhe4d.js} +1 -1
  139. package/dist/web/assets/{mermaid-parser.core-DMJg-lnr.js → mermaid-parser.core-DZqDOGRM.js} +3 -3
  140. package/dist/web/assets/{mermaid.core-Dd40xnyQ.js → mermaid.core-CUndCvkz.js} +4 -4
  141. package/dist/web/assets/{mindmap-definition-NLK3R4M7-DhfAMSga.js → mindmap-definition-NLK3R4M7-DyK7YqB7.js} +1 -1
  142. package/dist/web/assets/{packet-AYTQ26CC-DZUk7rEw.js → packet-AYTQ26CC-DvlW_0BP.js} +1 -1
  143. package/dist/web/assets/{pegDiagram-GJSIUBJH-W22cBCh2.js → pegDiagram-GJSIUBJH-k2e_-FWQ.js} +1 -1
  144. package/dist/web/assets/{pie-WAS4IAKB-BMvwPiHK.js → pie-WAS4IAKB-B99zaYjO.js} +1 -1
  145. package/dist/web/assets/{pieDiagram-5QR66LMP-CZ2EVCmx.js → pieDiagram-5QR66LMP-BPbS05lK.js} +1 -1
  146. package/dist/web/assets/pinia-BETEFLDG.js +1 -0
  147. package/dist/web/assets/pinia-DO0AdKGg.js +1 -0
  148. package/dist/web/assets/{quadrantDiagram-O4NWA36T-DBS45bbr.js → quadrantDiagram-O4NWA36T-DqNNdsd2.js} +1 -1
  149. package/dist/web/assets/{radar-RG4KPBEZ-BDkD2JF1.js → radar-RG4KPBEZ-BIAAr9LO.js} +1 -1
  150. package/dist/web/assets/{railroad-74A4TZTK-BH_sA5bU.js → railroad-74A4TZTK-DYxr-1-f.js} +1 -1
  151. package/dist/web/assets/railroad-abnf-HS5TGJTU-GESjhc3t.js +1 -0
  152. package/dist/web/assets/railroad-ebnf-LZEXJU2U-Cybu0A7J.js +1 -0
  153. package/dist/web/assets/railroad-peg-WCYAUIDC-DCHxrtbI.js +1 -0
  154. package/dist/web/assets/{railroadDiagram-XR7U4H2S-CrI1TIG1.js → railroadDiagram-XR7U4H2S-TNg-LqRR.js} +1 -1
  155. package/dist/web/assets/{requirementDiagram-PLB6GJNP-BbtaFtGn.js → requirementDiagram-PLB6GJNP-hKAyJR6W.js} +1 -1
  156. package/dist/web/assets/runtime-core.esm-bundler-CAvPiMpd.js +1 -0
  157. package/dist/web/assets/{safe-storage-DekXHbgc.js → safe-storage-B1Aq5CGi.js} +1 -1
  158. package/dist/web/assets/{sankeyDiagram-IPEJSGJF-DRU9tLf3.js → sankeyDiagram-IPEJSGJF-_MSL-tES.js} +1 -1
  159. package/dist/web/assets/{sequenceDiagram-PO4LG4MO-RquVuniP.js → sequenceDiagram-PO4LG4MO-Byq-joBG.js} +1 -1
  160. package/dist/web/assets/single-flight-DLCbzLI3.js +1 -0
  161. package/dist/web/assets/{stateDiagram-v2-GCMORJYK-CKjC8JTS.js → stateDiagram-v2-GCMORJYK-BR2jAgaa.js} +1 -1
  162. package/dist/web/assets/{swimlanes-2SLR337P-B-5FN1NY.js → swimlanes-2SLR337P-Nt8ojGKK.js} +1 -1
  163. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-Ds1hVYqh.js +8 -0
  164. package/dist/web/assets/terminal-store-D0abibMa.js +1 -0
  165. package/dist/web/assets/theme-QEcOl0lf.js +1 -0
  166. package/dist/web/assets/{timeline-definition-EJHVYXUP-DbG_YVkW.js → timeline-definition-EJHVYXUP-BtihLvxk.js} +1 -1
  167. package/dist/web/assets/{treeView-Q6P3EWNA-BgkrW_FP.js → treeView-Q6P3EWNA-D5HzXeKd.js} +1 -1
  168. package/dist/web/assets/{treemap-WGGIJYW6-Dp8ISpo7.js → treemap-WGGIJYW6-Dovjuutg.js} +1 -1
  169. package/dist/web/assets/use-add-agent-context-BaPUIO93.js +1 -0
  170. package/dist/web/assets/use-app-theme-B1cdbnHn.js +1 -0
  171. package/dist/web/assets/use-countdown-CTag4T13.js +1 -0
  172. package/dist/web/assets/use-panel-width-CB-0S3zX.js +1 -0
  173. package/dist/web/assets/use-router-link-Dr9wnnyZ.js +1 -0
  174. package/dist/web/assets/use-row-height-DQHVMtUe.js +1 -0
  175. package/dist/web/assets/use-server-events-BrBCbeHu.js +1 -0
  176. package/dist/web/assets/{use-virtual-scroll-BSXYZjZ5.js → use-virtual-scroll-DG0UKjVk.js} +1 -1
  177. package/dist/web/assets/{usecaseDiagram-POWQR4AR-DwRXMhnD.js → usecaseDiagram-POWQR4AR-DSwRE8zj.js} +1 -1
  178. package/dist/web/assets/{vennDiagram-UO4OBE2U-CxdeHvjU.js → vennDiagram-UO4OBE2U-C-B8yP1K.js} +1 -1
  179. package/dist/web/assets/{vue-i18n.runtime-BpRrzZrT.js → vue-i18n.runtime-CEtihHHL.js} +2 -2
  180. package/dist/web/assets/{wardley-WFR3VGLG-C8gq8AfM.js → wardley-WFR3VGLG-wWgaZuh6.js} +1 -1
  181. package/dist/web/assets/{wardleyDiagram-VNRHLVJA-C9Jo2KAj.js → wardleyDiagram-VNRHLVJA-DbhenrHd.js} +1 -1
  182. package/dist/web/assets/weighted-lru-BSxRnMHR.js +1 -0
  183. package/dist/web/assets/{xychartDiagram-PMCCYNJV-D3tp7hdU.js → xychartDiagram-PMCCYNJV-CxFDmAEt.js} +1 -1
  184. package/dist/web/index.html +8 -8
  185. package/package.json +3 -1
  186. package/dist/web/assets/AppPage-DdmqiV2R.js +0 -1
  187. package/dist/web/assets/ClosePopup-DhjIPp8s.js +0 -1
  188. package/dist/web/assets/CreateButton-BoxoJ7Jr.js +0 -93
  189. package/dist/web/assets/CreateReviewFabButton-CA5OsG7d.js +0 -1
  190. package/dist/web/assets/CreateReviewFabButton-Cufd8hVJ.css +0 -1
  191. package/dist/web/assets/ErrorNotFound-Cq0wNQMu.js +0 -1
  192. package/dist/web/assets/IndexPage-CROp8XNF.js +0 -1
  193. package/dist/web/assets/IndexPage-F8MMAAkn.css +0 -1
  194. package/dist/web/assets/MainLayout-DM30ynlR.css +0 -1
  195. package/dist/web/assets/MainLayout-DvfVDB2G.js +0 -6
  196. package/dist/web/assets/NoteVisualEditor-VfLNFzsD.js +0 -1054
  197. package/dist/web/assets/NotesPage-D_NiwDh8.js +0 -4
  198. package/dist/web/assets/NotesPage-KaCEnfdz.css +0 -1
  199. package/dist/web/assets/PanelResize-9uljPbE4.js +0 -1
  200. package/dist/web/assets/PanelResize-C51WwwLD.css +0 -1
  201. package/dist/web/assets/PdfPreview-Cb0xawi0.css +0 -1
  202. package/dist/web/assets/QFab-D1X33Wdk.js +0 -1
  203. package/dist/web/assets/QForm-BQMj3m1W.js +0 -4
  204. package/dist/web/assets/QResizeObserver-D-9MeQ9q.js +0 -1
  205. package/dist/web/assets/QScrollArea-DlLel0SO.js +0 -1
  206. package/dist/web/assets/QSelect-mw3iS4Cp.js +0 -1
  207. package/dist/web/assets/QSpace-BbB0w38T.js +0 -1
  208. package/dist/web/assets/QVirtualScroll-FtQn3PJj.js +0 -1
  209. package/dist/web/assets/ReviewDetailPage-D7x0R_2N.js +0 -1
  210. package/dist/web/assets/ReviewsPage-C317IA1b.js +0 -1
  211. package/dist/web/assets/StatusSwitcher-BQXo4sss.js +0 -1
  212. package/dist/web/assets/TerminalView-CTsFWvWm.js +0 -19
  213. package/dist/web/assets/agent-store-ByB1OrjP.js +0 -113
  214. package/dist/web/assets/app-info-store-Gn-SNU3Y.js +0 -1
  215. package/dist/web/assets/architecture-7GRP2DOG-DNWQGMIX.js +0 -1
  216. package/dist/web/assets/channel-DW-wL7ua.js +0 -1
  217. package/dist/web/assets/create-BSmXD9Zr.js +0 -1
  218. package/dist/web/assets/eventmodeling-NTZA5JFV-C1sONJTj.js +0 -1
  219. package/dist/web/assets/flowDiagram-KWPJA3E3-CU2TsxFx.js +0 -1
  220. package/dist/web/assets/i18n-Cxfq3B8n.js +0 -1
  221. package/dist/web/assets/index-DKirIJG5.js +0 -2
  222. package/dist/web/assets/index-Dma-RXBR.css +0 -1
  223. package/dist/web/assets/init-app-B6mIRN6f.js +0 -1
  224. package/dist/web/assets/pinia-Cp_DCu4m.js +0 -1
  225. package/dist/web/assets/pinia-DCsnCHsH.js +0 -1
  226. package/dist/web/assets/railroad-abnf-HS5TGJTU-D6lX11kj.js +0 -1
  227. package/dist/web/assets/railroad-ebnf-LZEXJU2U-D3N0Z6uV.js +0 -1
  228. package/dist/web/assets/railroad-peg-WCYAUIDC-DOaenw8H.js +0 -1
  229. package/dist/web/assets/runtime-core.esm-bundler-BKFI1w28.js +0 -1
  230. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-B5SL6iu0.js +0 -8
  231. package/dist/web/assets/theme-C1B2V2RV.js +0 -1
  232. package/dist/web/assets/use-add-agent-context-3-KB2D10.js +0 -1
  233. package/dist/web/assets/use-app-theme-D_HR0B3W.js +0 -1
  234. package/dist/web/assets/use-panel-width-DIzwb-yt.js +0 -1
  235. package/dist/web/assets/use-router-link-BGc0noIO.js +0 -1
  236. package/dist/web/assets/use-server-events-C13Sw-rU.js +0 -1
  237. package/dist/web/assets/window-store-CnPjWx6-.js +0 -1
@@ -20,7 +20,7 @@ export class TerminalTokens {
20
20
  consume(token, origin) {
21
21
  const info = this.tokens.get(token);
22
22
  this.tokens.delete(token);
23
- return !!info && info.expires > this.now() && info.origin === origin;
23
+ return (info !== undefined && info.expires > this.now() && info.origin === origin);
24
24
  }
25
25
  prune() {
26
26
  for (const [token, info] of this.tokens) {
@@ -0,0 +1,33 @@
1
+ import { isIPv4, isIPv6 } from 'node:net';
2
+ // An IPv6 client owns a whole /64 and can take any address inside it.
3
+ const IPV6_PREFIX_GROUPS = 4;
4
+ const IPV4_MAPPED_PREFIX = '::ffff:';
5
+ /** Expands an IPv6 address into 8 groups. The address must be valid. */
6
+ function ipv6Groups(address) {
7
+ const [head = '', tail] = address.split('::');
8
+ const headGroups = head === '' ? [] : head.split(':');
9
+ if (tail === undefined)
10
+ return headGroups;
11
+ const tailGroups = tail === '' ? [] : tail.split(':');
12
+ const gap = 8 - headGroups.length - tailGroups.length;
13
+ return [...headGroups, ...Array(gap).fill('0'), ...tailGroups];
14
+ }
15
+ /**
16
+ * Key that limits pairing requests of one client. An IPv6 address maps to
17
+ * its /64 prefix, an IPv4-mapped address to the IPv4 address. Any other
18
+ * text stays as it is.
19
+ */
20
+ export function addressKey(address) {
21
+ const plain = address.split('%')[0] ?? address;
22
+ if (plain.toLowerCase().startsWith(IPV4_MAPPED_PREFIX)) {
23
+ const mapped = plain.slice(IPV4_MAPPED_PREFIX.length);
24
+ if (isIPv4(mapped))
25
+ return mapped;
26
+ }
27
+ if (!isIPv6(plain))
28
+ return address;
29
+ const groups = ipv6Groups(plain.toLowerCase())
30
+ .slice(0, IPV6_PREFIX_GROUPS)
31
+ .map(group => parseInt(group, 16).toString(16));
32
+ return `${groups.join(':')}::/64`;
33
+ }
@@ -0,0 +1,38 @@
1
+ import { machineAddresses } from "./lan-addresses.js";
2
+ import { parseHost } from "./request-origin.js";
3
+ // DHCP can change an address; a short cache keeps the lookup cheap per request.
4
+ const ADDRESS_CACHE_MS = 5000;
5
+ /**
6
+ * `Host` values that a LAN request may use (ADR 0079): addresses of this
7
+ * machine and the exact names from `--allowed-host`. A page of a rebound
8
+ * hostile domain sends its own name, so it cannot reach the API or start
9
+ * a pairing request.
10
+ */
11
+ export class AllowedHosts {
12
+ names;
13
+ addresses;
14
+ now;
15
+ cached;
16
+ constructor(names = [], addresses = machineAddresses, now = Date.now) {
17
+ this.names = new Set(names.map(name => name.toLowerCase()));
18
+ this.addresses = addresses;
19
+ this.now = now;
20
+ }
21
+ allows(host) {
22
+ const hostname = parseHost(host)?.hostname;
23
+ if (hostname === undefined)
24
+ return false;
25
+ const bare = hostname.startsWith('[') ? hostname.slice(1, -1) : hostname;
26
+ return this.names.has(bare) || this.machineHosts().has(bare);
27
+ }
28
+ machineHosts() {
29
+ const now = this.now();
30
+ if (!this.cached || now - this.cached.at >= ADDRESS_CACHE_MS) {
31
+ this.cached = {
32
+ at: now,
33
+ hosts: new Set(this.addresses().map(address => address.toLowerCase()))
34
+ };
35
+ }
36
+ return this.cached.hosts;
37
+ }
38
+ }
@@ -0,0 +1,27 @@
1
+ // Platforms and browsers for a default device name, in match order.
2
+ const PLATFORMS = [
3
+ [/iPhone/, 'iPhone'],
4
+ [/iPad/, 'iPad'],
5
+ [/Android/, 'Android'],
6
+ [/Mac OS X|Macintosh/, 'macOS'],
7
+ [/Windows/, 'Windows'],
8
+ [/CrOS/, 'ChromeOS'],
9
+ [/Linux/, 'Linux']
10
+ ];
11
+ // Browser match order keeps Chromium variants before Chrome and Safari.
12
+ const BROWSERS = [
13
+ [/Edg\//, 'Edge'],
14
+ [/OPR\//, 'Opera'],
15
+ [/Firefox\/|FxiOS\//, 'Firefox'],
16
+ [/Chrome\/|CriOS\//, 'Chrome'],
17
+ [/Safari\//, 'Safari']
18
+ ];
19
+ /** "Safari on iPhone"; a generic name when the User-Agent says nothing known. */
20
+ export function deviceNameFromUserAgent(userAgent) {
21
+ const agent = userAgent ?? '';
22
+ const platform = PLATFORMS.find(([pattern]) => pattern.test(agent))?.[1];
23
+ const browser = BROWSERS.find(([pattern]) => pattern.test(agent))?.[1];
24
+ if (browser && platform)
25
+ return `${browser} on ${platform}`;
26
+ return browser ?? platform ?? 'Unknown device';
27
+ }
@@ -0,0 +1,35 @@
1
+ import { networkInterfaces } from 'node:os';
2
+ // Hosts that make the server listen on every interface (ADR 0079).
3
+ export const WILDCARD_HOSTS = new Set(['0.0.0.0', '::']);
4
+ // IPv6 link-local range fe80::/10.
5
+ const IPV6_LINK_LOCAL = /^fe[89ab]/i;
6
+ /**
7
+ * Non-loopback addresses of this machine. Link-local addresses are left
8
+ * out: they need a zone id and do not work in a browser URL.
9
+ */
10
+ export function machineAddresses() {
11
+ const result = [];
12
+ for (const entries of Object.values(networkInterfaces())) {
13
+ for (const entry of entries ?? []) {
14
+ if (entry.internal)
15
+ continue;
16
+ if (entry.family === 'IPv4' && !entry.address.startsWith('169.254.')) {
17
+ result.push(entry.address);
18
+ }
19
+ else if (entry.family === 'IPv6' &&
20
+ !IPV6_LINK_LOCAL.test(entry.address)) {
21
+ result.push(entry.address);
22
+ }
23
+ }
24
+ }
25
+ return result;
26
+ }
27
+ /**
28
+ * LAN addresses that a bind host accepts: `0.0.0.0` accepts IPv4 only,
29
+ * `::` accepts both families, a loopback bind accepts none.
30
+ */
31
+ export function lanAddresses(bindHost) {
32
+ if (!WILDCARD_HOSTS.has(bindHost))
33
+ return [];
34
+ return machineAddresses().filter(address => bindHost === '::' || !address.includes(':'));
35
+ }
@@ -1,5 +1,6 @@
1
1
  import { lookup } from 'node:dns/promises';
2
2
  import { BlockList, isIP } from 'node:net';
3
+ import { finished } from 'node:stream';
3
4
  import { Agent, request } from 'undici';
4
5
  import { BadRequestError } from "../errors/http.js";
5
6
  import { isCredentialFreeWebUrl } from "../../shared/utils/web-url.js";
@@ -65,6 +66,12 @@ export function isPublicAssetAddress(address) {
65
66
  PUBLIC_IPV6.check(address, 'ipv6') &&
66
67
  !BLOCKED_IPV6.check(address, 'ipv6'));
67
68
  }
69
+ /** Unread Undici bodies emit an abort error when destroyed, even without an explicit error. */
70
+ export function destroyRemoteAssetResponse(response) {
71
+ // Keep the error listener for late transport errors after disposal.
72
+ finished(response, () => { });
73
+ response.destroy();
74
+ }
68
75
  /**
69
76
  * Resolves a host name and refuses non-public results. The socket connects to
70
77
  * the checked address, so no second lookup can change the target.
@@ -153,11 +160,11 @@ export async function remoteAssetRequest(source, method, signal, options = {}) {
153
160
  if (isIP(host) && !isPublicAssetAddress(host)) {
154
161
  throw new BadRequestError('Attachment address is not public');
155
162
  }
156
- const { statusCode, headers, body } = await untilAborted(request(url, { method, signal, dispatcher, headers: REQUEST_HEADERS }), signal, late => late.body.destroy());
163
+ const { statusCode, headers, body } = await untilAborted(request(url, { method, signal, dispatcher, headers: REQUEST_HEADERS }), signal, late => destroyRemoteAssetResponse(late.body));
157
164
  if (!REDIRECT_STATUSES.includes(statusCode)) {
158
165
  return Object.assign(body, { statusCode, headers });
159
166
  }
160
- body.destroy();
167
+ destroyRemoteAssetResponse(body);
161
168
  if (redirects >= MAX_REDIRECTS) {
162
169
  throw new BadRequestError('Too many attachment redirects');
163
170
  }
@@ -0,0 +1,105 @@
1
+ import { isIP } from 'node:net';
2
+ // Node reports IPv4 clients of a dual-stack socket with this prefix.
3
+ const IPV4_MAPPED_PREFIX = '::ffff:';
4
+ // Default ports of the page schemes that `Origin` may have.
5
+ const DEFAULT_PORTS = {
6
+ 'http:': 80,
7
+ 'https:': 443
8
+ };
9
+ // The port of a `Host` value; an IPv6 literal keeps its colons in brackets.
10
+ const EXPLICIT_PORT = /^(?:\[[^\]]*\]|[^:]*):(\d+)$/;
11
+ /**
12
+ * Parses a `Host` header as an HTTP authority. Returns undefined for values
13
+ * with userinfo, a path, a query or a fragment: `localhost:80@evil` names
14
+ * the host `evil`, not `localhost`.
15
+ */
16
+ export function parseHost(host) {
17
+ if (!host)
18
+ return undefined;
19
+ try {
20
+ const url = new URL(`http://${host}`);
21
+ const plain = !url.username &&
22
+ !url.password &&
23
+ url.pathname === '/' &&
24
+ !url.search &&
25
+ !url.hash &&
26
+ !host.includes('/');
27
+ return plain ? url : undefined;
28
+ }
29
+ catch {
30
+ return undefined;
31
+ }
32
+ }
33
+ /**
34
+ * True when a browser `Origin` names the same host and port as `Host`.
35
+ * The scheme comes from `Origin` only: behind a TLS proxy the page is
36
+ * `https:`, but the connection to this server is HTTP. So the default port
37
+ * of the page scheme applies to both sides: `https://h` matches `h` and
38
+ * `h:443`, but not `h:80`. A `Host` without a port cannot tell the scheme,
39
+ * so an HTTP page on port 80 and an HTTPS page on port 443 of one host
40
+ * both match `h`. That needs a second web server on this machine.
41
+ * `null`, userinfo and paths never match.
42
+ */
43
+ export function sameOrigin(origin, host) {
44
+ const target = parseHost(host);
45
+ if (!target || host === undefined)
46
+ return false;
47
+ try {
48
+ const source = new URL(origin);
49
+ const defaultPort = DEFAULT_PORTS[source.protocol];
50
+ if (defaultPort === undefined || source.origin !== origin)
51
+ return false;
52
+ // `URL` drops port 80 of `http://h:80`, so the port comes from the raw header.
53
+ const hostPort = EXPLICIT_PORT.exec(host)?.[1];
54
+ return (source.hostname === target.hostname &&
55
+ Number(source.port || defaultPort) === Number(hostPort ?? defaultPort));
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }
61
+ /** Socket address of this machine: `127.0.0.0/8`, `::1` or IPv4-mapped loopback. */
62
+ export function isLoopbackAddress(address) {
63
+ if (!address)
64
+ return false;
65
+ const plain = plainAddress(address);
66
+ if (isIP(plain) === 4)
67
+ return plain.startsWith('127.');
68
+ return plain === '::1';
69
+ }
70
+ /** `::ffff:192.168.1.5` → `192.168.1.5`; other addresses stay as they are. */
71
+ export function plainAddress(address) {
72
+ return address.toLowerCase().startsWith(IPV4_MAPPED_PREFIX) &&
73
+ isIP(address.slice(IPV4_MAPPED_PREFIX.length)) === 4
74
+ ? address.slice(IPV4_MAPPED_PREFIX.length)
75
+ : address;
76
+ }
77
+ /**
78
+ * Address of the client for limits and for the operator. A proxy on this
79
+ * machine connects from loopback and appends the client address to
80
+ * `X-Forwarded-For`, so the last entry is the client. A remote socket
81
+ * cannot be a proxy of ours: its header is not trusted.
82
+ */
83
+ export function clientAddress(socketAddress, forwardedFor) {
84
+ const socket = socketAddress ?? '';
85
+ if (isLoopbackAddress(socket)) {
86
+ const forwarded = forwardedAddresses(forwardedFor);
87
+ const last = forwarded?.at(-1);
88
+ if (last !== undefined)
89
+ return plainAddress(last);
90
+ }
91
+ return plainAddress(socket);
92
+ }
93
+ /**
94
+ * Addresses from `X-Forwarded-For`, nearest proxy last. Returns undefined
95
+ * when any entry is not a plain IP address: an unreadable chain must not
96
+ * pass as a local one. An absent header gives an empty list.
97
+ */
98
+ export function forwardedAddresses(header) {
99
+ if (header === undefined)
100
+ return [];
101
+ const entries = (Array.isArray(header) ? header.join(',') : header)
102
+ .split(',')
103
+ .map(entry => entry.trim());
104
+ return entries.every(entry => isIP(entry) !== 0) ? entries : undefined;
105
+ }
@@ -0,0 +1,16 @@
1
+ /** Lifetime of a pairing request; the operator must approve it in this time (ADR 0079). */
2
+ export const PAIRING_REQUEST_TTL_MS = 2 * 60 * 1000;
3
+ /** A trusted device without activity for this long loses access. */
4
+ export const DEVICE_IDLE_TTL_MS = 30 * 24 * 60 * 60 * 1000;
5
+ /** Activity writes to the database and renews the cookie at most this often. */
6
+ export const DEVICE_TOUCH_INTERVAL_MS = 24 * 60 * 60 * 1000;
7
+ /** Digits in the code that the operator compares on both screens. */
8
+ export const PAIRING_CODE_LENGTH = 6;
9
+ /** Longest device name; the UI limits its input to the same length. */
10
+ export const DEVICE_NAME_MAX_LENGTH = 64;
11
+ /** Pending requests at once, so that one LAN host cannot fill the database. */
12
+ export const MAX_PENDING_REQUESTS = 10;
13
+ /** One client address may create a request at most this often. */
14
+ export const PAIRING_REQUEST_INTERVAL_MS = 10 * 1000;
15
+ /** Requests from all addresses per minute: limits events and console messages. */
16
+ export const MAX_PAIRING_REQUESTS_PER_MINUTE = 30;
@@ -0,0 +1,12 @@
1
+ import { DEVICE_NAME_MAX_LENGTH } from "./constants.js";
2
+ // C0, DEL, C1 and format characters (bidi overrides, zero-width): the name
3
+ // reaches the server console and the operator dialog.
4
+ const CONTROL_CHARACTERS = /[\p{Cc}\p{Cf}]/gu;
5
+ /**
6
+ * A name without control and format characters and outer spaces, cut by code points:
7
+ * the schema counts code points too, and a cut must not split an emoji.
8
+ */
9
+ export function cleanDeviceName(name) {
10
+ const plain = (name ?? '').replace(CONTROL_CHARACTERS, '').trim();
11
+ return Array.from(plain).slice(0, DEVICE_NAME_MAX_LENGTH).join('').trim();
12
+ }
@@ -0,0 +1,67 @@
1
+ import { Type } from '@sinclair/typebox';
2
+ import { DEVICE_NAME_MAX_LENGTH, PAIRING_CODE_LENGTH } from "./constants.js";
3
+ export const DeviceStateSchema = Type.Union([Type.Literal('pending'), Type.Literal('trusted')], {
4
+ description: 'pending: the device waits for the operator; trusted: the device has access.'
5
+ });
6
+ const code = Type.String({
7
+ pattern: `^\\d{${PAIRING_CODE_LENGTH}}$`,
8
+ description: 'Code that the operator compares with the device screen.'
9
+ });
10
+ // The name reaches the server console: control characters could fake
11
+ // lines or send terminal escape sequences (C0, DEL and C1 ranges).
12
+ // Format characters (bidi overrides, zero-width) could fake the name.
13
+ const name = Type.String({
14
+ minLength: 1,
15
+ maxLength: DEVICE_NAME_MAX_LENGTH,
16
+ pattern: '^[^\\p{Cc}\\p{Cf}]*$',
17
+ description: 'Device name shown to the operator, without control characters.'
18
+ });
19
+ export const DeviceSchema = Type.Object({
20
+ id: Type.String({ description: 'Device id.' }),
21
+ name,
22
+ state: DeviceStateSchema,
23
+ host: Type.String({
24
+ description: 'Host header of the pairing request.'
25
+ }),
26
+ address: Type.String({
27
+ description: 'Last client address of the device.'
28
+ }),
29
+ createdAt: Type.String({ description: 'ISO time of the pairing request.' }),
30
+ expiresAt: Type.String({
31
+ description: 'ISO time when access ends: the request deadline, or 30 days after the last activity.'
32
+ }),
33
+ lastSeenAt: Type.String({
34
+ description: 'ISO time of the last recorded activity.'
35
+ })
36
+ }, { description: 'A device that requested or has access from the LAN.' });
37
+ export const DeviceListSchema = Type.Array(DeviceSchema, {
38
+ description: 'Pending and trusted devices.'
39
+ });
40
+ export const AccessStatusSchema = Type.Union([
41
+ Type.Literal('local'),
42
+ Type.Literal('device'),
43
+ Type.Literal('pending'),
44
+ Type.Literal('none')
45
+ ], {
46
+ description: 'local: this machine; device: a trusted device; pending: a pairing request waits; none: no access.'
47
+ });
48
+ export const AccessSchema = Type.Object({
49
+ status: AccessStatusSchema,
50
+ pairing: Type.Optional(Type.Object({
51
+ code,
52
+ expiresAt: Type.String({
53
+ description: 'ISO time when the pairing request expires.'
54
+ }),
55
+ remainingMs: Type.Integer({
56
+ minimum: 0,
57
+ description: 'Milliseconds until the request expires. The device clock can differ from the server clock.'
58
+ })
59
+ }, { description: 'The pending pairing request of this browser.' }))
60
+ }, { description: 'Access of the current browser.' });
61
+ export const CreatePairingRequestBody = Type.Object({ name: Type.Optional(name) }, {
62
+ description: 'Pairing request. Without a name the server derives one from the User-Agent.'
63
+ });
64
+ export const ApproveDeviceBody = Type.Object({ code }, { description: 'Code that the operator saw on the device.' });
65
+ export const RenameDeviceBody = Type.Object({ name }, { description: 'New device name.' });
66
+ export const DeviceParams = Type.Object({ id: Type.String({ description: 'Device id.' }) }, { description: 'Device path parameters.' });
67
+ export const LanAddressesSchema = Type.Array(Type.String({ description: 'IP address of this machine in the LAN.' }), { description: 'Addresses that LAN devices can open.' });
@@ -0,0 +1 @@
1
+ export {};
@@ -11,5 +11,6 @@ export const SERVER_EVENT_TYPES = [
11
11
  'comment:updated',
12
12
  'comment:deleted',
13
13
  'notes:changed',
14
- 'files:changed'
14
+ 'files:changed',
15
+ 'devices:changed'
15
16
  ];
@@ -0,0 +1,4 @@
1
+ /** Browser URL for an IP address and port: IPv6 needs brackets. */
2
+ export function addressUrl(address, port) {
3
+ return `http://${address.includes(':') ? `[${address}]` : address}:${port}`;
4
+ }
@@ -0,0 +1,3 @@
1
+ export function toIsoString(timestampMs) {
2
+ return new Date(timestampMs).toISOString();
3
+ }
@@ -0,0 +1 @@
1
+ import{At as e,F as t,M as n,Y as r,c as i,d as a,f as o,g as s,h as c,l,lt as u,mt as d,q as f,u as p,v as m}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{t as h}from"./QInput-k34nCPWg.js";import{t as g}from"./QBtn-CB-yw_iP.js";import{c as _,s as v}from"./index-BNHt6zmP.js";import{n as y}from"./vue-i18n.runtime-CEtihHHL.js";import{r as b}from"./pinia-DO0AdKGg.js";import{n as x,t as S}from"./single-flight-DLCbzLI3.js";import{t as C}from"./access-store-Q8nkv4Nb.js";import{n as w}from"./use-app-theme-B1cdbnHn.js";import{t as T}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as E}from"./QForm-CASiKhGm.js";import{n as D,t as ee}from"./use-countdown-CTag4T13.js";var O={class:`access-page fullscreen flex flex-center q-pa-md`},k={class:`text-h6`},A={key:0,class:`text-caption text-negative`},j={class:`access-page__code text-primary`,"aria-live":`polite`},M={class:`text-caption`},N={key:0,role:`alert`,class:`text-caption text-negative`},P={key:0,role:`alert`,class:`text-warning`},F={key:1,role:`alert`,class:`text-negative q-mt-sm`},I=2e3,L=T(m({__name:`AccessPage`,setup(m){let{t:T}=y(),{isDark:L}=w(),R=C(),{status:z,pairing:B,pairingDeadline:V,mode:H,error:U}=b(R),{registerInterval:W,removeInterval:G}=D(),K=ee(()=>V.value??void 0),q=u(``),J=u(!1),Y=u(``),X=u(!1),Z=u(!1),Q=i(()=>z.value===`pending`),$=S(async()=>{await R.check(),H.value===`app`&&window.location.reload()});async function te(){if(!J.value){J.value=!0,Y.value=``,X.value=!1;try{await R.requestAccess(q.value.trim()||void 0),H.value===`app`&&window.location.reload()}catch(e){Y.value=x(e)}finally{J.value=!1}}}return f(z,e=>{e===`pending`?Z.value=!0:e!==null&&(e===`none`&&Z.value&&(X.value=!0),Z.value=!1)},{immediate:!0}),f(Z,e=>{e?W(()=>void $(),I):G()},{immediate:!0}),n(()=>{Q.value&&$()}),(n,i)=>(t(),o(`div`,O,[s(_,{flat:``,bordered:``,class:`access-page__card`,dark:d(L)},{default:r(()=>[s(v,null,{default:r(()=>[l(`div`,k,e(d(T)(`access.title`)),1)]),_:1}),d(H)===`unavailable`?(t(),p(v,{key:0},{default:r(()=>[l(`p`,null,e(d(T)(`access.unavailable`)),1),d(U)?(t(),o(`p`,A,e(d(U)),1)):a(``,!0),s(g,{color:`primary`,label:d(T)(`access.retry`),onClick:d($)},null,8,[`label`,`onClick`])]),_:1})):Q.value&&d(B)?(t(),p(v,{key:1},{default:r(()=>[l(`p`,null,e(d(T)(`access.pending`)),1),l(`div`,j,e(d(B).code),1),l(`p`,M,e(d(T)(`access.expiresIn`,{time:d(K).label.value})),1),d(U)?(t(),o(`p`,N,e(d(T)(`access.unavailable`))+`: `+e(d(U)),1)):a(``,!0)]),_:1})):(t(),p(v,{key:2},{default:r(()=>[l(`p`,null,e(d(T)(`access.noAccess`)),1),X.value?(t(),o(`p`,P,e(d(T)(`access.ended`)),1)):a(``,!0),s(E,{class:`column q-gutter-sm`,onSubmit:te},{default:r(()=>[s(h,{modelValue:q.value,"onUpdate:modelValue":i[0]||=e=>q.value=e,dense:``,outlined:``,maxlength:d(64),label:d(T)(`access.nameLabel`),disable:J.value,dark:d(L)},null,8,[`modelValue`,`maxlength`,`label`,`disable`,`dark`]),s(g,{color:`primary`,type:`submit`,label:d(T)(`access.request`),loading:J.value},null,8,[`label`,`loading`])]),_:1}),Y.value?(t(),o(`p`,F,e(d(T)(`access.requestFailed`))+`: `+e(Y.value),1)):a(``,!0)]),_:1})),s(v,{class:`text-caption text-grey-7`},{default:r(()=>[c(e(d(T)(`access.httpWarning`)),1)]),_:1})]),_:1},8,[`dark`])]))}}),[[`__scopeId`,`data-v-2ced0245`]]);export{L as default};
@@ -0,0 +1 @@
1
+ .access-page[data-v-2ced0245]{overflow-y:auto}.access-page[data-v-2ced0245] .q-btn,.access-page[data-v-2ced0245] .q-field__control{min-height:44px}.access-page__card[data-v-2ced0245]{width:420px;max-width:100%}.access-page__code[data-v-2ced0245]{font-family:var(--font-mono);letter-spacing:.3em;text-align:center;margin:16px 0;font-size:2.5rem}
@@ -0,0 +1 @@
1
+ import{C as e,F as t,R as n,Y as r,c as i,u as a,v as o,x as s}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{_ as c,m as l,o as u,p as d}from"./use-router-link-Dr9wnnyZ.js";import{t as f}from"./create-B9Tn5Xvi.js";import{l as p}from"./weighted-lru-BSxRnMHR.js";var m=f({name:`QPage`,props:{padding:Boolean,styleFn:Function},setup(t,{slots:n}){let r=d(),a=e(c,l);if(a===l)return console.error(`QPage needs to be a deep child of QLayout`),l;if(e(`_q_pc_`,l)===l)return console.error(`QPage needs to be child of QPageContainer`),l;let o=i(()=>{let e=(a.header.space?a.header.size:0)+(a.footer.space?a.footer.size:0);if(typeof t.styleFn==`function`){let n=a.isContainer.value?a.containerHeight.value:r.screen.height;return t.styleFn(e,n)}return{minHeight:a.isContainer.value?a.containerHeight.value-e+`px`:r.screen.height===0?e===0?`100vh`:`calc(100vh - ${e}px)`:r.screen.height-e+`px`}}),f=i(()=>`q-page${t.padding?` q-layout-padding`:``}`);return()=>s(`main`,{class:f.value,style:o.value},u(n.default))}}),h=o({__name:`AppPage`,setup(e){let i=p();function o(e,t){let n=i.metrics.scale===1&&i.metrics.height>0?Math.min(t,i.metrics.height):t;return{height:`${Math.max(0,n-e)}px`,minHeight:`0px`}}return(e,i)=>(t(),a(m,{"style-fn":o},{default:r(()=>[n(e.$slots,`default`)]),_:3}))}});export{h as t};
@@ -0,0 +1 @@
1
+ import{F as e,T as t,c as n,mt as r,st as i,u as a,v as o}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{t as s}from"./QBtn-CB-yw_iP.js";import{n as c}from"./vue-i18n.runtime-CEtihHHL.js";import{n as l}from"./pinia-DO0AdKGg.js";import{a as u,c as d,i as f,s as p}from"./single-flight-DLCbzLI3.js";function m(e){let{snapshotData:t,...n}=e;return n}var h=l(`active-review`,()=>{let e=i(null),t=i([]),r=i(!1),a=n(()=>{let e=new Map;for(let n of t.value){let t=e.get(n.filePath);t?t.push(n):e.set(n.filePath,[n])}return e});async function o(){r.value=!0;try{let n=(await u(`/api/reviews`)).filter(e=>e.status===`in_progress`).sort((e,t)=>t.createdAt.localeCompare(e.createdAt));e.value=n[0]??null,t.value=e.value?await u(`/api/reviews/${e.value.id}/comments`):[]}finally{r.value=!1}}function s(n){e.value=m(n),t.value=[]}async function c(t){e.value&&(await p(`/api/reviews/${e.value.id}`,{status:t}),await o())}async function l(n){if(!e.value)throw Error(`No active review`);let r=await d(`/api/reviews/${e.value.id}/comments`,n);return t.value=[...t.value,r],r}async function h(e,n){let r=await p(`/api/comments/${e}`,{content:n});t.value=t.value.map(t=>t.id===e?r:t)}async function g(e){await f(`/api/comments/${e}`),t.value=t.value.filter(t=>t.id!==e)}async function _(e){let n=await p(`/api/comments/${e}/resolve`);t.value=t.value.map(t=>t.id===e?n:t)}async function v(e){let n=await p(`/api/comments/${e}/unresolve`);t.value=t.value.map(t=>t.id===e?n:t)}return{activeReview:e,comments:t,loading:r,commentsByFile:a,refresh:o,setActiveReview:s,setStatus:c,createComment:l,editComment:h,deleteComment:g,resolveComment:_,unresolveComment:v}}),g=o({__name:`CancelButton`,setup(n){let{t:i}=c();return(n,o)=>(e(),a(s,t({padding:`2px 8px`},n.$attrs,{dense:``,flat:``,color:`warning`,label:r(i)(`reviews.comments.cancel`)}),null,16,[`label`]))}}),_=o({__name:`CreateButton`,setup(n){let{t:i}=c();return(n,o)=>(e(),a(s,t({padding:`2px 8px`,label:r(i)(`reviews.create.submit`)},n.$attrs,{unelevated:``,dense:``,color:`accent`}),null,16,[`label`]))}});export{m as i,g as n,h as r,_ as t};
@@ -0,0 +1 @@
1
+ .review-create-dialog[data-v-dd3d2128]{width:420px;max-width:90vw}
@@ -0,0 +1 @@
1
+ import{At as e,C as t,F as n,T as r,W as i,X as a,Y as o,c as s,f as c,g as l,l as u,mt as d,r as f,st as p,u as m,v as h,w as g,x as _,y as v}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{O as y,_ as b,m as x,o as S,p as C}from"./use-router-link-Dr9wnnyZ.js";import{t as w}from"./create-B9Tn5Xvi.js";import{t as T}from"./QInput-k34nCPWg.js";import{l as E}from"./QBtn-CB-yw_iP.js";import{c as D,l as O,o as k,s as A}from"./index-BNHt6zmP.js";import{n as j}from"./vue-i18n.runtime-CEtihHHL.js";import{n as M,r as N}from"./pinia-DO0AdKGg.js";import{a as P,c as F,n as I}from"./single-flight-DLCbzLI3.js";import{n as L,o as R}from"./weighted-lru-BSxRnMHR.js";import{t as z}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as B}from"./diff-store-ByxMCKoa.js";import{i as V,n as H,r as U,t as W}from"./CreateButton-D1EtoicG.js";import{t as G}from"./QFab-DPz8RiP0.js";var K=h({__name:`SearchInput`,props:{modelValue:{},modelModifiers:{}},emits:[`update:modelValue`],setup(e){let t=i(e,`modelValue`);return(e,i)=>(n(),m(T,r({modelValue:t.value,"onUpdate:modelValue":i[0]||=e=>t.value=e},e.$attrs,{dense:``,outlined:``,clearable:``}),{prepend:o(()=>[l(E,{name:`search`,size:`xs`})]),_:1},16,[`modelValue`]))}}),q={position:{type:String,default:`bottom-right`,validator:e=>[`top-right`,`top-left`,`bottom-right`,`bottom-left`,`top`,`right`,`bottom`,`left`].includes(e)},offset:{type:Array,validator:e=>e.length===2},expand:Boolean};function J(){let{props:e}=v(),n=C(),r=t(b,x);if(r===x)return console.error(`QPageSticky needs to be child of QLayout`),x;let i=s(()=>{let t=e.position;return{top:t.includes(`top`),right:t.includes(`right`),bottom:t.includes(`bottom`),left:t.includes(`left`),vertical:t===`top`||t===`bottom`,horizontal:t===`left`||t===`right`}}),a=s(()=>r.header.offset),o=s(()=>r.right.offset),c=s(()=>r.footer.offset),l=s(()=>r.left.offset),u=s(()=>{let t=0,r=0,s=i.value,u=n.lang.rtl?-1:1;s.top&&a.value!==0?r=`${a.value}px`:s.bottom&&c.value!==0&&(r=`${-c.value}px`),s.left&&l.value!==0?t=`${u*l.value}px`:s.right&&o.value!==0&&(t=`${-u*o.value}px`);let d={transform:`translate(${t}, ${r})`};return e.offset&&(d.margin=`${e.offset[1]}px ${e.offset[0]}px`),s.vertical?(l.value!==0&&(d[n.lang.rtl?`right`:`left`]=`${l.value}px`),o.value!==0&&(d[n.lang.rtl?`left`:`right`]=`${o.value}px`)):s.horizontal&&(a.value!==0&&(d.top=`${a.value}px`),c.value!==0&&(d.bottom=`${c.value}px`)),d}),d=s(()=>`q-page-sticky row flex-center fixed-${e.position} q-page-sticky--${e.expand?`expand`:`shrink`}`);function f(t){let n=S(t.default);return _(`div`,{class:d.value,style:u.value},e.expand?n:[_(`div`,n)])}return{$layout:r,getStickyContent:f}}var Y=w({name:`QPageSticky`,props:q,setup(e,{slots:t}){let{getStickyContent:n}=J();return()=>n(t)}});function X(e){let t=new URLSearchParams;e.search&&t.set(`search`,e.search),e.createdFrom&&t.set(`createdFrom`,e.createdFrom),e.createdTo&&t.set(`createdTo`,e.createdTo),e.files&&e.files.length>0&&t.set(`files`,e.files.join(`,`));let n=t.toString();return n?`?${n}`:``}var Z=M(`reviews`,()=>{let e=p([]),t=p(!1),n=p(null);async function r(r={}){t.value=!0,n.value=null;try{e.value=await P(`/api/reviews${X(r)}`)}catch(t){e.value=[],n.value=I(t)}finally{t.value=!1}}async function i(t){let n=await F(`/api/reviews`,t);return e.value=[V(n),...e.value],n}return{reviews:e,loading:t,error:n,fetchReviews:r,createReview:i}}),Q={class:`text-h6`},$=z(h({__name:`ReviewCreateDialog`,props:{modelValue:{type:Boolean,required:!0},modelModifiers:{}},emits:g([`created`,`hide`],[`update:modelValue`]),setup(t,{emit:r}){let s=i(t,`modelValue`),c=r,{t:f}=j(),h=Z(),g=p(``),_=p(!1),v=p(null);function b(){g.value=``,_.value=!1,v.value=null}async function x(){_.value=!0,v.value=null;try{let e=g.value.trim(),t=await h.createReview(e?{name:e}:{});s.value=!1,b(),c(`created`,t)}catch(e){v.value=I(e)}finally{_.value=!1}}function S(){b(),c(`hide`)}return(t,r)=>(n(),m(O,{modelValue:s.value,"onUpdate:modelValue":r[1]||=e=>s.value=e,onHide:S},{default:o(()=>[l(D,{class:`review-create-dialog`},{default:o(()=>[l(A,null,{default:o(()=>[u(`div`,Q,e(d(f)(`reviews.create.title`)),1)]),_:1}),l(A,{class:`q-gutter-y-md`},{default:o(()=>[l(T,{modelValue:g.value,"onUpdate:modelValue":r[0]||=e=>g.value=e,dense:``,outlined:``,label:d(f)(`reviews.create.nameLabel`),hint:d(f)(`reviews.create.nameHint`),error:!!v.value,"error-message":v.value??void 0,onKeyup:y(x,[`enter`])},null,8,[`modelValue`,`label`,`hint`,`error`,`error-message`])]),_:1}),l(k,{align:`right`},{default:o(()=>[a(l(H,null,null,512),[[L]]),l(W,{loading:_.value,onClick:x},null,8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]))}}),[[`__scopeId`,`data-v-dd3d2128`]]),ee=h({__name:`CreateReviewFabButton`,emits:[`created`],setup(e,{emit:t}){let r=t,i=U(),u=B(),{activeReview:d}=N(i),{changedPaths:m}=N(u),h=p(!1),g=p(!1),_=p([18,18]),v=p(!1),y=s(()=>m.value.length===0||d.value!==null);function b(e){v.value=e.isFirst!==!0&&e.isFinal!==!0,_.value=[_.value[0]-(e.delta?.x??0),_.value[1]-(e.delta?.y??0)]}function x(e){i.setActiveReview(e),r(`created`,e)}return(e,t)=>(n(),c(f,null,[l(Y,{position:`bottom-right`,offset:_.value},{default:o(()=>[a(l(G,{modelValue:g.value,"onUpdate:modelValue":t[0]||=e=>g.value=e,icon:`add`,color:`accent`,disable:y.value||v.value,onClick:t[1]||=e=>h.value=!0},null,8,[`modelValue`,`disable`]),[[R,b,void 0,{prevent:!0,mouse:!0}]])]),_:1},8,[`offset`]),l($,{modelValue:h.value,"onUpdate:modelValue":t[2]||=e=>h.value=e,onCreated:x,onHide:t[3]||=e=>g.value=!1},null,8,[`modelValue`])],64))}});export{Z as n,K as r,ee as t};
@@ -0,0 +1 @@
1
+ import{F as e,f as t,g as n,l as r}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{t as i}from"./QBtn-CB-yw_iP.js";import{t as a}from"./_plugin-vue_export-helper-BDNMzG2s.js";var o={},s={class:`fullscreen bg-blue text-white text-center q-pa-md flex flex-center`};function c(a,o){return e(),t(`div`,s,[r(`div`,null,[o[0]||=r(`div`,{style:{"font-size":`30vh`}},`404`,-1),o[1]||=r(`div`,{class:`text-h2`,style:{opacity:`0.4`}},`Oops. Nothing here...`,-1),n(i,{class:`q-mt-xl`,color:`white`,"text-color":`blue`,unelevated:``,to:`/`,label:`Go Home`,"no-caps":``})])])}var l=a(o,[[`render`,c]]);export{l as default};
@@ -0,0 +1 @@
1
+ .file-tree-node__icon-section[data-v-ef4a1d44]{min-width:0!important;padding-right:6px!important}.file-tree-node__label[data-v-ef4a1d44]{width:100%;min-width:0}.file-tree-node__chevron[data-v-ef4a1d44]{transition:transform .15s}.file-tree-node__chevron--expanded[data-v-ef4a1d44]{transform:rotate(90deg)}.file-tree-node--selected[data-v-ef4a1d44]{font-weight:500}.file-list-item__icon-section[data-v-3c335b20]{min-width:0!important;padding-right:6px!important}.file-list-item__path-row[data-v-3c335b20]{width:100%;min-width:0}.file-list-item__path-label[data-v-3c335b20]{flex:0 auto;min-width:0}.file-list-item__badge[data-v-3c335b20]{flex:none}.file-list-item--selected[data-v-3c335b20],[data-v-3c335b20] .file-list-item--selected{font-weight:500}.file-list-item__actions[data-v-3c335b20]{gap:2px;flex-direction:row!important;padding:0 0 0 6px!important}.file-list-item__stats[data-v-3c335b20]{padding-right:0!important}.diff-tree-folder-row__icons[data-v-e82c6cd4]{min-width:0!important;padding-right:6px!important}.diff-tree-folder-row__chevron[data-v-e82c6cd4]{transition:transform .15s}.diff-tree-folder-row__chevron--expanded[data-v-e82c6cd4]{transform:rotate(90deg)}.file-list-panel__scroll[data-v-bdc095b7] .q-scrollarea__content{width:100%}.diff-status-bar[data-v-6335a458]{cursor:pointer;gap:4px 16px}.diff-status-bar[data-v-6335a458]:focus-visible{outline:2px solid var(--q-primary);outline-offset:-2px}.diff-status-bar__files[data-v-6335a458]{min-width:0;max-width:100%}.diff-status-bar__lines[data-v-6335a458]{white-space:nowrap}.workspace--narrow .diff-status-bar__files[data-v-6335a458]{flex-basis:100%}.card-shell-placeholder[data-v-39faff44]{border:1px solid #80808033;border-radius:4px}.card-shell-placeholder__title[data-v-39faff44]{background:var(--diff-header-bg);text-overflow:ellipsis;white-space:nowrap;height:44px;padding:6px 12px;overflow:hidden}.active-review-bar[data-v-2b6e4bdd]{min-height:36px}.touch-comment-toolbar[data-v-55ab315b]{border-top:1px solid var(--q-separator-color,#8080804d);flex:none}.diff-scroll-container[data-v-30b76bdf]{min-width:0;min-height:0}.diff-virtual-slot[data-v-30b76bdf]{padding-bottom:8px}.diff-virtual-slot[data-v-30b76bdf] .diff-file-card{margin-bottom:0}
@@ -0,0 +1 @@
1
+ import{At as e,E as t,F as n,G as r,I as i,J as a,L as o,M as s,N as c,Ot as l,W as u,X as d,Y as f,c as p,d as m,f as h,g,h as _,it as v,k as y,kt as b,l as x,lt as S,mt as C,nt as w,pt as T,q as E,r as D,st as O,u as k,v as A,w as j,z as M}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{O as N,k as P}from"./use-router-link-Dr9wnnyZ.js";import{a as F,i as I,l as L,t as R}from"./QBtn-CB-yw_iP.js";import{M as z,a as B,j as V,n as ee}from"./index-BNHt6zmP.js";import{n as H}from"./vue-i18n.runtime-CEtihHHL.js";import{r as U}from"./pinia-DO0AdKGg.js";import{f as te,t as ne}from"./agent-store-D2jgeBgi.js";import{n as re}from"./use-server-events-BrBCbeHu.js";import{c as ie,n as ae,t as oe}from"./QSpace-Di_bZQY6.js";import{r as se,t as ce}from"./use-add-agent-context-BaPUIO93.js";import{r as le}from"./use-virtual-scroll-DG0UKjVk.js";import{d as W,f as G}from"./weighted-lru-BSxRnMHR.js";import{t as K}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{l as q,o as ue,s as J,t as Y,u as de}from"./diff-store-ByxMCKoa.js";import{c as X,l as fe,n as pe,o as Z}from"./use-row-height-DQHVMtUe.js";import{n as me,r as he,t as Q}from"./QVirtualScroll-oGN_Tl5J.js";import{r as $}from"./CreateButton-D1EtoicG.js";import{t as ge}from"./PanelResize-CAQFVc8b.js";import{r as _e,t as ve}from"./CreateReviewFabButton-BxvT3i9e.js";import{C as ye,S as be,T as xe,_ as Se,a as Ce,b as we,c as Te,d as Ee,f as De,g as Oe,h as ke,i as Ae,l as je,m as Me,n as Ne,o as Pe,p as Fe,r as Ie,s as Le,t as Re,u as ze,v as Be,w as Ve,x as He,y as Ue}from"./StatusSwitcher-s9w6iKpR.js";import{t as We}from"./AppPage-oQ9Rz0be.js";var Ge={class:`row items-center no-wrap q-gutter-x-xs`},Ke={class:`row items-center no-wrap q-gutter-x-xs`},qe=A({__name:`FileExplorerTabs`,props:j({stagedFilesLength:{},unstagedFilesLength:{}},{modelValue:{default:`unstaged`},modelModifiers:{}}),emits:[`update:modelValue`],setup(t){let r=u(t,`modelValue`),{t:i}=H();return(a,o)=>(n(),k(me,{modelValue:r.value,"onUpdate:modelValue":o[0]||=e=>r.value=e,dense:``,"no-caps":``,align:`left`,"narrow-indicator":``,class:`text-primary q-mb-sm`},{default:f(()=>[g(he,{name:`unstaged`},{default:f(()=>[x(`div`,Ge,[x(`span`,null,e(C(i)(`changes.unstaged`)),1),g(de,{color:`warning`,rounded:``},{default:f(()=>[_(e(t.unstagedFilesLength),1)]),_:1})])]),_:1}),g(he,{name:`staged`},{default:f(()=>[x(`div`,Ke,[x(`span`,null,e(C(i)(`changes.staged`)),1),g(de,{color:`positive`,rounded:``},{default:f(()=>[_(e(t.stagedFilesLength),1)]),_:1})])]),_:1})]),_:1},8,[`modelValue`]))}}),Je={class:`file-tree-node`},Ye={class:`row items-center no-wrap q-gutter-x-xs`},Xe=[`data-tooltip`],Ze=[`data-tooltip`],Qe={key:2},$e=K(A({__name:`FileTreeNode`,props:{node:{},selectedPath:{},expandedFolders:{},level:{}},emits:[`toggle-folder`,`file-select`],setup(t,{emit:r}){let i=r;return(r,a)=>{let s=M(`FileTreeNode`,!0);return n(),h(`div`,Je,[t.node.type===`directory`?d((n(),k(W,{key:0,clickable:``,dense:``,style:b({paddingLeft:`${C(X)(t.level,!1)}px`}),onClick:a[0]||=e=>i(`toggle-folder`,t.node.path)},{default:f(()=>[g(G,{avatar:``,class:`file-tree-node__icon-section`},{default:f(()=>[x(`div`,Ye,[g(L,{name:`chevron_right`,size:`xs`,class:l([`file-tree-node__chevron`,{"file-tree-node__chevron--expanded":t.expandedFolders.has(t.node.path)}])},null,8,[`class`]),g(L,{name:t.expandedFolders.has(t.node.path)?`folder_open`:`folder`,size:`xs`,color:`warning`},null,8,[`name`])])]),_:1}),g(G,{class:`text-mono`},{default:f(()=>[x(`div`,{class:`ellipsis file-tree-node__label`,"data-tooltip":t.node.path},e(t.node.name),9,Xe)]),_:1}),t.node.children?(n(),k(G,{key:0,side:``,class:`text-caption text-grey-6`},{default:f(()=>[_(e(t.node.children.length),1)]),_:1})):m(``,!0)]),_:1},8,[`style`])),[[I]]):d((n(),k(W,{key:1,clickable:``,dense:``,active:t.node.path===t.selectedPath,"active-class":`file-tree-node--selected`,style:b({paddingLeft:`${C(X)(t.level,!0)}px`}),onClick:a[1]||=e=>i(`file-select`,t.node.path)},{default:f(()=>[g(G,{avatar:``,class:`file-tree-node__icon-section`},{default:f(()=>[g(L,{name:`insert_drive_file`,size:`xs`,color:`grey-6`})]),_:1}),g(G,{class:`text-mono`},{default:f(()=>[x(`div`,{class:`ellipsis file-tree-node__label`,"data-tooltip":t.node.path},e(t.node.name),9,Ze)]),_:1}),t.node.isChanged?(n(),k(G,{key:0,side:``},{default:f(()=>[g(L,{name:`fiber_manual_record`,size:`8px`,color:`warning`})]),_:1})):m(``,!0)]),_:1},8,[`active`,`style`])),[[I]]),t.node.type===`directory`&&t.expandedFolders.has(t.node.path)&&t.node.children?(n(),h(`div`,Qe,[(n(!0),h(D,null,o(t.node.children,e=>(n(),k(s,{key:e.path,node:e,"selected-path":t.selectedPath,"expanded-folders":t.expandedFolders,level:t.level+1,onToggleFolder:a[2]||=e=>i(`toggle-folder`,e),onFileSelect:a[3]||=e=>i(`file-select`,e)},null,8,[`node`,`selected-path`,`expanded-folders`,`level`]))),128))])):m(``,!0)])}}}),[[`__scopeId`,`data-v-ef4a1d44`]]),et={class:`file-list-item__path-row row no-wrap items-center`},tt=[`data-tooltip`],nt={class:`text-caption`},rt={class:`text-positive`},it={class:`text-negative q-ml-xs`},at=K(A({__name:`FileListItem`,props:{file:{},selected:{type:Boolean},source:{},label:{},depth:{}},emits:[`click`],setup(t){let r={added:`A`,modified:`M`,deleted:`D`,renamed:`R`},i={added:`positive`,modified:`warning`,deleted:`negative`,renamed:`purple`},a=t,o=$(),s=p(()=>J(a.file)),c=p(()=>o.commentsByFile.get(s.value)?.length??0);return(a,o)=>d((n(),k(W,{clickable:``,dense:``,class:`file-list-item`,active:t.selected,"active-class":`file-list-item--selected`,"aria-label":t.label===void 0?void 0:s.value,style:b(t.depth===void 0?void 0:{paddingLeft:`${C(X)(t.depth,!0)}px`}),onClick:o[0]||=e=>a.$emit(`click`)},{default:f(()=>[g(G,{avatar:``,class:`file-list-item__icon-section`},{default:f(()=>[x(`span`,{class:l([`text-caption text-weight-bold text-mono`,`text-${i[t.file.status]}`])},e(r[t.file.status]),3)]),_:1}),g(G,{class:`text-mono`},{default:f(()=>[x(`div`,et,[x(`span`,{class:`ellipsis file-list-item__path-label`,"data-tooltip":s.value},e(t.label??s.value),9,tt),c.value>0?(n(),k(Ve,{key:0,compact:``,class:`file-list-item__badge`,count:c.value},null,8,[`count`])):m(``,!0)])]),_:1}),g(G,{side:``,class:`file-list-item__stats`},{default:f(()=>[x(`span`,nt,[x(`span`,rt,`+`+e(t.file.additions),1),x(`span`,it,`-`+e(t.file.deletions),1)])]),_:1}),g(G,{side:``,class:`file-list-item__actions`},{default:f(()=>[g(xe,{path:s.value,source:t.source},null,8,[`path`,`source`])]),_:1})]),_:1},8,[`active`,`aria-label`,`style`])),[[I]])}}),[[`__scopeId`,`data-v-3c335b20`]]),ot=A({__name:`BrowseModeToggle`,props:{modelValue:{type:Boolean,default:!1},modelModifiers:{}},emits:[`update:modelValue`],setup(t){let r=u(t,`modelValue`),{t:i}=H();return(t,a)=>(n(),k(W,null,{default:f(()=>[g(G,null,{default:f(()=>[g(le,null,{default:f(()=>[_(e(C(i)(`browse.toggle`)),1)]),_:1})]),_:1}),g(G,{side:``},{default:f(()=>[g(ee,{modelValue:r.value,"onUpdate:modelValue":a[0]||=e=>r.value=e,dense:``,size:`xs`},null,8,[`modelValue`])]),_:1})]),_:1}))}}),st={class:`row items-center no-wrap q-gutter-x-xs`},ct=[`data-tooltip`],lt=K(A({__name:`DiffTreeFolderRow`,props:{name:{},path:{},depth:{},expanded:{type:Boolean},locked:{type:Boolean}},emits:[`toggle`],setup(t){let{t:r}=H();return(i,a)=>d((n(),k(W,{clickable:!t.locked,dense:``,class:`file-list-item diff-tree-folder-row`,style:b({paddingLeft:`${C(X)(t.depth,!1)}px`}),"aria-expanded":t.locked?void 0:t.expanded,"aria-label":t.locked?void 0:C(r)(`changes.listMode.folder`,{path:t.path}),onClick:a[0]||=e=>i.$emit(`toggle`)},{default:f(()=>[g(G,{avatar:``,class:`diff-tree-folder-row__icons`},{default:f(()=>[x(`div`,st,[g(L,{name:`chevron_right`,size:`xs`,class:l([`diff-tree-folder-row__chevron`,{"diff-tree-folder-row__chevron--expanded":t.expanded,invisible:t.locked}])},null,8,[`class`]),g(L,{name:t.expanded?`folder_open`:`folder`,size:`xs`,color:`warning`},null,8,[`name`])])]),_:1}),g(G,{class:`text-mono`},{default:f(()=>[x(`span`,{class:`ellipsis`,"data-tooltip":t.path},e(t.name),9,ct)]),_:1})]),_:1},8,[`clickable`,`style`,`aria-expanded`,`aria-label`])),[[I,!t.locked]])}}),[[`__scopeId`,`data-v-e82c6cd4`]]),ut={class:`file-list-panel__header q-pa-sm`},dt={key:1,class:`text-subtitle2 q-mb-sm`},ft={key:0,class:`text-primary`},pt={class:`row no-wrap items-center q-gutter-x-xs`},mt={key:0,class:`row justify-center q-pa-lg`},ht={key:0,class:`text-caption text-grey-6 q-px-md q-py-sm`},gt={key:0,class:`text-caption text-grey-6 q-px-md q-py-sm`},_t=32,vt=K(A({__name:`FileListPanel`,setup(t){let{t:r}=H(),{stagedFiles:i,unstagedFiles:a,initialLoading:s,error:c}=U(Y()),l=Z(),{source:u,browseMode:d,filter:v,selectedPath:y,expandedFolders:b,treeInitialLoading:S,treeError:T,filteredDiffFiles:E,diffTreeRows:A,diffListMode:j,filtering:M,filteredTree:N,totalTreeFiles:P}=U(l),I=O(null),L=p(()=>I.value?.getScrollTarget()??null);return(t,p)=>(n(),h(D,null,[x(`div`,ut,[C(d)?(n(),h(`div`,dt,[_(e(C(r)(`browse.allFiles`))+` `,1),C(P)>0||!C(T)?(n(),h(`span`,ft,`(`+e(C(P))+`)`,1)):m(``,!0)])):(n(),k(qe,{key:0,modelValue:C(u),"onUpdate:modelValue":p[0]||=e=>w(u)?u.value=e:null,"staged-files-length":C(i).length,"unstaged-files-length":C(a).length},null,8,[`modelValue`,`staged-files-length`,`unstaged-files-length`])),x(`div`,pt,[g(_e,{modelValue:C(v),"onUpdate:modelValue":p[1]||=e=>w(v)?v.value=e:null,class:`col`,placeholder:C(d)?C(r)(`browse.searchPlaceholder`):C(r)(`changes.filterPlaceholder`)},null,8,[`modelValue`,`placeholder`]),C(d)?m(``,!0):(n(),k(R,{key:0,flat:``,dense:``,round:``,size:`sm`,icon:`account_tree`,color:C(j)===`tree`?`primary`:void 0,"aria-label":C(r)(`changes.listMode.tree`),"aria-pressed":C(j)===`tree`,onClick:p[2]||=e=>j.value=C(j)===`tree`?`list`:`tree`},{default:f(()=>[g(z,{delay:C(500)},{default:f(()=>[_(e(C(r)(`changes.listMode.tree`)),1)]),_:1},8,[`delay`])]),_:1},8,[`color`,`aria-label`,`aria-pressed`]))])]),g(B),g(q,{ref_key:`scrollArea`,ref:I,class:`col file-list-panel__scroll`,"content-style":`padding: 4px 0`,"content-active-style":`padding: 4px 0`},{default:f(()=>[(C(d)?C(S):C(s))?(n(),h(`div`,mt,[g(F,{color:`primary`,size:`2em`})])):C(d)?(n(),h(D,{key:1},[C(N).length===0&&(!C(T)||C(v)&&C(P)>0)?(n(),h(`p`,ht,e(C(v)?C(r)(`browse.noMatchingFiles`):C(r)(`browse.noFiles`)),1)):m(``,!0),(n(!0),h(D,null,o(C(N),e=>(n(),k($e,{key:e.path,node:e,"selected-path":C(y),"expanded-folders":C(b),level:0,onToggleFolder:C(l).toggleFolder,onFileSelect:C(l).selectFile},null,8,[`node`,`selected-path`,`expanded-folders`,`onToggleFolder`,`onFileSelect`]))),128))],64)):(n(),h(D,{key:2},[C(E).length===0&&(C(v)||!C(c))?(n(),h(`p`,gt,e(C(v)?C(r)(`browse.noMatchingFiles`):C(r)(`changes.emptyFileList`)),1)):m(``,!0),L.value&&C(j)===`tree`?(n(),k(Q,{key:`${C(u)}:tree`,"scroll-target":L.value,items:C(A),"virtual-scroll-item-size":_t},{default:f(({item:e})=>[e.kind===`folder`?(n(),k(lt,{key:`d:${e.path}`,name:e.name,path:e.path,depth:e.depth,expanded:e.expanded,locked:C(M),onToggle:t=>C(l).toggleDiffFolder(e.paths)},null,8,[`name`,`path`,`depth`,`expanded`,`locked`,`onToggle`])):(n(),k(at,{key:`f:${e.path}`,file:e.file,label:e.name,depth:e.depth,selected:C(y)===e.path,source:C(u),onClick:t=>C(l).selectFile(e.path)},null,8,[`file`,`label`,`depth`,`selected`,`source`,`onClick`]))]),_:1},8,[`scroll-target`,`items`])):L.value?(n(),k(Q,{key:`${C(u)}:list`,"scroll-target":L.value,items:C(E),"virtual-scroll-item-size":_t},{default:f(({item:e})=>[(n(),k(at,{key:C(J)(e),file:e,selected:C(y)===C(J)(e),source:C(u),onClick:t=>C(l).selectFile(C(J)(e))},null,8,[`file`,`selected`,`source`,`onClick`]))]),_:1},8,[`scroll-target`,`items`])):m(``,!0)],64))]),_:1},512),g(B),g(ot,{modelValue:C(d),"onUpdate:modelValue":p[3]||=e=>w(d)?d.value=e:null},null,8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-bdc095b7`]]),yt=[`wheel`,`pointerdown`,`keydown`,`touchstart`];function bt(e){let n=e.inputTarget??(typeof document>`u`?null:document),r=e.follow??we,i=null,a;function o(){(e.ready===void 0||T(e.ready))&&(i=T(e.request),a?.(),a=void 0)}for(let e of yt)n?.addEventListener(e,o,{capture:!0,passive:!0});let s=E([()=>T(e.request),()=>T(e.list),()=>T(e.root),()=>e.ready===void 0||T(e.ready)],([n,o,s,c],l,u)=>{if(!n||n===i||!o||!s||!c)return;let d=!1,f=!1,p,m=()=>{d=!0,p?.(),p=void 0};a=m,u(()=>{m(),T(e.request)===n&&(f||T(e.list)!==o||T(e.root)!==s)&&(i=n),a===m&&(a=void 0)}),t().then(()=>{d||n===i||e.ready!==void 0&&!T(e.ready)||(f=!0,o.scrollTo(n.index,`start`),p=r({root:s,target:()=>e.target?e.target(n):document.getElementById(`diff-file-${n.path}`)}))})},{immediate:!0,flush:`post`});v(()=>{s(),a?.();for(let e of yt)n?.removeEventListener(e,o,!0)})}var xt=[`aria-label`,`aria-expanded`],St={class:`diff-status-bar__files ellipsis`},Ct={class:`text-weight-medium`},wt={key:0,class:`text-grey-6 q-ml-sm`},Tt={key:1,class:`text-grey-6 q-ml-sm`},Et={key:2,class:`text-grey-6 q-ml-sm`},Dt={key:3,class:`text-grey-6 q-ml-sm`},Ot={class:`diff-status-bar__lines row items-center q-gutter-x-md no-wrap`},kt={class:`text-positive`},At={class:`text-negative`},jt=K(A({__name:`DiffStatusBar`,props:{files:{},anyExpanded:{type:Boolean}},emits:[`toggle-all`],setup(t,{emit:r}){let i=t,a=r,{t:o}=H(),s=p(()=>{let e=i.files.reduce((e,t)=>e+t.additions,0),t=i.files.reduce((e,t)=>e+t.deletions,0),n=i.files.filter(e=>e.status===`added`).length,r=i.files.filter(e=>e.status===`modified`).length,a=i.files.filter(e=>e.status===`deleted`).length,o=i.files.filter(e=>e.status===`renamed`).length;return{total:i.files.length,additions:e,deletions:t,added:n,modified:r,deleted:a,renamed:o}});return(r,i)=>(n(),h(`div`,{class:`diff-status-bar row items-center q-pa-sm text-body2 non-selectable`,role:`button`,tabindex:`0`,"aria-label":C(o)(t.anyExpanded?`changes.collapseAll`:`changes.expandAll`),"aria-expanded":t.anyExpanded,onDblclick:i[0]||=e=>a(`toggle-all`),onKeydown:[i[1]||=N(P(e=>!e.repeat&&a(`toggle-all`),[`prevent`]),[`enter`]),i[2]||=N(P(e=>!e.repeat&&a(`toggle-all`),[`prevent`]),[`space`])]},[x(`div`,St,[x(`span`,Ct,e(C(o)(`changes.filesChanged`,s.value.total))+`:`,1),s.value.added?(n(),h(`span`,wt,e(s.value.added)+` `+e(C(o)(`changes.added`)),1)):m(``,!0),s.value.modified?(n(),h(`span`,Tt,e(s.value.modified)+` `+e(C(o)(`changes.modified`)),1)):m(``,!0),s.value.deleted?(n(),h(`span`,Et,e(s.value.deleted)+` `+e(C(o)(`changes.deletedPlural`)),1)):m(``,!0),s.value.renamed?(n(),h(`span`,Dt,e(s.value.renamed)+` `+e(C(o)(`changes.renamed`)),1)):m(``,!0)]),x(`div`,Ot,[x(`span`,kt,`+`+e(s.value.additions)+` `+e(C(o)(`changes.additions`)),1),x(`span`,At,`-`+e(s.value.deletions)+` `+e(C(o)(`changes.deletions`)),1)]),g(z,{delay:C(500)},{default:f(()=>[_(e(C(o)(t.anyExpanded?`changes.collapseAllHint`:`changes.expandAllHint`)),1)]),_:1},8,[`delay`])],40,xt))}}),[[`__scopeId`,`data-v-6335a458`]]),Mt=6e3,Nt=40;function Pt(e,t,n){let r=S(n(t())?.clientWidth??0),i=p(()=>JSON.stringify([e.version,r.value])),a=Me({get minHeight(){return e.minHeight},get heightOwner(){return e.owner},heightKey:`card-reserve`,get heightVersion(){return i.value},get cacheHeight(){return e.cacheHeight},get keep(){return e.keep},cost:Nt,mountMargin:Mt},t),o;function s(){let e=n(t());e&&(r.value=e.clientWidth,o=ke(e,()=>{r.value=e.clientWidth})),a.start(e)}function c(){a.stop(),o?.(),o=void 0}return v(c),{mounted:a.mounted,height:a.height,start:s,stop:c}}var Ft={key:1,class:`card-shell-placeholder__title text-mono`,"aria-busy":`true`},It=K(A({__name:`ChangesFileCard`,props:{file:{}},setup(t){let i=t,a=Z(),o=Y(),c=$(),{expandedFiles:u}=U(a),{activeReview:d,commentsByFile:f}=U(c),m=p(()=>J(i.file)),g=p(()=>ue(a.source,m.value)),_=p(()=>o.hunksOf(a.source,i.file)),v=p(()=>o.hunksFresh(a.source,i.file)),x=p(()=>o.hunksError(a.source,i.file)),S=p(()=>u.value.has(m.value)),w=p(()=>f.value.get(m.value)),T=p(()=>!!d.value),E=pe(T),D={key:g.value},O=De(`wrap`,()=>je(m.value),D),A=De(`viewMode`,()=>`diff`,D),j=Ee(D),M=ze(D),N=p(()=>A.value===`full`?M.value:j.value),P=p(()=>46+(S.value?Ue(i.file,_.value,E.value)+Be(w.value??[],A.value)+(N.value?90:0):0)),F=p(()=>Se({expanded:S.value,mode:A.value,wrap:O.value,activeReview:T.value,rowHeight:E.value,pending:N.value,comments:w.value})),I=r(`el`),{mounted:L,height:R,start:z,stop:B}=Pt({get minHeight(){return P.value},get owner(){return _.value??i.file},get version(){return F.value},get cacheHeight(){return S.value&&v.value&&A.value===`diff`&&!O.value&&!w.value?.length&&!N.value},get keep(){return!!N.value}},()=>I.value,ye());s(z),y(B);function V(){o.ensureHunks(a.source,i.file)}function ee(){o.retryHunks(a.source,i.file)}return(r,i)=>(n(),h(`div`,{ref_key:`el`,ref:I,class:l({"card-shell-placeholder":!C(L)}),style:b(C(L)?void 0:{height:`${C(R)}px`})},[C(L)?(n(),k(Ne,{key:0,file:t.file,"state-key":g.value,detail:_.value,"hunks-loaded":v.value,"hunks-error":x.value,expanded:S.value,"agent-source":C(a).source,commentable:T.value,"comments-editable":T.value,comments:w.value,onLoadHunks:V,onRetryHunks:ee,onClearHunksError:i[0]||=e=>C(o).clearHunksError(C(a).source,t.file),onToggle:i[1]||=e=>C(a).handleCardToggle(m.value),onExpand:i[2]||=e=>C(a).expandFile(m.value)},null,8,[`file`,`state-key`,`detail`,`hunks-loaded`,`hunks-error`,`expanded`,`agent-source`,`commentable`,`comments-editable`,`comments`])):(n(),h(`div`,Ft,e(m.value),1))],6))}}),[[`__scopeId`,`data-v-39faff44`]]),Lt={key:0,class:`active-review-bar row items-center q-gutter-x-sm q-px-sm no-wrap`},Rt={class:`text-body2 ellipsis`},zt=K(A({__name:`ActiveReviewBar`,setup(t){let{t:r}=H(),i=ie(),a=$(),{activeReview:o}=U(a),s=ne(),c=ce();function l(e){a.setStatus(e).catch(e=>{i(r(`reviews.comments.error`),e)})}return(t,i)=>C(o)?(n(),h(`div`,Lt,[g(L,{name:`rate_review`,size:`18px`,color:`primary`}),x(`span`,Rt,e(C(o).name??C(r)(`reviews.list.unnamed`)),1),g(oe),C(s).enabled?(n(),k(R,{key:0,flat:``,dense:``,"no-caps":``,size:`sm`,icon:C(ae),label:C(r)(`agent.context.addReview`),onClick:i[0]||=e=>C(c)({kind:`review`,reviewId:C(o).id})},null,8,[`icon`,`label`])):m(``,!0),g(Re,{status:C(o).status,onChange:l},null,8,[`status`])])):m(``,!0)}}),[[`__scopeId`,`data-v-2b6e4bdd`]]),Bt=[`aria-label`],Vt={class:`text-caption ellipsis`},Ht={class:`row items-center q-gutter-sm`},Ut=K(A({__name:`TouchCommentToolbar`,props:{path:{},start:{},end:{},confirming:{type:Boolean}},emits:[`confirm`,`cancel`],setup(t,{emit:r}){let i=r,{t:a}=H();return(r,o)=>(n(),h(`div`,{class:`touch-comment-toolbar q-pa-sm`,role:`region`,"aria-label":C(a)(`workspace.selectLines`)},[x(`div`,Vt,e(t.path)+` · `+e(C(a)(`workspace.extendSelection`)),1),x(`div`,Ht,[g(R,{color:`primary`,"no-caps":``,label:C(a)(`workspace.commentRange`,{start:t.start,end:t.end}),loading:t.confirming,onClick:o[0]||=e=>i(`confirm`)},null,8,[`label`,`loading`]),g(R,{flat:``,"no-caps":``,label:C(a)(`workspace.cancelSelection`),onClick:o[1]||=e=>i(`cancel`)},null,8,[`label`])])],8,Bt))}}),[[`__scopeId`,`data-v-55ab315b`]]);function Wt(e){let t=e.follow??we,n,r;function i(){r?.(),r=void 0}function a(t=!1){if(n&&!t)return;let r=T(e.root);if(!r?.clientWidth||!r.clientHeight)return;let i=r.getBoundingClientRect().top,a=[...r.querySelectorAll(`[data-file-path]`)].find(e=>e.getBoundingClientRect().bottom>i);if(!a?.dataset.filePath)return;let o=a.querySelector(`.file-card-frame__header`)?.getBoundingClientRect().height??0,s=[...a.querySelectorAll(`[data-line-key]`)].find(e=>e.getBoundingClientRect().bottom>i+o),c=s??a;n={root:r,path:a.dataset.filePath,line:s?.getAttribute(`data-line-key`)??null,offset:He(r,c),request:T(e.request)}}return E(()=>T(e.active),e=>{e||a(!0),i()},{flush:`sync`}),E(()=>T(e.request),i,{flush:`sync`}),E(()=>T(e.root),()=>{n=void 0,i()},{flush:`sync`}),E(()=>T(e.ready),a=>{if(i(),!a||!T(e.active))return;let o=n;n=void 0,o&&o.root===T(e.root)&&o.request===T(e.request)&&(r=t({root:o.root,offset:o.offset,target:()=>{let e=[...o.root.querySelectorAll(`[data-file-path]`)].find(e=>e.dataset.filePath===o.path);return o.line?[...e?.querySelectorAll(`[data-line-key]`)??[]].find(e=>e.getAttribute(`data-line-key`)===o.line)??null:e??null}}))},{flush:`post`}),V(()=>typeof document>`u`?null:document,[`wheel`,`pointerdown`,`touchstart`,`keydown`],i,{capture:!0,passive:!0}),v(i),{capture:a}}var Gt={key:1,class:`q-pa-md text-grey-6`},Kt={class:`col column diff-scroll-container`},qt=[`data-file-path`],Jt=12,Yt=1.5,Xt=2,Zt=K(A({__name:`DiffPanel`,setup(r){let o=se(),{t:s}=H(),c=Z(),l=Fe(),u=Te({reveal:e=>{c.expandFile(e),c.scrollToFile(e)}});a(()=>{let e=u.selection.value;if(!e)return;let t=l.get(e.cardKey,`viewMode`)??`diff`;(e.cardKey!==ue(c.source,e.path)||t!==e.mode)&&u.cancel(e.cardKey)});let{diffFiles:d}=U(c),{error:_,loading:v}=U(Y()),y=$(),{activeReview:b}=U(y);Oe({create:e=>y.createComment(e),edit:(e,t)=>y.editComment(e,t),remove:e=>y.deleteComment(e),resolve:e=>y.resolveComment(e),unresolve:e=>y.unresolveComment(e)});let S=O(null),w=p(()=>S.value?.getScrollTarget()??null);i(be,()=>w.value);let T=O(null),A=O({width:0,height:0}),j=O(!1),M=Wt({active:o,ready:j,root:w,request:()=>c.scrollRequest});return E([o,A,T],async([e,n,r],i,a)=>{if(j.value=!1,!e||!r||n.width<=0||n.height<=0)return;let o=!0;M.capture(),a(()=>{o=!1}),await t(),o&&(r.refresh(-1),await t(),o&&(j.value=!0))},{flush:`post`}),bt({request:()=>c.scrollRequest,list:T,root:w,ready:j}),E(()=>c.layoutVersion,async()=>{await t(),T.value?.reset()}),E(d,async(e,n)=>{te(e,n,(e,t)=>J(e)===J(t))||(await t(),T.value?.reset())}),(t,r)=>(n(),h(D,null,[C(_)?(n(),k(Pe,{key:0,title:C(s)(`changes.loadError`),message:C(_),loading:C(v),onRetry:r[0]||=e=>C(c).refresh()},null,8,[`title`,`message`,`loading`])):m(``,!0),C(d).length===0&&!C(_)?(n(),h(`div`,Gt,e(C(s)(`changes.emptyDiffPanel`)),1)):C(d).length>0?(n(),h(D,{key:2},[g(zt),C(b)?(n(),k(B,{key:0})):m(``,!0),g(jt,{files:C(d),"any-expanded":C(c).hasExpandedFiles,onToggleAll:C(c).toggleAllFiles},null,8,[`files`,`any-expanded`,`onToggleAll`]),g(B),x(`div`,Kt,[g(fe,{onResize:r[1]||=e=>A.value=e}),g(q,{ref_key:`scrollArea`,ref:S,class:`col sticky-header-scroll`,"content-style":`padding: 8px; width: 100%; max-width: 100%`,"content-active-style":`padding: 8px; width: 100%; max-width: 100%`},{default:f(()=>[w.value?(n(),k(Q,{key:C(c).source,ref_key:`virtualScroll`,ref:T,"scroll-target":w.value,items:C(d),"virtual-scroll-item-size":C(46),"virtual-scroll-slice-size":Jt,"virtual-scroll-slice-ratio-before":Yt,"virtual-scroll-slice-ratio-after":Xt},{default:f(({item:e})=>[(n(),h(`div`,{key:C(J)(e),"data-file-path":C(J)(e),class:`diff-virtual-slot`},[g(It,{file:e},null,8,[`file`])],8,qt))]),_:1},8,[`scroll-target`,`items`,`virtual-scroll-item-size`])):m(``,!0)]),_:1},512)])],64)):m(``,!0),!C(b)&&C(d).length>0?(n(),k(ve,{key:3})):m(``,!0),C(u).selection.value?(n(),k(Ut,{key:4,path:C(u).selection.value.path,start:C(u).selection.value.anchor.startKey,end:C(u).selection.value.anchor.endKey,confirming:C(u).selection.value.phase===`confirming`,onConfirm:C(u).confirm,onCancel:r[2]||=e=>C(u).cancel()},null,8,[`path`,`start`,`end`,`confirming`,`onConfirm`])):m(``,!0)],64))}}),[[`__scopeId`,`data-v-30b76bdf`]]),Qt={key:1,class:`q-pa-md text-grey-6`},$t={key:0,class:`row justify-center q-pa-lg`},en={key:1,class:`q-pa-md text-grey-6`},tn={class:`text-caption`},nn={key:2,class:`q-pa-md text-grey-6`},rn=A({__name:`FileContentPanel`,setup(t){let{t:r}=H(),i=Z(),{selectedPath:a,browseFileLines:o,browseFileIsBinary:s,browseFileLoading:c,browseFileError:l,treeError:u,refreshing:d}=U(i),{error:v}=U(Y()),y=p(()=>v.value?{title:r(`changes.loadError`),message:v.value}:u.value?{title:r(`browse.treeLoadError`),message:u.value}:null),b=O(!1);return E(a,e=>{b.value=e?je(e):!1},{immediate:!0}),(t,u)=>(n(),h(D,null,[y.value?(n(),k(Pe,{key:0,title:y.value.title,message:y.value.message,loading:C(d),onRetry:u[0]||=e=>C(i).refresh()},null,8,[`title`,`message`,`loading`])):m(``,!0),C(a)?(n(),k(Ie,{key:2,class:`col`},{header:f(()=>[g(Ce,{path:C(a)},{default:f(()=>[g(Ae,{modelValue:b.value,"onUpdate:modelValue":u[1]||=e=>b.value=e,path:C(a)},null,8,[`modelValue`,`path`])]),_:1},8,[`path`])]),default:f(()=>[C(c)&&C(o).length===0&&!C(l)?(n(),h(`div`,$t,[g(F,{color:`primary`,size:`2em`})])):C(l)?(n(),h(`div`,en,[_(e(C(r)(`changes.fullFileLoadError`))+` `,1),x(`div`,tn,e(C(l)),1),g(R,{flat:``,dense:``,color:`primary`,class:`q-mt-sm`,label:C(r)(`changes.retry`),loading:C(d),onClick:u[2]||=e=>C(i).refresh()},null,8,[`label`,`loading`])])):C(s)?(n(),h(`div`,nn,e(C(r)(`changes.binaryFile`)),1)):(n(),k(q,{key:3,class:`col`,"content-style":`padding: 8px`,"content-active-style":`padding: 8px`},{default:f(()=>[g(Le,{path:C(a),lines:C(o),wrap:b.value},null,8,[`path`,`lines`,`wrap`])]),_:1}))]),_:1})):(n(),h(`div`,Qt,e(C(r)(`browse.selectFile`)),1))],64))}}),an=A({__name:`FileExplorer`,setup(e){let t=Z(),r=$(),{browseMode:i}=U(t);s(()=>{t.refresh(),r.refresh()});let a=re([`files:changed`],()=>void t.refreshFromServerEvent());c(()=>a.close());let o=re([`review:created`,`review:updated`,`review:deleted`,`comment:created`,`comment:updated`,`comment:deleted`],()=>void r.refresh());return c(()=>o.close()),(e,t)=>(n(),k(ge,null,{panel:f(()=>[g(vt)]),content:f(()=>[C(i)?(n(),k(rn,{key:0})):(n(),k(Zt,{key:1}))]),_:1}))}}),on=A({__name:`IndexPage`,setup(e){return(e,t)=>(n(),k(We,null,{default:f(()=>[g(an)]),_:1}))}});export{on as default};