@saluzi/saluzi-edu 0.2.85 → 0.3.1

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 (172) hide show
  1. package/dist/cli.js +272 -195
  2. package/dist/guide/guide-data.json +194 -181
  3. package/dist/rcs-web/assets/{AdminPanel-BkmXNunm.js → AdminPanel-Dw_WcoUm.js} +1 -1
  4. package/dist/rcs-web/assets/ArtifactView-1QwTt1_U.js +6 -0
  5. package/dist/rcs-web/assets/ArtifactsGallery-BaqQmrpp.js +441 -0
  6. package/{packages/remote-control-server/web/dist/assets/Claim-C_-Gla6o.js → dist/rcs-web/assets/Claim-DbnYUnUa.js} +1 -1
  7. package/dist/rcs-web/assets/{Dashboard-BIUyLZ7f.js → Dashboard-I2zDQu_C.js} +1 -1
  8. package/dist/rcs-web/assets/{Join-ZcgKlXzS.js → Join-BW_5GOxc.js} +1 -1
  9. package/dist/rcs-web/assets/Login-DfpBv0-E.js +1 -0
  10. package/dist/rcs-web/assets/{Register-DBsfc_dT.js → Register-G3MsHXWX.js} +1 -1
  11. package/dist/rcs-web/assets/{SessionDetail-BCCW6g8g.js → SessionDetail-C1D2E27B.js} +1 -1
  12. package/dist/rcs-web/assets/{SessionVisibilityBadge-Ba6plQFV.js → SessionVisibilityBadge-BKEoqr7V.js} +1 -1
  13. package/{packages/remote-control-server/web/dist/assets/Setup-BlHuf9KC.js → dist/rcs-web/assets/Setup-Ba0gdFpo.js} +1 -1
  14. package/dist/rcs-web/assets/{ShareLanding-BF1K1oYb.js → ShareLanding-CD0g9hBP.js} +1 -1
  15. package/dist/rcs-web/assets/{TeamCreate-Ce-SySLQ.js → TeamCreate-B95jdnoW.js} +1 -1
  16. package/dist/rcs-web/assets/{TeamDetail-Be5uskvw.js → TeamDetail-B1ez_Vlm.js} +1 -1
  17. package/dist/rcs-web/assets/{TeamList-CJaT4aYb.js → TeamList-Cfbc_pbK.js} +1 -1
  18. package/dist/rcs-web/assets/{TeamSettings-ws_7K-56.js → TeamSettings-CM3C5h_w.js} +1 -1
  19. package/dist/rcs-web/assets/{UserSearchInput-DL5_KDHE.js → UserSearchInput-CXTnk0hA.js} +1 -1
  20. package/dist/rcs-web/assets/{UserSettings-SOzXi42F.js → UserSettings-Bnq6nvYc.js} +1 -1
  21. package/dist/rcs-web/assets/{arc-CYCfDISm.js → arc-BSYwIwEf.js} +1 -1
  22. package/dist/rcs-web/assets/{architectureDiagram-3BPJPVTR-Bqa8vMD7.js → architectureDiagram-3BPJPVTR-D3RCYL_1.js} +1 -1
  23. package/{packages/remote-control-server/web/dist/assets/blockDiagram-GPEHLZMM-CczSTzEF.js → dist/rcs-web/assets/blockDiagram-GPEHLZMM-CHzBQR1p.js} +1 -1
  24. package/{packages/remote-control-server/web/dist/assets/c4Diagram-AAUBKEIU-CssBkFo6.js → dist/rcs-web/assets/c4Diagram-AAUBKEIU-BJcaDDLG.js} +1 -1
  25. package/dist/rcs-web/assets/channel-CbFNrUsk.js +1 -0
  26. package/dist/rcs-web/assets/{chunk-2J33WTMH-BE65KSB6.js → chunk-2J33WTMH-Bg0Hnyyq.js} +1 -1
  27. package/dist/rcs-web/assets/{chunk-4BX2VUAB-D653DDuu.js → chunk-4BX2VUAB-DfNc0_mN.js} +1 -1
  28. package/dist/rcs-web/assets/{chunk-55IACEB6-Ct5UXPIN.js → chunk-55IACEB6-lSLgeJjv.js} +1 -1
  29. package/{packages/remote-control-server/web/dist/assets/chunk-727SXJPM-S5fpS82E.js → dist/rcs-web/assets/chunk-727SXJPM-CLJOi1hb.js} +1 -1
  30. package/dist/rcs-web/assets/{chunk-AQP2D5EJ-CYTND6Zm.js → chunk-AQP2D5EJ-DTW4EE2i.js} +1 -1
  31. package/dist/rcs-web/assets/{chunk-FMBD7UC4-D59kMkuj.js → chunk-FMBD7UC4-B57Jsd13.js} +1 -1
  32. package/dist/rcs-web/assets/{chunk-ND2GUHAM-eEjBp7_r.js → chunk-ND2GUHAM-B_msF9ch.js} +1 -1
  33. package/dist/rcs-web/assets/{chunk-QZHKN3VN-DVV1jVoy.js → chunk-QZHKN3VN-BKdDyhR-.js} +1 -1
  34. package/dist/rcs-web/assets/classDiagram-4FO5ZUOK-DjCl6Ad4.js +1 -0
  35. package/dist/rcs-web/assets/classDiagram-v2-Q7XG4LA2-DjCl6Ad4.js +1 -0
  36. package/dist/rcs-web/assets/{code-block-IT6T5CEO-DWgaxEpJ.js → code-block-IT6T5CEO-By1Tu8pm.js} +1 -1
  37. package/dist/rcs-web/assets/{copy-la10Bvy2.js → copy-CIv8ifYN.js} +1 -1
  38. package/{packages/remote-control-server/web/dist/assets/cose-bilkent-S5V4N54A-CYkPDcHZ.js → dist/rcs-web/assets/cose-bilkent-S5V4N54A--virsnmO.js} +1 -1
  39. package/dist/rcs-web/assets/{dagre-BM42HDAG-DI0gApmA.js → dagre-BM42HDAG-DWHB77EO.js} +1 -1
  40. package/dist/rcs-web/assets/{diagram-2AECGRRQ-B1KjRwA6.js → diagram-2AECGRRQ-Cngu5yzm.js} +1 -1
  41. package/dist/rcs-web/assets/{diagram-5GNKFQAL-g8x2SnFz.js → diagram-5GNKFQAL-KVNmlovi.js} +1 -1
  42. package/dist/rcs-web/assets/{diagram-KO2AKTUF-_qS0aFTS.js → diagram-KO2AKTUF-B7VOvyr-.js} +1 -1
  43. package/dist/rcs-web/assets/{diagram-LMA3HP47-pNccEgrY.js → diagram-LMA3HP47-BhGlWLSy.js} +1 -1
  44. package/{packages/remote-control-server/web/dist/assets/diagram-OG6HWLK6-BEZR-29L.js → dist/rcs-web/assets/diagram-OG6HWLK6-B0nF0JCP.js} +1 -1
  45. package/{packages/remote-control-server/web/dist/assets/dialog-cgjIoxTP.js → dist/rcs-web/assets/dialog-D__YHb1u.js} +1 -1
  46. package/dist/rcs-web/assets/{erDiagram-TEJ5UH35-BJQSK56G.js → erDiagram-TEJ5UH35-CEl50M4S.js} +1 -1
  47. package/dist/rcs-web/assets/{flowDiagram-I6XJVG4X-QuhhO4rW.js → flowDiagram-I6XJVG4X-fWBjdCNK.js} +1 -1
  48. package/{packages/remote-control-server/web/dist/assets/ganttDiagram-6RSMTGT7-Cxic4_sr.js → dist/rcs-web/assets/ganttDiagram-6RSMTGT7-BAL8_-XH.js} +1 -1
  49. package/{packages/remote-control-server/web/dist/assets/gitGraphDiagram-PVQCEYII-ClQeHUrC.js → dist/rcs-web/assets/gitGraphDiagram-PVQCEYII-BM_6XPU4.js} +1 -1
  50. package/dist/rcs-web/assets/{infoDiagram-5YYISTIA-Dz47GiWm.js → infoDiagram-5YYISTIA-DtwjUdP-.js} +1 -1
  51. package/dist/rcs-web/assets/{ishikawaDiagram-YF4QCWOH--beuL5mS.js → ishikawaDiagram-YF4QCWOH-BwxFByT9.js} +1 -1
  52. package/dist/rcs-web/assets/{journeyDiagram-JHISSGLW-Bi5QelTp.js → journeyDiagram-JHISSGLW-DeWYaHqa.js} +1 -1
  53. package/dist/rcs-web/assets/{kanban-definition-UN3LZRKU-CbYj6Ccv.js → kanban-definition-UN3LZRKU-DMLiWipt.js} +1 -1
  54. package/dist/rcs-web/assets/{linear-B3f9icjf.js → linear-DigNGInH.js} +1 -1
  55. package/dist/rcs-web/assets/main-5C_gChTh.js +265 -0
  56. package/dist/rcs-web/assets/main-Bn5YZuiH.css +1 -0
  57. package/{packages/remote-control-server/web/dist/assets/mermaid-VLURNSYL-pX95fhBf.js → dist/rcs-web/assets/mermaid-VLURNSYL-DiBP7v4h.js} +4 -4
  58. package/dist/rcs-web/assets/{mermaid.core-BGK4yVxT.js → mermaid.core-CQwjc9NW.js} +5 -5
  59. package/{packages/remote-control-server/web/dist/assets/mindmap-definition-RKZ34NQL-CgtRTehZ.js → dist/rcs-web/assets/mindmap-definition-RKZ34NQL-CasTiX1-.js} +1 -1
  60. package/dist/rcs-web/assets/{pieDiagram-4H26LBE5-qJJGmbUf.js → pieDiagram-4H26LBE5-D94TX46C.js} +1 -1
  61. package/dist/rcs-web/assets/{quadrantDiagram-W4KKPZXB-Cd2k7IGS.js → quadrantDiagram-W4KKPZXB-wgKU_sO2.js} +1 -1
  62. package/dist/rcs-web/assets/{requirementDiagram-4Y6WPE33-DiFWGb6O.js → requirementDiagram-4Y6WPE33-DYKKTIT3.js} +1 -1
  63. package/{packages/remote-control-server/web/dist/assets/sankeyDiagram-5OEKKPKP-Dkn0yk-6.js → dist/rcs-web/assets/sankeyDiagram-5OEKKPKP-BCovzmUn.js} +1 -1
  64. package/dist/rcs-web/assets/{sequenceDiagram-3UESZ5HK-DdYdmSqK.js → sequenceDiagram-3UESZ5HK-BLtYwGaQ.js} +1 -1
  65. package/dist/rcs-web/assets/{stateDiagram-AJRCARHV-CnQyI3oa.js → stateDiagram-AJRCARHV-jMZaPO--.js} +1 -1
  66. package/dist/rcs-web/assets/{stateDiagram-v2-BHNVJYJU-C2JPZVJm.js → stateDiagram-v2-BHNVJYJU-CoUWNtqD.js} +1 -1
  67. package/{packages/remote-control-server/web/dist/assets/timeline-definition-PNZ67QCA-D0_pTyDA.js → dist/rcs-web/assets/timeline-definition-PNZ67QCA-CbqngX3Z.js} +1 -1
  68. package/{packages/remote-control-server/web/dist/assets/vennDiagram-CIIHVFJN-Bw3XMj_p.js → dist/rcs-web/assets/vennDiagram-CIIHVFJN-F9m0_HxT.js} +1 -1
  69. package/{packages/remote-control-server/web/dist/assets/wardleyDiagram-YWT4CUSO-BfzfoPRo.js → dist/rcs-web/assets/wardleyDiagram-YWT4CUSO-d_Uua5Ta.js} +1 -1
  70. package/dist/rcs-web/assets/{xychartDiagram-2RQKCTM6-qGzDgnMk.js → xychartDiagram-2RQKCTM6-BDwGBZT6.js} +1 -1
  71. package/dist/rcs-web/index.html +2 -2
  72. package/package.json +1 -1
  73. package/packages/remote-control-server/src/__tests__/auth.test.ts +3 -4
  74. package/packages/remote-control-server/src/__tests__/client-payload.test.ts +22 -0
  75. package/packages/remote-control-server/src/__tests__/helpers/db.ts +6 -0
  76. package/packages/remote-control-server/src/__tests__/helpers/mock-config.ts +2 -0
  77. package/packages/remote-control-server/src/__tests__/single-user.test.ts +333 -0
  78. package/packages/remote-control-server/src/__tests__/transport-normalize.test.ts +22 -0
  79. package/packages/remote-control-server/src/auth/jwt.ts +11 -3
  80. package/packages/remote-control-server/src/config.ts +65 -20
  81. package/packages/remote-control-server/src/index.ts +41 -0
  82. package/packages/remote-control-server/src/nodeServer.ts +103 -5
  83. package/packages/remote-control-server/src/routes/v1/environments.ts +11 -0
  84. package/packages/remote-control-server/src/routes/web/auth-routes.ts +21 -3
  85. package/packages/remote-control-server/src/services/single-user.ts +123 -0
  86. package/packages/remote-control-server/src/services/transport.ts +4 -0
  87. package/packages/remote-control-server/src/transport/client-payload.ts +5 -0
  88. package/packages/remote-control-server/web/dist/assets/{AdminPanel-BkmXNunm.js → AdminPanel-Dw_WcoUm.js} +1 -1
  89. package/packages/remote-control-server/web/dist/assets/ArtifactView-1QwTt1_U.js +6 -0
  90. package/packages/remote-control-server/web/dist/assets/ArtifactsGallery-BaqQmrpp.js +441 -0
  91. package/{dist/rcs-web/assets/Claim-C_-Gla6o.js → packages/remote-control-server/web/dist/assets/Claim-DbnYUnUa.js} +1 -1
  92. package/packages/remote-control-server/web/dist/assets/{Dashboard-BIUyLZ7f.js → Dashboard-I2zDQu_C.js} +1 -1
  93. package/packages/remote-control-server/web/dist/assets/{Join-ZcgKlXzS.js → Join-BW_5GOxc.js} +1 -1
  94. package/packages/remote-control-server/web/dist/assets/Login-DfpBv0-E.js +1 -0
  95. package/packages/remote-control-server/web/dist/assets/{Register-DBsfc_dT.js → Register-G3MsHXWX.js} +1 -1
  96. package/packages/remote-control-server/web/dist/assets/{SessionDetail-BCCW6g8g.js → SessionDetail-C1D2E27B.js} +1 -1
  97. package/packages/remote-control-server/web/dist/assets/{SessionVisibilityBadge-Ba6plQFV.js → SessionVisibilityBadge-BKEoqr7V.js} +1 -1
  98. package/{dist/rcs-web/assets/Setup-BlHuf9KC.js → packages/remote-control-server/web/dist/assets/Setup-Ba0gdFpo.js} +1 -1
  99. package/packages/remote-control-server/web/dist/assets/{ShareLanding-BF1K1oYb.js → ShareLanding-CD0g9hBP.js} +1 -1
  100. package/packages/remote-control-server/web/dist/assets/{TeamCreate-Ce-SySLQ.js → TeamCreate-B95jdnoW.js} +1 -1
  101. package/packages/remote-control-server/web/dist/assets/{TeamDetail-Be5uskvw.js → TeamDetail-B1ez_Vlm.js} +1 -1
  102. package/packages/remote-control-server/web/dist/assets/{TeamList-CJaT4aYb.js → TeamList-Cfbc_pbK.js} +1 -1
  103. package/packages/remote-control-server/web/dist/assets/{TeamSettings-ws_7K-56.js → TeamSettings-CM3C5h_w.js} +1 -1
  104. package/packages/remote-control-server/web/dist/assets/{UserSearchInput-DL5_KDHE.js → UserSearchInput-CXTnk0hA.js} +1 -1
  105. package/packages/remote-control-server/web/dist/assets/{UserSettings-SOzXi42F.js → UserSettings-Bnq6nvYc.js} +1 -1
  106. package/packages/remote-control-server/web/dist/assets/{arc-CYCfDISm.js → arc-BSYwIwEf.js} +1 -1
  107. package/packages/remote-control-server/web/dist/assets/{architectureDiagram-3BPJPVTR-Bqa8vMD7.js → architectureDiagram-3BPJPVTR-D3RCYL_1.js} +1 -1
  108. package/{dist/rcs-web/assets/blockDiagram-GPEHLZMM-CczSTzEF.js → packages/remote-control-server/web/dist/assets/blockDiagram-GPEHLZMM-CHzBQR1p.js} +1 -1
  109. package/{dist/rcs-web/assets/c4Diagram-AAUBKEIU-CssBkFo6.js → packages/remote-control-server/web/dist/assets/c4Diagram-AAUBKEIU-BJcaDDLG.js} +1 -1
  110. package/packages/remote-control-server/web/dist/assets/channel-CbFNrUsk.js +1 -0
  111. package/packages/remote-control-server/web/dist/assets/{chunk-2J33WTMH-BE65KSB6.js → chunk-2J33WTMH-Bg0Hnyyq.js} +1 -1
  112. package/packages/remote-control-server/web/dist/assets/{chunk-4BX2VUAB-D653DDuu.js → chunk-4BX2VUAB-DfNc0_mN.js} +1 -1
  113. package/packages/remote-control-server/web/dist/assets/{chunk-55IACEB6-Ct5UXPIN.js → chunk-55IACEB6-lSLgeJjv.js} +1 -1
  114. package/{dist/rcs-web/assets/chunk-727SXJPM-S5fpS82E.js → packages/remote-control-server/web/dist/assets/chunk-727SXJPM-CLJOi1hb.js} +1 -1
  115. package/packages/remote-control-server/web/dist/assets/{chunk-AQP2D5EJ-CYTND6Zm.js → chunk-AQP2D5EJ-DTW4EE2i.js} +1 -1
  116. package/packages/remote-control-server/web/dist/assets/{chunk-FMBD7UC4-D59kMkuj.js → chunk-FMBD7UC4-B57Jsd13.js} +1 -1
  117. package/packages/remote-control-server/web/dist/assets/{chunk-ND2GUHAM-eEjBp7_r.js → chunk-ND2GUHAM-B_msF9ch.js} +1 -1
  118. package/packages/remote-control-server/web/dist/assets/{chunk-QZHKN3VN-DVV1jVoy.js → chunk-QZHKN3VN-BKdDyhR-.js} +1 -1
  119. package/packages/remote-control-server/web/dist/assets/classDiagram-4FO5ZUOK-DjCl6Ad4.js +1 -0
  120. package/packages/remote-control-server/web/dist/assets/classDiagram-v2-Q7XG4LA2-DjCl6Ad4.js +1 -0
  121. package/packages/remote-control-server/web/dist/assets/{code-block-IT6T5CEO-DWgaxEpJ.js → code-block-IT6T5CEO-By1Tu8pm.js} +1 -1
  122. package/packages/remote-control-server/web/dist/assets/{copy-la10Bvy2.js → copy-CIv8ifYN.js} +1 -1
  123. package/{dist/rcs-web/assets/cose-bilkent-S5V4N54A-CYkPDcHZ.js → packages/remote-control-server/web/dist/assets/cose-bilkent-S5V4N54A--virsnmO.js} +1 -1
  124. package/packages/remote-control-server/web/dist/assets/{dagre-BM42HDAG-DI0gApmA.js → dagre-BM42HDAG-DWHB77EO.js} +1 -1
  125. package/packages/remote-control-server/web/dist/assets/{diagram-2AECGRRQ-B1KjRwA6.js → diagram-2AECGRRQ-Cngu5yzm.js} +1 -1
  126. package/packages/remote-control-server/web/dist/assets/{diagram-5GNKFQAL-g8x2SnFz.js → diagram-5GNKFQAL-KVNmlovi.js} +1 -1
  127. package/packages/remote-control-server/web/dist/assets/{diagram-KO2AKTUF-_qS0aFTS.js → diagram-KO2AKTUF-B7VOvyr-.js} +1 -1
  128. package/packages/remote-control-server/web/dist/assets/{diagram-LMA3HP47-pNccEgrY.js → diagram-LMA3HP47-BhGlWLSy.js} +1 -1
  129. package/{dist/rcs-web/assets/diagram-OG6HWLK6-BEZR-29L.js → packages/remote-control-server/web/dist/assets/diagram-OG6HWLK6-B0nF0JCP.js} +1 -1
  130. package/{dist/rcs-web/assets/dialog-cgjIoxTP.js → packages/remote-control-server/web/dist/assets/dialog-D__YHb1u.js} +1 -1
  131. package/packages/remote-control-server/web/dist/assets/{erDiagram-TEJ5UH35-BJQSK56G.js → erDiagram-TEJ5UH35-CEl50M4S.js} +1 -1
  132. package/packages/remote-control-server/web/dist/assets/{flowDiagram-I6XJVG4X-QuhhO4rW.js → flowDiagram-I6XJVG4X-fWBjdCNK.js} +1 -1
  133. package/{dist/rcs-web/assets/ganttDiagram-6RSMTGT7-Cxic4_sr.js → packages/remote-control-server/web/dist/assets/ganttDiagram-6RSMTGT7-BAL8_-XH.js} +1 -1
  134. package/{dist/rcs-web/assets/gitGraphDiagram-PVQCEYII-ClQeHUrC.js → packages/remote-control-server/web/dist/assets/gitGraphDiagram-PVQCEYII-BM_6XPU4.js} +1 -1
  135. package/packages/remote-control-server/web/dist/assets/{infoDiagram-5YYISTIA-Dz47GiWm.js → infoDiagram-5YYISTIA-DtwjUdP-.js} +1 -1
  136. package/packages/remote-control-server/web/dist/assets/{ishikawaDiagram-YF4QCWOH--beuL5mS.js → ishikawaDiagram-YF4QCWOH-BwxFByT9.js} +1 -1
  137. package/packages/remote-control-server/web/dist/assets/{journeyDiagram-JHISSGLW-Bi5QelTp.js → journeyDiagram-JHISSGLW-DeWYaHqa.js} +1 -1
  138. package/packages/remote-control-server/web/dist/assets/{kanban-definition-UN3LZRKU-CbYj6Ccv.js → kanban-definition-UN3LZRKU-DMLiWipt.js} +1 -1
  139. package/packages/remote-control-server/web/dist/assets/{linear-B3f9icjf.js → linear-DigNGInH.js} +1 -1
  140. package/packages/remote-control-server/web/dist/assets/main-5C_gChTh.js +265 -0
  141. package/packages/remote-control-server/web/dist/assets/main-Bn5YZuiH.css +1 -0
  142. package/{dist/rcs-web/assets/mermaid-VLURNSYL-pX95fhBf.js → packages/remote-control-server/web/dist/assets/mermaid-VLURNSYL-DiBP7v4h.js} +4 -4
  143. package/packages/remote-control-server/web/dist/assets/{mermaid.core-BGK4yVxT.js → mermaid.core-CQwjc9NW.js} +5 -5
  144. package/{dist/rcs-web/assets/mindmap-definition-RKZ34NQL-CgtRTehZ.js → packages/remote-control-server/web/dist/assets/mindmap-definition-RKZ34NQL-CasTiX1-.js} +1 -1
  145. package/packages/remote-control-server/web/dist/assets/{pieDiagram-4H26LBE5-qJJGmbUf.js → pieDiagram-4H26LBE5-D94TX46C.js} +1 -1
  146. package/packages/remote-control-server/web/dist/assets/{quadrantDiagram-W4KKPZXB-Cd2k7IGS.js → quadrantDiagram-W4KKPZXB-wgKU_sO2.js} +1 -1
  147. package/packages/remote-control-server/web/dist/assets/{requirementDiagram-4Y6WPE33-DiFWGb6O.js → requirementDiagram-4Y6WPE33-DYKKTIT3.js} +1 -1
  148. package/{dist/rcs-web/assets/sankeyDiagram-5OEKKPKP-Dkn0yk-6.js → packages/remote-control-server/web/dist/assets/sankeyDiagram-5OEKKPKP-BCovzmUn.js} +1 -1
  149. package/packages/remote-control-server/web/dist/assets/{sequenceDiagram-3UESZ5HK-DdYdmSqK.js → sequenceDiagram-3UESZ5HK-BLtYwGaQ.js} +1 -1
  150. package/packages/remote-control-server/web/dist/assets/{stateDiagram-AJRCARHV-CnQyI3oa.js → stateDiagram-AJRCARHV-jMZaPO--.js} +1 -1
  151. package/packages/remote-control-server/web/dist/assets/{stateDiagram-v2-BHNVJYJU-C2JPZVJm.js → stateDiagram-v2-BHNVJYJU-CoUWNtqD.js} +1 -1
  152. package/{dist/rcs-web/assets/timeline-definition-PNZ67QCA-D0_pTyDA.js → packages/remote-control-server/web/dist/assets/timeline-definition-PNZ67QCA-CbqngX3Z.js} +1 -1
  153. package/{dist/rcs-web/assets/vennDiagram-CIIHVFJN-Bw3XMj_p.js → packages/remote-control-server/web/dist/assets/vennDiagram-CIIHVFJN-F9m0_HxT.js} +1 -1
  154. package/{dist/rcs-web/assets/wardleyDiagram-YWT4CUSO-BfzfoPRo.js → packages/remote-control-server/web/dist/assets/wardleyDiagram-YWT4CUSO-d_Uua5Ta.js} +1 -1
  155. package/packages/remote-control-server/web/dist/assets/{xychartDiagram-2RQKCTM6-qGzDgnMk.js → xychartDiagram-2RQKCTM6-BDwGBZT6.js} +1 -1
  156. package/packages/remote-control-server/web/dist/index.html +2 -2
  157. package/dist/rcs-web/assets/ArtifactView-C8hU0vco.js +0 -6
  158. package/dist/rcs-web/assets/ArtifactsGallery-Cf_p454O.js +0 -431
  159. package/dist/rcs-web/assets/Login-7_3pI3By.js +0 -1
  160. package/dist/rcs-web/assets/channel-Bv_YGNa3.js +0 -1
  161. package/dist/rcs-web/assets/classDiagram-4FO5ZUOK-CdtEfsP5.js +0 -1
  162. package/dist/rcs-web/assets/classDiagram-v2-Q7XG4LA2-CdtEfsP5.js +0 -1
  163. package/dist/rcs-web/assets/main-B77FMrue.css +0 -1
  164. package/dist/rcs-web/assets/main-DfNbuMTS.js +0 -265
  165. package/packages/remote-control-server/web/dist/assets/ArtifactView-C8hU0vco.js +0 -6
  166. package/packages/remote-control-server/web/dist/assets/ArtifactsGallery-Cf_p454O.js +0 -431
  167. package/packages/remote-control-server/web/dist/assets/Login-7_3pI3By.js +0 -1
  168. package/packages/remote-control-server/web/dist/assets/channel-Bv_YGNa3.js +0 -1
  169. package/packages/remote-control-server/web/dist/assets/classDiagram-4FO5ZUOK-CdtEfsP5.js +0 -1
  170. package/packages/remote-control-server/web/dist/assets/classDiagram-v2-Q7XG4LA2-CdtEfsP5.js +0 -1
  171. package/packages/remote-control-server/web/dist/assets/main-B77FMrue.css +0 -1
  172. package/packages/remote-control-server/web/dist/assets/main-DfNbuMTS.js +0 -265
@@ -6,6 +6,8 @@
6
6
  * npm package needs zero additional dependencies.
7
7
  *
8
8
  * Usage:
9
+ * slz rcs (zero-config: API key defaults to sk-slz)
10
+ * slz rcs one (single-user mode: admin/admin123, workers auto-owned)
9
11
  * RCS_API_KEYS=sk-1234 slz rcs
10
12
  */
11
13
  import { serve } from '@hono/node-server'
@@ -22,18 +24,66 @@ import { closeAllConnections } from './transport/ws-handler.js'
22
24
  import { closeAllAcpConnections } from './transport/acp-ws-handler.js'
23
25
  import { closeAllRelayConnections } from './transport/acp-relay-handler.js'
24
26
  import { startDisconnectMonitor } from './services/disconnect-monitor.js'
27
+ import {
28
+ ensureSingleUserAdmin,
29
+ SINGLE_USER_DEFAULT_PASSWORD,
30
+ SINGLE_USER_USERNAME,
31
+ } from './services/single-user.js'
25
32
 
26
33
  export interface RcsServerOptions {
27
34
  apiKeys: string[]
28
35
  port?: number
29
36
  host?: string
37
+ /** Single-user mode (`slz rcs one`): auto-init admin account, workers
38
+ * auto-owned, registration disabled, host defaults to 127.0.0.1. */
39
+ singleUser?: boolean
30
40
  }
31
41
 
32
42
  export async function startRcsServer(opts: RcsServerOptions): Promise<void> {
33
43
  // Set env vars so config module picks them up
34
44
  process.env.RCS_API_KEYS = opts.apiKeys.join(',')
35
- if (opts.port) process.env.RCS_PORT = String(opts.port)
36
- if (opts.host) process.env.RCS_HOST = opts.host
45
+ // The config module may already be evaluated (static import above) — its
46
+ // env-derived values are frozen, so apiKeys/host/port must also be applied
47
+ // to the live object or they would silently no-op.
48
+ config.apiKeys = opts.apiKeys
49
+ if (opts.port) {
50
+ process.env.RCS_PORT = String(opts.port)
51
+ config.port = opts.port
52
+ }
53
+ if (opts.host) {
54
+ process.env.RCS_HOST = opts.host
55
+ config.host = opts.host
56
+ }
57
+ if (opts.singleUser) process.env.RCS_SINGLE_USER = 'true'
58
+ // The config module may already be evaluated (static import above) — its
59
+ // env-derived values are frozen, so opts.host/opts.port must also be
60
+ // applied to the live object or they would silently no-op.
61
+ if (opts.port) {
62
+ process.env.RCS_PORT = String(opts.port)
63
+ config.port = opts.port
64
+ }
65
+ if (opts.host) {
66
+ process.env.RCS_HOST = opts.host
67
+ config.host = opts.host
68
+ }
69
+ if (opts.singleUser) process.env.RCS_SINGLE_USER = 'true'
70
+
71
+ // Effective single-user mode: the `one` argument OR RCS_SINGLE_USER=true
72
+ // set before process start (config.singleUser already reflects the env).
73
+ const singleUser = opts.singleUser || config.singleUser
74
+
75
+ // The config module may already be evaluated (static import above), so
76
+ // reflect single-user mode on the live object too — request-time reads
77
+ // (allowRegistration, route gates) must see it regardless of import order.
78
+ if (singleUser) {
79
+ config.singleUser = true
80
+ config.allowRegistration = false
81
+ // Local convenience mode: bind loopback unless the operator explicitly
82
+ // chose a host (RCS_HOST at process start or opts.host above).
83
+ if (!process.env.RCS_HOST) {
84
+ config.host = '127.0.0.1'
85
+ }
86
+ }
37
87
 
38
88
  const port = config.port
39
89
  const host = config.host
@@ -65,6 +115,26 @@ export async function startRcsServer(opts: RcsServerOptions): Promise<void> {
65
115
  // Register all routes with Node.js serveStatic and upgradeWebSocket
66
116
  registerRoutes(app, serveStatic as any, upgradeWebSocket)
67
117
 
118
+ // Single-user mode: bootstrap the sole admin account (admin/admin123 on
119
+ // first deployment) BEFORE the server accepts requests, so every worker
120
+ // registration can resolve an owner and no request ever races the setup.
121
+ let singleUserAdmin: Awaited<ReturnType<typeof ensureSingleUserAdmin>> = null
122
+ if (singleUser) {
123
+ try {
124
+ singleUserAdmin = await ensureSingleUserAdmin()
125
+ } catch (err) {
126
+ console.error('[RCS] Single-user admin bootstrap failed:', err)
127
+ throw err
128
+ }
129
+ if (!singleUserAdmin) {
130
+ throw new Error(
131
+ '[RCS] Single-user mode requires an empty or admin-bearing users ' +
132
+ 'table, but the existing DB has neither. Run `slz rcs` (full mode) ' +
133
+ 'or point RCS_DB_PATH at a fresh database.',
134
+ )
135
+ }
136
+ }
137
+
68
138
  // Start HTTP server
69
139
  const server = serve({
70
140
  fetch: app.fetch,
@@ -88,11 +158,39 @@ export async function startRcsServer(opts: RcsServerOptions): Promise<void> {
88
158
  const webUiHost = host === '0.0.0.0' || host === '::' ? 'localhost' : host
89
159
  console.log(`[RCS] Web UI: http://${webUiHost}:${port}/code/`)
90
160
 
161
+ if (singleUser) {
162
+ console.log('[RCS] Single-user mode (slz rcs one):')
163
+ if (singleUserAdmin?.created) {
164
+ console.log(
165
+ `[RCS] admin account initialized — username: ${SINGLE_USER_USERNAME} password: ${SINGLE_USER_DEFAULT_PASSWORD}`,
166
+ )
167
+ console.log(
168
+ '[RCS] (local convenience default — change it after first login)',
169
+ )
170
+ } else {
171
+ console.log(
172
+ `[RCS] using existing account: ${singleUserAdmin?.username ?? SINGLE_USER_USERNAME}`,
173
+ )
174
+ }
175
+ console.log('[RCS] registration disabled — this is the only account')
176
+ console.log(
177
+ '[RCS] workers bind zero-config and are owned by this account (no claim)',
178
+ )
179
+ }
180
+
91
181
  const workerBaseUrl = config.baseUrl || `http://${webUiHost}:${port}`
92
182
  console.log('[RCS] Worker connect:')
93
- console.log(`[RCS] export SALUZI_BRIDGE_BASE_URL=${workerBaseUrl}`)
94
- console.log('[RCS] export SALUZI_BRIDGE_OAUTH_TOKEN=<your-api-key>')
95
- console.log('[RCS] slz')
183
+ console.log(
184
+ '[RCS] same host: zero config — workers default to http://localhost:3000 + sk-slz',
185
+ )
186
+ if (!singleUser) {
187
+ console.log(
188
+ `[RCS] remote host: export SALUZI_BRIDGE_BASE_URL=${workerBaseUrl}`,
189
+ )
190
+ console.log(
191
+ '[RCS] export SALUZI_BRIDGE_OAUTH_TOKEN=<your-api-key>',
192
+ )
193
+ }
96
194
 
97
195
  // Graceful shutdown
98
196
  function gracefulShutdown(signal: string) {
@@ -1,5 +1,6 @@
1
1
  import { Hono } from 'hono'
2
2
  import { randomUUID } from 'node:crypto'
3
+ import { config } from '../../config'
3
4
  import {
4
5
  registerEnvironment,
5
6
  deregisterEnvironment,
@@ -14,6 +15,7 @@ import {
14
15
  } from '../../auth/bridge-auth'
15
16
  import { getDb } from '../../db/sqlite'
16
17
  import { isSessionClosedStatus } from '../../services/session'
18
+ import { getSingleUserAdminUuid } from '../../services/single-user'
17
19
  import {
18
20
  storeBindEnvSessionsToTeam,
19
21
  storeGetEnvironment,
@@ -216,6 +218,15 @@ app.post('/bridge', acceptCliHeaders, bridgeAuth, async c => {
216
218
  }
217
219
  }
218
220
 
221
+ // Single-user mode (`slz rcs one`): every worker belongs to the sole
222
+ // admin account. Workers register with just the API key (no X-User-Id,
223
+ // no X-Username) — instead of falling into the claim flow below, the
224
+ // env is owned by the single admin immediately. Local convenience:
225
+ // the server binds 127.0.0.1, so the API key is the only credential.
226
+ if (config.singleUser && !ownerUserId && !teamId) {
227
+ ownerUserId = getSingleUserAdminUuid(db)
228
+ }
229
+
219
230
  // If neither X-User-Id nor the resolved userId yields an owner (or the
220
231
  // value is unresolvable), and X-Team-Id is also absent, the env is
221
232
  // "unowned" — a claim_token is generated and returned so the worker can
@@ -379,12 +379,18 @@ app.post('/logout', async c => {
379
379
 
380
380
  // GET /register-status — Whether self-registration is open
381
381
  app.get('/register-status', c => {
382
- return c.json({ allowed: config.allowRegistration })
382
+ return c.json({ allowed: config.allowRegistration && !config.singleUser })
383
383
  })
384
384
 
385
385
  // POST /register — Self-register a new member account (no team association).
386
386
  // Only available when RCS_ALLOW_REGISTRATION !== 'false'.
387
387
  app.post('/register', async c => {
388
+ if (config.singleUser) {
389
+ return c.json(
390
+ { error: 'Registration is disabled in single-user mode' },
391
+ 403,
392
+ )
393
+ }
388
394
  if (!config.allowRegistration) {
389
395
  return c.json({ error: 'Registration is disabled' }, 403)
390
396
  }
@@ -443,6 +449,15 @@ app.post('/register', async c => {
443
449
 
444
450
  // POST /join — Join via invitation token
445
451
  app.post('/join', async c => {
452
+ // Single-user mode: exactly one account exists, by design. New accounts
453
+ // would need an owner model the mode doesn't have — run full mode instead.
454
+ if (config.singleUser) {
455
+ return c.json(
456
+ { error: 'Invitations are disabled in single-user mode' },
457
+ 403,
458
+ )
459
+ }
460
+
446
461
  let body: Record<string, unknown>
447
462
  try {
448
463
  body = await c.req.json()
@@ -605,10 +620,13 @@ app.get('/setup-status', c => {
605
620
  const count = db.query('SELECT COUNT(*) as count FROM users').get() as {
606
621
  count: number
607
622
  }
608
- return c.json({ needsSetup: count.count === 0 })
623
+ return c.json({
624
+ needsSetup: count.count === 0,
625
+ singleUser: config.singleUser,
626
+ })
609
627
  } catch (err) {
610
628
  console.warn('[/setup-status] DB check failed:', err)
611
- return c.json({ needsSetup: true })
629
+ return c.json({ needsSetup: true, singleUser: config.singleUser })
612
630
  }
613
631
  })
614
632
 
@@ -0,0 +1,123 @@
1
+ import { randomUUID } from 'node:crypto'
2
+ import type { Database } from 'bun:sqlite'
3
+ import { getDb } from '../db/sqlite'
4
+ import { hashPasswordAsync } from '../auth/password'
5
+
6
+ /**
7
+ * Single-user mode (`slz rcs one`) — the server runs with exactly one
8
+ * admin account, auto-created on first deployment. Every worker that
9
+ * binds is owned by this account (no X-User-Id, no claim flow), and
10
+ * self-registration / invitation joins are disabled (see auth-routes).
11
+ * Intended for local deployments (host binds 127.0.0.1) where multi-user
12
+ * auth is ceremony, not protection.
13
+ */
14
+ export const SINGLE_USER_USERNAME = 'admin'
15
+ export const SINGLE_USER_DEFAULT_PASSWORD = 'admin123'
16
+
17
+ interface UserRow {
18
+ id: string
19
+ username: string
20
+ role: string
21
+ }
22
+
23
+ export interface SingleUserAdmin {
24
+ userId: string
25
+ username: string
26
+ /** True when this call created the account (first deployment). */
27
+ created: boolean
28
+ }
29
+
30
+ /**
31
+ * Idempotent bootstrap of the single-user admin account.
32
+ *
33
+ * Resolution order:
34
+ * 1. An existing user named `admin` — reuse it (previously initialized
35
+ * single-user DB, or a full-mode DB where someone already chose that
36
+ * name).
37
+ * 2. Any existing admin — reuse the first one (full-mode DB set up via
38
+ * /setup: that admin IS the single user; never mint a second account).
39
+ * 3. Empty users table — create `admin` / `admin123` with role=admin.
40
+ *
41
+ * Returns null only when the users table has rows but none is an admin
42
+ * and none is named `admin` (a corrupted/mixed DB) — the caller decides
43
+ * whether that is fatal.
44
+ */
45
+ export async function ensureSingleUserAdmin(
46
+ db?: Database,
47
+ ): Promise<SingleUserAdmin | null> {
48
+ const database = db ?? getDb()
49
+
50
+ const byName = database
51
+ .query('SELECT id, username, role FROM users WHERE username = $u LIMIT 1')
52
+ .get({ $u: SINGLE_USER_USERNAME }) as UserRow | null
53
+ if (byName) {
54
+ return { userId: byName.id, username: byName.username, created: false }
55
+ }
56
+
57
+ const anyAdmin = database
58
+ .query(
59
+ 'SELECT id, username, role FROM users WHERE role = $r ORDER BY created_at LIMIT 1',
60
+ )
61
+ .get({ $r: 'admin' }) as UserRow | null
62
+ if (anyAdmin) {
63
+ return { userId: anyAdmin.id, username: anyAdmin.username, created: false }
64
+ }
65
+
66
+ const count = database.query('SELECT COUNT(*) as count FROM users').get() as {
67
+ count: number
68
+ }
69
+ if (count.count > 0) {
70
+ // Users exist but no admin and no `admin` — cannot pick a single user
71
+ // without silently granting it admin rights. Let the caller surface it.
72
+ return null
73
+ }
74
+
75
+ const userId = `usr_${randomUUID().replace(/-/g, '')}`
76
+ const passwordHash = await hashPasswordAsync(SINGLE_USER_DEFAULT_PASSWORD)
77
+ const now = new Date().toISOString()
78
+ database
79
+ .query(
80
+ `INSERT OR IGNORE INTO users (id, username, password_hash, role, created_at)
81
+ VALUES ($id, $username, $passwordHash, 'admin', $now)`,
82
+ )
83
+ .run({
84
+ $id: userId,
85
+ $username: SINGLE_USER_USERNAME,
86
+ $passwordHash: passwordHash,
87
+ $now: now,
88
+ })
89
+
90
+ const inserted = database
91
+ .query('SELECT id, username, role FROM users WHERE username = $u LIMIT 1')
92
+ .get({ $u: SINGLE_USER_USERNAME }) as UserRow | null
93
+ if (!inserted) {
94
+ // INSERT OR IGNORE lost a race (concurrent bootstrap) — resolve the winner.
95
+ return ensureSingleUserAdmin(database)
96
+ }
97
+ return { userId: inserted.id, username: inserted.username, created: true }
98
+ }
99
+
100
+ /**
101
+ * Resolve the single-user admin's users.id for worker auto-ownership.
102
+ *
103
+ * Sync and cheap — called on every unowned worker registration in
104
+ * single-user mode. Returns null when no admin exists yet (bootstrap not
105
+ * run / DB error) — the caller falls back to the regular claim flow.
106
+ */
107
+ export function getSingleUserAdminUuid(db?: Database): string | null {
108
+ try {
109
+ const database = db ?? getDb()
110
+ const row = database
111
+ .query(
112
+ `SELECT id FROM users
113
+ WHERE username = $u OR role = $r
114
+ ORDER BY CASE WHEN username = $u THEN 0 ELSE 1 END, created_at
115
+ LIMIT 1`,
116
+ )
117
+ .get({ $u: SINGLE_USER_USERNAME, $r: 'admin' }) as { id: string } | null
118
+ return row?.id ?? null
119
+ } catch (err) {
120
+ console.error('[single-user] admin lookup failed:', err)
121
+ return null
122
+ }
123
+ }
@@ -65,6 +65,10 @@ export function normalizePayload(
65
65
 
66
66
  if (typeof p.uuid === 'string' && p.uuid) normalized.uuid = p.uuid
67
67
  if (typeof p.isSynthetic === 'boolean') normalized.isSynthetic = p.isSynthetic
68
+ // SA-mode artifact escape hatch: the web gallery's AI dispatch tags its
69
+ // user event so the worker can grant itself the artifact tool before the
70
+ // turn starts. Purely a hint — ACP/legacy consumers may ignore it.
71
+ if (p.artifact_dispatch === true) normalized.artifact_dispatch = true
68
72
  if (typeof p.status === 'string') normalized.status = p.status
69
73
  if (typeof p.subtype === 'string') normalized.subtype = p.subtype
70
74
 
@@ -26,6 +26,11 @@ export function toClientPayload(event: SessionEvent): Record<string, unknown> {
26
26
  uuid: messageUuid,
27
27
  session_id: event.sessionId,
28
28
  ...(payload?.isSynthetic === true ? { isSynthetic: true } : {}),
29
+ // SA-mode artifact escape hatch marker (web gallery AI dispatch) —
30
+ // read by bridge workers to grant the artifact tool pre-turn.
31
+ ...(payload?.artifact_dispatch === true
32
+ ? { artifact_dispatch: true }
33
+ : {}),
29
34
  message: {
30
35
  role: 'user',
31
36
  content,
@@ -1 +1 @@
1
- import{e as d,j as e}from"./vendor-DE_-CLIE.js";import{at as c,au as o,Q as m,ao as s,ag as l,x as u}from"./main-DfNbuMTS.js";import"./shiki-mEP5vQQu.js";import"./motion-BILbV7YQ.js";function j(){c();const[a,i]=d.useState([]),{myTeams:r,isLoading:x}=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,")"]}),x?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};
1
+ import{e as d,j as e}from"./vendor-DE_-CLIE.js";import{at as c,au as o,Q as m,ao as s,ag as l,x as u}from"./main-5C_gChTh.js";import"./shiki-mEP5vQQu.js";import"./motion-BILbV7YQ.js";function j(){c();const[a,i]=d.useState([]),{myTeams:r,isLoading:x}=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,")"]}),x?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,6 @@
1
+ import{e as a,j as t}from"./vendor-DE_-CLIE.js";import{ad as q,at as A,V as j,ao as r,K as M,ac as U,P as F,z as O}from"./main-5C_gChTh.js";import{S as R,E as K,C as G}from"./ArtifactsGallery-BaqQmrpp.js";import{C as P}from"./copy-CIv8ifYN.js";import"./shiki-mEP5vQQu.js";import"./motion-BILbV7YQ.js";import"./dialog-D__YHb1u.js";/**
2
+ * @license lucide-react v0.555.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const V=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],z=q("refresh-cw",V);let m=null;function H(n,l,e=0){y();const o=`/web/sessions/${n}/events`,c=new EventSource(o,{withCredentials:!0});m=c;let u=e;c.addEventListener("message",p=>{try{const d=JSON.parse(p.data);if(d.seqNum!==void 0&&d.seqNum<=u)return;d.seqNum!==void 0&&(u=d.seqNum),l(d)}catch{}}),c.addEventListener("error",()=>{console.warn("[SSE] error, readyState:",c.readyState),c.readyState===EventSource.CLOSED&&(c.close(),y())})}function y(){m&&(m.close(),m=null)}function J(n,l){const e=a.useRef(l);e.current=l;const o=a.useCallback(c=>{e.current(c)},[]);a.useEffect(()=>{if(n)return H(n,o),()=>{y()}},[n,o])}function ee({artifactId:n,onBack:l}){A();const[e,o]=a.useState(null),[c,u]=a.useState(""),[p,d]=a.useState(!1),[S,f]=a.useState(0),[w,h]=a.useState(!1),[g,C]=a.useState(null),[k,E]=a.useState("template"),[x,b]=a.useState(!1);a.useEffect(()=>{let s=!1;return j(n).then(i=>{s||o(i)}).catch(i=>{s||u(i instanceof Error?i.message:r("artifacts.viewNotFound"))}),()=>{s=!0}},[n]);const v=a.useCallback(()=>{j(n).then(s=>o(s)).catch(()=>{})},[n]),_=a.useCallback(s=>{var i;s.type==="artifact_updated"&&((i=s.payload)!=null&&i.id&&s.payload.id!==n||(v(),f(D=>D+1),b(!0)))},[n,v]);J((e==null?void 0:e.session_id)??null,_),a.useEffect(()=>{if(!x)return;const s=setTimeout(()=>b(!1),2500);return()=>clearTimeout(s)},[x]);const N=a.useCallback(s=>{e&&(C(e),E(s),h(!0))},[e]),$=a.useCallback(s=>{h(!1),o(i=>i?{...i,...s}:s),f(i=>i+1)},[]),L=a.useCallback(async()=>{if(window.confirm(r("artifacts.delete")+" — "+n.slice(0,8)+"…?"))try{await M(n),l()}catch(s){alert(s instanceof Error?s.message:r("artifacts.deleteFailed"))}},[n,l]),T=a.useCallback(async()=>{if(!e)return;await U(`${window.location.origin}${e.url}`)&&(d(!0),setTimeout(()=>d(!1),1500))},[e]);return c?t.jsx("div",{className:"flex flex-1 items-center justify-center",children:t.jsxs("div",{className:"text-center",children:[t.jsx("p",{className:"text-status-error",children:r("artifacts.viewNotFound")}),t.jsx("p",{className:"mt-1 text-xs text-text-muted",children:c}),t.jsx("button",{type:"button",onClick:l,className:"mt-4 rounded-md border border-border px-4 py-2 text-sm text-text-secondary hover:bg-surface-2",children:r("artifacts.backToGallery")})]})}):e?t.jsxs("div",{className:"flex h-full min-h-0 flex-col",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-2 border-b border-border bg-surface-1 px-4 py-2.5",children:[t.jsx("button",{type:"button",onClick:l,className:"text-sm text-text-muted hover:text-text-primary",children:r("artifacts.backToGallery")}),t.jsx("span",{className:"text-text-muted/40",children:"/"}),t.jsx("span",{className:"truncate font-medium text-text-primary",children:e.title||e.id.slice(0,12)}),t.jsx("span",{className:`rounded-full px-2 py-0.5 text-[11px] transition-colors ${x?"bg-status-active/15 text-status-active":"bg-surface-3 text-text-muted"}`,title:x?r("artifacts.view.liveUpdated"):void 0,children:x?`↻ v${e.version}`:`v${e.version}`}),e.session_id&&t.jsxs("a",{href:`/code/${e.session_id}`,className:"truncate font-mono text-[11px] text-text-muted hover:text-accent",title:e.session_id,children:[r("artifacts.session"),": ",e.session_id.slice(0,14),"…"]}),e.expires_at&&t.jsxs("span",{className:"text-[11px] text-text-muted",title:e.expires_at,children:[r("artifacts.expires"),": ",new Date(e.expires_at).toLocaleDateString()]}),t.jsxs("div",{className:"ml-auto flex items-center gap-1",children:[t.jsx("button",{type:"button",onClick:()=>f(s=>s+1),className:"inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs text-text-secondary hover:bg-surface-2 hover:text-text-primary",title:r("common.loading"),children:t.jsx(z,{className:"h-3.5 w-3.5"})}),t.jsx("button",{type:"button",onClick:()=>N("ai"),className:"inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs text-text-secondary hover:bg-surface-2 hover:text-text-primary",title:r("artifacts.aiUpdate"),children:t.jsx(R,{className:"h-3.5 w-3.5"})}),e.can_manage&&t.jsx("button",{type:"button",onClick:()=>N("template"),className:"inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs text-text-secondary hover:bg-surface-2 hover:text-text-primary",title:r("artifacts.edit"),children:t.jsx(F,{className:"h-3.5 w-3.5"})}),t.jsxs("button",{type:"button",onClick:T,className:"inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs text-text-secondary hover:bg-surface-2 hover:text-text-primary",title:`${r("artifacts.copyLink")} · ${r("artifacts.linkNotice")}`,children:[t.jsx(P,{className:"h-3.5 w-3.5"}),p&&t.jsx("span",{className:"text-status-active",children:r("artifacts.copied")})]}),t.jsx("a",{href:e.url,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs text-text-secondary hover:bg-surface-2 hover:text-text-primary",title:r("artifacts.openInNewTab"),children:t.jsx(K,{className:"h-3.5 w-3.5"})}),t.jsx("button",{type:"button",onClick:L,className:"inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs text-text-secondary hover:bg-status-error/10 hover:text-status-error",title:r("artifacts.delete"),children:t.jsx(O,{className:"h-3.5 w-3.5"})})]})]}),t.jsx("iframe",{src:`${e.url}${e.url.includes("?")?"&":"?"}_=${Date.now()}`,title:e.title||e.id,className:"min-h-0 w-full flex-1 border-0 bg-white",sandbox:"allow-scripts allow-popups allow-forms"},S),t.jsx(G,{open:w,onClose:()=>h(!1),onCreated:$,editArtifact:g,initialMode:k})]}):t.jsx("div",{className:"flex flex-1 items-center justify-center text-text-muted",children:r("common.loading")})}export{ee as ArtifactView};