@tequila99/githuman 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +10 -0
  2. package/dist/cli/index.js +27 -2
  3. package/dist/cli/server-runtime.js +1 -0
  4. package/dist/server/app.js +22 -1
  5. package/dist/server/errors/terminal.js +4 -0
  6. package/dist/server/hooks/terminal/local-origin.js +25 -0
  7. package/dist/server/routes/app-info.js +5 -2
  8. package/dist/server/routes/terminal.js +63 -0
  9. package/dist/server/services/terminal/backend.js +216 -0
  10. package/dist/server/services/terminal/channel.js +200 -0
  11. package/dist/server/services/terminal/escape-tail.js +93 -0
  12. package/dist/server/services/terminal/processes.js +115 -0
  13. package/dist/server/services/terminal/prompt-tracker.js +15 -0
  14. package/dist/server/services/terminal/registry.js +167 -0
  15. package/dist/server/services/terminal/session.js +238 -0
  16. package/dist/server/services/terminal/socket.js +74 -0
  17. package/dist/server/services/terminal/tokens.js +32 -0
  18. package/dist/shared/app/schemas.js +5 -1
  19. package/dist/shared/terminal/constants.js +27 -0
  20. package/dist/shared/terminal/schemas.js +114 -0
  21. package/dist/shared/terminal/types.js +1 -0
  22. package/dist/web/assets/{AppPage-BYrCfRnC.js → AppPage-D_OHhrKS.js} +2 -2
  23. package/dist/web/assets/CreateReviewFabButton-B737aIvn.js +1 -0
  24. package/dist/web/assets/ErrorNotFound-jc5_L_-4.js +1 -0
  25. package/dist/web/assets/IndexPage-DzlFTw_b.js +1 -0
  26. package/dist/web/assets/IndexPage-u_qqIPRL.css +1 -0
  27. package/dist/web/assets/MainLayout-DaSyo22r.js +8 -0
  28. package/dist/web/assets/MainLayout-DoniW026.css +1 -0
  29. package/dist/web/assets/QBadge-BY-jTQ8w.js +1 -0
  30. package/dist/web/assets/QBtn-Bgm40omM.js +1 -0
  31. package/dist/web/assets/QSelect-713AWDd_.js +1 -0
  32. package/dist/web/assets/QSpace-BLu5AyZv.css +1 -0
  33. package/dist/web/assets/QSpace-BVBU-0oC.js +17 -0
  34. package/dist/web/assets/ReviewDetailPage-CLM6aU4u.js +1 -0
  35. package/dist/web/assets/ReviewsPage-bllnaoOS.js +1 -0
  36. package/dist/web/assets/StatusSwitcher-BZ4FYVnY.js +2 -0
  37. package/dist/web/assets/{StatusSwitcher-DLU1h0rK.css → StatusSwitcher-BxRuEHHQ.css} +1 -1
  38. package/dist/web/assets/TerminalView-B11UHZv3.css +1 -0
  39. package/dist/web/assets/TerminalView-Ci9CNTyY.js +19 -0
  40. package/dist/web/assets/_plugin-vue_export-helper-BDNMzG2s.js +1 -0
  41. package/dist/web/assets/{abnfDiagram-O67JEVCF-dyvffE6R.js → abnfDiagram-O67JEVCF-4qpB0CGh.js} +1 -1
  42. package/dist/web/assets/agent-store-DIma0R4U.js +1 -0
  43. package/dist/web/assets/app-info-store-BzsJOxVc.js +1 -0
  44. package/dist/web/assets/architecture-7GRP2DOG-DG6nf_hE.js +1 -0
  45. package/dist/web/assets/{architectureDiagram-NJMV4G6O-Dk-QthCI.js → architectureDiagram-NJMV4G6O-CEL-_i5O.js} +1 -1
  46. package/dist/web/assets/{blockDiagram-BEXU5L5S-sF48dzNS.js → blockDiagram-BEXU5L5S-bMrUf1GU.js} +1 -1
  47. package/dist/web/assets/{c4Diagram-YGBWAQC7-BWrux-0F.js → c4Diagram-YGBWAQC7-C54mp6dl.js} +1 -1
  48. package/dist/web/assets/channel-CS4rbjhf.js +1 -0
  49. package/dist/web/assets/chunk-3FUC2YCW-BtIughAT.js +2 -0
  50. package/dist/web/assets/{chunk-5DYCD2WN-CpgXf7LJ.js → chunk-5DYCD2WN-BhyMEDuJ.js} +1 -1
  51. package/dist/web/assets/{chunk-742MDFTN-BGzG-dZE.js → chunk-742MDFTN-8MczzxE2.js} +1 -1
  52. package/dist/web/assets/{chunk-7INBJB4K-DJGc-gqS.js → chunk-7INBJB4K-BdS9oIIG.js} +1 -1
  53. package/dist/web/assets/{chunk-7M6MHVWA-CYIOaZel.js → chunk-7M6MHVWA-BU5_UwaZ.js} +1 -1
  54. package/dist/web/assets/{chunk-7PRAP22T-CJZNYL51.js → chunk-7PRAP22T-BaAw-gEj.js} +1 -1
  55. package/dist/web/assets/{chunk-GTNCS2PH-DOYGHmMk.js → chunk-GTNCS2PH-DNpH8E_x.js} +1 -1
  56. package/dist/web/assets/{chunk-GWA4HPMP-RIikrSw1.js → chunk-GWA4HPMP-BvG5tXy2.js} +1 -1
  57. package/dist/web/assets/{chunk-MBY4JIJT-ZSssyEJi.js → chunk-MBY4JIJT-B8XJMHG2.js} +1 -1
  58. package/dist/web/assets/{chunk-NETBCI7D-3tnHEq90.js → chunk-NETBCI7D-ClCXW1dx.js} +1 -1
  59. package/dist/web/assets/{chunk-O7XYJQB3-CDFTy-aQ.js → chunk-O7XYJQB3-BNcB0oiZ.js} +1 -1
  60. package/dist/web/assets/{chunk-UA2S7LBM-B8rY8Yj-.js → chunk-UA2S7LBM-CS5CtIsj.js} +1 -1
  61. package/dist/web/assets/{chunk-WEXAMYUT-BdPY0e7q.js → chunk-WEXAMYUT-CJaZJWKF.js} +1 -1
  62. package/dist/web/assets/{chunk-Z7XXMR3K-Br_E149D.js → chunk-Z7XXMR3K-DP2k1Ci5.js} +1 -1
  63. package/dist/web/assets/{chunk-ZIGJFQKS-DDjPFexL.js → chunk-ZIGJFQKS-y4KHfdEv.js} +1 -1
  64. package/dist/web/assets/{classDiagram-v2-NBCMYWYE-D9kneDxy.js → classDiagram-v2-NBCMYWYE-C-kWcloV.js} +1 -1
  65. package/dist/web/assets/create-CSUVwdx4.js +1 -0
  66. package/dist/web/assets/{cynefin-OW5HDTMX-Dot1PBqs.js → cynefin-OW5HDTMX-C3AwH_vU.js} +1 -1
  67. package/dist/web/assets/{cynefinDiagram-VND7K2PF-6uYi0u-j.js → cynefinDiagram-VND7K2PF-DYF_CoB8.js} +1 -1
  68. package/dist/web/assets/{dagre-6A5THRUB-BDM5YkfJ.js → dagre-6A5THRUB-DWCEmsd1.js} +1 -1
  69. package/dist/web/assets/debounce-rZaFFwsz.js +1 -0
  70. package/dist/web/assets/{diagram-22UHCM2B-DxE0D8WB.js → diagram-22UHCM2B-oBFhSpao.js} +1 -1
  71. package/dist/web/assets/{diagram-3UASUU5V-CuD1fcFQ.js → diagram-3UASUU5V-Cj9rB07y.js} +1 -1
  72. package/dist/web/assets/{diagram-ATOU4E4O-DX6enGgq.js → diagram-ATOU4E4O-D4H9BqUQ.js} +1 -1
  73. package/dist/web/assets/{diagram-CDSNMT55-eLqOiVoC.js → diagram-CDSNMT55-qLgJBiIs.js} +1 -1
  74. package/dist/web/assets/{diagram-MLGK6HIB-DtIMj5y1.js → diagram-MLGK6HIB-Bhhvtx0A.js} +1 -1
  75. package/dist/web/assets/{diagram-MPIPVDR6-lYcwsjHR.js → diagram-MPIPVDR6-O4wokd54.js} +1 -1
  76. package/dist/web/assets/{ebnfDiagram-ZINNZB2B-CGmBWaKx.js → ebnfDiagram-ZINNZB2B-BRU7SszO.js} +1 -1
  77. package/dist/web/assets/{elk-276RUBZZ-B1ntUD9z.js → elk-276RUBZZ-r0X8f7Sv.js} +1 -1
  78. package/dist/web/assets/{erDiagram-OPXOYQCR-Dqzoldin.js → erDiagram-OPXOYQCR-DbgjsGkX.js} +1 -1
  79. package/dist/web/assets/eventmodeling-NTZA5JFV-1Q8-FsiO.js +1 -0
  80. package/dist/web/assets/flowDiagram-KWPJA3E3-BbwsRPsv.js +1 -0
  81. package/dist/web/assets/{ganttDiagram-FUAMR5RP-CF6kJAoY.js → ganttDiagram-FUAMR5RP-BwhUglGo.js} +1 -1
  82. package/dist/web/assets/{gitGraph-4MIJSDKK-CUzcGxMa.js → gitGraph-4MIJSDKK-DA11BsSo.js} +1 -1
  83. package/dist/web/assets/{gitGraphDiagram-X574FWY7-D-XNa6f2.js → gitGraphDiagram-X574FWY7-BdG7d-11.js} +1 -1
  84. package/dist/web/assets/i18n-D1K2AGeW.js +1 -0
  85. package/dist/web/assets/index-BatRsx0U.css +1 -0
  86. package/dist/web/assets/index-DuCIKkvf.js +2 -0
  87. package/dist/web/assets/{info-A6RAGUB7-CH4SNmU8.js → info-A6RAGUB7-BxzfvGqu.js} +1 -1
  88. package/dist/web/assets/{infoDiagram-VRGFBTTK-35AKnD7M.js → infoDiagram-VRGFBTTK-veq817ut.js} +1 -1
  89. package/dist/web/assets/init-app-DKRVN8HV.js +1 -0
  90. package/dist/web/assets/{is-BB7rJzdU.js → is-EbmiuVzv.js} +1 -1
  91. package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-D41YBWSb.js → ishikawaDiagram-OU5B5YK6-DMuzkArR.js} +1 -1
  92. package/dist/web/assets/{journeyDiagram-ZHPQQLJL-CZF6Wwk8.js → journeyDiagram-ZHPQQLJL-Cqj0kbKe.js} +1 -1
  93. package/dist/web/assets/{kanban-definition-PNTS6WVX-CVGaUle0.js → kanban-definition-PNTS6WVX-DUvral0v.js} +1 -1
  94. package/dist/web/assets/{line-CeH4KBRO.js → line-DcLaUOyJ.js} +1 -1
  95. package/dist/web/assets/{mermaid-parser.core-YrU9LTTJ.js → mermaid-parser.core-CY7nVQ2O.js} +3 -3
  96. package/dist/web/assets/{mermaid.core-BkLEn5Vh.js → mermaid.core-Cz083qmW.js} +4 -4
  97. package/dist/web/assets/{mindmap-definition-NLK3R4M7-D22lxuXn.js → mindmap-definition-NLK3R4M7--Twjhxcv.js} +1 -1
  98. package/dist/web/assets/{packet-AYTQ26CC-DMK0BdeB.js → packet-AYTQ26CC-Csf3Pf50.js} +1 -1
  99. package/dist/web/assets/{pegDiagram-GJSIUBJH-B-e5e5cW.js → pegDiagram-GJSIUBJH-vVjFUYc4.js} +1 -1
  100. package/dist/web/assets/{pie-WAS4IAKB-BYP5ND4b.js → pie-WAS4IAKB-CyUE71ZQ.js} +1 -1
  101. package/dist/web/assets/{pieDiagram-5QR66LMP-DrEY0oA_.js → pieDiagram-5QR66LMP-CV24sdEs.js} +1 -1
  102. package/dist/web/assets/pinia-UjhgYLzw.js +1 -0
  103. package/dist/web/assets/pinia-ri8AYppz.js +1 -0
  104. package/dist/web/assets/{quadrantDiagram-O4NWA36T-D12UM_7Y.js → quadrantDiagram-O4NWA36T-GVAUaTqf.js} +1 -1
  105. package/dist/web/assets/{radar-RG4KPBEZ-50JpTuMu.js → radar-RG4KPBEZ-D7YGMFYX.js} +1 -1
  106. package/dist/web/assets/{railroad-74A4TZTK-C-7jDcYE.js → railroad-74A4TZTK-BYsDf4cg.js} +1 -1
  107. package/dist/web/assets/railroad-abnf-HS5TGJTU-Bg7f5Sbu.js +1 -0
  108. package/dist/web/assets/railroad-ebnf-LZEXJU2U-ufUodNib.js +1 -0
  109. package/dist/web/assets/railroad-peg-WCYAUIDC-YvUtEf_g.js +1 -0
  110. package/dist/web/assets/{railroadDiagram-XR7U4H2S-q0-o99ts.js → railroadDiagram-XR7U4H2S-DOyP7Y6B.js} +1 -1
  111. package/dist/web/assets/{requirementDiagram-PLB6GJNP-DsO-Ejin.js → requirementDiagram-PLB6GJNP-C2CJ05_O.js} +1 -1
  112. package/dist/web/assets/runtime-core.esm-bundler-CF89Lyp2.js +1 -0
  113. package/dist/web/assets/{safe-storage-DRouskD4.js → safe-storage-BpHrcFXl.js} +1 -1
  114. package/dist/web/assets/{sankeyDiagram-IPEJSGJF-Ct9goD-6.js → sankeyDiagram-IPEJSGJF-rYUTxo-7.js} +1 -1
  115. package/dist/web/assets/{sequenceDiagram-PO4LG4MO-BMO_A2FU.js → sequenceDiagram-PO4LG4MO-Dy-NGv9K.js} +1 -1
  116. package/dist/web/assets/{stateDiagram-v2-GCMORJYK-BSzg0zQp.js → stateDiagram-v2-GCMORJYK-_uEXf3B4.js} +1 -1
  117. package/dist/web/assets/{swimlanes-2SLR337P-CcmfFMci.js → swimlanes-2SLR337P-CcejXyI9.js} +1 -1
  118. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-I9_cJ2VX.js +8 -0
  119. package/dist/web/assets/theme-Dv0yhgRD.js +1 -0
  120. package/dist/web/assets/{timeline-definition-EJHVYXUP-0dcHdY2G.js → timeline-definition-EJHVYXUP-CSry3jW1.js} +1 -1
  121. package/dist/web/assets/{treeView-Q6P3EWNA-KynQIJ_Z.js → treeView-Q6P3EWNA-CUCgNMVi.js} +1 -1
  122. package/dist/web/assets/{treemap-WGGIJYW6-DPpYRzcH.js → treemap-WGGIJYW6-BtG_xZt4.js} +1 -1
  123. package/dist/web/assets/use-app-theme-CSRcIN0e.js +1 -0
  124. package/dist/web/assets/use-panel-width-DNg6NE2M.js +1 -0
  125. package/dist/web/assets/use-server-events-CYiRauy1.js +1 -0
  126. package/dist/web/assets/use-virtual-scroll-DTEGubei.js +1 -0
  127. package/dist/web/assets/{usecaseDiagram-POWQR4AR-DJBtB_eN.js → usecaseDiagram-POWQR4AR-BY2X6VR2.js} +1 -1
  128. package/dist/web/assets/{vennDiagram-UO4OBE2U-BgllcrO_.js → vennDiagram-UO4OBE2U-D-khbRsr.js} +1 -1
  129. package/dist/web/assets/{vue-i18n.runtime-D0pkhc7g.js → vue-i18n.runtime-BTqPc4vG.js} +2 -2
  130. package/dist/web/assets/{wardley-WFR3VGLG-D2Je-cZt.js → wardley-WFR3VGLG-BwwTtxgX.js} +1 -1
  131. package/dist/web/assets/{wardleyDiagram-VNRHLVJA-B7ktegci.js → wardleyDiagram-VNRHLVJA-N4eN_Mx8.js} +1 -1
  132. package/dist/web/assets/{xychartDiagram-PMCCYNJV-DL7WkDZI.js → xychartDiagram-PMCCYNJV-Bp3do5lv.js} +1 -1
  133. package/dist/web/index.html +7 -7
  134. package/package.json +11 -3
  135. package/dist/web/assets/CreateReviewFabButton-UdzUa_ra.js +0 -1
  136. package/dist/web/assets/ErrorNotFound-BAP3n0aC.js +0 -1
  137. package/dist/web/assets/IndexPage-BtoeYBg2.js +0 -1
  138. package/dist/web/assets/IndexPage-D894ONbY.css +0 -1
  139. package/dist/web/assets/MainLayout-ChxXEt_Q.css +0 -1
  140. package/dist/web/assets/MainLayout-DjoItVv0.js +0 -7
  141. package/dist/web/assets/QBtn-BDbJU6_B.js +0 -1
  142. package/dist/web/assets/QMenu-Bh-SjGqz.js +0 -1
  143. package/dist/web/assets/QSelect-CZqAOLiG.js +0 -1
  144. package/dist/web/assets/ReviewDetailPage-DvDoJ37c.js +0 -1
  145. package/dist/web/assets/ReviewsPage-CHUXLKKw.js +0 -1
  146. package/dist/web/assets/StatusSwitcher-Br_8-_CT.js +0 -2
  147. package/dist/web/assets/agent-icon-BUd-vCRS.css +0 -1
  148. package/dist/web/assets/agent-icon-Bc3evt8o.js +0 -17
  149. package/dist/web/assets/agent-store-FOng_RxK.js +0 -1
  150. package/dist/web/assets/app-info-store-xZiQfdgO.js +0 -1
  151. package/dist/web/assets/architecture-7GRP2DOG-JRGyT2Fi.js +0 -1
  152. package/dist/web/assets/channel-C9BIu6HY.js +0 -1
  153. package/dist/web/assets/chunk-3FUC2YCW-DM9oDQ0E.js +0 -2
  154. package/dist/web/assets/create-BkZH2Q0U.js +0 -1
  155. package/dist/web/assets/debounce-CDIE7CV6.js +0 -1
  156. package/dist/web/assets/eventmodeling-NTZA5JFV-DblBuyVi.js +0 -1
  157. package/dist/web/assets/flowDiagram-KWPJA3E3-D5iLm5ip.js +0 -1
  158. package/dist/web/assets/i18n-DvBemXXT.js +0 -1
  159. package/dist/web/assets/index-Bn7ByP7x.js +0 -2
  160. package/dist/web/assets/index-CgeU6Wuu.css +0 -1
  161. package/dist/web/assets/init-app-C4PeiqQX.js +0 -1
  162. package/dist/web/assets/pinia-DB8WAJFa.js +0 -1
  163. package/dist/web/assets/pinia-DmTi2T44.js +0 -1
  164. package/dist/web/assets/railroad-abnf-HS5TGJTU-Bf3pkLrz.js +0 -1
  165. package/dist/web/assets/railroad-ebnf-LZEXJU2U-f10AkgiO.js +0 -1
  166. package/dist/web/assets/railroad-peg-WCYAUIDC-C4FjCCVf.js +0 -1
  167. package/dist/web/assets/runtime-core.esm-bundler-CUpq88z7.js +0 -1
  168. package/dist/web/assets/single-flight-r8B7stt1.js +0 -1
  169. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-DLq4WqTk.js +0 -8
  170. package/dist/web/assets/theme-DQpF6lSZ.js +0 -1
  171. package/dist/web/assets/use-app-theme-B1Vh5WKT.js +0 -1
  172. package/dist/web/assets/use-panel-width-Cs_K2M_v.js +0 -1
  173. package/dist/web/assets/use-virtual-scroll-BVHTKnoC.js +0 -1
@@ -0,0 +1,74 @@
1
+ import { TERMINAL_SNAPSHOT_BYTES } from "../../../shared/terminal/constants.js";
2
+ import { TerminalChannel } from "./channel.js";
3
+ // Detect a dead peer: close the socket after one missed pong.
4
+ const HEARTBEAT_MS = 30_000;
5
+ function rawDataToText(data) {
6
+ if (Buffer.isBuffer(data))
7
+ return data.toString('utf8');
8
+ if (data instanceof ArrayBuffer)
9
+ return Buffer.from(data).toString('utf8');
10
+ return Buffer.concat(data).toString('utf8');
11
+ }
12
+ export function attachTerminalSocket(socket, registry, options = {}) {
13
+ let alive = true;
14
+ // oxlint-disable-next-line prefer-const -- close captures the channel while its constructor sends the first message
15
+ let channel;
16
+ const close = () => {
17
+ channel?.dispose();
18
+ socket.terminate();
19
+ };
20
+ const send = (message) => {
21
+ if (socket.readyState !== socket.OPEN)
22
+ return;
23
+ // A slow client must not make the server buffer without limit.
24
+ if (socket.bufferedAmount > TERMINAL_SNAPSHOT_BYTES) {
25
+ close();
26
+ return;
27
+ }
28
+ socket.send(JSON.stringify(message), error => {
29
+ if (error)
30
+ close();
31
+ });
32
+ };
33
+ channel = new TerminalChannel(registry, send, close);
34
+ socket.on('message', (data, binary) => {
35
+ // The protocol uses text frames only.
36
+ if (binary) {
37
+ close();
38
+ return;
39
+ }
40
+ try {
41
+ // The channel checks the shape of the message.
42
+ channel?.receive(JSON.parse(rawDataToText(data)));
43
+ }
44
+ catch {
45
+ close();
46
+ }
47
+ });
48
+ socket.on('pong', () => {
49
+ alive = true;
50
+ });
51
+ const heartbeat = setInterval(() => {
52
+ if (!alive) {
53
+ close();
54
+ return;
55
+ }
56
+ // The next pong must arrive before the next tick.
57
+ alive = false;
58
+ socket.ping();
59
+ }, options.heartbeatMs ?? HEARTBEAT_MS);
60
+ heartbeat.unref();
61
+ let ended = false;
62
+ // Both `close` and `error` events call this function, so it must run only once.
63
+ const cleanup = () => {
64
+ if (ended)
65
+ return;
66
+ ended = true;
67
+ clearInterval(heartbeat);
68
+ channel?.dispose();
69
+ options.onDisconnect?.();
70
+ };
71
+ socket.on('close', cleanup);
72
+ socket.on('error', cleanup);
73
+ return { close };
74
+ }
@@ -0,0 +1,32 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { TERMINAL_TOKEN_MS } from "../../../shared/terminal/constants.js";
3
+ // Bound token memory when a page repeatedly requests credentials.
4
+ const MAX_TOKENS = 256;
5
+ export class TerminalTokens {
6
+ tokens = new Map();
7
+ now;
8
+ constructor(now = Date.now) {
9
+ this.now = now;
10
+ }
11
+ issue(origin) {
12
+ this.prune();
13
+ if (this.tokens.size >= MAX_TOKENS)
14
+ this.tokens.delete(this.tokens.keys().next().value ?? '');
15
+ const token = randomBytes(32).toString('base64url');
16
+ this.tokens.set(token, { origin, expires: this.now() + TERMINAL_TOKEN_MS });
17
+ return token;
18
+ }
19
+ consume(token, origin) {
20
+ const info = this.tokens.get(token);
21
+ this.tokens.delete(token);
22
+ return !!info && info.expires > this.now() && info.origin === origin;
23
+ }
24
+ prune() {
25
+ for (const [token, info] of this.tokens)
26
+ if (info.expires <= this.now())
27
+ this.tokens.delete(token);
28
+ }
29
+ clear() {
30
+ this.tokens.clear();
31
+ }
32
+ }
@@ -1,6 +1,10 @@
1
+ import { TerminalCapabilitySchema } from "../terminal/schemas.js";
1
2
  import { Type } from '@sinclair/typebox';
2
3
  export const AppInfoSchema = Type.Object({
3
- version: Type.String({ description: 'githuman version from package.json.' })
4
+ version: Type.String({
5
+ description: 'githuman version from package.json.'
6
+ }),
7
+ terminal: TerminalCapabilitySchema
4
8
  }, { description: 'Facts about the running server.' });
5
9
  export const HealthSchema = Type.Object({
6
10
  status: Type.Literal('ok', { description: 'Always "ok".' })
@@ -0,0 +1,27 @@
1
+ // Bound process and emulator memory for one repository.
2
+ export const MAX_TERMINAL_SESSIONS = 8;
3
+ // Keep useful history without retaining unlimited command output.
4
+ export const TERMINAL_SCROLLBACK = 5000;
5
+ // Confirmed idle sessions need less orphan time than running jobs.
6
+ export const TERMINAL_IDLE_MS = 15 * 60 * 1000;
7
+ // Output must not extend the lifetime of an orphaned command.
8
+ export const TERMINAL_ORPHAN_MS = 60 * 60 * 1000;
9
+ // Tokens are used only for an immediate connection attempt.
10
+ export const TERMINAL_TOKEN_MS = 30_000;
11
+ // Bound the shell title that the server stores and publishes.
12
+ export const TERMINAL_TITLE_LENGTH = 256;
13
+ // A smaller screen cannot show a shell prompt.
14
+ export const TERMINAL_MIN_COLS = 2;
15
+ export const TERMINAL_MIN_ROWS = 2;
16
+ // Small screens and bounded snapshots need bounded cell dimensions.
17
+ export const TERMINAL_MAX_COLS = 300;
18
+ // Bound the visible buffer as well as scrollback.
19
+ export const TERMINAL_MAX_ROWS = 100;
20
+ // Keep individual input frames and output batches small.
21
+ export const TERMINAL_FRAME_BYTES = 64 * 1024;
22
+ // Pause the backend before parser queues grow without limit.
23
+ export const TERMINAL_QUEUE_BYTES = 1024 * 1024;
24
+ // Credit bounds each client's unacknowledged output.
25
+ export const TERMINAL_CLIENT_BYTES = 4 * 1024 * 1024;
26
+ // Snapshot frames may contain a bounded screen and history.
27
+ export const TERMINAL_SNAPSHOT_BYTES = 16 * 1024 * 1024;
@@ -0,0 +1,114 @@
1
+ import { Type } from '@sinclair/typebox';
2
+ import { Nullable } from "../utils/schemas.js";
3
+ import { TERMINAL_MAX_COLS, TERMINAL_MIN_COLS, TERMINAL_MIN_ROWS, TERMINAL_MAX_ROWS, TERMINAL_FRAME_BYTES, TERMINAL_TITLE_LENGTH, MAX_TERMINAL_SESSIONS } from "./constants.js";
4
+ // Every command is validated before it reaches a shell.
5
+ const id = Type.String({
6
+ minLength: 1,
7
+ maxLength: 64,
8
+ description: 'Terminal session identifier.'
9
+ });
10
+ const requestId = Type.String({
11
+ minLength: 1,
12
+ maxLength: 64,
13
+ description: 'Client operation identifier.'
14
+ });
15
+ const cols = Type.Integer({
16
+ minimum: TERMINAL_MIN_COLS,
17
+ maximum: TERMINAL_MAX_COLS,
18
+ description: 'Screen columns.'
19
+ });
20
+ const rows = Type.Integer({
21
+ minimum: TERMINAL_MIN_ROWS,
22
+ maximum: TERMINAL_MAX_ROWS,
23
+ description: 'Screen rows.'
24
+ });
25
+ const data = Type.String({
26
+ maxLength: TERMINAL_FRAME_BYTES,
27
+ description: 'Terminal data.'
28
+ });
29
+ function message(type, fields) {
30
+ return Type.Object({
31
+ type: Type.Literal(type, { description: 'Message discriminator.' }),
32
+ ...fields
33
+ }, { additionalProperties: false, description: `${type} terminal message.` });
34
+ }
35
+ export const TerminalModeSchema = Type.Union([Type.Literal('pty'), Type.Literal('pipe')], { description: 'Backend mode.' });
36
+ export const TerminalRunningSchema = Type.Union([Type.Literal('idle'), Type.Literal('running'), Type.Literal('unknown')], { description: 'Confirmed process activity or unknown.' });
37
+ export const TerminalInfoSchema = Type.Object({
38
+ id,
39
+ title: Type.String({
40
+ maxLength: TERMINAL_TITLE_LENGTH,
41
+ description: 'Shell title or fallback label.'
42
+ }),
43
+ cols,
44
+ rows,
45
+ mode: TerminalModeSchema,
46
+ running: TerminalRunningSchema
47
+ }, { description: 'Live terminal session.' });
48
+ export const TerminalCapabilitySchema = Type.Object({
49
+ available: Type.Boolean({
50
+ description: 'Terminal access is enabled on this bind.'
51
+ }),
52
+ mode: Nullable(TerminalModeSchema)
53
+ }, { description: 'Server terminal capability.' });
54
+ export const TerminalTokenSchema = Type.Object({ token: Type.String({ description: 'One-use connection token.' }) }, { description: 'WebSocket connection credential.' });
55
+ export const TerminalClientMessageSchema = Type.Union([
56
+ message('create', { requestId, cols, rows }),
57
+ message('subscribe', { terminalId: id }),
58
+ message('snapshot', { terminalId: id }),
59
+ message('input', { terminalId: id, data }),
60
+ message('line', { terminalId: id, data }),
61
+ message('signal', {
62
+ terminalId: id,
63
+ signal: Type.Union([Type.Literal('interrupt'), Type.Literal('eof')], {
64
+ description: 'Limited-mode control action.'
65
+ })
66
+ }),
67
+ message('resize', { terminalId: id, cols, rows }),
68
+ message('close', { terminalId: id, requestId }),
69
+ message('ack', {
70
+ terminalId: id,
71
+ sequence: Type.Integer({
72
+ minimum: 0,
73
+ description: 'Last processed output sequence.'
74
+ })
75
+ }),
76
+ message('ping', {})
77
+ ], { description: 'Validated client terminal protocol.' });
78
+ export const TerminalServerMessageSchema = Type.Union([
79
+ message('list', {
80
+ sessions: Type.Array(TerminalInfoSchema, {
81
+ maxItems: MAX_TERMINAL_SESSIONS,
82
+ description: 'Current server sessions.'
83
+ })
84
+ }),
85
+ message('created', { requestId, terminalId: id }),
86
+ message('snapshot', {
87
+ terminalId: id,
88
+ data: Type.String({ description: 'Serialized screen and parser tail.' }),
89
+ cols,
90
+ rows,
91
+ sequence: Type.Integer({
92
+ minimum: 0,
93
+ description: 'Snapshot output boundary.'
94
+ })
95
+ }),
96
+ message('output', {
97
+ terminalId: id,
98
+ data,
99
+ cols,
100
+ rows,
101
+ sequence: Type.Integer({ minimum: 1, description: 'Output sequence.' })
102
+ }),
103
+ message('title', {
104
+ terminalId: id,
105
+ title: Type.String({ description: 'Updated shell title.' })
106
+ }),
107
+ message('exit', { terminalId: id }),
108
+ message('error', {
109
+ requestId: Type.Optional(requestId),
110
+ code: Type.String({ description: 'Domain error code.' }),
111
+ message: Type.String({ description: 'Operation failure.' })
112
+ }),
113
+ message('pong', {})
114
+ ], { description: 'Server terminal protocol.' });
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,5 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/typescript-Utq2Cl8c.js","assets/typescript-j_1H8WHN.js","assets/javascript-Yelw-5ZN.js","assets/javascript-BzbQS41l.js","assets/vue-CSBlZ1UP.js","assets/css-LbU1hoFO.js","assets/html-BcACZWSP.js","assets/json-B88Oqtu5.js","assets/json-CaljABEy.js","assets/css-CdtkT07m.js","assets/scss-DHtrkMkT.js","assets/html-DDNsd9lV.js","assets/core-C37KF-j0.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/engine-oniguruma-B4iNeJbd.js"])))=>i.map(i=>d[i]);
2
- import{C as e,I as t,N as n,g as r,it as i,l as a,lt as o,nt as s,q as c,s as l,x as u,y as d}from"./runtime-core.esm-bundler-CUpq88z7.js";import{E as f,O as p,_ as m,j as h,t as g}from"./QBtn-BDbJU6_B.js";import{t as _}from"./create-BkZH2Q0U.js";import{nt as v}from"./index-Bn7ByP7x.js";import{n as y}from"./vue-i18n.runtime-D0pkhc7g.js";import{n as b}from"./pinia-DmTi2T44.js";import{c as x,i as S,l as C,o as w,s as T,t as ee}from"./single-flight-r8B7stt1.js";function E(e){if(e.length<2||e[0]!==`"`||e[e.length-1]!==`"`)return e;let t=e.slice(1,-1),n=[];for(let e=0;e<t.length;e++){let r=t[e];r===`\\`&&/^[0-7]{3}$/.test(t.slice(e+1,e+4))?(n.push(parseInt(t.slice(e+1,e+4),8)),e+=3):r===`\\`&&t[e+1]===`"`?(n.push(34),e+=1):r===`\\`&&t[e+1]===`\\`?(n.push(92),e+=1):n.push((r??``).charCodeAt(0))}return new TextDecoder(`utf-8`).decode(new Uint8Array(n))}function D(e){return e.newPath||e.oldPath}function O(e,t){return`${e}:${t}`}function k(e,t){let n=new Map,r=0;function i(e){let t=n.get(e);if(t)return n.delete(e),n.set(e,t),t.value}function a(i,a){o(i);let s=t(a);n.set(i,{value:a,weight:s}),r+=s;for(let[t,i]of n){if(r<=e||n.size<=1)break;n.delete(t),r-=i.weight}}function o(e){let t=n.get(e);t&&(n.delete(e),r-=t.weight)}return{get:i,set:a,remove:o,size:()=>n.size}}var A={typescript:()=>v(()=>import(`./typescript-Utq2Cl8c.js`),__vite__mapDeps([0,1])),tsx:()=>v(()=>import(`./tsx-udAQXfEw.js`),[]),javascript:()=>v(()=>import(`./javascript-Yelw-5ZN.js`),__vite__mapDeps([2,3])),jsx:()=>v(()=>import(`./jsx-Bz0zcwM4.js`),[]),vue:()=>v(()=>import(`./vue-CSBlZ1UP.js`),__vite__mapDeps([4,5,3,6,7,1])),json:()=>v(()=>import(`./json-CaljABEy.js`),__vite__mapDeps([8,7])),markdown:()=>v(()=>import(`./markdown-BYOwaDjH.js`),[]),css:()=>v(()=>import(`./css-CdtkT07m.js`),__vite__mapDeps([9,5])),scss:()=>v(()=>import(`./scss-DHtrkMkT.js`),__vite__mapDeps([10,5])),html:()=>v(()=>import(`./html-DDNsd9lV.js`),__vite__mapDeps([11,6,5,3])),yaml:()=>v(()=>import(`./yaml-rwi0_p6S.js`),[]),bash:()=>v(()=>import(`./bash-CLZ0U2zV.js`),[]),python:()=>v(()=>import(`./python-gzcpVVnB.js`),[]),go:()=>v(()=>import(`./go-rLFTqkRN.js`),[]),rust:()=>v(()=>import(`./rust-Cfkwpbl8.js`),[]),java:()=>v(()=>import(`./java-BXcb2rRD.js`),[]),kotlin:()=>v(()=>import(`./kotlin-DhhofPvG.js`),[])},j={light:()=>v(()=>import(`./github-light-EUqPIrTm.js`),[]),dark:()=>v(()=>import(`./github-dark-C-LZuMrd.js`),[])},te={light:`github-light`,dark:`github-dark`},M=null,N=new Set,P=new Map;function F(e){return A[e]!==void 0}async function ne(e,t){try{await e.loadLanguage(A[t]()),N.add(t)}finally{P.delete(t)}}async function re(e){M||=(async()=>{let[{createHighlighterCore:e},{createOnigurumaEngine:t}]=await Promise.all([v(()=>import(`./core-C37KF-j0.js`),__vite__mapDeps([12,13])),v(()=>import(`./engine-oniguruma-B4iNeJbd.js`),__vite__mapDeps([14,13]))]);return e({themes:[j.light(),j.dark()],langs:[],engine:t(()=>v(()=>import(`./wasm-BnjxR4X6.js`),[]))})})();let t=await M;if(!N.has(e)){let n=P.get(e);n||(n=ne(t,e),P.set(e,n)),await n}return t}async function ie(e,t,n={}){if(!F(e)||t.length===0)return`failed`;let r=n.documents??[{length:t.length,skip:0}];if(r.reduce((e,t)=>e+t.length,0)!==t.length)return`failed`;let{signal:i}=n;try{let a=await re(e),o=0,s=0,c=!0;for(let l of r){let r,u=Math.max(1,n.sliceSize??l.length);for(let d=0;d<l.length;d+=u){if(c||await n.yieldBetween?.(),c=!1,i?.aborted)return`aborted`;let f=Math.min(d+u,l.length),p=a.codeToTokensWithThemes(t.slice(o+d,o+f).join(`
2
+ import{J as e,L as t,P as n,S as r,_ as i,at as a,b as o,ft as s,l as c,s as l,st as u,w as d}from"./runtime-core.esm-bundler-CF89Lyp2.js";import{D as f,O as p,_ as m,j as h,t as g}from"./QBtn-Bgm40omM.js";import{t as _}from"./create-CSUVwdx4.js";import{F as v}from"./index-DuCIKkvf.js";import{n as y}from"./vue-i18n.runtime-BTqPc4vG.js";import{n as b}from"./pinia-ri8AYppz.js";import{d as x,f as S,l as C,o as ee,s as w,u as T}from"./use-server-events-CYiRauy1.js";function E(e){if(e.length<2||e[0]!==`"`||e[e.length-1]!==`"`)return e;let t=e.slice(1,-1),n=[];for(let e=0;e<t.length;e++){let r=t[e];r===`\\`&&/^[0-7]{3}$/.test(t.slice(e+1,e+4))?(n.push(parseInt(t.slice(e+1,e+4),8)),e+=3):r===`\\`&&t[e+1]===`"`?(n.push(34),e+=1):r===`\\`&&t[e+1]===`\\`?(n.push(92),e+=1):n.push((r??``).charCodeAt(0))}return new TextDecoder(`utf-8`).decode(new Uint8Array(n))}function D(e){return e.newPath||e.oldPath}function O(e,t){return`${e}:${t}`}function k(e,t){let n=new Map,r=0;function i(e){let t=n.get(e);if(t)return n.delete(e),n.set(e,t),t.value}function a(i,a){o(i);let s=t(a);n.set(i,{value:a,weight:s}),r+=s;for(let[t,i]of n){if(r<=e||n.size<=1)break;n.delete(t),r-=i.weight}}function o(e){let t=n.get(e);t&&(n.delete(e),r-=t.weight)}return{get:i,set:a,remove:o,size:()=>n.size}}var A={typescript:()=>v(()=>import(`./typescript-Utq2Cl8c.js`),__vite__mapDeps([0,1])),tsx:()=>v(()=>import(`./tsx-udAQXfEw.js`),[]),javascript:()=>v(()=>import(`./javascript-Yelw-5ZN.js`),__vite__mapDeps([2,3])),jsx:()=>v(()=>import(`./jsx-Bz0zcwM4.js`),[]),vue:()=>v(()=>import(`./vue-CSBlZ1UP.js`),__vite__mapDeps([4,5,3,6,7,1])),json:()=>v(()=>import(`./json-CaljABEy.js`),__vite__mapDeps([8,7])),markdown:()=>v(()=>import(`./markdown-BYOwaDjH.js`),[]),css:()=>v(()=>import(`./css-CdtkT07m.js`),__vite__mapDeps([9,5])),scss:()=>v(()=>import(`./scss-DHtrkMkT.js`),__vite__mapDeps([10,5])),html:()=>v(()=>import(`./html-DDNsd9lV.js`),__vite__mapDeps([11,6,5,3])),yaml:()=>v(()=>import(`./yaml-rwi0_p6S.js`),[]),bash:()=>v(()=>import(`./bash-CLZ0U2zV.js`),[]),python:()=>v(()=>import(`./python-gzcpVVnB.js`),[]),go:()=>v(()=>import(`./go-rLFTqkRN.js`),[]),rust:()=>v(()=>import(`./rust-Cfkwpbl8.js`),[]),java:()=>v(()=>import(`./java-BXcb2rRD.js`),[]),kotlin:()=>v(()=>import(`./kotlin-DhhofPvG.js`),[])},j={light:()=>v(()=>import(`./github-light-EUqPIrTm.js`),[]),dark:()=>v(()=>import(`./github-dark-C-LZuMrd.js`),[])},te={light:`github-light`,dark:`github-dark`},M=null,N=new Set,P=new Map;function F(e){return A[e]!==void 0}async function ne(e,t){try{await e.loadLanguage(A[t]()),N.add(t)}finally{P.delete(t)}}async function re(e){M||=(async()=>{let[{createHighlighterCore:e},{createOnigurumaEngine:t}]=await Promise.all([v(()=>import(`./core-C37KF-j0.js`),__vite__mapDeps([12,13])),v(()=>import(`./engine-oniguruma-B4iNeJbd.js`),__vite__mapDeps([14,13]))]);return e({themes:[j.light(),j.dark()],langs:[],engine:t(()=>v(()=>import(`./wasm-BnjxR4X6.js`),[]))})})();let t=await M;if(!N.has(e)){let n=P.get(e);n||(n=ne(t,e),P.set(e,n)),await n}return t}async function ie(e,t,n={}){if(!F(e)||t.length===0)return`failed`;let r=n.documents??[{length:t.length,skip:0}];if(r.reduce((e,t)=>e+t.length,0)!==t.length)return`failed`;let{signal:i}=n;try{let a=await re(e),o=0,s=0,c=!0;for(let l of r){let r,u=Math.max(1,n.sliceSize??l.length);for(let d=0;d<l.length;d+=u){if(c||await n.yieldBetween?.(),c=!1,i?.aborted)return`aborted`;let f=Math.min(d+u,l.length),p=a.codeToTokensWithThemes(t.slice(o+d,o+f).join(`
3
3
  `),{lang:e,themes:te,...r?{grammarState:r}:{}});r=a.getLastGrammarState(p);let m=Math.max(d,l.skip);f<=m||(n.onSlice?.(p.slice(m-d).map(e=>e.map(e=>({content:e.content,colorLight:e.variants.light?.color,colorDark:e.variants.dark?.color}))),s),s+=f-m)}o+=l.length}return`done`}catch{return`failed`}}var I=null,L=!1,ae=1,R=new Map;function z(){return typeof Worker<`u`&&!L}function oe(){let e=new Worker(new URL(`/assets/highlight.worker-BHCdEX06.js`,``+import.meta.url),{type:`module`});return e.addEventListener(`message`,e=>{let t=e.data,n=R.get(t.id);n&&(t.type===`slice`?n.onSlice(t.tokens,t.start):(R.delete(t.id),n.finish(t.ok?`done`:`failed`)))}),e.addEventListener(`error`,t=>{console.error(`The highlight worker failed, the main thread does the work now`,t),L=!0;for(let e of R.values())e.finish(`failed`);R.clear(),e.terminate(),I=null}),e}function B(e,t){e.postMessage(t)}function se(e,t,n){let{signal:r}=n;if(r?.aborted)return Promise.resolve(`aborted`);if(!I)try{I=oe()}catch(e){return console.error(`The highlight worker did not start`,e),L=!0,Promise.resolve(`unsent`)}let i=I;return new Promise(a=>{let o=ae++,s=()=>{R.delete(o)&&(I&&B(I,{type:`cancel`,id:o}),a(`aborted`))};R.set(o,{onSlice:(e,t)=>n.onSlice?.(e,t),finish:e=>{r?.removeEventListener(`abort`,s),a(e)}});try{B(i,{type:`tokenize`,id:o,lang:e,lines:Array.from(t),...n.documents?{documents:n.documents.map(e=>({...e}))}:{},sliceSize:n.sliceSize})}catch(e){console.error(`The highlight worker did not get the request`,e),R.delete(o),a(`unsent`);return}r?.addEventListener(`abort`,s,{once:!0})})}function ce(){return typeof MessageChannel>`u`?new Promise(e=>setTimeout(e,0)):new Promise(e=>{let{port1:t,port2:n}=new MessageChannel;t.addEventListener(`message`,()=>{t.close(),e()},{once:!0}),t.start(),n.postMessage(null)})}var V=`import { ref, type Ref } from 'vue'
4
4
  import * as path from 'node:path'
5
5
  // A comment with a TODO and a URL: https://example.com
@@ -90,4 +90,4 @@ Some *emphasis*, **strong** text, \`inline code\` and a [link](https://example.c
90
90
  const answer: number = 42
91
91
  \`\`\`
92
92
  `,typescript:V,javascript:V,tsx:V,jsx:V};function ue(e){return(le[e]??`x`).split(`
93
- `)}var de=2e4,U=100,fe={ts:`typescript`,tsx:`tsx`,js:`javascript`,jsx:`jsx`,mjs:`javascript`,cjs:`javascript`,vue:`vue`,json:`json`,md:`markdown`,css:`css`,scss:`scss`,html:`html`,yml:`yaml`,yaml:`yaml`,sh:`bash`,py:`python`,go:`go`,rs:`rust`,java:`java`,kt:`kotlin`,kts:`kotlin`};function W(e){let t=e.split(`.`);return t.length<2?`text`:fe[t.pop().toLowerCase()]??`text`}function pe(e){return F(W(e))}function G(e,t,n,r,i){return ie(e,t,{documents:n,sliceSize:U,yieldBetween:ce,signal:r,onSlice:i})}async function K(e,t,n,r,i){let a=[],o=(e,t)=>{a.splice(t,e.length,...e),r?.(a.slice())};if(!z())return q(await G(e,t,i,n,o),a);let s=await se(e,t,{sliceSize:U,documents:i,signal:n,onSlice:o});return(s===`unsent`||s===`failed`&&!z())&&(s=await G(e,t,i,n,o)),q(s,a)}function q(e,t){return e===`done`?t:e===`aborted`?void 0:null}var J=new Set;async function me(e){await K(e,ue(e)).catch(()=>null)===null&&J.delete(e)}function he(e){if(!z())return;let t=new Set(e.map(W).filter(F));for(let e of t)J.has(e)||(J.add(e),me(e))}var Y=k(de,e=>e?.length??1),X=Promise.resolve();function ge(e){let t=X.then(()=>new Promise(e=>setTimeout(e,0))).then(e);return X=t.catch(()=>void 0),t}function _e(e,t,n,r,i,a){return ge(async()=>{let o=Y.get(e);if(o!==void 0)return o;if(r?.aborted)return;let s=n(),c=await K(W(t),s,r,i,a?.());if(c!==void 0)return Y.set(e,c),c})}function ve(e){return Y.get(e)}function Z(e){return{...e,oldPath:E(e.oldPath),newPath:E(e.newPath)}}function ye(e){let{signature:t,...n}=e;return{...n,hunks:[]}}function Q(e,t,n){let r=new Map(e.map(e=>[D(e),e])),i=new Map;return{files:n.map(e=>{let n=D(e);i.set(n,e.signature);let a=r.get(n);return a&&t.get(n)===e.signature?a:ye(e)}),signatures:i}}var be=b(`diff`,()=>{let e=s([]),t=s([]),n=new Map,r=new Map,a=s(!1),o=s(!1),c=s(null),u=l(()=>a.value&&!o.value),d=l(()=>[...e.value,...t.value].map(e=>e.newPath||e.oldPath)),f=i(new Map),p=i(new Map),m=new Map;function h(n){return n===`staged`?e.value:t.value}function g(e,t){return f.value.get(O(e,D(t)))?.file}function _(e,t){return f.value.get(O(e,D(t)))?.for===t}function v(e,t){let n=p.value.get(O(e,D(t)));return n?.for===t?n.message:void 0}function y(e,t){let n=O(e,D(t));if(!p.value.has(n))return;let r=new Map(p.value);r.delete(n),p.value=r}function b(e,t){return y(e,t),x(e,t)}async function x(e,t){let n=O(e,D(t));if(_(e,t)||m.get(n)===t)return;m.set(n,t);let r=new URLSearchParams({path:t.newPath,oldPath:t.oldPath,status:t.status});try{let i=Z(await T(`/api/diff/${e}/file?${r}`));if(!h(e).includes(t))return;f.value=new Map(f.value).set(n,{file:i,for:t}),y(e,t)}catch(r){if(!h(e).includes(t))return;p.value=new Map(p.value).set(n,{message:S(r),for:t})}finally{m.get(n)===t&&m.delete(n)}}function C(){let n=new Set([...e.value.map(e=>O(`staged`,D(e))),...t.value.map(e=>O(`unstaged`,D(e)))]),r=new Map([...f.value].filter(([e])=>n.has(e)));r.size!==f.value.size&&(f.value=r);let i=new Map([...p.value].filter(([e])=>n.has(e)));i.size!==p.value.size&&(p.value=i)}let w=ee(E);async function E(){a.value=!0;try{let[i,a]=await Promise.all([T(`/api/diff/staged/files`),T(`/api/diff/unstaged/files`)]),o=Q(e.value,n,i.map(Z)),s=Q(t.value,r,a.map(Z));e.value=o.files,n=o.signatures,t.value=s.files,r=s.signatures,C(),he([...o.files,...s.files].map(D)),c.value=null}catch(i){o.value||(e.value=[],t.value=[],n=new Map,r=new Map),c.value=S(i)}finally{a.value=!1,o.value=!0}}return{stagedFiles:e,unstagedFiles:t,loading:a,loaded:o,initialLoading:u,error:c,changedPaths:d,hunksOf:g,hunksFresh:_,hunksError:v,clearHunksError:y,ensureHunks:x,retryHunks:b,fetchDiff:w}});function $(e){let{snapshotData:t,...n}=e;return n}var xe=b(`active-review`,()=>{let e=s(null),t=s([]),n=s(!1),r=l(()=>{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 i(){n.value=!0;try{let n=(await T(`/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 T(`/api/reviews/${e.value.id}/comments`):[]}finally{n.value=!1}}function a(n){e.value=$(n),t.value=[]}async function o(t){e.value&&(await x(`/api/reviews/${e.value.id}`,{status:t}),await i())}async function c(n){if(!e.value)throw Error(`No active review`);let r=await C(`/api/reviews/${e.value.id}/comments`,n);return t.value=[...t.value,r],r}async function u(e,n){let r=await x(`/api/comments/${e}`,{content:n});t.value=t.value.map(t=>t.id===e?r:t)}async function d(e){await w(`/api/comments/${e}`),t.value=t.value.filter(t=>t.id!==e)}async function f(e){let n=await x(`/api/comments/${e}/resolve`);t.value=t.value.map(t=>t.id===e?n:t)}async function p(e){let n=await x(`/api/comments/${e}/unresolve`);t.value=t.value.map(t=>t.id===e?n:t)}return{activeReview:e,comments:t,loading:n,commentsByFile:r,refresh:i,setActiveReview:a,setStatus:o,createComment:c,editComment:u,deleteComment:d,resolveComment:f,unresolveComment:p}}),Se=r({__name:`CancelButton`,setup(t){let{t:r}=y();return(t,i)=>(n(),a(g,e({padding:`2px 8px`},t.$attrs,{dense:``,flat:``,color:`warning`,label:o(r)(`reviews.comments.cancel`)}),null,16,[`label`]))}}),Ce=r({__name:`CreateButton`,setup(t){let{t:r}=y();return(t,i)=>(n(),a(g,e({padding:`2px 8px`,label:o(r)(`reviews.create.submit`)},t.$attrs,{unelevated:``,dense:``,color:`accent`}),null,16,[`label`]))}}),we=_({name:`QPage`,props:{padding:Boolean,styleFn:Function},setup(e,{slots:t}){let n=f(),r=u(h,p);if(r===p)return console.error(`QPage needs to be a deep child of QLayout`),p;if(u(`_q_pc_`,p)===p)return console.error(`QPage needs to be child of QPageContainer`),p;let i=l(()=>{let t=(r.header.space?r.header.size:0)+(r.footer.space?r.footer.size:0);if(typeof e.styleFn==`function`){let i=r.isContainer.value?r.containerHeight.value:n.screen.height;return e.styleFn(t,i)}return{minHeight:r.isContainer.value?r.containerHeight.value-t+`px`:n.screen.height===0?t===0?`100vh`:`calc(100vh - ${t}px)`:n.screen.height-t+`px`}}),a=l(()=>`q-page${e.padding?` q-layout-padding`:``}`);return()=>d(`main`,{class:a.value,style:i.value},m(t.default))}}),Te=r({__name:`AppPage`,setup(e){function r(e,t){return{height:`${t-e}px`}}return(e,i)=>(n(),a(we,{"style-fn":r},{default:c(()=>[t(e.$slots,`default`)]),_:3}))}});export{$ as a,pe as c,k as d,O as f,xe as i,_e as l,E as m,Ce as n,be as o,D as p,Se as r,ve as s,Te as t,W as u};
93
+ `)}var de=2e4,U=100,fe={ts:`typescript`,tsx:`tsx`,js:`javascript`,jsx:`jsx`,mjs:`javascript`,cjs:`javascript`,vue:`vue`,json:`json`,md:`markdown`,css:`css`,scss:`scss`,html:`html`,yml:`yaml`,yaml:`yaml`,sh:`bash`,py:`python`,go:`go`,rs:`rust`,java:`java`,kt:`kotlin`,kts:`kotlin`};function W(e){let t=e.split(`.`);return t.length<2?`text`:fe[t.pop().toLowerCase()]??`text`}function pe(e){return F(W(e))}function G(e,t,n,r,i){return ie(e,t,{documents:n,sliceSize:U,yieldBetween:ce,signal:r,onSlice:i})}async function K(e,t,n,r,i){let a=[],o=(e,t)=>{a.splice(t,e.length,...e),r?.(a.slice())};if(!z())return q(await G(e,t,i,n,o),a);let s=await se(e,t,{sliceSize:U,documents:i,signal:n,onSlice:o});return(s===`unsent`||s===`failed`&&!z())&&(s=await G(e,t,i,n,o)),q(s,a)}function q(e,t){return e===`done`?t:e===`aborted`?void 0:null}var J=new Set;async function me(e){await K(e,ue(e)).catch(()=>null)===null&&J.delete(e)}function he(e){if(!z())return;let t=new Set(e.map(W).filter(F));for(let e of t)J.has(e)||(J.add(e),me(e))}var Y=k(de,e=>e?.length??1),X=Promise.resolve();function ge(e){let t=X.then(()=>new Promise(e=>setTimeout(e,0))).then(e);return X=t.catch(()=>void 0),t}function _e(e,t,n,r,i,a){return ge(async()=>{let o=Y.get(e);if(o!==void 0)return o;if(r?.aborted)return;let s=n(),c=await K(W(t),s,r,i,a?.());if(c!==void 0)return Y.set(e,c),c})}function ve(e){return Y.get(e)}function Z(e){return{...e,oldPath:E(e.oldPath),newPath:E(e.newPath)}}function ye(e){let{signature:t,...n}=e;return{...n,hunks:[]}}function Q(e,t,n){let r=new Map(e.map(e=>[D(e),e])),i=new Map;return{files:n.map(e=>{let n=D(e);i.set(n,e.signature);let a=r.get(n);return a&&t.get(n)===e.signature?a:ye(e)}),signatures:i}}var be=b(`diff`,()=>{let e=a([]),t=a([]),n=new Map,r=new Map,i=a(!1),o=a(!1),s=a(null),c=l(()=>i.value&&!o.value),d=l(()=>[...e.value,...t.value].map(e=>e.newPath||e.oldPath)),f=u(new Map),p=u(new Map),m=new Map;function h(n){return n===`staged`?e.value:t.value}function g(e,t){return f.value.get(O(e,D(t)))?.file}function _(e,t){return f.value.get(O(e,D(t)))?.for===t}function v(e,t){let n=p.value.get(O(e,D(t)));return n?.for===t?n.message:void 0}function y(e,t){let n=O(e,D(t));if(!p.value.has(n))return;let r=new Map(p.value);r.delete(n),p.value=r}function b(e,t){return y(e,t),x(e,t)}async function x(e,t){let n=O(e,D(t));if(_(e,t)||m.get(n)===t)return;m.set(n,t);let r=new URLSearchParams({path:t.newPath,oldPath:t.oldPath,status:t.status});try{let i=Z(await T(`/api/diff/${e}/file?${r}`));if(!h(e).includes(t))return;f.value=new Map(f.value).set(n,{file:i,for:t}),y(e,t)}catch(r){if(!h(e).includes(t))return;p.value=new Map(p.value).set(n,{message:w(r),for:t})}finally{m.get(n)===t&&m.delete(n)}}function S(){let n=new Set([...e.value.map(e=>O(`staged`,D(e))),...t.value.map(e=>O(`unstaged`,D(e)))]),r=new Map([...f.value].filter(([e])=>n.has(e)));r.size!==f.value.size&&(f.value=r);let i=new Map([...p.value].filter(([e])=>n.has(e)));i.size!==p.value.size&&(p.value=i)}let C=ee(E);async function E(){i.value=!0;try{let[i,a]=await Promise.all([T(`/api/diff/staged/files`),T(`/api/diff/unstaged/files`)]),o=Q(e.value,n,i.map(Z)),c=Q(t.value,r,a.map(Z));e.value=o.files,n=o.signatures,t.value=c.files,r=c.signatures,S(),he([...o.files,...c.files].map(D)),s.value=null}catch(i){o.value||(e.value=[],t.value=[],n=new Map,r=new Map),s.value=w(i)}finally{i.value=!1,o.value=!0}}return{stagedFiles:e,unstagedFiles:t,loading:i,loaded:o,initialLoading:c,error:s,changedPaths:d,hunksOf:g,hunksFresh:_,hunksError:v,clearHunksError:y,ensureHunks:x,retryHunks:b,fetchDiff:C}});function $(e){let{snapshotData:t,...n}=e;return n}var xe=b(`active-review`,()=>{let e=a(null),t=a([]),n=a(!1),r=l(()=>{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 i(){n.value=!0;try{let n=(await T(`/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 T(`/api/reviews/${e.value.id}/comments`):[]}finally{n.value=!1}}function o(n){e.value=$(n),t.value=[]}async function s(t){e.value&&(await x(`/api/reviews/${e.value.id}`,{status:t}),await i())}async function c(n){if(!e.value)throw Error(`No active review`);let r=await S(`/api/reviews/${e.value.id}/comments`,n);return t.value=[...t.value,r],r}async function u(e,n){let r=await x(`/api/comments/${e}`,{content:n});t.value=t.value.map(t=>t.id===e?r:t)}async function d(e){await C(`/api/comments/${e}`),t.value=t.value.filter(t=>t.id!==e)}async function f(e){let n=await x(`/api/comments/${e}/resolve`);t.value=t.value.map(t=>t.id===e?n:t)}async function p(e){let n=await x(`/api/comments/${e}/unresolve`);t.value=t.value.map(t=>t.id===e?n:t)}return{activeReview:e,comments:t,loading:n,commentsByFile:r,refresh:i,setActiveReview:o,setStatus:s,createComment:c,editComment:u,deleteComment:d,resolveComment:f,unresolveComment:p}}),Se=i({__name:`CancelButton`,setup(e){let{t}=y();return(e,r)=>(n(),c(g,d({padding:`2px 8px`},e.$attrs,{dense:``,flat:``,color:`warning`,label:s(t)(`reviews.comments.cancel`)}),null,16,[`label`]))}}),Ce=i({__name:`CreateButton`,setup(e){let{t}=y();return(e,r)=>(n(),c(g,d({padding:`2px 8px`,label:s(t)(`reviews.create.submit`)},e.$attrs,{unelevated:``,dense:``,color:`accent`}),null,16,[`label`]))}}),we=_({name:`QPage`,props:{padding:Boolean,styleFn:Function},setup(e,{slots:t}){let n=f(),i=r(h,p);if(i===p)return console.error(`QPage needs to be a deep child of QLayout`),p;if(r(`_q_pc_`,p)===p)return console.error(`QPage needs to be child of QPageContainer`),p;let a=l(()=>{let t=(i.header.space?i.header.size:0)+(i.footer.space?i.footer.size:0);if(typeof e.styleFn==`function`){let r=i.isContainer.value?i.containerHeight.value:n.screen.height;return e.styleFn(t,r)}return{minHeight:i.isContainer.value?i.containerHeight.value-t+`px`:n.screen.height===0?t===0?`100vh`:`calc(100vh - ${t}px)`:n.screen.height-t+`px`}}),s=l(()=>`q-page${e.padding?` q-layout-padding`:``}`);return()=>o(`main`,{class:s.value,style:a.value},m(t.default))}}),Te=i({__name:`AppPage`,setup(r){function i(e,t){return{height:`${t-e}px`}}return(r,a)=>(n(),c(we,{"style-fn":i},{default:e(()=>[t(r.$slots,`default`)]),_:3}))}});export{$ as a,pe as c,k as d,O as f,xe as i,_e as l,E as m,Ce as n,be as o,D as p,Se as r,ve as s,Te as t,W as u};
@@ -0,0 +1 @@
1
+ import{C as e,F as t,J as n,K as r,Ot as i,P as a,S as o,U as s,Y as c,_ as l,at as u,b as d,c as f,d as p,ft as m,h,l as g,r as _,s as v,st as y,v as b,w as x}from"./runtime-core.esm-bundler-CF89Lyp2.js";import{D as S,H as C,O as w,_ as T,d as E,h as D,j as O,k,t as A}from"./QBtn-Bgm40omM.js";import{t as j}from"./create-CSUVwdx4.js";import{_ as M,ct as N,f as P,m as F,n as I,ot as L,p as R,q as ee,st as te}from"./index-DuCIKkvf.js";import{n as ne}from"./vue-i18n.runtime-BTqPc4vG.js";import{n as z,r as B}from"./pinia-ri8AYppz.js";import{f as V,s as H,u as U}from"./use-server-events-CYiRauy1.js";import{a as W,o as G,r as K,u as q}from"./QBadge-BY-jTQ8w.js";import{t as J}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{a as Y,i as X,n as Z,o as re,r as ie}from"./AppPage-D_OHhrKS.js";var ae=l({__name:`SearchInput`,props:{modelValue:{},modelModifiers:{}},emits:[`update:modelValue`],setup(e){let t=s(e,`modelValue`);return(e,r)=>(a(),g(I,x({modelValue:t.value,"onUpdate:modelValue":r[0]||=e=>t.value=e},e.$attrs,{dense:``,outlined:``,clearable:``}),{prepend:n(()=>[h(E,{name:`search`,size:`xs`})]),_:1},16,[`modelValue`]))}}),oe=[`top`,`right`,`bottom`,`left`],Q={type:{type:String,default:`a`},outline:Boolean,push:Boolean,flat:Boolean,unelevated:Boolean,color:String,textColor:String,glossy:Boolean,square:Boolean,padding:String,label:{type:[String,Number],default:``},labelPosition:{type:String,default:`right`,validator:e=>oe.includes(e)},externalLabel:Boolean,hideLabel:{type:Boolean},labelClass:[Array,String,Object],labelStyle:[Array,String,Object],disable:Boolean,tabindex:[Number,String]},se=[`label`],ce=Object.keys(Q).filter(e=>!se.includes(e)&&A.props[e]!==void 0);function le(e){let t={};for(let n of ce)t[n]=e[n];return t}function ue(e,t){return{formClass:v(()=>`q-fab--form-${e.square?`square`:`rounded`}`),stacked:v(()=>!e.externalLabel&&[`top`,`bottom`].includes(e.labelPosition)),labelProps:v(()=>{if(e.externalLabel){let n=e.hideLabel===null?!t.value:e.hideLabel;return{action:`push`,data:{class:[e.labelClass,`q-fab__label q-tooltip--style q-fab__label--external q-fab__label--external-${e.labelPosition}`+(n?` q-fab__label--external-hidden`:``)],style:e.labelStyle}}}return{action:[`left`,`top`].includes(e.labelPosition)?`unshift`:`push`,data:{class:[e.labelClass,`q-fab__label q-fab__label--internal q-fab__label--internal-${e.labelPosition}`+(e.hideLabel?` q-fab__label--internal-hidden`:``)],style:e.labelStyle}}})}}var de=[`up`,`right`,`down`,`left`],fe=[`left`,`center`,`right`],pe=180,me=j({name:`QFab`,props:{...Q,...N,icon:String,activeIcon:String,hideIcon:Boolean,hideLabel:{...Q.hideLabel,default:null},direction:{type:String,default:`right`,validator:e=>de.includes(e)},...G,persistent:Boolean,stagger:{type:Number,default:40},verticalActionsAlign:{type:String,default:`center`,validator:e=>fe.includes(e)}},emits:te,setup(e,{slots:n}){let i=y(null),a=u(e.modelValue===!0),o=ee(),s=S(),{formClass:c,stacked:l,labelProps:f}=ue(e,a),p=v(()=>!e.persistent),{show:m,hide:h,toggle:g}=L({showing:a,hideOnRouteChange:p}),_=0,{clearHoverTimer:b,hoverShow:x,hoverHide:C}=W({props:e,canShow:()=>!a.value,show:e=>{_=Date.now(),m(e)},canHide:()=>a.value,hide:h});r(a,b);function w(e){a.value&&Date.now()-_<pe||g(e)}let O=v(()=>({opened:a.value})),j=v(()=>`q-fab z-fab row inline justify-center q-fab--align-${e.verticalActionsAlign} ${c.value}`+(a.value?` q-fab--opened`:` q-fab--closed`)),M=v(()=>`q-fab__actions flex no-wrap inline q-fab__actions--${e.direction} q-fab__actions--${a.value?`opened`:`closed`}`),N=v(()=>e.hover?{onPointerenter:x,onPointerleave:C}:{}),P=v(()=>{let t={id:o.value,style:`--q-fab-stagger: ${e.stagger}ms`};return a.value||(t[`aria-hidden`]=`true`),t}),F=v(()=>`q-fab__icon-holder q-fab__icon-holder--${a.value?`opened`:`closed`}`);function I(t,r){let i=n[t],a=`q-fab__${t} absolute-full`;return i===void 0?d(E,{class:a,name:e[r]||s.iconSet.fab[r]}):d(`div`,{class:a},i(O.value))}function R(){let t=[];return e.hideIcon||t.push(d(`div`,{class:F.value},[I(`icon`,`icon`),I(`active-icon`,`activeIcon`)])),(e.label!==``||n.label!==void 0)&&t[f.value.action](d(`div`,f.value.data,n.label===void 0?[e.label]:n.label(O.value))),D(n.tooltip,t)}return t(k,{showing:a,onChildClick(e){h(e),e?.qAvoidFocus!==!0&&i.value?.$el.focus()}}),()=>d(`div`,{class:j.value,...N.value},[d(A,{ref:i,class:c.value,...le(e),noWrap:!0,stack:l.value,noCaps:!0,fab:!0,"aria-expanded":a.value?`true`:`false`,"aria-controls":o.value,onClick:w},R),d(`div`,{class:M.value,...P.value},T(n.default))])}}),he={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 ge(){let{props:e}=b(),t=S(),n=o(O,w);if(n===w)return console.error(`QPageSticky needs to be child of QLayout`),w;let r=v(()=>{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`}}),i=v(()=>n.header.offset),a=v(()=>n.right.offset),s=v(()=>n.footer.offset),c=v(()=>n.left.offset),l=v(()=>{let n=0,o=0,l=r.value,u=t.lang.rtl?-1:1;l.top&&i.value!==0?o=`${i.value}px`:l.bottom&&s.value!==0&&(o=`${-s.value}px`),l.left&&c.value!==0?n=`${u*c.value}px`:l.right&&a.value!==0&&(n=`${-u*a.value}px`);let d={transform:`translate(${n}, ${o})`};return e.offset&&(d.margin=`${e.offset[1]}px ${e.offset[0]}px`),l.vertical?(c.value!==0&&(d[t.lang.rtl?`right`:`left`]=`${c.value}px`),a.value!==0&&(d[t.lang.rtl?`left`:`right`]=`${a.value}px`)):l.horizontal&&(i.value!==0&&(d.top=`${i.value}px`),s.value!==0&&(d.bottom=`${s.value}px`)),d}),u=v(()=>`q-page-sticky row flex-center fixed-${e.position} q-page-sticky--${e.expand?`expand`:`shrink`}`);function f(t){let n=T(t.default);return d(`div`,{class:u.value,style:l.value},e.expand?n:[d(`div`,n)])}return{$layout:n,getStickyContent:f}}var _e=j({name:`QPageSticky`,props:he,setup(e,{slots:t}){let{getStickyContent:n}=ge();return()=>n(t)}});function ve(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(`reviews`,()=>{let e=u([]),t=u(!1),n=u(null);async function r(r={}){t.value=!0,n.value=null;try{e.value=await U(`/api/reviews${ve(r)}`)}catch(t){e.value=[],n.value=H(t)}finally{t.value=!1}}async function i(t){let n=await V(`/api/reviews`,t);return e.value=[Y(n),...e.value],n}return{reviews:e,loading:t,error:n,fetchReviews:r,createReview:i}}),ye={class:`text-h6`},be=J(l({__name:`ReviewCreateDialog`,props:{modelValue:{type:Boolean,required:!0},modelModifiers:{}},emits:e([`created`,`hide`],[`update:modelValue`]),setup(e,{emit:t}){let r=s(e,`modelValue`),o=t,{t:l}=ne(),d=$(),p=u(``),_=u(!1),v=u(null);function y(){p.value=``,_.value=!1,v.value=null}async function b(){_.value=!0,v.value=null;try{let e=p.value.trim(),t=await d.createReview(e?{name:e}:{});r.value=!1,y(),o(`created`,t)}catch(e){v.value=H(e)}finally{_.value=!1}}function x(){y(),o(`hide`)}return(e,t)=>(a(),g(M,{modelValue:r.value,"onUpdate:modelValue":t[1]||=e=>r.value=e,onHide:x},{default:n(()=>[h(F,{class:`review-create-dialog`},{default:n(()=>[h(R,null,{default:n(()=>[f(`div`,ye,i(m(l)(`reviews.create.title`)),1)]),_:1}),h(R,{class:`q-gutter-y-md`},{default:n(()=>[h(I,{modelValue:p.value,"onUpdate:modelValue":t[0]||=e=>p.value=e,dense:``,outlined:``,label:m(l)(`reviews.create.nameLabel`),hint:m(l)(`reviews.create.nameHint`),error:!!v.value,"error-message":v.value??void 0,onKeyup:C(b,[`enter`])},null,8,[`modelValue`,`label`,`hint`,`error`,`error-message`])]),_:1}),h(P,{align:`right`},{default:n(()=>[c(h(ie,null,null,512),[[K]]),h(Z,{loading:_.value,onClick:b},null,8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]))}}),[[`__scopeId`,`data-v-095646d6`]]),xe=l({__name:`CreateReviewFabButton`,emits:[`created`],setup(e,{emit:t}){let r=t,i=X(),o=re(),{activeReview:s}=B(i),{changedPaths:l}=B(o),d=u(!1),f=u(!1),m=u([18,18]),g=u(!1),y=v(()=>l.value.length===0||s.value!==null);function b(e){g.value=e.isFirst!==!0&&e.isFinal!==!0,m.value=[m.value[0]-(e.delta?.x??0),m.value[1]-(e.delta?.y??0)]}function x(e){i.setActiveReview(e),r(`created`,e)}return(e,t)=>(a(),p(_,null,[h(_e,{position:`bottom-right`,offset:m.value},{default:n(()=>[c(h(me,{modelValue:f.value,"onUpdate:modelValue":t[0]||=e=>f.value=e,icon:`add`,color:`accent`,disable:y.value||g.value,onClick:t[1]||=e=>d.value=!0},null,8,[`modelValue`,`disable`]),[[q,b,void 0,{prevent:!0,mouse:!0}]])]),_:1},8,[`offset`]),h(be,{modelValue:d.value,"onUpdate:modelValue":t[2]||=e=>d.value=e,onCreated:x,onHide:t[3]||=e=>f.value=!1},null,8,[`modelValue`])],64))}});export{$ as n,ae as r,xe as t};
@@ -0,0 +1 @@
1
+ import{P as e,c as t,d as n,h as r}from"./runtime-core.esm-bundler-CF89Lyp2.js";import{t as i}from"./QBtn-Bgm40omM.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(),n(`div`,s,[t(`div`,null,[o[0]||=t(`div`,{style:{"font-size":`30vh`}},`404`,-1),o[1]||=t(`div`,{class:`text-h2`,style:{opacity:`0.4`}},`Oops. Nothing here...`,-1),r(i,{class:`q-mt-xl`,color:`white`,"text-color":`blue`,unelevated:``,to:`/`,label:`Go Home`,"no-caps":``})])])}var l=a(o,[[`render`,c]]);export{l as default};
@@ -0,0 +1 @@
1
+ import{C as e,Dt as t,Et as n,F as r,I as i,J as a,K as o,L as s,M as c,Ot as l,P as u,R as d,T as f,U as p,Y as m,_ as h,at as g,b as _,c as v,d as y,ft as b,h as x,j as S,l as C,m as w,r as T,s as E,st as D,tt as O,u as k}from"./runtime-core.esm-bundler-CF89Lyp2.js";import{D as A,U as j,_ as M,d as N,h as P,o as F,s as I,t as L}from"./QBtn-Bgm40omM.js";import{u as ee}from"./event-rR76ioXz.js";import{t as te}from"./create-CSUVwdx4.js";import{d as R,g as ne,h as re,q as ie,t as ae}from"./index-DuCIKkvf.js";import{i as z,n as oe,t as B}from"./QSpace-BVBU-0oC.js";import{n as V}from"./vue-i18n.runtime-BTqPc4vG.js";import{n as se,r as H}from"./pinia-ri8AYppz.js";import{f as ce,n as U,o as le,s as ue,u as de}from"./use-server-events-CYiRauy1.js";import{t as fe}from"./safe-storage-BpHrcFXl.js";import{t as pe}from"./agent-store-DIma0R4U.js";import{c as W,l as G,n as K,t as me,u as he}from"./QBadge-BY-jTQ8w.js";import{t as q}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{a as ge,i as _e,n as ve,o as ye,t as be}from"./use-panel-width-DNg6NE2M.js";import{r as xe}from"./use-virtual-scroll-DTEGubei.js";import{f as Se,i as J,m as Ce,o as Y,p as X,t as we}from"./AppPage-D_OHhrKS.js";import{a as Te,c as Ee,d as De,f as Oe,i as ke,l as Ae,m as je,n as Me,o as Ne,p as Pe,r as Fe,s as Ie,t as Le,u as Re}from"./StatusSwitcher-BZ4FYVnY.js";import{r as ze,t as Be}from"./CreateReviewFabButton-B737aIvn.js";function Ve(e){return e.toSorted((e,t)=>e.type===t.type?e.name.localeCompare(t.name):e.type===`directory`?-1:1).map(e=>({...e,children:e.children?Ve(e.children):void 0}))}function He(e,t){let n=[];for(let r of e){let e=r.split(`/`),i=n;for(let n=0;n<e.length;n++){let a=e[n];if(!a)continue;let o=n===e.length-1,s=e.slice(0,n+1).join(`/`),c=i.find(e=>e.name===a);c||(c={name:a,path:s,type:o?`file`:`directory`,isChanged:o?t.has(r):!1,children:o?void 0:[]},i.push(c)),!o&&c.children&&(i=c.children)}}return Ve(n)}function Ue(e,t){if(!t.trim())return e;let n=t.toLowerCase(),r=e=>{if(e.type===`file`)return e.path.toLowerCase().includes(n)?e:null;let t=e.children?.map(r).filter(e=>e!==null);return t&&t.length>0?{...e,children:t}:e.name.toLowerCase().includes(n)?e:null};return e.map(r).filter(e=>e!==null)}function We(){let e=g([]),t=g(!1),n=g(!1),r=g(null),i=E(()=>!n.value),a=0;async function o(i,o=[]){let s=++a;t.value=!0;try{let t=await de(`/api/git/tree/${encodeURIComponent(i)}`);if(s!==a)return;e.value=He(t.files.map(Ce),new Set(o)),r.value=null}catch(e){if(s!==a)return;r.value=ue(e)}finally{s===a&&(t.value=!1,n.value=!0)}}function s(){++a,e.value=[],t.value=!1,n.value=!1,r.value=null}return{tree:e,loading:t,initialLoading:i,error:r,fetchTree:o,reset:s}}function Ge(e){return e.type===`file`?e.isChanged:e.children?.some(Ge)??!1}var Z=se(`file-explorer`,()=>{let e=Y(),{tree:t,initialLoading:n,error:r,fetchTree:i,reset:a}=We(),{lines:s,isBinary:c,loading:l,error:u,fetchContent:d,reset:f}=Pe(),p=g(`unstaged`),m=g(!1),h=g(``),_=g(null),v=g(new Set),y=g(new Set),b=g(null),x=g(0),S=E(()=>p.value===`staged`?e.stagedFiles:e.unstagedFiles),C=E(()=>{let e=(h.value??``).trim().toLowerCase();return e?S.value.filter(t=>X(t).toLowerCase().includes(e)):S.value}),w=E(()=>Ue(t.value,h.value??``)),T=E(()=>{let e=0,n=t=>{for(let r of t)r.type===`file`?e++:r.children&&n(r.children)};return n(t.value),e});o(t,e=>{let t=new Set,n=e=>{for(let r of e)r.type===`directory`&&r.children&&(Ge(r)&&t.add(r.path),n(r.children))};n(e),v.value=t},{immediate:!0}),o(p,()=>{_.value=null,y.value=new Set,b.value=null,x.value++}),o(_,e=>{if(m.value){if(!e){f();return}d(e,`WORKTREE`)}});function D(e){let t=new Set(v.value);t.has(e)?t.delete(e):t.add(e),v.value=t}function O(e){let t=new Set(y.value);t.has(e)?t.delete(e):t.add(e),y.value=t}function k(e){_.value=e,O(e)}function A(e){_.value=e,y.value.has(e)||(y.value=new Set(y.value).add(e))}function j(){y.value=new Set(S.value.map(X)),x.value++}function M(){y.value=new Set,x.value++}function N(e){if(_.value=e,m.value)return;y.value.has(e)||(y.value=new Set(y.value).add(e));let t=S.value.findIndex(t=>X(t)===e);t<0||(b.value={path:e,index:t,seq:(b.value?.seq??0)+1})}let P=0,F=g(!1),I=le(async()=>{F.value=!0;try{await e.fetchDiff(),m.value&&(await i(`WORKTREE`,e.changedPaths),_.value&&await d(_.value,`WORKTREE`))}finally{F.value=!1}});o(m,e=>{h.value=``,_.value=null,e?I():(a(),f())});async function L(){P=Date.now(),await I()}async function ee(){Date.now()-P<400||await I()}return{source:p,browseMode:m,filter:h,selectedPath:_,expandedFolders:v,expandedFiles:y,scrollRequest:b,layoutVersion:x,tree:t,treeInitialLoading:n,treeError:r,refreshing:F,browseFileLines:s,browseFileIsBinary:c,browseFileLoading:l,browseFileError:u,diffFiles:S,filteredDiffFiles:C,filteredTree:w,totalTreeFiles:T,toggleFolder:D,toggleFileCard:O,handleCardToggle:k,expandFile:A,expandAllFiles:j,collapseAllFiles:M,selectFile:N,refresh:L,refreshFromServerEvent:ee}}),Ke=te({name:`QSplitter`,props:{...ne,modelValue:{type:Number,required:!0},reverse:Boolean,unit:{type:String,default:`%`,validator:e=>[`%`,`px`].includes(e)},limits:{type:Array,validator:e=>e.length!==2||typeof e[0]!=`number`||typeof e[1]!=`number`?!1:e[0]>=0&&e[0]<=e[1]},emitImmediately:Boolean,horizontal:Boolean,disable:Boolean,beforeClass:[Array,String,Object],afterClass:[Array,String,Object],separatorClass:[Array,String,Object],separatorStyle:[Array,String,Object],separatorAriaLabel:String},emits:[`update:modelValue`],setup(e,{slots:t,emit:n}){let r=A(),i=re(e,r),a=D(null),s={before:D(null),after:D(null)},c=ie(),l=E(()=>`q-splitter no-wrap ${e.horizontal?`q-splitter--horizontal column`:`q-splitter--vertical row`} q-splitter--${e.disable?`disabled`:`workable`}`+(i()?` q-splitter--dark`:``)),u=E(()=>e.horizontal?`height`:`width`),d=E(()=>e.reverse?`after`:`before`),p=E(()=>e.limits===void 0?e.unit===`%`?[10,90]:[50,1/0]:e.limits);function h(t){return(e.unit===`%`?t:Math.round(t))+e.unit}let g=E(()=>({[d.value]:{[u.value]:h(e.modelValue)}})),v,y,b,x,S;function C(t){if(t.isFirst){let t=a.value.getBoundingClientRect()[u.value];v=e.horizontal?`up`:`left`,y=e.unit===`%`?100:t,b=Math.min(y,p.value[1],Math.max(p.value[0],e.modelValue)),x=(e.reverse?-1:1)*(e.horizontal?1:r.lang.rtl?-1:1)*(e.unit===`%`?t===0?0:100/t:1),a.value.classList.add(`q-splitter--active`);return}if(t.isFinal){S!==e.modelValue&&n(`update:modelValue`,S),a.value.classList.remove(`q-splitter--active`);return}let i=b+x*(t.direction===v?-1:1)*t.distance[e.horizontal?`y`:`x`];S=Math.min(y,p.value[1],Math.max(p.value[0],i)),s[d.value].value.style[u.value]=h(S),e.emitImmediately&&e.modelValue!==S&&n(`update:modelValue`,S)}let w=E(()=>[[he,e.disable?void 0:C,void 0,{[e.horizontal?`vertical`:`horizontal`]:!0,prevent:!0,stop:!0,mouse:!0,mouseAllDir:!0}]]),T=E(()=>{let t={role:`separator`,"aria-orientation":e.horizontal?`horizontal`:`vertical`,"aria-label":e.separatorAriaLabel||r.lang.label.resize};if(e.disable)t[`aria-disabled`]=`true`;else{let n=p.value;t.tabindex=0,t[`aria-controls`]=c.value,t[`aria-valuemin`]=n[0],n[1]!==1/0&&(t[`aria-valuemax`]=n[1]),t[`aria-valuenow`]=Math.round(e.modelValue*100)/100}return t}),O=null;function k(t){let{keyCode:i}=t,o=e.horizontal?[38,40]:[37,39];if(i!==13&&i!==36&&i!==35&&!o.includes(i))return;ee(t);let s=p.value,c=e.unit===`%`?100:a.value.getBoundingClientRect()[u.value],l;if(i===13)e.modelValue===s[0]?l=O===null?e.modelValue:O:(O=e.modelValue,l=s[0]);else if(i===36)l=s[0];else if(i===35)l=s[1];else{let t=(i===o[0]?-1:1)*(e.reverse?-1:1)*(e.horizontal?1:r.lang.rtl?-1:1);l=e.modelValue+t*(e.unit===`%`?1:10)}let d=Math.min(c,s[1],Math.max(s[0],l));d!==e.modelValue&&n(`update:modelValue`,d)}function j(e,t){e<t[0]?n(`update:modelValue`,t[0]):e>t[1]&&n(`update:modelValue`,t[1])}return o(()=>e.modelValue,e=>{j(e,p.value)}),o(()=>e.limits,()=>{f(()=>{j(e.modelValue,p.value)})}),()=>{let n=[_(`div`,{ref:s.before,id:d.value===`before`?c.value:void 0,class:[`q-splitter__panel q-splitter__before`+(e.reverse?` col`:``),e.beforeClass],style:g.value.before},M(t.before)),_(`div`,{class:[`q-splitter__separator`,e.separatorClass],style:e.separatorStyle,...T.value,onKeydown:e.disable?void 0:k},[m(_(`div`,{class:`q-splitter__separator-area absolute-full`},M(t.separator)),w.value)]),_(`div`,{ref:s.after,id:d.value===`after`?c.value:void 0,class:[`q-splitter__panel q-splitter__after`+(e.reverse?``:` col`),e.afterClass],style:g.value.after},M(t.after))];return _(`div`,{class:l.value,ref:a},P(t.default,n))}}}),qe=`githuman.fileListWidth`,Je=260,Q=220,$=600,Ye=q(h({__name:`PanelResize`,setup(e){let t=g(ve(qe,Q,$)??Je),n=E(()=>[Q,$]);function r(e){typeof e==`number`&&Number.isFinite(e)&&(t.value=be(e,Q,$),fe.set(qe,String(t.value)))}return(e,i)=>(u(),C(Ke,{"model-value":t.value,limits:n.value,unit:`px`,class:`file-explorer`,"before-class":`file-explorer__panel`,"after-class":`file-explorer__content`,"onUpdate:modelValue":r},{before:a(()=>[s(e.$slots,`panel`,{},void 0,!0)]),after:a(()=>[s(e.$slots,`content`,{},void 0,!0)]),_:3},8,[`model-value`,`limits`]))}}),[[`__scopeId`,`data-v-65488178`]]),Xe={class:`row items-center no-wrap q-gutter-x-xs`},Ze={class:`row items-center no-wrap q-gutter-x-xs`},Qe=h({__name:`FileExplorerTabs`,props:e({stagedFilesLength:{},unstagedFilesLength:{}},{modelValue:{default:`unstaged`},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=p(e,`modelValue`),{t:n}=V();return(r,i)=>(u(),C(ge,{modelValue:t.value,"onUpdate:modelValue":i[0]||=e=>t.value=e,dense:``,"no-caps":``,align:`left`,"narrow-indicator":``,class:`text-primary q-mb-sm`},{default:a(()=>[x(ye,{name:`unstaged`},{default:a(()=>[v(`div`,Xe,[v(`span`,null,l(b(n)(`changes.unstaged`)),1),x(me,{color:`warning`,rounded:``},{default:a(()=>[w(l(e.unstagedFilesLength),1)]),_:1})])]),_:1}),x(ye,{name:`staged`},{default:a(()=>[v(`div`,Ze,[v(`span`,null,l(b(n)(`changes.staged`)),1),x(me,{color:`positive`,rounded:``},{default:a(()=>[w(l(e.stagedFilesLength),1)]),_:1})])]),_:1})]),_:1},8,[`modelValue`]))}}),$e={class:`file-tree-node`},et={class:`row items-center no-wrap q-gutter-x-xs`},tt=[`data-tooltip`],nt=[`data-tooltip`],rt={key:2},it=q(h({__name:`FileTreeNode`,props:{node:{},selectedPath:{},expandedFolders:{},level:{}},emits:[`toggle-folder`,`file-select`],setup(e,{emit:r}){let o=e,s=r,c=8+o.level*12;return(r,o)=>{let f=d(`FileTreeNode`,!0);return u(),y(`div`,$e,[e.node.type===`directory`?m((u(),C(W,{key:0,clickable:``,dense:``,style:t({paddingLeft:`${c}px`}),onClick:o[0]||=t=>s(`toggle-folder`,e.node.path)},{default:a(()=>[x(G,{avatar:``,class:`file-tree-node__icon-section`},{default:a(()=>[v(`div`,et,[x(N,{name:`chevron_right`,size:`xs`,class:n([`file-tree-node__chevron`,{"file-tree-node__chevron--expanded":e.expandedFolders.has(e.node.path)}])},null,8,[`class`]),x(N,{name:e.expandedFolders.has(e.node.path)?`folder_open`:`folder`,size:`xs`,color:`warning`},null,8,[`name`])])]),_:1}),x(G,{class:`text-mono`},{default:a(()=>[v(`div`,{class:`ellipsis file-tree-node__label`,"data-tooltip":e.node.path},l(e.node.name),9,tt)]),_:1}),e.node.children?(u(),C(G,{key:0,side:``,class:`text-caption text-grey-6`},{default:a(()=>[w(l(e.node.children.length),1)]),_:1})):k(``,!0)]),_:1},8,[`style`])),[[F]]):m((u(),C(W,{key:1,clickable:``,dense:``,active:e.node.path===e.selectedPath,"active-class":`file-tree-node--selected`,style:t({paddingLeft:`${c+20}px`}),onClick:o[1]||=t=>s(`file-select`,e.node.path)},{default:a(()=>[x(G,{avatar:``,class:`file-tree-node__icon-section`},{default:a(()=>[x(N,{name:`insert_drive_file`,size:`xs`,color:`grey-6`})]),_:1}),x(G,{class:`text-mono`},{default:a(()=>[v(`div`,{class:`ellipsis file-tree-node__label`,"data-tooltip":e.node.path},l(e.node.name),9,nt)]),_:1}),e.node.isChanged?(u(),C(G,{key:0,side:``},{default:a(()=>[x(N,{name:`fiber_manual_record`,size:`8px`,color:`warning`})]),_:1})):k(``,!0)]),_:1},8,[`active`,`style`])),[[F]]),e.node.type===`directory`&&e.expandedFolders.has(e.node.path)&&e.node.children?(u(),y(`div`,rt,[(u(!0),y(T,null,i(e.node.children,t=>(u(),C(f,{key:t.path,node:t,"selected-path":e.selectedPath,"expanded-folders":e.expandedFolders,level:e.level+1,onToggleFolder:o[2]||=e=>s(`toggle-folder`,e),onFileSelect:o[3]||=e=>s(`file-select`,e)},null,8,[`node`,`selected-path`,`expanded-folders`,`level`]))),128))])):k(``,!0)])}}}),[[`__scopeId`,`data-v-6d719ee2`]]);function at(){let e=A(),{t}=V(),n=z(),r=Z(),i=J();async function a(e,i,a){try{await ce(i,{paths:[e]}),await r.refresh()}catch(e){n(t(a),e)}}function o(n){let r=(i.commentsByFile.get(n)??[]).filter(e=>!e.resolved).length;if(r===0)return a(n,`/api/git/stage`,`changes.actions.stageError`);e.dialog({title:t(`changes.actions.stageUnresolvedTitle`),message:t(`changes.actions.stageUnresolvedMessage`,{path:n,count:r}),persistent:!0,ok:{label:t(`changes.actions.stageUnresolvedOk`),flat:!0},cancel:{label:t(`changes.actions.discardConfirmCancel`),flat:!0}}).onOk(()=>{a(n,`/api/git/stage`,`changes.actions.stageError`)})}function s(e){return a(e,`/api/git/unstage`,`changes.actions.unstageError`)}function c(n){e.dialog({title:t(`changes.actions.discardConfirmTitle`),message:t(`changes.actions.discardConfirmMessage`,{path:n}),persistent:!0,ok:{label:t(`changes.actions.discardConfirmOk`),color:`negative`,flat:!0},cancel:{label:t(`changes.actions.discardConfirmCancel`),flat:!0}}).onOk(()=>{a(n,`/api/git/discard`,`changes.actions.discardError`)})}return{stage:o,unstage:s,discard:c}}var ot={class:`file-list-item__path-row row no-wrap items-center`},st=[`data-tooltip`],ct={class:`text-caption`},lt={class:`text-positive`},ut={class:`text-negative q-ml-xs`},dt=q(h({__name:`FileListItem`,props:{file:{},selected:{type:Boolean},source:{}},emits:[`click`],setup(e){let t={added:`A`,modified:`M`,deleted:`D`,renamed:`R`},r={added:`positive`,modified:`warning`,deleted:`negative`,renamed:`purple`},i=e,{t:o}=V(),{stage:s,unstage:c,discard:d}=at(),f=J(),p=E(()=>X(i.file)),h=E(()=>f.commentsByFile.get(p.value)?.length??0);return(i,f)=>m((u(),C(W,{clickable:``,dense:``,class:`file-list-item`,active:e.selected,"active-class":`file-list-item--selected`,onClick:f[3]||=e=>i.$emit(`click`)},{default:a(()=>[x(G,{avatar:``,class:`file-list-item__icon-section`},{default:a(()=>[v(`span`,{class:n([`text-caption text-weight-bold text-mono`,`text-${r[e.file.status]}`])},l(t[e.file.status]),3)]),_:1}),x(G,{class:`text-mono`},{default:a(()=>[v(`div`,ot,[v(`span`,{class:`ellipsis file-list-item__path-label`,"data-tooltip":p.value},l(p.value),9,st),h.value>0?(u(),C(Oe,{key:0,compact:``,class:`file-list-item__badge`,count:h.value},null,8,[`count`])):k(``,!0)])]),_:1}),x(G,{side:``,class:`file-list-item__stats`},{default:a(()=>[v(`span`,ct,[v(`span`,lt,`+`+l(e.file.additions),1),v(`span`,ut,`-`+l(e.file.deletions),1)])]),_:1}),x(G,{side:``,class:`file-list-item__actions`},{default:a(()=>[e.source===`unstaged`?(u(),y(T,{key:0},[m(x(L,{flat:``,dense:``,round:``,size:`sm`,icon:`undo`,"aria-label":b(o)(`changes.actions.discard`),"data-tooltip":b(o)(`changes.actions.discard`),onClick:f[0]||=j(e=>b(d)(p.value),[`stop`])},null,8,[`aria-label`,`data-tooltip`]),[[F]]),m(x(L,{flat:``,dense:``,round:``,size:`sm`,icon:`add`,"aria-label":b(o)(`changes.actions.stage`),"data-tooltip":b(o)(`changes.actions.stage`),onClick:f[1]||=j(e=>b(s)(p.value),[`stop`])},null,8,[`aria-label`,`data-tooltip`]),[[F]])],64)):m((u(),C(L,{key:1,flat:``,dense:``,round:``,size:`sm`,icon:`remove`,"aria-label":b(o)(`changes.actions.unstage`),"data-tooltip":b(o)(`changes.actions.unstage`),onClick:f[2]||=j(e=>b(c)(p.value),[`stop`])},null,8,[`aria-label`,`data-tooltip`])),[[F]])]),_:1})]),_:1},8,[`active`])),[[F]])}}),[[`__scopeId`,`data-v-4d2d079f`]]),ft=h({__name:`BrowseModeToggle`,props:{modelValue:{type:Boolean,default:!1},modelModifiers:{}},emits:[`update:modelValue`],setup(e){let t=p(e,`modelValue`),{t:n}=V();return(e,r)=>(u(),C(W,null,{default:a(()=>[x(G,null,{default:a(()=>[x(xe,null,{default:a(()=>[w(l(b(n)(`browse.toggle`)),1)]),_:1})]),_:1}),x(G,{side:``},{default:a(()=>[x(ae,{modelValue:t.value,"onUpdate:modelValue":r[0]||=e=>t.value=e,dense:``,size:`xs`},null,8,[`modelValue`])]),_:1})]),_:1}))}}),pt={class:`file-list-panel__header q-pa-sm`},mt={key:1,class:`text-subtitle2 q-mb-sm`},ht={key:0,class:`text-primary`},gt={key:0,class:`row justify-center q-pa-lg`},_t={key:0,class:`text-caption text-grey-6 q-px-md q-py-sm`},vt={key:0,class:`text-caption text-grey-6 q-px-md q-py-sm`},yt=32,bt=q(h({__name:`FileListPanel`,setup(e){let{t}=V(),{stagedFiles:n,unstagedFiles:r,initialLoading:o,error:s}=H(Y()),c=Z(),{source:d,browseMode:f,filter:p,selectedPath:m,expandedFolders:h,treeInitialLoading:_,treeError:S,filteredDiffFiles:D,filteredTree:A,totalTreeFiles:j}=H(c),M=g(null),N=E(()=>M.value?.getScrollTarget()??null);return(e,g)=>(u(),y(T,null,[v(`div`,pt,[b(f)?(u(),y(`div`,mt,[w(l(b(t)(`browse.allFiles`))+` `,1),b(j)>0||!b(S)?(u(),y(`span`,ht,`(`+l(b(j))+`)`,1)):k(``,!0)])):(u(),C(Qe,{key:0,modelValue:b(d),"onUpdate:modelValue":g[0]||=e=>O(d)?d.value=e:null,"staged-files-length":b(n).length,"unstaged-files-length":b(r).length},null,8,[`modelValue`,`staged-files-length`,`unstaged-files-length`])),x(ze,{modelValue:b(p),"onUpdate:modelValue":g[1]||=e=>O(p)?p.value=e:null,placeholder:b(f)?b(t)(`browse.searchPlaceholder`):b(t)(`changes.filterPlaceholder`)},null,8,[`modelValue`,`placeholder`])]),x(R),x(K,{ref_key:`scrollArea`,ref:M,class:`col file-list-panel__scroll`,"content-style":`padding: 4px 0`,"content-active-style":`padding: 4px 0`},{default:a(()=>[(b(f)?b(_):b(o))?(u(),y(`div`,gt,[x(I,{color:`primary`,size:`2em`})])):b(f)?(u(),y(T,{key:1},[b(A).length===0&&(!b(S)||b(p)&&b(j)>0)?(u(),y(`p`,_t,l(b(p)?b(t)(`browse.noMatchingFiles`):b(t)(`browse.noFiles`)),1)):k(``,!0),(u(!0),y(T,null,i(b(A),e=>(u(),C(it,{key:e.path,node:e,"selected-path":b(m),"expanded-folders":b(h),level:0,onToggleFolder:b(c).toggleFolder,onFileSelect:b(c).selectFile},null,8,[`node`,`selected-path`,`expanded-folders`,`onToggleFolder`,`onFileSelect`]))),128))],64)):(u(),y(T,{key:2},[b(D).length===0&&(b(p)||!b(s))?(u(),y(`p`,vt,l(b(p)?b(t)(`browse.noMatchingFiles`):b(t)(`changes.emptyFileList`)),1)):k(``,!0),N.value?(u(),C(_e,{key:b(d),"scroll-target":N.value,items:b(D),"virtual-scroll-item-size":yt},{default:a(({item:e})=>[(u(),C(dt,{key:b(X)(e),file:e,selected:b(m)===b(X)(e),source:b(d),onClick:t=>b(c).selectFile(b(X)(e))},null,8,[`file`,`selected`,`source`,`onClick`]))]),_:1},8,[`scroll-target`,`items`])):k(``,!0)],64))]),_:1},512),x(R),x(ft,{modelValue:b(f),"onUpdate:modelValue":g[2]||=e=>O(f)?f.value=e:null},null,8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-6daa93e0`]]),xt={class:`diff-status-bar row items-center q-gutter-x-md q-pa-sm text-body2`},St={class:`text-weight-medium`},Ct={class:`text-positive`},wt={class:`text-negative`},Tt={key:0,class:`text-grey-6`},Et={key:1,class:`text-grey-6`},Dt={key:2,class:`text-grey-6`},Ot={key:3,class:`text-grey-6`},kt=h({__name:`DiffStatusBar`,props:{files:{}},emits:[`expand-all`,`collapse-all`],setup(e,{emit:t}){let n=e,r=t,{t:i}=V(),a=E(()=>{let e=n.files.reduce((e,t)=>e+t.additions,0),t=n.files.reduce((e,t)=>e+t.deletions,0),r=n.files.filter(e=>e.status===`added`).length,i=n.files.filter(e=>e.status===`modified`).length,a=n.files.filter(e=>e.status===`deleted`).length,o=n.files.filter(e=>e.status===`renamed`).length;return{total:n.files.length,additions:e,deletions:t,added:r,modified:i,deleted:a,renamed:o}});return(e,t)=>(u(),y(`div`,xt,[v(`span`,St,l(b(i)(`changes.filesChanged`,{count:a.value.total})),1),v(`span`,Ct,` +`+l(a.value.additions)+` `+l(b(i)(`changes.additions`)),1),v(`span`,wt,` -`+l(a.value.deletions)+` `+l(b(i)(`changes.deletions`)),1),a.value.added?(u(),y(`span`,Tt,l(a.value.added)+` `+l(b(i)(`changes.added`)),1)):k(``,!0),a.value.modified?(u(),y(`span`,Et,l(a.value.modified)+` `+l(b(i)(`changes.modified`)),1)):k(``,!0),a.value.deleted?(u(),y(`span`,Dt,l(a.value.deleted)+` `+l(b(i)(`changes.deletedPlural`)),1)):k(``,!0),a.value.renamed?(u(),y(`span`,Ot,l(a.value.renamed)+` `+l(b(i)(`changes.renamed`)),1)):k(``,!0),x(B),x(L,{dense:``,flat:``,"no-caps":``,size:`sm`,icon:`unfold_more`,label:b(i)(`changes.expandAll`),onClick:t[0]||=e=>r(`expand-all`)},null,8,[`label`]),x(L,{dense:``,flat:``,"no-caps":``,size:`sm`,icon:`unfold_less`,label:b(i)(`changes.collapseAll`),onClick:t[1]||=e=>r(`collapse-all`)},null,8,[`label`])]))}}),At=h({__name:`ChangesFileCard`,props:{file:{}},setup(e){let t=e,n=Z(),r=Y(),i=J(),{expandedFiles:a}=H(n),{activeReview:o,commentsByFile:s}=H(i),c=E(()=>X(t.file)),l=E(()=>Se(n.source,c.value)),d=E(()=>r.hunksOf(n.source,t.file)),f=E(()=>r.hunksFresh(n.source,t.file)),p=E(()=>r.hunksError(n.source,t.file)),m=E(()=>a.value.has(c.value)),h=E(()=>s.value.get(c.value)),g=E(()=>!!o.value);function _(){r.ensureHunks(n.source,t.file)}function v(){r.retryHunks(n.source,t.file)}return(t,i)=>(u(),C(Me,{file:e.file,"state-key":l.value,detail:d.value,"hunks-loaded":f.value,"hunks-error":p.value,expanded:m.value,"agent-source":b(n).source,commentable:g.value,"comments-editable":g.value,comments:h.value,onLoadHunks:_,onRetryHunks:v,onClearHunksError:i[0]||=t=>b(r).clearHunksError(b(n).source,e.file),onToggle:i[1]||=e=>b(n).handleCardToggle(c.value),onExpand:i[2]||=e=>b(n).expandFile(c.value)},null,8,[`file`,`state-key`,`detail`,`hunks-loaded`,`hunks-error`,`expanded`,`agent-source`,`commentable`,`comments-editable`,`comments`]))}}),jt={key:0,class:`active-review-bar row items-center q-gutter-x-sm q-px-sm no-wrap`},Mt={class:`text-body2 ellipsis`},Nt=q(h({__name:`ActiveReviewBar`,setup(e){let{t}=V(),n=z(),r=J(),{activeReview:i}=H(r),a=pe(),o=Ne();function s(e){r.setStatus(e).catch(e=>{n(t(`reviews.comments.error`),e)})}return(e,n)=>b(i)?(u(),y(`div`,jt,[x(N,{name:`rate_review`,size:`18px`,color:`primary`}),v(`span`,Mt,l(b(i).name??b(t)(`reviews.list.unnamed`)),1),x(B),b(a).enabled?(u(),C(L,{key:0,flat:``,dense:``,"no-caps":``,size:`sm`,icon:b(oe),label:b(t)(`agent.context.addReview`),onClick:n[0]||=e=>b(o)({kind:`review`,reviewId:b(i).id})},null,8,[`icon`,`label`])):k(``,!0),x(Le,{status:b(i).status,onChange:s},null,8,[`status`])])):k(``,!0)}}),[[`__scopeId`,`data-v-2b6e4bdd`]]),Pt={key:1,class:`q-pa-md text-grey-6`},Ft=46,It=12,Lt=1.5,Rt=2,zt=20,Bt=q(h({__name:`DiffPanel`,setup(e){let{t}=V(),n=Z(),{diffFiles:i}=H(n),{error:s,loading:c}=H(Y()),d=J(),{activeReview:p}=H(d);Re({create:e=>d.createComment(e),edit:(e,t)=>d.editComment(e,t),remove:e=>d.deleteComment(e),resolve:e=>d.resolveComment(e),unresolve:e=>d.unresolveComment(e)});let m=g(null),h=E(()=>m.value?.getScrollTarget()??null);r(De,()=>h.value);let _=g(null);function v(){let e=_.value;return e?Promise.resolve(e):new Promise(e=>{let t=o(_,n=>{n&&(t(),e(n))})})}return o(()=>n.layoutVersion,async()=>{await f(),_.value?.reset()}),o(i,async(e,t)=>{je(e,t,(e,t)=>X(e)===X(t))||(await f(),_.value?.reset())}),o(()=>n.scrollRequest,async e=>{if(!e)return;let t=await v();if(await f(),n.scrollRequest===e){t.scrollTo(e.index,`start`);for(let t=0;t<zt;t++){await new Promise(e=>requestAnimationFrame(e));let t=document.getElementById(`diff-file-${e.path}`);if(t){t.scrollIntoView({block:`nearest`});return}}}}),(e,r)=>(u(),y(T,null,[b(s)?(u(),C(Ee,{key:0,title:b(t)(`changes.loadError`),message:b(s),loading:b(c),onRetry:r[0]||=e=>b(n).refresh()},null,8,[`title`,`message`,`loading`])):k(``,!0),b(i).length===0&&!b(s)?(u(),y(`div`,Pt,l(b(t)(`changes.emptyDiffPanel`)),1)):b(i).length>0?(u(),y(T,{key:2},[x(Nt),b(p)?(u(),C(R,{key:0})):k(``,!0),x(kt,{files:b(i),onExpandAll:b(n).expandAllFiles,onCollapseAll:b(n).collapseAllFiles},null,8,[`files`,`onExpandAll`,`onCollapseAll`]),x(R),x(K,{ref_key:`scrollArea`,ref:m,class:`col`,"content-style":`padding: 8px; width: 100%; max-width: 100%`,"content-active-style":`padding: 8px; width: 100%; max-width: 100%`},{default:a(()=>[h.value?(u(),C(_e,{key:b(n).source,ref_key:`virtualScroll`,ref:_,"scroll-target":h.value,items:b(i),"virtual-scroll-item-size":Ft,"virtual-scroll-slice-size":It,"virtual-scroll-slice-ratio-before":Lt,"virtual-scroll-slice-ratio-after":Rt},{default:a(({item:e})=>[(u(),y(`div`,{key:b(X)(e),class:`diff-virtual-slot`},[x(At,{file:e},null,8,[`file`])]))]),_:1},8,[`scroll-target`,`items`])):k(``,!0)]),_:1},512)],64)):k(``,!0),!b(p)&&b(i).length>0?(u(),C(Be,{key:3})):k(``,!0)],64))}}),[[`__scopeId`,`data-v-86358ac2`]]),Vt={key:1,class:`q-pa-md text-grey-6`},Ht={key:0,class:`row justify-center q-pa-lg`},Ut={key:1,class:`q-pa-md text-grey-6`},Wt={class:`text-caption`},Gt={key:2,class:`q-pa-md text-grey-6`},Kt=h({__name:`FileContentPanel`,setup(e){let{t}=V(),n=Z(),{selectedPath:r,browseFileLines:i,browseFileIsBinary:s,browseFileLoading:c,browseFileError:d,treeError:f,refreshing:p}=H(n),{error:m}=H(Y()),h=E(()=>m.value?{title:t(`changes.loadError`),message:m.value}:f.value?{title:t(`browse.treeLoadError`),message:f.value}:null),_=g(!1);return o(r,e=>{_.value=e?Fe(e):!1},{immediate:!0}),(e,o)=>(u(),y(T,null,[h.value?(u(),C(Ee,{key:0,title:h.value.title,message:h.value.message,loading:b(p),onRetry:o[0]||=e=>b(n).refresh()},null,8,[`title`,`message`,`loading`])):k(``,!0),b(r)?(u(),C(ke,{key:2,class:`col`},{header:a(()=>[x(Ie,{path:b(r)},{default:a(()=>[x(Te,{modelValue:_.value,"onUpdate:modelValue":o[1]||=e=>_.value=e,path:b(r)},null,8,[`modelValue`,`path`])]),_:1},8,[`path`])]),default:a(()=>[b(c)&&b(i).length===0&&!b(d)?(u(),y(`div`,Ht,[x(I,{color:`primary`,size:`2em`})])):b(d)?(u(),y(`div`,Ut,[w(l(b(t)(`changes.fullFileLoadError`))+` `,1),v(`div`,Wt,l(b(d)),1),x(L,{flat:``,dense:``,color:`primary`,class:`q-mt-sm`,label:b(t)(`changes.retry`),loading:b(p),onClick:o[2]||=e=>b(n).refresh()},null,8,[`label`,`loading`])])):b(s)?(u(),y(`div`,Gt,l(b(t)(`changes.binaryFile`)),1)):(u(),C(K,{key:3,class:`col`,"content-style":`padding: 8px`,"content-active-style":`padding: 8px`},{default:a(()=>[x(Ae,{path:b(r),lines:b(i),wrap:_.value},null,8,[`path`,`lines`,`wrap`])]),_:1}))]),_:1})):(u(),y(`div`,Vt,l(b(t)(`browse.selectFile`)),1))],64))}}),qt=h({__name:`FileExplorer`,setup(e){let t=Z(),n=J(),{browseMode:r}=H(t);S(()=>{t.refresh(),n.refresh()});let i=U([`files:changed`],()=>void t.refreshFromServerEvent());c(()=>i.close());let o=U([`review:created`,`review:updated`,`review:deleted`,`comment:created`,`comment:updated`,`comment:deleted`],()=>void n.refresh());return c(()=>o.close()),(e,t)=>(u(),C(Ye,null,{panel:a(()=>[x(bt)]),content:a(()=>[b(r)?(u(),C(Kt,{key:0})):(u(),C(Bt,{key:1}))]),_:1}))}}),Jt=h({__name:`IndexPage`,setup(e){return(e,t)=>(u(),C(we,null,{default:a(()=>[x(qt)]),_:1}))}});export{Jt as default};
@@ -0,0 +1 @@
1
+ .file-explorer[data-v-65488178]{height:100%}[data-v-65488178] .file-explorer__panel{flex-direction:column;flex-shrink:0;min-width:0;height:100%;display:flex}[data-v-65488178] .file-explorer__content{flex-direction:column;flex-wrap:no-wrap;display:flex}.file-tree-node__icon-section[data-v-6d719ee2]{min-width:0!important;padding-right:6px!important}.file-tree-node__label[data-v-6d719ee2]{width:100%;min-width:0}.file-tree-node__chevron[data-v-6d719ee2]{transition:transform .15s}.file-tree-node__chevron--expanded[data-v-6d719ee2]{transform:rotate(90deg)}.file-tree-node--selected[data-v-6d719ee2]{font-weight:500}.file-list-item__icon-section[data-v-4d2d079f]{min-width:0!important;padding-right:6px!important}.file-list-item__path-row[data-v-4d2d079f]{width:100%;min-width:0}.file-list-item__path-label[data-v-4d2d079f]{flex:0 auto;min-width:0}.file-list-item__badge[data-v-4d2d079f]{flex:none}.file-list-item--selected[data-v-4d2d079f],[data-v-4d2d079f] .file-list-item--selected{font-weight:500}.file-list-item__actions[data-v-4d2d079f]{gap:2px;flex-direction:row!important;padding:0 0 0 6px!important}.file-list-item__stats[data-v-4d2d079f]{padding-right:0!important}.file-list-panel__scroll[data-v-6daa93e0] .q-scrollarea__content{width:100%}.active-review-bar[data-v-2b6e4bdd]{min-height:36px}.diff-virtual-slot[data-v-86358ac2]{padding-bottom:8px}.diff-virtual-slot[data-v-86358ac2] .diff-file-card{margin-bottom:0}