@saluzi/saluzi-edu 0.7.3 → 0.7.5
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 +95 -63
- package/dist/rcs-schema.sql +42 -0
- package/dist/rcs-web/assets/{AdminPanel-B9YWaqlO.js → AdminPanel-QjFUzKR-.js} +1 -1
- package/dist/rcs-web/assets/{ArtifactView-B8lAeS5B.js → ArtifactView-DSrHrqoO.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/ArtifactsGallery-CNd9-Awp.js → dist/rcs-web/assets/ArtifactsGallery-LD7hnmXQ.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/Claim-Dq08pl4W.js → dist/rcs-web/assets/Claim-rralKUvn.js} +1 -1
- package/dist/rcs-web/assets/{Dashboard-JZcrtByh.js → Dashboard-BhXzF4TR.js} +2 -2
- package/dist/rcs-web/assets/{Join-DgvRnpyb.js → Join-DYKrYQka.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/Login-CZbz6Wms.js → dist/rcs-web/assets/Login-Blmtx4In.js} +1 -1
- package/dist/rcs-web/assets/MemoriesGallery-CWyitPTS.js +1 -0
- package/dist/rcs-web/assets/{Register-DD7uiwEj.js → Register-CnZOK0Wa.js} +1 -1
- package/dist/rcs-web/assets/{RegisterEmpty-BrBfeQXp.js → RegisterEmpty-RNN7njqd.js} +2 -2
- package/dist/rcs-web/assets/{SessionDetail-BbnQBjP1.js → SessionDetail-BeZeeaGH.js} +19 -19
- package/dist/rcs-web/assets/{SessionVisibilityBadge-kSo9esvT.js → SessionVisibilityBadge-D976F6JX.js} +2 -2
- package/dist/rcs-web/assets/{Setup-Ca30VUSF.js → Setup-BFW58zKK.js} +1 -1
- package/dist/rcs-web/assets/{ShareLanding-C_vlxFAM.js → ShareLanding-BTLCFUy8.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/TeamDetail-8T_kKUcX.js → dist/rcs-web/assets/TeamDetail-DwZoGkMp.js} +2 -2
- package/dist/rcs-web/assets/{TeamList-DRXGQCJi.js → TeamList-DehdjKJu.js} +1 -1
- package/dist/rcs-web/assets/{TeamSettings-Byhon5C1.js → TeamSettings-DsZDvdLi.js} +1 -1
- package/dist/rcs-web/assets/{UserSearchInput-wixyd_8w.js → UserSearchInput-B-phMzno.js} +2 -2
- package/dist/rcs-web/assets/{UserSettings-Ds2retFk.js → UserSettings-po8VpRyO.js} +1 -1
- package/dist/rcs-web/assets/{arc-CThS8KNL.js → arc-yo8UpUoc.js} +1 -1
- package/dist/rcs-web/assets/{architectureDiagram-3BPJPVTR-Bko99SuX.js → architectureDiagram-3BPJPVTR-CAzjNMmM.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/blockDiagram-GPEHLZMM-CqCAgp0i.js → dist/rcs-web/assets/blockDiagram-GPEHLZMM-DRvlErcg.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/c4Diagram-AAUBKEIU-C1pGDG-L.js → dist/rcs-web/assets/c4Diagram-AAUBKEIU-CtqgfHXS.js} +1 -1
- package/dist/rcs-web/assets/channel-ByZbiIGl.js +1 -0
- package/dist/rcs-web/assets/{chunk-2J33WTMH-Bz0kJwEY.js → chunk-2J33WTMH-BnLSiOZc.js} +1 -1
- package/dist/rcs-web/assets/{chunk-4BX2VUAB-DYnlidI7.js → chunk-4BX2VUAB-CneZL39T.js} +1 -1
- package/dist/rcs-web/assets/{chunk-55IACEB6-cMV4HRvm.js → chunk-55IACEB6-AZPro6N3.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/chunk-727SXJPM-Bgz9JRYO.js → dist/rcs-web/assets/chunk-727SXJPM-DtoifF_Q.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/chunk-AQP2D5EJ-DIFGJlEF.js → dist/rcs-web/assets/chunk-AQP2D5EJ-BsdfbS-v.js} +1 -1
- package/dist/rcs-web/assets/{chunk-FMBD7UC4-BUC7O7T0.js → chunk-FMBD7UC4-Ba_h1XJS.js} +1 -1
- package/dist/rcs-web/assets/{chunk-ND2GUHAM-kGqgVnBZ.js → chunk-ND2GUHAM-CtZuWp5S.js} +1 -1
- package/dist/rcs-web/assets/{chunk-QZHKN3VN-B01O0qXh.js → chunk-QZHKN3VN-DF-7EztA.js} +1 -1
- package/dist/rcs-web/assets/classDiagram-4FO5ZUOK-B7LKcjGg.js +1 -0
- package/dist/rcs-web/assets/classDiagram-v2-Q7XG4LA2-B7LKcjGg.js +1 -0
- package/dist/rcs-web/assets/{code-block-IT6T5CEO-CscK0pCh.js → code-block-IT6T5CEO-BB5vH41t.js} +1 -1
- package/dist/rcs-web/assets/{copy-CvmA5P_Q.js → copy-COu9cGeU.js} +1 -1
- package/dist/rcs-web/assets/{cose-bilkent-S5V4N54A-BsBsVccW.js → cose-bilkent-S5V4N54A-BvX9PMEk.js} +1 -1
- package/dist/rcs-web/assets/{dagre-BM42HDAG-Bn4B33S-.js → dagre-BM42HDAG-BsbASaLl.js} +1 -1
- package/dist/rcs-web/assets/{diagram-2AECGRRQ-DAuAIPR6.js → diagram-2AECGRRQ-zjhhcSia.js} +1 -1
- package/dist/rcs-web/assets/{diagram-5GNKFQAL-w3k2b4gC.js → diagram-5GNKFQAL-B0noeRZk.js} +1 -1
- package/dist/rcs-web/assets/{diagram-KO2AKTUF-CMLav2KT.js → diagram-KO2AKTUF-q4A3A-0G.js} +1 -1
- package/dist/rcs-web/assets/{diagram-LMA3HP47-D14sXWdh.js → diagram-LMA3HP47-Z8Q18cks.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/diagram-OG6HWLK6-BexFwBQa.js → dist/rcs-web/assets/diagram-OG6HWLK6-JYocDScA.js} +1 -1
- package/dist/rcs-web/assets/{dialog-B4hKrd7w.js → dialog-jGu3j2II.js} +1 -1
- package/dist/rcs-web/assets/{erDiagram-TEJ5UH35-BA8ANmoV.js → erDiagram-TEJ5UH35-E18rAGwe.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/flowDiagram-I6XJVG4X-dTQIvKsj.js → dist/rcs-web/assets/flowDiagram-I6XJVG4X-DBAHvZfJ.js} +1 -1
- package/dist/rcs-web/assets/{ganttDiagram-6RSMTGT7-8SDHYxXc.js → ganttDiagram-6RSMTGT7-1aqSO10M.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/gitGraphDiagram-PVQCEYII-Bu7LyvTG.js → dist/rcs-web/assets/gitGraphDiagram-PVQCEYII-uBw1naVm.js} +1 -1
- package/dist/rcs-web/assets/{infoDiagram-5YYISTIA-BuQuDvuX.js → infoDiagram-5YYISTIA-5ZFaePD-.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/ishikawaDiagram-YF4QCWOH-QjafGk8V.js → dist/rcs-web/assets/ishikawaDiagram-YF4QCWOH-DvjOCepo.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/journeyDiagram-JHISSGLW-_FOXjXDF.js → dist/rcs-web/assets/journeyDiagram-JHISSGLW-dnXupGdJ.js} +1 -1
- package/dist/rcs-web/assets/{kanban-definition-UN3LZRKU-CbqJqyY6.js → kanban-definition-UN3LZRKU-Co4PRiOE.js} +1 -1
- package/dist/rcs-web/assets/{linear-H6F41eb2.js → linear-B9BaViDA.js} +1 -1
- package/dist/rcs-web/assets/main-CP31AzxJ.css +1 -0
- package/dist/rcs-web/assets/{main-BopVSHhX.js → main-CqWvY7FG.js} +62 -62
- package/{packages/remote-control-server/web/dist/assets/mermaid-VLURNSYL-5FH_DIq9.js → dist/rcs-web/assets/mermaid-VLURNSYL-B-oU9mPp.js} +4 -4
- package/dist/rcs-web/assets/{mermaid.core-C004NitB.js → mermaid.core-DE67nE19.js} +5 -5
- package/dist/rcs-web/assets/{mindmap-definition-RKZ34NQL-utqEJ2a8.js → mindmap-definition-RKZ34NQL-BNYnuKJy.js} +1 -1
- package/dist/rcs-web/assets/{notifications-DOBs9HVf.js → notifications-BjTdDOj4.js} +1 -1
- package/dist/rcs-web/assets/{pieDiagram-4H26LBE5-OlbTwDZQ.js → pieDiagram-4H26LBE5-n1DnXCmk.js} +1 -1
- package/dist/rcs-web/assets/{quadrantDiagram-W4KKPZXB-BOe2DhrU.js → quadrantDiagram-W4KKPZXB-MTMv8wiE.js} +1 -1
- package/dist/rcs-web/assets/{refresh-cw-BSwpDl-7.js → refresh-cw-Ddd1BD9C.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/requirementDiagram-4Y6WPE33-s6V1yWUG.js → dist/rcs-web/assets/requirementDiagram-4Y6WPE33-6KBFW0WL.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/sankeyDiagram-5OEKKPKP-CdJD78Mx.js → dist/rcs-web/assets/sankeyDiagram-5OEKKPKP-CCvT5ejn.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/sequenceDiagram-3UESZ5HK-DvGV6Dhl.js → dist/rcs-web/assets/sequenceDiagram-3UESZ5HK-CiOW881y.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/stateDiagram-AJRCARHV-Bj-_Ulcn.js → dist/rcs-web/assets/stateDiagram-AJRCARHV-yeM7KZfg.js} +1 -1
- package/dist/rcs-web/assets/{stateDiagram-v2-BHNVJYJU-BLGWynk-.js → stateDiagram-v2-BHNVJYJU-CXddkakE.js} +1 -1
- package/dist/rcs-web/assets/{timeline-definition-PNZ67QCA-B6VAH6Ka.js → timeline-definition-PNZ67QCA-Dfgo8yRK.js} +1 -1
- package/dist/rcs-web/assets/{vennDiagram-CIIHVFJN-DUwaLI6R.js → vennDiagram-CIIHVFJN-CpW5v7I2.js} +1 -1
- package/dist/rcs-web/assets/{wardleyDiagram-YWT4CUSO-CBetJore.js → wardleyDiagram-YWT4CUSO-BsGpbaNe.js} +1 -1
- package/dist/rcs-web/assets/{workerType-BF4aY_R_.js → workerType-BURsA0u4.js} +1 -1
- package/dist/rcs-web/assets/{xychartDiagram-2RQKCTM6-BBnx6V66.js → xychartDiagram-2RQKCTM6-BZ9L5_e4.js} +1 -1
- package/dist/rcs-web/index.html +2 -2
- package/package.json +1 -1
- package/packages/remote-control-server/src/__tests__/memories.test.ts +654 -0
- package/packages/remote-control-server/src/db/rcs-schema.sql +42 -0
- package/packages/remote-control-server/src/registerRoutes.ts +6 -0
- package/packages/remote-control-server/src/routes/v1/memories.ts +132 -0
- package/packages/remote-control-server/src/routes/web/memories.ts +321 -0
- package/packages/remote-control-server/src/services/memories.ts +747 -0
- package/packages/remote-control-server/web/dist/assets/{AdminPanel-B9YWaqlO.js → AdminPanel-QjFUzKR-.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{ArtifactView-B8lAeS5B.js → ArtifactView-DSrHrqoO.js} +1 -1
- package/{dist/rcs-web/assets/ArtifactsGallery-CNd9-Awp.js → packages/remote-control-server/web/dist/assets/ArtifactsGallery-LD7hnmXQ.js} +1 -1
- package/{dist/rcs-web/assets/Claim-Dq08pl4W.js → packages/remote-control-server/web/dist/assets/Claim-rralKUvn.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{Dashboard-JZcrtByh.js → Dashboard-BhXzF4TR.js} +2 -2
- package/packages/remote-control-server/web/dist/assets/{Join-DgvRnpyb.js → Join-DYKrYQka.js} +1 -1
- package/{dist/rcs-web/assets/Login-CZbz6Wms.js → packages/remote-control-server/web/dist/assets/Login-Blmtx4In.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/MemoriesGallery-CWyitPTS.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{Register-DD7uiwEj.js → Register-CnZOK0Wa.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{RegisterEmpty-BrBfeQXp.js → RegisterEmpty-RNN7njqd.js} +2 -2
- package/packages/remote-control-server/web/dist/assets/{SessionDetail-BbnQBjP1.js → SessionDetail-BeZeeaGH.js} +19 -19
- package/packages/remote-control-server/web/dist/assets/{SessionVisibilityBadge-kSo9esvT.js → SessionVisibilityBadge-D976F6JX.js} +2 -2
- package/packages/remote-control-server/web/dist/assets/{Setup-Ca30VUSF.js → Setup-BFW58zKK.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{ShareLanding-C_vlxFAM.js → ShareLanding-BTLCFUy8.js} +1 -1
- package/{dist/rcs-web/assets/TeamDetail-8T_kKUcX.js → packages/remote-control-server/web/dist/assets/TeamDetail-DwZoGkMp.js} +2 -2
- package/packages/remote-control-server/web/dist/assets/{TeamList-DRXGQCJi.js → TeamList-DehdjKJu.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{TeamSettings-Byhon5C1.js → TeamSettings-DsZDvdLi.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{UserSearchInput-wixyd_8w.js → UserSearchInput-B-phMzno.js} +2 -2
- package/packages/remote-control-server/web/dist/assets/{UserSettings-Ds2retFk.js → UserSettings-po8VpRyO.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{arc-CThS8KNL.js → arc-yo8UpUoc.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{architectureDiagram-3BPJPVTR-Bko99SuX.js → architectureDiagram-3BPJPVTR-CAzjNMmM.js} +1 -1
- package/{dist/rcs-web/assets/blockDiagram-GPEHLZMM-CqCAgp0i.js → packages/remote-control-server/web/dist/assets/blockDiagram-GPEHLZMM-DRvlErcg.js} +1 -1
- package/{dist/rcs-web/assets/c4Diagram-AAUBKEIU-C1pGDG-L.js → packages/remote-control-server/web/dist/assets/c4Diagram-AAUBKEIU-CtqgfHXS.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/channel-ByZbiIGl.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{chunk-2J33WTMH-Bz0kJwEY.js → chunk-2J33WTMH-BnLSiOZc.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-4BX2VUAB-DYnlidI7.js → chunk-4BX2VUAB-CneZL39T.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-55IACEB6-cMV4HRvm.js → chunk-55IACEB6-AZPro6N3.js} +1 -1
- package/{dist/rcs-web/assets/chunk-727SXJPM-Bgz9JRYO.js → packages/remote-control-server/web/dist/assets/chunk-727SXJPM-DtoifF_Q.js} +1 -1
- package/{dist/rcs-web/assets/chunk-AQP2D5EJ-DIFGJlEF.js → packages/remote-control-server/web/dist/assets/chunk-AQP2D5EJ-BsdfbS-v.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-FMBD7UC4-BUC7O7T0.js → chunk-FMBD7UC4-Ba_h1XJS.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-ND2GUHAM-kGqgVnBZ.js → chunk-ND2GUHAM-CtZuWp5S.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-QZHKN3VN-B01O0qXh.js → chunk-QZHKN3VN-DF-7EztA.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/classDiagram-4FO5ZUOK-B7LKcjGg.js +1 -0
- package/packages/remote-control-server/web/dist/assets/classDiagram-v2-Q7XG4LA2-B7LKcjGg.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{code-block-IT6T5CEO-CscK0pCh.js → code-block-IT6T5CEO-BB5vH41t.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{copy-CvmA5P_Q.js → copy-COu9cGeU.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{cose-bilkent-S5V4N54A-BsBsVccW.js → cose-bilkent-S5V4N54A-BvX9PMEk.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{dagre-BM42HDAG-Bn4B33S-.js → dagre-BM42HDAG-BsbASaLl.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-2AECGRRQ-DAuAIPR6.js → diagram-2AECGRRQ-zjhhcSia.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-5GNKFQAL-w3k2b4gC.js → diagram-5GNKFQAL-B0noeRZk.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-KO2AKTUF-CMLav2KT.js → diagram-KO2AKTUF-q4A3A-0G.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-LMA3HP47-D14sXWdh.js → diagram-LMA3HP47-Z8Q18cks.js} +1 -1
- package/{dist/rcs-web/assets/diagram-OG6HWLK6-BexFwBQa.js → packages/remote-control-server/web/dist/assets/diagram-OG6HWLK6-JYocDScA.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{dialog-B4hKrd7w.js → dialog-jGu3j2II.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{erDiagram-TEJ5UH35-BA8ANmoV.js → erDiagram-TEJ5UH35-E18rAGwe.js} +1 -1
- package/{dist/rcs-web/assets/flowDiagram-I6XJVG4X-dTQIvKsj.js → packages/remote-control-server/web/dist/assets/flowDiagram-I6XJVG4X-DBAHvZfJ.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{ganttDiagram-6RSMTGT7-8SDHYxXc.js → ganttDiagram-6RSMTGT7-1aqSO10M.js} +1 -1
- package/{dist/rcs-web/assets/gitGraphDiagram-PVQCEYII-Bu7LyvTG.js → packages/remote-control-server/web/dist/assets/gitGraphDiagram-PVQCEYII-uBw1naVm.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{infoDiagram-5YYISTIA-BuQuDvuX.js → infoDiagram-5YYISTIA-5ZFaePD-.js} +1 -1
- package/{dist/rcs-web/assets/ishikawaDiagram-YF4QCWOH-QjafGk8V.js → packages/remote-control-server/web/dist/assets/ishikawaDiagram-YF4QCWOH-DvjOCepo.js} +1 -1
- package/{dist/rcs-web/assets/journeyDiagram-JHISSGLW-_FOXjXDF.js → packages/remote-control-server/web/dist/assets/journeyDiagram-JHISSGLW-dnXupGdJ.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{kanban-definition-UN3LZRKU-CbqJqyY6.js → kanban-definition-UN3LZRKU-Co4PRiOE.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{linear-H6F41eb2.js → linear-B9BaViDA.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/main-CP31AzxJ.css +1 -0
- package/packages/remote-control-server/web/dist/assets/{main-BopVSHhX.js → main-CqWvY7FG.js} +62 -62
- package/{dist/rcs-web/assets/mermaid-VLURNSYL-5FH_DIq9.js → packages/remote-control-server/web/dist/assets/mermaid-VLURNSYL-B-oU9mPp.js} +4 -4
- package/packages/remote-control-server/web/dist/assets/{mermaid.core-C004NitB.js → mermaid.core-DE67nE19.js} +5 -5
- package/packages/remote-control-server/web/dist/assets/{mindmap-definition-RKZ34NQL-utqEJ2a8.js → mindmap-definition-RKZ34NQL-BNYnuKJy.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{notifications-DOBs9HVf.js → notifications-BjTdDOj4.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{pieDiagram-4H26LBE5-OlbTwDZQ.js → pieDiagram-4H26LBE5-n1DnXCmk.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{quadrantDiagram-W4KKPZXB-BOe2DhrU.js → quadrantDiagram-W4KKPZXB-MTMv8wiE.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{refresh-cw-BSwpDl-7.js → refresh-cw-Ddd1BD9C.js} +1 -1
- package/{dist/rcs-web/assets/requirementDiagram-4Y6WPE33-s6V1yWUG.js → packages/remote-control-server/web/dist/assets/requirementDiagram-4Y6WPE33-6KBFW0WL.js} +1 -1
- package/{dist/rcs-web/assets/sankeyDiagram-5OEKKPKP-CdJD78Mx.js → packages/remote-control-server/web/dist/assets/sankeyDiagram-5OEKKPKP-CCvT5ejn.js} +1 -1
- package/{dist/rcs-web/assets/sequenceDiagram-3UESZ5HK-DvGV6Dhl.js → packages/remote-control-server/web/dist/assets/sequenceDiagram-3UESZ5HK-CiOW881y.js} +1 -1
- package/{dist/rcs-web/assets/stateDiagram-AJRCARHV-Bj-_Ulcn.js → packages/remote-control-server/web/dist/assets/stateDiagram-AJRCARHV-yeM7KZfg.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{stateDiagram-v2-BHNVJYJU-BLGWynk-.js → stateDiagram-v2-BHNVJYJU-CXddkakE.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{timeline-definition-PNZ67QCA-B6VAH6Ka.js → timeline-definition-PNZ67QCA-Dfgo8yRK.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{vennDiagram-CIIHVFJN-DUwaLI6R.js → vennDiagram-CIIHVFJN-CpW5v7I2.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{wardleyDiagram-YWT4CUSO-CBetJore.js → wardleyDiagram-YWT4CUSO-BsGpbaNe.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{workerType-BF4aY_R_.js → workerType-BURsA0u4.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{xychartDiagram-2RQKCTM6-BBnx6V66.js → xychartDiagram-2RQKCTM6-BZ9L5_e4.js} +1 -1
- package/packages/remote-control-server/web/dist/index.html +2 -2
- package/dist/rcs-web/assets/channel-D6RbJTfV.js +0 -1
- package/dist/rcs-web/assets/classDiagram-4FO5ZUOK-BlCPk6aR.js +0 -1
- package/dist/rcs-web/assets/classDiagram-v2-Q7XG4LA2-BlCPk6aR.js +0 -1
- package/dist/rcs-web/assets/main-C0n90aVY.css +0 -1
- package/packages/remote-control-server/web/dist/assets/channel-D6RbJTfV.js +0 -1
- package/packages/remote-control-server/web/dist/assets/classDiagram-4FO5ZUOK-BlCPk6aR.js +0 -1
- package/packages/remote-control-server/web/dist/assets/classDiagram-v2-Q7XG4LA2-BlCPk6aR.js +0 -1
- package/packages/remote-control-server/web/dist/assets/main-C0n90aVY.css +0 -1
|
@@ -16,6 +16,7 @@ import { consumeWebLoginCode } from './services/web-login'
|
|
|
16
16
|
|
|
17
17
|
// Routes
|
|
18
18
|
import v1Artifacts from './routes/v1/artifacts'
|
|
19
|
+
import v1Memories from './routes/v1/memories'
|
|
19
20
|
import v1Environments from './routes/v1/environments'
|
|
20
21
|
import v1EnvironmentsWork from './routes/v1/environments.work'
|
|
21
22
|
import v1Sessions from './routes/v1/sessions'
|
|
@@ -29,6 +30,7 @@ import webAuthRoutes from './routes/web/auth-routes'
|
|
|
29
30
|
import webSessions from './routes/web/sessions'
|
|
30
31
|
import webControl from './routes/web/control'
|
|
31
32
|
import webEnvironments from './routes/web/environments'
|
|
33
|
+
import webMemories from './routes/web/memories'
|
|
32
34
|
import webShares from './routes/web/shares'
|
|
33
35
|
import webTeams from './routes/web/teams'
|
|
34
36
|
|
|
@@ -103,6 +105,9 @@ export function registerRoutes(
|
|
|
103
105
|
// v1 Artifacts — CLI worker upload + public content read
|
|
104
106
|
app.route('/v1', v1Artifacts)
|
|
105
107
|
|
|
108
|
+
// v1 Memories — CLI worker injection pack + write-back sync
|
|
109
|
+
app.route('/v1', v1Memories)
|
|
110
|
+
|
|
106
111
|
// v1 Session routes
|
|
107
112
|
app.route('/v1/sessions', v1Sessions)
|
|
108
113
|
|
|
@@ -128,6 +133,7 @@ export function registerRoutes(
|
|
|
128
133
|
app.route('/web', webSessions)
|
|
129
134
|
app.route('/web', webControl)
|
|
130
135
|
app.route('/web', webEnvironments)
|
|
136
|
+
app.route('/web', webMemories)
|
|
131
137
|
|
|
132
138
|
// ACP protocol routes — created via factory with upgradeWebSocket
|
|
133
139
|
console.log('[RCS] ACP support enabled')
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { Hono } from 'hono'
|
|
2
|
+
import type { Context } from 'hono'
|
|
3
|
+
import { validateApiKey } from '../../auth/api-key'
|
|
4
|
+
import { verifyWorkerJwt } from '../../auth/jwt'
|
|
5
|
+
import { extractBearerToken } from '../../auth/middleware'
|
|
6
|
+
import { resolveExistingSessionId } from '../../services/session'
|
|
7
|
+
import {
|
|
8
|
+
MemoryError,
|
|
9
|
+
buildMemoryPack,
|
|
10
|
+
syncMemories,
|
|
11
|
+
type MemoryWriteBackEntry,
|
|
12
|
+
} from '../../services/memories'
|
|
13
|
+
|
|
14
|
+
const app = new Hono()
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* CLI/worker memory endpoints (API key or worker JWT auth — same credential
|
|
18
|
+
* surface as the v1 artifact upload route).
|
|
19
|
+
*
|
|
20
|
+
* - GET /v1/memories/pack?session_id= — the injection pack for a session:
|
|
21
|
+
* { files: { "<rel path>": "<file content>" } }. Empty pack for unknown
|
|
22
|
+
* sessions; the bridge treats an empty pack as "no memory override".
|
|
23
|
+
* - POST /v1/memories/sync — write-back from the bridge: { session_id,
|
|
24
|
+
* files: [{rel_path, content}] }. Identity is derived server-side from
|
|
25
|
+
* the session's owners; any owner/team fields in the body are ignored
|
|
26
|
+
* (anti-forgery). Entries land in the session owner's personal scope.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
function authenticateWorker(c: Context): boolean {
|
|
30
|
+
const token = extractBearerToken(c)
|
|
31
|
+
if (!token) return false
|
|
32
|
+
if (validateApiKey(token)) return true
|
|
33
|
+
return verifyWorkerJwt(token) !== null
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
app.get('/memories/pack', async c => {
|
|
37
|
+
if (!authenticateWorker(c)) {
|
|
38
|
+
return c.json(
|
|
39
|
+
{ error: { type: 'unauthorized', message: 'Invalid auth token' } },
|
|
40
|
+
401,
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const requested = c.req.query('session_id')
|
|
45
|
+
if (!requested) {
|
|
46
|
+
return c.json(
|
|
47
|
+
{ error: { type: 'bad_request', message: 'session_id is required' } },
|
|
48
|
+
400,
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
const sessionId = resolveExistingSessionId(requested)
|
|
52
|
+
if (!sessionId) {
|
|
53
|
+
// Unknown session → empty pack; the bridge proceeds without memory
|
|
54
|
+
// injection rather than failing the spawn.
|
|
55
|
+
return c.json({ files: {} }, 200)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return c.json(buildMemoryPack(sessionId), 200)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
app.post('/memories/sync', async c => {
|
|
62
|
+
if (!authenticateWorker(c)) {
|
|
63
|
+
return c.json(
|
|
64
|
+
{ error: { type: 'unauthorized', message: 'Invalid auth token' } },
|
|
65
|
+
401,
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let body: Record<string, unknown>
|
|
70
|
+
try {
|
|
71
|
+
body = await c.req.json()
|
|
72
|
+
} catch {
|
|
73
|
+
return c.json(
|
|
74
|
+
{ error: { type: 'bad_request', message: 'Invalid JSON body' } },
|
|
75
|
+
400,
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const requestedSessionId =
|
|
80
|
+
typeof body.session_id === 'string' ? body.session_id : ''
|
|
81
|
+
if (!requestedSessionId) {
|
|
82
|
+
return c.json(
|
|
83
|
+
{ error: { type: 'bad_request', message: 'session_id is required' } },
|
|
84
|
+
400,
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
const sessionId = resolveExistingSessionId(requestedSessionId)
|
|
88
|
+
if (!sessionId) {
|
|
89
|
+
return c.json(
|
|
90
|
+
{ error: { type: 'not_found', message: 'Unknown session' } },
|
|
91
|
+
404,
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const rawFiles = body.files
|
|
96
|
+
if (!Array.isArray(rawFiles)) {
|
|
97
|
+
return c.json(
|
|
98
|
+
{ error: { type: 'bad_request', message: 'files must be an array' } },
|
|
99
|
+
400,
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
const entries: MemoryWriteBackEntry[] = []
|
|
103
|
+
for (const item of rawFiles) {
|
|
104
|
+
if (
|
|
105
|
+
item &&
|
|
106
|
+
typeof item === 'object' &&
|
|
107
|
+
typeof (item as Record<string, unknown>).rel_path === 'string' &&
|
|
108
|
+
typeof (item as Record<string, unknown>).content === 'string'
|
|
109
|
+
) {
|
|
110
|
+
entries.push({
|
|
111
|
+
rel_path: (item as Record<string, unknown>).rel_path as string,
|
|
112
|
+
content: (item as Record<string, unknown>).content as string,
|
|
113
|
+
})
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (entries.length === 0) {
|
|
117
|
+
return c.json({ created: 0, updated: 0, skipped: 0 }, 200)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const result = syncMemories(sessionId, entries)
|
|
122
|
+
return c.json(result, 200)
|
|
123
|
+
} catch (err) {
|
|
124
|
+
if (err instanceof MemoryError) {
|
|
125
|
+
const status = err.code === 'no_owner' ? 409 : 400
|
|
126
|
+
return c.json({ error: { type: err.code, message: err.message } }, status)
|
|
127
|
+
}
|
|
128
|
+
throw err
|
|
129
|
+
}
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
export default app
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { Hono } from 'hono'
|
|
2
|
+
import { getDb } from '../../db/sqlite'
|
|
3
|
+
import { sessionAuth } from '../../auth/middleware'
|
|
4
|
+
import { SYSTEM_USER_ID } from '../../auth/constants'
|
|
5
|
+
import { isSessionVisibleToUser } from '../../services/session'
|
|
6
|
+
import {
|
|
7
|
+
MemoryError,
|
|
8
|
+
MEMORY_TYPES,
|
|
9
|
+
archiveMemory,
|
|
10
|
+
canManageMemory,
|
|
11
|
+
createMemory,
|
|
12
|
+
getMemoryRow,
|
|
13
|
+
isMemoryVisibleToUser,
|
|
14
|
+
listMemoriesForUser,
|
|
15
|
+
promoteMemoryToTeam,
|
|
16
|
+
updateMemory,
|
|
17
|
+
type MemoryType,
|
|
18
|
+
} from '../../services/memories'
|
|
19
|
+
|
|
20
|
+
const app = new Hono()
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Web-UI memory routes (mounted under /web with CSRF protection).
|
|
24
|
+
*
|
|
25
|
+
* - GET /web/memories — memories visible to the caller
|
|
26
|
+
* (?team_id= / ?scope=personal /
|
|
27
|
+
* ?session_id= / ?type=)
|
|
28
|
+
* - POST /web/memories — create (personal for self, or team)
|
|
29
|
+
* - GET /web/memories/:id — metadata + content + can_manage
|
|
30
|
+
* - PATCH /web/memories/:id — edit (manage permission)
|
|
31
|
+
* - DELETE /web/memories/:id — soft delete (manage permission)
|
|
32
|
+
* - POST /web/memories/:id/promote — personal → team (owner-initiated)
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
function isTeamMember(
|
|
36
|
+
userId: string,
|
|
37
|
+
teamId: string,
|
|
38
|
+
db: ReturnType<typeof getDb>,
|
|
39
|
+
): boolean {
|
|
40
|
+
const row = db
|
|
41
|
+
.query(
|
|
42
|
+
'SELECT 1 FROM team_members WHERE team_id = $teamId AND user_id = $userId',
|
|
43
|
+
)
|
|
44
|
+
.get({ $teamId: teamId, $userId: userId })
|
|
45
|
+
return !!row
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function forbidden(
|
|
49
|
+
c: { json: (body: unknown, status: number) => Response },
|
|
50
|
+
message: string,
|
|
51
|
+
) {
|
|
52
|
+
return c.json({ error: { type: 'forbidden', message } }, 403)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
app.get('/memories', sessionAuth, async c => {
|
|
56
|
+
const userId = c.get('userId') as string
|
|
57
|
+
const isAdmin = (c.get('isAdmin') as boolean) || userId === SYSTEM_USER_ID
|
|
58
|
+
const db = getDb()
|
|
59
|
+
|
|
60
|
+
const teamId = c.req.query('team_id')
|
|
61
|
+
const personalScope = c.req.query('scope') === 'personal'
|
|
62
|
+
const sessionId = c.req.query('session_id')
|
|
63
|
+
const type = c.req.query('type') as MemoryType | undefined
|
|
64
|
+
|
|
65
|
+
if (personalScope && teamId) {
|
|
66
|
+
return c.json(
|
|
67
|
+
{
|
|
68
|
+
error: {
|
|
69
|
+
type: 'bad_request',
|
|
70
|
+
message: 'scope=personal cannot be combined with team_id',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
400,
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
if (teamId && !isAdmin && !isTeamMember(userId, teamId, db)) {
|
|
77
|
+
return forbidden(c, 'Not a member of this team')
|
|
78
|
+
}
|
|
79
|
+
if (sessionId && !isAdmin && !isSessionVisibleToUser(sessionId, userId, db)) {
|
|
80
|
+
return forbidden(c, 'Not authorized for this session')
|
|
81
|
+
}
|
|
82
|
+
if (type && !MEMORY_TYPES.includes(type)) {
|
|
83
|
+
return c.json(
|
|
84
|
+
{ error: { type: 'bad_request', message: 'invalid type filter' } },
|
|
85
|
+
400,
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const rows = listMemoriesForUser(
|
|
90
|
+
userId,
|
|
91
|
+
{ teamId, personalScope, sessionId, type },
|
|
92
|
+
isAdmin,
|
|
93
|
+
)
|
|
94
|
+
return c.json(
|
|
95
|
+
rows.map(row => ({
|
|
96
|
+
...row,
|
|
97
|
+
can_manage: canManageMemory(row.id, userId, isAdmin),
|
|
98
|
+
})),
|
|
99
|
+
200,
|
|
100
|
+
)
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
app.get('/memories/:id', sessionAuth, async c => {
|
|
104
|
+
const userId = c.get('userId') as string
|
|
105
|
+
const isAdmin = (c.get('isAdmin') as boolean) || userId === SYSTEM_USER_ID
|
|
106
|
+
const id = c.req.param('id')!
|
|
107
|
+
|
|
108
|
+
const row = getMemoryRow(id)
|
|
109
|
+
if (!row) {
|
|
110
|
+
return c.json(
|
|
111
|
+
{ error: { type: 'not_found', message: 'Memory not found' } },
|
|
112
|
+
404,
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
// Single-fetch returns 404 (not 403) on no access — same existence-hiding
|
|
116
|
+
// convention as the caller-scoped artifact routes.
|
|
117
|
+
if (!isMemoryVisibleToUser(id, userId, isAdmin)) {
|
|
118
|
+
return c.json(
|
|
119
|
+
{ error: { type: 'not_found', message: 'Memory not found' } },
|
|
120
|
+
404,
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
return c.json(
|
|
124
|
+
{ ...row, can_manage: canManageMemory(id, userId, isAdmin) },
|
|
125
|
+
200,
|
|
126
|
+
)
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
app.post('/memories', sessionAuth, async c => {
|
|
130
|
+
const userId = c.get('userId') as string
|
|
131
|
+
const isAdmin = (c.get('isAdmin') as boolean) || userId === SYSTEM_USER_ID
|
|
132
|
+
const db = getDb()
|
|
133
|
+
|
|
134
|
+
let body: Record<string, unknown>
|
|
135
|
+
try {
|
|
136
|
+
body = await c.req.json()
|
|
137
|
+
} catch {
|
|
138
|
+
return c.json(
|
|
139
|
+
{ error: { type: 'bad_request', message: 'Invalid JSON' } },
|
|
140
|
+
400,
|
|
141
|
+
)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const name = typeof body.name === 'string' ? body.name.trim() : ''
|
|
145
|
+
const content = typeof body.content === 'string' ? body.content : ''
|
|
146
|
+
const type = typeof body.type === 'string' ? body.type : ''
|
|
147
|
+
const description =
|
|
148
|
+
typeof body.description === 'string' && body.description.trim()
|
|
149
|
+
? body.description.trim()
|
|
150
|
+
: undefined
|
|
151
|
+
if (!name || !content.trim()) {
|
|
152
|
+
return c.json(
|
|
153
|
+
{
|
|
154
|
+
error: {
|
|
155
|
+
type: 'bad_request',
|
|
156
|
+
message: 'name and content are required',
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
400,
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
if (!MEMORY_TYPES.includes(type as MemoryType)) {
|
|
163
|
+
return c.json(
|
|
164
|
+
{
|
|
165
|
+
error: {
|
|
166
|
+
type: 'bad_request',
|
|
167
|
+
message: `type must be one of ${MEMORY_TYPES.join(', ')}`,
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
400,
|
|
171
|
+
)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Scope: team_id → team memory (membership required); otherwise personal.
|
|
175
|
+
const teamId =
|
|
176
|
+
typeof body.team_id === 'string' && body.team_id ? body.team_id : undefined
|
|
177
|
+
if (teamId && !isAdmin && !isTeamMember(userId, teamId, db)) {
|
|
178
|
+
return forbidden(c, 'Not a member of this team')
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Optional session provenance — caller must see the session.
|
|
182
|
+
const sourceSessionId =
|
|
183
|
+
typeof body.source_session_id === 'string' && body.source_session_id
|
|
184
|
+
? body.source_session_id
|
|
185
|
+
: undefined
|
|
186
|
+
if (sourceSessionId && !isSessionVisibleToUser(sourceSessionId, userId, db)) {
|
|
187
|
+
return forbidden(c, 'Not authorized for this session')
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
try {
|
|
191
|
+
const row = createMemory({
|
|
192
|
+
scopeKind: teamId ? 'team' : 'personal',
|
|
193
|
+
ownerUserId: teamId ? undefined : userId,
|
|
194
|
+
teamId,
|
|
195
|
+
name,
|
|
196
|
+
description,
|
|
197
|
+
type: type as MemoryType,
|
|
198
|
+
content,
|
|
199
|
+
sourceSessionId,
|
|
200
|
+
createdBy: userId,
|
|
201
|
+
})
|
|
202
|
+
const { content: _c, ...meta } = row
|
|
203
|
+
return c.json({ ...meta, can_manage: true }, 201)
|
|
204
|
+
} catch (err) {
|
|
205
|
+
if (err instanceof MemoryError) {
|
|
206
|
+
return c.json({ error: { type: err.code, message: err.message } }, 400)
|
|
207
|
+
}
|
|
208
|
+
throw err
|
|
209
|
+
}
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
app.patch('/memories/:id', sessionAuth, async c => {
|
|
213
|
+
const userId = c.get('userId') as string
|
|
214
|
+
const isAdmin = (c.get('isAdmin') as boolean) || userId === SYSTEM_USER_ID
|
|
215
|
+
const id = c.req.param('id')!
|
|
216
|
+
|
|
217
|
+
if (!getMemoryRow(id)) {
|
|
218
|
+
return c.json(
|
|
219
|
+
{ error: { type: 'not_found', message: 'Memory not found' } },
|
|
220
|
+
404,
|
|
221
|
+
)
|
|
222
|
+
}
|
|
223
|
+
if (!canManageMemory(id, userId, isAdmin)) {
|
|
224
|
+
return forbidden(c, 'Not authorized to edit this memory')
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
let body: Record<string, unknown>
|
|
228
|
+
try {
|
|
229
|
+
body = await c.req.json()
|
|
230
|
+
} catch {
|
|
231
|
+
return c.json(
|
|
232
|
+
{ error: { type: 'bad_request', message: 'Invalid JSON' } },
|
|
233
|
+
400,
|
|
234
|
+
)
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const params: {
|
|
238
|
+
name?: string
|
|
239
|
+
description?: string
|
|
240
|
+
content?: string
|
|
241
|
+
type?: MemoryType
|
|
242
|
+
} = {}
|
|
243
|
+
if (typeof body.name === 'string') params.name = body.name
|
|
244
|
+
if (typeof body.description === 'string')
|
|
245
|
+
params.description = body.description
|
|
246
|
+
if (typeof body.content === 'string') params.content = body.content
|
|
247
|
+
if (typeof body.type === 'string') params.type = body.type as MemoryType
|
|
248
|
+
|
|
249
|
+
try {
|
|
250
|
+
const updated = updateMemory(id, params)
|
|
251
|
+
if (!updated) {
|
|
252
|
+
return c.json(
|
|
253
|
+
{ error: { type: 'not_found', message: 'Memory not found' } },
|
|
254
|
+
404,
|
|
255
|
+
)
|
|
256
|
+
}
|
|
257
|
+
const { content: _c, ...meta } = updated
|
|
258
|
+
return c.json({ ...meta, can_manage: true }, 200)
|
|
259
|
+
} catch (err) {
|
|
260
|
+
if (err instanceof MemoryError) {
|
|
261
|
+
return c.json({ error: { type: err.code, message: err.message } }, 400)
|
|
262
|
+
}
|
|
263
|
+
throw err
|
|
264
|
+
}
|
|
265
|
+
})
|
|
266
|
+
|
|
267
|
+
app.delete('/memories/:id', sessionAuth, async c => {
|
|
268
|
+
const userId = c.get('userId') as string
|
|
269
|
+
const isAdmin = (c.get('isAdmin') as boolean) || userId === SYSTEM_USER_ID
|
|
270
|
+
const id = c.req.param('id')!
|
|
271
|
+
|
|
272
|
+
if (!getMemoryRow(id)) {
|
|
273
|
+
return c.json(
|
|
274
|
+
{ error: { type: 'not_found', message: 'Memory not found' } },
|
|
275
|
+
404,
|
|
276
|
+
)
|
|
277
|
+
}
|
|
278
|
+
if (!canManageMemory(id, userId, isAdmin)) {
|
|
279
|
+
return forbidden(c, 'Not authorized to delete this memory')
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
archiveMemory(id)
|
|
283
|
+
return c.json({ ok: true }, 200)
|
|
284
|
+
})
|
|
285
|
+
|
|
286
|
+
app.post('/memories/:id/promote', sessionAuth, async c => {
|
|
287
|
+
const userId = c.get('userId') as string
|
|
288
|
+
const id = c.req.param('id')!
|
|
289
|
+
|
|
290
|
+
let body: Record<string, unknown>
|
|
291
|
+
try {
|
|
292
|
+
body = await c.req.json()
|
|
293
|
+
} catch {
|
|
294
|
+
return c.json(
|
|
295
|
+
{ error: { type: 'bad_request', message: 'Invalid JSON' } },
|
|
296
|
+
400,
|
|
297
|
+
)
|
|
298
|
+
}
|
|
299
|
+
const teamId = typeof body.team_id === 'string' ? body.team_id : ''
|
|
300
|
+
if (!teamId) {
|
|
301
|
+
return c.json(
|
|
302
|
+
{ error: { type: 'bad_request', message: 'team_id is required' } },
|
|
303
|
+
400,
|
|
304
|
+
)
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
try {
|
|
308
|
+
const row = promoteMemoryToTeam(id, userId, teamId)
|
|
309
|
+
const { content: _c, ...meta } = row
|
|
310
|
+
return c.json({ ...meta, can_manage: true }, 200)
|
|
311
|
+
} catch (err) {
|
|
312
|
+
if (err instanceof MemoryError) {
|
|
313
|
+
const status =
|
|
314
|
+
err.code === 'not_found' ? 404 : err.code === 'forbidden' ? 403 : 400
|
|
315
|
+
return c.json({ error: { type: err.code, message: err.message } }, status)
|
|
316
|
+
}
|
|
317
|
+
throw err
|
|
318
|
+
}
|
|
319
|
+
})
|
|
320
|
+
|
|
321
|
+
export default app
|