@tequila99/githuman 0.9.0 → 0.10.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 (187) hide show
  1. package/README.md +40 -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/utils/address-key.js +33 -0
  24. package/dist/server/utils/allowed-hosts.js +38 -0
  25. package/dist/server/utils/device-name.js +27 -0
  26. package/dist/server/utils/lan-addresses.js +35 -0
  27. package/dist/server/utils/request-origin.js +105 -0
  28. package/dist/shared/devices/constants.js +16 -0
  29. package/dist/shared/devices/name.js +12 -0
  30. package/dist/shared/devices/schemas.js +67 -0
  31. package/dist/shared/devices/types.js +1 -0
  32. package/dist/shared/events/types.js +2 -1
  33. package/dist/shared/network/address-url.js +4 -0
  34. package/dist/shared/utils/date.js +3 -0
  35. package/dist/web/assets/AccessPage-CAjilkAc.js +1 -0
  36. package/dist/web/assets/AccessPage-DntcW7f8.css +1 -0
  37. package/dist/web/assets/{ClosePopup-lpH_1Ju2.js → ClosePopup-p9VBZw3j.js} +1 -1
  38. package/dist/web/assets/{CreateButton-Dnpwobd9.js → CreateButton-B7-yiqQx.js} +2 -2
  39. package/dist/web/assets/CreateReviewFabButton-BJOAdPG1.js +1 -0
  40. package/dist/web/assets/IndexPage-B0itnrts.js +1 -0
  41. package/dist/web/assets/MainLayout-CP6Bz7DA.js +6 -0
  42. package/dist/web/assets/{MainLayout-DM30ynlR.css → MainLayout-vDaYlRjL.css} +1 -1
  43. package/dist/web/assets/{NoteVisualEditor-Bj13_oEl.js → NoteVisualEditor-oWUBSuDR.js} +2 -2
  44. package/dist/web/assets/NotesPage-Ou5XG64h.js +4 -0
  45. package/dist/web/assets/PanelResize-D1cRotAi.js +1 -0
  46. package/dist/web/assets/{PdfPreview-C7HomxEg.js → PdfPreview-DIgRK8Vh.js} +1 -1
  47. package/dist/web/assets/QExpansionItem-BouBPgdb.js +4 -0
  48. package/dist/web/assets/{QFab-C-YZWgmW.js → QFab-B5iz2kQR.js} +1 -1
  49. package/dist/web/assets/QForm-tsecXm87.js +1 -0
  50. package/dist/web/assets/QResizeObserver-gIKjGVQ7.js +1 -0
  51. package/dist/web/assets/{QScrollArea-BSSZoaV5.js → QScrollArea-BrOkfO1I.js} +1 -1
  52. package/dist/web/assets/{QSelect-2iOBkp1K.js → QSelect-B5EBNlJ4.js} +1 -1
  53. package/dist/web/assets/QSpace-CqqgY-zX.js +1 -0
  54. package/dist/web/assets/{QVirtualScroll-CZJMBpmR.js → QVirtualScroll-BoXSHM25.js} +1 -1
  55. package/dist/web/assets/ReviewDetailPage-C3NBR_xR.js +1 -0
  56. package/dist/web/assets/{ReviewsPage-RyST0FlH.js → ReviewsPage-Bkinx_Bm.js} +1 -1
  57. package/dist/web/assets/StatusSwitcher-8QUHj5Rq.js +1 -0
  58. package/dist/web/assets/{TerminalView-BAzJgUTq.js → TerminalView-elu1dIYU.js} +2 -2
  59. package/dist/web/assets/{abnfDiagram-O67JEVCF-BNZQ7duT.js → abnfDiagram-O67JEVCF-BMF1j0ZS.js} +1 -1
  60. package/dist/web/assets/access-store-Y2QO4AK-.js +1 -0
  61. package/dist/web/assets/{agent-store-DP6Vrw6L.js → agent-store-1i-UjEzZ.js} +46 -46
  62. package/dist/web/assets/architecture-7GRP2DOG-DcZ4-ijA.js +1 -0
  63. package/dist/web/assets/{architectureDiagram-NJMV4G6O-Bkj0kfFn.js → architectureDiagram-NJMV4G6O-Bz4u-gZC.js} +1 -1
  64. package/dist/web/assets/{blockDiagram-BEXU5L5S-CXO3zN2c.js → blockDiagram-BEXU5L5S-qQW37qVK.js} +1 -1
  65. package/dist/web/assets/{c4Diagram-YGBWAQC7-BHfMeZNf.js → c4Diagram-YGBWAQC7-BBwd76CZ.js} +1 -1
  66. package/dist/web/assets/channel-Cgf35HIt.js +1 -0
  67. package/dist/web/assets/{chunk-3FUC2YCW-z1WbH7Gi.js → chunk-3FUC2YCW-BnhnfUz2.js} +1 -1
  68. package/dist/web/assets/{chunk-5DYCD2WN-K9HPch97.js → chunk-5DYCD2WN-DdK6RzN0.js} +1 -1
  69. package/dist/web/assets/{chunk-742MDFTN-Bhjp9fC-.js → chunk-742MDFTN-e_JaY6d5.js} +1 -1
  70. package/dist/web/assets/{chunk-7INBJB4K-Do0EmU14.js → chunk-7INBJB4K-CQjEZWay.js} +1 -1
  71. package/dist/web/assets/{chunk-7M6MHVWA-veeEjsOh.js → chunk-7M6MHVWA-Dhx8Ycf8.js} +1 -1
  72. package/dist/web/assets/{chunk-7PRAP22T-CPqB5tCK.js → chunk-7PRAP22T-DDWxOzU1.js} +1 -1
  73. package/dist/web/assets/{chunk-GTNCS2PH-Civ1V52P.js → chunk-GTNCS2PH-B-ZscolZ.js} +1 -1
  74. package/dist/web/assets/{chunk-GWA4HPMP-C7LzAlyZ.js → chunk-GWA4HPMP-CboS0KEV.js} +1 -1
  75. package/dist/web/assets/{chunk-MBY4JIJT-DfmJy0o_.js → chunk-MBY4JIJT-CiI_FkjG.js} +1 -1
  76. package/dist/web/assets/{chunk-NETBCI7D-BZIKmMvL.js → chunk-NETBCI7D-D9ennL0_.js} +1 -1
  77. package/dist/web/assets/{chunk-O7XYJQB3-DcHeu6b7.js → chunk-O7XYJQB3-y25ZXdWk.js} +1 -1
  78. package/dist/web/assets/{chunk-UA2S7LBM-0SR2og6x.js → chunk-UA2S7LBM-BRHq7OMm.js} +1 -1
  79. package/dist/web/assets/{chunk-WEXAMYUT-CJMSoM-Z.js → chunk-WEXAMYUT-CQu7edQh.js} +1 -1
  80. package/dist/web/assets/{chunk-Z7XXMR3K-q6fce66x.js → chunk-Z7XXMR3K-B3dBNvo3.js} +1 -1
  81. package/dist/web/assets/{chunk-ZIGJFQKS-DsPzen4Y.js → chunk-ZIGJFQKS-CbyA33sL.js} +1 -1
  82. package/dist/web/assets/{classDiagram-v2-NBCMYWYE-Cpm_bvzb.js → classDiagram-v2-NBCMYWYE-CgFqOQ8k.js} +1 -1
  83. package/dist/web/assets/{cynefin-OW5HDTMX-ZTr5XZMW.js → cynefin-OW5HDTMX-DJ9N0QYa.js} +1 -1
  84. package/dist/web/assets/{cynefinDiagram-VND7K2PF-ByUmUx58.js → cynefinDiagram-VND7K2PF-DIWysrbV.js} +1 -1
  85. package/dist/web/assets/{dagre-6A5THRUB-mQOy0E3r.js → dagre-6A5THRUB-Dt2w_dKa.js} +1 -1
  86. package/dist/web/assets/devices-store-CtEl_8An.js +1 -0
  87. package/dist/web/assets/{diagram-22UHCM2B-BW0LPtyk.js → diagram-22UHCM2B-DYd638CD.js} +1 -1
  88. package/dist/web/assets/{diagram-3UASUU5V-jo148ec5.js → diagram-3UASUU5V-B0a-K-41.js} +1 -1
  89. package/dist/web/assets/{diagram-ATOU4E4O-CJt4F0i4.js → diagram-ATOU4E4O-oH2KoPKR.js} +1 -1
  90. package/dist/web/assets/{diagram-CDSNMT55-DEShJv56.js → diagram-CDSNMT55-B5DGBpGB.js} +1 -1
  91. package/dist/web/assets/{diagram-MLGK6HIB-DOFOADfs.js → diagram-MLGK6HIB-C-bsgsc0.js} +1 -1
  92. package/dist/web/assets/{diagram-MPIPVDR6-ux537BMl.js → diagram-MPIPVDR6-BrlKNYLc.js} +1 -1
  93. package/dist/web/assets/{dist-Bu9yRqTU.js → dist-B8irqXQ_.js} +1 -1
  94. package/dist/web/assets/{dist-CLv-grWO.js → dist-B9umI5Mp.js} +1 -1
  95. package/dist/web/assets/{dist-BbdrgL5V.js → dist-Bf4bAu7y.js} +1 -1
  96. package/dist/web/assets/{dist-BThMRW5U.js → dist-Bi2OWZ35.js} +1 -1
  97. package/dist/web/assets/{dist-CK1va5C_.js → dist-Bso6nKGK.js} +1 -1
  98. package/dist/web/assets/{dist-DL0dBIkt.js → dist-C-lnpukg.js} +1 -1
  99. package/dist/web/assets/{dist-D1EUrS6y.js → dist-CNHlSxJl.js} +1 -1
  100. package/dist/web/assets/{dist-Bo7anpPj.js → dist-CfIeEdHm.js} +1 -1
  101. package/dist/web/assets/{dist-Bvnostf5.js → dist-CxiJzNsC.js} +1 -1
  102. package/dist/web/assets/{dist-7xWvOKEv.js → dist-DMe9nqcB.js} +1 -1
  103. package/dist/web/assets/{dist-BWa3ecCV.js → dist-Dz9Y2yQi.js} +1 -1
  104. package/dist/web/assets/{ebnfDiagram-ZINNZB2B-DEybuZle.js → ebnfDiagram-ZINNZB2B-BEpTgssQ.js} +1 -1
  105. package/dist/web/assets/{elk-276RUBZZ-CZXZRpGb.js → elk-276RUBZZ-lzj6IMyM.js} +1 -1
  106. package/dist/web/assets/{erDiagram-OPXOYQCR-BgRqGAt5.js → erDiagram-OPXOYQCR-CHOMf2bq.js} +1 -1
  107. package/dist/web/assets/eventmodeling-NTZA5JFV-CyXHXiX_.js +1 -0
  108. package/dist/web/assets/flowDiagram-KWPJA3E3-C4espOge.js +1 -0
  109. package/dist/web/assets/{ganttDiagram-FUAMR5RP-CBJwX1gk.js → ganttDiagram-FUAMR5RP-TumKIsrB.js} +1 -1
  110. package/dist/web/assets/{gitGraph-4MIJSDKK-Dw-XA3G1.js → gitGraph-4MIJSDKK-H-1qnbZy.js} +1 -1
  111. package/dist/web/assets/{gitGraphDiagram-X574FWY7-BpGccoWp.js → gitGraphDiagram-X574FWY7-DRIXoFhM.js} +1 -1
  112. package/dist/web/assets/i18n-xttkoi4H.js +1 -0
  113. package/dist/web/assets/index-BQi8n0xV.js +2 -0
  114. package/dist/web/assets/{info-A6RAGUB7-Dj5RfJsg.js → info-A6RAGUB7-W0vgdn7h.js} +1 -1
  115. package/dist/web/assets/{infoDiagram-VRGFBTTK-DyVSH991.js → infoDiagram-VRGFBTTK-Dkb5juPW.js} +1 -1
  116. package/dist/web/assets/init-app-DlPQG9dK.js +1 -0
  117. package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-Cu0n2oqT.js → ishikawaDiagram-OU5B5YK6-BHH8nvlH.js} +1 -1
  118. package/dist/web/assets/{journeyDiagram-ZHPQQLJL-Bz1Ot6Zg.js → journeyDiagram-ZHPQQLJL-DDyceAFf.js} +1 -1
  119. package/dist/web/assets/{kanban-definition-PNTS6WVX-C42vuY7H.js → kanban-definition-PNTS6WVX-DKE8pxuA.js} +1 -1
  120. package/dist/web/assets/{line-C5WKurbS.js → line-Cw6FtNmb.js} +1 -1
  121. package/dist/web/assets/{markdown-DBTEhbhQ.js → markdown-CIA-pqWB.js} +2 -2
  122. package/dist/web/assets/{mermaid-parser.core-B7l8qh8B.js → mermaid-parser.core-CWHLi3M4.js} +3 -3
  123. package/dist/web/assets/{mermaid.core-Drs2mjGg.js → mermaid.core-DbTjxMTH.js} +4 -4
  124. package/dist/web/assets/{mindmap-definition-NLK3R4M7-BV1FNwCn.js → mindmap-definition-NLK3R4M7-B3MzGWwm.js} +1 -1
  125. package/dist/web/assets/{packet-AYTQ26CC-BPmUY1Ig.js → packet-AYTQ26CC-B5qqn_tj.js} +1 -1
  126. package/dist/web/assets/{pegDiagram-GJSIUBJH-D6NPxPdr.js → pegDiagram-GJSIUBJH-DtcoRpgi.js} +1 -1
  127. package/dist/web/assets/{pie-WAS4IAKB-CTp2jNAc.js → pie-WAS4IAKB-BP-vRsnM.js} +1 -1
  128. package/dist/web/assets/{pieDiagram-5QR66LMP-BVkABrg7.js → pieDiagram-5QR66LMP-CYy6L6IC.js} +1 -1
  129. package/dist/web/assets/pinia-CJGnEjj3.js +1 -0
  130. package/dist/web/assets/{quadrantDiagram-O4NWA36T-LZCjVd08.js → quadrantDiagram-O4NWA36T-Hi2aHxKi.js} +1 -1
  131. package/dist/web/assets/{radar-RG4KPBEZ-CCiUrmsg.js → radar-RG4KPBEZ-BumlhyD5.js} +1 -1
  132. package/dist/web/assets/{railroad-74A4TZTK-CZn8VJbK.js → railroad-74A4TZTK-CROMzUe6.js} +1 -1
  133. package/dist/web/assets/railroad-abnf-HS5TGJTU-C5G3FxcO.js +1 -0
  134. package/dist/web/assets/railroad-ebnf-LZEXJU2U-BrTMLAtv.js +1 -0
  135. package/dist/web/assets/railroad-peg-WCYAUIDC-CXVDExl0.js +1 -0
  136. package/dist/web/assets/{railroadDiagram-XR7U4H2S-nopy-mdw.js → railroadDiagram-XR7U4H2S-De5-oSrU.js} +1 -1
  137. package/dist/web/assets/{requirementDiagram-PLB6GJNP-BOeMzf-x.js → requirementDiagram-PLB6GJNP-CBqteg6M.js} +1 -1
  138. package/dist/web/assets/{safe-storage-aRoyeFxv.js → safe-storage-BACMX75F.js} +1 -1
  139. package/dist/web/assets/{sankeyDiagram-IPEJSGJF-Bbk0AQUe.js → sankeyDiagram-IPEJSGJF-DfKF1Ck-.js} +1 -1
  140. package/dist/web/assets/{sequenceDiagram-PO4LG4MO-ZpubjKFc.js → sequenceDiagram-PO4LG4MO-D-sVWt3S.js} +1 -1
  141. package/dist/web/assets/single-flight-DLCbzLI3.js +1 -0
  142. package/dist/web/assets/{stateDiagram-v2-GCMORJYK-DNjDh9yZ.js → stateDiagram-v2-GCMORJYK-DruoQvcn.js} +1 -1
  143. package/dist/web/assets/{swimlanes-2SLR337P-C-_UzZF_.js → swimlanes-2SLR337P-BxFZLbJA.js} +1 -1
  144. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-C3zKO6Gm.js +8 -0
  145. package/dist/web/assets/theme-B01ZDSW1.js +1 -0
  146. package/dist/web/assets/{timeline-definition-EJHVYXUP-BiaJyHdJ.js → timeline-definition-EJHVYXUP-BixIZZx_.js} +1 -1
  147. package/dist/web/assets/{treeView-Q6P3EWNA-CENjlerX.js → treeView-Q6P3EWNA-Nzi6VzwD.js} +1 -1
  148. package/dist/web/assets/{treemap-WGGIJYW6-CBpdf3L2.js → treemap-WGGIJYW6-DmAPjB44.js} +1 -1
  149. package/dist/web/assets/{use-add-agent-context-SApxn9fW.js → use-add-agent-context-BE_z8acF.js} +1 -1
  150. package/dist/web/assets/{use-app-theme-DP8Ymwwb.js → use-app-theme-C1KrIJLx.js} +1 -1
  151. package/dist/web/assets/use-countdown-2uTxlnFE.js +1 -0
  152. package/dist/web/assets/{use-panel-width-CTXD_csP.js → use-panel-width-DFOmK5Az.js} +1 -1
  153. package/dist/web/assets/use-server-events-BrBCbeHu.js +1 -0
  154. package/dist/web/assets/{usecaseDiagram-POWQR4AR-CcJ83_Ve.js → usecaseDiagram-POWQR4AR-BlNkvrZH.js} +1 -1
  155. package/dist/web/assets/{vennDiagram-UO4OBE2U-DBjzpbFr.js → vennDiagram-UO4OBE2U-BFjSeLM4.js} +1 -1
  156. package/dist/web/assets/{wardley-WFR3VGLG-DmlbUWUM.js → wardley-WFR3VGLG-DTs7R1tQ.js} +1 -1
  157. package/dist/web/assets/{wardleyDiagram-VNRHLVJA-CWSZCqf4.js → wardleyDiagram-VNRHLVJA-BNMmP3TU.js} +1 -1
  158. package/dist/web/assets/window-store-CIFm3O3S.js +1 -0
  159. package/dist/web/assets/{xychartDiagram-PMCCYNJV-CMnNSaZv.js → xychartDiagram-PMCCYNJV-Bi24Uotp.js} +1 -1
  160. package/dist/web/index.html +1 -1
  161. package/package.json +3 -1
  162. package/dist/web/assets/CreateReviewFabButton-KvKPEJzI.js +0 -1
  163. package/dist/web/assets/IndexPage-DE-IkAhK.js +0 -1
  164. package/dist/web/assets/MainLayout-wWA8ckBg.js +0 -6
  165. package/dist/web/assets/NotesPage-FidBg83M.js +0 -4
  166. package/dist/web/assets/PanelResize-DY0Nzmql.js +0 -1
  167. package/dist/web/assets/QForm-DpEhYVCa.js +0 -4
  168. package/dist/web/assets/QResizeObserver-DeRFR_WF.js +0 -1
  169. package/dist/web/assets/QSpace-B5NneHAd.js +0 -1
  170. package/dist/web/assets/ReviewDetailPage-BI1iAhSf.js +0 -1
  171. package/dist/web/assets/StatusSwitcher-DAeNzNP7.js +0 -1
  172. package/dist/web/assets/app-info-store-u6ZVFjv5.js +0 -1
  173. package/dist/web/assets/architecture-7GRP2DOG-BSdnjp9Z.js +0 -1
  174. package/dist/web/assets/channel-DmoOM6AB.js +0 -1
  175. package/dist/web/assets/eventmodeling-NTZA5JFV-ZuRq6Sae.js +0 -1
  176. package/dist/web/assets/flowDiagram-KWPJA3E3-DRyHAdLb.js +0 -1
  177. package/dist/web/assets/i18n-sfJvmpVb.js +0 -1
  178. package/dist/web/assets/index-B2CzafCr.js +0 -2
  179. package/dist/web/assets/init-app-DSS44aRI.js +0 -1
  180. package/dist/web/assets/pinia-BVWaJ8NX.js +0 -1
  181. package/dist/web/assets/railroad-abnf-HS5TGJTU-B-9tG9pW.js +0 -1
  182. package/dist/web/assets/railroad-ebnf-LZEXJU2U-D7lUyGOq.js +0 -1
  183. package/dist/web/assets/railroad-peg-WCYAUIDC-ja94t32K.js +0 -1
  184. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-CVSZNvS2.js +0 -8
  185. package/dist/web/assets/theme-CeQhGDjh.js +0 -1
  186. package/dist/web/assets/use-server-events-C13Sw-rU.js +0 -1
  187. package/dist/web/assets/window-store-DNnKUhxs.js +0 -1
@@ -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
+ }
@@ -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{J as e,K as t,P as n,_ as r,c as i,ct as a,d as o,h as s,j as c,kt as l,l as u,m as d,pt as f,s as p,u as m}from"./runtime-core.esm-bundler-BKFI1w28.js";import{t as h}from"./QInput-DJgTh2Qy.js";import{t as g}from"./QBtn-DoggJe1Q.js";import{o as _,s as v}from"./index-BQi8n0xV.js";import{n as y}from"./vue-i18n.runtime-BpRrzZrT.js";import{r as b}from"./pinia-DCsnCHsH.js";import{n as x,t as ee}from"./single-flight-DLCbzLI3.js";import{t as S}from"./access-store-Y2QO4AK-.js";import{n as C}from"./use-app-theme-C1KrIJLx.js";import{t as w}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as T}from"./QForm-tsecXm87.js";import{n as E,t as D}from"./use-countdown-2uTxlnFE.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=w(r({__name:`AccessPage`,setup(r){let{t:w}=y(),{isDark:L}=C(),R=S(),{status:z,pairing:B,pairingDeadline:V,mode:H,error:U}=b(R),{registerInterval:W,removeInterval:G}=E(),K=D(()=>V.value??void 0),q=a(``),J=a(!1),Y=a(``),X=a(!1),Z=a(!1),Q=p(()=>z.value===`pending`),$=ee(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 t(z,e=>{e===`pending`?Z.value=!0:e!==null&&(e===`none`&&Z.value&&(X.value=!0),Z.value=!1)},{immediate:!0}),t(Z,e=>{e?W(()=>void $(),I):G()},{immediate:!0}),c(()=>{Q.value&&$()}),(t,r)=>(n(),o(`div`,O,[s(v,{flat:``,bordered:``,class:`access-page__card`,dark:f(L)},{default:e(()=>[s(_,null,{default:e(()=>[i(`div`,k,l(f(w)(`access.title`)),1)]),_:1}),f(H)===`unavailable`?(n(),u(_,{key:0},{default:e(()=>[i(`p`,null,l(f(w)(`access.unavailable`)),1),f(U)?(n(),o(`p`,A,l(f(U)),1)):m(``,!0),s(g,{color:`primary`,label:f(w)(`access.retry`),onClick:f($)},null,8,[`label`,`onClick`])]),_:1})):Q.value&&f(B)?(n(),u(_,{key:1},{default:e(()=>[i(`p`,null,l(f(w)(`access.pending`)),1),i(`div`,j,l(f(B).code),1),i(`p`,M,l(f(w)(`access.expiresIn`,{time:f(K).label.value})),1),f(U)?(n(),o(`p`,N,l(f(w)(`access.unavailable`))+`: `+l(f(U)),1)):m(``,!0)]),_:1})):(n(),u(_,{key:2},{default:e(()=>[i(`p`,null,l(f(w)(`access.noAccess`)),1),X.value?(n(),o(`p`,P,l(f(w)(`access.ended`)),1)):m(``,!0),s(T,{class:`column q-gutter-sm`,onSubmit:te},{default:e(()=>[s(h,{modelValue:q.value,"onUpdate:modelValue":r[0]||=e=>q.value=e,dense:``,outlined:``,maxlength:f(64),label:f(w)(`access.nameLabel`),disable:J.value,dark:f(L)},null,8,[`modelValue`,`maxlength`,`label`,`disable`,`dark`]),s(g,{color:`primary`,type:`submit`,label:f(w)(`access.request`),loading:J.value},null,8,[`label`,`loading`])]),_:1}),Y.value?(n(),o(`p`,F,l(f(w)(`access.requestFailed`))+`: `+l(Y.value),1)):m(``,!0)]),_:1})),s(_,{class:`text-caption text-grey-7`},{default:e(()=>[d(l(f(w)(`access.httpWarning`)),1)]),_:1})]),_:1},8,[`dark`])]))}}),[[`__scopeId`,`data-v-5d5591ed`]]);export{L as default};
@@ -0,0 +1 @@
1
+ .access-page__card[data-v-5d5591ed]{width:420px;max-width:100%}.access-page__code[data-v-5d5591ed]{font-family:var(--font-mono);letter-spacing:.3em;text-align:center;margin:16px 0;font-size:2.5rem}
@@ -1 +1 @@
1
- import{F as e,K as t,O as n,S as r,b as i,ct as a,ot as o,s,v as c}from"./runtime-core.esm-bundler-BKFI1w28.js";import{l,o as u,p as ee,r as d,s as f,t as p,v as m,w as te,x as h}from"./use-router-link-BGc0noIO.js";import{a as g,c as _,i as v,l as y,o as b,r as x,s as S,u as C}from"./event-rR76ioXz.js";import{s as w}from"./is-CE4jkrGQ.js";import{n as T,t as E}from"./create-BSmXD9Zr.js";import{p as ne}from"./QInput-DJgTh2Qy.js";import{p as re}from"./QBtn-DoggJe1Q.js";import{n as D,t as ie}from"./use-dark-BHObfh0O.js";import{$ as ae,B as oe,F as O,G as se,H as ce,I as le,J as ue,K as de,L as fe,M as pe,N as me,P as he,Q as ge,R as _e,U as ve,V as ye,W as k,X as be,Y as A,Z as xe,et as j,l as Se,q as Ce,tt as M,u as we,x as Te,z as N}from"./index-B2CzafCr.js";var P=E({name:`QItemSection`,props:{avatar:Boolean,thumbnail:Boolean,side:Boolean,top:Boolean,noWrap:Boolean},setup(e,{slots:t}){let n=s(()=>`q-item__section column q-item__section--${e.avatar||e.side||e.thumbnail?`side`:`main`}`+(e.top?` q-item__section--top justify-start`:` justify-center`)+(e.avatar?` q-item__section--avatar`:``)+(e.thumbnail?` q-item__section--thumbnail`:``)+(e.noWrap?` q-item__section--nowrap`:``));return()=>i(`div`,{class:n.value},u(t.default))}}),Ee=E({name:`QItem`,props:{...D,...d,tag:{type:String,default:`div`},active:{type:Boolean,default:null},clickable:{type:Boolean,default:null},onClick:Function,dense:Boolean,insetLevel:Number,role:String,tabindex:[String,Number],focused:Boolean,manualFocus:Boolean},emits:[`keyup`],setup(e,{slots:t,emit:n}){let o=ee(),c=ie(e,o),{hasLink:l,linkAttrs:u,linkClass:d,linkTag:te,navigateOnClick:g}=p(),_=a(null),v=a(null),y=s(()=>(e.clickable===null?e.onClick!==void 0:e.clickable)||l.value||e.tag===`label`),b=s(()=>!e.disable&&y.value),x=r(m,null),S=s(()=>{if(e.role!==void 0)return e.role;let t=x===null?null:x.value;if(t===`menu`||t===`menubar`)return y.value?`menuitem`:void 0;if(!l.value)return b.value?`button`:t===`list`?`listitem`:void 0}),w=s(()=>`q-item q-item-type row no-wrap`+(e.dense?` q-item--dense`:``)+(c()?` q-item--dark`:``)+(l.value&&e.active===null?d.value:e.active?` q-item--active${e.activeClass===void 0?``:` ${e.activeClass}`}`:``)+(e.disable?` disabled`:``)+(b.value?` q-item--clickable q-link cursor-pointer `+(e.manualFocus?`q-manual-focusable`:`q-focusable q-hoverable`)+(e.focused?` q-manual-focusable--focused`:``):``)),T=s(()=>e.insetLevel===void 0?null:{[`padding`+(o.lang.rtl?`Right`:`Left`)]:16+e.insetLevel*56+`px`});function E(e){b.value&&(v.value!==null&&!e.qAvoidFocus&&(!e.qKeyEvent&&document.activeElement===_.value?v.value.focus({preventScroll:!0}):document.activeElement===v.value&&_.value.focus({preventScroll:!0})),g(e))}function ne(e){if(b.value&&h(e,[13,32])){C(e),e.qKeyEvent=!0;let t=new MouseEvent(`click`,e);t.qKeyEvent=!0,_.value.dispatchEvent(t)}n(`keyup`,e)}function re(e){b.value&&e.keyCode===32&&C(e)}function D(){let e=f(t.default,[]);return b.value&&e.unshift(i(`div`,{class:`q-focus-helper`,tabindex:-1,ref:v})),e}return()=>{let t={ref:_,class:w.value,style:T.value,role:S.value,onKeyup:ne};return b.value?(t.onClick=E,t.onKeydown=re,t.tabindex=e.tabindex||`0`,Object.assign(t,u.value)):y.value&&(t[`aria-disabled`]=`true`),i(te.value,t,D())}}}),De=[`ul`,`ol`],F=E({name:`QList`,props:{...D,bordered:Boolean,dense:Boolean,separator:Boolean,padding:Boolean,role:String,tag:{type:String,default:`div`}},setup(t,{slots:n}){let r=ee(),a=ie(t,r),o=s(()=>t.role===void 0?De.includes(t.tag)?null:`list`:t.role);e(m,s(()=>t.role===void 0?`list`:t.role));let c=s(()=>`q-list`+(t.bordered?` q-list--bordered`:``)+(t.dense?` q-list--dense`:``)+(t.separator?` q-list--separator`:``)+(a()?` q-list--dark`:``)+(t.padding?` q-list--padding`:``));return()=>i(t.tag,{class:c.value,role:o.value},u(n.default))}}),I={left:!0,right:!0,up:!0,down:!0,horizontal:!0,vertical:!0},Oe=Object.keys(I);I.all=!0;function ke(e){let t={};for(let n of Oe)e[n]&&(t[n]=!0);return Object.keys(t).length===0?I:(t.horizontal?t.left=t.right=!0:t.left&&t.right&&(t.horizontal=!0),t.vertical?t.up=t.down=!0:t.up&&t.down&&(t.vertical=!0),t.horizontal&&t.vertical&&(t.all=!0),t)}var L=[`INPUT`,`TEXTAREA`];function R(e,t){return t.event===void 0&&e.target!==void 0&&!e.target.draggable&&typeof t.handler==`function`&&!L.includes(e.target.nodeName.toUpperCase())&&(e.qClonedBy===void 0||!e.qClonedBy.includes(t.uid))}var{passive:z,passiveCapture:B,notPassiveCapture:V}=v,Ae=0;function H(e,t,n){let r=b(e),i,a=r.left-t.event.x,o=r.top-t.event.y,s=Math.abs(a),c=Math.abs(o),l=t.direction;l.horizontal&&!l.vertical?i=a<0?`left`:`right`:!l.horizontal&&l.vertical?i=o<0?`up`:`down`:l.up&&o<0?(i=`up`,s>c&&(l.left&&a<0?i=`left`:l.right&&a>0&&(i=`right`))):l.down&&o>0?(i=`down`,s>c&&(l.left&&a<0?i=`left`:l.right&&a>0&&(i=`right`))):l.left&&a<0?(i=`left`,s<c&&(l.up&&o<0?i=`up`:l.down&&o>0&&(i=`down`))):l.right&&a>0&&(i=`right`,s<c&&(l.up&&o<0?i=`up`:l.down&&o>0&&(i=`down`)));let u=!1;if(i===void 0&&n===!1){if(t.event.isFirst||t.event.lastDir===void 0)return{};i=t.event.lastDir,u=!0,i===`left`||i===`right`?(r.left-=a,s=0,a=0):(r.top-=o,c=0,o=0)}return{synthetic:u,payload:{evt:e,touch:t.event.mouse!==!0,mouse:t.event.mouse===!0,position:r,direction:i,isFirst:t.event.isFirst,isFinal:n===!0,duration:Date.now()-t.event.time,distance:{x:s,y:c},offset:{x:a,y:o},delta:{x:r.left-t.event.lastX,y:r.top-t.event.lastY}}}}function U(e,t,n){t.modifiers=n,t.direction=ke(n),t.stop=n.stop===!0,t.prevent=n.prevent===!0,t.mouseAllDir=n.mouseAllDir===!0||n.mousealldir===!0,t.preserveCursor=n.preserveCursor===!0||n.preservecursor===!0;let r=n.mouse?n.mouseCapture||n.mousecapture?B:z:null;r!==t.mouseOpts&&(t.mouseOpts!==null&&e.removeEventListener(`mousedown`,W,t.mouseOpts),r!==null&&e.addEventListener(`mousedown`,W,r),t.mouseOpts=r);let i=w.has.touch?n.capture?B:z:null;i!==t.touchOpts&&(t.touchOpts!==null&&e.removeEventListener(`touchstart`,G,t.touchOpts),i!==null&&e.addEventListener(`touchstart`,G,i),t.touchOpts=i)}function W(e){let t=e.currentTarget.__qtouchpan;R(e,t)&&x(e)&&(t.target=document,document.addEventListener(`mousemove`,t,V),document.addEventListener(`mouseup`,t,B),Ne(t,e,!0))}function G(e){let t=e.currentTarget.__qtouchpan;if(R(e,t)){let{target:n}=e;t.target=n,n.addEventListener(`touchmove`,t,V),n.addEventListener(`touchcancel`,t,B),n.addEventListener(`touchend`,t,B),Ne(t,e,!1)}}function je(e){e.type===`mousemove`||e.type===`touchmove`?q(this,e):J(this,e)}function Me(e,t,n){n?C(t):(e.stop&&y(t),e.prevent&&S(t))}function Ne(e,t,n){if(w.is.firefox&&_(e.el,!0),e.lastEvt=t,n||e.stop){if(!e.direction.all&&(!n||!e.mouseAllDir)){let n=t.type.includes(`mouse`)?new MouseEvent(t.type,t):new TouchEvent(t.type,t);t.defaultPrevented&&S(n),t.cancelBubble&&y(n),Object.assign(n,{qKeyEvent:t.qKeyEvent,qClickOutside:t.qClickOutside,qAnchorHandled:t.qAnchorHandled,qClonedBy:t.qClonedBy===void 0?[e.uid]:t.qClonedBy.concat(e.uid)}),e.initialEvent={target:t.target,event:n}}y(t)}let{left:r,top:i}=b(t);e.event={x:r,y:i,time:Date.now(),mouse:n,detected:!1,isFirst:!0,isFinal:!1,lastX:r,lastY:i,lastDir:void 0}}function K(e,t,n){Me(e,t,n),e.styled=!0,e.preserveCursor||(e.cursor=document.documentElement.style.cursor||``,document.documentElement.style.cursor=`grabbing`),n&&document.body.classList.add(`no-pointer-events--children`),document.body.classList.add(`non-selectable`),M()}function Pe(e,t){e.styled=!1,e.cursor!==void 0&&(document.documentElement.style.cursor=e.cursor,e.cursor=void 0),document.body.classList.remove(`non-selectable`),t&&document.body.classList.remove(`no-pointer-events--children`)}function q(e,t){let{event:n}=e;if(n===void 0)return;let r=b(t),i=r.left-n.x,a=r.top-n.y;if(i===0&&a===0)return;e.lastEvt=t;let{mouse:o}=n;if(n.detected){n.isFirst||Me(e,t,o);let{payload:r,synthetic:i}=H(t,e,!1);r!==void 0&&(e.handler(r)===!1?J(e,t):(!e.styled&&n.isFirst&&K(e,t,o),n.lastX=r.position.left,n.lastY=r.position.top,n.lastDir=i?void 0:r.direction,n.isFirst=!1));return}let{direction:s}=e;if(s.all||o&&e.mouseAllDir){K(e,t,o),n.detected=!0,q(e,t);return}let c=Math.abs(i),l=Math.abs(a);c!==l&&(s.horizontal&&c>l||s.vertical&&c<l||s.up&&c<l&&a<0||s.down&&c<l&&a>0||s.left&&c>l&&i<0||s.right&&c>l&&i>0?(n.detected=!0,q(e,t)):J(e,t,!0))}function J(e,t,n){let{event:r,target:i}=e;if(r===void 0)return;let{mouse:a}=r;if(a?(i.removeEventListener(`mousemove`,e,V),i.removeEventListener(`mouseup`,e,B)):(i.removeEventListener(`touchmove`,e,V),i.removeEventListener(`touchcancel`,e,B),i.removeEventListener(`touchend`,e,B)),w.is.firefox&&_(e.el,!1),n)e.styled&&Pe(e,a),!r.detected&&e.initialEvent!==void 0&&e.initialEvent.target.dispatchEvent(e.initialEvent.event);else if(r.detected){t===void 0&&(t=e.lastEvt),r.isFirst&&e.handler(H(t,e).payload);let{payload:n}=H(t,e,!0),{handler:i}=e;e.styled?(Pe(e,a),a?setTimeout(i,50,n):i(n)):i(n)}e.event=void 0,e.initialEvent=void 0,e.lastEvt=void 0,e.target=null}var Fe=T({name:`touch-pan`,beforeMount(e,{value:t,modifiers:n}){let r={handleEvent:je,el:e,uid:`qvtp_`+Ae++,handler:t,modifiers:void 0,direction:void 0,stop:!1,prevent:!1,mouseAllDir:!1,preserveCursor:!1,mouseOpts:null,touchOpts:null,target:null,event:void 0,initialEvent:void 0,lastEvt:void 0,styled:!1,cursor:void 0};e.__qtouchpan=r,U(e,r,n),r.touchOpts!==null&&e.addEventListener(`touchmove`,g,V)},updated(e,{oldValue:t,value:n,modifiers:r}){let i=e.__qtouchpan;i!==void 0&&(t!==n&&(typeof n!=`function`&&J(i),i.handler=n),r!==i.modifiers&&U(e,i,r))},beforeUnmount(e){let t=e.__qtouchpan;t!==void 0&&(J(t),t.mouseOpts!==null&&e.removeEventListener(`mousedown`,W,t.mouseOpts),t.touchOpts!==null&&(e.removeEventListener(`touchstart`,G,t.touchOpts),e.removeEventListener(`touchmove`,g,V)),e.__qtouchpan=void 0)}}),Ie={hover:Boolean,hoverDelay:{type:Number,default:0},hoverHideDelay:{type:Number,default:150}};function Le({props:e,canShow:t,show:n,canHide:r,hide:i}){let{removeTimeout:a,registerTimeout:o}=ye();function s(r){e.hover===!0&&r.pointerType!==`touch`&&(a(),t(r)&&(e.hoverDelay>0?o(()=>{n(r)},e.hoverDelay):n(r)))}function c(t){a(),r(t)&&o(()=>{i(t)},e.hoverHideDelay)}function l(t){e.hover===!0&&t.pointerType!==`touch`&&c(t)}function u(e){e.pointerType!==`touch`&&a()}return{clearHoverTimer:a,hoverShow:s,hoverHide:l,scheduleHoverHide:c,onHoverContentEnter:u}}var Y=null,{notPassiveCapture:X,passiveCapture:Re}=v,Z=[];function Q(e){Y!==null&&(clearTimeout(Y),Y=null);let t=e.target;if(t===void 0||t.nodeType===8||t.classList.contains(`no-pointer-events`))return;let n=null,r=!1;for(let e=A.length-1;e>=0;e--){let t=A[e].$,i=t.type.name;if(i!==`QTooltip`){if(i===`QDialog`){if(t.props.seamless!==!0){if(r===!1)return;n=new Set(A.slice(e+1).map(e=>e.contentEl));break}continue}r=!0}}for(let r=Z.length-1;r>=0;r--){let i=Z[r];if(n!==null&&!n.has(i.innerRef.value))return;if((i.anchorEl.value===null||!i.anchorEl.value.contains(t)&&!O(i.anchorEl.value,t))&&(t===document.body||i.innerRef.value!==null&&!i.innerRef.value.contains(t)&&!O(i.innerRef.value,t)))e.qClickOutside=!0,i.onClickOutside(e);else return}}function ze(e){e.pointerType!==`touch`&&(Y!==null&&clearTimeout(Y),Y=setTimeout(()=>{Y=null,Q(e)},0))}function Be(e){Z.push(e),Z.length===1&&(document.addEventListener(`pointerdown`,ze,Re),document.addEventListener(`mousedown`,Q,X),document.addEventListener(`touchstart`,Q,X))}function Ve(e){let t=Z.indexOf(e);t!==-1&&(Z.splice(t,1),Z.length===0&&(Y!==null&&(clearTimeout(Y),Y=null),document.removeEventListener(`pointerdown`,ze,Re),document.removeEventListener(`mousedown`,Q,X),document.removeEventListener(`touchstart`,Q,X)))}var He=`a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex^="-"])`,Ue=E({name:`QMenu`,inheritAttrs:!1,props:{...j,...ge,...D,...k,persistent:Boolean,autoClose:Boolean,separateClosePopup:Boolean,noEscDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,fit:Boolean,cover:Boolean,square:Boolean,anchor:{type:String,validator:N},self:{type:String,validator:N},offset:{type:Array,validator:_e},touchPosition:Boolean,...Ie,maxHeight:{type:String,default:null},maxWidth:{type:String,default:null}},emits:[...xe,`click`,`escapeKey`],setup(e,{slots:r,emit:d,attrs:f}){let p,m=!1,h=c(),{proxy:g}=h,_=ee(),v=a(null),y=o(!1),b=s(()=>!e.persistent&&!e.noRouteDismiss),x=ie(e,_),{registerTick:S,removeTick:w}=ce(),{registerTransitionEnd:T}=oe(e),{transitionProps:E,transitionStyle:D}=ve(e),{anchorEl:O,canShow:ge,anchorEvents:_e}=ae({showing:y,getPopupRole:()=>f.role}),{show:ye,hide:k}=be({showing:y,canShow:ge,canHide(e){return m&&P()?e?.type!==`click`:!0},handleShow:je,handleHide:Me,handleRouteChange:Ne,hideOnRouteChange:b,processOnMount:!0}),{clearHoverTimer:A,hoverShow:xe,scheduleHoverHide:j,onHoverContentEnter:Ce}=Le({props:e,canShow:()=>!y.value,show:ye,canHide:e=>y.value&&!W(e.relatedTarget),hide:k});Object.assign(_e,{hoverShow:xe,hoverHide:G});let{showPortal:M,hidePortal:N,portalIsOpening:P,renderPortal:Ee}=se(h,v,Ie,`menu`),{captureRefocusTarget:De,clearRefocusTarget:F,restoreFocus:I,restoreFocusSync:Oe,adoptRefocusTarget:ke}=Te(e,()=>!e.noFocus&&!m&&P()),L={anchorEl:O,innerRef:v,onClickOutside(t){if(!e.persistent&&y.value)return k(t),(t.type===`touchstart`||t.target.classList.contains(`q-dialog__backdrop`))&&C(t),!0}},R=s(()=>fe(e.anchor||(e.cover?`center middle`:`bottom start`),_.lang.rtl)),z=s(()=>e.cover?R.value:fe(e.self||`top start`,_.lang.rtl)),B=he({props:e,$q:_,anchorEl:O,innerRef:v,showing:y,anchorOrigin:R,selfOrigin:z}),V=s(()=>`q-menu scroll`+(B.viaCssAnchor?``:` q-position-engine`)+(e.square?` q-menu--square`:``)+(x()?` q-menu--dark q-dark`:``)),Ae=s(()=>e.autoClose?{onClick:Pe}:{}),H=s(()=>y.value&&!e.persistent);t(H,e=>{e?(pe(J),Be(L)):(me(J),Ve(L))});function U(){ne(()=>{let e=v.value;e&&e.contains!==void 0&&!e.contains(document.activeElement)&&(e=e.querySelector(`[autofocus][tabindex], [data-autofocus][tabindex]`)||e.querySelector(`[autofocus] [tabindex], [data-autofocus] [tabindex]`)||e.querySelector(`[autofocus], [data-autofocus]`)||e,e.focus({preventScroll:!0}))})}function W(e){if(e==null)return!1;if(O.value!==null&&O.value.contains(e)||v.value!==null&&v.value.contains(e))return!0;let t=ue(e);for(;t!=null;){if(t===g)return!0;t=l(t)}return!1}function G(e){if(e.pointerType===`touch`)return;j(e);let t=l(g);for(;t!=null;)t.$options.name===`QMenu`&&t.$props.hover===!0&&t.__qHoverHide?.(e),t=l(t)}function je(t){m=e.hover&&t?.type===`pointerenter`,A(),De(m),Se(q),M(!1,m),B.handleShow(!m&&(e.touchPosition||e.contextMenu)?t:void 0),!e.noFocus&&!m&&document.activeElement.blur(),S(()=>{B.handleTick(),!e.noFocus&&!m&&U()}),T(()=>{_.platform.is.ios&&(p=e.autoClose,v.value.click()),B.viaCssAnchor||B.track(),M(!0),d(`show`,t)})}function Me(e){m=!1,w(),N(),K(!0),e===void 0||!e.qClickOutside?I(e):F(),T(()=>{N(!0),B.releaseAnchor(!1),d(`hide`,e)})}function Ne(){F()}function K(e){A(),B.releaseAnchor(e),(e||y.value)&&(we(q),Ve(L),me(J)),e||F()}function Pe(e){p?p=!1:(de(g,e),d(`click`,e))}function q(t){H.value&&!e.noFocus&&!m&&!re(v.value,t.target)&&!le(v.value,t.target)&&U()}function J(t){e.noEscDismiss||(d(`escapeKey`),k(t))}function Fe(e){if(e.keyCode!==9||e.defaultPrevented||!H.value||v.value===null)return;let t=v.value,n=t.querySelectorAll(He),r=n.length===0?null:n[e.shiftKey?0:n.length-1];(r===null||document.activeElement===r||e.shiftKey&&document.activeElement===t)&&(we(q),Oe(e),k(e))}function Ie(){return i(te,E(),()=>y.value?i(`div`,{...f,ref:v,tabindex:-1,onKeydown:[].concat(f.onKeydown||[],Fe),...e.hover?{onPointerenter:[].concat(f.onPointerenter||[],Ce),onPointerleave:[].concat(f.onPointerleave||[],G)}:{},class:[V.value,f.class],style:[f.style,D(),B.positionStyle.value],...Ae.value},u(r.default)):null)}return n(()=>{K(!1)}),Object.assign(g,{focus:U,updatePosition:B.updatePosition,__adoptRefocusTarget:ke}),g.__qHoverHide=j,Ee}});function We(e){return e===!1?0:e===!0||e===void 0?1:Number.parseInt(e,10)||0}function $(e){let t=e.currentTarget,n=t.__qclosepopup;n!==0&&setTimeout(()=>{let r=ue(t);r!==void 0&&Ce(r,e,n)},0)}function Ge(e){h(e,13)&&$(e)}var Ke=T({name:`close-popup`,beforeMount(e,{value:t}){e.__qclosepopup=We(t),e.addEventListener(`click`,$),e.addEventListener(`keyup`,Ge)},updated(e,{value:t,oldValue:n}){t!==n&&e.__qclosepopup!==void 0&&(e.__qclosepopup=We(t))},beforeUnmount(e){e.__qclosepopup!==void 0&&(e.removeEventListener(`click`,$),e.removeEventListener(`keyup`,Ge),e.__qclosepopup=void 0)}});export{Fe as a,P as c,Ie as i,Ue as n,F as o,Le as r,Ee as s,Ke as t};
1
+ import{F as e,K as t,O as n,S as r,b as i,ct as a,ot as o,s,v as c}from"./runtime-core.esm-bundler-BKFI1w28.js";import{l,o as u,p as ee,r as d,s as f,t as p,v as m,w as te,x as h}from"./use-router-link-BGc0noIO.js";import{a as g,c as _,i as v,l as y,o as b,r as x,s as S,u as C}from"./event-rR76ioXz.js";import{s as w}from"./is-CE4jkrGQ.js";import{n as T,t as E}from"./create-BSmXD9Zr.js";import{p as ne}from"./QInput-DJgTh2Qy.js";import{p as re}from"./QBtn-DoggJe1Q.js";import{n as D,t as ie}from"./use-dark-BHObfh0O.js";import{$ as ae,B as oe,F as O,G as se,H as ce,I as le,J as ue,K as de,L as fe,M as pe,N as me,P as he,Q as ge,R as _e,U as ve,V as ye,W as k,X as be,Y as A,Z as xe,et as j,l as Se,q as Ce,tt as M,u as we,x as Te,z as N}from"./index-BQi8n0xV.js";var P=E({name:`QItemSection`,props:{avatar:Boolean,thumbnail:Boolean,side:Boolean,top:Boolean,noWrap:Boolean},setup(e,{slots:t}){let n=s(()=>`q-item__section column q-item__section--${e.avatar||e.side||e.thumbnail?`side`:`main`}`+(e.top?` q-item__section--top justify-start`:` justify-center`)+(e.avatar?` q-item__section--avatar`:``)+(e.thumbnail?` q-item__section--thumbnail`:``)+(e.noWrap?` q-item__section--nowrap`:``));return()=>i(`div`,{class:n.value},u(t.default))}}),Ee=E({name:`QItem`,props:{...D,...d,tag:{type:String,default:`div`},active:{type:Boolean,default:null},clickable:{type:Boolean,default:null},onClick:Function,dense:Boolean,insetLevel:Number,role:String,tabindex:[String,Number],focused:Boolean,manualFocus:Boolean},emits:[`keyup`],setup(e,{slots:t,emit:n}){let o=ee(),c=ie(e,o),{hasLink:l,linkAttrs:u,linkClass:d,linkTag:te,navigateOnClick:g}=p(),_=a(null),v=a(null),y=s(()=>(e.clickable===null?e.onClick!==void 0:e.clickable)||l.value||e.tag===`label`),b=s(()=>!e.disable&&y.value),x=r(m,null),S=s(()=>{if(e.role!==void 0)return e.role;let t=x===null?null:x.value;if(t===`menu`||t===`menubar`)return y.value?`menuitem`:void 0;if(!l.value)return b.value?`button`:t===`list`?`listitem`:void 0}),w=s(()=>`q-item q-item-type row no-wrap`+(e.dense?` q-item--dense`:``)+(c()?` q-item--dark`:``)+(l.value&&e.active===null?d.value:e.active?` q-item--active${e.activeClass===void 0?``:` ${e.activeClass}`}`:``)+(e.disable?` disabled`:``)+(b.value?` q-item--clickable q-link cursor-pointer `+(e.manualFocus?`q-manual-focusable`:`q-focusable q-hoverable`)+(e.focused?` q-manual-focusable--focused`:``):``)),T=s(()=>e.insetLevel===void 0?null:{[`padding`+(o.lang.rtl?`Right`:`Left`)]:16+e.insetLevel*56+`px`});function E(e){b.value&&(v.value!==null&&!e.qAvoidFocus&&(!e.qKeyEvent&&document.activeElement===_.value?v.value.focus({preventScroll:!0}):document.activeElement===v.value&&_.value.focus({preventScroll:!0})),g(e))}function ne(e){if(b.value&&h(e,[13,32])){C(e),e.qKeyEvent=!0;let t=new MouseEvent(`click`,e);t.qKeyEvent=!0,_.value.dispatchEvent(t)}n(`keyup`,e)}function re(e){b.value&&e.keyCode===32&&C(e)}function D(){let e=f(t.default,[]);return b.value&&e.unshift(i(`div`,{class:`q-focus-helper`,tabindex:-1,ref:v})),e}return()=>{let t={ref:_,class:w.value,style:T.value,role:S.value,onKeyup:ne};return b.value?(t.onClick=E,t.onKeydown=re,t.tabindex=e.tabindex||`0`,Object.assign(t,u.value)):y.value&&(t[`aria-disabled`]=`true`),i(te.value,t,D())}}}),De=[`ul`,`ol`],F=E({name:`QList`,props:{...D,bordered:Boolean,dense:Boolean,separator:Boolean,padding:Boolean,role:String,tag:{type:String,default:`div`}},setup(t,{slots:n}){let r=ee(),a=ie(t,r),o=s(()=>t.role===void 0?De.includes(t.tag)?null:`list`:t.role);e(m,s(()=>t.role===void 0?`list`:t.role));let c=s(()=>`q-list`+(t.bordered?` q-list--bordered`:``)+(t.dense?` q-list--dense`:``)+(t.separator?` q-list--separator`:``)+(a()?` q-list--dark`:``)+(t.padding?` q-list--padding`:``));return()=>i(t.tag,{class:c.value,role:o.value},u(n.default))}}),I={left:!0,right:!0,up:!0,down:!0,horizontal:!0,vertical:!0},Oe=Object.keys(I);I.all=!0;function ke(e){let t={};for(let n of Oe)e[n]&&(t[n]=!0);return Object.keys(t).length===0?I:(t.horizontal?t.left=t.right=!0:t.left&&t.right&&(t.horizontal=!0),t.vertical?t.up=t.down=!0:t.up&&t.down&&(t.vertical=!0),t.horizontal&&t.vertical&&(t.all=!0),t)}var L=[`INPUT`,`TEXTAREA`];function R(e,t){return t.event===void 0&&e.target!==void 0&&!e.target.draggable&&typeof t.handler==`function`&&!L.includes(e.target.nodeName.toUpperCase())&&(e.qClonedBy===void 0||!e.qClonedBy.includes(t.uid))}var{passive:z,passiveCapture:B,notPassiveCapture:V}=v,Ae=0;function H(e,t,n){let r=b(e),i,a=r.left-t.event.x,o=r.top-t.event.y,s=Math.abs(a),c=Math.abs(o),l=t.direction;l.horizontal&&!l.vertical?i=a<0?`left`:`right`:!l.horizontal&&l.vertical?i=o<0?`up`:`down`:l.up&&o<0?(i=`up`,s>c&&(l.left&&a<0?i=`left`:l.right&&a>0&&(i=`right`))):l.down&&o>0?(i=`down`,s>c&&(l.left&&a<0?i=`left`:l.right&&a>0&&(i=`right`))):l.left&&a<0?(i=`left`,s<c&&(l.up&&o<0?i=`up`:l.down&&o>0&&(i=`down`))):l.right&&a>0&&(i=`right`,s<c&&(l.up&&o<0?i=`up`:l.down&&o>0&&(i=`down`)));let u=!1;if(i===void 0&&n===!1){if(t.event.isFirst||t.event.lastDir===void 0)return{};i=t.event.lastDir,u=!0,i===`left`||i===`right`?(r.left-=a,s=0,a=0):(r.top-=o,c=0,o=0)}return{synthetic:u,payload:{evt:e,touch:t.event.mouse!==!0,mouse:t.event.mouse===!0,position:r,direction:i,isFirst:t.event.isFirst,isFinal:n===!0,duration:Date.now()-t.event.time,distance:{x:s,y:c},offset:{x:a,y:o},delta:{x:r.left-t.event.lastX,y:r.top-t.event.lastY}}}}function U(e,t,n){t.modifiers=n,t.direction=ke(n),t.stop=n.stop===!0,t.prevent=n.prevent===!0,t.mouseAllDir=n.mouseAllDir===!0||n.mousealldir===!0,t.preserveCursor=n.preserveCursor===!0||n.preservecursor===!0;let r=n.mouse?n.mouseCapture||n.mousecapture?B:z:null;r!==t.mouseOpts&&(t.mouseOpts!==null&&e.removeEventListener(`mousedown`,W,t.mouseOpts),r!==null&&e.addEventListener(`mousedown`,W,r),t.mouseOpts=r);let i=w.has.touch?n.capture?B:z:null;i!==t.touchOpts&&(t.touchOpts!==null&&e.removeEventListener(`touchstart`,G,t.touchOpts),i!==null&&e.addEventListener(`touchstart`,G,i),t.touchOpts=i)}function W(e){let t=e.currentTarget.__qtouchpan;R(e,t)&&x(e)&&(t.target=document,document.addEventListener(`mousemove`,t,V),document.addEventListener(`mouseup`,t,B),Ne(t,e,!0))}function G(e){let t=e.currentTarget.__qtouchpan;if(R(e,t)){let{target:n}=e;t.target=n,n.addEventListener(`touchmove`,t,V),n.addEventListener(`touchcancel`,t,B),n.addEventListener(`touchend`,t,B),Ne(t,e,!1)}}function je(e){e.type===`mousemove`||e.type===`touchmove`?q(this,e):J(this,e)}function Me(e,t,n){n?C(t):(e.stop&&y(t),e.prevent&&S(t))}function Ne(e,t,n){if(w.is.firefox&&_(e.el,!0),e.lastEvt=t,n||e.stop){if(!e.direction.all&&(!n||!e.mouseAllDir)){let n=t.type.includes(`mouse`)?new MouseEvent(t.type,t):new TouchEvent(t.type,t);t.defaultPrevented&&S(n),t.cancelBubble&&y(n),Object.assign(n,{qKeyEvent:t.qKeyEvent,qClickOutside:t.qClickOutside,qAnchorHandled:t.qAnchorHandled,qClonedBy:t.qClonedBy===void 0?[e.uid]:t.qClonedBy.concat(e.uid)}),e.initialEvent={target:t.target,event:n}}y(t)}let{left:r,top:i}=b(t);e.event={x:r,y:i,time:Date.now(),mouse:n,detected:!1,isFirst:!0,isFinal:!1,lastX:r,lastY:i,lastDir:void 0}}function K(e,t,n){Me(e,t,n),e.styled=!0,e.preserveCursor||(e.cursor=document.documentElement.style.cursor||``,document.documentElement.style.cursor=`grabbing`),n&&document.body.classList.add(`no-pointer-events--children`),document.body.classList.add(`non-selectable`),M()}function Pe(e,t){e.styled=!1,e.cursor!==void 0&&(document.documentElement.style.cursor=e.cursor,e.cursor=void 0),document.body.classList.remove(`non-selectable`),t&&document.body.classList.remove(`no-pointer-events--children`)}function q(e,t){let{event:n}=e;if(n===void 0)return;let r=b(t),i=r.left-n.x,a=r.top-n.y;if(i===0&&a===0)return;e.lastEvt=t;let{mouse:o}=n;if(n.detected){n.isFirst||Me(e,t,o);let{payload:r,synthetic:i}=H(t,e,!1);r!==void 0&&(e.handler(r)===!1?J(e,t):(!e.styled&&n.isFirst&&K(e,t,o),n.lastX=r.position.left,n.lastY=r.position.top,n.lastDir=i?void 0:r.direction,n.isFirst=!1));return}let{direction:s}=e;if(s.all||o&&e.mouseAllDir){K(e,t,o),n.detected=!0,q(e,t);return}let c=Math.abs(i),l=Math.abs(a);c!==l&&(s.horizontal&&c>l||s.vertical&&c<l||s.up&&c<l&&a<0||s.down&&c<l&&a>0||s.left&&c>l&&i<0||s.right&&c>l&&i>0?(n.detected=!0,q(e,t)):J(e,t,!0))}function J(e,t,n){let{event:r,target:i}=e;if(r===void 0)return;let{mouse:a}=r;if(a?(i.removeEventListener(`mousemove`,e,V),i.removeEventListener(`mouseup`,e,B)):(i.removeEventListener(`touchmove`,e,V),i.removeEventListener(`touchcancel`,e,B),i.removeEventListener(`touchend`,e,B)),w.is.firefox&&_(e.el,!1),n)e.styled&&Pe(e,a),!r.detected&&e.initialEvent!==void 0&&e.initialEvent.target.dispatchEvent(e.initialEvent.event);else if(r.detected){t===void 0&&(t=e.lastEvt),r.isFirst&&e.handler(H(t,e).payload);let{payload:n}=H(t,e,!0),{handler:i}=e;e.styled?(Pe(e,a),a?setTimeout(i,50,n):i(n)):i(n)}e.event=void 0,e.initialEvent=void 0,e.lastEvt=void 0,e.target=null}var Fe=T({name:`touch-pan`,beforeMount(e,{value:t,modifiers:n}){let r={handleEvent:je,el:e,uid:`qvtp_`+Ae++,handler:t,modifiers:void 0,direction:void 0,stop:!1,prevent:!1,mouseAllDir:!1,preserveCursor:!1,mouseOpts:null,touchOpts:null,target:null,event:void 0,initialEvent:void 0,lastEvt:void 0,styled:!1,cursor:void 0};e.__qtouchpan=r,U(e,r,n),r.touchOpts!==null&&e.addEventListener(`touchmove`,g,V)},updated(e,{oldValue:t,value:n,modifiers:r}){let i=e.__qtouchpan;i!==void 0&&(t!==n&&(typeof n!=`function`&&J(i),i.handler=n),r!==i.modifiers&&U(e,i,r))},beforeUnmount(e){let t=e.__qtouchpan;t!==void 0&&(J(t),t.mouseOpts!==null&&e.removeEventListener(`mousedown`,W,t.mouseOpts),t.touchOpts!==null&&(e.removeEventListener(`touchstart`,G,t.touchOpts),e.removeEventListener(`touchmove`,g,V)),e.__qtouchpan=void 0)}}),Ie={hover:Boolean,hoverDelay:{type:Number,default:0},hoverHideDelay:{type:Number,default:150}};function Le({props:e,canShow:t,show:n,canHide:r,hide:i}){let{removeTimeout:a,registerTimeout:o}=ye();function s(r){e.hover===!0&&r.pointerType!==`touch`&&(a(),t(r)&&(e.hoverDelay>0?o(()=>{n(r)},e.hoverDelay):n(r)))}function c(t){a(),r(t)&&o(()=>{i(t)},e.hoverHideDelay)}function l(t){e.hover===!0&&t.pointerType!==`touch`&&c(t)}function u(e){e.pointerType!==`touch`&&a()}return{clearHoverTimer:a,hoverShow:s,hoverHide:l,scheduleHoverHide:c,onHoverContentEnter:u}}var Y=null,{notPassiveCapture:X,passiveCapture:Re}=v,Z=[];function Q(e){Y!==null&&(clearTimeout(Y),Y=null);let t=e.target;if(t===void 0||t.nodeType===8||t.classList.contains(`no-pointer-events`))return;let n=null,r=!1;for(let e=A.length-1;e>=0;e--){let t=A[e].$,i=t.type.name;if(i!==`QTooltip`){if(i===`QDialog`){if(t.props.seamless!==!0){if(r===!1)return;n=new Set(A.slice(e+1).map(e=>e.contentEl));break}continue}r=!0}}for(let r=Z.length-1;r>=0;r--){let i=Z[r];if(n!==null&&!n.has(i.innerRef.value))return;if((i.anchorEl.value===null||!i.anchorEl.value.contains(t)&&!O(i.anchorEl.value,t))&&(t===document.body||i.innerRef.value!==null&&!i.innerRef.value.contains(t)&&!O(i.innerRef.value,t)))e.qClickOutside=!0,i.onClickOutside(e);else return}}function ze(e){e.pointerType!==`touch`&&(Y!==null&&clearTimeout(Y),Y=setTimeout(()=>{Y=null,Q(e)},0))}function Be(e){Z.push(e),Z.length===1&&(document.addEventListener(`pointerdown`,ze,Re),document.addEventListener(`mousedown`,Q,X),document.addEventListener(`touchstart`,Q,X))}function Ve(e){let t=Z.indexOf(e);t!==-1&&(Z.splice(t,1),Z.length===0&&(Y!==null&&(clearTimeout(Y),Y=null),document.removeEventListener(`pointerdown`,ze,Re),document.removeEventListener(`mousedown`,Q,X),document.removeEventListener(`touchstart`,Q,X)))}var He=`a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex^="-"])`,Ue=E({name:`QMenu`,inheritAttrs:!1,props:{...j,...ge,...D,...k,persistent:Boolean,autoClose:Boolean,separateClosePopup:Boolean,noEscDismiss:Boolean,noRouteDismiss:Boolean,noRefocus:Boolean,noFocus:Boolean,fit:Boolean,cover:Boolean,square:Boolean,anchor:{type:String,validator:N},self:{type:String,validator:N},offset:{type:Array,validator:_e},touchPosition:Boolean,...Ie,maxHeight:{type:String,default:null},maxWidth:{type:String,default:null}},emits:[...xe,`click`,`escapeKey`],setup(e,{slots:r,emit:d,attrs:f}){let p,m=!1,h=c(),{proxy:g}=h,_=ee(),v=a(null),y=o(!1),b=s(()=>!e.persistent&&!e.noRouteDismiss),x=ie(e,_),{registerTick:S,removeTick:w}=ce(),{registerTransitionEnd:T}=oe(e),{transitionProps:E,transitionStyle:D}=ve(e),{anchorEl:O,canShow:ge,anchorEvents:_e}=ae({showing:y,getPopupRole:()=>f.role}),{show:ye,hide:k}=be({showing:y,canShow:ge,canHide(e){return m&&P()?e?.type!==`click`:!0},handleShow:je,handleHide:Me,handleRouteChange:Ne,hideOnRouteChange:b,processOnMount:!0}),{clearHoverTimer:A,hoverShow:xe,scheduleHoverHide:j,onHoverContentEnter:Ce}=Le({props:e,canShow:()=>!y.value,show:ye,canHide:e=>y.value&&!W(e.relatedTarget),hide:k});Object.assign(_e,{hoverShow:xe,hoverHide:G});let{showPortal:M,hidePortal:N,portalIsOpening:P,renderPortal:Ee}=se(h,v,Ie,`menu`),{captureRefocusTarget:De,clearRefocusTarget:F,restoreFocus:I,restoreFocusSync:Oe,adoptRefocusTarget:ke}=Te(e,()=>!e.noFocus&&!m&&P()),L={anchorEl:O,innerRef:v,onClickOutside(t){if(!e.persistent&&y.value)return k(t),(t.type===`touchstart`||t.target.classList.contains(`q-dialog__backdrop`))&&C(t),!0}},R=s(()=>fe(e.anchor||(e.cover?`center middle`:`bottom start`),_.lang.rtl)),z=s(()=>e.cover?R.value:fe(e.self||`top start`,_.lang.rtl)),B=he({props:e,$q:_,anchorEl:O,innerRef:v,showing:y,anchorOrigin:R,selfOrigin:z}),V=s(()=>`q-menu scroll`+(B.viaCssAnchor?``:` q-position-engine`)+(e.square?` q-menu--square`:``)+(x()?` q-menu--dark q-dark`:``)),Ae=s(()=>e.autoClose?{onClick:Pe}:{}),H=s(()=>y.value&&!e.persistent);t(H,e=>{e?(pe(J),Be(L)):(me(J),Ve(L))});function U(){ne(()=>{let e=v.value;e&&e.contains!==void 0&&!e.contains(document.activeElement)&&(e=e.querySelector(`[autofocus][tabindex], [data-autofocus][tabindex]`)||e.querySelector(`[autofocus] [tabindex], [data-autofocus] [tabindex]`)||e.querySelector(`[autofocus], [data-autofocus]`)||e,e.focus({preventScroll:!0}))})}function W(e){if(e==null)return!1;if(O.value!==null&&O.value.contains(e)||v.value!==null&&v.value.contains(e))return!0;let t=ue(e);for(;t!=null;){if(t===g)return!0;t=l(t)}return!1}function G(e){if(e.pointerType===`touch`)return;j(e);let t=l(g);for(;t!=null;)t.$options.name===`QMenu`&&t.$props.hover===!0&&t.__qHoverHide?.(e),t=l(t)}function je(t){m=e.hover&&t?.type===`pointerenter`,A(),De(m),Se(q),M(!1,m),B.handleShow(!m&&(e.touchPosition||e.contextMenu)?t:void 0),!e.noFocus&&!m&&document.activeElement.blur(),S(()=>{B.handleTick(),!e.noFocus&&!m&&U()}),T(()=>{_.platform.is.ios&&(p=e.autoClose,v.value.click()),B.viaCssAnchor||B.track(),M(!0),d(`show`,t)})}function Me(e){m=!1,w(),N(),K(!0),e===void 0||!e.qClickOutside?I(e):F(),T(()=>{N(!0),B.releaseAnchor(!1),d(`hide`,e)})}function Ne(){F()}function K(e){A(),B.releaseAnchor(e),(e||y.value)&&(we(q),Ve(L),me(J)),e||F()}function Pe(e){p?p=!1:(de(g,e),d(`click`,e))}function q(t){H.value&&!e.noFocus&&!m&&!re(v.value,t.target)&&!le(v.value,t.target)&&U()}function J(t){e.noEscDismiss||(d(`escapeKey`),k(t))}function Fe(e){if(e.keyCode!==9||e.defaultPrevented||!H.value||v.value===null)return;let t=v.value,n=t.querySelectorAll(He),r=n.length===0?null:n[e.shiftKey?0:n.length-1];(r===null||document.activeElement===r||e.shiftKey&&document.activeElement===t)&&(we(q),Oe(e),k(e))}function Ie(){return i(te,E(),()=>y.value?i(`div`,{...f,ref:v,tabindex:-1,onKeydown:[].concat(f.onKeydown||[],Fe),...e.hover?{onPointerenter:[].concat(f.onPointerenter||[],Ce),onPointerleave:[].concat(f.onPointerleave||[],G)}:{},class:[V.value,f.class],style:[f.style,D(),B.positionStyle.value],...Ae.value},u(r.default)):null)}return n(()=>{K(!1)}),Object.assign(g,{focus:U,updatePosition:B.updatePosition,__adoptRefocusTarget:ke}),g.__qHoverHide=j,Ee}});function We(e){return e===!1?0:e===!0||e===void 0?1:Number.parseInt(e,10)||0}function $(e){let t=e.currentTarget,n=t.__qclosepopup;n!==0&&setTimeout(()=>{let r=ue(t);r!==void 0&&Ce(r,e,n)},0)}function Ge(e){h(e,13)&&$(e)}var Ke=T({name:`close-popup`,beforeMount(e,{value:t}){e.__qclosepopup=We(t),e.addEventListener(`click`,$),e.addEventListener(`keyup`,Ge)},updated(e,{value:t,oldValue:n}){t!==n&&e.__qclosepopup!==void 0&&(e.__qclosepopup=We(t))},beforeUnmount(e){e.__qclosepopup!==void 0&&(e.removeEventListener(`click`,$),e.removeEventListener(`keyup`,Ge),e.__qclosepopup=void 0)}});export{Fe as a,P as c,Ie as i,Ue as n,F as o,Le as r,Ee as s,Ke as t};
@@ -1,5 +1,5 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/typescript-Utq2Cl8c.js","assets/typescript-j_1H8WHN.js","assets/javascript-Yelw-5ZN.js","assets/javascript-BzbQS41l.js","assets/vue-CSBlZ1UP.js","assets/css-LbU1hoFO.js","assets/html-BcACZWSP.js","assets/json-B88Oqtu5.js","assets/json-CaljABEy.js","assets/css-CdtkT07m.js","assets/scss-DHtrkMkT.js","assets/html-DDNsd9lV.js","assets/core-Bumj8M77.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/ccount-CcG1m-Yh.js","assets/engine-oniguruma-B4iNeJbd.js"])))=>i.map(i=>d[i]);
2
- import{P as e,_ as t,ct as n,l as r,ot as i,pt as a,s as o,w as s}from"./runtime-core.esm-bundler-BKFI1w28.js";import{t as c}from"./QBtn-DoggJe1Q.js";import{O as l}from"./index-B2CzafCr.js";import{n as u}from"./vue-i18n.runtime-BpRrzZrT.js";import{n as d}from"./pinia-DCsnCHsH.js";import{d as f,f as p,l as m,o as h,s as g,u as _}from"./use-server-events-C13Sw-rU.js";import{n as v}from"./AppPage-DdmqiV2R.js";function y(e){if(e.length<2||e[0]!==`"`||e[e.length-1]!==`"`)return e;let t=e.slice(1,-1),n=[];for(let e=0;e<t.length;e++){let r=t[e];r===`\\`&&/^[0-7]{3}$/.test(t.slice(e+1,e+4))?(n.push(parseInt(t.slice(e+1,e+4),8)),e+=3):r===`\\`&&t[e+1]===`"`?(n.push(34),e+=1):r===`\\`&&t[e+1]===`\\`?(n.push(92),e+=1):n.push((r??``).charCodeAt(0))}return new TextDecoder(`utf-8`).decode(new Uint8Array(n))}function b(e){return e.newPath||e.oldPath}function x(e,t){return`${e}:${t}`}var S={typescript:()=>l(()=>import(`./typescript-Utq2Cl8c.js`),__vite__mapDeps([0,1])),tsx:()=>l(()=>import(`./tsx-udAQXfEw.js`),[]),javascript:()=>l(()=>import(`./javascript-Yelw-5ZN.js`),__vite__mapDeps([2,3])),jsx:()=>l(()=>import(`./jsx-Bz0zcwM4.js`),[]),vue:()=>l(()=>import(`./vue-CSBlZ1UP.js`),__vite__mapDeps([4,5,3,6,7,1])),json:()=>l(()=>import(`./json-CaljABEy.js`),__vite__mapDeps([8,7])),markdown:()=>l(()=>import(`./markdown-BYOwaDjH.js`),[]),css:()=>l(()=>import(`./css-CdtkT07m.js`),__vite__mapDeps([9,5])),scss:()=>l(()=>import(`./scss-DHtrkMkT.js`),__vite__mapDeps([10,5])),html:()=>l(()=>import(`./html-DDNsd9lV.js`),__vite__mapDeps([11,6,5,3])),yaml:()=>l(()=>import(`./yaml-rwi0_p6S.js`),[]),bash:()=>l(()=>import(`./bash-CLZ0U2zV.js`),[]),python:()=>l(()=>import(`./python-gzcpVVnB.js`),[]),go:()=>l(()=>import(`./go-rLFTqkRN.js`),[]),rust:()=>l(()=>import(`./rust-Cfkwpbl8.js`),[]),java:()=>l(()=>import(`./java-BXcb2rRD.js`),[]),kotlin:()=>l(()=>import(`./kotlin-DhhofPvG.js`),[])},C={light:()=>l(()=>import(`./github-light-EUqPIrTm.js`),[]),dark:()=>l(()=>import(`./github-dark-C-LZuMrd.js`),[])},w={light:`github-light`,dark:`github-dark`},T=null,E=new Set,D=new Map;function O(e){return S[e]!==void 0}async function k(e,t){try{await e.loadLanguage(S[t]()),E.add(t)}finally{D.delete(t)}}async function A(e){T||=(async()=>{let[{createHighlighterCore:e},{createOnigurumaEngine:t}]=await Promise.all([l(()=>import(`./core-Bumj8M77.js`),__vite__mapDeps([12,13,14])),l(()=>import(`./engine-oniguruma-B4iNeJbd.js`),__vite__mapDeps([15,13]))]);return e({themes:[C.light(),C.dark()],langs:[],engine:t(()=>l(()=>import(`./wasm-BnjxR4X6.js`),[]))})})();let t=await T;if(!E.has(e)){let n=D.get(e);n||(n=k(t,e),D.set(e,n)),await n}return t}async function ee(e,t,n={}){if(!O(e)||t.length===0)return`failed`;let r=n.documents??[{length:t.length,skip:0}];if(r.reduce((e,t)=>e+t.length,0)!==t.length)return`failed`;let{signal:i}=n;try{let a=await A(e),o=0,s=0,c=!0;for(let l of r){let r,u=Math.max(1,n.sliceSize??l.length);for(let d=0;d<l.length;d+=u){if(c||await n.yieldBetween?.(),c=!1,i?.aborted)return`aborted`;let f=Math.min(d+u,l.length),p=a.codeToTokensWithThemes(t.slice(o+d,o+f).join(`
2
+ import{P as e,_ as t,ct as n,l as r,ot as i,pt as a,s as o,w as s}from"./runtime-core.esm-bundler-BKFI1w28.js";import{t as c}from"./QBtn-DoggJe1Q.js";import{O as l}from"./index-BQi8n0xV.js";import{n as u}from"./vue-i18n.runtime-BpRrzZrT.js";import{n as d}from"./pinia-DCsnCHsH.js";import{a as f,c as p,i as m,n as h,s as g,t as _}from"./single-flight-DLCbzLI3.js";import{n as v}from"./AppPage-DdmqiV2R.js";function y(e){if(e.length<2||e[0]!==`"`||e[e.length-1]!==`"`)return e;let t=e.slice(1,-1),n=[];for(let e=0;e<t.length;e++){let r=t[e];r===`\\`&&/^[0-7]{3}$/.test(t.slice(e+1,e+4))?(n.push(parseInt(t.slice(e+1,e+4),8)),e+=3):r===`\\`&&t[e+1]===`"`?(n.push(34),e+=1):r===`\\`&&t[e+1]===`\\`?(n.push(92),e+=1):n.push((r??``).charCodeAt(0))}return new TextDecoder(`utf-8`).decode(new Uint8Array(n))}function b(e){return e.newPath||e.oldPath}function x(e,t){return`${e}:${t}`}var S={typescript:()=>l(()=>import(`./typescript-Utq2Cl8c.js`),__vite__mapDeps([0,1])),tsx:()=>l(()=>import(`./tsx-udAQXfEw.js`),[]),javascript:()=>l(()=>import(`./javascript-Yelw-5ZN.js`),__vite__mapDeps([2,3])),jsx:()=>l(()=>import(`./jsx-Bz0zcwM4.js`),[]),vue:()=>l(()=>import(`./vue-CSBlZ1UP.js`),__vite__mapDeps([4,5,3,6,7,1])),json:()=>l(()=>import(`./json-CaljABEy.js`),__vite__mapDeps([8,7])),markdown:()=>l(()=>import(`./markdown-BYOwaDjH.js`),[]),css:()=>l(()=>import(`./css-CdtkT07m.js`),__vite__mapDeps([9,5])),scss:()=>l(()=>import(`./scss-DHtrkMkT.js`),__vite__mapDeps([10,5])),html:()=>l(()=>import(`./html-DDNsd9lV.js`),__vite__mapDeps([11,6,5,3])),yaml:()=>l(()=>import(`./yaml-rwi0_p6S.js`),[]),bash:()=>l(()=>import(`./bash-CLZ0U2zV.js`),[]),python:()=>l(()=>import(`./python-gzcpVVnB.js`),[]),go:()=>l(()=>import(`./go-rLFTqkRN.js`),[]),rust:()=>l(()=>import(`./rust-Cfkwpbl8.js`),[]),java:()=>l(()=>import(`./java-BXcb2rRD.js`),[]),kotlin:()=>l(()=>import(`./kotlin-DhhofPvG.js`),[])},C={light:()=>l(()=>import(`./github-light-EUqPIrTm.js`),[]),dark:()=>l(()=>import(`./github-dark-C-LZuMrd.js`),[])},w={light:`github-light`,dark:`github-dark`},T=null,E=new Set,D=new Map;function O(e){return S[e]!==void 0}async function k(e,t){try{await e.loadLanguage(S[t]()),E.add(t)}finally{D.delete(t)}}async function A(e){T||=(async()=>{let[{createHighlighterCore:e},{createOnigurumaEngine:t}]=await Promise.all([l(()=>import(`./core-Bumj8M77.js`),__vite__mapDeps([12,13,14])),l(()=>import(`./engine-oniguruma-B4iNeJbd.js`),__vite__mapDeps([15,13]))]);return e({themes:[C.light(),C.dark()],langs:[],engine:t(()=>l(()=>import(`./wasm-BnjxR4X6.js`),[]))})})();let t=await T;if(!E.has(e)){let n=D.get(e);n||(n=k(t,e),D.set(e,n)),await n}return t}async function ee(e,t,n={}){if(!O(e)||t.length===0)return`failed`;let r=n.documents??[{length:t.length,skip:0}];if(r.reduce((e,t)=>e+t.length,0)!==t.length)return`failed`;let{signal:i}=n;try{let a=await A(e),o=0,s=0,c=!0;for(let l of r){let r,u=Math.max(1,n.sliceSize??l.length);for(let d=0;d<l.length;d+=u){if(c||await n.yieldBetween?.(),c=!1,i?.aborted)return`aborted`;let f=Math.min(d+u,l.length),p=a.codeToTokensWithThemes(t.slice(o+d,o+f).join(`
3
3
  `),{lang:e,themes:w,...r?{grammarState:r}:{}});r=a.getLastGrammarState(p);let m=Math.max(d,l.skip);f<=m||(n.onSlice?.(p.slice(m-d).map(e=>e.map(e=>({content:e.content,colorLight:e.variants.light?.color,colorDark:e.variants.dark?.color}))),s),s+=f-m)}o+=l.length}return`done`}catch{return`failed`}}var j=null,M=!1,N=1,P=new Map;function F(){return typeof Worker<`u`&&!M}function I(){let e=new Worker(new URL(`/assets/highlight.worker-BHCdEX06.js`,``+import.meta.url),{type:`module`});return e.addEventListener(`message`,e=>{let t=e.data,n=P.get(t.id);n&&(t.type===`slice`?n.onSlice(t.tokens,t.start):(P.delete(t.id),n.finish(t.ok?`done`:`failed`)))}),e.addEventListener(`error`,t=>{console.error(`The highlight worker failed, the main thread does the work now`,t),M=!0;for(let e of P.values())e.finish(`failed`);P.clear(),e.terminate(),j=null}),e}function L(e,t){e.postMessage(t)}function te(e,t,n){let{signal:r}=n;if(r?.aborted)return Promise.resolve(`aborted`);if(!j)try{j=I()}catch(e){return console.error(`The highlight worker did not start`,e),M=!0,Promise.resolve(`unsent`)}let i=j;return new Promise(a=>{let o=N++,s=()=>{P.delete(o)&&(j&&L(j,{type:`cancel`,id:o}),a(`aborted`))};P.set(o,{onSlice:(e,t)=>n.onSlice?.(e,t),finish:e=>{r?.removeEventListener(`abort`,s),a(e)}});try{L(i,{type:`tokenize`,id:o,lang:e,lines:Array.from(t),...n.documents?{documents:n.documents.map(e=>({...e}))}:{},sliceSize:n.sliceSize})}catch(e){console.error(`The highlight worker did not get the request`,e),P.delete(o),a(`unsent`);return}r?.addEventListener(`abort`,s,{once:!0})})}function R(){return typeof MessageChannel>`u`?new Promise(e=>setTimeout(e,0)):new Promise(e=>{let{port1:t,port2:n}=new MessageChannel;t.addEventListener(`message`,()=>{t.close(),e()},{once:!0}),t.start(),n.postMessage(null)})}var z=`import { ref, type Ref } from 'vue'
4
4
  import * as path from 'node:path'
5
5
  // A comment with a TODO and a URL: https://example.com
@@ -90,4 +90,4 @@ Some *emphasis*, **strong** text, \`inline code\` and a [link](https://example.c
90
90
  const answer: number = 42
91
91
  \`\`\`
92
92
  `,typescript:z,javascript:z,tsx:z,jsx:z};function ne(e){return(V[e]??`x`).split(`
93
- `)}var re=2e4,H=100,ie={ts:`typescript`,tsx:`tsx`,js:`javascript`,jsx:`jsx`,mjs:`javascript`,cjs:`javascript`,vue:`vue`,json:`json`,md:`markdown`,css:`css`,scss:`scss`,html:`html`,yml:`yaml`,yaml:`yaml`,sh:`bash`,py:`python`,go:`go`,rs:`rust`,java:`java`,kt:`kotlin`,kts:`kotlin`};function U(e){let t=e.split(`.`);return t.length<2?`text`:ie[t.pop().toLowerCase()]??`text`}function ae(e){return O(U(e))}function W(e,t,n,r,i){return ee(e,t,{documents:n,sliceSize:H,yieldBetween:R,signal:r,onSlice:i})}async function G(e,t,n,r,i){let a=[],o=(e,t)=>{a.splice(t,e.length,...e),r?.(a.slice())};if(!F())return K(await W(e,t,i,n,o),a);let s=await te(e,t,{sliceSize:H,documents:i,signal:n,onSlice:o});return(s===`unsent`||s===`failed`&&!F())&&(s=await W(e,t,i,n,o)),K(s,a)}function K(e,t){return e===`done`?t:e===`aborted`?void 0:null}var q=new Set;async function oe(e){await G(e,ne(e)).catch(()=>null)===null&&q.delete(e)}function se(e){if(!F())return;let t=new Set(e.map(U).filter(O));for(let e of t)q.has(e)||(q.add(e),oe(e))}var J=v(re,e=>e?.length??1),Y=Promise.resolve();function ce(e){let t=Y.then(()=>new Promise(e=>setTimeout(e,0))).then(e);return Y=t.catch(()=>void 0),t}function le(e,t,n,r,i,a){return ce(async()=>{let o=J.get(e);if(o!==void 0)return o;if(r?.aborted)return;let s=n(),c=await G(U(t),s,r,i,a?.());if(c!==void 0)return J.set(e,c),c})}function ue(e){return J.get(e)}function X(e){return{...e,oldPath:y(e.oldPath),newPath:y(e.newPath)}}function de(e){let{signature:t,...n}=e;return{...n,hunks:[]}}function Z(e,t,n){let r=new Map(e.map(e=>[b(e),e])),i=new Map;return{files:n.map(e=>{let n=b(e);i.set(n,e.signature);let a=r.get(n);return a&&t.get(n)===e.signature?a:de(e)}),signatures:i}}var Q=d(`diff`,()=>{let e=i([]),t=i([]),r=new Map,a=new Map,s=i(!1),c=i(!1),l=i(null),u=o(()=>s.value&&!c.value),d=o(()=>[...e.value,...t.value].map(e=>e.newPath||e.oldPath)),f=n(new Map),p=n(new Map),m=new Map;function v(n){return n===`staged`?e.value:t.value}function y(e,t){return f.value.get(x(e,b(t)))?.file}function S(e,t){return f.value.get(x(e,b(t)))?.for===t}function C(e,t){let n=p.value.get(x(e,b(t)));return n?.for===t?n.message:void 0}function w(e,t){let n=x(e,b(t));if(!p.value.has(n))return;let r=new Map(p.value);r.delete(n),p.value=r}function T(e,t){return w(e,t),E(e,t)}async function E(e,t){let n=x(e,b(t));if(S(e,t)||m.get(n)===t)return;m.set(n,t);let r=new URLSearchParams({path:t.newPath,oldPath:t.oldPath,status:t.status});try{let i=X(await _(`/api/diff/${e}/file?${r}`));if(!v(e).includes(t))return;f.value=new Map(f.value).set(n,{file:i,for:t}),w(e,t)}catch(r){if(!v(e).includes(t))return;p.value=new Map(p.value).set(n,{message:g(r),for:t})}finally{m.get(n)===t&&m.delete(n)}}function D(){let n=new Set([...e.value.map(e=>x(`staged`,b(e))),...t.value.map(e=>x(`unstaged`,b(e)))]),r=new Map([...f.value].filter(([e])=>n.has(e)));r.size!==f.value.size&&(f.value=r);let i=new Map([...p.value].filter(([e])=>n.has(e)));i.size!==p.value.size&&(p.value=i)}let O=h(k);async function k(){s.value=!0;try{let[n,i]=await Promise.all([_(`/api/diff/staged/files`),_(`/api/diff/unstaged/files`)]),o=Z(e.value,r,n.map(X)),s=Z(t.value,a,i.map(X));e.value=o.files,r=o.signatures,t.value=s.files,a=s.signatures,D(),se([...o.files,...s.files].map(b)),l.value=null}catch(n){c.value||(e.value=[],t.value=[],r=new Map,a=new Map),l.value=g(n)}finally{s.value=!1,c.value=!0}}return{stagedFiles:e,unstagedFiles:t,loading:s,loaded:c,initialLoading:u,error:l,changedPaths:d,hunksOf:y,hunksFresh:S,hunksError:C,clearHunksError:w,ensureHunks:E,retryHunks:T,fetchDiff:O}});function $(e){let{snapshotData:t,...n}=e;return n}var fe=d(`active-review`,()=>{let e=i(null),t=i([]),n=i(!1),r=o(()=>{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 a(){n.value=!0;try{let n=(await _(`/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 _(`/api/reviews/${e.value.id}/comments`):[]}finally{n.value=!1}}function s(n){e.value=$(n),t.value=[]}async function c(t){e.value&&(await f(`/api/reviews/${e.value.id}`,{status:t}),await a())}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 u(e,n){let r=await f(`/api/comments/${e}`,{content:n});t.value=t.value.map(t=>t.id===e?r:t)}async function d(e){await m(`/api/comments/${e}`),t.value=t.value.filter(t=>t.id!==e)}async function h(e){let n=await f(`/api/comments/${e}/resolve`);t.value=t.value.map(t=>t.id===e?n:t)}async function g(e){let n=await f(`/api/comments/${e}/unresolve`);t.value=t.value.map(t=>t.id===e?n:t)}return{activeReview:e,comments:t,loading:n,commentsByFile:r,refresh:a,setActiveReview:s,setStatus:c,createComment:l,editComment:u,deleteComment:d,resolveComment:h,unresolveComment:g}}),pe=t({__name:`CancelButton`,setup(t){let{t:n}=u();return(t,i)=>(e(),r(c,s({padding:`2px 8px`},t.$attrs,{dense:``,flat:``,color:`warning`,label:a(n)(`reviews.comments.cancel`)}),null,16,[`label`]))}}),me=t({__name:`CreateButton`,setup(t){let{t:n}=u();return(t,i)=>(e(),r(c,s({padding:`2px 8px`,label:a(n)(`reviews.create.submit`)},t.$attrs,{unelevated:``,dense:``,color:`accent`}),null,16,[`label`]))}});export{Q as a,le as c,b as d,y as f,$ as i,U as l,pe as n,ue as o,fe as r,ae as s,me as t,x as u};
93
+ `)}var re=2e4,H=100,ie={ts:`typescript`,tsx:`tsx`,js:`javascript`,jsx:`jsx`,mjs:`javascript`,cjs:`javascript`,vue:`vue`,json:`json`,md:`markdown`,css:`css`,scss:`scss`,html:`html`,yml:`yaml`,yaml:`yaml`,sh:`bash`,py:`python`,go:`go`,rs:`rust`,java:`java`,kt:`kotlin`,kts:`kotlin`};function U(e){let t=e.split(`.`);return t.length<2?`text`:ie[t.pop().toLowerCase()]??`text`}function ae(e){return O(U(e))}function W(e,t,n,r,i){return ee(e,t,{documents:n,sliceSize:H,yieldBetween:R,signal:r,onSlice:i})}async function G(e,t,n,r,i){let a=[],o=(e,t)=>{a.splice(t,e.length,...e),r?.(a.slice())};if(!F())return K(await W(e,t,i,n,o),a);let s=await te(e,t,{sliceSize:H,documents:i,signal:n,onSlice:o});return(s===`unsent`||s===`failed`&&!F())&&(s=await W(e,t,i,n,o)),K(s,a)}function K(e,t){return e===`done`?t:e===`aborted`?void 0:null}var q=new Set;async function oe(e){await G(e,ne(e)).catch(()=>null)===null&&q.delete(e)}function se(e){if(!F())return;let t=new Set(e.map(U).filter(O));for(let e of t)q.has(e)||(q.add(e),oe(e))}var J=v(re,e=>e?.length??1),Y=Promise.resolve();function ce(e){let t=Y.then(()=>new Promise(e=>setTimeout(e,0))).then(e);return Y=t.catch(()=>void 0),t}function le(e,t,n,r,i,a){return ce(async()=>{let o=J.get(e);if(o!==void 0)return o;if(r?.aborted)return;let s=n(),c=await G(U(t),s,r,i,a?.());if(c!==void 0)return J.set(e,c),c})}function ue(e){return J.get(e)}function X(e){return{...e,oldPath:y(e.oldPath),newPath:y(e.newPath)}}function de(e){let{signature:t,...n}=e;return{...n,hunks:[]}}function Z(e,t,n){let r=new Map(e.map(e=>[b(e),e])),i=new Map;return{files:n.map(e=>{let n=b(e);i.set(n,e.signature);let a=r.get(n);return a&&t.get(n)===e.signature?a:de(e)}),signatures:i}}var Q=d(`diff`,()=>{let e=i([]),t=i([]),r=new Map,a=new Map,s=i(!1),c=i(!1),l=i(null),u=o(()=>s.value&&!c.value),d=o(()=>[...e.value,...t.value].map(e=>e.newPath||e.oldPath)),p=n(new Map),m=n(new Map),g=new Map;function v(n){return n===`staged`?e.value:t.value}function y(e,t){return p.value.get(x(e,b(t)))?.file}function S(e,t){return p.value.get(x(e,b(t)))?.for===t}function C(e,t){let n=m.value.get(x(e,b(t)));return n?.for===t?n.message:void 0}function w(e,t){let n=x(e,b(t));if(!m.value.has(n))return;let r=new Map(m.value);r.delete(n),m.value=r}function T(e,t){return w(e,t),E(e,t)}async function E(e,t){let n=x(e,b(t));if(S(e,t)||g.get(n)===t)return;g.set(n,t);let r=new URLSearchParams({path:t.newPath,oldPath:t.oldPath,status:t.status});try{let i=X(await f(`/api/diff/${e}/file?${r}`));if(!v(e).includes(t))return;p.value=new Map(p.value).set(n,{file:i,for:t}),w(e,t)}catch(r){if(!v(e).includes(t))return;m.value=new Map(m.value).set(n,{message:h(r),for:t})}finally{g.get(n)===t&&g.delete(n)}}function D(){let n=new Set([...e.value.map(e=>x(`staged`,b(e))),...t.value.map(e=>x(`unstaged`,b(e)))]),r=new Map([...p.value].filter(([e])=>n.has(e)));r.size!==p.value.size&&(p.value=r);let i=new Map([...m.value].filter(([e])=>n.has(e)));i.size!==m.value.size&&(m.value=i)}let O=_(k);async function k(){s.value=!0;try{let[n,i]=await Promise.all([f(`/api/diff/staged/files`),f(`/api/diff/unstaged/files`)]),o=Z(e.value,r,n.map(X)),s=Z(t.value,a,i.map(X));e.value=o.files,r=o.signatures,t.value=s.files,a=s.signatures,D(),se([...o.files,...s.files].map(b)),l.value=null}catch(n){c.value||(e.value=[],t.value=[],r=new Map,a=new Map),l.value=h(n)}finally{s.value=!1,c.value=!0}}return{stagedFiles:e,unstagedFiles:t,loading:s,loaded:c,initialLoading:u,error:l,changedPaths:d,hunksOf:y,hunksFresh:S,hunksError:C,clearHunksError:w,ensureHunks:E,retryHunks:T,fetchDiff:O}});function $(e){let{snapshotData:t,...n}=e;return n}var fe=d(`active-review`,()=>{let e=i(null),t=i([]),n=i(!1),r=o(()=>{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 a(){n.value=!0;try{let n=(await f(`/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 f(`/api/reviews/${e.value.id}/comments`):[]}finally{n.value=!1}}function s(n){e.value=$(n),t.value=[]}async function c(t){e.value&&(await g(`/api/reviews/${e.value.id}`,{status:t}),await a())}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 u(e,n){let r=await g(`/api/comments/${e}`,{content:n});t.value=t.value.map(t=>t.id===e?r:t)}async function d(e){await m(`/api/comments/${e}`),t.value=t.value.filter(t=>t.id!==e)}async function h(e){let n=await g(`/api/comments/${e}/resolve`);t.value=t.value.map(t=>t.id===e?n:t)}async function _(e){let n=await g(`/api/comments/${e}/unresolve`);t.value=t.value.map(t=>t.id===e?n:t)}return{activeReview:e,comments:t,loading:n,commentsByFile:r,refresh:a,setActiveReview:s,setStatus:c,createComment:l,editComment:u,deleteComment:d,resolveComment:h,unresolveComment:_}}),pe=t({__name:`CancelButton`,setup(t){let{t:n}=u();return(t,i)=>(e(),r(c,s({padding:`2px 8px`},t.$attrs,{dense:``,flat:``,color:`warning`,label:a(n)(`reviews.comments.cancel`)}),null,16,[`label`]))}}),me=t({__name:`CreateButton`,setup(t){let{t:n}=u();return(t,i)=>(e(),r(c,s({padding:`2px 8px`,label:a(n)(`reviews.create.submit`)},t.$attrs,{unelevated:``,dense:``,color:`accent`}),null,16,[`label`]))}});export{Q as a,le as c,b as d,y as f,$ as i,U as l,pe as n,ue as o,fe as r,ae as s,me as t,x as u};
@@ -0,0 +1 @@
1
+ import{C as e,J as t,P as n,S as r,U as i,Y as a,_ as o,b as s,c,d as l,h as u,kt as d,l as f,ot as p,pt as m,r as h,s as g,v as _,w as v}from"./runtime-core.esm-bundler-BKFI1w28.js";import{O as y,_ as b,m as x,o as S,p as C}from"./use-router-link-BGc0noIO.js";import{t as w}from"./create-BSmXD9Zr.js";import{t as T}from"./QInput-DJgTh2Qy.js";import{l as E}from"./QBtn-DoggJe1Q.js";import{a as D,c as O,o as k,s as A}from"./index-BQi8n0xV.js";import{n as j}from"./vue-i18n.runtime-BpRrzZrT.js";import{n as M,r as N}from"./pinia-DCsnCHsH.js";import{a as P,c as F,n as I}from"./single-flight-DLCbzLI3.js";import{a as L,t as R}from"./ClosePopup-p9VBZw3j.js";import{t as z}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{a as B,i as V,n as H,r as U,t as W}from"./CreateButton-B7-yiqQx.js";import{t as G}from"./QFab-B5iz2kQR.js";var K=o({__name:`SearchInput`,props:{modelValue:{},modelModifiers:{}},emits:[`update:modelValue`],setup(e){let r=i(e,`modelValue`);return(e,i)=>(n(),f(T,v({modelValue:r.value,"onUpdate:modelValue":i[0]||=e=>r.value=e},e.$attrs,{dense:``,outlined:``,clearable:``}),{prepend:t(()=>[u(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}=_(),t=C(),n=r(b,x);if(n===x)return console.error(`QPageSticky needs to be child of QLayout`),x;let i=g(()=>{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=g(()=>n.header.offset),o=g(()=>n.right.offset),c=g(()=>n.footer.offset),l=g(()=>n.left.offset),u=g(()=>{let n=0,r=0,s=i.value,u=t.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?n=`${u*l.value}px`:s.right&&o.value!==0&&(n=`${-u*o.value}px`);let d={transform:`translate(${n}, ${r})`};return e.offset&&(d.margin=`${e.offset[1]}px ${e.offset[0]}px`),s.vertical?(l.value!==0&&(d[t.lang.rtl?`right`:`left`]=`${l.value}px`),o.value!==0&&(d[t.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=g(()=>`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 s(`div`,{class:d.value,style:u.value},e.expand?n:[s(`div`,n)])}return{$layout:n,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(o({__name:`ReviewCreateDialog`,props:{modelValue:{type:Boolean,required:!0},modelModifiers:{}},emits:e([`created`,`hide`],[`update:modelValue`]),setup(e,{emit:r}){let o=i(e,`modelValue`),s=r,{t:l}=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}:{});o.value=!1,b(),s(`created`,t)}catch(e){v.value=I(e)}finally{_.value=!1}}function S(){b(),s(`hide`)}return(e,r)=>(n(),f(O,{modelValue:o.value,"onUpdate:modelValue":r[1]||=e=>o.value=e,onHide:S},{default:t(()=>[u(A,{class:`review-create-dialog`},{default:t(()=>[u(k,null,{default:t(()=>[c(`div`,Q,d(m(l)(`reviews.create.title`)),1)]),_:1}),u(k,{class:`q-gutter-y-md`},{default:t(()=>[u(T,{modelValue:g.value,"onUpdate:modelValue":r[0]||=e=>g.value=e,dense:``,outlined:``,label:m(l)(`reviews.create.nameLabel`),hint:m(l)(`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}),u(D,{align:`right`},{default:t(()=>[a(u(H,null,null,512),[[R]]),u(W,{loading:_.value,onClick:x},null,8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]))}}),[[`__scopeId`,`data-v-095646d6`]]),ee=o({__name:`CreateReviewFabButton`,emits:[`created`],setup(e,{emit:r}){let i=r,o=U(),s=B(),{activeReview:c}=N(o),{changedPaths:d}=N(s),f=p(!1),m=p(!1),_=p([18,18]),v=p(!1),y=g(()=>d.value.length===0||c.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){o.setActiveReview(e),i(`created`,e)}return(e,r)=>(n(),l(h,null,[u(Y,{position:`bottom-right`,offset:_.value},{default:t(()=>[a(u(G,{modelValue:m.value,"onUpdate:modelValue":r[0]||=e=>m.value=e,icon:`add`,color:`accent`,disable:y.value||v.value,onClick:r[1]||=e=>f.value=!0},null,8,[`modelValue`,`disable`]),[[L,b,void 0,{prevent:!0,mouse:!0}]])]),_:1},8,[`offset`]),u($,{modelValue:f.value,"onUpdate:modelValue":r[2]||=e=>f.value=e,onCreated:x,onHide:r[3]||=e=>m.value=!1},null,8,[`modelValue`])],64))}});export{Z as n,K as r,ee as t};
@@ -0,0 +1 @@
1
+ import{C as e,Dt as t,F as n,I as r,J as i,K as a,M as o,O as s,Ot as c,P as l,R as u,T as d,U as f,W as p,Y as m,_ as h,c as g,ct as _,d as v,ft as y,h as b,j as x,kt as S,l as C,m as w,ot as T,pt as E,r as D,rt as O,s as k,tt as A,u as j}from"./runtime-core.esm-bundler-BKFI1w28.js";import{O as M,k as N,p as P}from"./use-router-link-BGc0noIO.js";import{a as F,i as I,l as L,t as R}from"./QBtn-DoggJe1Q.js";import{i as z,j as B,t as V}from"./index-BQi8n0xV.js";import{n as H}from"./vue-i18n.runtime-BpRrzZrT.js";import{n as ee,r as U}from"./pinia-DCsnCHsH.js";import{a as te,c as W,n as G,t as ne}from"./single-flight-DLCbzLI3.js";import{t as re}from"./safe-storage-BACMX75F.js";import{n as ie}from"./use-server-events-BrBCbeHu.js";import{f as ae,t as oe}from"./agent-store-1i-UjEzZ.js";import{c as se,n as ce,t as le}from"./QSpace-CqqgY-zX.js";import{r as ue}from"./use-virtual-scroll-BSXYZjZ5.js";import{c as K,s as q}from"./ClosePopup-p9VBZw3j.js";import{t as J}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{n as de,t as fe}from"./QScrollArea-BrOkfO1I.js";import{n as pe,r as me,t as he}from"./QVirtualScroll-BoXSHM25.js";import{a as Y,d as X,f as ge,r as Z,u as _e}from"./CreateButton-B7-yiqQx.js";import{t as ve}from"./AppPage-DdmqiV2R.js";import{_ as ye,a as be,b as xe,c as Se,d as Ce,f as we,g as Te,h as Ee,i as De,l as Oe,m as ke,n as Ae,o as je,p as Me,r as Ne,s as Pe,t as Fe,u as Ie,v as Le,x as Re,y as ze}from"./StatusSwitcher-8QUHj5Rq.js";import{t as Be}from"./PanelResize-D1cRotAi.js";import{r as Ve,t as He}from"./CreateReviewFabButton-BJOAdPG1.js";import{t as Ue}from"./use-add-agent-context-BE_z8acF.js";var We=8,Ge=12,Ke=20;function Q(e,t){return We+e*Ge+(t?Ke:0)}function qe(e){return e.toSorted((e,t)=>e.type===t.type?e.name.localeCompare(t.name):e.type===`directory`?-1:1).map(e=>({...e,children:e.children?qe(e.children):void 0}))}function Je(e,t){let n=[],r=new Map,i=e=>{let t=r.get(e);return t||(t=new Map,r.set(e,t)),t};for(let r of e){let e=r.split(`/`),a=n,o=``;for(let n=0;n<e.length;n++){let s=e[n];if(!s)continue;let c=n===e.length-1;o=o===``?s:`${o}/${s}`;let l=`${c?`f`:`d`}:${s}`,u=i(a),d=u.get(l);d||(d={name:s,path:c?r:o,type:c?`file`:`directory`,isChanged:c?t.has(r):!1,children:c?void 0:[]},a.push(d),u.set(l,d)),!c&&d.children&&(a=d.children)}}return qe(n)}function Ye(e,t){if(!t.trim())return e;let n=t.toLowerCase(),r=e=>{if(e.type===`file`)return e.path.toLowerCase().includes(n)?e:null;let t=e.children?.map(r).filter(e=>e!==null);return t&&t.length>0?{...e,children:t}:e.name.toLowerCase().includes(n)?e:null};return e.map(r).filter(e=>e!==null)}function Xe(e,t,n){let r=[],i=(e,a)=>{for(let o of e){if(o.type===`file`){r.push({kind:`file`,path:o.path,name:o.name,depth:a});continue}let e=o,s=[e.path],c=[e.name];for(;e.children?.length===1&&e.children[0]?.type===`directory`;)e=e.children[0],s.push(e.path),c.push(e.name);let l=n||!s.some(e=>t.has(e));r.push({kind:`folder`,path:e.path,paths:s,name:c.join(`/`),depth:a,expanded:l}),l&&i(e.children??[],a+1)}};return i(e,0),r}function Ze(){let e=T([]),t=T(!1),n=T(!1),r=T(null),i=k(()=>!n.value),a=0;async function o(i,o=[]){let s=++a;t.value=!0;try{let t=await te(`/api/git/tree/${encodeURIComponent(i)}`);if(s!==a)return;e.value=Je(t.files.map(ge),new Set(o)),r.value=null}catch(e){if(s!==a)return;r.value=G(e)}finally{s===a&&(t.value=!1,n.value=!0)}}function s(){++a,e.value=[],t.value=!1,n.value=!1,r.value=null}return{tree:e,loading:t,initialLoading:i,error:r,fetchTree:o,reset:s}}var Qe=`githuman.diffListMode`;function $e(){return re.get(Qe)===`tree`?`tree`:`list`}function et(e,t=new Set){for(let n of e)n.type===`directory`&&(t.add(n.path),et(n.children??[],t));return t}function tt(e){return e.type===`file`?e.isChanged:e.children?.some(tt)??!1}var $=ee(`file-explorer`,()=>{let e=Y(),{tree:t,initialLoading:n,error:r,fetchTree:i,reset:o}=Ze(),{lines:s,isBinary:c,loading:l,error:u,fetchContent:d,reset:f}=Re(),p=T(`unstaged`),m=T(!1),h=T(``),g=T(null),_=T(new Set),v=T(new Set),y=T($e()),b=T(new Set),x=T(null),S=T(0),C=k(()=>p.value===`staged`?e.stagedFiles:e.unstagedFiles),w=k(()=>new Map(C.value.map(e=>[X(e),e]))),E=k(()=>y.value===`tree`?Je(C.value.map(X),new Set):[]),D=k(()=>{let e=C.value;if(y.value===`list`)return e;let t=w.value,n=Xe(E.value,new Set,!0).flatMap(e=>e.kind===`file`?t.get(e.path)??[]:[]),r=new Set(n);return[...n,...e.filter(e=>!r.has(e))]}),O=k(()=>D.value.some(e=>v.value.has(X(e)))),A=k(()=>(h.value??``).trim()!==``),j=k(()=>{let e=(h.value??``).trim().toLowerCase();return e?D.value.filter(t=>X(t).toLowerCase().includes(e)):D.value}),M=k(()=>{let e=w.value;return Xe(Ye(E.value,(h.value??``).trim()),b.value,A.value).flatMap(t=>{if(t.kind===`folder`)return[t];let n=e.get(t.path);return n?[{...t,file:n}]:[]})}),N=k(()=>Ye(t.value,h.value??``)),P=k(()=>{let e=0,n=t=>{for(let r of t)r.type===`file`?e++:r.children&&n(r.children)};return n(t.value),e});a(t,e=>{let t=new Set,n=e=>{for(let r of e)r.type===`directory`&&r.children&&(tt(r)&&t.add(r.path),n(r.children))};n(e),_.value=t},{immediate:!0}),a(p,()=>{g.value=null,v.value=new Set,b.value=new Set,x.value=null,S.value++}),a(E,e=>{if(y.value!==`tree`||b.value.size===0)return;let t=et(e),n=[...b.value].filter(e=>t.has(e));n.length<b.value.size&&(b.value=new Set(n))}),a(g,e=>{if(m.value){if(!e){f();return}d(e,`WORKTREE`)}}),a(y,e=>{re.set(Qe,e),g.value&&!m.value&&U(g.value)});function F(e){let t=new Set(b.value),n=e.some(e=>t.has(e));for(let r of e)n?t.delete(r):t.add(r);b.value=t}function I(e){let t=new Set(_.value);t.has(e)?t.delete(e):t.add(e),_.value=t}function L(e){let t=new Set(v.value);t.has(e)?t.delete(e):t.add(e),v.value=t}function R(e){g.value=e,L(e)}function z(e){g.value=e,v.value.has(e)||(v.value=new Set(v.value).add(e))}function B(){v.value=new Set(D.value.map(X)),S.value++}function V(){v.value=new Set,S.value++}function H(){D.value.length&&(O.value?V():B())}function ee(e){g.value=e,!m.value&&(v.value.has(e)||(v.value=new Set(v.value).add(e)),U(e))}function U(e){let t=D.value.findIndex(t=>X(t)===e);t<0||(x.value={path:e,index:t,seq:(x.value?.seq??0)+1})}let te=0,W=T(!1),G=ne(async()=>{W.value=!0;try{await e.fetchDiff(),m.value&&(await i(`WORKTREE`,e.changedPaths),g.value&&await d(g.value,`WORKTREE`))}finally{W.value=!1}});a(m,e=>{h.value=``,g.value=null,e?G():(o(),f())});async function ie(){te=Date.now(),await G()}async function ae(){Date.now()-te<400||await G()}return{source:p,browseMode:m,filter:h,selectedPath:g,expandedFolders:_,expandedFiles:v,diffListMode:y,collapsedDiffFolders:b,scrollRequest:x,layoutVersion:S,tree:t,treeInitialLoading:n,treeError:r,refreshing:W,browseFileLines:s,browseFileIsBinary:c,browseFileLoading:l,browseFileError:u,diffFiles:D,hasExpandedFiles:O,filtering:A,filteredDiffFiles:j,diffTreeRows:M,filteredTree:N,totalTreeFiles:P,toggleFolder:I,toggleDiffFolder:F,toggleFileCard:L,handleCardToggle:R,expandFile:z,expandAllFiles:B,collapseAllFiles:V,toggleAllFiles:H,selectFile:ee,refresh:ie,refreshFromServerEvent:ae}}),nt={class:`row items-center no-wrap q-gutter-x-xs`},rt={class:`row items-center no-wrap q-gutter-x-xs`},it=h({__name:`FileExplorerTabs`,props:e({stagedFilesLength:{},unstagedFilesLength:{}},{modelValue:{default:`unstaged`},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=f(e,`modelValue`),{t:n}=H();return(r,a)=>(l(),C(pe,{modelValue:t.value,"onUpdate:modelValue":a[0]||=e=>t.value=e,dense:``,"no-caps":``,align:`left`,"narrow-indicator":``,class:`text-primary q-mb-sm`},{default:i(()=>[b(me,{name:`unstaged`},{default:i(()=>[g(`div`,nt,[g(`span`,null,S(E(n)(`changes.unstaged`)),1),b(de,{color:`warning`,rounded:``},{default:i(()=>[w(S(e.unstagedFilesLength),1)]),_:1})])]),_:1}),b(me,{name:`staged`},{default:i(()=>[g(`div`,rt,[g(`span`,null,S(E(n)(`changes.staged`)),1),b(de,{color:`positive`,rounded:``},{default:i(()=>[w(S(e.stagedFilesLength),1)]),_:1})])]),_:1})]),_:1},8,[`modelValue`]))}}),at={class:`file-tree-node`},ot={class:`row items-center no-wrap q-gutter-x-xs`},st=[`data-tooltip`],ct=[`data-tooltip`],lt={key:2},ut=J(h({__name:`FileTreeNode`,props:{node:{},selectedPath:{},expandedFolders:{},level:{}},emits:[`toggle-folder`,`file-select`],setup(e,{emit:n}){let a=n;return(n,o)=>{let s=u(`FileTreeNode`,!0);return l(),v(`div`,at,[e.node.type===`directory`?m((l(),C(q,{key:0,clickable:``,dense:``,style:c({paddingLeft:`${E(Q)(e.level,!1)}px`}),onClick:o[0]||=t=>a(`toggle-folder`,e.node.path)},{default:i(()=>[b(K,{avatar:``,class:`file-tree-node__icon-section`},{default:i(()=>[g(`div`,ot,[b(L,{name:`chevron_right`,size:`xs`,class:t([`file-tree-node__chevron`,{"file-tree-node__chevron--expanded":e.expandedFolders.has(e.node.path)}])},null,8,[`class`]),b(L,{name:e.expandedFolders.has(e.node.path)?`folder_open`:`folder`,size:`xs`,color:`warning`},null,8,[`name`])])]),_:1}),b(K,{class:`text-mono`},{default:i(()=>[g(`div`,{class:`ellipsis file-tree-node__label`,"data-tooltip":e.node.path},S(e.node.name),9,st)]),_:1}),e.node.children?(l(),C(K,{key:0,side:``,class:`text-caption text-grey-6`},{default:i(()=>[w(S(e.node.children.length),1)]),_:1})):j(``,!0)]),_:1},8,[`style`])),[[I]]):m((l(),C(q,{key:1,clickable:``,dense:``,active:e.node.path===e.selectedPath,"active-class":`file-tree-node--selected`,style:c({paddingLeft:`${E(Q)(e.level,!0)}px`}),onClick:o[1]||=t=>a(`file-select`,e.node.path)},{default:i(()=>[b(K,{avatar:``,class:`file-tree-node__icon-section`},{default:i(()=>[b(L,{name:`insert_drive_file`,size:`xs`,color:`grey-6`})]),_:1}),b(K,{class:`text-mono`},{default:i(()=>[g(`div`,{class:`ellipsis file-tree-node__label`,"data-tooltip":e.node.path},S(e.node.name),9,ct)]),_:1}),e.node.isChanged?(l(),C(K,{key:0,side:``},{default:i(()=>[b(L,{name:`fiber_manual_record`,size:`8px`,color:`warning`})]),_:1})):j(``,!0)]),_:1},8,[`active`,`style`])),[[I]]),e.node.type===`directory`&&e.expandedFolders.has(e.node.path)&&e.node.children?(l(),v(`div`,lt,[(l(!0),v(D,null,r(e.node.children,t=>(l(),C(s,{key:t.path,node:t,"selected-path":e.selectedPath,"expanded-folders":e.expandedFolders,level:e.level+1,onToggleFolder:o[2]||=e=>a(`toggle-folder`,e),onFileSelect:o[3]||=e=>a(`file-select`,e)},null,8,[`node`,`selected-path`,`expanded-folders`,`level`]))),128))])):j(``,!0)])}}}),[[`__scopeId`,`data-v-ef4a1d44`]]);function dt(){let e=P(),{t}=H(),n=se(),r=$(),i=Z();async function a(e,i,a){try{await W(i,{paths:[e]}),await r.refresh()}catch(e){n(t(a),e)}}function o(n){let r=(i.commentsByFile.get(n)??[]).filter(e=>!e.resolved).length;if(r===0)return a(n,`/api/git/stage`,`changes.actions.stageError`);e.dialog({title:t(`changes.actions.stageUnresolvedTitle`),message:t(`changes.actions.stageUnresolvedMessage`,{path:n,count:r}),persistent:!0,ok:{label:t(`changes.actions.stageUnresolvedOk`),flat:!0},cancel:{label:t(`changes.actions.discardConfirmCancel`),flat:!0}}).onOk(()=>{a(n,`/api/git/stage`,`changes.actions.stageError`)})}function s(e){return a(e,`/api/git/unstage`,`changes.actions.unstageError`)}function c(n){e.dialog({title:t(`changes.actions.discardConfirmTitle`),message:t(`changes.actions.discardConfirmMessage`,{path:n}),persistent:!0,ok:{label:t(`changes.actions.discardConfirmOk`),color:`negative`,flat:!0},cancel:{label:t(`changes.actions.discardConfirmCancel`),flat:!0}}).onOk(()=>{a(n,`/api/git/discard`,`changes.actions.discardError`)})}return{stage:o,unstage:s,discard:c}}var ft={class:`file-list-item__path-row row no-wrap items-center`},pt=[`data-tooltip`],mt={class:`text-caption`},ht={class:`text-positive`},gt={class:`text-negative q-ml-xs`},_t=J(h({__name:`FileListItem`,props:{file:{},selected:{type:Boolean},source:{},label:{},depth:{}},emits:[`click`],setup(e){let n={added:`A`,modified:`M`,deleted:`D`,renamed:`R`},r={added:`positive`,modified:`warning`,deleted:`negative`,renamed:`purple`},a=e,{t:o}=H(),{stage:s,unstage:u,discard:d}=dt(),f=Z(),p=k(()=>X(a.file)),h=k(()=>f.commentsByFile.get(p.value)?.length??0);return(a,f)=>m((l(),C(q,{clickable:``,dense:``,class:`file-list-item`,active:e.selected,"active-class":`file-list-item--selected`,"aria-label":e.label===void 0?void 0:p.value,style:c(e.depth===void 0?void 0:{paddingLeft:`${E(Q)(e.depth,!0)}px`}),onClick:f[3]||=e=>a.$emit(`click`)},{default:i(()=>[b(K,{avatar:``,class:`file-list-item__icon-section`},{default:i(()=>[g(`span`,{class:t([`text-caption text-weight-bold text-mono`,`text-${r[e.file.status]}`])},S(n[e.file.status]),3)]),_:1}),b(K,{class:`text-mono`},{default:i(()=>[g(`div`,ft,[g(`span`,{class:`ellipsis file-list-item__path-label`,"data-tooltip":p.value},S(e.label??p.value),9,pt),h.value>0?(l(),C(xe,{key:0,compact:``,class:`file-list-item__badge`,count:h.value},null,8,[`count`])):j(``,!0)])]),_:1}),b(K,{side:``,class:`file-list-item__stats`},{default:i(()=>[g(`span`,mt,[g(`span`,ht,`+`+S(e.file.additions),1),g(`span`,gt,`-`+S(e.file.deletions),1)])]),_:1}),b(K,{side:``,class:`file-list-item__actions`},{default:i(()=>[e.source===`unstaged`?(l(),v(D,{key:0},[m(b(R,{flat:``,dense:``,round:``,size:`sm`,icon:`undo`,"aria-label":E(o)(`changes.actions.discard`),"data-tooltip":E(o)(`changes.actions.discard`),onClick:f[0]||=N(e=>E(d)(p.value),[`stop`])},null,8,[`aria-label`,`data-tooltip`]),[[I]]),m(b(R,{flat:``,dense:``,round:``,size:`sm`,icon:`add`,"aria-label":E(o)(`changes.actions.stage`),"data-tooltip":E(o)(`changes.actions.stage`),onClick:f[1]||=N(e=>E(s)(p.value),[`stop`])},null,8,[`aria-label`,`data-tooltip`]),[[I]])],64)):m((l(),C(R,{key:1,flat:``,dense:``,round:``,size:`sm`,icon:`remove`,"aria-label":E(o)(`changes.actions.unstage`),"data-tooltip":E(o)(`changes.actions.unstage`),onClick:f[2]||=N(e=>E(u)(p.value),[`stop`])},null,8,[`aria-label`,`data-tooltip`])),[[I]])]),_:1})]),_:1},8,[`active`,`aria-label`,`style`])),[[I]])}}),[[`__scopeId`,`data-v-a94df6a5`]]),vt=h({__name:`BrowseModeToggle`,props:{modelValue:{type:Boolean,default:!1},modelModifiers:{}},emits:[`update:modelValue`],setup(e){let t=f(e,`modelValue`),{t:n}=H();return(e,r)=>(l(),C(q,null,{default:i(()=>[b(K,null,{default:i(()=>[b(ue,null,{default:i(()=>[w(S(E(n)(`browse.toggle`)),1)]),_:1})]),_:1}),b(K,{side:``},{default:i(()=>[b(V,{modelValue:t.value,"onUpdate:modelValue":r[0]||=e=>t.value=e,dense:``,size:`xs`},null,8,[`modelValue`])]),_:1})]),_:1}))}}),yt={class:`row items-center no-wrap q-gutter-x-xs`},bt=[`data-tooltip`],xt=J(h({__name:`DiffTreeFolderRow`,props:{name:{},path:{},depth:{},expanded:{type:Boolean},locked:{type:Boolean}},emits:[`toggle`],setup(e){let{t:n}=H();return(r,a)=>m((l(),C(q,{clickable:!e.locked,dense:``,class:`file-list-item diff-tree-folder-row`,style:c({paddingLeft:`${E(Q)(e.depth,!1)}px`}),"aria-expanded":e.locked?void 0:e.expanded,"aria-label":e.locked?void 0:E(n)(`changes.listMode.folder`,{path:e.path}),onClick:a[0]||=e=>r.$emit(`toggle`)},{default:i(()=>[b(K,{avatar:``,class:`diff-tree-folder-row__icons`},{default:i(()=>[g(`div`,yt,[b(L,{name:`chevron_right`,size:`xs`,class:t([`diff-tree-folder-row__chevron`,{"diff-tree-folder-row__chevron--expanded":e.expanded,invisible:e.locked}])},null,8,[`class`]),b(L,{name:e.expanded?`folder_open`:`folder`,size:`xs`,color:`warning`},null,8,[`name`])])]),_:1}),b(K,{class:`text-mono`},{default:i(()=>[g(`span`,{class:`ellipsis`,"data-tooltip":e.path},S(e.name),9,bt)]),_:1})]),_:1},8,[`clickable`,`style`,`aria-expanded`,`aria-label`])),[[I,!e.locked]])}}),[[`__scopeId`,`data-v-e82c6cd4`]]),St={class:`file-list-panel__header q-pa-sm`},Ct={key:1,class:`text-subtitle2 q-mb-sm`},wt={key:0,class:`text-primary`},Tt={class:`row no-wrap items-center q-gutter-x-xs`},Et={key:0,class:`row justify-center q-pa-lg`},Dt={key:0,class:`text-caption text-grey-6 q-px-md q-py-sm`},Ot={key:0,class:`text-caption text-grey-6 q-px-md q-py-sm`},kt=32,At=J(h({__name:`FileListPanel`,setup(e){let{t}=H(),{stagedFiles:n,unstagedFiles:a,initialLoading:o,error:s}=U(Y()),c=$(),{source:u,browseMode:d,filter:f,selectedPath:p,expandedFolders:m,treeInitialLoading:h,treeError:_,filteredDiffFiles:y,diffTreeRows:x,diffListMode:O,filtering:M,filteredTree:N,totalTreeFiles:P}=U(c),I=T(null),L=k(()=>I.value?.getScrollTarget()??null);return(e,T)=>(l(),v(D,null,[g(`div`,St,[E(d)?(l(),v(`div`,Ct,[w(S(E(t)(`browse.allFiles`))+` `,1),E(P)>0||!E(_)?(l(),v(`span`,wt,`(`+S(E(P))+`)`,1)):j(``,!0)])):(l(),C(it,{key:0,modelValue:E(u),"onUpdate:modelValue":T[0]||=e=>A(u)?u.value=e:null,"staged-files-length":E(n).length,"unstaged-files-length":E(a).length},null,8,[`modelValue`,`staged-files-length`,`unstaged-files-length`])),g(`div`,Tt,[b(Ve,{modelValue:E(f),"onUpdate:modelValue":T[1]||=e=>A(f)?f.value=e:null,class:`col`,placeholder:E(d)?E(t)(`browse.searchPlaceholder`):E(t)(`changes.filterPlaceholder`)},null,8,[`modelValue`,`placeholder`]),E(d)?j(``,!0):(l(),C(R,{key:0,flat:``,dense:``,round:``,size:`sm`,icon:`account_tree`,color:E(O)===`tree`?`primary`:void 0,"aria-label":E(t)(`changes.listMode.tree`),"aria-pressed":E(O)===`tree`,onClick:T[2]||=e=>O.value=E(O)===`tree`?`list`:`tree`},{default:i(()=>[b(B,{delay:E(500)},{default:i(()=>[w(S(E(t)(`changes.listMode.tree`)),1)]),_:1},8,[`delay`])]),_:1},8,[`color`,`aria-label`,`aria-pressed`]))])]),b(z),b(fe,{ref_key:`scrollArea`,ref:I,class:`col file-list-panel__scroll`,"content-style":`padding: 4px 0`,"content-active-style":`padding: 4px 0`},{default:i(()=>[(E(d)?E(h):E(o))?(l(),v(`div`,Et,[b(F,{color:`primary`,size:`2em`})])):E(d)?(l(),v(D,{key:1},[E(N).length===0&&(!E(_)||E(f)&&E(P)>0)?(l(),v(`p`,Dt,S(E(f)?E(t)(`browse.noMatchingFiles`):E(t)(`browse.noFiles`)),1)):j(``,!0),(l(!0),v(D,null,r(E(N),e=>(l(),C(ut,{key:e.path,node:e,"selected-path":E(p),"expanded-folders":E(m),level:0,onToggleFolder:E(c).toggleFolder,onFileSelect:E(c).selectFile},null,8,[`node`,`selected-path`,`expanded-folders`,`onToggleFolder`,`onFileSelect`]))),128))],64)):(l(),v(D,{key:2},[E(y).length===0&&(E(f)||!E(s))?(l(),v(`p`,Ot,S(E(f)?E(t)(`browse.noMatchingFiles`):E(t)(`changes.emptyFileList`)),1)):j(``,!0),L.value&&E(O)===`tree`?(l(),C(he,{key:`${E(u)}:tree`,"scroll-target":L.value,items:E(x),"virtual-scroll-item-size":kt},{default:i(({item:e})=>[e.kind===`folder`?(l(),C(xt,{key:`d:${e.path}`,name:e.name,path:e.path,depth:e.depth,expanded:e.expanded,locked:E(M),onToggle:t=>E(c).toggleDiffFolder(e.paths)},null,8,[`name`,`path`,`depth`,`expanded`,`locked`,`onToggle`])):(l(),C(_t,{key:`f:${e.path}`,file:e.file,label:e.name,depth:e.depth,selected:E(p)===e.path,source:E(u),onClick:t=>E(c).selectFile(e.path)},null,8,[`file`,`label`,`depth`,`selected`,`source`,`onClick`]))]),_:1},8,[`scroll-target`,`items`])):L.value?(l(),C(he,{key:`${E(u)}:list`,"scroll-target":L.value,items:E(y),"virtual-scroll-item-size":kt},{default:i(({item:e})=>[(l(),C(_t,{key:E(X)(e),file:e,selected:E(p)===E(X)(e),source:E(u),onClick:t=>E(c).selectFile(E(X)(e))},null,8,[`file`,`selected`,`source`,`onClick`]))]),_:1},8,[`scroll-target`,`items`])):j(``,!0)],64))]),_:1},512),b(z),b(vt,{modelValue:E(d),"onUpdate:modelValue":T[3]||=e=>A(d)?d.value=e:null},null,8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-bdc095b7`]]),jt=[`wheel`,`pointerdown`,`keydown`,`touchstart`];function Mt(e){let t=e.inputTarget??(typeof document>`u`?null:document),n=e.follow??ye,r=null,i;function o(){r=y(e.request),i?.(),i=void 0}for(let e of jt)t?.addEventListener(e,o,{capture:!0,passive:!0});let s=a([()=>y(e.request),()=>y(e.list),()=>y(e.root)],([t,a,o],s,c)=>{if(!t||t===r||!a||!o)return;let l=!1,u,f=()=>{l=!0,u?.(),u=void 0};i=f,c(()=>{f(),y(e.request)===t&&(r=t),i===f&&(i=void 0)}),d().then(()=>{l||t===r||(a.scrollTo(t.index,`start`),u=n({root:o,target:()=>e.target?e.target(t):document.getElementById(`diff-file-${t.path}`)}))})},{immediate:!0,flush:`post`});O(()=>{s(),i?.();for(let e of jt)t?.removeEventListener(e,o,!0)})}var Nt=[`aria-label`,`aria-expanded`],Pt={class:`text-weight-medium`},Ft={class:`text-positive`},It={class:`text-negative`},Lt={key:0,class:`text-grey-6`},Rt={key:1,class:`text-grey-6`},zt={key:2,class:`text-grey-6`},Bt={key:3,class:`text-grey-6`},Vt=J(h({__name:`DiffStatusBar`,props:{files:{},anyExpanded:{type:Boolean}},emits:[`toggle-all`],setup(e,{emit:t}){let n=e,r=t,{t:a}=H(),o=k(()=>{let e=n.files.reduce((e,t)=>e+t.additions,0),t=n.files.reduce((e,t)=>e+t.deletions,0),r=n.files.filter(e=>e.status===`added`).length,i=n.files.filter(e=>e.status===`modified`).length,a=n.files.filter(e=>e.status===`deleted`).length,o=n.files.filter(e=>e.status===`renamed`).length;return{total:n.files.length,additions:e,deletions:t,added:r,modified:i,deleted:a,renamed:o}});return(t,n)=>(l(),v(`div`,{class:`diff-status-bar row items-center q-gutter-x-md q-pa-sm text-body2 non-selectable`,role:`button`,tabindex:`0`,"aria-label":E(a)(e.anyExpanded?`changes.collapseAll`:`changes.expandAll`),"aria-expanded":e.anyExpanded,onDblclick:n[0]||=e=>r(`toggle-all`),onKeydown:[n[1]||=M(N(e=>!e.repeat&&r(`toggle-all`),[`prevent`]),[`enter`]),n[2]||=M(N(e=>!e.repeat&&r(`toggle-all`),[`prevent`]),[`space`])]},[g(`span`,Pt,S(E(a)(`changes.filesChanged`,{count:o.value.total})),1),g(`span`,Ft,` +`+S(o.value.additions)+` `+S(E(a)(`changes.additions`)),1),g(`span`,It,` -`+S(o.value.deletions)+` `+S(E(a)(`changes.deletions`)),1),o.value.added?(l(),v(`span`,Lt,S(o.value.added)+` `+S(E(a)(`changes.added`)),1)):j(``,!0),o.value.modified?(l(),v(`span`,Rt,S(o.value.modified)+` `+S(E(a)(`changes.modified`)),1)):j(``,!0),o.value.deleted?(l(),v(`span`,zt,S(o.value.deleted)+` `+S(E(a)(`changes.deletedPlural`)),1)):j(``,!0),o.value.renamed?(l(),v(`span`,Bt,S(o.value.renamed)+` `+S(E(a)(`changes.renamed`)),1)):j(``,!0),b(B,{delay:E(500)},{default:i(()=>[w(S(E(a)(e.anyExpanded?`changes.collapseAllHint`:`changes.expandAllHint`)),1)]),_:1},8,[`delay`])],40,Nt))}}),[[`__scopeId`,`data-v-2de87982`]]),Ht=6e3,Ut=40;function Wt(e,t,n){let r=_(n(t())?.clientWidth??0),i=k(()=>JSON.stringify([e.version,r.value])),a=we({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:Ut,mountMargin:Ht},t),o;function s(){let e=n(t());e&&(r.value=e.clientWidth,o=Me(e,()=>{r.value=e.clientWidth})),a.start(e)}function c(){a.stop(),o?.(),o=void 0}return O(c),{mounted:a.mounted,height:a.height,start:s,stop:c}}var Gt={key:1,class:`card-shell-placeholder__title text-mono`,"aria-busy":`true`},Kt=J(h({__name:`ChangesFileCard`,props:{file:{}},setup(e){let n=e,r=$(),i=Y(),a=Z(),{expandedFiles:o}=U(r),{activeReview:u,commentsByFile:d}=U(a),f=k(()=>X(n.file)),m=k(()=>_e(r.source,f.value)),h=k(()=>i.hunksOf(r.source,n.file)),g=k(()=>i.hunksFresh(r.source,n.file)),_=k(()=>i.hunksError(r.source,n.file)),y=k(()=>o.value.has(f.value)),b=k(()=>d.value.get(f.value)),w=k(()=>!!u.value),T={key:m.value},D=Ce(`wrap`,()=>Se(f.value),T),O=Ce(`viewMode`,()=>`diff`,T),A=Ie(T),j=Oe(T),M=k(()=>O.value===`full`?j.value:A.value),N=k(()=>46+(y.value?Te(n.file,h.value)+Ee(b.value??[],O.value)+(M.value?90:0):0)),P=k(()=>JSON.stringify([y.value,O.value,D.value,w.value,M.value?[M.value.column,M.value.startKey,M.value.endKey]:null,b.value?.map(e=>[e.id,e.lineType,e.lineNumberEnd,e.content,e.suggestion,e.resolved])])),F=p(`el`),{mounted:I,height:L,start:R,stop:z}=Wt({get minHeight(){return N.value},get owner(){return h.value??n.file},get version(){return P.value},get cacheHeight(){return y.value&&g.value&&O.value===`diff`&&!D.value&&!b.value?.length&&!M.value},get keep(){return!!M.value}},()=>F.value,ze());x(R),s(z);function B(){i.ensureHunks(r.source,n.file)}function V(){i.retryHunks(r.source,n.file)}return(n,a)=>(l(),v(`div`,{ref_key:`el`,ref:F,class:t({"card-shell-placeholder":!E(I)}),style:c(E(I)?void 0:{height:`${E(L)}px`})},[E(I)?(l(),C(Ae,{key:0,file:e.file,"state-key":m.value,detail:h.value,"hunks-loaded":g.value,"hunks-error":_.value,expanded:y.value,"agent-source":E(r).source,commentable:w.value,"comments-editable":w.value,comments:b.value,onLoadHunks:B,onRetryHunks:V,onClearHunksError:a[0]||=t=>E(i).clearHunksError(E(r).source,e.file),onToggle:a[1]||=e=>E(r).handleCardToggle(f.value),onExpand:a[2]||=e=>E(r).expandFile(f.value)},null,8,[`file`,`state-key`,`detail`,`hunks-loaded`,`hunks-error`,`expanded`,`agent-source`,`commentable`,`comments-editable`,`comments`])):(l(),v(`div`,Gt,S(f.value),1))],6))}}),[[`__scopeId`,`data-v-c1bd4d06`]]),qt={key:0,class:`active-review-bar row items-center q-gutter-x-sm q-px-sm no-wrap`},Jt={class:`text-body2 ellipsis`},Yt=J(h({__name:`ActiveReviewBar`,setup(e){let{t}=H(),n=se(),r=Z(),{activeReview:i}=U(r),a=oe(),o=Ue();function s(e){r.setStatus(e).catch(e=>{n(t(`reviews.comments.error`),e)})}return(e,n)=>E(i)?(l(),v(`div`,qt,[b(L,{name:`rate_review`,size:`18px`,color:`primary`}),g(`span`,Jt,S(E(i).name??E(t)(`reviews.list.unnamed`)),1),b(le),E(a).enabled?(l(),C(R,{key:0,flat:``,dense:``,"no-caps":``,size:`sm`,icon:E(ce),label:E(t)(`agent.context.addReview`),onClick:n[0]||=e=>E(o)({kind:`review`,reviewId:E(i).id})},null,8,[`icon`,`label`])):j(``,!0),b(Fe,{status:E(i).status,onChange:s},null,8,[`status`])])):j(``,!0)}}),[[`__scopeId`,`data-v-2b6e4bdd`]]),Xt={key:1,class:`q-pa-md text-grey-6`},Zt=12,Qt=1.5,$t=2,en=J(h({__name:`DiffPanel`,setup(e){let{t}=H(),r=$(),{diffFiles:o}=U(r),{error:s,loading:c}=U(Y()),u=Z(),{activeReview:f}=U(u);ke({create:e=>u.createComment(e),edit:(e,t)=>u.editComment(e,t),remove:e=>u.deleteComment(e),resolve:e=>u.resolveComment(e),unresolve:e=>u.unresolveComment(e)});let p=T(null),m=k(()=>p.value?.getScrollTarget()??null);n(Le,()=>m.value);let h=T(null);return Mt({request:()=>r.scrollRequest,list:h,root:m}),a(()=>r.layoutVersion,async()=>{await d(),h.value?.reset()}),a(o,async(e,t)=>{ae(e,t,(e,t)=>X(e)===X(t))||(await d(),h.value?.reset())}),(e,n)=>(l(),v(D,null,[E(s)?(l(),C(je,{key:0,title:E(t)(`changes.loadError`),message:E(s),loading:E(c),onRetry:n[0]||=e=>E(r).refresh()},null,8,[`title`,`message`,`loading`])):j(``,!0),E(o).length===0&&!E(s)?(l(),v(`div`,Xt,S(E(t)(`changes.emptyDiffPanel`)),1)):E(o).length>0?(l(),v(D,{key:2},[b(Yt),E(f)?(l(),C(z,{key:0})):j(``,!0),b(Vt,{files:E(o),"any-expanded":E(r).hasExpandedFiles,onToggleAll:E(r).toggleAllFiles},null,8,[`files`,`any-expanded`,`onToggleAll`]),b(z),b(fe,{ref_key:`scrollArea`,ref:p,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:i(()=>[m.value?(l(),C(he,{key:E(r).source,ref_key:`virtualScroll`,ref:h,"scroll-target":m.value,items:E(o),"virtual-scroll-item-size":E(46),"virtual-scroll-slice-size":Zt,"virtual-scroll-slice-ratio-before":Qt,"virtual-scroll-slice-ratio-after":$t},{default:i(({item:e})=>[(l(),v(`div`,{key:E(X)(e),class:`diff-virtual-slot`},[b(Kt,{file:e},null,8,[`file`])]))]),_:1},8,[`scroll-target`,`items`,`virtual-scroll-item-size`])):j(``,!0)]),_:1},512)],64)):j(``,!0),!E(f)&&E(o).length>0?(l(),C(He,{key:3})):j(``,!0)],64))}}),[[`__scopeId`,`data-v-30baafc5`]]),tn={key:1,class:`q-pa-md text-grey-6`},nn={key:0,class:`row justify-center q-pa-lg`},rn={key:1,class:`q-pa-md text-grey-6`},an={class:`text-caption`},on={key:2,class:`q-pa-md text-grey-6`},sn=h({__name:`FileContentPanel`,setup(e){let{t}=H(),n=$(),{selectedPath:r,browseFileLines:o,browseFileIsBinary:s,browseFileLoading:c,browseFileError:u,treeError:d,refreshing:f}=U(n),{error:p}=U(Y()),m=k(()=>p.value?{title:t(`changes.loadError`),message:p.value}:d.value?{title:t(`browse.treeLoadError`),message:d.value}:null),h=T(!1);return a(r,e=>{h.value=e?Se(e):!1},{immediate:!0}),(e,a)=>(l(),v(D,null,[m.value?(l(),C(je,{key:0,title:m.value.title,message:m.value.message,loading:E(f),onRetry:a[0]||=e=>E(n).refresh()},null,8,[`title`,`message`,`loading`])):j(``,!0),E(r)?(l(),C(Ne,{key:2,class:`col`},{header:i(()=>[b(be,{path:E(r)},{default:i(()=>[b(De,{modelValue:h.value,"onUpdate:modelValue":a[1]||=e=>h.value=e,path:E(r)},null,8,[`modelValue`,`path`])]),_:1},8,[`path`])]),default:i(()=>[E(c)&&E(o).length===0&&!E(u)?(l(),v(`div`,nn,[b(F,{color:`primary`,size:`2em`})])):E(u)?(l(),v(`div`,rn,[w(S(E(t)(`changes.fullFileLoadError`))+` `,1),g(`div`,an,S(E(u)),1),b(R,{flat:``,dense:``,color:`primary`,class:`q-mt-sm`,label:E(t)(`changes.retry`),loading:E(f),onClick:a[2]||=e=>E(n).refresh()},null,8,[`label`,`loading`])])):E(s)?(l(),v(`div`,on,S(E(t)(`changes.binaryFile`)),1)):(l(),C(fe,{key:3,class:`col`,"content-style":`padding: 8px`,"content-active-style":`padding: 8px`},{default:i(()=>[b(Pe,{path:E(r),lines:E(o),wrap:h.value},null,8,[`path`,`lines`,`wrap`])]),_:1}))]),_:1})):(l(),v(`div`,tn,S(E(t)(`browse.selectFile`)),1))],64))}}),cn=h({__name:`FileExplorer`,setup(e){let t=$(),n=Z(),{browseMode:r}=U(t);x(()=>{t.refresh(),n.refresh()});let a=ie([`files:changed`],()=>void t.refreshFromServerEvent());o(()=>a.close());let s=ie([`review:created`,`review:updated`,`review:deleted`,`comment:created`,`comment:updated`,`comment:deleted`],()=>void n.refresh());return o(()=>s.close()),(e,t)=>(l(),C(Be,null,{panel:i(()=>[b(At)]),content:i(()=>[E(r)?(l(),C(sn,{key:0})):(l(),C(en,{key:1}))]),_:1}))}}),ln=h({__name:`IndexPage`,setup(e){return(e,t)=>(l(),C(ve,null,{default:i(()=>[b(cn)]),_:1}))}});export{ln as default};