@tequila99/githuman 0.11.0 → 0.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/app.js +2 -0
- package/dist/server/routes/project-files.js +90 -0
- package/dist/server/services/project-files.service.js +144 -0
- package/dist/shared/git/constants.js +2 -0
- package/dist/shared/project-files/constants.js +18 -0
- package/dist/shared/project-files/schemas.js +35 -0
- package/dist/shared/project-files/types.js +1 -0
- package/dist/shared/utils/markdown-path.js +4 -0
- package/dist/shared/utils/pdf-path.js +4 -0
- package/dist/web/assets/{AccessPage-_OKn9U0P.js → AccessPage-CX3w30zw.js} +1 -1
- package/dist/web/assets/AppPage-PFJG281y.js +1 -0
- package/dist/web/assets/{CreateButton-D1EtoicG.js → CreateButton-Ch0b7juj.js} +1 -1
- package/dist/web/assets/CreateReviewFabButton-DTuJzw3q.js +1 -0
- package/dist/web/assets/{ErrorNotFound-DtnO85PU.js → ErrorNotFound-DucDzOUJ.js} +1 -1
- package/dist/web/assets/{IndexPage-gdD7BHxA.js → IndexPage-tgW07Qvs.js} +1 -1
- package/dist/web/assets/MainLayout-C6yBhQnf.css +1 -0
- package/dist/web/assets/MainLayout-Cw4jpB1x.js +8 -0
- package/dist/web/assets/{NoteVisualEditor-BYikrY7Q.css → NoteVisualEditor-CawpxEFB.css} +1 -1
- package/dist/web/assets/{NoteVisualEditor-BQ6mVfj0.js → NoteVisualEditor-DiGhLhQg.js} +3 -3
- package/dist/web/assets/NotesPage-CVyVr9tl.js +4 -0
- package/dist/web/assets/{NotesPage-_8naQciW.css → NotesPage-CxGnZuVQ.css} +1 -1
- package/dist/web/assets/PanelResize-B6FP9ZVB.js +1 -0
- package/dist/web/assets/{PdfPreview-kL_nk9my.js → PdfPreview-rlkcqoMF.js} +1 -1
- package/dist/web/assets/ProjectFilePage-CkxfX9b1.js +1 -0
- package/dist/web/assets/QBtn-CyyV1Bx_.js +1 -0
- package/dist/web/assets/{QExpansionItem-Dr5oXO0m.js → QExpansionItem-Dp9lbdVb.js} +2 -2
- package/dist/web/assets/QFab-LOmZ9rev.js +1 -0
- package/dist/web/assets/QForm-Be8-ucuJ.js +1 -0
- package/dist/web/assets/QInput-Dq6131uz.js +1 -0
- package/dist/web/assets/QSelect-B34OqtIH.js +1 -0
- package/dist/web/assets/QSpace-BhOVGpQh.js +1 -0
- package/dist/web/assets/QVirtualScroll-BYgJ1Kh2.js +1 -0
- package/dist/web/assets/ReviewDetailPage-GNjBa4X0.js +1 -0
- package/dist/web/assets/{ReviewsPage-6PJ6wofN.js → ReviewsPage-An5fRS92.js} +1 -1
- package/dist/web/assets/StatusSwitcher-DrFHHwGm.js +1 -0
- package/dist/web/assets/{TerminalView-BsO_SZut.js → TerminalView-D4elkzN4.js} +2 -2
- package/dist/web/assets/{abnfDiagram-O67JEVCF-qUSrlp_c.js → abnfDiagram-O67JEVCF-Cugru96L.js} +1 -1
- package/dist/web/assets/{access-store-Q8nkv4Nb.js → access-store-Cdg8oRAM.js} +1 -1
- package/dist/web/assets/{agent-store-D2jgeBgi.js → agent-store-D_W7iD_B.js} +2 -2
- package/dist/web/assets/architecture-7GRP2DOG-BPCNj4lR.js +1 -0
- package/dist/web/assets/{architectureDiagram-NJMV4G6O-D7RC6OS2.js → architectureDiagram-NJMV4G6O-7rMsE4Wt.js} +1 -1
- package/dist/web/assets/{blockDiagram-BEXU5L5S-CmNtTpfK.js → blockDiagram-BEXU5L5S-BvSnwUrI.js} +1 -1
- package/dist/web/assets/{c4Diagram-YGBWAQC7-CKCcu1qx.js → c4Diagram-YGBWAQC7-CgmQlCVx.js} +1 -1
- package/dist/web/assets/channel-CzRYxuLe.js +1 -0
- package/dist/web/assets/{chunk-3FUC2YCW-Drz6oeKx.js → chunk-3FUC2YCW-_i8udThz.js} +1 -1
- package/dist/web/assets/{chunk-5DYCD2WN-RItzEgV_.js → chunk-5DYCD2WN-Mhk2LlLk.js} +1 -1
- package/dist/web/assets/{chunk-742MDFTN-D6hKdOv7.js → chunk-742MDFTN-CDVcwgEp.js} +1 -1
- package/dist/web/assets/{chunk-7INBJB4K-Dk7-Eior.js → chunk-7INBJB4K-C2c1fi9s.js} +1 -1
- package/dist/web/assets/{chunk-7M6MHVWA-Cw8E0Nkn.js → chunk-7M6MHVWA-BeGkoIBL.js} +1 -1
- package/dist/web/assets/{chunk-7PRAP22T-t-mTeNXF.js → chunk-7PRAP22T-BVWTh9sT.js} +1 -1
- package/dist/web/assets/{chunk-GTNCS2PH-C7j2atV8.js → chunk-GTNCS2PH-gVhX7NZP.js} +1 -1
- package/dist/web/assets/{chunk-GWA4HPMP-CH9T9LZO.js → chunk-GWA4HPMP-BPdnIcQH.js} +1 -1
- package/dist/web/assets/{chunk-MBY4JIJT-yXOO37xD.js → chunk-MBY4JIJT-B2VfO_06.js} +1 -1
- package/dist/web/assets/{chunk-NETBCI7D-C-s2UtAR.js → chunk-NETBCI7D-DZF_gITO.js} +1 -1
- package/dist/web/assets/{chunk-O7XYJQB3-5Me_aV8o.js → chunk-O7XYJQB3-CDpBWiLq.js} +1 -1
- package/dist/web/assets/{chunk-UA2S7LBM-BQaibeff.js → chunk-UA2S7LBM-Iv7TSRE_.js} +1 -1
- package/dist/web/assets/{chunk-WEXAMYUT-UBcOE4Lf.js → chunk-WEXAMYUT-Ce6goZ2Y.js} +1 -1
- package/dist/web/assets/{chunk-Z7XXMR3K-BsA8o3Pt.js → chunk-Z7XXMR3K-CY6E6_Ux.js} +1 -1
- package/dist/web/assets/{chunk-ZIGJFQKS--KwSI1U0.js → chunk-ZIGJFQKS-BLzsXZBc.js} +1 -1
- package/dist/web/assets/{classDiagram-v2-NBCMYWYE-pMF8oCmq.js → classDiagram-v2-NBCMYWYE-Dz0kD9P6.js} +1 -1
- package/dist/web/assets/{cynefin-OW5HDTMX-DFgtXolF.js → cynefin-OW5HDTMX-DWIx3wRm.js} +1 -1
- package/dist/web/assets/{cynefinDiagram-VND7K2PF-CPY0JRyq.js → cynefinDiagram-VND7K2PF-2D80uocv.js} +1 -1
- package/dist/web/assets/{dagre-6A5THRUB-KdjJKAB7.js → dagre-6A5THRUB-BLBhukn-.js} +1 -1
- package/dist/web/assets/devices-store-BfZKPOhg.js +1 -0
- package/dist/web/assets/{diagram-22UHCM2B-BDcOcvF_.js → diagram-22UHCM2B-DY8dMLZ3.js} +1 -1
- package/dist/web/assets/{diagram-3UASUU5V-6j2nlZL3.js → diagram-3UASUU5V-Bf6Od1NH.js} +1 -1
- package/dist/web/assets/{diagram-ATOU4E4O-BN8cdxED.js → diagram-ATOU4E4O-CjLGcYD5.js} +1 -1
- package/dist/web/assets/{diagram-CDSNMT55-cWPiXHkr.js → diagram-CDSNMT55-gIvaVNvs.js} +1 -1
- package/dist/web/assets/{diagram-MLGK6HIB-DcgkH_Vl.js → diagram-MLGK6HIB-VR5kiCi5.js} +1 -1
- package/dist/web/assets/{diagram-MPIPVDR6-D_e86L99.js → diagram-MPIPVDR6-CdAdj25I.js} +1 -1
- package/dist/web/assets/diff-store-B4adGxC2.js +93 -0
- package/dist/web/assets/{dist-MUQaJRtC.js → dist-BU8erXQF.js} +1 -1
- package/dist/web/assets/{dist-CLCP7f3x.js → dist-C54FrSb8.js} +1 -1
- package/dist/web/assets/{dist-CjkUzU4s.js → dist-C85t5q3z.js} +1 -1
- package/dist/web/assets/{dist-BwpyANeW.js → dist-CBGyhCYv.js} +1 -1
- package/dist/web/assets/{dist-Bz40Nd9I.js → dist-CEl-Ko94.js} +1 -1
- package/dist/web/assets/{dist-CU43ytsh.js → dist-CIMEaJAX.js} +1 -1
- package/dist/web/assets/{dist-BMFtkY2y.js → dist-CTd7Kuqx.js} +1 -1
- package/dist/web/assets/{dist-BP40mvwJ.js → dist-DLuI1PxH.js} +1 -1
- package/dist/web/assets/{dist-C9enVshI.js → dist-joQDFmfy.js} +1 -1
- package/dist/web/assets/{dist-Bdsq-Ze1.js → dist-lgw4kcVA.js} +1 -1
- package/dist/web/assets/{dist-BVVhgjWT.js → dist-yzAhvE-V.js} +1 -1
- package/dist/web/assets/{ebnfDiagram-ZINNZB2B-D8xHOFOi.js → ebnfDiagram-ZINNZB2B-irTAlMFO.js} +1 -1
- package/dist/web/assets/{elk-276RUBZZ-JiDwNyLy.js → elk-276RUBZZ-Dj5ligvC.js} +1 -1
- package/dist/web/assets/{erDiagram-OPXOYQCR-D3J6u81a.js → erDiagram-OPXOYQCR-Bvn6rbL1.js} +1 -1
- package/dist/web/assets/eventmodeling-NTZA5JFV-BJsTZ_nG.js +1 -0
- package/dist/web/assets/flowDiagram-KWPJA3E3-CvXh1Df7.js +1 -0
- package/dist/web/assets/{ganttDiagram-FUAMR5RP-nvAVhbgI.js → ganttDiagram-FUAMR5RP-BNGAUF5H.js} +1 -1
- package/dist/web/assets/{gitGraph-4MIJSDKK-Bv_wkB2T.js → gitGraph-4MIJSDKK-DYSHOl72.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-X574FWY7-DxxwadhH.js → gitGraphDiagram-X574FWY7-BGwRHrPq.js} +1 -1
- package/dist/web/assets/i18n-DnlAcIbT.js +1 -0
- package/dist/web/assets/index-Cw7GJi3K.js +2 -0
- package/dist/web/assets/{index-BwbM_RKi.css → index-wsOPzloa.css} +1 -1
- package/dist/web/assets/{info-A6RAGUB7-Dw18yeIE.js → info-A6RAGUB7-DNWR20pW.js} +1 -1
- package/dist/web/assets/{infoDiagram-VRGFBTTK-C3BrgjYg.js → infoDiagram-VRGFBTTK-BhNwJLY5.js} +1 -1
- package/dist/web/assets/init-app-cg-B_TFN.js +1 -0
- package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-DU2p9szX.js → ishikawaDiagram-OU5B5YK6-CSkDpn64.js} +1 -1
- package/dist/web/assets/{journeyDiagram-ZHPQQLJL-Bs2zQnew.js → journeyDiagram-ZHPQQLJL-D2CEecC3.js} +1 -1
- package/dist/web/assets/{kanban-definition-PNTS6WVX-pqXd5uNi.js → kanban-definition-PNTS6WVX-CQHlo4Hh.js} +1 -1
- package/dist/web/assets/{line-CN4Dxpei.js → line-C-izH1ks.js} +1 -1
- package/dist/web/assets/{markdown-jR0fhe4d.js → markdown-CvtLTiBZ.js} +11 -10
- package/dist/web/assets/{mermaid-parser.core-DZqDOGRM.js → mermaid-parser.core-CAGwq6D-.js} +3 -3
- package/dist/web/assets/{mermaid.core-CUndCvkz.js → mermaid.core--xlI_0tK.js} +4 -4
- package/dist/web/assets/{mindmap-definition-NLK3R4M7-DyK7YqB7.js → mindmap-definition-NLK3R4M7-BuCxhlwy.js} +1 -1
- package/dist/web/assets/{packet-AYTQ26CC-DvlW_0BP.js → packet-AYTQ26CC-Bi7x5lJK.js} +1 -1
- package/dist/web/assets/{pegDiagram-GJSIUBJH-k2e_-FWQ.js → pegDiagram-GJSIUBJH-qWzBPkCQ.js} +1 -1
- package/dist/web/assets/{pie-WAS4IAKB-B99zaYjO.js → pie-WAS4IAKB-Di0wC4XB.js} +1 -1
- package/dist/web/assets/{pieDiagram-5QR66LMP-BPbS05lK.js → pieDiagram-5QR66LMP-BCDVY9q2.js} +1 -1
- package/dist/web/assets/pinia-uOZCmBi-.js +1 -0
- package/dist/web/assets/preview-store-DyO8G-ox.js +1 -0
- package/dist/web/assets/project-files-store-byqyG2ts.js +1 -0
- package/dist/web/assets/{quadrantDiagram-O4NWA36T-DqNNdsd2.js → quadrantDiagram-O4NWA36T-CpFObUjT.js} +1 -1
- package/dist/web/assets/{radar-RG4KPBEZ-BIAAr9LO.js → radar-RG4KPBEZ-Br8yH8rq.js} +1 -1
- package/dist/web/assets/{railroad-74A4TZTK-DYxr-1-f.js → railroad-74A4TZTK-CACSqhA-.js} +1 -1
- package/dist/web/assets/railroad-abnf-HS5TGJTU-DTBsRB1c.js +1 -0
- package/dist/web/assets/railroad-ebnf-LZEXJU2U-D3mrY4ar.js +1 -0
- package/dist/web/assets/railroad-peg-WCYAUIDC-33ZjWX0u.js +1 -0
- package/dist/web/assets/{railroadDiagram-XR7U4H2S-TNg-LqRR.js → railroadDiagram-XR7U4H2S-sYXRKGK1.js} +1 -1
- package/dist/web/assets/render-C7fu7uYY.js +1 -0
- package/dist/web/assets/repository-store-DtRDth1L.js +1 -0
- package/dist/web/assets/{requirementDiagram-PLB6GJNP-hKAyJR6W.js → requirementDiagram-PLB6GJNP-C9I1JbQc.js} +1 -1
- package/dist/web/assets/{safe-storage-B1Aq5CGi.js → safe-storage-C76bPypO.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-IPEJSGJF-_MSL-tES.js → sankeyDiagram-IPEJSGJF-CuvFQhPh.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-PO4LG4MO-Byq-joBG.js → sequenceDiagram-PO4LG4MO-CaVb9Y6e.js} +1 -1
- package/dist/web/assets/single-flight-fPyIy7h5.js +1 -0
- package/dist/web/assets/{stateDiagram-v2-GCMORJYK-BR2jAgaa.js → stateDiagram-v2-GCMORJYK-Dp_APryr.js} +1 -1
- package/dist/web/assets/{swimlanes-2SLR337P-Nt8ojGKK.js → swimlanes-2SLR337P-FclUI-k0.js} +1 -1
- package/dist/web/assets/swimlanesDiagram-TC7HE7FX-CuUvsn0e.js +8 -0
- package/dist/web/assets/{terminal-store-D0abibMa.js → terminal-store-BnEkXuBj.js} +1 -1
- package/dist/web/assets/theme-CnbaLamF.js +1 -0
- package/dist/web/assets/{timeline-definition-EJHVYXUP-BtihLvxk.js → timeline-definition-EJHVYXUP-BAqwqj3c.js} +1 -1
- package/dist/web/assets/{treeView-Q6P3EWNA-D5HzXeKd.js → treeView-Q6P3EWNA-D87jJbUQ.js} +1 -1
- package/dist/web/assets/{treemap-WGGIJYW6-Dovjuutg.js → treemap-WGGIJYW6-B6nhGhRc.js} +1 -1
- package/dist/web/assets/uid-B1JNhznI.js +1 -0
- package/dist/web/assets/use-add-agent-context-xHAjjOf1.js +1 -0
- package/dist/web/assets/{use-app-theme-B1cdbnHn.js → use-app-theme-DEowpWRR.js} +1 -1
- package/dist/web/assets/use-countdown-DlcwwJrs.js +1 -0
- package/dist/web/assets/use-panel-width-CjSWCFr4.js +1 -0
- package/dist/web/assets/use-router-link-CUoYaYUw.js +1 -0
- package/dist/web/assets/use-row-height-BsE9-rO2.js +1 -0
- package/dist/web/assets/{use-server-events-BrBCbeHu.js → use-server-events-C2X4Xz00.js} +1 -1
- package/dist/web/assets/use-virtual-scroll-BAZGswHv.js +1 -0
- package/dist/web/assets/use-workspace-navigation-CnebLvBV.js +1 -0
- package/dist/web/assets/{usecaseDiagram-POWQR4AR-DSwRE8zj.js → usecaseDiagram-POWQR4AR-7YcIKxAb.js} +1 -1
- package/dist/web/assets/{vennDiagram-UO4OBE2U-C-B8yP1K.js → vennDiagram-UO4OBE2U-BZq5cFC4.js} +1 -1
- package/dist/web/assets/viewport-store-CCHiY2QG.js +1 -0
- package/dist/web/assets/{wardley-WFR3VGLG-wWgaZuh6.js → wardley-WFR3VGLG-BT8YO9H4.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-VNRHLVJA-DbhenrHd.js → wardleyDiagram-VNRHLVJA-rDpXFf6D.js} +1 -1
- package/dist/web/assets/weighted-lru-BGovtJ2a.js +1 -0
- package/dist/web/assets/workspace-navigation-DdW0rSGz.js +1 -0
- package/dist/web/assets/{xychartDiagram-PMCCYNJV-CxFDmAEt.js → xychartDiagram-PMCCYNJV-ClniUuZc.js} +1 -1
- package/dist/web/index.html +7 -5
- package/package.json +1 -1
- package/dist/web/assets/AppPage-oQ9Rz0be.js +0 -1
- package/dist/web/assets/CreateReviewFabButton-BxvT3i9e.js +0 -1
- package/dist/web/assets/MainLayout-47PTLKZf.js +0 -6
- package/dist/web/assets/MainLayout-ikSrFqBh.css +0 -1
- package/dist/web/assets/NotesPage-DNR9iW_G.js +0 -4
- package/dist/web/assets/PanelResize-CAQFVc8b.js +0 -1
- package/dist/web/assets/QBtn-CB-yw_iP.js +0 -1
- package/dist/web/assets/QFab-DPz8RiP0.js +0 -1
- package/dist/web/assets/QForm-CASiKhGm.js +0 -1
- package/dist/web/assets/QInput-k34nCPWg.js +0 -1
- package/dist/web/assets/QSelect-CaKn9Tkg.js +0 -1
- package/dist/web/assets/QSpace-Di_bZQY6.js +0 -1
- package/dist/web/assets/QVirtualScroll-oGN_Tl5J.js +0 -1
- package/dist/web/assets/ReviewDetailPage-BKgIprY0.js +0 -1
- package/dist/web/assets/StatusSwitcher-s9w6iKpR.js +0 -1
- package/dist/web/assets/architecture-7GRP2DOG-D6PShS0_.js +0 -1
- package/dist/web/assets/channel-D6lb5DbY.js +0 -1
- package/dist/web/assets/devices-store-CrZ4MxyY.js +0 -1
- package/dist/web/assets/diff-store-ByxMCKoa.js +0 -93
- package/dist/web/assets/eventmodeling-NTZA5JFV-QCwZLvmm.js +0 -1
- package/dist/web/assets/flowDiagram-KWPJA3E3-CgF90hDi.js +0 -1
- package/dist/web/assets/i18n-DDCqtTTW.js +0 -1
- package/dist/web/assets/index-BNHt6zmP.js +0 -2
- package/dist/web/assets/init-app-BouXTk8p.js +0 -1
- package/dist/web/assets/pinia-BETEFLDG.js +0 -1
- package/dist/web/assets/railroad-abnf-HS5TGJTU-GESjhc3t.js +0 -1
- package/dist/web/assets/railroad-ebnf-LZEXJU2U-Cybu0A7J.js +0 -1
- package/dist/web/assets/railroad-peg-WCYAUIDC-DCHxrtbI.js +0 -1
- package/dist/web/assets/single-flight-DLCbzLI3.js +0 -1
- package/dist/web/assets/swimlanesDiagram-TC7HE7FX-Ds1hVYqh.js +0 -8
- package/dist/web/assets/theme-QEcOl0lf.js +0 -1
- package/dist/web/assets/use-add-agent-context-BaPUIO93.js +0 -1
- package/dist/web/assets/use-countdown-CTag4T13.js +0 -1
- package/dist/web/assets/use-panel-width-CB-0S3zX.js +0 -1
- package/dist/web/assets/use-router-link-Dr9wnnyZ.js +0 -1
- package/dist/web/assets/use-row-height-DQHVMtUe.js +0 -1
- package/dist/web/assets/use-virtual-scroll-DG0UKjVk.js +0 -1
- package/dist/web/assets/weighted-lru-BSxRnMHR.js +0 -1
package/dist/server/app.js
CHANGED
|
@@ -21,6 +21,7 @@ import fastifySseImport from '@fastify/sse';
|
|
|
21
21
|
import { healthRoutes } from "./routes/health.js";
|
|
22
22
|
import { appInfoRoutes } from "./routes/app-info.js";
|
|
23
23
|
import { diffRoutes } from "./routes/diff.js";
|
|
24
|
+
import { projectFileRoutes } from "./routes/project-files.js";
|
|
24
25
|
import { gitRoutes } from "./routes/git.js";
|
|
25
26
|
import { reviewRoutes } from "./routes/reviews.js";
|
|
26
27
|
import { commentRoutes } from "./routes/comments.js";
|
|
@@ -121,6 +122,7 @@ export function buildApp(options = {}) {
|
|
|
121
122
|
}
|
|
122
123
|
app.register(diffRoutes, { repositoryPath });
|
|
123
124
|
app.register(gitRoutes, { repositoryPath });
|
|
125
|
+
app.register(projectFileRoutes, { repositoryPath });
|
|
124
126
|
app.register(reviewRoutes, { repositoryPath, db, eventBus });
|
|
125
127
|
app.register(commentRoutes, { db, eventBus });
|
|
126
128
|
app.register(exportRoutes, { db, repositoryPath });
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Server as HttpsServer } from 'node:https';
|
|
2
|
+
import { Readable } from 'node:stream';
|
|
3
|
+
import { Type } from '@sinclair/typebox';
|
|
4
|
+
import { ProjectFilesService } from "../services/project-files.service.js";
|
|
5
|
+
import { BadRequestError } from "../errors/http.js";
|
|
6
|
+
import { ProjectFileQuery, ProjectFileContentQuery, ProjectFileMetadataSchema, ProjectFileContextSchema } from "../../shared/project-files/schemas.js";
|
|
7
|
+
import { PROJECT_DOWNLOAD_MIME } from "../../shared/project-files/constants.js";
|
|
8
|
+
import { ERROR_RESPONSES } from "../../shared/http/schemas.js";
|
|
9
|
+
// Hosts that a browser on this machine uses to reach the server.
|
|
10
|
+
const LOOPBACK_HOSTS = ['localhost', '127.0.0.1', '[::1]'];
|
|
11
|
+
// File name that old clients show when they ignore the UTF-8 file name.
|
|
12
|
+
const FALLBACK_FILE_NAME = 'download';
|
|
13
|
+
// Characters that encodeURIComponent keeps but RFC 5987 does not allow.
|
|
14
|
+
const RFC5987_RESERVED_PATTERN = /['()*]/g;
|
|
15
|
+
// OpenAPI groups file access separately from Git history.
|
|
16
|
+
const TAGS = ['project-files'];
|
|
17
|
+
function contentDisposition(name, download) {
|
|
18
|
+
const encoded = encodeURIComponent(name).replace(RFC5987_RESERVED_PATTERN, char => '%' + char.charCodeAt(0).toString(16));
|
|
19
|
+
return `${download ? 'attachment' : 'inline'}; filename="${FALLBACK_FILE_NAME}"; filename*=UTF-8''${encoded}`;
|
|
20
|
+
}
|
|
21
|
+
export async function projectFileRoutes(app, options) {
|
|
22
|
+
const service = new ProjectFilesService(options.repositoryPath);
|
|
23
|
+
const typed = app.withTypeProvider();
|
|
24
|
+
typed.get('/api/project-files/context', {
|
|
25
|
+
schema: {
|
|
26
|
+
tags: TAGS,
|
|
27
|
+
summary: 'Trusted file-link origins',
|
|
28
|
+
response: { 200: ProjectFileContextSchema, ...ERROR_RESPONSES }
|
|
29
|
+
}
|
|
30
|
+
}, async () => {
|
|
31
|
+
const address = app.server.address();
|
|
32
|
+
const origins = address && typeof address !== 'string'
|
|
33
|
+
? LOOPBACK_HOSTS.map(host => `${app.server instanceof HttpsServer ? 'https' : 'http'}://${host}:${address.port}`)
|
|
34
|
+
: [];
|
|
35
|
+
return { origins };
|
|
36
|
+
});
|
|
37
|
+
typed.get('/api/project-files/metadata', {
|
|
38
|
+
schema: {
|
|
39
|
+
tags: TAGS,
|
|
40
|
+
summary: 'Inspect a project file',
|
|
41
|
+
querystring: ProjectFileQuery,
|
|
42
|
+
response: { 200: ProjectFileMetadataSchema, ...ERROR_RESPONSES }
|
|
43
|
+
}
|
|
44
|
+
}, async (request) => {
|
|
45
|
+
const { file, metadata } = await service.open(request.query.path);
|
|
46
|
+
await file.close();
|
|
47
|
+
return metadata;
|
|
48
|
+
});
|
|
49
|
+
app.get('/api/project-files/content', {
|
|
50
|
+
schema: {
|
|
51
|
+
tags: TAGS,
|
|
52
|
+
summary: 'Read or download a project file',
|
|
53
|
+
querystring: ProjectFileContentQuery,
|
|
54
|
+
response: {
|
|
55
|
+
200: Type.String({ format: 'binary', description: 'File bytes.' }),
|
|
56
|
+
...ERROR_RESPONSES
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}, async (request, reply) => {
|
|
60
|
+
const { file, metadata, limit } = await service.open(request.query.path);
|
|
61
|
+
const download = request.query.download === true;
|
|
62
|
+
if (!download && !metadata.previewable) {
|
|
63
|
+
await file.close();
|
|
64
|
+
throw new BadRequestError('File cannot be previewed; download it instead');
|
|
65
|
+
}
|
|
66
|
+
reply.header('X-Content-Type-Options', 'nosniff');
|
|
67
|
+
reply.header('Cache-Control', 'no-store');
|
|
68
|
+
reply.header('Content-Disposition', contentDisposition(metadata.name, download));
|
|
69
|
+
reply.type(download ? PROJECT_DOWNLOAD_MIME : metadata.mime);
|
|
70
|
+
const source = file.createReadStream({ start: 0 });
|
|
71
|
+
const stream = Readable.from((async function* () {
|
|
72
|
+
let bytes = 0;
|
|
73
|
+
for await (const chunk of source) {
|
|
74
|
+
bytes += chunk.length;
|
|
75
|
+
if (!download && bytes > limit) {
|
|
76
|
+
throw new BadRequestError('File grew beyond the preview limit');
|
|
77
|
+
}
|
|
78
|
+
yield chunk;
|
|
79
|
+
}
|
|
80
|
+
})());
|
|
81
|
+
// Fastify owns stream errors; a disconnected client stops disk reads.
|
|
82
|
+
const close = () => {
|
|
83
|
+
stream.destroy();
|
|
84
|
+
source.destroy();
|
|
85
|
+
};
|
|
86
|
+
reply.raw.once('close', close);
|
|
87
|
+
stream.once('close', () => reply.raw.removeListener('close', close));
|
|
88
|
+
return reply.send(stream);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { open, realpath, stat } from 'node:fs/promises';
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import { basename, isAbsolute } from 'node:path';
|
|
4
|
+
import { fileTypeFromBuffer } from 'file-type';
|
|
5
|
+
import { BadRequestError, ForbiddenError, NotFoundError } from "../errors/http.js";
|
|
6
|
+
import { resolveWithinRepo } from "./git.service.js";
|
|
7
|
+
import { isMissingPathError } from "../utils/system-error.js";
|
|
8
|
+
import { decodeText } from "../utils/text.js";
|
|
9
|
+
import { isMarkdownPath } from "../../shared/utils/markdown-path.js";
|
|
10
|
+
import { PROJECT_DOWNLOAD_MIME, PROJECT_IMAGE_LIMIT, PROJECT_PDF_LIMIT, PROJECT_TEXT_LIMIT } from "../../shared/project-files/constants.js";
|
|
11
|
+
// A small prefix identifies preview formats without reading the complete file.
|
|
12
|
+
const PREFIX_BYTES = 8192;
|
|
13
|
+
// A backslash or a control character cannot be part of a project path.
|
|
14
|
+
const UNSAFE_PATH_PATTERN = /[\\\p{Cc}]/u;
|
|
15
|
+
// Documents that can run scripts. They are never previewed, only downloaded.
|
|
16
|
+
const ACTIVE_DOCUMENT_PATTERN = /\.(html?|svg|xhtml)$/i;
|
|
17
|
+
// Linux resolves an open file descriptor to the real path of its file.
|
|
18
|
+
const PROC_FD_DIR = '/proc/self/fd';
|
|
19
|
+
// MIME type of a previewed text file.
|
|
20
|
+
const TEXT_MIME = 'text/plain; charset=utf-8';
|
|
21
|
+
// Only passive raster formats can use the image viewer.
|
|
22
|
+
const IMAGE_MIMES = new Set([
|
|
23
|
+
'image/png',
|
|
24
|
+
'image/jpeg',
|
|
25
|
+
'image/gif',
|
|
26
|
+
'image/webp',
|
|
27
|
+
'image/avif',
|
|
28
|
+
'image/bmp',
|
|
29
|
+
'image/x-icon'
|
|
30
|
+
]);
|
|
31
|
+
export class ProjectFilesService {
|
|
32
|
+
repositoryPath;
|
|
33
|
+
constructor(repositoryPath) {
|
|
34
|
+
this.repositoryPath = repositoryPath;
|
|
35
|
+
}
|
|
36
|
+
// A file above the preview limit is never previewed, so its prefix is enough.
|
|
37
|
+
isPrefixText(prefix) {
|
|
38
|
+
try {
|
|
39
|
+
return !new TextDecoder('utf-8', { fatal: true })
|
|
40
|
+
.decode(prefix, { stream: true })
|
|
41
|
+
.includes('\0');
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Reads the rest of a small file so that NUL or bad UTF-8 after the prefix is found.
|
|
48
|
+
async isWholeFileText(file, prefix, size) {
|
|
49
|
+
const whole = Buffer.alloc(size);
|
|
50
|
+
prefix.copy(whole);
|
|
51
|
+
let offset = prefix.length;
|
|
52
|
+
while (offset < size) {
|
|
53
|
+
const { bytesRead } = await file.read(whole, offset, size - offset, offset);
|
|
54
|
+
if (bytesRead === 0) {
|
|
55
|
+
throw new ForbiddenError('File changed while opening');
|
|
56
|
+
}
|
|
57
|
+
offset += bytesRead;
|
|
58
|
+
}
|
|
59
|
+
return decodeText(whole) !== null;
|
|
60
|
+
}
|
|
61
|
+
async open(path) {
|
|
62
|
+
if (isAbsolute(path) || UNSAFE_PATH_PATTERN.test(path)) {
|
|
63
|
+
throw new BadRequestError('Invalid project file path');
|
|
64
|
+
}
|
|
65
|
+
let file;
|
|
66
|
+
try {
|
|
67
|
+
const root = await realpath(this.repositoryPath);
|
|
68
|
+
let target;
|
|
69
|
+
try {
|
|
70
|
+
target = await realpath(resolveWithinRepo(root, path));
|
|
71
|
+
resolveWithinRepo(root, target);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (isMissingPathError(error))
|
|
75
|
+
throw error;
|
|
76
|
+
throw new ForbiddenError('File leaves the repository');
|
|
77
|
+
}
|
|
78
|
+
const before = await stat(target);
|
|
79
|
+
if (!before.isFile()) {
|
|
80
|
+
throw new BadRequestError('Project path is not a regular file');
|
|
81
|
+
}
|
|
82
|
+
file = await open(target, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
83
|
+
const info = await file.stat();
|
|
84
|
+
if (!info.isFile() ||
|
|
85
|
+
info.dev !== before.dev ||
|
|
86
|
+
info.ino !== before.ino) {
|
|
87
|
+
throw new ForbiddenError('File changed while opening');
|
|
88
|
+
}
|
|
89
|
+
const opened = await realpath(process.platform === 'linux' ? `${PROC_FD_DIR}/${file.fd}` : target);
|
|
90
|
+
try {
|
|
91
|
+
resolveWithinRepo(root, opened);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
throw new ForbiddenError('File leaves the repository');
|
|
95
|
+
}
|
|
96
|
+
const prefix = Buffer.alloc(Math.min(info.size, PREFIX_BYTES));
|
|
97
|
+
const { bytesRead } = await file.read(prefix, 0, prefix.length, 0);
|
|
98
|
+
if (bytesRead !== prefix.length) {
|
|
99
|
+
throw new ForbiddenError('File changed while opening');
|
|
100
|
+
}
|
|
101
|
+
const detected = await fileTypeFromBuffer(prefix).catch(() => undefined);
|
|
102
|
+
let kind = 'download';
|
|
103
|
+
let mime = PROJECT_DOWNLOAD_MIME;
|
|
104
|
+
let limit = 0;
|
|
105
|
+
if (detected?.mime === 'application/pdf') {
|
|
106
|
+
kind = 'pdf';
|
|
107
|
+
mime = detected.mime;
|
|
108
|
+
limit = PROJECT_PDF_LIMIT;
|
|
109
|
+
}
|
|
110
|
+
else if (detected && IMAGE_MIMES.has(detected.mime)) {
|
|
111
|
+
kind = 'image';
|
|
112
|
+
mime = detected.mime;
|
|
113
|
+
limit = PROJECT_IMAGE_LIMIT;
|
|
114
|
+
}
|
|
115
|
+
else if (!detected &&
|
|
116
|
+
!ACTIVE_DOCUMENT_PATTERN.test(path) &&
|
|
117
|
+
(info.size <= PROJECT_TEXT_LIMIT
|
|
118
|
+
? await this.isWholeFileText(file, prefix, info.size)
|
|
119
|
+
: this.isPrefixText(prefix))) {
|
|
120
|
+
kind = isMarkdownPath(path) ? 'markdown' : 'text';
|
|
121
|
+
mime = TEXT_MIME;
|
|
122
|
+
limit = PROJECT_TEXT_LIMIT;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
file,
|
|
126
|
+
metadata: {
|
|
127
|
+
name: basename(path),
|
|
128
|
+
size: info.size,
|
|
129
|
+
kind,
|
|
130
|
+
mime,
|
|
131
|
+
previewable: kind !== 'download' && info.size <= limit
|
|
132
|
+
},
|
|
133
|
+
limit
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
await file?.close();
|
|
138
|
+
if (isMissingPathError(error)) {
|
|
139
|
+
throw new NotFoundError('Project file was deleted or moved');
|
|
140
|
+
}
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Preview buffers must remain bounded independently of download sizes.
|
|
2
|
+
export const PROJECT_TEXT_LIMIT = 2_000_000;
|
|
3
|
+
// Match the existing image preview budget.
|
|
4
|
+
export const PROJECT_IMAGE_LIMIT = 10_000_000;
|
|
5
|
+
// Match the existing PDF preview budget.
|
|
6
|
+
export const PROJECT_PDF_LIMIT = 100_000_000;
|
|
7
|
+
// A download is buffered in memory by the browser, so it has an upper bound.
|
|
8
|
+
export const PROJECT_DOWNLOAD_LIMIT = 100_000_000;
|
|
9
|
+
// The longest repository-relative path that the API accepts.
|
|
10
|
+
export const MAX_PROJECT_PATH_LENGTH = 4096;
|
|
11
|
+
// The app route that opens a project file. Markdown links point to it.
|
|
12
|
+
export const PROJECT_FILE_ROUTE = '/files/open';
|
|
13
|
+
// The query that marks a link that cannot open. The link renders as an error.
|
|
14
|
+
export const PROJECT_FILE_INVALID_QUERY = 'invalid=true';
|
|
15
|
+
// A file: link. The default Markdown link validation rejects it.
|
|
16
|
+
export const FILE_URI_PATTERN = /^file:\/\//i;
|
|
17
|
+
// MIME type of a file that has no preview. A download uses it for every file.
|
|
18
|
+
export const PROJECT_DOWNLOAD_MIME = 'application/octet-stream';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
|
+
import { MAX_PROJECT_PATH_LENGTH } from "./constants.js";
|
|
3
|
+
export const ProjectFileQuery = Type.Object({
|
|
4
|
+
path: Type.String({
|
|
5
|
+
minLength: 1,
|
|
6
|
+
maxLength: MAX_PROJECT_PATH_LENGTH,
|
|
7
|
+
description: 'Repository-relative WORKTREE file path.'
|
|
8
|
+
})
|
|
9
|
+
});
|
|
10
|
+
export const ProjectFileContentQuery = Type.Object({
|
|
11
|
+
...ProjectFileQuery.properties,
|
|
12
|
+
download: Type.Optional(Type.Boolean({
|
|
13
|
+
description: 'Send an attachment without the preview size limit.'
|
|
14
|
+
}))
|
|
15
|
+
});
|
|
16
|
+
export const ProjectFileMetadataSchema = Type.Object({
|
|
17
|
+
name: Type.String({ description: 'File basename.' }),
|
|
18
|
+
size: Type.Number({ description: 'Current file size in bytes.' }),
|
|
19
|
+
kind: Type.Union([
|
|
20
|
+
Type.Literal('markdown'),
|
|
21
|
+
Type.Literal('text'),
|
|
22
|
+
Type.Literal('image'),
|
|
23
|
+
Type.Literal('pdf'),
|
|
24
|
+
Type.Literal('download')
|
|
25
|
+
], { description: 'Supported preview, or download only.' }),
|
|
26
|
+
mime: Type.String({ description: 'Validated preview MIME type.' }),
|
|
27
|
+
previewable: Type.Boolean({
|
|
28
|
+
description: 'The file fits the preview budget.'
|
|
29
|
+
})
|
|
30
|
+
}, { description: 'Current WORKTREE file metadata.' });
|
|
31
|
+
export const ProjectFileContextSchema = Type.Object({
|
|
32
|
+
origins: Type.Array(Type.String(), {
|
|
33
|
+
description: 'Trusted loopback origins of this server instance.'
|
|
34
|
+
})
|
|
35
|
+
}, { description: 'File-link context for this server.' });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{At as e,F as t,M as n,Y as r,c as i,d as a,f as o,g as s,h as c,l,lt as u,mt as d,q as f,u as p,v as m}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{t as h}from"./QInput-
|
|
1
|
+
import{At as e,F as t,M as n,Y as r,c as i,d as a,f as o,g as s,h as c,l,lt as u,mt as d,q as f,u as p,v as m}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{t as h}from"./QInput-Dq6131uz.js";import{t as g}from"./QBtn-CyyV1Bx_.js";import{c as _,s as v}from"./index-Cw7GJi3K.js";import{n as y}from"./vue-i18n.runtime-CEtihHHL.js";import{r as b}from"./pinia-DO0AdKGg.js";import{n as x,t as S}from"./single-flight-fPyIy7h5.js";import{t as C}from"./access-store-Cdg8oRAM.js";import{n as w}from"./use-app-theme-DEowpWRR.js";import{t as T}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as E}from"./QForm-Be8-ucuJ.js";import{n as D,t as ee}from"./use-countdown-DlcwwJrs.js";var O={class:`access-page fullscreen flex flex-center q-pa-md`},k={class:`text-h6`},A={key:0,class:`text-caption text-negative`},j={class:`access-page__code text-primary`,"aria-live":`polite`},M={class:`text-caption`},N={key:0,role:`alert`,class:`text-caption text-negative`},P={key:0,role:`alert`,class:`text-warning`},F={key:1,role:`alert`,class:`text-negative q-mt-sm`},I=2e3,L=T(m({__name:`AccessPage`,setup(m){let{t:T}=y(),{isDark:L}=w(),R=C(),{status:z,pairing:B,pairingDeadline:V,mode:H,error:U}=b(R),{registerInterval:W,removeInterval:G}=D(),K=ee(()=>V.value??void 0),q=u(``),J=u(!1),Y=u(``),X=u(!1),Z=u(!1),Q=i(()=>z.value===`pending`),$=S(async()=>{await R.check(),H.value===`app`&&window.location.reload()});async function te(){if(!J.value){J.value=!0,Y.value=``,X.value=!1;try{await R.requestAccess(q.value.trim()||void 0),H.value===`app`&&window.location.reload()}catch(e){Y.value=x(e)}finally{J.value=!1}}}return f(z,e=>{e===`pending`?Z.value=!0:e!==null&&(e===`none`&&Z.value&&(X.value=!0),Z.value=!1)},{immediate:!0}),f(Z,e=>{e?W(()=>void $(),I):G()},{immediate:!0}),n(()=>{Q.value&&$()}),(n,i)=>(t(),o(`div`,O,[s(_,{flat:``,bordered:``,class:`access-page__card`,dark:d(L)},{default:r(()=>[s(v,null,{default:r(()=>[l(`div`,k,e(d(T)(`access.title`)),1)]),_:1}),d(H)===`unavailable`?(t(),p(v,{key:0},{default:r(()=>[l(`p`,null,e(d(T)(`access.unavailable`)),1),d(U)?(t(),o(`p`,A,e(d(U)),1)):a(``,!0),s(g,{color:`primary`,label:d(T)(`access.retry`),onClick:d($)},null,8,[`label`,`onClick`])]),_:1})):Q.value&&d(B)?(t(),p(v,{key:1},{default:r(()=>[l(`p`,null,e(d(T)(`access.pending`)),1),l(`div`,j,e(d(B).code),1),l(`p`,M,e(d(T)(`access.expiresIn`,{time:d(K).label.value})),1),d(U)?(t(),o(`p`,N,e(d(T)(`access.unavailable`))+`: `+e(d(U)),1)):a(``,!0)]),_:1})):(t(),p(v,{key:2},{default:r(()=>[l(`p`,null,e(d(T)(`access.noAccess`)),1),X.value?(t(),o(`p`,P,e(d(T)(`access.ended`)),1)):a(``,!0),s(E,{class:`column q-gutter-sm`,onSubmit:te},{default:r(()=>[s(h,{modelValue:q.value,"onUpdate:modelValue":i[0]||=e=>q.value=e,dense:``,outlined:``,maxlength:d(64),label:d(T)(`access.nameLabel`),disable:J.value,dark:d(L)},null,8,[`modelValue`,`maxlength`,`label`,`disable`,`dark`]),s(g,{color:`primary`,type:`submit`,label:d(T)(`access.request`),loading:J.value},null,8,[`label`,`loading`])]),_:1}),Y.value?(t(),o(`p`,F,e(d(T)(`access.requestFailed`))+`: `+e(Y.value),1)):a(``,!0)]),_:1})),s(v,{class:`text-caption text-grey-7`},{default:r(()=>[c(e(d(T)(`access.httpWarning`)),1)]),_:1})]),_:1},8,[`dark`])]))}}),[[`__scopeId`,`data-v-2ced0245`]]);export{L as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{C as e,F as t,R as n,Y as r,c as i,u as a,v as o,x as s}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{t as c}from"./create-B9Tn5Xvi.js";import{a as l,l as u,o as d,r as f}from"./render-C7fu7uYY.js";import{t as p}from"./viewport-store-CCHiY2QG.js";var m=c({name:`QPage`,props:{padding:Boolean,styleFn:Function},setup(t,{slots:n}){let r=l(),a=e(u,d);if(a===d)return console.error(`QPage needs to be a deep child of QLayout`),d;if(e(`_q_pc_`,d)===d)return console.error(`QPage needs to be child of QPageContainer`),d;let o=i(()=>{let e=(a.header.space?a.header.size:0)+(a.footer.space?a.footer.size:0);if(typeof t.styleFn==`function`){let n=a.isContainer.value?a.containerHeight.value:r.screen.height;return t.styleFn(e,n)}return{minHeight:a.isContainer.value?a.containerHeight.value-e+`px`:r.screen.height===0?e===0?`100vh`:`calc(100vh - ${e}px)`:r.screen.height-e+`px`}}),c=i(()=>`q-page${t.padding?` q-layout-padding`:``}`);return()=>s(`main`,{class:c.value,style:o.value},f(n.default))}}),h=o({__name:`AppPage`,setup(e){let i=p();function o(e,t){let n=i.metrics.scale===1&&i.metrics.height>0?Math.min(t,i.metrics.height):t;return{height:`${Math.max(0,n-e)}px`,minHeight:`0px`}}return(e,i)=>(t(),a(m,{"style-fn":o},{default:r(()=>[n(e.$slots,`default`)]),_:3}))}});export{h as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{F as e,T as t,c as n,mt as r,st as i,u as a,v as o}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{t as s}from"./QBtn-
|
|
1
|
+
import{F as e,T as t,c as n,mt as r,st as i,u as a,v as o}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{t as s}from"./QBtn-CyyV1Bx_.js";import{n as c}from"./vue-i18n.runtime-CEtihHHL.js";import{n as l}from"./pinia-DO0AdKGg.js";import{a as u,c as d,i as f,l as p}from"./single-flight-fPyIy7h5.js";function m(e){let{snapshotData:t,...n}=e;return n}var h=l(`active-review`,()=>{let e=i(null),t=i([]),r=i(!1),a=n(()=>{let e=new Map;for(let n of t.value){let t=e.get(n.filePath);t?t.push(n):e.set(n.filePath,[n])}return e});async function o(){r.value=!0;try{let n=(await u(`/api/reviews`)).filter(e=>e.status===`in_progress`).sort((e,t)=>t.createdAt.localeCompare(e.createdAt));e.value=n[0]??null,t.value=e.value?await u(`/api/reviews/${e.value.id}/comments`):[]}finally{r.value=!1}}function s(n){e.value=m(n),t.value=[]}async function c(t){e.value&&(await d(`/api/reviews/${e.value.id}`,{status:t}),await o())}async function l(n){if(!e.value)throw Error(`No active review`);let r=await p(`/api/reviews/${e.value.id}/comments`,n);return t.value=[...t.value,r],r}async function h(e,n){let r=await d(`/api/comments/${e}`,{content:n});t.value=t.value.map(t=>t.id===e?r:t)}async function g(e){await f(`/api/comments/${e}`),t.value=t.value.filter(t=>t.id!==e)}async function _(e){let n=await d(`/api/comments/${e}/resolve`);t.value=t.value.map(t=>t.id===e?n:t)}async function v(e){let n=await d(`/api/comments/${e}/unresolve`);t.value=t.value.map(t=>t.id===e?n:t)}return{activeReview:e,comments:t,loading:r,commentsByFile:a,refresh:o,setActiveReview:s,setStatus:c,createComment:l,editComment:h,deleteComment:g,resolveComment:_,unresolveComment:v}}),g=o({__name:`CancelButton`,setup(n){let{t:i}=c();return(n,o)=>(e(),a(s,t({padding:`2px 8px`},n.$attrs,{dense:``,flat:``,color:`warning`,label:r(i)(`reviews.comments.cancel`)}),null,16,[`label`]))}}),_=o({__name:`CreateButton`,setup(n){let{t:i}=c();return(n,o)=>(e(),a(s,t({padding:`2px 8px`,label:r(i)(`reviews.create.submit`)},n.$attrs,{unelevated:``,dense:``,color:`accent`}),null,16,[`label`]))}});export{m as i,g as n,h as r,_ as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{At as e,C as t,F as n,T as r,W as i,X as a,Y as o,c as s,f as c,g as l,l as u,mt as d,r as f,st as p,u as m,v as h,w as g,x as _,y as v}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{g as y}from"./use-router-link-CUoYaYUw.js";import{t as b}from"./create-B9Tn5Xvi.js";import{a as x,l as S,o as C,r as w}from"./render-C7fu7uYY.js";import{t as T}from"./QInput-Dq6131uz.js";import{l as E}from"./QBtn-CyyV1Bx_.js";import{c as D,l as O,o as k,s as A}from"./index-Cw7GJi3K.js";import{n as j}from"./vue-i18n.runtime-CEtihHHL.js";import{n as M,r as N}from"./pinia-DO0AdKGg.js";import{a as P,l as F,n as I}from"./single-flight-fPyIy7h5.js";import{n as L,o as R}from"./weighted-lru-BGovtJ2a.js";import{t as z}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as B}from"./diff-store-B4adGxC2.js";import{i as V,n as H,r as U,t as W}from"./CreateButton-Ch0b7juj.js";import{t as G}from"./QFab-LOmZ9rev.js";var K=h({__name:`SearchInput`,props:{modelValue:{},modelModifiers:{}},emits:[`update:modelValue`],setup(e){let t=i(e,`modelValue`);return(e,i)=>(n(),m(T,r({modelValue:t.value,"onUpdate:modelValue":i[0]||=e=>t.value=e},e.$attrs,{dense:``,outlined:``,clearable:``}),{prepend:o(()=>[l(E,{name:`search`,size:`xs`})]),_:1},16,[`modelValue`]))}}),q={position:{type:String,default:`bottom-right`,validator:e=>[`top-right`,`top-left`,`bottom-right`,`bottom-left`,`top`,`right`,`bottom`,`left`].includes(e)},offset:{type:Array,validator:e=>e.length===2},expand:Boolean};function J(){let{props:e}=v(),n=x(),r=t(S,C);if(r===C)return console.error(`QPageSticky needs to be child of QLayout`),C;let i=s(()=>{let t=e.position;return{top:t.includes(`top`),right:t.includes(`right`),bottom:t.includes(`bottom`),left:t.includes(`left`),vertical:t===`top`||t===`bottom`,horizontal:t===`left`||t===`right`}}),a=s(()=>r.header.offset),o=s(()=>r.right.offset),c=s(()=>r.footer.offset),l=s(()=>r.left.offset),u=s(()=>{let t=0,r=0,s=i.value,u=n.lang.rtl?-1:1;s.top&&a.value!==0?r=`${a.value}px`:s.bottom&&c.value!==0&&(r=`${-c.value}px`),s.left&&l.value!==0?t=`${u*l.value}px`:s.right&&o.value!==0&&(t=`${-u*o.value}px`);let d={transform:`translate(${t}, ${r})`};return e.offset&&(d.margin=`${e.offset[1]}px ${e.offset[0]}px`),s.vertical?(l.value!==0&&(d[n.lang.rtl?`right`:`left`]=`${l.value}px`),o.value!==0&&(d[n.lang.rtl?`left`:`right`]=`${o.value}px`)):s.horizontal&&(a.value!==0&&(d.top=`${a.value}px`),c.value!==0&&(d.bottom=`${c.value}px`)),d}),d=s(()=>`q-page-sticky row flex-center fixed-${e.position} q-page-sticky--${e.expand?`expand`:`shrink`}`);function f(t){let n=w(t.default);return _(`div`,{class:d.value,style:u.value},e.expand?n:[_(`div`,n)])}return{$layout:r,getStickyContent:f}}var Y=b({name:`QPageSticky`,props:q,setup(e,{slots:t}){let{getStickyContent:n}=J();return()=>n(t)}});function X(e){let t=new URLSearchParams;e.search&&t.set(`search`,e.search),e.createdFrom&&t.set(`createdFrom`,e.createdFrom),e.createdTo&&t.set(`createdTo`,e.createdTo),e.files&&e.files.length>0&&t.set(`files`,e.files.join(`,`));let n=t.toString();return n?`?${n}`:``}var Z=M(`reviews`,()=>{let e=p([]),t=p(!1),n=p(null);async function r(r={}){t.value=!0,n.value=null;try{e.value=await P(`/api/reviews${X(r)}`)}catch(t){e.value=[],n.value=I(t)}finally{t.value=!1}}async function i(t){let n=await F(`/api/reviews`,t);return e.value=[V(n),...e.value],n}return{reviews:e,loading:t,error:n,fetchReviews:r,createReview:i}}),Q={class:`text-h6`},$=z(h({__name:`ReviewCreateDialog`,props:{modelValue:{type:Boolean,required:!0},modelModifiers:{}},emits:g([`created`,`hide`],[`update:modelValue`]),setup(t,{emit:r}){let s=i(t,`modelValue`),c=r,{t:f}=j(),h=Z(),g=p(``),_=p(!1),v=p(null);function b(){g.value=``,_.value=!1,v.value=null}async function x(){_.value=!0,v.value=null;try{let e=g.value.trim(),t=await h.createReview(e?{name:e}:{});s.value=!1,b(),c(`created`,t)}catch(e){v.value=I(e)}finally{_.value=!1}}function S(){b(),c(`hide`)}return(t,r)=>(n(),m(O,{modelValue:s.value,"onUpdate:modelValue":r[1]||=e=>s.value=e,onHide:S},{default:o(()=>[l(D,{class:`review-create-dialog`},{default:o(()=>[l(A,null,{default:o(()=>[u(`div`,Q,e(d(f)(`reviews.create.title`)),1)]),_:1}),l(A,{class:`q-gutter-y-md`},{default:o(()=>[l(T,{modelValue:g.value,"onUpdate:modelValue":r[0]||=e=>g.value=e,dense:``,outlined:``,label:d(f)(`reviews.create.nameLabel`),hint:d(f)(`reviews.create.nameHint`),error:!!v.value,"error-message":v.value??void 0,onKeyup:y(x,[`enter`])},null,8,[`modelValue`,`label`,`hint`,`error`,`error-message`])]),_:1}),l(k,{align:`right`},{default:o(()=>[a(l(H,null,null,512),[[L]]),l(W,{loading:_.value,onClick:x},null,8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]))}}),[[`__scopeId`,`data-v-dd3d2128`]]),ee=h({__name:`CreateReviewFabButton`,emits:[`created`],setup(e,{emit:t}){let r=t,i=U(),u=B(),{activeReview:d}=N(i),{changedPaths:m}=N(u),h=p(!1),g=p(!1),_=p([18,18]),v=p(!1),y=s(()=>m.value.length===0||d.value!==null);function b(e){v.value=e.isFirst!==!0&&e.isFinal!==!0,_.value=[_.value[0]-(e.delta?.x??0),_.value[1]-(e.delta?.y??0)]}function x(e){i.setActiveReview(e),r(`created`,e)}return(e,t)=>(n(),c(f,null,[l(Y,{position:`bottom-right`,offset:_.value},{default:o(()=>[a(l(G,{modelValue:g.value,"onUpdate:modelValue":t[0]||=e=>g.value=e,icon:`add`,color:`accent`,disable:y.value||v.value,onClick:t[1]||=e=>h.value=!0},null,8,[`modelValue`,`disable`]),[[R,b,void 0,{prevent:!0,mouse:!0}]])]),_:1},8,[`offset`]),l($,{modelValue:h.value,"onUpdate:modelValue":t[2]||=e=>h.value=e,onCreated:x,onHide:t[3]||=e=>g.value=!1},null,8,[`modelValue`])],64))}});export{Z as n,K as r,ee as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{F as e,f as t,g as n,l as r}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{t as i}from"./QBtn-
|
|
1
|
+
import{F as e,f as t,g as n,l as r}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{t as i}from"./QBtn-CyyV1Bx_.js";import{t as a}from"./_plugin-vue_export-helper-BDNMzG2s.js";var o={},s={class:`fullscreen bg-blue text-white text-center q-pa-md flex flex-center`};function c(a,o){return e(),t(`div`,s,[r(`div`,null,[o[0]||=r(`div`,{style:{"font-size":`30vh`}},`404`,-1),o[1]||=r(`div`,{class:`text-h2`,style:{opacity:`0.4`}},`Oops. Nothing here...`,-1),n(i,{class:`q-mt-xl`,color:`white`,"text-color":`blue`,unelevated:``,to:`/`,label:`Go Home`,"no-caps":``})])])}var l=a(o,[[`render`,c]]);export{l as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{At as e,E as t,F as n,G as r,I as i,J as a,L as o,M as s,N as c,Ot as l,W as u,X as d,Y as f,c as p,d as m,f as h,g,h as _,it as v,k as y,kt as b,l as x,lt as S,mt as C,nt as w,pt as T,q as E,r as D,st as O,u as k,v as A,w as j,z as M}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{O as N,k as P}from"./use-router-link-Dr9wnnyZ.js";import{a as F,i as I,l as L,t as R}from"./QBtn-CB-yw_iP.js";import{M as z,a as B,j as V,n as ee}from"./index-BNHt6zmP.js";import{n as H}from"./vue-i18n.runtime-CEtihHHL.js";import{r as U}from"./pinia-DO0AdKGg.js";import{f as te,t as ne}from"./agent-store-D2jgeBgi.js";import{n as re}from"./use-server-events-BrBCbeHu.js";import{c as ie,n as ae,t as oe}from"./QSpace-Di_bZQY6.js";import{r as se,t as ce}from"./use-add-agent-context-BaPUIO93.js";import{r as le}from"./use-virtual-scroll-DG0UKjVk.js";import{d as W,f as G}from"./weighted-lru-BSxRnMHR.js";import{t as K}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{l as q,o as ue,s as J,t as Y,u as de}from"./diff-store-ByxMCKoa.js";import{c as X,l as fe,n as pe,o as Z}from"./use-row-height-DQHVMtUe.js";import{n as me,r as he,t as Q}from"./QVirtualScroll-oGN_Tl5J.js";import{r as $}from"./CreateButton-D1EtoicG.js";import{t as ge}from"./PanelResize-CAQFVc8b.js";import{r as _e,t as ve}from"./CreateReviewFabButton-BxvT3i9e.js";import{C as ye,S as be,T as xe,_ as Se,a as Ce,b as we,c as Te,d as Ee,f as De,g as Oe,h as ke,i as Ae,l as je,m as Me,n as Ne,o as Pe,p as Fe,r as Ie,s as Le,t as Re,u as ze,v as Be,w as Ve,x as He,y as Ue}from"./StatusSwitcher-s9w6iKpR.js";import{t as We}from"./AppPage-oQ9Rz0be.js";var Ge={class:`row items-center no-wrap q-gutter-x-xs`},Ke={class:`row items-center no-wrap q-gutter-x-xs`},qe=A({__name:`FileExplorerTabs`,props:j({stagedFilesLength:{},unstagedFilesLength:{}},{modelValue:{default:`unstaged`},modelModifiers:{}}),emits:[`update:modelValue`],setup(t){let r=u(t,`modelValue`),{t:i}=H();return(a,o)=>(n(),k(me,{modelValue:r.value,"onUpdate:modelValue":o[0]||=e=>r.value=e,dense:``,"no-caps":``,align:`left`,"narrow-indicator":``,class:`text-primary q-mb-sm`},{default:f(()=>[g(he,{name:`unstaged`},{default:f(()=>[x(`div`,Ge,[x(`span`,null,e(C(i)(`changes.unstaged`)),1),g(de,{color:`warning`,rounded:``},{default:f(()=>[_(e(t.unstagedFilesLength),1)]),_:1})])]),_:1}),g(he,{name:`staged`},{default:f(()=>[x(`div`,Ke,[x(`span`,null,e(C(i)(`changes.staged`)),1),g(de,{color:`positive`,rounded:``},{default:f(()=>[_(e(t.stagedFilesLength),1)]),_:1})])]),_:1})]),_:1},8,[`modelValue`]))}}),Je={class:`file-tree-node`},Ye={class:`row items-center no-wrap q-gutter-x-xs`},Xe=[`data-tooltip`],Ze=[`data-tooltip`],Qe={key:2},$e=K(A({__name:`FileTreeNode`,props:{node:{},selectedPath:{},expandedFolders:{},level:{}},emits:[`toggle-folder`,`file-select`],setup(t,{emit:r}){let i=r;return(r,a)=>{let s=M(`FileTreeNode`,!0);return n(),h(`div`,Je,[t.node.type===`directory`?d((n(),k(W,{key:0,clickable:``,dense:``,style:b({paddingLeft:`${C(X)(t.level,!1)}px`}),onClick:a[0]||=e=>i(`toggle-folder`,t.node.path)},{default:f(()=>[g(G,{avatar:``,class:`file-tree-node__icon-section`},{default:f(()=>[x(`div`,Ye,[g(L,{name:`chevron_right`,size:`xs`,class:l([`file-tree-node__chevron`,{"file-tree-node__chevron--expanded":t.expandedFolders.has(t.node.path)}])},null,8,[`class`]),g(L,{name:t.expandedFolders.has(t.node.path)?`folder_open`:`folder`,size:`xs`,color:`warning`},null,8,[`name`])])]),_:1}),g(G,{class:`text-mono`},{default:f(()=>[x(`div`,{class:`ellipsis file-tree-node__label`,"data-tooltip":t.node.path},e(t.node.name),9,Xe)]),_:1}),t.node.children?(n(),k(G,{key:0,side:``,class:`text-caption text-grey-6`},{default:f(()=>[_(e(t.node.children.length),1)]),_:1})):m(``,!0)]),_:1},8,[`style`])),[[I]]):d((n(),k(W,{key:1,clickable:``,dense:``,active:t.node.path===t.selectedPath,"active-class":`file-tree-node--selected`,style:b({paddingLeft:`${C(X)(t.level,!0)}px`}),onClick:a[1]||=e=>i(`file-select`,t.node.path)},{default:f(()=>[g(G,{avatar:``,class:`file-tree-node__icon-section`},{default:f(()=>[g(L,{name:`insert_drive_file`,size:`xs`,color:`grey-6`})]),_:1}),g(G,{class:`text-mono`},{default:f(()=>[x(`div`,{class:`ellipsis file-tree-node__label`,"data-tooltip":t.node.path},e(t.node.name),9,Ze)]),_:1}),t.node.isChanged?(n(),k(G,{key:0,side:``},{default:f(()=>[g(L,{name:`fiber_manual_record`,size:`8px`,color:`warning`})]),_:1})):m(``,!0)]),_:1},8,[`active`,`style`])),[[I]]),t.node.type===`directory`&&t.expandedFolders.has(t.node.path)&&t.node.children?(n(),h(`div`,Qe,[(n(!0),h(D,null,o(t.node.children,e=>(n(),k(s,{key:e.path,node:e,"selected-path":t.selectedPath,"expanded-folders":t.expandedFolders,level:t.level+1,onToggleFolder:a[2]||=e=>i(`toggle-folder`,e),onFileSelect:a[3]||=e=>i(`file-select`,e)},null,8,[`node`,`selected-path`,`expanded-folders`,`level`]))),128))])):m(``,!0)])}}}),[[`__scopeId`,`data-v-ef4a1d44`]]),et={class:`file-list-item__path-row row no-wrap items-center`},tt=[`data-tooltip`],nt={class:`text-caption`},rt={class:`text-positive`},it={class:`text-negative q-ml-xs`},at=K(A({__name:`FileListItem`,props:{file:{},selected:{type:Boolean},source:{},label:{},depth:{}},emits:[`click`],setup(t){let r={added:`A`,modified:`M`,deleted:`D`,renamed:`R`},i={added:`positive`,modified:`warning`,deleted:`negative`,renamed:`purple`},a=t,o=$(),s=p(()=>J(a.file)),c=p(()=>o.commentsByFile.get(s.value)?.length??0);return(a,o)=>d((n(),k(W,{clickable:``,dense:``,class:`file-list-item`,active:t.selected,"active-class":`file-list-item--selected`,"aria-label":t.label===void 0?void 0:s.value,style:b(t.depth===void 0?void 0:{paddingLeft:`${C(X)(t.depth,!0)}px`}),onClick:o[0]||=e=>a.$emit(`click`)},{default:f(()=>[g(G,{avatar:``,class:`file-list-item__icon-section`},{default:f(()=>[x(`span`,{class:l([`text-caption text-weight-bold text-mono`,`text-${i[t.file.status]}`])},e(r[t.file.status]),3)]),_:1}),g(G,{class:`text-mono`},{default:f(()=>[x(`div`,et,[x(`span`,{class:`ellipsis file-list-item__path-label`,"data-tooltip":s.value},e(t.label??s.value),9,tt),c.value>0?(n(),k(Ve,{key:0,compact:``,class:`file-list-item__badge`,count:c.value},null,8,[`count`])):m(``,!0)])]),_:1}),g(G,{side:``,class:`file-list-item__stats`},{default:f(()=>[x(`span`,nt,[x(`span`,rt,`+`+e(t.file.additions),1),x(`span`,it,`-`+e(t.file.deletions),1)])]),_:1}),g(G,{side:``,class:`file-list-item__actions`},{default:f(()=>[g(xe,{path:s.value,source:t.source},null,8,[`path`,`source`])]),_:1})]),_:1},8,[`active`,`aria-label`,`style`])),[[I]])}}),[[`__scopeId`,`data-v-3c335b20`]]),ot=A({__name:`BrowseModeToggle`,props:{modelValue:{type:Boolean,default:!1},modelModifiers:{}},emits:[`update:modelValue`],setup(t){let r=u(t,`modelValue`),{t:i}=H();return(t,a)=>(n(),k(W,null,{default:f(()=>[g(G,null,{default:f(()=>[g(le,null,{default:f(()=>[_(e(C(i)(`browse.toggle`)),1)]),_:1})]),_:1}),g(G,{side:``},{default:f(()=>[g(ee,{modelValue:r.value,"onUpdate:modelValue":a[0]||=e=>r.value=e,dense:``,size:`xs`},null,8,[`modelValue`])]),_:1})]),_:1}))}}),st={class:`row items-center no-wrap q-gutter-x-xs`},ct=[`data-tooltip`],lt=K(A({__name:`DiffTreeFolderRow`,props:{name:{},path:{},depth:{},expanded:{type:Boolean},locked:{type:Boolean}},emits:[`toggle`],setup(t){let{t:r}=H();return(i,a)=>d((n(),k(W,{clickable:!t.locked,dense:``,class:`file-list-item diff-tree-folder-row`,style:b({paddingLeft:`${C(X)(t.depth,!1)}px`}),"aria-expanded":t.locked?void 0:t.expanded,"aria-label":t.locked?void 0:C(r)(`changes.listMode.folder`,{path:t.path}),onClick:a[0]||=e=>i.$emit(`toggle`)},{default:f(()=>[g(G,{avatar:``,class:`diff-tree-folder-row__icons`},{default:f(()=>[x(`div`,st,[g(L,{name:`chevron_right`,size:`xs`,class:l([`diff-tree-folder-row__chevron`,{"diff-tree-folder-row__chevron--expanded":t.expanded,invisible:t.locked}])},null,8,[`class`]),g(L,{name:t.expanded?`folder_open`:`folder`,size:`xs`,color:`warning`},null,8,[`name`])])]),_:1}),g(G,{class:`text-mono`},{default:f(()=>[x(`span`,{class:`ellipsis`,"data-tooltip":t.path},e(t.name),9,ct)]),_:1})]),_:1},8,[`clickable`,`style`,`aria-expanded`,`aria-label`])),[[I,!t.locked]])}}),[[`__scopeId`,`data-v-e82c6cd4`]]),ut={class:`file-list-panel__header q-pa-sm`},dt={key:1,class:`text-subtitle2 q-mb-sm`},ft={key:0,class:`text-primary`},pt={class:`row no-wrap items-center q-gutter-x-xs`},mt={key:0,class:`row justify-center q-pa-lg`},ht={key:0,class:`text-caption text-grey-6 q-px-md q-py-sm`},gt={key:0,class:`text-caption text-grey-6 q-px-md q-py-sm`},_t=32,vt=K(A({__name:`FileListPanel`,setup(t){let{t:r}=H(),{stagedFiles:i,unstagedFiles:a,initialLoading:s,error:c}=U(Y()),l=Z(),{source:u,browseMode:d,filter:v,selectedPath:y,expandedFolders:b,treeInitialLoading:S,treeError:T,filteredDiffFiles:E,diffTreeRows:A,diffListMode:j,filtering:M,filteredTree:N,totalTreeFiles:P}=U(l),I=O(null),L=p(()=>I.value?.getScrollTarget()??null);return(t,p)=>(n(),h(D,null,[x(`div`,ut,[C(d)?(n(),h(`div`,dt,[_(e(C(r)(`browse.allFiles`))+` `,1),C(P)>0||!C(T)?(n(),h(`span`,ft,`(`+e(C(P))+`)`,1)):m(``,!0)])):(n(),k(qe,{key:0,modelValue:C(u),"onUpdate:modelValue":p[0]||=e=>w(u)?u.value=e:null,"staged-files-length":C(i).length,"unstaged-files-length":C(a).length},null,8,[`modelValue`,`staged-files-length`,`unstaged-files-length`])),x(`div`,pt,[g(_e,{modelValue:C(v),"onUpdate:modelValue":p[1]||=e=>w(v)?v.value=e:null,class:`col`,placeholder:C(d)?C(r)(`browse.searchPlaceholder`):C(r)(`changes.filterPlaceholder`)},null,8,[`modelValue`,`placeholder`]),C(d)?m(``,!0):(n(),k(R,{key:0,flat:``,dense:``,round:``,size:`sm`,icon:`account_tree`,color:C(j)===`tree`?`primary`:void 0,"aria-label":C(r)(`changes.listMode.tree`),"aria-pressed":C(j)===`tree`,onClick:p[2]||=e=>j.value=C(j)===`tree`?`list`:`tree`},{default:f(()=>[g(z,{delay:C(500)},{default:f(()=>[_(e(C(r)(`changes.listMode.tree`)),1)]),_:1},8,[`delay`])]),_:1},8,[`color`,`aria-label`,`aria-pressed`]))])]),g(B),g(q,{ref_key:`scrollArea`,ref:I,class:`col file-list-panel__scroll`,"content-style":`padding: 4px 0`,"content-active-style":`padding: 4px 0`},{default:f(()=>[(C(d)?C(S):C(s))?(n(),h(`div`,mt,[g(F,{color:`primary`,size:`2em`})])):C(d)?(n(),h(D,{key:1},[C(N).length===0&&(!C(T)||C(v)&&C(P)>0)?(n(),h(`p`,ht,e(C(v)?C(r)(`browse.noMatchingFiles`):C(r)(`browse.noFiles`)),1)):m(``,!0),(n(!0),h(D,null,o(C(N),e=>(n(),k($e,{key:e.path,node:e,"selected-path":C(y),"expanded-folders":C(b),level:0,onToggleFolder:C(l).toggleFolder,onFileSelect:C(l).selectFile},null,8,[`node`,`selected-path`,`expanded-folders`,`onToggleFolder`,`onFileSelect`]))),128))],64)):(n(),h(D,{key:2},[C(E).length===0&&(C(v)||!C(c))?(n(),h(`p`,gt,e(C(v)?C(r)(`browse.noMatchingFiles`):C(r)(`changes.emptyFileList`)),1)):m(``,!0),L.value&&C(j)===`tree`?(n(),k(Q,{key:`${C(u)}:tree`,"scroll-target":L.value,items:C(A),"virtual-scroll-item-size":_t},{default:f(({item:e})=>[e.kind===`folder`?(n(),k(lt,{key:`d:${e.path}`,name:e.name,path:e.path,depth:e.depth,expanded:e.expanded,locked:C(M),onToggle:t=>C(l).toggleDiffFolder(e.paths)},null,8,[`name`,`path`,`depth`,`expanded`,`locked`,`onToggle`])):(n(),k(at,{key:`f:${e.path}`,file:e.file,label:e.name,depth:e.depth,selected:C(y)===e.path,source:C(u),onClick:t=>C(l).selectFile(e.path)},null,8,[`file`,`label`,`depth`,`selected`,`source`,`onClick`]))]),_:1},8,[`scroll-target`,`items`])):L.value?(n(),k(Q,{key:`${C(u)}:list`,"scroll-target":L.value,items:C(E),"virtual-scroll-item-size":_t},{default:f(({item:e})=>[(n(),k(at,{key:C(J)(e),file:e,selected:C(y)===C(J)(e),source:C(u),onClick:t=>C(l).selectFile(C(J)(e))},null,8,[`file`,`selected`,`source`,`onClick`]))]),_:1},8,[`scroll-target`,`items`])):m(``,!0)],64))]),_:1},512),g(B),g(ot,{modelValue:C(d),"onUpdate:modelValue":p[3]||=e=>w(d)?d.value=e:null},null,8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-bdc095b7`]]),yt=[`wheel`,`pointerdown`,`keydown`,`touchstart`];function bt(e){let n=e.inputTarget??(typeof document>`u`?null:document),r=e.follow??we,i=null,a;function o(){(e.ready===void 0||T(e.ready))&&(i=T(e.request),a?.(),a=void 0)}for(let e of yt)n?.addEventListener(e,o,{capture:!0,passive:!0});let s=E([()=>T(e.request),()=>T(e.list),()=>T(e.root),()=>e.ready===void 0||T(e.ready)],([n,o,s,c],l,u)=>{if(!n||n===i||!o||!s||!c)return;let d=!1,f=!1,p,m=()=>{d=!0,p?.(),p=void 0};a=m,u(()=>{m(),T(e.request)===n&&(f||T(e.list)!==o||T(e.root)!==s)&&(i=n),a===m&&(a=void 0)}),t().then(()=>{d||n===i||e.ready!==void 0&&!T(e.ready)||(f=!0,o.scrollTo(n.index,`start`),p=r({root:s,target:()=>e.target?e.target(n):document.getElementById(`diff-file-${n.path}`)}))})},{immediate:!0,flush:`post`});v(()=>{s(),a?.();for(let e of yt)n?.removeEventListener(e,o,!0)})}var xt=[`aria-label`,`aria-expanded`],St={class:`diff-status-bar__files ellipsis`},Ct={class:`text-weight-medium`},wt={key:0,class:`text-grey-6 q-ml-sm`},Tt={key:1,class:`text-grey-6 q-ml-sm`},Et={key:2,class:`text-grey-6 q-ml-sm`},Dt={key:3,class:`text-grey-6 q-ml-sm`},Ot={class:`diff-status-bar__lines row items-center q-gutter-x-md no-wrap`},kt={class:`text-positive`},At={class:`text-negative`},jt=K(A({__name:`DiffStatusBar`,props:{files:{},anyExpanded:{type:Boolean}},emits:[`toggle-all`],setup(t,{emit:r}){let i=t,a=r,{t:o}=H(),s=p(()=>{let e=i.files.reduce((e,t)=>e+t.additions,0),t=i.files.reduce((e,t)=>e+t.deletions,0),n=i.files.filter(e=>e.status===`added`).length,r=i.files.filter(e=>e.status===`modified`).length,a=i.files.filter(e=>e.status===`deleted`).length,o=i.files.filter(e=>e.status===`renamed`).length;return{total:i.files.length,additions:e,deletions:t,added:n,modified:r,deleted:a,renamed:o}});return(r,i)=>(n(),h(`div`,{class:`diff-status-bar row items-center q-pa-sm text-body2 non-selectable`,role:`button`,tabindex:`0`,"aria-label":C(o)(t.anyExpanded?`changes.collapseAll`:`changes.expandAll`),"aria-expanded":t.anyExpanded,onDblclick:i[0]||=e=>a(`toggle-all`),onKeydown:[i[1]||=N(P(e=>!e.repeat&&a(`toggle-all`),[`prevent`]),[`enter`]),i[2]||=N(P(e=>!e.repeat&&a(`toggle-all`),[`prevent`]),[`space`])]},[x(`div`,St,[x(`span`,Ct,e(C(o)(`changes.filesChanged`,s.value.total))+`:`,1),s.value.added?(n(),h(`span`,wt,e(s.value.added)+` `+e(C(o)(`changes.added`)),1)):m(``,!0),s.value.modified?(n(),h(`span`,Tt,e(s.value.modified)+` `+e(C(o)(`changes.modified`)),1)):m(``,!0),s.value.deleted?(n(),h(`span`,Et,e(s.value.deleted)+` `+e(C(o)(`changes.deletedPlural`)),1)):m(``,!0),s.value.renamed?(n(),h(`span`,Dt,e(s.value.renamed)+` `+e(C(o)(`changes.renamed`)),1)):m(``,!0)]),x(`div`,Ot,[x(`span`,kt,`+`+e(s.value.additions)+` `+e(C(o)(`changes.additions`)),1),x(`span`,At,`-`+e(s.value.deletions)+` `+e(C(o)(`changes.deletions`)),1)]),g(z,{delay:C(500)},{default:f(()=>[_(e(C(o)(t.anyExpanded?`changes.collapseAllHint`:`changes.expandAllHint`)),1)]),_:1},8,[`delay`])],40,xt))}}),[[`__scopeId`,`data-v-6335a458`]]),Mt=6e3,Nt=40;function Pt(e,t,n){let r=S(n(t())?.clientWidth??0),i=p(()=>JSON.stringify([e.version,r.value])),a=Me({get minHeight(){return e.minHeight},get heightOwner(){return e.owner},heightKey:`card-reserve`,get heightVersion(){return i.value},get cacheHeight(){return e.cacheHeight},get keep(){return e.keep},cost:Nt,mountMargin:Mt},t),o;function s(){let e=n(t());e&&(r.value=e.clientWidth,o=ke(e,()=>{r.value=e.clientWidth})),a.start(e)}function c(){a.stop(),o?.(),o=void 0}return v(c),{mounted:a.mounted,height:a.height,start:s,stop:c}}var Ft={key:1,class:`card-shell-placeholder__title text-mono`,"aria-busy":`true`},It=K(A({__name:`ChangesFileCard`,props:{file:{}},setup(t){let i=t,a=Z(),o=Y(),c=$(),{expandedFiles:u}=U(a),{activeReview:d,commentsByFile:f}=U(c),m=p(()=>J(i.file)),g=p(()=>ue(a.source,m.value)),_=p(()=>o.hunksOf(a.source,i.file)),v=p(()=>o.hunksFresh(a.source,i.file)),x=p(()=>o.hunksError(a.source,i.file)),S=p(()=>u.value.has(m.value)),w=p(()=>f.value.get(m.value)),T=p(()=>!!d.value),E=pe(T),D={key:g.value},O=De(`wrap`,()=>je(m.value),D),A=De(`viewMode`,()=>`diff`,D),j=Ee(D),M=ze(D),N=p(()=>A.value===`full`?M.value:j.value),P=p(()=>46+(S.value?Ue(i.file,_.value,E.value)+Be(w.value??[],A.value)+(N.value?90:0):0)),F=p(()=>Se({expanded:S.value,mode:A.value,wrap:O.value,activeReview:T.value,rowHeight:E.value,pending:N.value,comments:w.value})),I=r(`el`),{mounted:L,height:R,start:z,stop:B}=Pt({get minHeight(){return P.value},get owner(){return _.value??i.file},get version(){return F.value},get cacheHeight(){return S.value&&v.value&&A.value===`diff`&&!O.value&&!w.value?.length&&!N.value},get keep(){return!!N.value}},()=>I.value,ye());s(z),y(B);function V(){o.ensureHunks(a.source,i.file)}function ee(){o.retryHunks(a.source,i.file)}return(r,i)=>(n(),h(`div`,{ref_key:`el`,ref:I,class:l({"card-shell-placeholder":!C(L)}),style:b(C(L)?void 0:{height:`${C(R)}px`})},[C(L)?(n(),k(Ne,{key:0,file:t.file,"state-key":g.value,detail:_.value,"hunks-loaded":v.value,"hunks-error":x.value,expanded:S.value,"agent-source":C(a).source,commentable:T.value,"comments-editable":T.value,comments:w.value,onLoadHunks:V,onRetryHunks:ee,onClearHunksError:i[0]||=e=>C(o).clearHunksError(C(a).source,t.file),onToggle:i[1]||=e=>C(a).handleCardToggle(m.value),onExpand:i[2]||=e=>C(a).expandFile(m.value)},null,8,[`file`,`state-key`,`detail`,`hunks-loaded`,`hunks-error`,`expanded`,`agent-source`,`commentable`,`comments-editable`,`comments`])):(n(),h(`div`,Ft,e(m.value),1))],6))}}),[[`__scopeId`,`data-v-39faff44`]]),Lt={key:0,class:`active-review-bar row items-center q-gutter-x-sm q-px-sm no-wrap`},Rt={class:`text-body2 ellipsis`},zt=K(A({__name:`ActiveReviewBar`,setup(t){let{t:r}=H(),i=ie(),a=$(),{activeReview:o}=U(a),s=ne(),c=ce();function l(e){a.setStatus(e).catch(e=>{i(r(`reviews.comments.error`),e)})}return(t,i)=>C(o)?(n(),h(`div`,Lt,[g(L,{name:`rate_review`,size:`18px`,color:`primary`}),x(`span`,Rt,e(C(o).name??C(r)(`reviews.list.unnamed`)),1),g(oe),C(s).enabled?(n(),k(R,{key:0,flat:``,dense:``,"no-caps":``,size:`sm`,icon:C(ae),label:C(r)(`agent.context.addReview`),onClick:i[0]||=e=>C(c)({kind:`review`,reviewId:C(o).id})},null,8,[`icon`,`label`])):m(``,!0),g(Re,{status:C(o).status,onChange:l},null,8,[`status`])])):m(``,!0)}}),[[`__scopeId`,`data-v-2b6e4bdd`]]),Bt=[`aria-label`],Vt={class:`text-caption ellipsis`},Ht={class:`row items-center q-gutter-sm`},Ut=K(A({__name:`TouchCommentToolbar`,props:{path:{},start:{},end:{},confirming:{type:Boolean}},emits:[`confirm`,`cancel`],setup(t,{emit:r}){let i=r,{t:a}=H();return(r,o)=>(n(),h(`div`,{class:`touch-comment-toolbar q-pa-sm`,role:`region`,"aria-label":C(a)(`workspace.selectLines`)},[x(`div`,Vt,e(t.path)+` · `+e(C(a)(`workspace.extendSelection`)),1),x(`div`,Ht,[g(R,{color:`primary`,"no-caps":``,label:C(a)(`workspace.commentRange`,{start:t.start,end:t.end}),loading:t.confirming,onClick:o[0]||=e=>i(`confirm`)},null,8,[`label`,`loading`]),g(R,{flat:``,"no-caps":``,label:C(a)(`workspace.cancelSelection`),onClick:o[1]||=e=>i(`cancel`)},null,8,[`label`])])],8,Bt))}}),[[`__scopeId`,`data-v-55ab315b`]]);function Wt(e){let t=e.follow??we,n,r;function i(){r?.(),r=void 0}function a(t=!1){if(n&&!t)return;let r=T(e.root);if(!r?.clientWidth||!r.clientHeight)return;let i=r.getBoundingClientRect().top,a=[...r.querySelectorAll(`[data-file-path]`)].find(e=>e.getBoundingClientRect().bottom>i);if(!a?.dataset.filePath)return;let o=a.querySelector(`.file-card-frame__header`)?.getBoundingClientRect().height??0,s=[...a.querySelectorAll(`[data-line-key]`)].find(e=>e.getBoundingClientRect().bottom>i+o),c=s??a;n={root:r,path:a.dataset.filePath,line:s?.getAttribute(`data-line-key`)??null,offset:He(r,c),request:T(e.request)}}return E(()=>T(e.active),e=>{e||a(!0),i()},{flush:`sync`}),E(()=>T(e.request),i,{flush:`sync`}),E(()=>T(e.root),()=>{n=void 0,i()},{flush:`sync`}),E(()=>T(e.ready),a=>{if(i(),!a||!T(e.active))return;let o=n;n=void 0,o&&o.root===T(e.root)&&o.request===T(e.request)&&(r=t({root:o.root,offset:o.offset,target:()=>{let e=[...o.root.querySelectorAll(`[data-file-path]`)].find(e=>e.dataset.filePath===o.path);return o.line?[...e?.querySelectorAll(`[data-line-key]`)??[]].find(e=>e.getAttribute(`data-line-key`)===o.line)??null:e??null}}))},{flush:`post`}),V(()=>typeof document>`u`?null:document,[`wheel`,`pointerdown`,`touchstart`,`keydown`],i,{capture:!0,passive:!0}),v(i),{capture:a}}var Gt={key:1,class:`q-pa-md text-grey-6`},Kt={class:`col column diff-scroll-container`},qt=[`data-file-path`],Jt=12,Yt=1.5,Xt=2,Zt=K(A({__name:`DiffPanel`,setup(r){let o=se(),{t:s}=H(),c=Z(),l=Fe(),u=Te({reveal:e=>{c.expandFile(e),c.scrollToFile(e)}});a(()=>{let e=u.selection.value;if(!e)return;let t=l.get(e.cardKey,`viewMode`)??`diff`;(e.cardKey!==ue(c.source,e.path)||t!==e.mode)&&u.cancel(e.cardKey)});let{diffFiles:d}=U(c),{error:_,loading:v}=U(Y()),y=$(),{activeReview:b}=U(y);Oe({create:e=>y.createComment(e),edit:(e,t)=>y.editComment(e,t),remove:e=>y.deleteComment(e),resolve:e=>y.resolveComment(e),unresolve:e=>y.unresolveComment(e)});let S=O(null),w=p(()=>S.value?.getScrollTarget()??null);i(be,()=>w.value);let T=O(null),A=O({width:0,height:0}),j=O(!1),M=Wt({active:o,ready:j,root:w,request:()=>c.scrollRequest});return E([o,A,T],async([e,n,r],i,a)=>{if(j.value=!1,!e||!r||n.width<=0||n.height<=0)return;let o=!0;M.capture(),a(()=>{o=!1}),await t(),o&&(r.refresh(-1),await t(),o&&(j.value=!0))},{flush:`post`}),bt({request:()=>c.scrollRequest,list:T,root:w,ready:j}),E(()=>c.layoutVersion,async()=>{await t(),T.value?.reset()}),E(d,async(e,n)=>{te(e,n,(e,t)=>J(e)===J(t))||(await t(),T.value?.reset())}),(t,r)=>(n(),h(D,null,[C(_)?(n(),k(Pe,{key:0,title:C(s)(`changes.loadError`),message:C(_),loading:C(v),onRetry:r[0]||=e=>C(c).refresh()},null,8,[`title`,`message`,`loading`])):m(``,!0),C(d).length===0&&!C(_)?(n(),h(`div`,Gt,e(C(s)(`changes.emptyDiffPanel`)),1)):C(d).length>0?(n(),h(D,{key:2},[g(zt),C(b)?(n(),k(B,{key:0})):m(``,!0),g(jt,{files:C(d),"any-expanded":C(c).hasExpandedFiles,onToggleAll:C(c).toggleAllFiles},null,8,[`files`,`any-expanded`,`onToggleAll`]),g(B),x(`div`,Kt,[g(fe,{onResize:r[1]||=e=>A.value=e}),g(q,{ref_key:`scrollArea`,ref:S,class:`col sticky-header-scroll`,"content-style":`padding: 8px; width: 100%; max-width: 100%`,"content-active-style":`padding: 8px; width: 100%; max-width: 100%`},{default:f(()=>[w.value?(n(),k(Q,{key:C(c).source,ref_key:`virtualScroll`,ref:T,"scroll-target":w.value,items:C(d),"virtual-scroll-item-size":C(46),"virtual-scroll-slice-size":Jt,"virtual-scroll-slice-ratio-before":Yt,"virtual-scroll-slice-ratio-after":Xt},{default:f(({item:e})=>[(n(),h(`div`,{key:C(J)(e),"data-file-path":C(J)(e),class:`diff-virtual-slot`},[g(It,{file:e},null,8,[`file`])],8,qt))]),_:1},8,[`scroll-target`,`items`,`virtual-scroll-item-size`])):m(``,!0)]),_:1},512)])],64)):m(``,!0),!C(b)&&C(d).length>0?(n(),k(ve,{key:3})):m(``,!0),C(u).selection.value?(n(),k(Ut,{key:4,path:C(u).selection.value.path,start:C(u).selection.value.anchor.startKey,end:C(u).selection.value.anchor.endKey,confirming:C(u).selection.value.phase===`confirming`,onConfirm:C(u).confirm,onCancel:r[2]||=e=>C(u).cancel()},null,8,[`path`,`start`,`end`,`confirming`,`onConfirm`])):m(``,!0)],64))}}),[[`__scopeId`,`data-v-30b76bdf`]]),Qt={key:1,class:`q-pa-md text-grey-6`},$t={key:0,class:`row justify-center q-pa-lg`},en={key:1,class:`q-pa-md text-grey-6`},tn={class:`text-caption`},nn={key:2,class:`q-pa-md text-grey-6`},rn=A({__name:`FileContentPanel`,setup(t){let{t:r}=H(),i=Z(),{selectedPath:a,browseFileLines:o,browseFileIsBinary:s,browseFileLoading:c,browseFileError:l,treeError:u,refreshing:d}=U(i),{error:v}=U(Y()),y=p(()=>v.value?{title:r(`changes.loadError`),message:v.value}:u.value?{title:r(`browse.treeLoadError`),message:u.value}:null),b=O(!1);return E(a,e=>{b.value=e?je(e):!1},{immediate:!0}),(t,u)=>(n(),h(D,null,[y.value?(n(),k(Pe,{key:0,title:y.value.title,message:y.value.message,loading:C(d),onRetry:u[0]||=e=>C(i).refresh()},null,8,[`title`,`message`,`loading`])):m(``,!0),C(a)?(n(),k(Ie,{key:2,class:`col`},{header:f(()=>[g(Ce,{path:C(a)},{default:f(()=>[g(Ae,{modelValue:b.value,"onUpdate:modelValue":u[1]||=e=>b.value=e,path:C(a)},null,8,[`modelValue`,`path`])]),_:1},8,[`path`])]),default:f(()=>[C(c)&&C(o).length===0&&!C(l)?(n(),h(`div`,$t,[g(F,{color:`primary`,size:`2em`})])):C(l)?(n(),h(`div`,en,[_(e(C(r)(`changes.fullFileLoadError`))+` `,1),x(`div`,tn,e(C(l)),1),g(R,{flat:``,dense:``,color:`primary`,class:`q-mt-sm`,label:C(r)(`changes.retry`),loading:C(d),onClick:u[2]||=e=>C(i).refresh()},null,8,[`label`,`loading`])])):C(s)?(n(),h(`div`,nn,e(C(r)(`changes.binaryFile`)),1)):(n(),k(q,{key:3,class:`col`,"content-style":`padding: 8px`,"content-active-style":`padding: 8px`},{default:f(()=>[g(Le,{path:C(a),lines:C(o),wrap:b.value},null,8,[`path`,`lines`,`wrap`])]),_:1}))]),_:1})):(n(),h(`div`,Qt,e(C(r)(`browse.selectFile`)),1))],64))}}),an=A({__name:`FileExplorer`,setup(e){let t=Z(),r=$(),{browseMode:i}=U(t);s(()=>{t.refresh(),r.refresh()});let a=re([`files:changed`],()=>void t.refreshFromServerEvent());c(()=>a.close());let o=re([`review:created`,`review:updated`,`review:deleted`,`comment:created`,`comment:updated`,`comment:deleted`],()=>void r.refresh());return c(()=>o.close()),(e,t)=>(n(),k(ge,null,{panel:f(()=>[g(vt)]),content:f(()=>[C(i)?(n(),k(rn,{key:0})):(n(),k(Zt,{key:1}))]),_:1}))}}),on=A({__name:`IndexPage`,setup(e){return(e,t)=>(n(),k(We,null,{default:f(()=>[g(an)]),_:1}))}});export{on as default};
|
|
1
|
+
import{At as e,E as t,F as n,G as r,I as i,J as a,L as o,M as s,N as c,Ot as l,W as u,X as d,Y as f,c as p,d as m,f as h,g,h as _,it as v,k as y,kt as b,l as x,lt as S,mt as C,nt as w,pt as T,q as E,r as D,st as O,u as k,v as A,w as j,z as M}from"./runtime-core.esm-bundler-CAvPiMpd.js";import{_ as N,g as P}from"./use-router-link-CUoYaYUw.js";import{a as F,i as I,l as L,t as R}from"./QBtn-CyyV1Bx_.js";import{M as z,a as B,j as V,n as ee}from"./index-Cw7GJi3K.js";import{n as H}from"./vue-i18n.runtime-CEtihHHL.js";import{r as U}from"./pinia-DO0AdKGg.js";import{f as te,t as ne}from"./agent-store-D_W7iD_B.js";import{n as re}from"./use-server-events-C2X4Xz00.js";import{c as ie,n as ae,t as oe}from"./QSpace-BhOVGpQh.js";import{r as se,t as ce}from"./use-add-agent-context-xHAjjOf1.js";import{r as le}from"./use-virtual-scroll-BAZGswHv.js";import{d as W,u as G}from"./weighted-lru-BGovtJ2a.js";import{t as K}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{l as q,o as ue,s as J,t as Y,u as de}from"./diff-store-B4adGxC2.js";import{n as fe,r as pe,t as X}from"./QVirtualScroll-BYgJ1Kh2.js";import{c as Z,l as me,n as he,o as Q}from"./use-row-height-BsE9-rO2.js";import{r as $}from"./CreateButton-Ch0b7juj.js";import{t as ge}from"./PanelResize-B6FP9ZVB.js";import{r as _e,t as ve}from"./CreateReviewFabButton-DTuJzw3q.js";import{C as ye,S as be,T as xe,_ as Se,a as Ce,b as we,c as Te,d as Ee,f as De,g as Oe,h as ke,i as Ae,l as je,m as Me,n as Ne,o as Pe,p as Fe,r as Ie,s as Le,t as Re,u as ze,v as Be,w as Ve,x as He,y as Ue}from"./StatusSwitcher-DrFHHwGm.js";import{t as We}from"./AppPage-PFJG281y.js";var Ge={class:`row items-center no-wrap q-gutter-x-xs`},Ke={class:`row items-center no-wrap q-gutter-x-xs`},qe=A({__name:`FileExplorerTabs`,props:j({stagedFilesLength:{},unstagedFilesLength:{}},{modelValue:{default:`unstaged`},modelModifiers:{}}),emits:[`update:modelValue`],setup(t){let r=u(t,`modelValue`),{t:i}=H();return(a,o)=>(n(),k(fe,{modelValue:r.value,"onUpdate:modelValue":o[0]||=e=>r.value=e,dense:``,"no-caps":``,align:`left`,"narrow-indicator":``,class:`text-primary q-mb-sm`},{default:f(()=>[g(pe,{name:`unstaged`},{default:f(()=>[x(`div`,Ge,[x(`span`,null,e(C(i)(`changes.unstaged`)),1),g(de,{color:`warning`,rounded:``},{default:f(()=>[_(e(t.unstagedFilesLength),1)]),_:1})])]),_:1}),g(pe,{name:`staged`},{default:f(()=>[x(`div`,Ke,[x(`span`,null,e(C(i)(`changes.staged`)),1),g(de,{color:`positive`,rounded:``},{default:f(()=>[_(e(t.stagedFilesLength),1)]),_:1})])]),_:1})]),_:1},8,[`modelValue`]))}}),Je={class:`file-tree-node`},Ye={class:`row items-center no-wrap q-gutter-x-xs`},Xe=[`data-tooltip`],Ze=[`data-tooltip`],Qe={key:2},$e=K(A({__name:`FileTreeNode`,props:{node:{},selectedPath:{},expandedFolders:{},level:{}},emits:[`toggle-folder`,`file-select`],setup(t,{emit:r}){let i=r;return(r,a)=>{let s=M(`FileTreeNode`,!0);return n(),h(`div`,Je,[t.node.type===`directory`?d((n(),k(G,{key:0,clickable:``,dense:``,style:b({paddingLeft:`${C(Z)(t.level,!1)}px`}),onClick:a[0]||=e=>i(`toggle-folder`,t.node.path)},{default:f(()=>[g(W,{avatar:``,class:`file-tree-node__icon-section`},{default:f(()=>[x(`div`,Ye,[g(L,{name:`chevron_right`,size:`xs`,class:l([`file-tree-node__chevron`,{"file-tree-node__chevron--expanded":t.expandedFolders.has(t.node.path)}])},null,8,[`class`]),g(L,{name:t.expandedFolders.has(t.node.path)?`folder_open`:`folder`,size:`xs`,color:`warning`},null,8,[`name`])])]),_:1}),g(W,{class:`text-mono`},{default:f(()=>[x(`div`,{class:`ellipsis file-tree-node__label`,"data-tooltip":t.node.path},e(t.node.name),9,Xe)]),_:1}),t.node.children?(n(),k(W,{key:0,side:``,class:`text-caption text-grey-6`},{default:f(()=>[_(e(t.node.children.length),1)]),_:1})):m(``,!0)]),_:1},8,[`style`])),[[I]]):d((n(),k(G,{key:1,clickable:``,dense:``,active:t.node.path===t.selectedPath,"active-class":`file-tree-node--selected`,style:b({paddingLeft:`${C(Z)(t.level,!0)}px`}),onClick:a[1]||=e=>i(`file-select`,t.node.path)},{default:f(()=>[g(W,{avatar:``,class:`file-tree-node__icon-section`},{default:f(()=>[g(L,{name:`insert_drive_file`,size:`xs`,color:`grey-6`})]),_:1}),g(W,{class:`text-mono`},{default:f(()=>[x(`div`,{class:`ellipsis file-tree-node__label`,"data-tooltip":t.node.path},e(t.node.name),9,Ze)]),_:1}),t.node.isChanged?(n(),k(W,{key:0,side:``},{default:f(()=>[g(L,{name:`fiber_manual_record`,size:`8px`,color:`warning`})]),_:1})):m(``,!0)]),_:1},8,[`active`,`style`])),[[I]]),t.node.type===`directory`&&t.expandedFolders.has(t.node.path)&&t.node.children?(n(),h(`div`,Qe,[(n(!0),h(D,null,o(t.node.children,e=>(n(),k(s,{key:e.path,node:e,"selected-path":t.selectedPath,"expanded-folders":t.expandedFolders,level:t.level+1,onToggleFolder:a[2]||=e=>i(`toggle-folder`,e),onFileSelect:a[3]||=e=>i(`file-select`,e)},null,8,[`node`,`selected-path`,`expanded-folders`,`level`]))),128))])):m(``,!0)])}}}),[[`__scopeId`,`data-v-ef4a1d44`]]),et={class:`file-list-item__path-row row no-wrap items-center`},tt=[`data-tooltip`],nt={class:`text-caption`},rt={class:`text-positive`},it={class:`text-negative q-ml-xs`},at=K(A({__name:`FileListItem`,props:{file:{},selected:{type:Boolean},source:{},label:{},depth:{}},emits:[`click`],setup(t){let r={added:`A`,modified:`M`,deleted:`D`,renamed:`R`},i={added:`positive`,modified:`warning`,deleted:`negative`,renamed:`purple`},a=t,o=$(),s=p(()=>J(a.file)),c=p(()=>o.commentsByFile.get(s.value)?.length??0);return(a,o)=>d((n(),k(G,{clickable:``,dense:``,class:`file-list-item`,active:t.selected,"active-class":`file-list-item--selected`,"aria-label":t.label===void 0?void 0:s.value,style:b(t.depth===void 0?void 0:{paddingLeft:`${C(Z)(t.depth,!0)}px`}),onClick:o[0]||=e=>a.$emit(`click`)},{default:f(()=>[g(W,{avatar:``,class:`file-list-item__icon-section`},{default:f(()=>[x(`span`,{class:l([`text-caption text-weight-bold text-mono`,`text-${i[t.file.status]}`])},e(r[t.file.status]),3)]),_:1}),g(W,{class:`text-mono`},{default:f(()=>[x(`div`,et,[x(`span`,{class:`ellipsis file-list-item__path-label`,"data-tooltip":s.value},e(t.label??s.value),9,tt),c.value>0?(n(),k(Ve,{key:0,compact:``,class:`file-list-item__badge`,count:c.value},null,8,[`count`])):m(``,!0)])]),_:1}),g(W,{side:``,class:`file-list-item__stats`},{default:f(()=>[x(`span`,nt,[x(`span`,rt,`+`+e(t.file.additions),1),x(`span`,it,`-`+e(t.file.deletions),1)])]),_:1}),g(W,{side:``,class:`file-list-item__actions`},{default:f(()=>[g(xe,{path:s.value,source:t.source},null,8,[`path`,`source`])]),_:1})]),_:1},8,[`active`,`aria-label`,`style`])),[[I]])}}),[[`__scopeId`,`data-v-3c335b20`]]),ot=A({__name:`BrowseModeToggle`,props:{modelValue:{type:Boolean,default:!1},modelModifiers:{}},emits:[`update:modelValue`],setup(t){let r=u(t,`modelValue`),{t:i}=H();return(t,a)=>(n(),k(G,null,{default:f(()=>[g(W,null,{default:f(()=>[g(le,null,{default:f(()=>[_(e(C(i)(`browse.toggle`)),1)]),_:1})]),_:1}),g(W,{side:``},{default:f(()=>[g(ee,{modelValue:r.value,"onUpdate:modelValue":a[0]||=e=>r.value=e,dense:``,size:`xs`},null,8,[`modelValue`])]),_:1})]),_:1}))}}),st={class:`row items-center no-wrap q-gutter-x-xs`},ct=[`data-tooltip`],lt=K(A({__name:`DiffTreeFolderRow`,props:{name:{},path:{},depth:{},expanded:{type:Boolean},locked:{type:Boolean}},emits:[`toggle`],setup(t){let{t:r}=H();return(i,a)=>d((n(),k(G,{clickable:!t.locked,dense:``,class:`file-list-item diff-tree-folder-row`,style:b({paddingLeft:`${C(Z)(t.depth,!1)}px`}),"aria-expanded":t.locked?void 0:t.expanded,"aria-label":t.locked?void 0:C(r)(`changes.listMode.folder`,{path:t.path}),onClick:a[0]||=e=>i.$emit(`toggle`)},{default:f(()=>[g(W,{avatar:``,class:`diff-tree-folder-row__icons`},{default:f(()=>[x(`div`,st,[g(L,{name:`chevron_right`,size:`xs`,class:l([`diff-tree-folder-row__chevron`,{"diff-tree-folder-row__chevron--expanded":t.expanded,invisible:t.locked}])},null,8,[`class`]),g(L,{name:t.expanded?`folder_open`:`folder`,size:`xs`,color:`warning`},null,8,[`name`])])]),_:1}),g(W,{class:`text-mono`},{default:f(()=>[x(`span`,{class:`ellipsis`,"data-tooltip":t.path},e(t.name),9,ct)]),_:1})]),_:1},8,[`clickable`,`style`,`aria-expanded`,`aria-label`])),[[I,!t.locked]])}}),[[`__scopeId`,`data-v-e82c6cd4`]]),ut={class:`file-list-panel__header q-pa-sm`},dt={key:1,class:`text-subtitle2 q-mb-sm`},ft={key:0,class:`text-primary`},pt={class:`row no-wrap items-center q-gutter-x-xs`},mt={key:0,class:`row justify-center q-pa-lg`},ht={key:0,class:`text-caption text-grey-6 q-px-md q-py-sm`},gt={key:0,class:`text-caption text-grey-6 q-px-md q-py-sm`},_t=32,vt=K(A({__name:`FileListPanel`,setup(t){let{t:r}=H(),{stagedFiles:i,unstagedFiles:a,initialLoading:s,error:c}=U(Y()),l=Q(),{source:u,browseMode:d,filter:v,selectedPath:y,expandedFolders:b,treeInitialLoading:S,treeError:T,filteredDiffFiles:E,diffTreeRows:A,diffListMode:j,filtering:M,filteredTree:N,totalTreeFiles:P}=U(l),I=O(null),L=p(()=>I.value?.getScrollTarget()??null);return(t,p)=>(n(),h(D,null,[x(`div`,ut,[C(d)?(n(),h(`div`,dt,[_(e(C(r)(`browse.allFiles`))+` `,1),C(P)>0||!C(T)?(n(),h(`span`,ft,`(`+e(C(P))+`)`,1)):m(``,!0)])):(n(),k(qe,{key:0,modelValue:C(u),"onUpdate:modelValue":p[0]||=e=>w(u)?u.value=e:null,"staged-files-length":C(i).length,"unstaged-files-length":C(a).length},null,8,[`modelValue`,`staged-files-length`,`unstaged-files-length`])),x(`div`,pt,[g(_e,{modelValue:C(v),"onUpdate:modelValue":p[1]||=e=>w(v)?v.value=e:null,class:`col`,placeholder:C(d)?C(r)(`browse.searchPlaceholder`):C(r)(`changes.filterPlaceholder`)},null,8,[`modelValue`,`placeholder`]),C(d)?m(``,!0):(n(),k(R,{key:0,flat:``,dense:``,round:``,size:`sm`,icon:`account_tree`,color:C(j)===`tree`?`primary`:void 0,"aria-label":C(r)(`changes.listMode.tree`),"aria-pressed":C(j)===`tree`,onClick:p[2]||=e=>j.value=C(j)===`tree`?`list`:`tree`},{default:f(()=>[g(z,{delay:C(500)},{default:f(()=>[_(e(C(r)(`changes.listMode.tree`)),1)]),_:1},8,[`delay`])]),_:1},8,[`color`,`aria-label`,`aria-pressed`]))])]),g(B),g(q,{ref_key:`scrollArea`,ref:I,class:`col file-list-panel__scroll`,"content-style":`padding: 4px 0`,"content-active-style":`padding: 4px 0`},{default:f(()=>[(C(d)?C(S):C(s))?(n(),h(`div`,mt,[g(F,{color:`primary`,size:`2em`})])):C(d)?(n(),h(D,{key:1},[C(N).length===0&&(!C(T)||C(v)&&C(P)>0)?(n(),h(`p`,ht,e(C(v)?C(r)(`browse.noMatchingFiles`):C(r)(`browse.noFiles`)),1)):m(``,!0),(n(!0),h(D,null,o(C(N),e=>(n(),k($e,{key:e.path,node:e,"selected-path":C(y),"expanded-folders":C(b),level:0,onToggleFolder:C(l).toggleFolder,onFileSelect:C(l).selectFile},null,8,[`node`,`selected-path`,`expanded-folders`,`onToggleFolder`,`onFileSelect`]))),128))],64)):(n(),h(D,{key:2},[C(E).length===0&&(C(v)||!C(c))?(n(),h(`p`,gt,e(C(v)?C(r)(`browse.noMatchingFiles`):C(r)(`changes.emptyFileList`)),1)):m(``,!0),L.value&&C(j)===`tree`?(n(),k(X,{key:`${C(u)}:tree`,"scroll-target":L.value,items:C(A),"virtual-scroll-item-size":_t},{default:f(({item:e})=>[e.kind===`folder`?(n(),k(lt,{key:`d:${e.path}`,name:e.name,path:e.path,depth:e.depth,expanded:e.expanded,locked:C(M),onToggle:t=>C(l).toggleDiffFolder(e.paths)},null,8,[`name`,`path`,`depth`,`expanded`,`locked`,`onToggle`])):(n(),k(at,{key:`f:${e.path}`,file:e.file,label:e.name,depth:e.depth,selected:C(y)===e.path,source:C(u),onClick:t=>C(l).selectFile(e.path)},null,8,[`file`,`label`,`depth`,`selected`,`source`,`onClick`]))]),_:1},8,[`scroll-target`,`items`])):L.value?(n(),k(X,{key:`${C(u)}:list`,"scroll-target":L.value,items:C(E),"virtual-scroll-item-size":_t},{default:f(({item:e})=>[(n(),k(at,{key:C(J)(e),file:e,selected:C(y)===C(J)(e),source:C(u),onClick:t=>C(l).selectFile(C(J)(e))},null,8,[`file`,`selected`,`source`,`onClick`]))]),_:1},8,[`scroll-target`,`items`])):m(``,!0)],64))]),_:1},512),g(B),g(ot,{modelValue:C(d),"onUpdate:modelValue":p[3]||=e=>w(d)?d.value=e:null},null,8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-bdc095b7`]]),yt=[`wheel`,`pointerdown`,`keydown`,`touchstart`];function bt(e){let n=e.inputTarget??(typeof document>`u`?null:document),r=e.follow??we,i=null,a;function o(){(e.ready===void 0||T(e.ready))&&(i=T(e.request),a?.(),a=void 0)}for(let e of yt)n?.addEventListener(e,o,{capture:!0,passive:!0});let s=E([()=>T(e.request),()=>T(e.list),()=>T(e.root),()=>e.ready===void 0||T(e.ready)],([n,o,s,c],l,u)=>{if(!n||n===i||!o||!s||!c)return;let d=!1,f=!1,p,m=()=>{d=!0,p?.(),p=void 0};a=m,u(()=>{m(),T(e.request)===n&&(f||T(e.list)!==o||T(e.root)!==s)&&(i=n),a===m&&(a=void 0)}),t().then(()=>{d||n===i||e.ready!==void 0&&!T(e.ready)||(f=!0,o.scrollTo(n.index,`start`),p=r({root:s,target:()=>e.target?e.target(n):document.getElementById(`diff-file-${n.path}`)}))})},{immediate:!0,flush:`post`});v(()=>{s(),a?.();for(let e of yt)n?.removeEventListener(e,o,!0)})}var xt=[`aria-label`,`aria-expanded`],St={class:`diff-status-bar__files ellipsis`},Ct={class:`text-weight-medium`},wt={key:0,class:`text-grey-6 q-ml-sm`},Tt={key:1,class:`text-grey-6 q-ml-sm`},Et={key:2,class:`text-grey-6 q-ml-sm`},Dt={key:3,class:`text-grey-6 q-ml-sm`},Ot={class:`diff-status-bar__lines row items-center q-gutter-x-md no-wrap`},kt={class:`text-positive`},At={class:`text-negative`},jt=K(A({__name:`DiffStatusBar`,props:{files:{},anyExpanded:{type:Boolean}},emits:[`toggle-all`],setup(t,{emit:r}){let i=t,a=r,{t:o}=H(),s=p(()=>{let e=i.files.reduce((e,t)=>e+t.additions,0),t=i.files.reduce((e,t)=>e+t.deletions,0),n=i.files.filter(e=>e.status===`added`).length,r=i.files.filter(e=>e.status===`modified`).length,a=i.files.filter(e=>e.status===`deleted`).length,o=i.files.filter(e=>e.status===`renamed`).length;return{total:i.files.length,additions:e,deletions:t,added:n,modified:r,deleted:a,renamed:o}});return(r,i)=>(n(),h(`div`,{class:`diff-status-bar row items-center q-pa-sm text-body2 non-selectable`,role:`button`,tabindex:`0`,"aria-label":C(o)(t.anyExpanded?`changes.collapseAll`:`changes.expandAll`),"aria-expanded":t.anyExpanded,onDblclick:i[0]||=e=>a(`toggle-all`),onKeydown:[i[1]||=P(N(e=>!e.repeat&&a(`toggle-all`),[`prevent`]),[`enter`]),i[2]||=P(N(e=>!e.repeat&&a(`toggle-all`),[`prevent`]),[`space`])]},[x(`div`,St,[x(`span`,Ct,e(C(o)(`changes.filesChanged`,s.value.total))+`:`,1),s.value.added?(n(),h(`span`,wt,e(s.value.added)+` `+e(C(o)(`changes.added`)),1)):m(``,!0),s.value.modified?(n(),h(`span`,Tt,e(s.value.modified)+` `+e(C(o)(`changes.modified`)),1)):m(``,!0),s.value.deleted?(n(),h(`span`,Et,e(s.value.deleted)+` `+e(C(o)(`changes.deletedPlural`)),1)):m(``,!0),s.value.renamed?(n(),h(`span`,Dt,e(s.value.renamed)+` `+e(C(o)(`changes.renamed`)),1)):m(``,!0)]),x(`div`,Ot,[x(`span`,kt,`+`+e(s.value.additions)+` `+e(C(o)(`changes.additions`)),1),x(`span`,At,`-`+e(s.value.deletions)+` `+e(C(o)(`changes.deletions`)),1)]),g(z,{delay:C(500)},{default:f(()=>[_(e(C(o)(t.anyExpanded?`changes.collapseAllHint`:`changes.expandAllHint`)),1)]),_:1},8,[`delay`])],40,xt))}}),[[`__scopeId`,`data-v-6335a458`]]),Mt=6e3,Nt=40;function Pt(e,t,n){let r=S(n(t())?.clientWidth??0),i=p(()=>JSON.stringify([e.version,r.value])),a=Me({get minHeight(){return e.minHeight},get heightOwner(){return e.owner},heightKey:`card-reserve`,get heightVersion(){return i.value},get cacheHeight(){return e.cacheHeight},get keep(){return e.keep},cost:Nt,mountMargin:Mt},t),o;function s(){let e=n(t());e&&(r.value=e.clientWidth,o=ke(e,()=>{r.value=e.clientWidth})),a.start(e)}function c(){a.stop(),o?.(),o=void 0}return v(c),{mounted:a.mounted,height:a.height,start:s,stop:c}}var Ft={key:1,class:`card-shell-placeholder__title text-mono`,"aria-busy":`true`},It=K(A({__name:`ChangesFileCard`,props:{file:{}},setup(t){let i=t,a=Q(),o=Y(),c=$(),{expandedFiles:u}=U(a),{activeReview:d,commentsByFile:f}=U(c),m=p(()=>J(i.file)),g=p(()=>ue(a.source,m.value)),_=p(()=>o.hunksOf(a.source,i.file)),v=p(()=>o.hunksFresh(a.source,i.file)),x=p(()=>o.hunksError(a.source,i.file)),S=p(()=>u.value.has(m.value)),w=p(()=>f.value.get(m.value)),T=p(()=>!!d.value),E=he(T),D={key:g.value},O=De(`wrap`,()=>je(m.value),D),A=De(`viewMode`,()=>`diff`,D),j=Ee(D),M=ze(D),N=p(()=>A.value===`full`?M.value:j.value),P=p(()=>46+(S.value?Ue(i.file,_.value,E.value)+Be(w.value??[],A.value)+(N.value?90:0):0)),F=p(()=>Se({expanded:S.value,mode:A.value,wrap:O.value,activeReview:T.value,rowHeight:E.value,pending:N.value,comments:w.value})),I=r(`el`),{mounted:L,height:R,start:z,stop:B}=Pt({get minHeight(){return P.value},get owner(){return _.value??i.file},get version(){return F.value},get cacheHeight(){return S.value&&v.value&&A.value===`diff`&&!O.value&&!w.value?.length&&!N.value},get keep(){return!!N.value}},()=>I.value,ye());s(z),y(B);function V(){o.ensureHunks(a.source,i.file)}function ee(){o.retryHunks(a.source,i.file)}return(r,i)=>(n(),h(`div`,{ref_key:`el`,ref:I,class:l({"card-shell-placeholder":!C(L)}),style:b(C(L)?void 0:{height:`${C(R)}px`})},[C(L)?(n(),k(Ne,{key:0,file:t.file,"state-key":g.value,detail:_.value,"hunks-loaded":v.value,"hunks-error":x.value,expanded:S.value,"agent-source":C(a).source,commentable:T.value,"comments-editable":T.value,comments:w.value,onLoadHunks:V,onRetryHunks:ee,onClearHunksError:i[0]||=e=>C(o).clearHunksError(C(a).source,t.file),onToggle:i[1]||=e=>C(a).handleCardToggle(m.value),onExpand:i[2]||=e=>C(a).expandFile(m.value)},null,8,[`file`,`state-key`,`detail`,`hunks-loaded`,`hunks-error`,`expanded`,`agent-source`,`commentable`,`comments-editable`,`comments`])):(n(),h(`div`,Ft,e(m.value),1))],6))}}),[[`__scopeId`,`data-v-39faff44`]]),Lt={key:0,class:`active-review-bar row items-center q-gutter-x-sm q-px-sm no-wrap`},Rt={class:`text-body2 ellipsis`},zt=K(A({__name:`ActiveReviewBar`,setup(t){let{t:r}=H(),i=ie(),a=$(),{activeReview:o}=U(a),s=ne(),c=ce();function l(e){a.setStatus(e).catch(e=>{i(r(`reviews.comments.error`),e)})}return(t,i)=>C(o)?(n(),h(`div`,Lt,[g(L,{name:`rate_review`,size:`18px`,color:`primary`}),x(`span`,Rt,e(C(o).name??C(r)(`reviews.list.unnamed`)),1),g(oe),C(s).enabled?(n(),k(R,{key:0,flat:``,dense:``,"no-caps":``,size:`sm`,icon:C(ae),label:C(r)(`agent.context.addReview`),onClick:i[0]||=e=>C(c)({kind:`review`,reviewId:C(o).id})},null,8,[`icon`,`label`])):m(``,!0),g(Re,{status:C(o).status,onChange:l},null,8,[`status`])])):m(``,!0)}}),[[`__scopeId`,`data-v-2b6e4bdd`]]),Bt=[`aria-label`],Vt={class:`text-caption ellipsis`},Ht={class:`row items-center q-gutter-sm`},Ut=K(A({__name:`TouchCommentToolbar`,props:{path:{},start:{},end:{},confirming:{type:Boolean}},emits:[`confirm`,`cancel`],setup(t,{emit:r}){let i=r,{t:a}=H();return(r,o)=>(n(),h(`div`,{class:`touch-comment-toolbar q-pa-sm`,role:`region`,"aria-label":C(a)(`workspace.selectLines`)},[x(`div`,Vt,e(t.path)+` · `+e(C(a)(`workspace.extendSelection`)),1),x(`div`,Ht,[g(R,{color:`primary`,"no-caps":``,label:C(a)(`workspace.commentRange`,{start:t.start,end:t.end}),loading:t.confirming,onClick:o[0]||=e=>i(`confirm`)},null,8,[`label`,`loading`]),g(R,{flat:``,"no-caps":``,label:C(a)(`workspace.cancelSelection`),onClick:o[1]||=e=>i(`cancel`)},null,8,[`label`])])],8,Bt))}}),[[`__scopeId`,`data-v-55ab315b`]]);function Wt(e){let t=e.follow??we,n,r;function i(){r?.(),r=void 0}function a(t=!1){if(n&&!t)return;let r=T(e.root);if(!r?.clientWidth||!r.clientHeight)return;let i=r.getBoundingClientRect().top,a=[...r.querySelectorAll(`[data-file-path]`)].find(e=>e.getBoundingClientRect().bottom>i);if(!a?.dataset.filePath)return;let o=a.querySelector(`.file-card-frame__header`)?.getBoundingClientRect().height??0,s=[...a.querySelectorAll(`[data-line-key]`)].find(e=>e.getBoundingClientRect().bottom>i+o),c=s??a;n={root:r,path:a.dataset.filePath,line:s?.getAttribute(`data-line-key`)??null,offset:He(r,c),request:T(e.request)}}return E(()=>T(e.active),e=>{e||a(!0),i()},{flush:`sync`}),E(()=>T(e.request),i,{flush:`sync`}),E(()=>T(e.root),()=>{n=void 0,i()},{flush:`sync`}),E(()=>T(e.ready),a=>{if(i(),!a||!T(e.active))return;let o=n;n=void 0,o&&o.root===T(e.root)&&o.request===T(e.request)&&(r=t({root:o.root,offset:o.offset,target:()=>{let e=[...o.root.querySelectorAll(`[data-file-path]`)].find(e=>e.dataset.filePath===o.path);return o.line?[...e?.querySelectorAll(`[data-line-key]`)??[]].find(e=>e.getAttribute(`data-line-key`)===o.line)??null:e??null}}))},{flush:`post`}),V(()=>typeof document>`u`?null:document,[`wheel`,`pointerdown`,`touchstart`,`keydown`],i,{capture:!0,passive:!0}),v(i),{capture:a}}var Gt={key:1,class:`q-pa-md text-grey-6`},Kt={class:`col column diff-scroll-container`},qt=[`data-file-path`],Jt=12,Yt=1.5,Xt=2,Zt=K(A({__name:`DiffPanel`,setup(r){let o=se(),{t:s}=H(),c=Q(),l=Fe(),u=Te({reveal:e=>{c.expandFile(e),c.scrollToFile(e)}});a(()=>{let e=u.selection.value;if(!e)return;let t=l.get(e.cardKey,`viewMode`)??`diff`;(e.cardKey!==ue(c.source,e.path)||t!==e.mode)&&u.cancel(e.cardKey)});let{diffFiles:d}=U(c),{error:_,loading:v}=U(Y()),y=$(),{activeReview:b}=U(y);Oe({create:e=>y.createComment(e),edit:(e,t)=>y.editComment(e,t),remove:e=>y.deleteComment(e),resolve:e=>y.resolveComment(e),unresolve:e=>y.unresolveComment(e)});let S=O(null),w=p(()=>S.value?.getScrollTarget()??null);i(be,()=>w.value);let T=O(null),A=O({width:0,height:0}),j=O(!1),M=Wt({active:o,ready:j,root:w,request:()=>c.scrollRequest});return E([o,A,T],async([e,n,r],i,a)=>{if(j.value=!1,!e||!r||n.width<=0||n.height<=0)return;let o=!0;M.capture(),a(()=>{o=!1}),await t(),o&&(r.refresh(-1),await t(),o&&(j.value=!0))},{flush:`post`}),bt({request:()=>c.scrollRequest,list:T,root:w,ready:j}),E(()=>c.layoutVersion,async()=>{await t(),T.value?.reset()}),E(d,async(e,n)=>{te(e,n,(e,t)=>J(e)===J(t))||(await t(),T.value?.reset())}),(t,r)=>(n(),h(D,null,[C(_)?(n(),k(Pe,{key:0,title:C(s)(`changes.loadError`),message:C(_),loading:C(v),onRetry:r[0]||=e=>C(c).refresh()},null,8,[`title`,`message`,`loading`])):m(``,!0),C(d).length===0&&!C(_)?(n(),h(`div`,Gt,e(C(s)(`changes.emptyDiffPanel`)),1)):C(d).length>0?(n(),h(D,{key:2},[g(zt),C(b)?(n(),k(B,{key:0})):m(``,!0),g(jt,{files:C(d),"any-expanded":C(c).hasExpandedFiles,onToggleAll:C(c).toggleAllFiles},null,8,[`files`,`any-expanded`,`onToggleAll`]),g(B),x(`div`,Kt,[g(me,{onResize:r[1]||=e=>A.value=e}),g(q,{ref_key:`scrollArea`,ref:S,class:`col sticky-header-scroll`,"content-style":`padding: 8px; width: 100%; max-width: 100%`,"content-active-style":`padding: 8px; width: 100%; max-width: 100%`},{default:f(()=>[w.value?(n(),k(X,{key:C(c).source,ref_key:`virtualScroll`,ref:T,"scroll-target":w.value,items:C(d),"virtual-scroll-item-size":C(46),"virtual-scroll-slice-size":Jt,"virtual-scroll-slice-ratio-before":Yt,"virtual-scroll-slice-ratio-after":Xt},{default:f(({item:e})=>[(n(),h(`div`,{key:C(J)(e),"data-file-path":C(J)(e),class:`diff-virtual-slot`},[g(It,{file:e},null,8,[`file`])],8,qt))]),_:1},8,[`scroll-target`,`items`,`virtual-scroll-item-size`])):m(``,!0)]),_:1},512)])],64)):m(``,!0),!C(b)&&C(d).length>0?(n(),k(ve,{key:3})):m(``,!0),C(u).selection.value?(n(),k(Ut,{key:4,path:C(u).selection.value.path,start:C(u).selection.value.anchor.startKey,end:C(u).selection.value.anchor.endKey,confirming:C(u).selection.value.phase===`confirming`,onConfirm:C(u).confirm,onCancel:r[2]||=e=>C(u).cancel()},null,8,[`path`,`start`,`end`,`confirming`,`onConfirm`])):m(``,!0)],64))}}),[[`__scopeId`,`data-v-30b76bdf`]]),Qt={key:1,class:`q-pa-md text-grey-6`},$t={key:0,class:`row justify-center q-pa-lg`},en={key:1,class:`q-pa-md text-grey-6`},tn={class:`text-caption`},nn={key:2,class:`q-pa-md text-grey-6`},rn=A({__name:`FileContentPanel`,setup(t){let{t:r}=H(),i=Q(),{selectedPath:a,browseFileLines:o,browseFileIsBinary:s,browseFileLoading:c,browseFileError:l,treeError:u,refreshing:d}=U(i),{error:v}=U(Y()),y=p(()=>v.value?{title:r(`changes.loadError`),message:v.value}:u.value?{title:r(`browse.treeLoadError`),message:u.value}:null),b=O(!1);return E(a,e=>{b.value=e?je(e):!1},{immediate:!0}),(t,u)=>(n(),h(D,null,[y.value?(n(),k(Pe,{key:0,title:y.value.title,message:y.value.message,loading:C(d),onRetry:u[0]||=e=>C(i).refresh()},null,8,[`title`,`message`,`loading`])):m(``,!0),C(a)?(n(),k(Ie,{key:2,class:`col`},{header:f(()=>[g(Ce,{path:C(a)},{default:f(()=>[g(Ae,{modelValue:b.value,"onUpdate:modelValue":u[1]||=e=>b.value=e,path:C(a)},null,8,[`modelValue`,`path`])]),_:1},8,[`path`])]),default:f(()=>[C(c)&&C(o).length===0&&!C(l)?(n(),h(`div`,$t,[g(F,{color:`primary`,size:`2em`})])):C(l)?(n(),h(`div`,en,[_(e(C(r)(`changes.fullFileLoadError`))+` `,1),x(`div`,tn,e(C(l)),1),g(R,{flat:``,dense:``,color:`primary`,class:`q-mt-sm`,label:C(r)(`changes.retry`),loading:C(d),onClick:u[2]||=e=>C(i).refresh()},null,8,[`label`,`loading`])])):C(s)?(n(),h(`div`,nn,e(C(r)(`changes.binaryFile`)),1)):(n(),k(q,{key:3,class:`col`,"content-style":`padding: 8px`,"content-active-style":`padding: 8px`},{default:f(()=>[g(Le,{path:C(a),lines:C(o),wrap:b.value},null,8,[`path`,`lines`,`wrap`])]),_:1}))]),_:1})):(n(),h(`div`,Qt,e(C(r)(`browse.selectFile`)),1))],64))}}),an=A({__name:`FileExplorer`,setup(e){let t=Q(),r=$(),{browseMode:i}=U(t);s(()=>{t.refresh(),r.refresh()});let a=re([`files:changed`],()=>void t.refreshFromServerEvent());c(()=>a.close());let o=re([`review:created`,`review:updated`,`review:deleted`,`comment:created`,`comment:updated`,`comment:deleted`],()=>void r.refresh());return c(()=>o.close()),(e,t)=>(n(),k(ge,null,{panel:f(()=>[g(vt)]),content:f(()=>[C(i)?(n(),k(rn,{key:0})):(n(),k(Zt,{key:1}))]),_:1}))}}),on=A({__name:`IndexPage`,setup(e){return(e,t)=>(n(),k(We,null,{default:f(()=>[g(an)]),_:1}))}});export{on as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.preview-controls[data-v-6576d18c]{border:1px solid var(--window-divider);background:var(--window-header-bg);font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none;border-radius:4px;padding:2px;font-size:10px;box-shadow:0 3px 12px #00000040}.preview-controls__value[data-v-6576d18c]{white-space:nowrap;padding:0 2px}.preview-controls__number[data-v-6576d18c]{padding:1px 4px;display:inline-block}.preview-controls__page[data-v-6576d18c]{text-align:center}.preview-controls__status[data-v-6576d18c]{flex:0 0 19px;justify-content:center;align-items:center;display:flex}.preview-controls__scale[data-v-6576d18c]{text-align:center;min-width:36px}.preview-controls__divider[data-v-6576d18c]{border-left:1px solid var(--window-divider);height:12px;margin:0 2px}.terminal-header__drag[data-v-243c298c]{cursor:move;-webkit-user-select:none;user-select:none}.terminal-header__drag--static[data-v-243c298c]{cursor:default}.terminal-tabs[data-v-4855fecf]{border-bottom:1px solid var(--window-divider);flex:none;min-height:36px}.terminal-tabs__tabs[data-v-4855fecf]{min-width:0}.terminal-tab[data-v-4855fecf]{text-transform:none;padding:0 8px}.terminal-tab__body[data-v-4855fecf]{min-width:0;max-width:200px}.terminal-tab__name[data-v-4855fecf]{min-width:0;font-size:12px}.terminal-resize[data-v-662195a2]{z-index:2;touch-action:none;--edge:8px;--corner:12px;--outside:calc(var(--edge) / -2);--edge-inset:calc(var(--corner) + var(--outside));position:absolute}.terminal-resize--n[data-v-662195a2],.terminal-resize--s[data-v-662195a2]{left:var(--edge-inset);right:var(--edge-inset);height:var(--edge);cursor:ns-resize}.terminal-resize--e[data-v-662195a2],.terminal-resize--w[data-v-662195a2]{top:var(--edge-inset);bottom:var(--edge-inset);width:var(--edge);cursor:ew-resize}.terminal-resize--ne[data-v-662195a2],.terminal-resize--nw[data-v-662195a2],.terminal-resize--se[data-v-662195a2],.terminal-resize--sw[data-v-662195a2]{width:var(--corner);height:var(--corner)}.terminal-resize--n[data-v-662195a2],.terminal-resize--ne[data-v-662195a2],.terminal-resize--nw[data-v-662195a2]{top:var(--outside)}.terminal-resize--s[data-v-662195a2],.terminal-resize--se[data-v-662195a2],.terminal-resize--sw[data-v-662195a2]{bottom:var(--outside)}.terminal-resize--e[data-v-662195a2],.terminal-resize--ne[data-v-662195a2],.terminal-resize--se[data-v-662195a2]{right:var(--outside)}.terminal-resize--w[data-v-662195a2],.terminal-resize--nw[data-v-662195a2],.terminal-resize--sw[data-v-662195a2]{left:var(--outside)}.terminal-resize--ne[data-v-662195a2],.terminal-resize--sw[data-v-662195a2]{cursor:nesw-resize}.terminal-resize--nw[data-v-662195a2],.terminal-resize--se[data-v-662195a2]{cursor:nwse-resize}.floating-window[data-v-6fd58857]{display:flex;position:fixed}.floating-window__frame[data-v-6fd58857]{border:1px solid var(--window-divider);min-width:0;box-shadow:var(--window-shadow);border-radius:8px;flex-direction:column;flex:1;display:flex;overflow:hidden}.floating-window--maximized .floating-window__frame[data-v-6fd58857]{box-shadow:none;border:0;border-radius:0}.floating-window__body[data-v-6fd58857]{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.floating-window--narrow[data-v-6fd58857]{padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom)}.terminal-window__body[data-v-c2b14aaf]{flex:1;min-width:0;min-height:0;display:flex}.project-text[data-v-2b18c7a6]{font-family:var(--font-mono);white-space:pre;margin:0;padding:16px}.project-text__selected[data-v-2b18c7a6]{background:#ffbe0033}.preview-diagram[data-v-d44ed45b]{width:max-content;padding:16px}.preview-diagram[data-v-d44ed45b] svg{max-width:none!important}.preview-image[data-v-96021427]{max-width:100%;margin:16px auto;display:block}.preview-viewport[data-v-be53dd3d]{flex:1;min-width:0;min-height:0;display:flex;position:relative}.preview-overlay[data-v-be53dd3d]{z-index:2;position:absolute;bottom:16px;right:16px}.preview-content[data-v-be53dd3d]{flex:1;min-height:0;position:relative;overflow:auto}.preview-markdown[data-v-be53dd3d]{padding:24px clamp(32px,8%,128px)}.preview-refresh[data-v-be53dd3d]{position:sticky;bottom:12px;left:12px}.preview-title[data-v-ccb7478f]{cursor:move;-webkit-user-select:none;user-select:none}.preview-tabs[data-v-2dd6485f]{border-bottom:1px solid var(--window-divider);flex:none;min-height:36px}.preview-tabs__tabs[data-v-2dd6485f]{min-width:0}.preview-tab-label[data-v-2dd6485f]{max-width:240px}.preview-empty[data-v-0b464106]{flex:1}.preview-drop-overlay[data-v-8958b637]{z-index:3;pointer-events:none;border:2px dashed var(--q-primary);background:var(--window-header-bg);color:var(--q-primary);border-radius:8px;position:absolute;inset:0}.window-dock[data-v-53bb5fb0]{z-index:2600;border:1px solid var(--window-divider);background:color-mix(in srgb, var(--window-header-bg) 88%, black);box-shadow:var(--window-shadow);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-radius:12px;align-items:center;gap:4px;max-width:100vw;max-height:100vh;padding:6px;display:flex;position:fixed}body.body--dark .window-dock{background:color-mix(in srgb, var(--window-header-bg) 88%, white)}.window-dock--vertical[data-v-53bb5fb0]{flex-direction:column}.window-dock__handle[data-v-53bb5fb0]{cursor:move;touch-action:none;align-items:center;padding:4px;display:flex}.window-dock__button[data-v-53bb5fb0]{border:1px solid #0000;border-radius:8px;width:42px;min-height:42px;padding:0}.window-dock__button--running[data-v-53bb5fb0]{border-color:color-mix(in srgb, currentColor 65%, transparent);background:linear-gradient(to bottom, color-mix(in srgb, currentColor 18%, transparent), color-mix(in srgb, currentColor 7%, transparent));box-shadow:inset 0 1px 1px #ffffff38,inset 0 -1px 1px #00000026,0 2px 3px #0003}.window-dock__item[data-v-53bb5fb0]{position:relative}.window-dock__button--active[data-v-53bb5fb0]{border-color:var(--q-primary);background:var(--q-primary);box-shadow:inset 0 1px 1px #ffffff4d, 0 0 0 2px color-mix(in srgb, var(--q-primary) 35%, transparent), 0 2px 3px #0003}.agent-item__thumb[data-v-a05b8739]{cursor:zoom-in;width:72px;height:72px}.agent-item.q-message[data-v-f80f2fb9]{font-family:var(--font-agent);min-width:0;max-width:100%;margin-bottom:0}.agent-item[data-v-f80f2fb9] .q-message-text{min-height:0;padding-left:16px;padding-right:16px}.agent-item[data-v-f80f2fb9] .q-message-container>*,.agent-item[data-v-f80f2fb9] .q-message-text-content,.agent-item[data-v-f80f2fb9] .q-message-text{min-width:0;max-width:100%}.agent-item__text[data-v-f80f2fb9]{white-space:pre-wrap;overflow-wrap:anywhere;font-size:14px;line-height:1.65}.agent-item.q-message[data-v-67ce6781]{font-family:var(--font-agent);min-width:0;max-width:100%;margin-bottom:0}.agent-item[data-v-67ce6781] .q-message-text{min-height:0;padding-left:16px;padding-right:16px}.agent-item[data-v-67ce6781] .q-message-container>*,.agent-item[data-v-67ce6781] .q-message-text-content,.agent-item[data-v-67ce6781] .q-message-text{min-width:0;max-width:100%}.agent-item[data-v-67ce6781] .md-content{font-size:14px;line-height:1.65}.agent-item[data-v-67ce6781] .md-content strong,.agent-item[data-v-67ce6781] .md-content b{font-weight:500}.agent-diff[data-v-60226168]{border:1px solid var(--q-separator-color,#8080804d);border-radius:4px}.agent-diff__path[data-v-60226168]{background:var(--diff-header-bg);padding:2px 8px}.agent-diff__body[data-v-60226168]{max-width:100%;margin:0;font-size:12px;line-height:1.45;overflow-x:auto}.agent-diff__row[data-v-60226168]{white-space:pre;padding:0 8px;display:block}.agent-diff__row--added[data-v-60226168]{background:#2ea0432e}.agent-diff__row--removed[data-v-60226168]{background:#f851492e}.agent-tool[data-v-6537eaaa]{border:1px solid var(--q-separator-color,#8080804d);border-radius:6px;font-size:11px}.agent-tool[data-v-6537eaaa] .q-item{min-height:26px;padding:0 8px}.agent-tool[data-v-6537eaaa] .q-item__label{font-size:11px}.agent-tool[data-v-6537eaaa] .q-item__section--side{padding-left:6px}.agent-tool__icon[data-v-6537eaaa]{min-width:22px;padding-right:6px}.agent-tool__badge[data-v-6537eaaa]{font-size:10px}.agent-tool__caption[data-v-6537eaaa],.agent-tool__body[data-v-6537eaaa]{font-size:11px}.agent-tool__output[data-v-6537eaaa]{white-space:pre-wrap;max-height:200px;margin:0;font-size:11px;overflow:auto}.agent-thought[data-v-2bc07051]{font-size:11px}.agent-thought__text[data-v-2bc07051]{white-space:pre-wrap;font-size:11px}.agent-thought[data-v-2bc07051] .q-item{min-height:26px;padding:0 8px}.agent-thought[data-v-2bc07051] .q-item__label,.agent-thought[data-v-2bc07051] .q-item__section--main{font-size:11px}.agent-thought[data-v-2bc07051] .q-icon{font-size:14px}.agent-auto-approved[data-v-c0c0181b]{font-size:11px}.agent-auto-approved[data-v-c0c0181b] .q-icon{font-size:14px}.agent-chat-banners__banner[data-v-ece62303]{overflow-wrap:anywhere;flex:none;font-size:12px}.agent-chat-banners__banner[data-v-ece62303] .q-banner__content,.agent-chat-banners__banner[data-v-ece62303] .q-btn{font-size:12px;line-height:1.35}.agent-chat-banners__banner[data-v-ece62303] .q-banner__actions{align-self:center}.agent-mention-popup[data-v-9f415c8c]{z-index:6000;border:1px solid #80808059;border-radius:6px;width:340px;max-width:calc(100vw - 16px);max-height:260px;font-size:13px;position:fixed;overflow-y:auto}.agent-mention-popup__item[data-v-9f415c8c]{cursor:pointer;align-items:baseline;gap:8px;padding:4px 10px;display:flex}.agent-mention-popup__item--active[data-v-9f415c8c]{background:#1976d22e}.agent-mention-popup__icon[data-v-9f415c8c]{opacity:.7;flex:none}.agent-mention-popup__name[data-v-9f415c8c]{flex:none;font-weight:500}.agent-mention-popup__dir[data-v-9f415c8c]{opacity:.6;text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;min-width:0;font-size:11.5px;overflow:hidden}.agent-editor-wrap[data-v-7bc219e6]{min-width:0;position:relative}.agent-editor[data-v-7bc219e6]{font-family:var(--font-agent);white-space:pre-wrap;overflow-wrap:anywhere;outline:none;min-height:24px;max-height:160px;padding:5px 4px;font-size:14px;line-height:1.65;overflow-y:auto}.agent-editor[aria-disabled=true][data-v-7bc219e6]{cursor:not-allowed;opacity:.6}.agent-editor--empty[data-v-7bc219e6]:before{content:attr(data-placeholder);opacity:.5;pointer-events:none;text-overflow:ellipsis;white-space:nowrap;position:absolute;top:5px;left:4px;right:4px;overflow:hidden}.agent-editor[data-v-7bc219e6] .agent-mention{-webkit-user-select:none;user-select:none;white-space:nowrap;background:#1976d22e;border-radius:4px;align-items:center;margin:0 1px;padding:0 1px 0 6px;font-size:12.5px;line-height:1.6;display:inline-flex}.agent-editor[data-v-7bc219e6] .agent-mention__remove{color:inherit;cursor:pointer;opacity:.6;background:0 0;border:0;padding:0 4px;font-size:14px;line-height:1}.agent-editor[data-v-7bc219e6] .agent-mention__remove:hover{opacity:1}.agent-attachment-thumb[data-v-b18100a3]{width:56px;height:56px;position:relative}.agent-attachment-thumb-remove[data-v-b18100a3]{position:absolute;top:-6px;right:-6px}.agent-add-menu[data-v-3c2497e7]{min-width:180px}.agent-dot[data-v-39759232]{flex:none;justify-content:center;align-items:center;width:14px;height:14px;display:inline-flex}.agent-dot__mark[data-v-39759232]{background:var(--q-positive);opacity:.55;border-radius:50%;width:7px;height:7px}.agent-dot__mark--attention[data-v-39759232]{background:var(--q-warning);opacity:1}.agent-dot__mark--closed[data-v-39759232]{background:var(--q-negative);opacity:1}.agent-cfg[data-v-444c80b3]{max-width:190px;font-size:12px}.agent-cfg[data-v-444c80b3] .q-btn__content{flex-wrap:nowrap}.agent-cfg[data-v-444c80b3] .block{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.agent-cfg__list[data-v-444c80b3]{width:340px;min-width:220px;max-width:calc(100vw - 24px);max-height:300px}.agent-speech-language[data-v-267df2a8]{font-size:12px}.agent-speech-language__list[data-v-267df2a8]{width:260px;max-width:calc(100vw - 24px);max-height:300px;overflow-y:auto}.agent-composer__status[data-v-165fe17f]{min-height:28px;margin-top:4px}.agent-composer__state[data-v-165fe17f]{opacity:.8;padding-right:8px;font-size:12px}.workspace--narrow .agent-composer__status[data-v-165fe17f]{grid-template-columns:minmax(0,1fr) auto;display:grid}.workspace--narrow .agent-composer__options[data-v-165fe17f]{grid-area:1/1/auto/-1;column-gap:4px;width:100%;margin-left:0}.workspace--narrow .agent-composer__options[data-v-165fe17f]>.q-btn{max-width:100%;margin-left:0}.workspace--narrow .agent-composer__state[data-v-165fe17f]{grid-area:2/1}.workspace--narrow .agent-composer__actions[data-v-165fe17f]{grid-area:2/2}.agent-voice[data-v-eb989d7b]{position:relative}.agent-voice__hidden[data-v-eb989d7b]{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.agent-voice__button[data-v-eb989d7b]{touch-action:none;-webkit-user-select:none;user-select:none}.agent-voice__spectrum[data-v-eb989d7b]{pointer-events:none;justify-content:center;align-items:center;gap:2px;width:18px;height:18px;display:flex}.agent-voice__bar[data-v-eb989d7b]{background:currentColor;border-radius:1px;width:2px;height:18px;transition:transform .1s linear}@media (prefers-reduced-motion:reduce){.agent-voice__bar[data-v-eb989d7b]{transition:none}}.agent-voice__preview[data-v-eb989d7b]{white-space:pre-wrap;pointer-events:none;border-radius:8px;width:max-content;max-width:min(420px,80vw);padding:6px 10px;font-size:13px;line-height:1.4;position:absolute;bottom:calc(100% + 6px);right:0}.agent-composer[data-v-9c1d8c99]{flex:none;padding:4px 16px 10px}.agent-composer__box[data-v-9c1d8c99]{border:1px solid #80808073;border-radius:8px}.agent-composer__box[data-v-9c1d8c99]:focus-within{border-color:var(--q-primary)}.agent-permission[data-v-e3be80da]{border:1px solid #8080804d;border-left:3px solid var(--q-warning);border-radius:4px;padding:6px 10px 8px;font-size:12px}.agent-permission__head[data-v-e3be80da]{opacity:.7;font-size:11px}.agent-permission__title[data-v-e3be80da]{text-overflow:ellipsis;white-space:nowrap;margin-top:2px;overflow:hidden}.agent-permission__changes[data-v-e3be80da]{font-size:11px}.agent-permission__changes[data-v-e3be80da] .q-item{min-height:24px;padding:0}.agent-view[data-v-1b8ca673]{position:absolute;inset:0}.agent-view[data-v-1b8ca673] .q-scrollarea__content{width:100%}.agent-view__feed[data-v-1b8ca673]{flex-direction:column;gap:10px;padding:14px 16px;display:flex}.agent-empty[data-v-cb2aea04]{padding:24px}.agent-empty__hint[data-v-cb2aea04]{max-width:260px}.agent-tabs[data-v-b05c3281]{border-bottom:1px solid var(--q-separator-color,#8080804d);flex:none}.agent-tabs__tabs[data-v-b05c3281]{min-width:0}.agent-tab[data-v-b05c3281]{text-transform:none;padding:0 8px}.agent-tab__body[data-v-b05c3281]{min-width:0;max-width:180px}.agent-tab__name[data-v-b05c3281]{min-width:0;font-size:13px}.agent-panel__views[data-v-11fe00e5]{min-height:0;position:relative}.agent-new-chat[data-v-887d90c7]{width:380px;max-width:92vw}.agent-drawer__handle[data-v-0862203d]{z-index:10;cursor:col-resize;touch-action:none;width:13px;position:absolute;top:0;bottom:0;left:-6px}.agent-drawer__handle[data-v-0862203d]:focus-visible{outline-offset:2px;outline:2px solid}.agent-drawer--dragging[data-v-0862203d]{-webkit-user-select:none;user-select:none;transition:none!important}.repo-info[data-v-4e247bfe]{line-height:1}.qr-code[data-v-db84bdf4]{width:200px;height:200px}.devices-dialog__address[data-v-2a6bb4ed]{width:100%;font-family:var(--font-mono)}.agent-menu__chats[data-v-ef5e913a]{padding:4px 0 8px}.agent-menu__dot[data-v-ef5e913a]{min-width:28px;padding-left:8px}.device-request__code[data-v-73287f6f]{font-family:var(--font-mono);letter-spacing:.3em}.workspace-footer[data-v-a2180cb1]{padding-bottom:env(safe-area-inset-bottom)}.workspace-footer[data-v-a2180cb1] .q-tab{min-width:44px;min-height:64px}.workspace-footer[data-v-a2180cb1] .q-tab__icon{font-size:28px}.workspace-agent[data-v-d07bf0fa]{min-width:0;position:fixed;left:0;right:0}
|