@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.
- package/dist/cli.js +79 -72
- package/dist/rcs-web/assets/AdminPanel-CQU763nr.js +1 -0
- package/dist/rcs-web/assets/Dashboard-B1hQfqI9.js +1 -0
- package/dist/rcs-web/assets/Join-7hMl360t.js +1 -0
- package/{packages/remote-control-server/web/dist/assets/Login-0VGZs85I.js → dist/rcs-web/assets/Login-BE8mNc0U.js} +1 -1
- package/dist/rcs-web/assets/SessionDetail-B5C0o1YT.js +55 -0
- package/dist/rcs-web/assets/SessionVisibilityBadge-CQN3bJW4.js +11 -0
- package/dist/rcs-web/assets/{Setup-C0cjxXMt.js → Setup-CqZ5gEBQ.js} +1 -1
- package/dist/rcs-web/assets/{ShareLanding-DUZrreJ7.js → ShareLanding-DBC9gbJo.js} +1 -1
- package/dist/rcs-web/assets/TeamCreate-DSYdTaPe.js +1 -0
- package/dist/rcs-web/assets/TeamDetail-CmJGsgOP.js +1 -0
- package/dist/rcs-web/assets/TeamList-BMS_Qq8U.js +1 -0
- package/dist/rcs-web/assets/{TeamSettings-CNVwYwcp.js → TeamSettings-C0sYgCFT.js} +1 -1
- package/dist/rcs-web/assets/UserSettings-CqzeJ5cc.js +1 -0
- package/{packages/remote-control-server/web/dist/assets/arc-CJxirXEQ.js → dist/rcs-web/assets/arc-DBPKxYzS.js} +1 -1
- package/dist/rcs-web/assets/{architectureDiagram-3BPJPVTR-BZvIHrLA.js → architectureDiagram-3BPJPVTR-D88rj_js.js} +1 -1
- package/dist/rcs-web/assets/{blockDiagram-GPEHLZMM-3p0y3Ija.js → blockDiagram-GPEHLZMM-xzgUpRMn.js} +1 -1
- package/dist/rcs-web/assets/{c4Diagram-AAUBKEIU-Bmz9A1wn.js → c4Diagram-AAUBKEIU-vpg_EoPb.js} +1 -1
- package/dist/rcs-web/assets/channel-Daz3yMSu.js +1 -0
- package/dist/rcs-web/assets/{chunk-2J33WTMH-B8gQz22j.js → chunk-2J33WTMH-DXWsXvhS.js} +1 -1
- package/dist/rcs-web/assets/{chunk-4BX2VUAB-CgLEZsTU.js → chunk-4BX2VUAB-BtTxwj9K.js} +1 -1
- package/dist/rcs-web/assets/{chunk-55IACEB6-0mdE_-IS.js → chunk-55IACEB6-D2-Q95qg.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/chunk-727SXJPM-DdtjnIHR.js → dist/rcs-web/assets/chunk-727SXJPM-Ce3e5x8u.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/chunk-AQP2D5EJ-BtwFPk50.js → dist/rcs-web/assets/chunk-AQP2D5EJ-C0UbKVtd.js} +1 -1
- package/dist/rcs-web/assets/{chunk-FMBD7UC4-BcO9mQ0P.js → chunk-FMBD7UC4-BCwppVqh.js} +1 -1
- package/dist/rcs-web/assets/{chunk-ND2GUHAM-BvRq13S_.js → chunk-ND2GUHAM-CnOBwWrm.js} +1 -1
- package/dist/rcs-web/assets/{chunk-QZHKN3VN-D7GHkPpq.js → chunk-QZHKN3VN-CDdzB71P.js} +1 -1
- package/dist/rcs-web/assets/classDiagram-4FO5ZUOK-DufdcV1P.js +1 -0
- package/dist/rcs-web/assets/classDiagram-v2-Q7XG4LA2-DufdcV1P.js +1 -0
- package/dist/rcs-web/assets/{code-block-IT6T5CEO-B1p-vO-3.js → code-block-IT6T5CEO-C1_H_ztH.js} +1 -1
- package/dist/rcs-web/assets/copy-DXU1lQqc.js +6 -0
- package/{packages/remote-control-server/web/dist/assets/cose-bilkent-S5V4N54A-L0rUZuH5.js → dist/rcs-web/assets/cose-bilkent-S5V4N54A-BC6nfjTF.js} +1 -1
- package/dist/rcs-web/assets/{dagre-BM42HDAG-CHGuio22.js → dagre-BM42HDAG-CEPR_pRx.js} +1 -1
- package/dist/rcs-web/assets/{diagram-2AECGRRQ-DIDRyQk8.js → diagram-2AECGRRQ-fVMGnSYa.js} +1 -1
- package/dist/rcs-web/assets/{diagram-5GNKFQAL-CNubKb6P.js → diagram-5GNKFQAL-BPzN2rbK.js} +1 -1
- package/dist/rcs-web/assets/{diagram-KO2AKTUF-CzQh664-.js → diagram-KO2AKTUF-Boneg9n-.js} +1 -1
- package/dist/rcs-web/assets/{diagram-LMA3HP47-CWBR7-VG.js → diagram-LMA3HP47-B8AtvjO9.js} +1 -1
- package/dist/rcs-web/assets/{diagram-OG6HWLK6-BMHdlbcZ.js → diagram-OG6HWLK6-DjY7A8jK.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/erDiagram-TEJ5UH35-OgT8dC-K.js → dist/rcs-web/assets/erDiagram-TEJ5UH35-C1BEfKxk.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/flowDiagram-I6XJVG4X-DRrCY2oB.js → dist/rcs-web/assets/flowDiagram-I6XJVG4X-7TbI9MLV.js} +1 -1
- package/dist/rcs-web/assets/{ganttDiagram-6RSMTGT7-DctpzEKN.js → ganttDiagram-6RSMTGT7-CMAV0A01.js} +1 -1
- package/dist/rcs-web/assets/{gitGraphDiagram-PVQCEYII-5KpLszm9.js → gitGraphDiagram-PVQCEYII-DAlR8G81.js} +1 -1
- package/dist/rcs-web/assets/{infoDiagram-5YYISTIA-BAKD_Tt7.js → infoDiagram-5YYISTIA-0T0DAV4W.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/ishikawaDiagram-YF4QCWOH-VHOPG4Nc.js → dist/rcs-web/assets/ishikawaDiagram-YF4QCWOH-BAw8txlx.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/journeyDiagram-JHISSGLW-BtGih-ik.js → dist/rcs-web/assets/journeyDiagram-JHISSGLW-DWvYKwz-.js} +1 -1
- package/dist/rcs-web/assets/{kanban-definition-UN3LZRKU-BsEGZsD1.js → kanban-definition-UN3LZRKU-Qzqw1H5B.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/linear-Dj636PNG.js → dist/rcs-web/assets/linear-D2KIJoCI.js} +1 -1
- package/dist/rcs-web/assets/main-J6cPs2y8.js +253 -0
- package/dist/rcs-web/assets/{mermaid-VLURNSYL-DutpHHm9.js → mermaid-VLURNSYL-CxWk1wHz.js} +4 -4
- package/dist/rcs-web/assets/{mermaid.core-XHHf0pen.js → mermaid.core-C48YvKu4.js} +5 -5
- package/dist/rcs-web/assets/{mindmap-definition-RKZ34NQL-BBa8V_3g.js → mindmap-definition-RKZ34NQL-BfmcTuCA.js} +1 -1
- package/dist/rcs-web/assets/{pieDiagram-4H26LBE5-BuNEdo9H.js → pieDiagram-4H26LBE5-DVNZpnfb.js} +1 -1
- package/dist/rcs-web/assets/{quadrantDiagram-W4KKPZXB-CsJgyQIN.js → quadrantDiagram-W4KKPZXB-COL55Z3i.js} +1 -1
- package/dist/rcs-web/assets/{requirementDiagram-4Y6WPE33-DqMJZ914.js → requirementDiagram-4Y6WPE33-CFczYQ0a.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/sankeyDiagram-5OEKKPKP-CVsz09q2.js → dist/rcs-web/assets/sankeyDiagram-5OEKKPKP-BrQEv3WQ.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/sequenceDiagram-3UESZ5HK-BRp4Wddn.js → dist/rcs-web/assets/sequenceDiagram-3UESZ5HK-CMxtYmQu.js} +1 -1
- 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
- package/dist/rcs-web/assets/{stateDiagram-v2-BHNVJYJU-D77KfDr-.js → stateDiagram-v2-BHNVJYJU-Br0D-weX.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/timeline-definition-PNZ67QCA-De8bFWnE.js → dist/rcs-web/assets/timeline-definition-PNZ67QCA-DuWDwYBt.js} +1 -1
- package/dist/rcs-web/assets/{vennDiagram-CIIHVFJN-Dikwrn1L.js → vennDiagram-CIIHVFJN--7IV65HQ.js} +1 -1
- package/dist/rcs-web/assets/{wardleyDiagram-YWT4CUSO-DUzpiV6H.js → wardleyDiagram-YWT4CUSO-CVTgWbvT.js} +1 -1
- package/dist/rcs-web/assets/{xychartDiagram-2RQKCTM6-OZNbB32D.js → xychartDiagram-2RQKCTM6-B9om4xAF.js} +1 -1
- package/dist/rcs-web/index.html +1 -1
- package/package.json +1 -1
- package/packages/remote-control-server/src/__tests__/auth-login.test.ts +21 -4
- package/packages/remote-control-server/src/__tests__/auth-security.test.ts +12 -6
- package/packages/remote-control-server/src/__tests__/data-layer-round2.test.ts +12 -11
- package/packages/remote-control-server/src/__tests__/db-isolation.test.ts +61 -0
- package/packages/remote-control-server/src/__tests__/low-priority-fixes.test.ts +178 -0
- package/packages/remote-control-server/src/__tests__/middleware.test.ts +4 -4
- package/packages/remote-control-server/src/__tests__/route-mounting.test.ts +26 -8
- package/packages/remote-control-server/src/__tests__/security-fixes.test.ts +32 -27
- package/packages/remote-control-server/src/__tests__/security-round3.test.ts +5 -1
- package/packages/remote-control-server/src/__tests__/team-filter-api.test.ts +280 -0
- package/packages/remote-control-server/src/__tests__/team-session-env.test.ts +169 -0
- package/packages/remote-control-server/src/__tests__/teams.test.ts +7 -0
- package/packages/remote-control-server/src/auth/csrf.ts +1 -3
- package/packages/remote-control-server/src/auth/middleware.ts +13 -4
- package/packages/remote-control-server/src/index.ts +11 -8
- package/packages/remote-control-server/src/routes/v1/environments.ts +12 -9
- package/packages/remote-control-server/src/routes/v1/sessions.ts +1 -1
- package/packages/remote-control-server/src/routes/web/auth-routes.ts +3 -1
- package/packages/remote-control-server/src/routes/web/auth.ts +2 -1
- package/packages/remote-control-server/src/routes/web/environments.ts +22 -4
- package/packages/remote-control-server/src/routes/web/sessions.ts +24 -12
- package/packages/remote-control-server/src/routes/web/shares.ts +11 -2
- package/packages/remote-control-server/src/routes/web/teams.ts +6 -9
- package/packages/remote-control-server/src/services/environment.ts +8 -3
- package/packages/remote-control-server/src/services/session.ts +56 -45
- package/packages/remote-control-server/src/store.ts +128 -7
- package/packages/remote-control-server/src/types/api.ts +8 -1
- package/packages/remote-control-server/web/dist/assets/AdminPanel-CQU763nr.js +1 -0
- package/packages/remote-control-server/web/dist/assets/Dashboard-B1hQfqI9.js +1 -0
- package/packages/remote-control-server/web/dist/assets/Join-7hMl360t.js +1 -0
- package/{dist/rcs-web/assets/Login-0VGZs85I.js → packages/remote-control-server/web/dist/assets/Login-BE8mNc0U.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/SessionDetail-B5C0o1YT.js +55 -0
- package/packages/remote-control-server/web/dist/assets/SessionVisibilityBadge-CQN3bJW4.js +11 -0
- package/packages/remote-control-server/web/dist/assets/{Setup-C0cjxXMt.js → Setup-CqZ5gEBQ.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{ShareLanding-DUZrreJ7.js → ShareLanding-DBC9gbJo.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/TeamCreate-DSYdTaPe.js +1 -0
- package/packages/remote-control-server/web/dist/assets/TeamDetail-CmJGsgOP.js +1 -0
- package/packages/remote-control-server/web/dist/assets/TeamList-BMS_Qq8U.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{TeamSettings-CNVwYwcp.js → TeamSettings-C0sYgCFT.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/UserSettings-CqzeJ5cc.js +1 -0
- package/{dist/rcs-web/assets/arc-CJxirXEQ.js → packages/remote-control-server/web/dist/assets/arc-DBPKxYzS.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{architectureDiagram-3BPJPVTR-BZvIHrLA.js → architectureDiagram-3BPJPVTR-D88rj_js.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{blockDiagram-GPEHLZMM-3p0y3Ija.js → blockDiagram-GPEHLZMM-xzgUpRMn.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{c4Diagram-AAUBKEIU-Bmz9A1wn.js → c4Diagram-AAUBKEIU-vpg_EoPb.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/channel-Daz3yMSu.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{chunk-2J33WTMH-B8gQz22j.js → chunk-2J33WTMH-DXWsXvhS.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-4BX2VUAB-CgLEZsTU.js → chunk-4BX2VUAB-BtTxwj9K.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-55IACEB6-0mdE_-IS.js → chunk-55IACEB6-D2-Q95qg.js} +1 -1
- package/{dist/rcs-web/assets/chunk-727SXJPM-DdtjnIHR.js → packages/remote-control-server/web/dist/assets/chunk-727SXJPM-Ce3e5x8u.js} +1 -1
- package/{dist/rcs-web/assets/chunk-AQP2D5EJ-BtwFPk50.js → packages/remote-control-server/web/dist/assets/chunk-AQP2D5EJ-C0UbKVtd.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-FMBD7UC4-BcO9mQ0P.js → chunk-FMBD7UC4-BCwppVqh.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-ND2GUHAM-BvRq13S_.js → chunk-ND2GUHAM-CnOBwWrm.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-QZHKN3VN-D7GHkPpq.js → chunk-QZHKN3VN-CDdzB71P.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/classDiagram-4FO5ZUOK-DufdcV1P.js +1 -0
- package/packages/remote-control-server/web/dist/assets/classDiagram-v2-Q7XG4LA2-DufdcV1P.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{code-block-IT6T5CEO-B1p-vO-3.js → code-block-IT6T5CEO-C1_H_ztH.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/copy-DXU1lQqc.js +6 -0
- package/{dist/rcs-web/assets/cose-bilkent-S5V4N54A-L0rUZuH5.js → packages/remote-control-server/web/dist/assets/cose-bilkent-S5V4N54A-BC6nfjTF.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{dagre-BM42HDAG-CHGuio22.js → dagre-BM42HDAG-CEPR_pRx.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-2AECGRRQ-DIDRyQk8.js → diagram-2AECGRRQ-fVMGnSYa.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-5GNKFQAL-CNubKb6P.js → diagram-5GNKFQAL-BPzN2rbK.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-KO2AKTUF-CzQh664-.js → diagram-KO2AKTUF-Boneg9n-.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-LMA3HP47-CWBR7-VG.js → diagram-LMA3HP47-B8AtvjO9.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-OG6HWLK6-BMHdlbcZ.js → diagram-OG6HWLK6-DjY7A8jK.js} +1 -1
- package/{dist/rcs-web/assets/erDiagram-TEJ5UH35-OgT8dC-K.js → packages/remote-control-server/web/dist/assets/erDiagram-TEJ5UH35-C1BEfKxk.js} +1 -1
- package/{dist/rcs-web/assets/flowDiagram-I6XJVG4X-DRrCY2oB.js → packages/remote-control-server/web/dist/assets/flowDiagram-I6XJVG4X-7TbI9MLV.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{ganttDiagram-6RSMTGT7-DctpzEKN.js → ganttDiagram-6RSMTGT7-CMAV0A01.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{gitGraphDiagram-PVQCEYII-5KpLszm9.js → gitGraphDiagram-PVQCEYII-DAlR8G81.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{infoDiagram-5YYISTIA-BAKD_Tt7.js → infoDiagram-5YYISTIA-0T0DAV4W.js} +1 -1
- package/{dist/rcs-web/assets/ishikawaDiagram-YF4QCWOH-VHOPG4Nc.js → packages/remote-control-server/web/dist/assets/ishikawaDiagram-YF4QCWOH-BAw8txlx.js} +1 -1
- package/{dist/rcs-web/assets/journeyDiagram-JHISSGLW-BtGih-ik.js → packages/remote-control-server/web/dist/assets/journeyDiagram-JHISSGLW-DWvYKwz-.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{kanban-definition-UN3LZRKU-BsEGZsD1.js → kanban-definition-UN3LZRKU-Qzqw1H5B.js} +1 -1
- package/{dist/rcs-web/assets/linear-Dj636PNG.js → packages/remote-control-server/web/dist/assets/linear-D2KIJoCI.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/main-J6cPs2y8.js +253 -0
- package/packages/remote-control-server/web/dist/assets/{mermaid-VLURNSYL-DutpHHm9.js → mermaid-VLURNSYL-CxWk1wHz.js} +4 -4
- package/packages/remote-control-server/web/dist/assets/{mermaid.core-XHHf0pen.js → mermaid.core-C48YvKu4.js} +5 -5
- package/packages/remote-control-server/web/dist/assets/{mindmap-definition-RKZ34NQL-BBa8V_3g.js → mindmap-definition-RKZ34NQL-BfmcTuCA.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{pieDiagram-4H26LBE5-BuNEdo9H.js → pieDiagram-4H26LBE5-DVNZpnfb.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{quadrantDiagram-W4KKPZXB-CsJgyQIN.js → quadrantDiagram-W4KKPZXB-COL55Z3i.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{requirementDiagram-4Y6WPE33-DqMJZ914.js → requirementDiagram-4Y6WPE33-CFczYQ0a.js} +1 -1
- package/{dist/rcs-web/assets/sankeyDiagram-5OEKKPKP-CVsz09q2.js → packages/remote-control-server/web/dist/assets/sankeyDiagram-5OEKKPKP-BrQEv3WQ.js} +1 -1
- package/{dist/rcs-web/assets/sequenceDiagram-3UESZ5HK-BRp4Wddn.js → packages/remote-control-server/web/dist/assets/sequenceDiagram-3UESZ5HK-CMxtYmQu.js} +1 -1
- 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
- package/packages/remote-control-server/web/dist/assets/{stateDiagram-v2-BHNVJYJU-D77KfDr-.js → stateDiagram-v2-BHNVJYJU-Br0D-weX.js} +1 -1
- package/{dist/rcs-web/assets/timeline-definition-PNZ67QCA-De8bFWnE.js → packages/remote-control-server/web/dist/assets/timeline-definition-PNZ67QCA-DuWDwYBt.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{vennDiagram-CIIHVFJN-Dikwrn1L.js → vennDiagram-CIIHVFJN--7IV65HQ.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{wardleyDiagram-YWT4CUSO-DUzpiV6H.js → wardleyDiagram-YWT4CUSO-CVTgWbvT.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{xychartDiagram-2RQKCTM6-OZNbB32D.js → xychartDiagram-2RQKCTM6-B9om4xAF.js} +1 -1
- package/packages/remote-control-server/web/dist/index.html +1 -1
- package/dist/rcs-web/assets/Dashboard-YYwDrKTN.js +0 -1
- package/dist/rcs-web/assets/Join-DKCP5X6X.js +0 -1
- package/dist/rcs-web/assets/SessionDetail-DmK-DfBQ.js +0 -50
- package/dist/rcs-web/assets/TeamCreate-B8ZV6EdY.js +0 -1
- package/dist/rcs-web/assets/TeamDetail-DBAsJ__i.js +0 -11
- package/dist/rcs-web/assets/TeamList-C-Hte4nV.js +0 -1
- package/dist/rcs-web/assets/UserSettings-DRdz9kYE.js +0 -1
- package/dist/rcs-web/assets/channel-DaI_n8dp.js +0 -1
- package/dist/rcs-web/assets/classDiagram-4FO5ZUOK-pYllpkOq.js +0 -1
- package/dist/rcs-web/assets/classDiagram-v2-Q7XG4LA2-pYllpkOq.js +0 -1
- package/dist/rcs-web/assets/main-CkqtCllF.js +0 -238
- package/dist/rcs-web/assets/useTeams-CqJOqEy1.js +0 -1
- package/dist/rcs-web/assets/workerType-DOQ0AHrq.js +0 -1
- package/packages/remote-control-server/web/dist/assets/Dashboard-YYwDrKTN.js +0 -1
- package/packages/remote-control-server/web/dist/assets/Join-DKCP5X6X.js +0 -1
- package/packages/remote-control-server/web/dist/assets/SessionDetail-DmK-DfBQ.js +0 -50
- package/packages/remote-control-server/web/dist/assets/TeamCreate-B8ZV6EdY.js +0 -1
- package/packages/remote-control-server/web/dist/assets/TeamDetail-DBAsJ__i.js +0 -11
- package/packages/remote-control-server/web/dist/assets/TeamList-C-Hte4nV.js +0 -1
- package/packages/remote-control-server/web/dist/assets/UserSettings-DRdz9kYE.js +0 -1
- package/packages/remote-control-server/web/dist/assets/channel-DaI_n8dp.js +0 -1
- package/packages/remote-control-server/web/dist/assets/classDiagram-4FO5ZUOK-pYllpkOq.js +0 -1
- package/packages/remote-control-server/web/dist/assets/classDiagram-v2-Q7XG4LA2-pYllpkOq.js +0 -1
- package/packages/remote-control-server/web/dist/assets/main-CkqtCllF.js +0 -238
- package/packages/remote-control-server/web/dist/assets/useTeams-CqJOqEy1.js +0 -1
- 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(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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(
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
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
|
-
|
|
207
|
-
)
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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{
|
|
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};
|