@saluzi/saluzi-edu 0.2.13 → 0.2.15

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 (179) hide show
  1. package/dist/cli.js +79 -72
  2. package/dist/rcs-web/assets/AdminPanel-CQU763nr.js +1 -0
  3. package/dist/rcs-web/assets/Dashboard-B1hQfqI9.js +1 -0
  4. package/dist/rcs-web/assets/Join-7hMl360t.js +1 -0
  5. package/{packages/remote-control-server/web/dist/assets/Login-0VGZs85I.js → dist/rcs-web/assets/Login-BE8mNc0U.js} +1 -1
  6. package/dist/rcs-web/assets/SessionDetail-B5C0o1YT.js +55 -0
  7. package/dist/rcs-web/assets/SessionVisibilityBadge-CQN3bJW4.js +11 -0
  8. package/dist/rcs-web/assets/{Setup-C0cjxXMt.js → Setup-CqZ5gEBQ.js} +1 -1
  9. package/dist/rcs-web/assets/{ShareLanding-DUZrreJ7.js → ShareLanding-DBC9gbJo.js} +1 -1
  10. package/dist/rcs-web/assets/TeamCreate-DSYdTaPe.js +1 -0
  11. package/dist/rcs-web/assets/TeamDetail-CmJGsgOP.js +1 -0
  12. package/dist/rcs-web/assets/TeamList-BMS_Qq8U.js +1 -0
  13. package/dist/rcs-web/assets/{TeamSettings-CNVwYwcp.js → TeamSettings-C0sYgCFT.js} +1 -1
  14. package/dist/rcs-web/assets/UserSettings-CqzeJ5cc.js +1 -0
  15. package/{packages/remote-control-server/web/dist/assets/arc-CJxirXEQ.js → dist/rcs-web/assets/arc-DBPKxYzS.js} +1 -1
  16. package/dist/rcs-web/assets/{architectureDiagram-3BPJPVTR-BZvIHrLA.js → architectureDiagram-3BPJPVTR-D88rj_js.js} +1 -1
  17. package/dist/rcs-web/assets/{blockDiagram-GPEHLZMM-3p0y3Ija.js → blockDiagram-GPEHLZMM-xzgUpRMn.js} +1 -1
  18. package/dist/rcs-web/assets/{c4Diagram-AAUBKEIU-Bmz9A1wn.js → c4Diagram-AAUBKEIU-vpg_EoPb.js} +1 -1
  19. package/dist/rcs-web/assets/channel-Daz3yMSu.js +1 -0
  20. package/dist/rcs-web/assets/{chunk-2J33WTMH-B8gQz22j.js → chunk-2J33WTMH-DXWsXvhS.js} +1 -1
  21. package/dist/rcs-web/assets/{chunk-4BX2VUAB-CgLEZsTU.js → chunk-4BX2VUAB-BtTxwj9K.js} +1 -1
  22. package/dist/rcs-web/assets/{chunk-55IACEB6-0mdE_-IS.js → chunk-55IACEB6-D2-Q95qg.js} +1 -1
  23. package/{packages/remote-control-server/web/dist/assets/chunk-727SXJPM-DdtjnIHR.js → dist/rcs-web/assets/chunk-727SXJPM-Ce3e5x8u.js} +1 -1
  24. package/{packages/remote-control-server/web/dist/assets/chunk-AQP2D5EJ-BtwFPk50.js → dist/rcs-web/assets/chunk-AQP2D5EJ-C0UbKVtd.js} +1 -1
  25. package/dist/rcs-web/assets/{chunk-FMBD7UC4-BcO9mQ0P.js → chunk-FMBD7UC4-BCwppVqh.js} +1 -1
  26. package/dist/rcs-web/assets/{chunk-ND2GUHAM-BvRq13S_.js → chunk-ND2GUHAM-CnOBwWrm.js} +1 -1
  27. package/dist/rcs-web/assets/{chunk-QZHKN3VN-D7GHkPpq.js → chunk-QZHKN3VN-CDdzB71P.js} +1 -1
  28. package/dist/rcs-web/assets/classDiagram-4FO5ZUOK-DufdcV1P.js +1 -0
  29. package/dist/rcs-web/assets/classDiagram-v2-Q7XG4LA2-DufdcV1P.js +1 -0
  30. package/dist/rcs-web/assets/{code-block-IT6T5CEO-B1p-vO-3.js → code-block-IT6T5CEO-C1_H_ztH.js} +1 -1
  31. package/dist/rcs-web/assets/copy-DXU1lQqc.js +6 -0
  32. package/{packages/remote-control-server/web/dist/assets/cose-bilkent-S5V4N54A-L0rUZuH5.js → dist/rcs-web/assets/cose-bilkent-S5V4N54A-BC6nfjTF.js} +1 -1
  33. package/dist/rcs-web/assets/{dagre-BM42HDAG-CHGuio22.js → dagre-BM42HDAG-CEPR_pRx.js} +1 -1
  34. package/dist/rcs-web/assets/{diagram-2AECGRRQ-DIDRyQk8.js → diagram-2AECGRRQ-fVMGnSYa.js} +1 -1
  35. package/dist/rcs-web/assets/{diagram-5GNKFQAL-CNubKb6P.js → diagram-5GNKFQAL-BPzN2rbK.js} +1 -1
  36. package/dist/rcs-web/assets/{diagram-KO2AKTUF-CzQh664-.js → diagram-KO2AKTUF-Boneg9n-.js} +1 -1
  37. package/dist/rcs-web/assets/{diagram-LMA3HP47-CWBR7-VG.js → diagram-LMA3HP47-B8AtvjO9.js} +1 -1
  38. package/dist/rcs-web/assets/{diagram-OG6HWLK6-BMHdlbcZ.js → diagram-OG6HWLK6-DjY7A8jK.js} +1 -1
  39. package/{packages/remote-control-server/web/dist/assets/erDiagram-TEJ5UH35-OgT8dC-K.js → dist/rcs-web/assets/erDiagram-TEJ5UH35-C1BEfKxk.js} +1 -1
  40. package/{packages/remote-control-server/web/dist/assets/flowDiagram-I6XJVG4X-DRrCY2oB.js → dist/rcs-web/assets/flowDiagram-I6XJVG4X-7TbI9MLV.js} +1 -1
  41. package/dist/rcs-web/assets/{ganttDiagram-6RSMTGT7-DctpzEKN.js → ganttDiagram-6RSMTGT7-CMAV0A01.js} +1 -1
  42. package/dist/rcs-web/assets/{gitGraphDiagram-PVQCEYII-5KpLszm9.js → gitGraphDiagram-PVQCEYII-DAlR8G81.js} +1 -1
  43. package/dist/rcs-web/assets/{infoDiagram-5YYISTIA-BAKD_Tt7.js → infoDiagram-5YYISTIA-0T0DAV4W.js} +1 -1
  44. package/{packages/remote-control-server/web/dist/assets/ishikawaDiagram-YF4QCWOH-VHOPG4Nc.js → dist/rcs-web/assets/ishikawaDiagram-YF4QCWOH-BAw8txlx.js} +1 -1
  45. package/{packages/remote-control-server/web/dist/assets/journeyDiagram-JHISSGLW-BtGih-ik.js → dist/rcs-web/assets/journeyDiagram-JHISSGLW-DWvYKwz-.js} +1 -1
  46. package/dist/rcs-web/assets/{kanban-definition-UN3LZRKU-BsEGZsD1.js → kanban-definition-UN3LZRKU-Qzqw1H5B.js} +1 -1
  47. package/{packages/remote-control-server/web/dist/assets/linear-Dj636PNG.js → dist/rcs-web/assets/linear-D2KIJoCI.js} +1 -1
  48. package/dist/rcs-web/assets/main-J6cPs2y8.js +253 -0
  49. package/dist/rcs-web/assets/{mermaid-VLURNSYL-DutpHHm9.js → mermaid-VLURNSYL-CxWk1wHz.js} +4 -4
  50. package/dist/rcs-web/assets/{mermaid.core-XHHf0pen.js → mermaid.core-C48YvKu4.js} +5 -5
  51. package/dist/rcs-web/assets/{mindmap-definition-RKZ34NQL-BBa8V_3g.js → mindmap-definition-RKZ34NQL-BfmcTuCA.js} +1 -1
  52. package/dist/rcs-web/assets/{pieDiagram-4H26LBE5-BuNEdo9H.js → pieDiagram-4H26LBE5-DVNZpnfb.js} +1 -1
  53. package/dist/rcs-web/assets/{quadrantDiagram-W4KKPZXB-CsJgyQIN.js → quadrantDiagram-W4KKPZXB-COL55Z3i.js} +1 -1
  54. package/dist/rcs-web/assets/{requirementDiagram-4Y6WPE33-DqMJZ914.js → requirementDiagram-4Y6WPE33-CFczYQ0a.js} +1 -1
  55. package/{packages/remote-control-server/web/dist/assets/sankeyDiagram-5OEKKPKP-CVsz09q2.js → dist/rcs-web/assets/sankeyDiagram-5OEKKPKP-BrQEv3WQ.js} +1 -1
  56. package/{packages/remote-control-server/web/dist/assets/sequenceDiagram-3UESZ5HK-BRp4Wddn.js → dist/rcs-web/assets/sequenceDiagram-3UESZ5HK-CMxtYmQu.js} +1 -1
  57. package/{packages/remote-control-server/web/dist/assets/stateDiagram-AJRCARHV-S-QqQr-D.js → dist/rcs-web/assets/stateDiagram-AJRCARHV-Dw9xJZ-A.js} +1 -1
  58. package/dist/rcs-web/assets/{stateDiagram-v2-BHNVJYJU-D77KfDr-.js → stateDiagram-v2-BHNVJYJU-Br0D-weX.js} +1 -1
  59. package/{packages/remote-control-server/web/dist/assets/timeline-definition-PNZ67QCA-De8bFWnE.js → dist/rcs-web/assets/timeline-definition-PNZ67QCA-DuWDwYBt.js} +1 -1
  60. package/dist/rcs-web/assets/{vennDiagram-CIIHVFJN-Dikwrn1L.js → vennDiagram-CIIHVFJN--7IV65HQ.js} +1 -1
  61. package/dist/rcs-web/assets/{wardleyDiagram-YWT4CUSO-DUzpiV6H.js → wardleyDiagram-YWT4CUSO-CVTgWbvT.js} +1 -1
  62. package/dist/rcs-web/assets/{xychartDiagram-2RQKCTM6-OZNbB32D.js → xychartDiagram-2RQKCTM6-B9om4xAF.js} +1 -1
  63. package/dist/rcs-web/index.html +1 -1
  64. package/package.json +1 -1
  65. package/packages/remote-control-server/src/__tests__/auth-login.test.ts +21 -4
  66. package/packages/remote-control-server/src/__tests__/auth-security.test.ts +12 -6
  67. package/packages/remote-control-server/src/__tests__/data-layer-round2.test.ts +12 -11
  68. package/packages/remote-control-server/src/__tests__/db-isolation.test.ts +61 -0
  69. package/packages/remote-control-server/src/__tests__/low-priority-fixes.test.ts +178 -0
  70. package/packages/remote-control-server/src/__tests__/middleware.test.ts +4 -4
  71. package/packages/remote-control-server/src/__tests__/route-mounting.test.ts +26 -8
  72. package/packages/remote-control-server/src/__tests__/security-fixes.test.ts +32 -27
  73. package/packages/remote-control-server/src/__tests__/security-round3.test.ts +5 -1
  74. package/packages/remote-control-server/src/__tests__/team-filter-api.test.ts +280 -0
  75. package/packages/remote-control-server/src/__tests__/team-session-env.test.ts +169 -0
  76. package/packages/remote-control-server/src/__tests__/teams.test.ts +7 -0
  77. package/packages/remote-control-server/src/auth/csrf.ts +1 -3
  78. package/packages/remote-control-server/src/auth/middleware.ts +13 -4
  79. package/packages/remote-control-server/src/index.ts +11 -8
  80. package/packages/remote-control-server/src/routes/v1/environments.ts +12 -9
  81. package/packages/remote-control-server/src/routes/v1/sessions.ts +1 -1
  82. package/packages/remote-control-server/src/routes/web/auth-routes.ts +3 -1
  83. package/packages/remote-control-server/src/routes/web/auth.ts +2 -1
  84. package/packages/remote-control-server/src/routes/web/environments.ts +22 -4
  85. package/packages/remote-control-server/src/routes/web/sessions.ts +24 -12
  86. package/packages/remote-control-server/src/routes/web/shares.ts +11 -2
  87. package/packages/remote-control-server/src/routes/web/teams.ts +6 -9
  88. package/packages/remote-control-server/src/services/environment.ts +8 -3
  89. package/packages/remote-control-server/src/services/session.ts +56 -45
  90. package/packages/remote-control-server/src/store.ts +128 -7
  91. package/packages/remote-control-server/src/types/api.ts +8 -1
  92. package/packages/remote-control-server/web/dist/assets/AdminPanel-CQU763nr.js +1 -0
  93. package/packages/remote-control-server/web/dist/assets/Dashboard-B1hQfqI9.js +1 -0
  94. package/packages/remote-control-server/web/dist/assets/Join-7hMl360t.js +1 -0
  95. package/{dist/rcs-web/assets/Login-0VGZs85I.js → packages/remote-control-server/web/dist/assets/Login-BE8mNc0U.js} +1 -1
  96. package/packages/remote-control-server/web/dist/assets/SessionDetail-B5C0o1YT.js +55 -0
  97. package/packages/remote-control-server/web/dist/assets/SessionVisibilityBadge-CQN3bJW4.js +11 -0
  98. package/packages/remote-control-server/web/dist/assets/{Setup-C0cjxXMt.js → Setup-CqZ5gEBQ.js} +1 -1
  99. package/packages/remote-control-server/web/dist/assets/{ShareLanding-DUZrreJ7.js → ShareLanding-DBC9gbJo.js} +1 -1
  100. package/packages/remote-control-server/web/dist/assets/TeamCreate-DSYdTaPe.js +1 -0
  101. package/packages/remote-control-server/web/dist/assets/TeamDetail-CmJGsgOP.js +1 -0
  102. package/packages/remote-control-server/web/dist/assets/TeamList-BMS_Qq8U.js +1 -0
  103. package/packages/remote-control-server/web/dist/assets/{TeamSettings-CNVwYwcp.js → TeamSettings-C0sYgCFT.js} +1 -1
  104. package/packages/remote-control-server/web/dist/assets/UserSettings-CqzeJ5cc.js +1 -0
  105. package/{dist/rcs-web/assets/arc-CJxirXEQ.js → packages/remote-control-server/web/dist/assets/arc-DBPKxYzS.js} +1 -1
  106. package/packages/remote-control-server/web/dist/assets/{architectureDiagram-3BPJPVTR-BZvIHrLA.js → architectureDiagram-3BPJPVTR-D88rj_js.js} +1 -1
  107. package/packages/remote-control-server/web/dist/assets/{blockDiagram-GPEHLZMM-3p0y3Ija.js → blockDiagram-GPEHLZMM-xzgUpRMn.js} +1 -1
  108. package/packages/remote-control-server/web/dist/assets/{c4Diagram-AAUBKEIU-Bmz9A1wn.js → c4Diagram-AAUBKEIU-vpg_EoPb.js} +1 -1
  109. package/packages/remote-control-server/web/dist/assets/channel-Daz3yMSu.js +1 -0
  110. package/packages/remote-control-server/web/dist/assets/{chunk-2J33WTMH-B8gQz22j.js → chunk-2J33WTMH-DXWsXvhS.js} +1 -1
  111. package/packages/remote-control-server/web/dist/assets/{chunk-4BX2VUAB-CgLEZsTU.js → chunk-4BX2VUAB-BtTxwj9K.js} +1 -1
  112. package/packages/remote-control-server/web/dist/assets/{chunk-55IACEB6-0mdE_-IS.js → chunk-55IACEB6-D2-Q95qg.js} +1 -1
  113. package/{dist/rcs-web/assets/chunk-727SXJPM-DdtjnIHR.js → packages/remote-control-server/web/dist/assets/chunk-727SXJPM-Ce3e5x8u.js} +1 -1
  114. package/{dist/rcs-web/assets/chunk-AQP2D5EJ-BtwFPk50.js → packages/remote-control-server/web/dist/assets/chunk-AQP2D5EJ-C0UbKVtd.js} +1 -1
  115. package/packages/remote-control-server/web/dist/assets/{chunk-FMBD7UC4-BcO9mQ0P.js → chunk-FMBD7UC4-BCwppVqh.js} +1 -1
  116. package/packages/remote-control-server/web/dist/assets/{chunk-ND2GUHAM-BvRq13S_.js → chunk-ND2GUHAM-CnOBwWrm.js} +1 -1
  117. package/packages/remote-control-server/web/dist/assets/{chunk-QZHKN3VN-D7GHkPpq.js → chunk-QZHKN3VN-CDdzB71P.js} +1 -1
  118. package/packages/remote-control-server/web/dist/assets/classDiagram-4FO5ZUOK-DufdcV1P.js +1 -0
  119. package/packages/remote-control-server/web/dist/assets/classDiagram-v2-Q7XG4LA2-DufdcV1P.js +1 -0
  120. package/packages/remote-control-server/web/dist/assets/{code-block-IT6T5CEO-B1p-vO-3.js → code-block-IT6T5CEO-C1_H_ztH.js} +1 -1
  121. package/packages/remote-control-server/web/dist/assets/copy-DXU1lQqc.js +6 -0
  122. package/{dist/rcs-web/assets/cose-bilkent-S5V4N54A-L0rUZuH5.js → packages/remote-control-server/web/dist/assets/cose-bilkent-S5V4N54A-BC6nfjTF.js} +1 -1
  123. package/packages/remote-control-server/web/dist/assets/{dagre-BM42HDAG-CHGuio22.js → dagre-BM42HDAG-CEPR_pRx.js} +1 -1
  124. package/packages/remote-control-server/web/dist/assets/{diagram-2AECGRRQ-DIDRyQk8.js → diagram-2AECGRRQ-fVMGnSYa.js} +1 -1
  125. package/packages/remote-control-server/web/dist/assets/{diagram-5GNKFQAL-CNubKb6P.js → diagram-5GNKFQAL-BPzN2rbK.js} +1 -1
  126. package/packages/remote-control-server/web/dist/assets/{diagram-KO2AKTUF-CzQh664-.js → diagram-KO2AKTUF-Boneg9n-.js} +1 -1
  127. package/packages/remote-control-server/web/dist/assets/{diagram-LMA3HP47-CWBR7-VG.js → diagram-LMA3HP47-B8AtvjO9.js} +1 -1
  128. package/packages/remote-control-server/web/dist/assets/{diagram-OG6HWLK6-BMHdlbcZ.js → diagram-OG6HWLK6-DjY7A8jK.js} +1 -1
  129. package/{dist/rcs-web/assets/erDiagram-TEJ5UH35-OgT8dC-K.js → packages/remote-control-server/web/dist/assets/erDiagram-TEJ5UH35-C1BEfKxk.js} +1 -1
  130. package/{dist/rcs-web/assets/flowDiagram-I6XJVG4X-DRrCY2oB.js → packages/remote-control-server/web/dist/assets/flowDiagram-I6XJVG4X-7TbI9MLV.js} +1 -1
  131. package/packages/remote-control-server/web/dist/assets/{ganttDiagram-6RSMTGT7-DctpzEKN.js → ganttDiagram-6RSMTGT7-CMAV0A01.js} +1 -1
  132. package/packages/remote-control-server/web/dist/assets/{gitGraphDiagram-PVQCEYII-5KpLszm9.js → gitGraphDiagram-PVQCEYII-DAlR8G81.js} +1 -1
  133. package/packages/remote-control-server/web/dist/assets/{infoDiagram-5YYISTIA-BAKD_Tt7.js → infoDiagram-5YYISTIA-0T0DAV4W.js} +1 -1
  134. package/{dist/rcs-web/assets/ishikawaDiagram-YF4QCWOH-VHOPG4Nc.js → packages/remote-control-server/web/dist/assets/ishikawaDiagram-YF4QCWOH-BAw8txlx.js} +1 -1
  135. package/{dist/rcs-web/assets/journeyDiagram-JHISSGLW-BtGih-ik.js → packages/remote-control-server/web/dist/assets/journeyDiagram-JHISSGLW-DWvYKwz-.js} +1 -1
  136. package/packages/remote-control-server/web/dist/assets/{kanban-definition-UN3LZRKU-BsEGZsD1.js → kanban-definition-UN3LZRKU-Qzqw1H5B.js} +1 -1
  137. package/{dist/rcs-web/assets/linear-Dj636PNG.js → packages/remote-control-server/web/dist/assets/linear-D2KIJoCI.js} +1 -1
  138. package/packages/remote-control-server/web/dist/assets/main-J6cPs2y8.js +253 -0
  139. package/packages/remote-control-server/web/dist/assets/{mermaid-VLURNSYL-DutpHHm9.js → mermaid-VLURNSYL-CxWk1wHz.js} +4 -4
  140. package/packages/remote-control-server/web/dist/assets/{mermaid.core-XHHf0pen.js → mermaid.core-C48YvKu4.js} +5 -5
  141. package/packages/remote-control-server/web/dist/assets/{mindmap-definition-RKZ34NQL-BBa8V_3g.js → mindmap-definition-RKZ34NQL-BfmcTuCA.js} +1 -1
  142. package/packages/remote-control-server/web/dist/assets/{pieDiagram-4H26LBE5-BuNEdo9H.js → pieDiagram-4H26LBE5-DVNZpnfb.js} +1 -1
  143. package/packages/remote-control-server/web/dist/assets/{quadrantDiagram-W4KKPZXB-CsJgyQIN.js → quadrantDiagram-W4KKPZXB-COL55Z3i.js} +1 -1
  144. package/packages/remote-control-server/web/dist/assets/{requirementDiagram-4Y6WPE33-DqMJZ914.js → requirementDiagram-4Y6WPE33-CFczYQ0a.js} +1 -1
  145. package/{dist/rcs-web/assets/sankeyDiagram-5OEKKPKP-CVsz09q2.js → packages/remote-control-server/web/dist/assets/sankeyDiagram-5OEKKPKP-BrQEv3WQ.js} +1 -1
  146. package/{dist/rcs-web/assets/sequenceDiagram-3UESZ5HK-BRp4Wddn.js → packages/remote-control-server/web/dist/assets/sequenceDiagram-3UESZ5HK-CMxtYmQu.js} +1 -1
  147. package/{dist/rcs-web/assets/stateDiagram-AJRCARHV-S-QqQr-D.js → packages/remote-control-server/web/dist/assets/stateDiagram-AJRCARHV-Dw9xJZ-A.js} +1 -1
  148. package/packages/remote-control-server/web/dist/assets/{stateDiagram-v2-BHNVJYJU-D77KfDr-.js → stateDiagram-v2-BHNVJYJU-Br0D-weX.js} +1 -1
  149. package/{dist/rcs-web/assets/timeline-definition-PNZ67QCA-De8bFWnE.js → packages/remote-control-server/web/dist/assets/timeline-definition-PNZ67QCA-DuWDwYBt.js} +1 -1
  150. package/packages/remote-control-server/web/dist/assets/{vennDiagram-CIIHVFJN-Dikwrn1L.js → vennDiagram-CIIHVFJN--7IV65HQ.js} +1 -1
  151. package/packages/remote-control-server/web/dist/assets/{wardleyDiagram-YWT4CUSO-DUzpiV6H.js → wardleyDiagram-YWT4CUSO-CVTgWbvT.js} +1 -1
  152. package/packages/remote-control-server/web/dist/assets/{xychartDiagram-2RQKCTM6-OZNbB32D.js → xychartDiagram-2RQKCTM6-B9om4xAF.js} +1 -1
  153. package/packages/remote-control-server/web/dist/index.html +1 -1
  154. package/dist/rcs-web/assets/Dashboard-YYwDrKTN.js +0 -1
  155. package/dist/rcs-web/assets/Join-DKCP5X6X.js +0 -1
  156. package/dist/rcs-web/assets/SessionDetail-DmK-DfBQ.js +0 -50
  157. package/dist/rcs-web/assets/TeamCreate-B8ZV6EdY.js +0 -1
  158. package/dist/rcs-web/assets/TeamDetail-DBAsJ__i.js +0 -11
  159. package/dist/rcs-web/assets/TeamList-C-Hte4nV.js +0 -1
  160. package/dist/rcs-web/assets/UserSettings-DRdz9kYE.js +0 -1
  161. package/dist/rcs-web/assets/channel-DaI_n8dp.js +0 -1
  162. package/dist/rcs-web/assets/classDiagram-4FO5ZUOK-pYllpkOq.js +0 -1
  163. package/dist/rcs-web/assets/classDiagram-v2-Q7XG4LA2-pYllpkOq.js +0 -1
  164. package/dist/rcs-web/assets/main-CkqtCllF.js +0 -238
  165. package/dist/rcs-web/assets/useTeams-CqJOqEy1.js +0 -1
  166. package/dist/rcs-web/assets/workerType-DOQ0AHrq.js +0 -1
  167. package/packages/remote-control-server/web/dist/assets/Dashboard-YYwDrKTN.js +0 -1
  168. package/packages/remote-control-server/web/dist/assets/Join-DKCP5X6X.js +0 -1
  169. package/packages/remote-control-server/web/dist/assets/SessionDetail-DmK-DfBQ.js +0 -50
  170. package/packages/remote-control-server/web/dist/assets/TeamCreate-B8ZV6EdY.js +0 -1
  171. package/packages/remote-control-server/web/dist/assets/TeamDetail-DBAsJ__i.js +0 -11
  172. package/packages/remote-control-server/web/dist/assets/TeamList-C-Hte4nV.js +0 -1
  173. package/packages/remote-control-server/web/dist/assets/UserSettings-DRdz9kYE.js +0 -1
  174. package/packages/remote-control-server/web/dist/assets/channel-DaI_n8dp.js +0 -1
  175. package/packages/remote-control-server/web/dist/assets/classDiagram-4FO5ZUOK-pYllpkOq.js +0 -1
  176. package/packages/remote-control-server/web/dist/assets/classDiagram-v2-Q7XG4LA2-pYllpkOq.js +0 -1
  177. package/packages/remote-control-server/web/dist/assets/main-CkqtCllF.js +0 -238
  178. package/packages/remote-control-server/web/dist/assets/useTeams-CqJOqEy1.js +0 -1
  179. package/packages/remote-control-server/web/dist/assets/workerType-DOQ0AHrq.js +0 -1
@@ -2,12 +2,12 @@ import {
2
2
  storeCreateSession,
3
3
  storeGetSession,
4
4
  storeGetEnvironment,
5
- storeIsSessionOwner,
6
5
  storeUpdateSession,
7
6
  storeListSessions,
8
7
  storeListSessionsByUsername,
9
8
  storeListSessionsByEnvironment,
10
9
  storeListSessionsByOwnerUuid,
10
+ storeGetSessionOwnersBulk,
11
11
  } from '../store'
12
12
  import { randomUUID } from 'node:crypto'
13
13
  import { getDb } from '../db/sqlite'
@@ -24,18 +24,22 @@ const CODE_SESSION_PREFIX = 'cse_'
24
24
  const WEB_SESSION_PREFIX = 'session_'
25
25
  const CLOSED_SESSION_STATUSES = new Set(['archived'])
26
26
 
27
- function toResponse(row: {
28
- id: string
29
- environmentId: string | null
30
- title: string | null
31
- status: string
32
- source: string
33
- permissionMode: string | null
34
- workerEpoch: number
35
- username: string | null
36
- createdAt: Date
37
- updatedAt: Date
38
- }): SessionResponse {
27
+ function toResponse(
28
+ row: {
29
+ id: string
30
+ environmentId: string | null
31
+ title: string | null
32
+ status: string
33
+ source: string
34
+ permissionMode: string | null
35
+ workerEpoch: number
36
+ username: string | null
37
+ visibility: string
38
+ createdAt: Date
39
+ updatedAt: Date
40
+ },
41
+ owner?: { owner_type: 'user' | 'team'; owner_id: string } | null,
42
+ ): SessionResponse {
39
43
  return {
40
44
  id: row.id,
41
45
  environment_id: row.environmentId,
@@ -45,8 +49,11 @@ function toResponse(row: {
45
49
  permission_mode: row.permissionMode,
46
50
  worker_epoch: row.workerEpoch,
47
51
  username: row.username,
52
+ visibility: row.visibility,
48
53
  created_at: row.createdAt.getTime() / 1000,
49
54
  updated_at: row.updatedAt.getTime() / 1000,
55
+ owner_type: owner?.owner_type ?? null,
56
+ owner_id: owner?.owner_id ?? null,
50
57
  }
51
58
  }
52
59
 
@@ -73,7 +80,7 @@ function toWebSessionSummaryResponse(
73
80
  }
74
81
 
75
82
  export function createSession(
76
- req: CreateSessionRequest & { username?: string },
83
+ req: CreateSessionRequest & { username?: string; visibility?: string },
77
84
  ): SessionResponse {
78
85
  const record = storeCreateSession({
79
86
  environmentId: req.environment_id,
@@ -81,6 +88,7 @@ export function createSession(
81
88
  source: req.source,
82
89
  permissionMode: req.permission_mode,
83
90
  username: req.username,
91
+ visibility: req.visibility,
84
92
  })
85
93
  return toResponse(record)
86
94
  }
@@ -260,35 +268,31 @@ export function resolveOwnedWebSessionId(
260
268
  }
261
269
  }
262
270
  } catch {
263
- // Fallback to legacy ownership check if DB is unavailable
264
- if (storeIsSessionOwner(sessionId, uuid)) {
265
- return sessionId
266
- }
267
- const compatibleCodeSessionId = toCompatibleCodeSessionId(sessionId)
268
- if (
269
- compatibleCodeSessionId &&
270
- storeIsSessionOwner(compatibleCodeSessionId, uuid)
271
- ) {
272
- return compatibleCodeSessionId
273
- }
271
+ // DB unavailable — return null rather than falling back to redundant check
274
272
  }
275
273
 
276
274
  return null
277
275
  }
278
276
 
279
277
  export function listWebSessionsByOwnerUuid(uuid: string): SessionResponse[] {
280
- return storeListSessionsByOwnerUuid(uuid)
281
- .filter(session => !isSessionClosedStatus(session.status))
282
- .map(toResponse)
278
+ const records = storeListSessionsByOwnerUuid(uuid).filter(
279
+ session => !isSessionClosedStatus(session.status),
280
+ )
281
+ const owners = storeGetSessionOwnersBulk(records.map(r => r.id))
282
+ return records
283
+ .map(r => toResponse(r, owners.get(r.id)))
283
284
  .map(toWebSessionResponse)
284
285
  }
285
286
 
286
287
  export function listWebSessionSummariesByOwnerUuid(
287
288
  uuid: string,
288
289
  ): SessionSummaryResponse[] {
289
- return storeListSessionsByOwnerUuid(uuid)
290
- .filter(session => !isSessionClosedStatus(session.status))
291
- .map(toSummaryResponse)
290
+ const records = storeListSessionsByOwnerUuid(uuid).filter(
291
+ session => !isSessionClosedStatus(session.status),
292
+ )
293
+ const owners = storeGetSessionOwnersBulk(records.map(r => r.id))
294
+ return records
295
+ .map(r => toSummaryResponse(r, owners.get(r.id)))
292
296
  .map(toWebSessionSummaryResponse)
293
297
  }
294
298
 
@@ -345,18 +349,22 @@ export function incrementEpoch(sessionId: string): number {
345
349
  }
346
350
 
347
351
  export function listSessions() {
348
- return storeListSessions().map(toResponse)
352
+ return storeListSessions().map(r => toResponse(r))
349
353
  }
350
354
 
351
- function toSummaryResponse(row: {
352
- id: string
353
- source: string
354
- title: string | null
355
- status: string
356
- username: string | null
357
- environmentId: string | null
358
- updatedAt: Date
359
- }): SessionSummaryResponse {
355
+ function toSummaryResponse(
356
+ row: {
357
+ id: string
358
+ source: string
359
+ title: string | null
360
+ status: string
361
+ username: string | null
362
+ visibility: string
363
+ environmentId: string | null
364
+ updatedAt: Date
365
+ },
366
+ owner?: { owner_type: 'user' | 'team'; owner_id: string } | null,
367
+ ): SessionSummaryResponse {
360
368
  // Inline environment snapshot so the Web UI session list can render a
361
369
  // worker-type badge without an extra round-trip per session. Mirrors the
362
370
  // shape returned by GET /web/sessions/:id.
@@ -377,28 +385,31 @@ function toSummaryResponse(row: {
377
385
  status: row.status,
378
386
  source: row.source,
379
387
  username: row.username,
388
+ visibility: row.visibility,
380
389
  environment_id: row.environmentId,
390
+ owner_type: owner?.owner_type ?? null,
391
+ owner_id: owner?.owner_id ?? null,
381
392
  environment,
382
393
  updated_at: row.updatedAt.getTime() / 1000,
383
394
  }
384
395
  }
385
396
 
386
397
  export function listSessionSummaries(): SessionSummaryResponse[] {
387
- return storeListSessions().map(toSummaryResponse)
398
+ return storeListSessions().map(r => toSummaryResponse(r))
388
399
  }
389
400
 
390
401
  export function listSessionSummariesByOwnerUuid(
391
402
  uuid: string,
392
403
  ): SessionSummaryResponse[] {
393
- return storeListSessionsByOwnerUuid(uuid).map(toSummaryResponse)
404
+ return storeListSessionsByOwnerUuid(uuid).map(r => toSummaryResponse(r))
394
405
  }
395
406
 
396
407
  export function listSessionSummariesByUsername(
397
408
  username: string,
398
409
  ): SessionSummaryResponse[] {
399
- return storeListSessionsByUsername(username).map(toSummaryResponse)
410
+ return storeListSessionsByUsername(username).map(r => toSummaryResponse(r))
400
411
  }
401
412
 
402
413
  export function listSessionsByEnvironment(envId: string) {
403
- return storeListSessionsByEnvironment(envId).map(toResponse)
414
+ return storeListSessionsByEnvironment(envId).map(r => toResponse(r))
404
415
  }
@@ -35,6 +35,7 @@ export interface SessionRecord {
35
35
  permissionMode: string | null
36
36
  workerEpoch: number
37
37
  username: string | null
38
+ visibility: string
38
39
  createdAt: Date
39
40
  updatedAt: Date
40
41
  }
@@ -202,9 +203,9 @@ export function storeUpdateEnvironment(
202
203
  // the environments table has no corresponding columns.
203
204
 
204
205
  if (sets.length > 0) {
205
- db.query(
206
- `UPDATE environments SET ${sets.join(', ')} WHERE id = $id`,
207
- ).run(params)
206
+ db.query(`UPDATE environments SET ${sets.join(', ')} WHERE id = $id`).run(
207
+ params,
208
+ )
208
209
  }
209
210
  } catch (err) {
210
211
  console.error('[store] DB write failed in storeUpdateEnvironment:', err)
@@ -217,6 +218,55 @@ export function storeListActiveEnvironments(): EnvironmentRecord[] {
217
218
  return [...environments.values()].filter(e => e.status === 'active')
218
219
  }
219
220
 
221
+ /**
222
+ * Return active environments enriched with team_id and team_name from SQLite.
223
+ * LEFT JOINs team_environments + teams (excluding soft-deleted teams).
224
+ */
225
+ export function storeListActiveEnvironmentsWithTeam(): Array<
226
+ EnvironmentRecord & { teamId: string | null; teamName: string | null }
227
+ > {
228
+ const active = [...environments.values()].filter(e => e.status === 'active')
229
+ if (active.length === 0) return []
230
+
231
+ // Build a map of env_id → { teamId, teamName } from SQLite
232
+ const teamMap = new Map<string, { teamId: string; teamName: string }>()
233
+ try {
234
+ const db = getDb()
235
+ const rows = db
236
+ .query(
237
+ `SELECT te.environment_id, te.team_id, t.name AS team_name
238
+ FROM team_environments te
239
+ JOIN teams t ON t.id = te.team_id AND t.deleted_at IS NULL`,
240
+ )
241
+ .all() as Array<{
242
+ environment_id: string
243
+ team_id: string
244
+ team_name: string
245
+ }>
246
+ for (const row of rows) {
247
+ teamMap.set(row.environment_id, {
248
+ teamId: row.team_id,
249
+ teamName: row.team_name,
250
+ })
251
+ }
252
+ } catch (err) {
253
+ console.error(
254
+ '[store] DB read failed in storeListActiveEnvironmentsWithTeam:',
255
+ err,
256
+ )
257
+ // Fall through: return envs without team info
258
+ }
259
+
260
+ return active.map(env => {
261
+ const team = teamMap.get(env.id)
262
+ return {
263
+ ...env,
264
+ teamId: team?.teamId ?? null,
265
+ teamName: team?.teamName ?? null,
266
+ }
267
+ })
268
+ }
269
+
220
270
  export function storeListActiveEnvironmentsByUsername(
221
271
  username: string,
222
272
  ): EnvironmentRecord[] {
@@ -247,6 +297,7 @@ export function storeCreateSession(req: {
247
297
  permissionMode: req.permissionMode ?? null,
248
298
  workerEpoch: 0,
249
299
  username: req.username ?? null,
300
+ visibility: req.visibility ?? 'private',
250
301
  createdAt: now,
251
302
  updatedAt: now,
252
303
  }
@@ -262,7 +313,7 @@ export function storeCreateSession(req: {
262
313
  $title: record.title,
263
314
  $status: record.status,
264
315
  $source: record.source,
265
- $vis: req.visibility ?? 'private',
316
+ $vis: record.visibility,
266
317
  $pm: record.permissionMode,
267
318
  $ca: record.createdAt.toISOString(),
268
319
  $ua: record.updatedAt.toISOString(),
@@ -421,7 +472,7 @@ export function storeIsSessionOwner(sessionId: string, uuid: string): boolean {
421
472
  return !!row
422
473
  } catch (err) {
423
474
  console.error('[store] DB read failed in storeIsSessionOwner:', err)
424
- return false
475
+ throw err
425
476
  }
426
477
  }
427
478
 
@@ -439,7 +490,7 @@ export function storeGetSessionOwners(
439
490
  return new Set(rows.map(r => r.owner_id))
440
491
  } catch (err) {
441
492
  console.error('[store] DB read failed in storeGetSessionOwners:', err)
442
- return undefined
493
+ throw err
443
494
  }
444
495
  }
445
496
 
@@ -450,8 +501,12 @@ export function storeListSessionsByOwnerUuid(uuid: string): SessionRecord[] {
450
501
  // Collect sessions owned by this user from SQLite
451
502
  try {
452
503
  const db = getDb()
504
+ // Direct user ownership
453
505
  const ownedRows = db
454
- .query(`SELECT session_id FROM session_owners WHERE owner_id = $ownerId`)
506
+ .query(
507
+ `SELECT session_id FROM session_owners
508
+ WHERE owner_type = 'user' AND owner_id = $ownerId`,
509
+ )
455
510
  .all({ $ownerId: uuid }) as Array<{ session_id: string }>
456
511
  for (const row of ownedRows) {
457
512
  const session = sessions.get(row.session_id)
@@ -461,6 +516,23 @@ export function storeListSessionsByOwnerUuid(uuid: string): SessionRecord[] {
461
516
  }
462
517
  }
463
518
 
519
+ // Team ownership: sessions owned by a team the user belongs to
520
+ const teamOwnedRows = db
521
+ .query(
522
+ `SELECT so.session_id FROM session_owners so
523
+ JOIN team_members tm ON tm.team_id = so.owner_id
524
+ WHERE so.owner_type = 'team' AND tm.user_id = $userId`,
525
+ )
526
+ .all({ $userId: uuid }) as Array<{ session_id: string }>
527
+ for (const row of teamOwnedRows) {
528
+ if (resultIds.has(row.session_id)) continue
529
+ const session = sessions.get(row.session_id)
530
+ if (session) {
531
+ result.push(session)
532
+ resultIds.add(row.session_id)
533
+ }
534
+ }
535
+
464
536
  // Include public sessions
465
537
  const publicRows = db
466
538
  .query(`SELECT id FROM sessions WHERE visibility = 'public'`)
@@ -478,6 +550,55 @@ export function storeListSessionsByOwnerUuid(uuid: string): SessionRecord[] {
478
550
  '[store] DB read failed in storeListSessionsByOwnerUuid:',
479
551
  err,
480
552
  )
553
+ throw err
554
+ }
555
+
556
+ return result
557
+ }
558
+
559
+ /**
560
+ * Bulk-lookup session owners for a list of session IDs.
561
+ * Returns a Map of session_id → { owner_type, owner_id } (first owner wins).
562
+ */
563
+ export function storeGetSessionOwnersBulk(
564
+ sessionIds: string[],
565
+ ): Map<string, { owner_type: 'user' | 'team'; owner_id: string }> {
566
+ const result = new Map<
567
+ string,
568
+ { owner_type: 'user' | 'team'; owner_id: string }
569
+ >()
570
+ if (sessionIds.length === 0) return result
571
+
572
+ try {
573
+ const db = getDb()
574
+ // Use a subquery with IN clause — safe because sessionIds are internal
575
+ const placeholders = sessionIds.map((_, i) => `$s${i}`).join(',')
576
+ const params: Record<string, string> = {}
577
+ sessionIds.forEach((id, i) => {
578
+ params[`$s${i}`] = id
579
+ })
580
+ const rows = db
581
+ .query(
582
+ `SELECT session_id, owner_type, owner_id FROM session_owners
583
+ WHERE session_id IN (${placeholders})`,
584
+ )
585
+ .all(params) as Array<{
586
+ session_id: string
587
+ owner_type: 'user' | 'team'
588
+ owner_id: string
589
+ }>
590
+ for (const row of rows) {
591
+ // First owner wins (a session may have multiple owners)
592
+ if (!result.has(row.session_id)) {
593
+ result.set(row.session_id, {
594
+ owner_type: row.owner_type,
595
+ owner_id: row.owner_id,
596
+ })
597
+ }
598
+ }
599
+ } catch (err) {
600
+ console.error('[store] DB read failed in storeGetSessionOwnersBulk:', err)
601
+ // Return empty map — caller will treat as null owner
481
602
  }
482
603
 
483
604
  return result
@@ -3,7 +3,6 @@
3
3
  // Hono context variable types
4
4
  declare module 'hono' {
5
5
  interface ContextVariableMap {
6
- username?: string
7
6
  userId?: string
8
7
  isAdmin?: boolean
9
8
  jwtPayload?: { session_id: string; role: string; iat: number; exp: number }
@@ -74,8 +73,11 @@ export interface SessionResponse {
74
73
  permission_mode: string | null
75
74
  worker_epoch: number
76
75
  username: string | null
76
+ visibility: string
77
77
  created_at: number
78
78
  updated_at: number
79
+ owner_type: 'user' | 'team' | null
80
+ owner_id: string | null
79
81
  automation_state?: AutomationStateResponse
80
82
  worker?: SessionWorkerInfo | null
81
83
  work_item?: SessionWorkItemInfo | null
@@ -134,6 +136,8 @@ export interface EnvironmentResponse {
134
136
  worker_type?: string
135
137
  channel_group_id?: string | null
136
138
  capabilities?: Record<string, unknown> | null
139
+ team_id: string | null
140
+ team_name: string | null
137
141
  }
138
142
 
139
143
  export interface ServerInfoResponse {
@@ -151,7 +155,10 @@ export interface SessionSummaryResponse {
151
155
  status: string
152
156
  source: string
153
157
  username: string | null
158
+ visibility: string
154
159
  environment_id: string | null
160
+ owner_type: 'user' | 'team' | null
161
+ owner_id: string | null
155
162
  environment: {
156
163
  id: string
157
164
  machine_name: string | null
@@ -0,0 +1 @@
1
+ import{e as d,j as e}from"./vendor-DE_-CLIE.js";import{_ as x,$ as o,p as m,Q as s,H as l,i as u}from"./main-J6cPs2y8.js";import"./shiki-mEP5vQQu.js";import"./motion-BILbV7YQ.js";function j(){x();const[a,i]=d.useState([]),{myTeams:r,isLoading:c}=o(),n=d.useCallback(async()=>{try{const t=await m();i(t||[])}catch(t){console.error("Admin: failed to load sessions",t)}},[]);return d.useEffect(()=>{n()},[n]),e.jsx("div",{className:"flex-1 overflow-y-auto",children:e.jsxs("div",{className:"mx-auto max-w-5xl px-4 py-8",children:[e.jsx("h1",{className:"mb-6 font-display text-2xl font-semibold text-text-primary",children:s("admin.title")}),e.jsxs("section",{className:"mb-10",children:[e.jsxs("h2",{className:"mb-4 font-display text-lg font-semibold text-text-primary",children:[s("admin.teams")," (",r.length,")"]}),c?e.jsx("div",{className:"rounded-xl border border-border bg-surface-1 p-4 text-center text-text-muted",children:s("common.loading")}):r.length===0?e.jsx("div",{className:"rounded-xl border border-border bg-surface-1 p-4 text-center text-text-muted",children:s("admin.noTeams")}):e.jsx("div",{className:"space-y-2",children:r.map(t=>e.jsxs("a",{href:`/teams/${t.slug}`,className:"flex items-center justify-between rounded-xl border border-border bg-surface-1 px-4 py-3 no-underline transition-colors hover:border-border-light hover:bg-surface-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"font-medium text-text-primary",children:t.name}),e.jsx("span",{className:"ml-2 text-xs text-text-muted",children:t.slug})]}),e.jsx("span",{className:"text-xs text-text-muted",children:l(new Date(t.created_at).getTime()/1e3)})]},t.id))})]}),e.jsxs("section",{children:[e.jsxs("h2",{className:"mb-4 font-display text-lg font-semibold text-text-primary",children:[s("admin.sessions")," (",a.length,")"]}),a.length===0?e.jsx("div",{className:"rounded-xl border border-border bg-surface-1 p-4 text-center text-text-muted",children:s("admin.noSessions")}):e.jsx("div",{className:"space-y-2",children:a.map(t=>e.jsxs("a",{href:`/code/${t.id}`,className:"flex items-center justify-between rounded-xl border border-border bg-surface-1 px-4 py-3 no-underline transition-colors hover:border-border-light hover:bg-surface-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"truncate font-medium text-text-primary",children:t.title||t.id}),e.jsx("span",{className:"rounded-full bg-surface-2 px-2 py-0.5 text-xs text-text-muted",children:t.source||"unknown"})]}),e.jsx("div",{className:"truncate text-xs text-text-muted",children:t.id})]}),e.jsxs("div",{className:"ml-4 flex items-center gap-3",children:[e.jsx(u,{status:t.status}),e.jsx("span",{className:"text-xs text-text-muted",children:l(t.updated_at||t.created_at)})]})]},t.id))})]})]})})}export{j as AdminPanel};
@@ -0,0 +1 @@
1
+ import{j as e,e as i}from"./vendor-DE_-CLIE.js";import{B as T,$ as j,Z as v,i as k,H as E,_,Q as l,K as L,m as M,p as B,q as F,o as I}from"./main-J6cPs2y8.js";import{g as N,S as A,D as O,a as $,c as P,d as H,b as W}from"./SessionVisibilityBadge-CQN3bJW4.js";import"./shiki-mEP5vQQu.js";import"./motion-BILbV7YQ.js";function q({teamName:a,className:d}){return a?e.jsx("span",{className:T("inline-flex items-center rounded-full border border-border/60 bg-surface-2 px-2 py-0.5 text-xs text-text-muted",d),children:a}):null}function K({environments:a,onSelectEnvironment:d}){const{activeTeam:p}=j(),{user:n}=v(),x=i.useMemo(()=>(n==null?void 0:n.role)==="admin"?a:p?a.filter(r=>r.team_id===p.id):a.filter(r=>!r.team_id),[a,p,n==null?void 0:n.role]);return!x||x.length===0?e.jsx("div",{className:"rounded-xl border border-border bg-surface-1 p-8 text-center text-text-muted",children:"No active environments"}):e.jsx("div",{className:"space-y-2",children:x.map(r=>{const c=r.worker_type==="acp",m=N(r.worker_type),h=m.fullLabel,t=m.colorClass;return e.jsxs("button",{type:"button",onClick:()=>d==null?void 0:d(r),disabled:c,className:`flex w-full items-center justify-between rounded-xl border border-border bg-surface-1 px-4 py-3 text-left transition-colors ${c?"cursor-default opacity-80":"hover:border-border-light cursor-pointer"}`,children:[e.jsx("div",{className:"flex items-center gap-3",children:e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-medium text-text-primary",children:r.machine_name||r.id}),e.jsx("span",{className:`rounded-full px-2 py-0.5 text-xs font-medium ${t}`,children:h}),e.jsx(q,{teamName:r.team_name??null})]}),e.jsx("div",{className:"text-sm text-text-muted",children:r.directory||""})]})}),e.jsxs("div",{className:"text-right",children:[e.jsx(k,{status:r.status}),e.jsx("div",{className:"mt-1 text-xs text-text-muted",children:r.branch||""})]})]},r.id)})})}function Q({sessions:a,environments:d,onSelect:p,onDelete:n}){const{activeTeam:x}=j(),{user:r}=v(),c=i.useMemo(()=>(r==null?void 0:r.role)==="admin"?a:x?a.filter(t=>t.owner_type==="team"&&t.owner_id===x.id):a.filter(t=>t.owner_type==="user"||!t.owner_type),[a,x,r==null?void 0:r.role]);if(!c||c.length===0)return e.jsx("div",{className:"rounded-xl border border-border bg-surface-1 p-8 text-center text-text-muted",children:"No sessions"});const m=new Map;for(const t of d??[])t!=null&&t.id&&t.worker_type&&m.set(t.id,t.worker_type);const h=[...c].sort((t,u)=>(u.updated_at||0)-(t.updated_at||0));return e.jsx("div",{className:"space-y-2",children:h.map(t=>e.jsxs("div",{className:"group flex w-full items-center justify-between rounded-xl border border-border bg-surface-1 px-4 py-3 text-left transition-colors hover:border-border-light hover:bg-surface-2",children:[e.jsxs("button",{type:"button",onClick:()=>p(t.id),className:"min-w-0 flex-1 text-left",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"truncate font-medium text-text-primary",children:t.title||t.id}),t.visibility&&e.jsx(A,{visibility:t.visibility||"private"}),(()=>{var o;let u=t.source==="acp"?"acp":(o=t.environment)==null?void 0:o.worker_type;!u&&t.environment_id&&(u=m.get(t.environment_id));const f=N(u);return e.jsx("span",{className:`rounded-full px-2 py-0.5 text-xs font-medium ${f.colorClass}`,children:f.fullLabel})})()]}),e.jsx("div",{className:"truncate text-xs text-text-muted",children:t.id})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(k,{status:t.status}),e.jsx("span",{className:"text-xs text-text-muted",children:E(t.created_at||t.updated_at)}),n&&e.jsx("button",{type:"button",onClick:u=>{u.stopPropagation(),n(t.id)},className:"rounded p-1 text-text-muted opacity-0 transition-all hover:text-status-error group-hover:opacity-100",title:"Delete session",children:e.jsx("svg",{className:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})]},t.id))})}function R({open:a,environments:d,onClose:p,onCreated:n}){_();const{activeTeam:x}=j(),{user:r}=v(),[c,m]=i.useState(""),[h,t]=i.useState(""),[u,f]=i.useState("same-dir"),[o,b]=i.useState(""),[g,w]=i.useState(!1),C=i.useMemo(()=>(r==null?void 0:r.role)==="admin"?d:x?d.filter(s=>s.team_id===x.id):d.filter(s=>!s.team_id),[d,x,r==null?void 0:r.role]);i.useEffect(()=>{a&&(m(""),t(""),f("same-dir"),b(""))},[a]);const S=async()=>{w(!0),b("");try{const s={};c.trim()&&(s.title=c.trim()),h&&(s.environment_id=h),s.spawn_mode=u;const y=L();y&&(s.team_id=y);const D=await M(s);n(D)}catch(s){b(s instanceof Error?s.message:l("dialog.createFailed"))}finally{w(!1)}};return e.jsx(O,{open:a,onOpenChange:s=>{s||p()},children:e.jsxs($,{className:"max-w-md rounded-2xl border-border bg-surface-1 p-6 shadow-2xl",children:[e.jsx(P,{children:e.jsx(H,{className:"font-display text-lg font-semibold text-text-primary",children:l("dialog.newSession")})}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"mb-1 block text-sm text-text-secondary",children:l("dialog.titleOptional")}),e.jsx("input",{type:"text",value:c,onChange:s=>m(s.target.value),placeholder:l("dialog.titlePlaceholder"),className:"w-full rounded-lg border border-border bg-surface-2 px-3 py-2 text-sm text-text-primary placeholder:text-text-muted focus:border-brand focus:outline-none"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1 block text-sm text-text-secondary",children:l("dialog.environment")}),e.jsxs("select",{value:h,onChange:s=>t(s.target.value),className:"w-full rounded-lg border border-border bg-surface-2 px-3 py-2 text-sm text-text-primary focus:border-brand focus:outline-none",children:[e.jsx("option",{value:"",children:l("dialog.none")}),C.map(s=>{const y=N(s.worker_type).shortLabel;return e.jsxs("option",{value:s.id,children:[s.machine_name||s.id," (",s.branch||l("dialog.noBranch"),") · ",y]},s.id)})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1 block text-sm text-text-secondary",children:l("dialog.workspaceMode")}),e.jsxs("select",{value:u,onChange:s=>f(s.target.value),className:"w-full rounded-lg border border-border bg-surface-2 px-3 py-2 text-sm text-text-primary focus:border-brand focus:outline-none",children:[e.jsx("option",{value:"same-dir",children:l("dialog.sameDir")}),e.jsx("option",{value:"worktree",children:l("dialog.worktree")})]})]}),o&&e.jsx("div",{className:"text-sm text-status-error",children:o})]}),e.jsxs(W,{children:[e.jsx("button",{onClick:p,className:"rounded-lg border border-border px-4 py-2 text-sm text-text-secondary hover:bg-surface-2 transition-colors",children:l("common.cancel")}),e.jsx("button",{onClick:S,disabled:g,className:"rounded-lg bg-brand px-4 py-2 text-sm font-medium text-white hover:bg-brand-light disabled:opacity-50 transition-colors",children:g?l("common.creating"):l("common.create")})]})]})})}function U({onNavigateSession:a}){_();const[d,p]=i.useState([]),[n,x]=i.useState([]),[r,c]=i.useState(!1),m=i.useCallback(async()=>{try{const[o,b]=await Promise.all([B(),F()]);p(o||[]),x(b||[])}catch(o){console.error("Dashboard render error:",o)}},[]);i.useEffect(()=>{m();const o=setInterval(m,1e4);return()=>clearInterval(o)},[m]);const h=o=>{c(!1),a(o.id)},t=i.useCallback(o=>{},[]),u=i.useCallback(o=>{a(o)},[a]),f=i.useCallback(async o=>{if(window.confirm(l("dashboard.confirmDelete").replace("{id}",o)))try{await I(o),p(b=>b.filter(g=>g.id!==o))}catch(b){alert(b instanceof Error?b.message:l("dashboard.deleteFailed"))}},[]);return e.jsxs("div",{className:"mx-auto max-w-5xl px-4 py-8",children:[e.jsx("h1",{className:"sr-only",children:l("dashboard.title")}),e.jsxs("section",{className:"mb-10",children:[e.jsx("h2",{className:"mb-4 font-display text-lg font-semibold text-text-primary",children:l("dashboard.environments")}),e.jsx(K,{environments:n,onSelectEnvironment:t})]}),e.jsxs("section",{children:[e.jsxs("div",{className:"mb-4 flex items-center justify-between",children:[e.jsx("h2",{className:"font-display text-lg font-semibold text-text-primary",children:l("dashboard.sessions")}),e.jsx("button",{onClick:()=>c(!0),className:"rounded-lg bg-brand px-3 py-1.5 text-sm font-medium text-white hover:bg-brand-light transition-colors",children:l("dashboard.newSession")})]}),e.jsx(Q,{sessions:d,environments:n,onSelect:u,onDelete:f})]}),e.jsx(R,{open:r,environments:n,onClose:()=>c(!1),onCreated:h})]})}export{U as Dashboard};
@@ -0,0 +1 @@
1
+ import{e as r,j as e}from"./vendor-DE_-CLIE.js";import{Z as v,Q as t}from"./main-J6cPs2y8.js";import"./shiki-mEP5vQQu.js";import"./motion-BILbV7YQ.js";function E({onSuccess:b,onInvalidInvite:l}){const{join:h}=v(),[u,f]=r.useState(""),[d,j]=r.useState(""),[o,w]=r.useState(""),[c,g]=r.useState(""),[m,n]=r.useState(""),[x,p]=r.useState(!1);r.useEffect(()=>{const a=new URLSearchParams(window.location.search).get("invite");a?f(a):l()},[l]);const y=async s=>{if(s.preventDefault(),n(""),o.length<8){n(t("auth.setup.passwordTooShort"));return}if(o!==c){n(t("auth.setup.passwordMismatch"));return}p(!0);try{await h(u,d,o),b()}catch(a){const i=a instanceof Error?a.message:"Join failed";if(i.includes("Invalid invitation")||i.includes("expired")||i.includes("already used")){l();return}n(i)}finally{p(!1)}};return e.jsx("div",{className:"flex min-h-screen items-center justify-center bg-surface-0 px-4",children:e.jsxs("div",{className:"w-full max-w-sm space-y-6",children:[e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"font-display text-2xl font-semibold text-text-primary",children:t("auth.join.title")}),e.jsx("p",{className:"mt-2 text-sm text-text-muted",children:t("auth.join.welcome")}),e.jsx("p",{className:"mt-1 text-sm text-text-muted",children:t("auth.join.description")})]}),e.jsxs("form",{onSubmit:y,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"mb-1 block text-sm font-medium text-text-secondary",children:t("auth.join.username")}),e.jsx("input",{type:"text",value:d,onChange:s=>j(s.target.value),required:!0,autoComplete:"username",autoFocus:!0,className:"w-full rounded-lg border border-border bg-surface-2 px-3 py-2 text-sm text-text-primary placeholder:text-text-muted focus:border-brand focus:outline-none"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1 block text-sm font-medium text-text-secondary",children:t("auth.join.password")}),e.jsx("input",{type:"password",value:o,onChange:s=>w(s.target.value),required:!0,autoComplete:"new-password",className:"w-full rounded-lg border border-border bg-surface-2 px-3 py-2 text-sm text-text-primary placeholder:text-text-muted focus:border-brand focus:outline-none"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1 block text-sm font-medium text-text-secondary",children:t("auth.join.confirmPassword")}),e.jsx("input",{type:"password",value:c,onChange:s=>g(s.target.value),required:!0,autoComplete:"new-password",className:"w-full rounded-lg border border-border bg-surface-2 px-3 py-2 text-sm text-text-primary placeholder:text-text-muted focus:border-brand focus:outline-none"})]}),m&&e.jsx("p",{className:"text-sm text-status-error",children:m}),e.jsx("button",{type:"submit",disabled:x||!u,className:"w-full rounded-lg bg-brand px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-brand-light disabled:cursor-not-allowed disabled:opacity-50",children:x?t("common.loading"):t("auth.join.submit")})]})]})})}export{E as Join};
@@ -1 +1 @@
1
- import{e as r,j as e}from"./vendor-DE_-CLIE.js";import{N as b,I as t}from"./main-CkqtCllF.js";import"./shiki-mEP5vQQu.js";import"./motion-BILbV7YQ.js";function j({onSuccess:d}){const{login:c}=b(),[a,m]=r.useState(""),[o,x]=r.useState(""),[l,n]=r.useState(""),[i,u]=r.useState(!1),p=async s=>{s.preventDefault(),n(""),u(!0);try{await c(a,o),d()}catch{n(t("auth.login.failed"))}finally{u(!1)}};return e.jsx("div",{className:"flex min-h-screen items-center justify-center bg-surface-0 px-4",children:e.jsxs("div",{className:"w-full max-w-sm space-y-6",children:[e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"font-display text-2xl font-semibold text-text-primary",children:t("auth.login.title")}),e.jsx("p",{className:"mt-2 text-sm text-text-muted",children:t("auth.login.description")})]}),e.jsxs("form",{onSubmit:p,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"mb-1 block text-sm font-medium text-text-secondary",children:t("auth.login.username")}),e.jsx("input",{type:"text",value:a,onChange:s=>m(s.target.value),required:!0,autoComplete:"username",autoFocus:!0,className:"w-full rounded-lg border border-border bg-surface-2 px-3 py-2 text-sm text-text-primary placeholder:text-text-muted focus:border-brand focus:outline-none"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1 block text-sm font-medium text-text-secondary",children:t("auth.login.password")}),e.jsx("input",{type:"password",value:o,onChange:s=>x(s.target.value),required:!0,autoComplete:"current-password",className:"w-full rounded-lg border border-border bg-surface-2 px-3 py-2 text-sm text-text-primary placeholder:text-text-muted focus:border-brand focus:outline-none"})]}),l&&e.jsx("p",{className:"text-sm text-status-error",children:l}),e.jsx("button",{type:"submit",disabled:i,className:"w-full rounded-lg bg-brand px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-brand-light disabled:cursor-not-allowed disabled:opacity-50",children:i?t("common.loading"):t("auth.login.submit")})]})]})})}export{j as Login};
1
+ import{e as r,j as e}from"./vendor-DE_-CLIE.js";import{Z as b,Q as t}from"./main-J6cPs2y8.js";import"./shiki-mEP5vQQu.js";import"./motion-BILbV7YQ.js";function j({onSuccess:d}){const{login:c}=b(),[a,m]=r.useState(""),[o,x]=r.useState(""),[l,n]=r.useState(""),[i,u]=r.useState(!1),p=async s=>{s.preventDefault(),n(""),u(!0);try{await c(a,o),d()}catch{n(t("auth.login.failed"))}finally{u(!1)}};return e.jsx("div",{className:"flex min-h-screen items-center justify-center bg-surface-0 px-4",children:e.jsxs("div",{className:"w-full max-w-sm space-y-6",children:[e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"font-display text-2xl font-semibold text-text-primary",children:t("auth.login.title")}),e.jsx("p",{className:"mt-2 text-sm text-text-muted",children:t("auth.login.description")})]}),e.jsxs("form",{onSubmit:p,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"mb-1 block text-sm font-medium text-text-secondary",children:t("auth.login.username")}),e.jsx("input",{type:"text",value:a,onChange:s=>m(s.target.value),required:!0,autoComplete:"username",autoFocus:!0,className:"w-full rounded-lg border border-border bg-surface-2 px-3 py-2 text-sm text-text-primary placeholder:text-text-muted focus:border-brand focus:outline-none"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1 block text-sm font-medium text-text-secondary",children:t("auth.login.password")}),e.jsx("input",{type:"password",value:o,onChange:s=>x(s.target.value),required:!0,autoComplete:"current-password",className:"w-full rounded-lg border border-border bg-surface-2 px-3 py-2 text-sm text-text-primary placeholder:text-text-muted focus:border-brand focus:outline-none"})]}),l&&e.jsx("p",{className:"text-sm text-status-error",children:l}),e.jsx("button",{type:"submit",disabled:i,className:"w-full rounded-lg bg-brand px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-brand-light disabled:cursor-not-allowed disabled:opacity-50",children:i?t("common.loading"):t("auth.login.submit")})]})]})})}export{j as Login};