@tequila99/githuman 0.10.0 → 0.11.2

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 (227) hide show
  1. package/README.md +10 -0
  2. package/dist/server/app.js +2 -0
  3. package/dist/server/routes/project-files.js +90 -0
  4. package/dist/server/services/notes-external-assets.service.js +5 -5
  5. package/dist/server/services/notes-identity.service.js +4 -2
  6. package/dist/server/services/project-files.service.js +144 -0
  7. package/dist/server/services/terminal/tokens.js +1 -1
  8. package/dist/server/utils/remote-asset-request.js +9 -2
  9. package/dist/shared/git/constants.js +2 -0
  10. package/dist/shared/project-files/constants.js +18 -0
  11. package/dist/shared/project-files/schemas.js +35 -0
  12. package/dist/shared/project-files/types.js +1 -0
  13. package/dist/shared/utils/markdown-path.js +4 -0
  14. package/dist/shared/utils/pdf-path.js +4 -0
  15. package/dist/web/assets/AccessPage-CX3w30zw.js +1 -0
  16. package/dist/web/assets/AccessPage-l5Yiiw9T.css +1 -0
  17. package/dist/web/assets/AppPage-PFJG281y.js +1 -0
  18. package/dist/web/assets/CreateButton-Ch0b7juj.js +1 -0
  19. package/dist/web/assets/CreateReviewFabButton-B2Td8Wno.css +1 -0
  20. package/dist/web/assets/CreateReviewFabButton-DTuJzw3q.js +1 -0
  21. package/dist/web/assets/ErrorNotFound-DucDzOUJ.js +1 -0
  22. package/dist/web/assets/IndexPage-D5PvyGrX.css +1 -0
  23. package/dist/web/assets/IndexPage-tgW07Qvs.js +1 -0
  24. package/dist/web/assets/{MainLayout-vDaYlRjL.css → MainLayout-C6yBhQnf.css} +1 -1
  25. package/dist/web/assets/MainLayout-Cw4jpB1x.js +8 -0
  26. package/dist/web/assets/{NoteVisualEditor-IH3s3d3W.css → NoteVisualEditor-CawpxEFB.css} +1 -1
  27. package/dist/web/assets/NoteVisualEditor-DiGhLhQg.js +1054 -0
  28. package/dist/web/assets/NotesPage-CVyVr9tl.js +4 -0
  29. package/dist/web/assets/NotesPage-CxGnZuVQ.css +1 -0
  30. package/dist/web/assets/PanelResize-B6FP9ZVB.js +1 -0
  31. package/dist/web/assets/PanelResize-XjrbOj2S.css +1 -0
  32. package/dist/web/assets/PdfPreview-l_xzsLJ_.css +1 -0
  33. package/dist/web/assets/{PdfPreview-DIgRK8Vh.js → PdfPreview-rlkcqoMF.js} +2 -2
  34. package/dist/web/assets/ProjectFilePage-CkxfX9b1.js +1 -0
  35. package/dist/web/assets/QBtn-CyyV1Bx_.js +1 -0
  36. package/dist/web/assets/QExpansionItem-Dp9lbdVb.js +4 -0
  37. package/dist/web/assets/QFab-LOmZ9rev.js +1 -0
  38. package/dist/web/assets/QForm-Be8-ucuJ.js +1 -0
  39. package/dist/web/assets/QInput-Dq6131uz.js +1 -0
  40. package/dist/web/assets/QSelect-B34OqtIH.js +1 -0
  41. package/dist/web/assets/QSpace-BhOVGpQh.js +1 -0
  42. package/dist/web/assets/QVirtualScroll-BYgJ1Kh2.js +1 -0
  43. package/dist/web/assets/ReviewDetailPage-GNjBa4X0.js +1 -0
  44. package/dist/web/assets/ReviewsPage-An5fRS92.js +1 -0
  45. package/dist/web/assets/{StatusSwitcher-BCv_9MtI.css → StatusSwitcher-D6i8_OfR.css} +1 -1
  46. package/dist/web/assets/StatusSwitcher-DrFHHwGm.js +1 -0
  47. package/dist/web/assets/{TerminalView-C1jFlfLH.css → TerminalView-617DZuPt.css} +1 -1
  48. package/dist/web/assets/TerminalView-D4elkzN4.js +19 -0
  49. package/dist/web/assets/{abnfDiagram-O67JEVCF-BMF1j0ZS.js → abnfDiagram-O67JEVCF-Cugru96L.js} +1 -1
  50. package/dist/web/assets/{access-store-Y2QO4AK-.js → access-store-Cdg8oRAM.js} +1 -1
  51. package/dist/web/assets/agent-store-D_W7iD_B.js +113 -0
  52. package/dist/web/assets/architecture-7GRP2DOG-BPCNj4lR.js +1 -0
  53. package/dist/web/assets/{architectureDiagram-NJMV4G6O-Bz4u-gZC.js → architectureDiagram-NJMV4G6O-7rMsE4Wt.js} +1 -1
  54. package/dist/web/assets/{blockDiagram-BEXU5L5S-qQW37qVK.js → blockDiagram-BEXU5L5S-BvSnwUrI.js} +1 -1
  55. package/dist/web/assets/{c4Diagram-YGBWAQC7-BBwd76CZ.js → c4Diagram-YGBWAQC7-CgmQlCVx.js} +1 -1
  56. package/dist/web/assets/channel-CzRYxuLe.js +1 -0
  57. package/dist/web/assets/{chunk-3FUC2YCW-BnhnfUz2.js → chunk-3FUC2YCW-_i8udThz.js} +1 -1
  58. package/dist/web/assets/{chunk-5DYCD2WN-DdK6RzN0.js → chunk-5DYCD2WN-Mhk2LlLk.js} +1 -1
  59. package/dist/web/assets/{chunk-742MDFTN-e_JaY6d5.js → chunk-742MDFTN-CDVcwgEp.js} +1 -1
  60. package/dist/web/assets/{chunk-7INBJB4K-CQjEZWay.js → chunk-7INBJB4K-C2c1fi9s.js} +1 -1
  61. package/dist/web/assets/{chunk-7M6MHVWA-Dhx8Ycf8.js → chunk-7M6MHVWA-BeGkoIBL.js} +1 -1
  62. package/dist/web/assets/{chunk-7PRAP22T-DDWxOzU1.js → chunk-7PRAP22T-BVWTh9sT.js} +1 -1
  63. package/dist/web/assets/{chunk-GTNCS2PH-B-ZscolZ.js → chunk-GTNCS2PH-gVhX7NZP.js} +1 -1
  64. package/dist/web/assets/{chunk-GWA4HPMP-CboS0KEV.js → chunk-GWA4HPMP-BPdnIcQH.js} +1 -1
  65. package/dist/web/assets/{chunk-MBY4JIJT-CiI_FkjG.js → chunk-MBY4JIJT-B2VfO_06.js} +1 -1
  66. package/dist/web/assets/{chunk-NETBCI7D-D9ennL0_.js → chunk-NETBCI7D-DZF_gITO.js} +1 -1
  67. package/dist/web/assets/{chunk-O7XYJQB3-y25ZXdWk.js → chunk-O7XYJQB3-CDpBWiLq.js} +1 -1
  68. package/dist/web/assets/{chunk-UA2S7LBM-BRHq7OMm.js → chunk-UA2S7LBM-Iv7TSRE_.js} +1 -1
  69. package/dist/web/assets/{chunk-WEXAMYUT-CQu7edQh.js → chunk-WEXAMYUT-Ce6goZ2Y.js} +1 -1
  70. package/dist/web/assets/{chunk-Z7XXMR3K-B3dBNvo3.js → chunk-Z7XXMR3K-CY6E6_Ux.js} +1 -1
  71. package/dist/web/assets/{chunk-ZIGJFQKS-CbyA33sL.js → chunk-ZIGJFQKS-BLzsXZBc.js} +1 -1
  72. package/dist/web/assets/{classDiagram-v2-NBCMYWYE-CgFqOQ8k.js → classDiagram-v2-NBCMYWYE-Dz0kD9P6.js} +1 -1
  73. package/dist/web/assets/create-B9Tn5Xvi.js +1 -0
  74. package/dist/web/assets/{cynefin-OW5HDTMX-DJ9N0QYa.js → cynefin-OW5HDTMX-DWIx3wRm.js} +1 -1
  75. package/dist/web/assets/{cynefinDiagram-VND7K2PF-DIWysrbV.js → cynefinDiagram-VND7K2PF-2D80uocv.js} +1 -1
  76. package/dist/web/assets/{dagre-6A5THRUB-Dt2w_dKa.js → dagre-6A5THRUB-BLBhukn-.js} +1 -1
  77. package/dist/web/assets/devices-store-BfZKPOhg.js +1 -0
  78. package/dist/web/assets/{diagram-22UHCM2B-DYd638CD.js → diagram-22UHCM2B-DY8dMLZ3.js} +1 -1
  79. package/dist/web/assets/{diagram-3UASUU5V-B0a-K-41.js → diagram-3UASUU5V-Bf6Od1NH.js} +1 -1
  80. package/dist/web/assets/{diagram-ATOU4E4O-oH2KoPKR.js → diagram-ATOU4E4O-CjLGcYD5.js} +1 -1
  81. package/dist/web/assets/{diagram-CDSNMT55-B5DGBpGB.js → diagram-CDSNMT55-gIvaVNvs.js} +1 -1
  82. package/dist/web/assets/{diagram-MLGK6HIB-C-bsgsc0.js → diagram-MLGK6HIB-VR5kiCi5.js} +1 -1
  83. package/dist/web/assets/{diagram-MPIPVDR6-BrlKNYLc.js → diagram-MPIPVDR6-CdAdj25I.js} +1 -1
  84. package/dist/web/assets/diff-store-B4adGxC2.js +93 -0
  85. package/dist/web/assets/{dist-Bi2OWZ35.js → dist-BU8erXQF.js} +1 -1
  86. package/dist/web/assets/{dist-B9umI5Mp.js → dist-C54FrSb8.js} +1 -1
  87. package/dist/web/assets/{dist-CxiJzNsC.js → dist-C85t5q3z.js} +1 -1
  88. package/dist/web/assets/{dist-CfIeEdHm.js → dist-CBGyhCYv.js} +1 -1
  89. package/dist/web/assets/{dist-C-lnpukg.js → dist-CEl-Ko94.js} +1 -1
  90. package/dist/web/assets/{dist-B8irqXQ_.js → dist-CIMEaJAX.js} +1 -1
  91. package/dist/web/assets/{dist-Dz9Y2yQi.js → dist-CTd7Kuqx.js} +1 -1
  92. package/dist/web/assets/{dist-DMe9nqcB.js → dist-DLuI1PxH.js} +1 -1
  93. package/dist/web/assets/{dist-Bf4bAu7y.js → dist-joQDFmfy.js} +1 -1
  94. package/dist/web/assets/{dist-Bso6nKGK.js → dist-lgw4kcVA.js} +1 -1
  95. package/dist/web/assets/{dist-CNHlSxJl.js → dist-yzAhvE-V.js} +1 -1
  96. package/dist/web/assets/{ebnfDiagram-ZINNZB2B-BEpTgssQ.js → ebnfDiagram-ZINNZB2B-irTAlMFO.js} +1 -1
  97. package/dist/web/assets/{elk-276RUBZZ-lzj6IMyM.js → elk-276RUBZZ-Dj5ligvC.js} +1 -1
  98. package/dist/web/assets/{erDiagram-OPXOYQCR-CHOMf2bq.js → erDiagram-OPXOYQCR-Bvn6rbL1.js} +1 -1
  99. package/dist/web/assets/eventmodeling-NTZA5JFV-BJsTZ_nG.js +1 -0
  100. package/dist/web/assets/flowDiagram-KWPJA3E3-CvXh1Df7.js +1 -0
  101. package/dist/web/assets/{ganttDiagram-FUAMR5RP-TumKIsrB.js → ganttDiagram-FUAMR5RP-BNGAUF5H.js} +1 -1
  102. package/dist/web/assets/{gitGraph-4MIJSDKK-H-1qnbZy.js → gitGraph-4MIJSDKK-DYSHOl72.js} +1 -1
  103. package/dist/web/assets/{gitGraphDiagram-X574FWY7-DRIXoFhM.js → gitGraphDiagram-X574FWY7-BGwRHrPq.js} +1 -1
  104. package/dist/web/assets/i18n-DnlAcIbT.js +1 -0
  105. package/dist/web/assets/index-Cw7GJi3K.js +2 -0
  106. package/dist/web/assets/index-wsOPzloa.css +1 -0
  107. package/dist/web/assets/{info-A6RAGUB7-W0vgdn7h.js → info-A6RAGUB7-DNWR20pW.js} +1 -1
  108. package/dist/web/assets/{infoDiagram-VRGFBTTK-Dkb5juPW.js → infoDiagram-VRGFBTTK-BhNwJLY5.js} +1 -1
  109. package/dist/web/assets/init-app-cg-B_TFN.js +1 -0
  110. package/dist/web/assets/{is-CE4jkrGQ.js → is-D0waCELe.js} +1 -1
  111. package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-BHH8nvlH.js → ishikawaDiagram-OU5B5YK6-CSkDpn64.js} +1 -1
  112. package/dist/web/assets/{journeyDiagram-ZHPQQLJL-DDyceAFf.js → journeyDiagram-ZHPQQLJL-D2CEecC3.js} +1 -1
  113. package/dist/web/assets/{kanban-definition-PNTS6WVX-DKE8pxuA.js → kanban-definition-PNTS6WVX-CQHlo4Hh.js} +1 -1
  114. package/dist/web/assets/{line-Cw6FtNmb.js → line-C-izH1ks.js} +1 -1
  115. package/dist/web/assets/{markdown-CIA-pqWB.js → markdown-CvtLTiBZ.js} +11 -10
  116. package/dist/web/assets/{mermaid-parser.core-CWHLi3M4.js → mermaid-parser.core-CAGwq6D-.js} +3 -3
  117. package/dist/web/assets/{mermaid.core-DbTjxMTH.js → mermaid.core--xlI_0tK.js} +4 -4
  118. package/dist/web/assets/{mindmap-definition-NLK3R4M7-B3MzGWwm.js → mindmap-definition-NLK3R4M7-BuCxhlwy.js} +1 -1
  119. package/dist/web/assets/{packet-AYTQ26CC-B5qqn_tj.js → packet-AYTQ26CC-Bi7x5lJK.js} +1 -1
  120. package/dist/web/assets/{pegDiagram-GJSIUBJH-DtcoRpgi.js → pegDiagram-GJSIUBJH-qWzBPkCQ.js} +1 -1
  121. package/dist/web/assets/{pie-WAS4IAKB-BP-vRsnM.js → pie-WAS4IAKB-Di0wC4XB.js} +1 -1
  122. package/dist/web/assets/{pieDiagram-5QR66LMP-CYy6L6IC.js → pieDiagram-5QR66LMP-BCDVY9q2.js} +1 -1
  123. package/dist/web/assets/pinia-DO0AdKGg.js +1 -0
  124. package/dist/web/assets/pinia-uOZCmBi-.js +1 -0
  125. package/dist/web/assets/preview-store-DyO8G-ox.js +1 -0
  126. package/dist/web/assets/project-files-store-byqyG2ts.js +1 -0
  127. package/dist/web/assets/{quadrantDiagram-O4NWA36T-Hi2aHxKi.js → quadrantDiagram-O4NWA36T-CpFObUjT.js} +1 -1
  128. package/dist/web/assets/{radar-RG4KPBEZ-BumlhyD5.js → radar-RG4KPBEZ-Br8yH8rq.js} +1 -1
  129. package/dist/web/assets/{railroad-74A4TZTK-CROMzUe6.js → railroad-74A4TZTK-CACSqhA-.js} +1 -1
  130. package/dist/web/assets/railroad-abnf-HS5TGJTU-DTBsRB1c.js +1 -0
  131. package/dist/web/assets/railroad-ebnf-LZEXJU2U-D3mrY4ar.js +1 -0
  132. package/dist/web/assets/railroad-peg-WCYAUIDC-33ZjWX0u.js +1 -0
  133. package/dist/web/assets/{railroadDiagram-XR7U4H2S-De5-oSrU.js → railroadDiagram-XR7U4H2S-sYXRKGK1.js} +1 -1
  134. package/dist/web/assets/render-C7fu7uYY.js +1 -0
  135. package/dist/web/assets/repository-store-DtRDth1L.js +1 -0
  136. package/dist/web/assets/{requirementDiagram-PLB6GJNP-CBqteg6M.js → requirementDiagram-PLB6GJNP-C9I1JbQc.js} +1 -1
  137. package/dist/web/assets/runtime-core.esm-bundler-CAvPiMpd.js +1 -0
  138. package/dist/web/assets/{safe-storage-BACMX75F.js → safe-storage-C76bPypO.js} +1 -1
  139. package/dist/web/assets/{sankeyDiagram-IPEJSGJF-DfKF1Ck-.js → sankeyDiagram-IPEJSGJF-CuvFQhPh.js} +1 -1
  140. package/dist/web/assets/{sequenceDiagram-PO4LG4MO-D-sVWt3S.js → sequenceDiagram-PO4LG4MO-CaVb9Y6e.js} +1 -1
  141. package/dist/web/assets/single-flight-fPyIy7h5.js +1 -0
  142. package/dist/web/assets/{stateDiagram-v2-GCMORJYK-DruoQvcn.js → stateDiagram-v2-GCMORJYK-Dp_APryr.js} +1 -1
  143. package/dist/web/assets/{swimlanes-2SLR337P-BxFZLbJA.js → swimlanes-2SLR337P-FclUI-k0.js} +1 -1
  144. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-CuUvsn0e.js +8 -0
  145. package/dist/web/assets/terminal-store-BnEkXuBj.js +1 -0
  146. package/dist/web/assets/theme-CnbaLamF.js +1 -0
  147. package/dist/web/assets/{timeline-definition-EJHVYXUP-BixIZZx_.js → timeline-definition-EJHVYXUP-BAqwqj3c.js} +1 -1
  148. package/dist/web/assets/{treeView-Q6P3EWNA-Nzi6VzwD.js → treeView-Q6P3EWNA-D87jJbUQ.js} +1 -1
  149. package/dist/web/assets/{treemap-WGGIJYW6-DmAPjB44.js → treemap-WGGIJYW6-B6nhGhRc.js} +1 -1
  150. package/dist/web/assets/uid-B1JNhznI.js +1 -0
  151. package/dist/web/assets/use-add-agent-context-xHAjjOf1.js +1 -0
  152. package/dist/web/assets/use-app-theme-DEowpWRR.js +1 -0
  153. package/dist/web/assets/use-countdown-DlcwwJrs.js +1 -0
  154. package/dist/web/assets/{use-panel-width-DFOmK5Az.js → use-panel-width-CjSWCFr4.js} +1 -1
  155. package/dist/web/assets/use-router-link-CUoYaYUw.js +1 -0
  156. package/dist/web/assets/use-row-height-BsE9-rO2.js +1 -0
  157. package/dist/web/assets/{use-server-events-BrBCbeHu.js → use-server-events-C2X4Xz00.js} +1 -1
  158. package/dist/web/assets/use-virtual-scroll-BAZGswHv.js +1 -0
  159. package/dist/web/assets/use-workspace-navigation-CnebLvBV.js +1 -0
  160. package/dist/web/assets/{usecaseDiagram-POWQR4AR-BlNkvrZH.js → usecaseDiagram-POWQR4AR-7YcIKxAb.js} +1 -1
  161. package/dist/web/assets/{vennDiagram-UO4OBE2U-BFjSeLM4.js → vennDiagram-UO4OBE2U-BZq5cFC4.js} +1 -1
  162. package/dist/web/assets/viewport-store-CCHiY2QG.js +1 -0
  163. package/dist/web/assets/{vue-i18n.runtime-BpRrzZrT.js → vue-i18n.runtime-CEtihHHL.js} +2 -2
  164. package/dist/web/assets/{wardley-WFR3VGLG-DTs7R1tQ.js → wardley-WFR3VGLG-BT8YO9H4.js} +1 -1
  165. package/dist/web/assets/{wardleyDiagram-VNRHLVJA-BNMmP3TU.js → wardleyDiagram-VNRHLVJA-rDpXFf6D.js} +1 -1
  166. package/dist/web/assets/weighted-lru-BGovtJ2a.js +1 -0
  167. package/dist/web/assets/workspace-navigation-DdW0rSGz.js +1 -0
  168. package/dist/web/assets/{xychartDiagram-PMCCYNJV-Bi24Uotp.js → xychartDiagram-PMCCYNJV-ClniUuZc.js} +1 -1
  169. package/dist/web/index.html +10 -8
  170. package/package.json +1 -1
  171. package/dist/web/assets/AccessPage-CAjilkAc.js +0 -1
  172. package/dist/web/assets/AccessPage-DntcW7f8.css +0 -1
  173. package/dist/web/assets/AppPage-DdmqiV2R.js +0 -1
  174. package/dist/web/assets/ClosePopup-p9VBZw3j.js +0 -1
  175. package/dist/web/assets/CreateButton-B7-yiqQx.js +0 -93
  176. package/dist/web/assets/CreateReviewFabButton-BJOAdPG1.js +0 -1
  177. package/dist/web/assets/CreateReviewFabButton-Cufd8hVJ.css +0 -1
  178. package/dist/web/assets/ErrorNotFound-Cq0wNQMu.js +0 -1
  179. package/dist/web/assets/IndexPage-B0itnrts.js +0 -1
  180. package/dist/web/assets/IndexPage-F8MMAAkn.css +0 -1
  181. package/dist/web/assets/MainLayout-CP6Bz7DA.js +0 -6
  182. package/dist/web/assets/NoteVisualEditor-oWUBSuDR.js +0 -1054
  183. package/dist/web/assets/NotesPage-KaCEnfdz.css +0 -1
  184. package/dist/web/assets/NotesPage-Ou5XG64h.js +0 -4
  185. package/dist/web/assets/PanelResize-C51WwwLD.css +0 -1
  186. package/dist/web/assets/PanelResize-D1cRotAi.js +0 -1
  187. package/dist/web/assets/PdfPreview-Cb0xawi0.css +0 -1
  188. package/dist/web/assets/QBtn-DoggJe1Q.js +0 -1
  189. package/dist/web/assets/QExpansionItem-BouBPgdb.js +0 -4
  190. package/dist/web/assets/QFab-B5iz2kQR.js +0 -1
  191. package/dist/web/assets/QForm-tsecXm87.js +0 -1
  192. package/dist/web/assets/QInput-DJgTh2Qy.js +0 -1
  193. package/dist/web/assets/QResizeObserver-gIKjGVQ7.js +0 -1
  194. package/dist/web/assets/QScrollArea-BrOkfO1I.js +0 -1
  195. package/dist/web/assets/QSelect-B5EBNlJ4.js +0 -1
  196. package/dist/web/assets/QSpace-CqqgY-zX.js +0 -1
  197. package/dist/web/assets/QVirtualScroll-BoXSHM25.js +0 -1
  198. package/dist/web/assets/ReviewDetailPage-C3NBR_xR.js +0 -1
  199. package/dist/web/assets/ReviewsPage-Bkinx_Bm.js +0 -1
  200. package/dist/web/assets/StatusSwitcher-8QUHj5Rq.js +0 -1
  201. package/dist/web/assets/TerminalView-elu1dIYU.js +0 -19
  202. package/dist/web/assets/agent-store-1i-UjEzZ.js +0 -113
  203. package/dist/web/assets/architecture-7GRP2DOG-DcZ4-ijA.js +0 -1
  204. package/dist/web/assets/channel-Cgf35HIt.js +0 -1
  205. package/dist/web/assets/create-BSmXD9Zr.js +0 -1
  206. package/dist/web/assets/devices-store-CtEl_8An.js +0 -1
  207. package/dist/web/assets/eventmodeling-NTZA5JFV-CyXHXiX_.js +0 -1
  208. package/dist/web/assets/flowDiagram-KWPJA3E3-C4espOge.js +0 -1
  209. package/dist/web/assets/i18n-xttkoi4H.js +0 -1
  210. package/dist/web/assets/index-BQi8n0xV.js +0 -2
  211. package/dist/web/assets/index-Dma-RXBR.css +0 -1
  212. package/dist/web/assets/init-app-DlPQG9dK.js +0 -1
  213. package/dist/web/assets/pinia-CJGnEjj3.js +0 -1
  214. package/dist/web/assets/pinia-DCsnCHsH.js +0 -1
  215. package/dist/web/assets/railroad-abnf-HS5TGJTU-C5G3FxcO.js +0 -1
  216. package/dist/web/assets/railroad-ebnf-LZEXJU2U-BrTMLAtv.js +0 -1
  217. package/dist/web/assets/railroad-peg-WCYAUIDC-CXVDExl0.js +0 -1
  218. package/dist/web/assets/runtime-core.esm-bundler-BKFI1w28.js +0 -1
  219. package/dist/web/assets/single-flight-DLCbzLI3.js +0 -1
  220. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-C3zKO6Gm.js +0 -8
  221. package/dist/web/assets/theme-B01ZDSW1.js +0 -1
  222. package/dist/web/assets/use-add-agent-context-BE_z8acF.js +0 -1
  223. package/dist/web/assets/use-app-theme-C1KrIJLx.js +0 -1
  224. package/dist/web/assets/use-countdown-2uTxlnFE.js +0 -1
  225. package/dist/web/assets/use-router-link-BGc0noIO.js +0 -1
  226. package/dist/web/assets/use-virtual-scroll-BSXYZjZ5.js +0 -1
  227. package/dist/web/assets/window-store-CIFm3O3S.js +0 -1
package/README.md CHANGED
@@ -66,6 +66,16 @@ node dist/cli/index.js list --status in_progress # список ре
66
66
  node dist/cli/index.js export last --format markdown -o review.md
67
67
  ```
68
68
 
69
+ ### Браузерная совместимость
70
+
71
+ Production JS и CSS собираются с целью Chrome 103 и новее; для остальных
72
+ браузеров цели — Edge 111, Firefox 114, Safari/iOS 16.4. Мобильная компоновка,
73
+ Notes и терминал проверены в Chrome 103 на Android 13 в эмуляторе.
74
+ Цель сборки не добавляет полифилы всех браузерных API: отдельные возможности
75
+ (например, fullscreen) зависят от поддержки браузером. CSS Quasar и редактора
76
+ заметок (Milkdown) использует `:has()` и `dvh`; в Chrome до 105/108 эти правила
77
+ пропускаются, и меняется только оформление отдельных элементов.
78
+
69
79
  ### Доступ из локальной сети
70
80
 
71
81
  `--host` принимает `localhost` (по умолчанию), `127.0.0.1`, `::1`, а для
@@ -21,6 +21,7 @@ import fastifySseImport from '@fastify/sse';
21
21
  import { healthRoutes } from "./routes/health.js";
22
22
  import { appInfoRoutes } from "./routes/app-info.js";
23
23
  import { diffRoutes } from "./routes/diff.js";
24
+ import { projectFileRoutes } from "./routes/project-files.js";
24
25
  import { gitRoutes } from "./routes/git.js";
25
26
  import { reviewRoutes } from "./routes/reviews.js";
26
27
  import { commentRoutes } from "./routes/comments.js";
@@ -121,6 +122,7 @@ export function buildApp(options = {}) {
121
122
  }
122
123
  app.register(diffRoutes, { repositoryPath });
123
124
  app.register(gitRoutes, { repositoryPath });
125
+ app.register(projectFileRoutes, { repositoryPath });
124
126
  app.register(reviewRoutes, { repositoryPath, db, eventBus });
125
127
  app.register(commentRoutes, { db, eventBus });
126
128
  app.register(exportRoutes, { db, repositoryPath });
@@ -0,0 +1,90 @@
1
+ import { Server as HttpsServer } from 'node:https';
2
+ import { Readable } from 'node:stream';
3
+ import { Type } from '@sinclair/typebox';
4
+ import { ProjectFilesService } from "../services/project-files.service.js";
5
+ import { BadRequestError } from "../errors/http.js";
6
+ import { ProjectFileQuery, ProjectFileContentQuery, ProjectFileMetadataSchema, ProjectFileContextSchema } from "../../shared/project-files/schemas.js";
7
+ import { PROJECT_DOWNLOAD_MIME } from "../../shared/project-files/constants.js";
8
+ import { ERROR_RESPONSES } from "../../shared/http/schemas.js";
9
+ // Hosts that a browser on this machine uses to reach the server.
10
+ const LOOPBACK_HOSTS = ['localhost', '127.0.0.1', '[::1]'];
11
+ // File name that old clients show when they ignore the UTF-8 file name.
12
+ const FALLBACK_FILE_NAME = 'download';
13
+ // Characters that encodeURIComponent keeps but RFC 5987 does not allow.
14
+ const RFC5987_RESERVED_PATTERN = /['()*]/g;
15
+ // OpenAPI groups file access separately from Git history.
16
+ const TAGS = ['project-files'];
17
+ function contentDisposition(name, download) {
18
+ const encoded = encodeURIComponent(name).replace(RFC5987_RESERVED_PATTERN, char => '%' + char.charCodeAt(0).toString(16));
19
+ return `${download ? 'attachment' : 'inline'}; filename="${FALLBACK_FILE_NAME}"; filename*=UTF-8''${encoded}`;
20
+ }
21
+ export async function projectFileRoutes(app, options) {
22
+ const service = new ProjectFilesService(options.repositoryPath);
23
+ const typed = app.withTypeProvider();
24
+ typed.get('/api/project-files/context', {
25
+ schema: {
26
+ tags: TAGS,
27
+ summary: 'Trusted file-link origins',
28
+ response: { 200: ProjectFileContextSchema, ...ERROR_RESPONSES }
29
+ }
30
+ }, async () => {
31
+ const address = app.server.address();
32
+ const origins = address && typeof address !== 'string'
33
+ ? LOOPBACK_HOSTS.map(host => `${app.server instanceof HttpsServer ? 'https' : 'http'}://${host}:${address.port}`)
34
+ : [];
35
+ return { origins };
36
+ });
37
+ typed.get('/api/project-files/metadata', {
38
+ schema: {
39
+ tags: TAGS,
40
+ summary: 'Inspect a project file',
41
+ querystring: ProjectFileQuery,
42
+ response: { 200: ProjectFileMetadataSchema, ...ERROR_RESPONSES }
43
+ }
44
+ }, async (request) => {
45
+ const { file, metadata } = await service.open(request.query.path);
46
+ await file.close();
47
+ return metadata;
48
+ });
49
+ app.get('/api/project-files/content', {
50
+ schema: {
51
+ tags: TAGS,
52
+ summary: 'Read or download a project file',
53
+ querystring: ProjectFileContentQuery,
54
+ response: {
55
+ 200: Type.String({ format: 'binary', description: 'File bytes.' }),
56
+ ...ERROR_RESPONSES
57
+ }
58
+ }
59
+ }, async (request, reply) => {
60
+ const { file, metadata, limit } = await service.open(request.query.path);
61
+ const download = request.query.download === true;
62
+ if (!download && !metadata.previewable) {
63
+ await file.close();
64
+ throw new BadRequestError('File cannot be previewed; download it instead');
65
+ }
66
+ reply.header('X-Content-Type-Options', 'nosniff');
67
+ reply.header('Cache-Control', 'no-store');
68
+ reply.header('Content-Disposition', contentDisposition(metadata.name, download));
69
+ reply.type(download ? PROJECT_DOWNLOAD_MIME : metadata.mime);
70
+ const source = file.createReadStream({ start: 0 });
71
+ const stream = Readable.from((async function* () {
72
+ let bytes = 0;
73
+ for await (const chunk of source) {
74
+ bytes += chunk.length;
75
+ if (!download && bytes > limit) {
76
+ throw new BadRequestError('File grew beyond the preview limit');
77
+ }
78
+ yield chunk;
79
+ }
80
+ })());
81
+ // Fastify owns stream errors; a disconnected client stops disk reads.
82
+ const close = () => {
83
+ stream.destroy();
84
+ source.destroy();
85
+ };
86
+ reply.raw.once('close', close);
87
+ stream.once('close', () => reply.raw.removeListener('close', close));
88
+ return reply.send(stream);
89
+ });
90
+ }
@@ -1,7 +1,7 @@
1
1
  import PQueue from 'p-queue';
2
2
  import { BadRequestError } from "../errors/http.js";
3
3
  import { NoteAssetLimitError, NoteAssetQueueError } from "../errors/note-assets.js";
4
- import { remoteAssetRequest, translateRemoteAssetError } from "../utils/remote-asset-request.js";
4
+ import { destroyRemoteAssetResponse, remoteAssetRequest, translateRemoteAssetError } from "../utils/remote-asset-request.js";
5
5
  import { detectNoteAssetFormat } from "../utils/note-asset-format.js";
6
6
  import { MAX_NOTE_ASSET_BYTES, NOTE_PDF_WARNING_BYTES } from "../../shared/notes/constants.js";
7
7
  import { maxNoteAssetBytes } from "../../shared/notes/asset-formats.js";
@@ -26,7 +26,7 @@ async function* boundedChunks(source, limit, counter, signal, message) {
26
26
  }
27
27
  }
28
28
  function isSuccess(response) {
29
- return (!!response.statusCode &&
29
+ return (response.statusCode !== undefined &&
30
30
  response.statusCode >= 200 &&
31
31
  response.statusCode < 300);
32
32
  }
@@ -61,7 +61,7 @@ export class NotesExternalAssetsService {
61
61
  };
62
62
  }
63
63
  finally {
64
- response.destroy();
64
+ destroyRemoteAssetResponse(response);
65
65
  }
66
66
  });
67
67
  }
@@ -137,7 +137,7 @@ export class NotesExternalAssetsService {
137
137
  }
138
138
  }
139
139
  finally {
140
- response.destroy();
140
+ destroyRemoteAssetResponse(response);
141
141
  }
142
142
  });
143
143
  }
@@ -161,7 +161,7 @@ export class NotesExternalAssetsService {
161
161
  return { body, mime: format.mime };
162
162
  }
163
163
  finally {
164
- response.destroy();
164
+ destroyRemoteAssetResponse(response);
165
165
  }
166
166
  });
167
167
  }
@@ -444,7 +444,9 @@ export class NotesIdentityService {
444
444
  !source.deletedAt &&
445
445
  this.catalog
446
446
  .links(source.id)
447
- .some(link => !!link.targetId && this.record(link.targetId).id === note.id));
447
+ .some(link => link.targetId !== null &&
448
+ link.targetId !== '' &&
449
+ this.record(link.targetId).id === note.id));
448
450
  return { note, backlinks };
449
451
  });
450
452
  }
@@ -742,7 +744,7 @@ export class NotesIdentityService {
742
744
  (() => {
743
745
  const target = referenceTarget(ref, source.path, paths);
744
746
  const clicked = referenceTarget({ ...ref, format: 'markdown', href }, source.path, paths);
745
- return (!!target &&
747
+ return (target !== null &&
746
748
  target.path === clicked?.path &&
747
749
  target.anchor === clicked.anchor);
748
750
  })()));
@@ -0,0 +1,144 @@
1
+ import { open, realpath, stat } from 'node:fs/promises';
2
+ import { constants } from 'node:fs';
3
+ import { basename, isAbsolute } from 'node:path';
4
+ import { fileTypeFromBuffer } from 'file-type';
5
+ import { BadRequestError, ForbiddenError, NotFoundError } from "../errors/http.js";
6
+ import { resolveWithinRepo } from "./git.service.js";
7
+ import { isMissingPathError } from "../utils/system-error.js";
8
+ import { decodeText } from "../utils/text.js";
9
+ import { isMarkdownPath } from "../../shared/utils/markdown-path.js";
10
+ import { PROJECT_DOWNLOAD_MIME, PROJECT_IMAGE_LIMIT, PROJECT_PDF_LIMIT, PROJECT_TEXT_LIMIT } from "../../shared/project-files/constants.js";
11
+ // A small prefix identifies preview formats without reading the complete file.
12
+ const PREFIX_BYTES = 8192;
13
+ // A backslash or a control character cannot be part of a project path.
14
+ const UNSAFE_PATH_PATTERN = /[\\\p{Cc}]/u;
15
+ // Documents that can run scripts. They are never previewed, only downloaded.
16
+ const ACTIVE_DOCUMENT_PATTERN = /\.(html?|svg|xhtml)$/i;
17
+ // Linux resolves an open file descriptor to the real path of its file.
18
+ const PROC_FD_DIR = '/proc/self/fd';
19
+ // MIME type of a previewed text file.
20
+ const TEXT_MIME = 'text/plain; charset=utf-8';
21
+ // Only passive raster formats can use the image viewer.
22
+ const IMAGE_MIMES = new Set([
23
+ 'image/png',
24
+ 'image/jpeg',
25
+ 'image/gif',
26
+ 'image/webp',
27
+ 'image/avif',
28
+ 'image/bmp',
29
+ 'image/x-icon'
30
+ ]);
31
+ export class ProjectFilesService {
32
+ repositoryPath;
33
+ constructor(repositoryPath) {
34
+ this.repositoryPath = repositoryPath;
35
+ }
36
+ // A file above the preview limit is never previewed, so its prefix is enough.
37
+ isPrefixText(prefix) {
38
+ try {
39
+ return !new TextDecoder('utf-8', { fatal: true })
40
+ .decode(prefix, { stream: true })
41
+ .includes('\0');
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }
47
+ // Reads the rest of a small file so that NUL or bad UTF-8 after the prefix is found.
48
+ async isWholeFileText(file, prefix, size) {
49
+ const whole = Buffer.alloc(size);
50
+ prefix.copy(whole);
51
+ let offset = prefix.length;
52
+ while (offset < size) {
53
+ const { bytesRead } = await file.read(whole, offset, size - offset, offset);
54
+ if (bytesRead === 0) {
55
+ throw new ForbiddenError('File changed while opening');
56
+ }
57
+ offset += bytesRead;
58
+ }
59
+ return decodeText(whole) !== null;
60
+ }
61
+ async open(path) {
62
+ if (isAbsolute(path) || UNSAFE_PATH_PATTERN.test(path)) {
63
+ throw new BadRequestError('Invalid project file path');
64
+ }
65
+ let file;
66
+ try {
67
+ const root = await realpath(this.repositoryPath);
68
+ let target;
69
+ try {
70
+ target = await realpath(resolveWithinRepo(root, path));
71
+ resolveWithinRepo(root, target);
72
+ }
73
+ catch (error) {
74
+ if (isMissingPathError(error))
75
+ throw error;
76
+ throw new ForbiddenError('File leaves the repository');
77
+ }
78
+ const before = await stat(target);
79
+ if (!before.isFile()) {
80
+ throw new BadRequestError('Project path is not a regular file');
81
+ }
82
+ file = await open(target, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
83
+ const info = await file.stat();
84
+ if (!info.isFile() ||
85
+ info.dev !== before.dev ||
86
+ info.ino !== before.ino) {
87
+ throw new ForbiddenError('File changed while opening');
88
+ }
89
+ const opened = await realpath(process.platform === 'linux' ? `${PROC_FD_DIR}/${file.fd}` : target);
90
+ try {
91
+ resolveWithinRepo(root, opened);
92
+ }
93
+ catch {
94
+ throw new ForbiddenError('File leaves the repository');
95
+ }
96
+ const prefix = Buffer.alloc(Math.min(info.size, PREFIX_BYTES));
97
+ const { bytesRead } = await file.read(prefix, 0, prefix.length, 0);
98
+ if (bytesRead !== prefix.length) {
99
+ throw new ForbiddenError('File changed while opening');
100
+ }
101
+ const detected = await fileTypeFromBuffer(prefix).catch(() => undefined);
102
+ let kind = 'download';
103
+ let mime = PROJECT_DOWNLOAD_MIME;
104
+ let limit = 0;
105
+ if (detected?.mime === 'application/pdf') {
106
+ kind = 'pdf';
107
+ mime = detected.mime;
108
+ limit = PROJECT_PDF_LIMIT;
109
+ }
110
+ else if (detected && IMAGE_MIMES.has(detected.mime)) {
111
+ kind = 'image';
112
+ mime = detected.mime;
113
+ limit = PROJECT_IMAGE_LIMIT;
114
+ }
115
+ else if (!detected &&
116
+ !ACTIVE_DOCUMENT_PATTERN.test(path) &&
117
+ (info.size <= PROJECT_TEXT_LIMIT
118
+ ? await this.isWholeFileText(file, prefix, info.size)
119
+ : this.isPrefixText(prefix))) {
120
+ kind = isMarkdownPath(path) ? 'markdown' : 'text';
121
+ mime = TEXT_MIME;
122
+ limit = PROJECT_TEXT_LIMIT;
123
+ }
124
+ return {
125
+ file,
126
+ metadata: {
127
+ name: basename(path),
128
+ size: info.size,
129
+ kind,
130
+ mime,
131
+ previewable: kind !== 'download' && info.size <= limit
132
+ },
133
+ limit
134
+ };
135
+ }
136
+ catch (error) {
137
+ await file?.close();
138
+ if (isMissingPathError(error)) {
139
+ throw new NotFoundError('Project file was deleted or moved');
140
+ }
141
+ throw error;
142
+ }
143
+ }
144
+ }
@@ -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) {
@@ -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,2 @@
1
+ // Pseudo ref for the files on disk. Git has no such ref: the app reads them directly.
2
+ export const WORKTREE_REF = 'WORKTREE';
@@ -0,0 +1,18 @@
1
+ // Preview buffers must remain bounded independently of download sizes.
2
+ export const PROJECT_TEXT_LIMIT = 2_000_000;
3
+ // Match the existing image preview budget.
4
+ export const PROJECT_IMAGE_LIMIT = 10_000_000;
5
+ // Match the existing PDF preview budget.
6
+ export const PROJECT_PDF_LIMIT = 100_000_000;
7
+ // A download is buffered in memory by the browser, so it has an upper bound.
8
+ export const PROJECT_DOWNLOAD_LIMIT = 100_000_000;
9
+ // The longest repository-relative path that the API accepts.
10
+ export const MAX_PROJECT_PATH_LENGTH = 4096;
11
+ // The app route that opens a project file. Markdown links point to it.
12
+ export const PROJECT_FILE_ROUTE = '/files/open';
13
+ // The query that marks a link that cannot open. The link renders as an error.
14
+ export const PROJECT_FILE_INVALID_QUERY = 'invalid=true';
15
+ // A file: link. The default Markdown link validation rejects it.
16
+ export const FILE_URI_PATTERN = /^file:\/\//i;
17
+ // MIME type of a file that has no preview. A download uses it for every file.
18
+ export const PROJECT_DOWNLOAD_MIME = 'application/octet-stream';
@@ -0,0 +1,35 @@
1
+ import { Type } from '@sinclair/typebox';
2
+ import { MAX_PROJECT_PATH_LENGTH } from "./constants.js";
3
+ export const ProjectFileQuery = Type.Object({
4
+ path: Type.String({
5
+ minLength: 1,
6
+ maxLength: MAX_PROJECT_PATH_LENGTH,
7
+ description: 'Repository-relative WORKTREE file path.'
8
+ })
9
+ });
10
+ export const ProjectFileContentQuery = Type.Object({
11
+ ...ProjectFileQuery.properties,
12
+ download: Type.Optional(Type.Boolean({
13
+ description: 'Send an attachment without the preview size limit.'
14
+ }))
15
+ });
16
+ export const ProjectFileMetadataSchema = Type.Object({
17
+ name: Type.String({ description: 'File basename.' }),
18
+ size: Type.Number({ description: 'Current file size in bytes.' }),
19
+ kind: Type.Union([
20
+ Type.Literal('markdown'),
21
+ Type.Literal('text'),
22
+ Type.Literal('image'),
23
+ Type.Literal('pdf'),
24
+ Type.Literal('download')
25
+ ], { description: 'Supported preview, or download only.' }),
26
+ mime: Type.String({ description: 'Validated preview MIME type.' }),
27
+ previewable: Type.Boolean({
28
+ description: 'The file fits the preview budget.'
29
+ })
30
+ }, { description: 'Current WORKTREE file metadata.' });
31
+ export const ProjectFileContextSchema = Type.Object({
32
+ origins: Type.Array(Type.String(), {
33
+ description: 'Trusted loopback origins of this server instance.'
34
+ })
35
+ }, { description: 'File-link context for this server.' });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ /** True for a path that names a Markdown file. */
2
+ export function isMarkdownPath(path) {
3
+ return /\.(md|markdown)$/i.test(path);
4
+ }
@@ -0,0 +1,4 @@
1
+ /** True for a path that names a PDF file. */
2
+ export function isPdfPath(path) {
3
+ return /\.pdf$/i.test(path);
4
+ }
@@ -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-Dq6131uz.js";import{t as g}from"./QBtn-CyyV1Bx_.js";import{c as _,s as v}from"./index-Cw7GJi3K.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-fPyIy7h5.js";import{t as C}from"./access-store-Cdg8oRAM.js";import{n as w}from"./use-app-theme-DEowpWRR.js";import{t as T}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as E}from"./QForm-Be8-ucuJ.js";import{n as D,t as ee}from"./use-countdown-DlcwwJrs.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{t as c}from"./create-B9Tn5Xvi.js";import{a as l,l as u,o as d,r as f}from"./render-C7fu7uYY.js";import{t as p}from"./viewport-store-CCHiY2QG.js";var m=c({name:`QPage`,props:{padding:Boolean,styleFn:Function},setup(t,{slots:n}){let r=l(),a=e(u,d);if(a===d)return console.error(`QPage needs to be a deep child of QLayout`),d;if(e(`_q_pc_`,d)===d)return console.error(`QPage needs to be child of QPageContainer`),d;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`}}),c=i(()=>`q-page${t.padding?` q-layout-padding`:``}`);return()=>s(`main`,{class:c.value,style:o.value},f(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-CyyV1Bx_.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,l as p}from"./single-flight-fPyIy7h5.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 d(`/api/reviews/${e.value.id}`,{status:t}),await o())}async function l(n){if(!e.value)throw Error(`No active review`);let r=await p(`/api/reviews/${e.value.id}/comments`,n);return t.value=[...t.value,r],r}async function h(e,n){let r=await d(`/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 d(`/api/comments/${e}/resolve`);t.value=t.value.map(t=>t.id===e?n:t)}async function v(e){let n=await d(`/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{g as y}from"./use-router-link-CUoYaYUw.js";import{t as b}from"./create-B9Tn5Xvi.js";import{a as x,l as S,o as C,r as w}from"./render-C7fu7uYY.js";import{t as T}from"./QInput-Dq6131uz.js";import{l as E}from"./QBtn-CyyV1Bx_.js";import{c as D,l as O,o as k,s as A}from"./index-Cw7GJi3K.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,l as F,n as I}from"./single-flight-fPyIy7h5.js";import{n as L,o as R}from"./weighted-lru-BGovtJ2a.js";import{t as z}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as B}from"./diff-store-B4adGxC2.js";import{i as V,n as H,r as U,t as W}from"./CreateButton-Ch0b7juj.js";import{t as G}from"./QFab-LOmZ9rev.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=x(),r=t(S,C);if(r===C)return console.error(`QPageSticky needs to be child of QLayout`),C;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=w(t.default);return _(`div`,{class:d.value,style:u.value},e.expand?n:[_(`div`,n)])}return{$layout:r,getStickyContent:f}}var Y=b({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-CyyV1Bx_.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{_ as N,g as P}from"./use-router-link-CUoYaYUw.js";import{a as F,i as I,l as L,t as R}from"./QBtn-CyyV1Bx_.js";import{M as z,a as B,j as V,n as ee}from"./index-Cw7GJi3K.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-D_W7iD_B.js";import{n as re}from"./use-server-events-C2X4Xz00.js";import{c as ie,n as ae,t as oe}from"./QSpace-BhOVGpQh.js";import{r as se,t as ce}from"./use-add-agent-context-xHAjjOf1.js";import{r as le}from"./use-virtual-scroll-BAZGswHv.js";import{d as W,u as G}from"./weighted-lru-BGovtJ2a.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-B4adGxC2.js";import{n as fe,r as pe,t as X}from"./QVirtualScroll-BYgJ1Kh2.js";import{c as Z,l as me,n as he,o as Q}from"./use-row-height-BsE9-rO2.js";import{r as $}from"./CreateButton-Ch0b7juj.js";import{t as ge}from"./PanelResize-B6FP9ZVB.js";import{r as _e,t as ve}from"./CreateReviewFabButton-DTuJzw3q.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-DrFHHwGm.js";import{t as We}from"./AppPage-PFJG281y.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(fe,{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(pe,{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(pe,{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(G,{key:0,clickable:``,dense:``,style:b({paddingLeft:`${C(Z)(t.level,!1)}px`}),onClick:a[0]||=e=>i(`toggle-folder`,t.node.path)},{default:f(()=>[g(W,{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(W,{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(W,{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(G,{key:1,clickable:``,dense:``,active:t.node.path===t.selectedPath,"active-class":`file-tree-node--selected`,style:b({paddingLeft:`${C(Z)(t.level,!0)}px`}),onClick:a[1]||=e=>i(`file-select`,t.node.path)},{default:f(()=>[g(W,{avatar:``,class:`file-tree-node__icon-section`},{default:f(()=>[g(L,{name:`insert_drive_file`,size:`xs`,color:`grey-6`})]),_:1}),g(W,{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(W,{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(G,{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(Z)(t.depth,!0)}px`}),onClick:o[0]||=e=>a.$emit(`click`)},{default:f(()=>[g(W,{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(W,{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(W,{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(W,{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(G,null,{default:f(()=>[g(W,null,{default:f(()=>[g(le,null,{default:f(()=>[_(e(C(i)(`browse.toggle`)),1)]),_:1})]),_:1}),g(W,{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(G,{clickable:!t.locked,dense:``,class:`file-list-item diff-tree-folder-row`,style:b({paddingLeft:`${C(Z)(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(W,{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(W,{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=Q(),{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(X,{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(X,{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]||=P(N(e=>!e.repeat&&a(`toggle-all`),[`prevent`]),[`enter`]),i[2]||=P(N(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=Q(),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=he(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=Q(),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(me,{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(X,{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=Q(),{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=Q(),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};