@cyberismo/backend 1.1.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/dist/app.js +19 -7
- package/dist/app.js.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/keycloak.d.ts +2 -3
- package/dist/auth/keycloak.js +6 -0
- package/dist/auth/keycloak.js.map +1 -1
- package/dist/auth/mock.d.ts +12 -8
- package/dist/auth/mock.js +119 -31
- package/dist/auth/mock.js.map +1 -1
- package/dist/auth/types.d.ts +7 -1
- package/dist/domain/cards/index.js +11 -84
- package/dist/domain/cards/index.js.map +1 -1
- package/dist/domain/cards/lib.js +2 -11
- package/dist/domain/cards/lib.js.map +1 -1
- package/dist/domain/cards/schema.js +9 -3
- package/dist/domain/cards/schema.js.map +1 -1
- package/dist/domain/cards/service.d.ts +2 -5
- package/dist/domain/cards/service.js +8 -15
- package/dist/domain/cards/service.js.map +1 -1
- package/dist/domain/events/index.d.ts +15 -0
- package/dist/domain/events/index.js +94 -0
- package/dist/domain/events/index.js.map +1 -0
- package/dist/domain/events/lifetime.d.ts +14 -0
- package/dist/domain/events/lifetime.js +25 -0
- package/dist/domain/events/lifetime.js.map +1 -0
- package/dist/domain/events/project-events.d.ts +67 -0
- package/dist/domain/events/project-events.js +200 -0
- package/dist/domain/events/project-events.js.map +1 -0
- package/dist/domain/events/schema.d.ts +22 -0
- package/dist/domain/events/schema.js +20 -0
- package/dist/domain/events/schema.js.map +1 -0
- package/dist/domain/project/index.js +17 -5
- package/dist/domain/project/index.js.map +1 -1
- package/dist/domain/project/schema.d.ts +8 -0
- package/dist/domain/project/schema.js +34 -6
- package/dist/domain/project/schema.js.map +1 -1
- package/dist/domain/project/service.d.ts +9 -5
- package/dist/domain/project/service.js +22 -16
- package/dist/domain/project/service.js.map +1 -1
- package/dist/domain/projects/index.js +5 -1
- package/dist/domain/projects/index.js.map +1 -1
- package/dist/domain/resources/index.js +74 -2
- package/dist/domain/resources/index.js.map +1 -1
- package/dist/domain/resources/schema.d.ts +8 -2
- package/dist/domain/resources/schema.js +6 -1
- package/dist/domain/resources/schema.js.map +1 -1
- package/dist/domain/resources/service.d.ts +13 -1
- package/dist/domain/resources/service.js +45 -2
- package/dist/domain/resources/service.js.map +1 -1
- package/dist/domain/skills/index.d.ts +15 -0
- package/dist/domain/skills/index.js +52 -0
- package/dist/domain/skills/index.js.map +1 -0
- package/dist/domain/skills/schema.d.ts +16 -0
- package/dist/domain/skills/schema.js +18 -0
- package/dist/domain/skills/schema.js.map +1 -0
- package/dist/domain/skills/service.d.ts +14 -0
- package/dist/domain/skills/service.js +16 -0
- package/dist/domain/skills/service.js.map +1 -0
- package/dist/export.d.ts +3 -2
- package/dist/export.js +53 -38
- package/dist/export.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/main.js +22 -7
- package/dist/main.js.map +1 -1
- package/dist/middleware/auth.d.ts +5 -0
- package/dist/middleware/auth.js +20 -4
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/commandManager.d.ts +2 -0
- package/dist/middleware/commandManager.js +1 -0
- package/dist/middleware/commandManager.js.map +1 -1
- package/dist/overlay.d.ts +45 -0
- package/dist/overlay.js +157 -0
- package/dist/overlay.js.map +1 -0
- package/dist/project-errors.d.ts +18 -0
- package/dist/project-errors.js +25 -0
- package/dist/project-errors.js.map +1 -0
- package/dist/project-registry.d.ts +9 -1
- package/dist/project-registry.js +37 -9
- package/dist/project-registry.js.map +1 -1
- package/dist/public/THIRD-PARTY.txt +528 -435
- package/dist/public/assets/__vite-browser-external-PaJ7c2l8.js +1 -0
- package/dist/public/assets/abnfDiagram-VCTEODGH-DB2dfOGe.js +1 -0
- package/dist/public/assets/architecture-7GRP2DOG-2V0X8hxt.js +1 -0
- package/dist/public/assets/architectureDiagram-5GKGNRK7-CRhUR2Ul.js +36 -0
- package/dist/public/assets/blockDiagram-I7D4REHJ-DJKsYF1v.js +129 -0
- package/dist/public/assets/c4Diagram-7LVT6UL2-BTwMzoAF.js +38 -0
- package/dist/public/assets/channel-C0JtPpMA.js +1 -0
- package/dist/public/assets/chunk-4HAMMTFA-DjjgrBsB.js +62 -0
- package/dist/public/assets/chunk-75Z2AOVW-CKqXRGJV.js +2 -0
- package/dist/public/assets/chunk-DU6HZSFF-iJGdiRt7.js +127 -0
- package/dist/public/assets/chunk-F27PBJKO-tDfs6zeO.js +1 -0
- package/dist/public/assets/chunk-FOHPRMQF-DzxwRta7.js +161 -0
- package/dist/public/assets/chunk-GMAD6QVW-DxHVEaGj.js +72 -0
- package/dist/public/assets/chunk-GVQU2GXP-AMxD4_Ta.js +1 -0
- package/dist/public/assets/{chunk-EX3LRPZG-Db0XYyxy.js → chunk-IMKFNOWR-0rz8QrYC.js} +2 -2
- package/dist/public/assets/chunk-L3NEJ4N5-BK3KAKMe.js +1 -0
- package/dist/public/assets/chunk-OSK3NFVY-B8MdrI_M.js +10 -0
- package/dist/public/assets/chunk-P2QGCYS3-D3J5AcHg.js +1 -0
- package/dist/public/assets/{chunk-VR4S4FIN-tUhbELKr.js → chunk-POPQ4Y6H-CsYg_XkK.js} +1 -1
- package/dist/public/assets/{chunk-HOUHSVGY-L35GPy9G.js → chunk-PWAF6VOD-D9cdEIZp.js} +1 -1
- package/dist/public/assets/chunk-SHT3W25Y-1jjokCf3.js +168 -0
- package/dist/public/assets/{chunk-MOJQB5TN-D1shKbMs.js → chunk-SVP7TREG-CIQMl7hl.js} +1 -1
- package/dist/public/assets/{chunk-V7JOEXUC-71b0ABpv.js → chunk-TICWLB2K-Ccsy2PYz.js} +3 -3
- package/dist/public/assets/chunk-XXDRQBXY-B7bWyHjt.js +1 -0
- package/dist/public/assets/classDiagram-ZZMXUADV-mWyXNAXi.js +1 -0
- package/dist/public/assets/classDiagram-v2-VYDZK3BY-mWyXNAXi.js +1 -0
- package/dist/public/assets/cose-bilkent-JH36ORCC-DPzc3Pv4.js +1 -0
- package/dist/public/assets/cynefin-OW5HDTMX-BIVDCYOU.js +1 -0
- package/dist/public/assets/cynefinDiagram-5FMLGOSQ-_V_nrIhD.js +62 -0
- package/dist/public/assets/cytoscape.esm-NgwPT4ez.js +321 -0
- package/dist/public/assets/dagre-C-rnJpZF.js +1 -0
- package/dist/public/assets/dagre-GXQ25YYZ-CJc0wc6f.js +4 -0
- package/dist/public/assets/diagram-S7CK7UJ4-25IjIKyo.js +30 -0
- package/dist/public/assets/diagram-UQ7AKVKN-C5VvsV7x.js +41 -0
- package/dist/public/assets/{diagram-FQU43EPY-DS-ryuRg.js → diagram-VSXAHHWV-Dw3rKVL_.js} +3 -3
- package/dist/public/assets/diagram-VX7I27RA-De_UQv8C.js +24 -0
- package/dist/public/assets/diagram-Z3DM3KII-Bd-65QQW.js +24 -0
- package/dist/public/assets/dist-BDCdLWk4.js +1 -0
- package/dist/public/assets/ebnfDiagram-PWID7BFC-CrxdET5U.js +1 -0
- package/dist/public/assets/erDiagram-RLTQ6QDP-BKo0Uyna.js +99 -0
- package/dist/public/assets/eventmodeling-NTZA5JFV-DKkAdJZd.js +1 -0
- package/dist/public/assets/flowDiagram-HODETNUW-CEE2wjdt.js +1 -0
- package/dist/public/assets/ganttDiagram-EL5Y4UJY-BHFn8vk0.js +292 -0
- package/dist/public/assets/gitGraph-4MIJSDKK-Bpvnb45u.js +1 -0
- package/dist/public/assets/{gitGraphDiagram-IHSO6WYX-CksvJvsQ.js → gitGraphDiagram-WWUBYQGX-Bw0EoxBY.js} +9 -9
- package/dist/public/assets/index-D3HS7YxF.js +2228 -0
- package/dist/public/assets/index-D6WqGtsG.js +27876 -0
- package/dist/public/assets/{index-COSSLZqt.css → index-Sv3WxZ_8.css} +1 -1
- package/dist/public/assets/info-A6RAGUB7-BvvG_zrk.js +1 -0
- package/dist/public/assets/infoDiagram-27XIBGKW-CtpdJmtL.js +2 -0
- package/dist/public/assets/{ishikawaDiagram-FXEZZL3T-CiLpASIW.js → ishikawaDiagram-5VMMS53U-KvT4DU1u.js} +2 -2
- package/dist/public/assets/journeyDiagram-3NMN7TZE-PhGRkXkq.js +139 -0
- package/dist/public/assets/{kanban-definition-HUTT4EX6-DYP_x6zD.js → kanban-definition-UXKFOSKX-Oyx5QgRq.js} +4 -4
- package/dist/public/assets/{katex-DolUETbr.js → katex-ZlcWpGUi.js} +3 -3
- package/dist/public/assets/{line-C8Sfsgt8.js → line-Dr41HTk1.js} +1 -1
- package/dist/public/assets/linear-DDBi9FwZ.js +1 -0
- package/dist/public/assets/mermaid-parser.core-DsIAxDBa.js +7 -0
- package/dist/public/assets/{mindmap-definition-LN4V7U3C-3IAd4gp3.js → mindmap-definition-YA3MSWOX-r8hvd6gP.js} +1 -1
- package/dist/public/assets/packet-AYTQ26CC-B0EpJ2Sc.js +1 -0
- package/dist/public/assets/path-B_0haWDX.js +1 -0
- package/dist/public/assets/pegDiagram-XKGWAZYB-DaNkQTQF.js +1 -0
- package/dist/public/assets/pie-WAS4IAKB-Dt2zttL9.js +1 -0
- package/dist/public/assets/pieDiagram-E7YTZNPT-x0XWEGbd.js +39 -0
- package/dist/public/assets/{quadrantDiagram-ABIIQ3AL-B3czMbdS.js → quadrantDiagram-AXDQQJYC-B9dlNtZl.js} +3 -3
- package/dist/public/assets/radar-RG4KPBEZ-DjbR4-5l.js +1 -0
- package/dist/public/assets/railroad-74A4TZTK-Bk3B5r_R.js +1 -0
- package/dist/public/assets/railroad-abnf-HS5TGJTU-DxaWfACD.js +1 -0
- package/dist/public/assets/railroad-ebnf-LZEXJU2U-DscxXZO0.js +1 -0
- package/dist/public/assets/railroad-peg-WCYAUIDC-BCWzRFzw.js +1 -0
- package/dist/public/assets/railroadDiagram-O6MQD6OU-DhwsoX6A.js +1 -0
- package/dist/public/assets/{requirementDiagram-TGXJPOKE-CmvJWy_S.js → requirementDiagram-BXWQKSXE-BiqZ6axf.js} +2 -2
- package/dist/public/assets/rolldown-runtime-B0Z9INg1.js +1 -0
- package/dist/public/assets/{rough.esm-By172zw-.js → rough.esm-Dy-Kn_BL.js} +1 -1
- package/dist/public/assets/{sankeyDiagram-HTMAVEWB-tAeOzMTn.js → sankeyDiagram-P5KCCOFB-C4rb2pZ9.js} +1 -1
- package/dist/public/assets/{sequenceDiagram-DBY2YBRQ-r0pwijM4.js → sequenceDiagram-WJ2MYXX4-DRKTnGD7.js} +9 -9
- package/dist/public/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/dist/public/assets/src-an_qrnIj.js +1 -0
- package/dist/public/assets/stateDiagram-D77RDMKH-xxdybg5Z.js +1 -0
- package/dist/public/assets/stateDiagram-v2-MP3YSRHH-CXzmJy_a.js +1 -0
- package/dist/public/assets/swimlanes-42K2YHIH-DyGI1gI6.js +1 -0
- package/dist/public/assets/swimlanesDiagram-VR7AAH4N-7hqb6VoW.js +8 -0
- package/dist/public/assets/timeline-definition-24CTP7MA-C2pIp77Q.js +120 -0
- package/dist/public/assets/treeView-Q6P3EWNA-CxRtaaB8.js +1 -0
- package/dist/public/assets/treemap-WGGIJYW6-G1IHiwTa.js +1 -0
- package/dist/public/assets/{vennDiagram-L72KCM5P-ti2qNcvo.js → vennDiagram-4TSXK5OY-CwimQRR9.js} +2 -2
- package/dist/public/assets/wardley-WFR3VGLG-DkQ3TjZX.js +1 -0
- package/dist/public/assets/{wardleyDiagram-EHGQE667-C8lblm8x.js → wardleyDiagram-VM6X3IG4-BOXpwLCv.js} +15 -15
- package/dist/public/assets/{xychartDiagram-FW5EYKEG-US-_k5eu.js → xychartDiagram-S5SC5T6Z-ChOPYsHc.js} +3 -3
- package/dist/public/index.html +19 -26
- package/dist/public/sbom.cdx.json +1 -0
- package/package.json +12 -13
- package/src/app.ts +19 -7
- package/src/auth/index.ts +1 -1
- package/src/auth/keycloak.ts +8 -3
- package/src/auth/mock.ts +141 -35
- package/src/auth/types.ts +8 -1
- package/src/domain/cards/index.ts +12 -102
- package/src/domain/cards/lib.ts +2 -14
- package/src/domain/cards/schema.ts +11 -3
- package/src/domain/cards/service.ts +9 -24
- package/src/domain/events/index.ts +112 -0
- package/src/domain/events/lifetime.ts +27 -0
- package/src/domain/events/project-events.ts +254 -0
- package/src/domain/events/schema.ts +21 -0
- package/src/domain/project/index.ts +31 -3
- package/src/domain/project/schema.ts +39 -6
- package/src/domain/project/service.ts +42 -17
- package/src/domain/projects/index.ts +5 -1
- package/src/domain/resources/index.ts +85 -2
- package/src/domain/resources/schema.ts +12 -2
- package/src/domain/resources/service.ts +55 -3
- package/src/domain/skills/index.ts +61 -0
- package/src/domain/skills/schema.ts +19 -0
- package/src/domain/skills/service.ts +18 -0
- package/src/export.ts +60 -42
- package/src/index.ts +3 -0
- package/src/main.ts +26 -8
- package/src/middleware/auth.ts +23 -4
- package/src/middleware/commandManager.ts +3 -0
- package/src/overlay.ts +175 -0
- package/src/project-errors.ts +33 -0
- package/src/project-registry.ts +41 -10
- package/dist/domain/cards/presence.d.ts +0 -50
- package/dist/domain/cards/presence.js +0 -93
- package/dist/domain/cards/presence.js.map +0 -1
- package/dist/public/assets/abnfDiagram-VRR7QNED-Djr4KJ5E.js +0 -1
- package/dist/public/assets/arc-DrR4k_H-.js +0 -1
- package/dist/public/assets/architecture-TIHT7OUA-XL6N-4o9.js +0 -1
- package/dist/public/assets/architectureDiagram-ZJ3FMSHR-DsMU2Uwa.js +0 -36
- package/dist/public/assets/blockDiagram-677ZJIJ3-DRBmQUQJ.js +0 -132
- package/dist/public/assets/c4Diagram-LMCZKHZV-E0rM02LD.js +0 -10
- package/dist/public/assets/channel-D5fnImJy.js +0 -1
- package/dist/public/assets/chunk-32BRIVSS-BnDY0aSV.js +0 -1
- package/dist/public/assets/chunk-52WLFC77-N5YugKaZ.js +0 -10
- package/dist/public/assets/chunk-5FCAYU7R-I3_t_Ic_.js +0 -1
- package/dist/public/assets/chunk-5HE753X5-Dxz40rzH.js +0 -1
- package/dist/public/assets/chunk-5JV3BV7I-CNwCKRLH.js +0 -1
- package/dist/public/assets/chunk-5TONJI2A-ezWQ_Z2j.js +0 -2
- package/dist/public/assets/chunk-7BUUIJ7U-Bb538aSH.js +0 -1
- package/dist/public/assets/chunk-BIQX33UG-DS132-R_.js +0 -1
- package/dist/public/assets/chunk-C7G6YPKG-BN-cNjoj.js +0 -1
- package/dist/public/assets/chunk-CQNSW5MT-D8Mn1I73.js +0 -1
- package/dist/public/assets/chunk-CYSBUYHQ-Dc64Dwdo.js +0 -1
- package/dist/public/assets/chunk-EMLP6XTP-aIK0V8GX.js +0 -1
- package/dist/public/assets/chunk-FWX5IMBZ-BF_P2-Do.js +0 -2
- package/dist/public/assets/chunk-ICXQ74PX-Bb8zaHde.js +0 -2
- package/dist/public/assets/chunk-JG7HCLWE-BtAXK3iQ.js +0 -2
- package/dist/public/assets/chunk-KEIR6QF5-DEvma7oi.js +0 -161
- package/dist/public/assets/chunk-MOZMSUNE-5FIqIBsY.js +0 -1
- package/dist/public/assets/chunk-OGEWGWER-BVIFy9xz.js +0 -1
- package/dist/public/assets/chunk-OSBZ3O6U-Cfd7kf1R.js +0 -1
- package/dist/public/assets/chunk-PUDLZKDR-Db3FSNR9.js +0 -156
- package/dist/public/assets/chunk-Q4XR5HBZ-BuKFRUzR.js +0 -70
- package/dist/public/assets/chunk-QBLGF6JB-DUGZXFh-.js +0 -1
- package/dist/public/assets/chunk-R7FJI6CG-D7mUd-qN.js +0 -1
- package/dist/public/assets/chunk-RYQCIY6F-C_3rESBd.js +0 -1
- package/dist/public/assets/chunk-U6XO7XAA-C3UhlwA1.js +0 -2
- package/dist/public/assets/chunk-VAUOI2AC-C-GBw18h.js +0 -1
- package/dist/public/assets/chunk-WYO6CB5R-BQoO62-B.js +0 -127
- package/dist/public/assets/chunk-XXDRQBXY-Co8n4ZHT.js +0 -1
- package/dist/public/assets/chunk-YOTPTUD7-DhCRKU1A.js +0 -1
- package/dist/public/assets/chunk-ZGVPDNZ5-hpz2Ryq5.js +0 -62
- package/dist/public/assets/chunk-ZIRB5QZD-BpeS1aZ7.js +0 -32
- package/dist/public/assets/classDiagram-OUVF2IWQ-CXdVorPK.js +0 -1
- package/dist/public/assets/classDiagram-v2-EOCWNBFH-CXdVorPK.js +0 -1
- package/dist/public/assets/colors-Cg5Vh3br.js +0 -1
- package/dist/public/assets/cose-bilkent-JH36ORCC-4GoRbloS.js +0 -1
- package/dist/public/assets/cynefin-VYW2F7L2-BPH-25fI.js +0 -1
- package/dist/public/assets/cynefinDiagram-TSTJHNR4-PEf16euv.js +0 -62
- package/dist/public/assets/cytoscape.esm-C3UvhD5t.js +0 -321
- package/dist/public/assets/dagre-Buvkdvvj.js +0 -1
- package/dist/public/assets/dagre-VKFMJZFB-DPsCMBF1.js +0 -4
- package/dist/public/assets/diagram-G47NLZAW-CzUoYkFf.js +0 -24
- package/dist/public/assets/diagram-NH7WQ7WH-MhGnE2fh.js +0 -24
- package/dist/public/assets/diagram-OA4YK3LP-CsQ9aFR_.js +0 -30
- package/dist/public/assets/diagram-WEI45ONY-Er3q49ew.js +0 -41
- package/dist/public/assets/dist-BzwexiH1.js +0 -1
- package/dist/public/assets/ebnfDiagram-CCIWWBDH-AnJAsk14.js +0 -1
- package/dist/public/assets/erDiagram-Q63AITRT-DulA16my.js +0 -85
- package/dist/public/assets/eventmodeling-45OFAUF4-CoIhTpHU.js +0 -1
- package/dist/public/assets/flowDiagram-23GEKE2U-BGMXUq18.js +0 -1
- package/dist/public/assets/ganttDiagram-NO4QXBWP-DAvCPT7_.js +0 -292
- package/dist/public/assets/gitGraph-TEB2WS4Q-BcPsZts5.js +0 -1
- package/dist/public/assets/index-Y8Ckwau7.js +0 -447
- package/dist/public/assets/info-DKCQHKI2-7VGzrAVB.js +0 -1
- package/dist/public/assets/infoDiagram-FWYZ7A6U-D_by7lSL.js +0 -2
- package/dist/public/assets/journeyDiagram-5HDEW3XC-DpvFmk7c.js +0 -139
- package/dist/public/assets/linear-BWTvbP1l.js +0 -1
- package/dist/public/assets/map-BaFkSB1l.js +0 -1
- package/dist/public/assets/mermaid-parser.core--8614tkK.js +0 -4
- package/dist/public/assets/ordinal-BdBDtYTt.js +0 -1
- package/dist/public/assets/packet-7NZHBO7P-KYt33H0C.js +0 -1
- package/dist/public/assets/path-HTXttWil.js +0 -1
- package/dist/public/assets/pegDiagram-2B236MQR-BQNFxYz2.js +0 -1
- package/dist/public/assets/pie-RZYD4A2V-xKz9s9I4.js +0 -1
- package/dist/public/assets/pieDiagram-ENE6RG2P-Cy13tg8_.js +0 -39
- package/dist/public/assets/radar-I7S5WNFK-B4QTX-fX.js +0 -1
- package/dist/public/assets/railroad-3IZDKUUU-Co_9rPVC.js +0 -1
- package/dist/public/assets/railroad-abnf-AHOZXSZD-Bhy_c3ol.js +0 -1
- package/dist/public/assets/railroad-ebnf-EBAXGLYW-B9ENjG34.js +0 -1
- package/dist/public/assets/railroad-peg-LSFZ7HO6-CyJxDBsB.js +0 -1
- package/dist/public/assets/railroadDiagram-RFXS5EU6-M2j5SJF2.js +0 -1
- package/dist/public/assets/range-EplFIxc7.js +0 -1
- package/dist/public/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +0 -1
- package/dist/public/assets/src-DOh7_en_.js +0 -1
- package/dist/public/assets/stateDiagram-2N3HPSRC-a9IdkSQG.js +0 -1
- package/dist/public/assets/stateDiagram-v2-6OUMAXLB-s2blPtZ-.js +0 -1
- package/dist/public/assets/swimlanes-5IMT3BWC-5w0Cdxk6.js +0 -2
- package/dist/public/assets/swimlanesDiagram-G3AALYLV-BWa-KRed.js +0 -8
- package/dist/public/assets/time-BM2d9MsQ.js +0 -1
- package/dist/public/assets/timeline-definition-FHXFAJF6-CvXlv_4Y.js +0 -120
- package/dist/public/assets/treeView-QDETBFTQ-B9cxjfpB.js +0 -1
- package/dist/public/assets/treemap-6X3UGDF4-BplEq4hB.js +0 -1
- package/dist/public/assets/treemap-BfjIY-m6.js +0 -1
- package/dist/public/assets/wardley-OPB4EBWU-BX2ghg5e.js +0 -1
- package/src/domain/cards/presence.ts +0 -124
package/README.md
CHANGED
|
@@ -1 +1,22 @@
|
|
|
1
1
|
Hono backend server for [Cyberismo Solution](https://cyberismo.com/solution)
|
|
2
|
+
|
|
3
|
+
## Mock identities
|
|
4
|
+
|
|
5
|
+
With `AUTH_MODE=mock` the roster is on: alice (Admin), bob (Editor) and carol
|
|
6
|
+
(Reader). `?user=<name>` sets a `mock-user` cookie and `?role=<role>` a
|
|
7
|
+
`mock-role` cookie, both sticky until `=default` clears them; the cookie is
|
|
8
|
+
per browser profile, so a tab cannot outrank the profile it lives in.
|
|
9
|
+
`?as=<name>` names a roster identity for that one request without touching
|
|
10
|
+
either cookie, which is how a second participant is scripted from a tab
|
|
11
|
+
already signed in as someone else; being a one-shot identity rather than the
|
|
12
|
+
tab's session, it is not subject to that expiry. `?ttl=<seconds>` gives
|
|
13
|
+
the session an expiry, which is how rotation and the 401 after it can be
|
|
14
|
+
watched without waiting out the default stream lifetime; `?ttl=default`
|
|
15
|
+
clears it. `?user=`, `?as=` and `?ttl=` all need the roster, so `cyberismo app`
|
|
16
|
+
sessions can neither switch identity nor expire; `?role=` works either way.
|
|
17
|
+
|
|
18
|
+
Locally: `pnpm dev`, then visit `/api/auth/me?user=alice` and `?user=bob` in
|
|
19
|
+
separate browser profiles, reloading the app after a change. In one profile,
|
|
20
|
+
open the app as Alice and drive Bob from the console with `?as=bob`: his SSE
|
|
21
|
+
stream yields a `connectionId`, and `PUT .../events/presence?as=bob` or
|
|
22
|
+
`PATCH .../cards/:key?as=bob` then shows up in Alice's tab.
|
package/dist/app.js
CHANGED
|
@@ -18,11 +18,13 @@ import calculationsRouter from './domain/calculations/index.js';
|
|
|
18
18
|
import cardsRouter from './domain/cards/index.js';
|
|
19
19
|
import cardTypesRouter from './domain/cardTypes/index.js';
|
|
20
20
|
import connectorsRouter from './domain/connectors/index.js';
|
|
21
|
+
import eventsRouter from './domain/events/index.js';
|
|
21
22
|
import fieldTypesRouter from './domain/fieldTypes/index.js';
|
|
22
23
|
import graphModelsRouter from './domain/graphModels/index.js';
|
|
23
24
|
import graphViewsRouter from './domain/graphViews/index.js';
|
|
24
25
|
import linkTypesRouter from './domain/linkTypes/index.js';
|
|
25
26
|
import reportsRouter from './domain/reports/index.js';
|
|
27
|
+
import skillsRouter from './domain/skills/index.js';
|
|
26
28
|
import templatesRouter from './domain/templates/index.js';
|
|
27
29
|
import treeRouter from './domain/tree/index.js';
|
|
28
30
|
import workflowsRouter from './domain/workflows/index.js';
|
|
@@ -37,9 +39,10 @@ import { isSSGContext } from 'hono/ssg';
|
|
|
37
39
|
import treeMiddleware from './middleware/tree.js';
|
|
38
40
|
import projectRouter from './domain/project/index.js';
|
|
39
41
|
import { createMcpRouter } from './domain/mcp/index.js';
|
|
42
|
+
import { writableProjects } from './overlay.js';
|
|
40
43
|
import { createAuthRouter } from './domain/auth/index.js';
|
|
41
44
|
import { createAuthMiddleware } from './middleware/auth.js';
|
|
42
|
-
import { MockAuthProvider
|
|
45
|
+
import { MockAuthProvider } from './auth/mock.js';
|
|
43
46
|
import { CommandManager, scanForProjects } from '@cyberismo/data-handler';
|
|
44
47
|
import { createProjectsRouter } from './domain/projects/index.js';
|
|
45
48
|
import { simpleMcpAuthRouter } from '@hono/mcp';
|
|
@@ -53,11 +56,13 @@ function createProjectScopedRoutes(middleware) {
|
|
|
53
56
|
projectScoped.route('/cards', cardsRouter);
|
|
54
57
|
projectScoped.route('/cardTypes', cardTypesRouter);
|
|
55
58
|
projectScoped.route('/connectors', connectorsRouter);
|
|
59
|
+
projectScoped.route('/events', eventsRouter);
|
|
56
60
|
projectScoped.route('/fieldTypes', fieldTypesRouter);
|
|
57
61
|
projectScoped.route('/graphModels', graphModelsRouter);
|
|
58
62
|
projectScoped.route('/graphViews', graphViewsRouter);
|
|
59
63
|
projectScoped.route('/linkTypes', linkTypesRouter);
|
|
60
64
|
projectScoped.route('/reports', reportsRouter);
|
|
65
|
+
projectScoped.route('/skills', skillsRouter);
|
|
61
66
|
projectScoped.route('/templates', templatesRouter);
|
|
62
67
|
projectScoped.route('/tree', treeRouter);
|
|
63
68
|
projectScoped.route('/workflows', workflowsRouter);
|
|
@@ -90,14 +95,14 @@ export function createApp(authProvider, registry, opts, exportMode = false, mult
|
|
|
90
95
|
return c.json({
|
|
91
96
|
staticMode: exportMode,
|
|
92
97
|
logoutUrl: process.env.APP_LOGOUT_URL || '',
|
|
93
|
-
presenceEnabled: process.env.APP_PRESENCE_ENABLED === 'true',
|
|
94
98
|
defaultProject: process.env.CYBERISMO_DEFAULT_PROJECT || undefined,
|
|
99
|
+
extensionUrl: process.env.APP_EXTENSION_URL || undefined,
|
|
95
100
|
});
|
|
96
101
|
});
|
|
97
|
-
//
|
|
98
|
-
// so role gating can be
|
|
102
|
+
// Mock-auth only: let `?role=` and, with the roster on, `?user=` set persistent
|
|
103
|
+
// cookies so role gating and identity can be switched locally without a restart.
|
|
99
104
|
if (authProvider instanceof MockAuthProvider) {
|
|
100
|
-
app.use(
|
|
105
|
+
app.use(authProvider.cookieMiddleware());
|
|
101
106
|
}
|
|
102
107
|
// Apply authentication middleware to all API and MCP routes
|
|
103
108
|
app.use('/api/*', createAuthMiddleware(authProvider));
|
|
@@ -129,7 +134,14 @@ export function createApp(authProvider, registry, opts, exportMode = false, mult
|
|
|
129
134
|
error: `Refusing to reset suspicious project path: ${resolvedProject}`,
|
|
130
135
|
}, 400);
|
|
131
136
|
}
|
|
132
|
-
|
|
137
|
+
// Windows holds transient locks on files the server has just touched,
|
|
138
|
+
// which surface as EBUSY on the final rmdir. Retry rather than fail the reset.
|
|
139
|
+
await fs.rm(resolvedProject, {
|
|
140
|
+
recursive: true,
|
|
141
|
+
force: true,
|
|
142
|
+
maxRetries: 5,
|
|
143
|
+
retryDelay: 100,
|
|
144
|
+
});
|
|
133
145
|
await fs.cp(goldenPath, resolvedProject, { recursive: true });
|
|
134
146
|
const projects = await scanForProjects(resolvedProject);
|
|
135
147
|
if (projects.length === 0) {
|
|
@@ -173,7 +185,7 @@ export function createApp(authProvider, registry, opts, exportMode = false, mult
|
|
|
173
185
|
app.route('/api/projects/:prefix', scoped);
|
|
174
186
|
}
|
|
175
187
|
// MCP endpoint for AI assistant integration
|
|
176
|
-
app.route('/mcp', createMcpRouter(registry));
|
|
188
|
+
app.route('/mcp', createMcpRouter(writableProjects(registry)));
|
|
177
189
|
app.use('*', serveStatic({
|
|
178
190
|
root: staticFrontendDirRelative,
|
|
179
191
|
}));
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AACF,OAAO,EAAE,IAAI,EAA0B,MAAM,MAAM,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,kBAAkB,MAAM,gCAAgC,CAAC;AAChE,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,eAAe,MAAM,6BAA6B,CAAC;AAC1D,OAAO,gBAAgB,MAAM,8BAA8B,CAAC;AAC5D,OAAO,gBAAgB,MAAM,8BAA8B,CAAC;AAC5D,OAAO,iBAAiB,MAAM,+BAA+B,CAAC;AAC9D,OAAO,gBAAgB,MAAM,8BAA8B,CAAC;AAC5D,OAAO,eAAe,MAAM,6BAA6B,CAAC;AAC1D,OAAO,aAAa,MAAM,2BAA2B,CAAC;AACtD,OAAO,eAAe,MAAM,6BAA6B,CAAC;AAC1D,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,eAAe,MAAM,6BAA6B,CAAC;AAC1D,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,eAAe,MAAM,6BAA6B,CAAC;AAC1D,OAAO,mBAAmB,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,OAAO,cAAc,MAAM,sBAAsB,CAAC;AAClD,OAAO,aAAa,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
12
|
*/
|
|
13
13
|
export type { AuthProvider } from './types.js';
|
|
14
|
-
export { MockAuthProvider
|
|
14
|
+
export { MockAuthProvider } from './mock.js';
|
|
15
15
|
export { KeycloakAuthProvider } from './keycloak.js';
|
|
16
16
|
export type { KeycloakConfig } from './keycloak.js';
|
package/dist/auth/index.js
CHANGED
|
@@ -10,6 +10,6 @@
|
|
|
10
10
|
You should have received a copy of the GNU Affero General Public
|
|
11
11
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
12
|
*/
|
|
13
|
-
export { MockAuthProvider
|
|
13
|
+
export { MockAuthProvider } from './mock.js';
|
|
14
14
|
export { KeycloakAuthProvider } from './keycloak.js';
|
|
15
15
|
//# sourceMappingURL=index.js.map
|
package/dist/auth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAGF,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAGF,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/auth/keycloak.d.ts
CHANGED
|
@@ -10,8 +10,7 @@
|
|
|
10
10
|
You should have received a copy of the GNU Affero General Public
|
|
11
11
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
12
|
*/
|
|
13
|
-
import type {
|
|
14
|
-
import type { AuthProvider } from './types.js';
|
|
13
|
+
import type { AuthProvider, AuthResult } from './types.js';
|
|
15
14
|
export interface KeycloakConfig {
|
|
16
15
|
issuer: string;
|
|
17
16
|
audience: string;
|
|
@@ -22,6 +21,6 @@ export declare class KeycloakAuthProvider implements AuthProvider {
|
|
|
22
21
|
private jwks;
|
|
23
22
|
constructor(config: KeycloakConfig);
|
|
24
23
|
private getJWKS;
|
|
25
|
-
authenticate(req: Request): Promise<
|
|
24
|
+
authenticate(req: Request): Promise<AuthResult | null>;
|
|
26
25
|
private mapRole;
|
|
27
26
|
}
|
package/dist/auth/keycloak.js
CHANGED
|
@@ -50,11 +50,17 @@ export class KeycloakAuthProvider {
|
|
|
50
50
|
if (!claims.email) {
|
|
51
51
|
throw new Error('Missing email');
|
|
52
52
|
}
|
|
53
|
+
// Optional in RFC 7519, and jwtVerify only checks it when present, so a
|
|
54
|
+
// token without one would rotate on jitter alone and never clamp.
|
|
55
|
+
if (!claims.exp) {
|
|
56
|
+
throw new Error('Missing exp');
|
|
57
|
+
}
|
|
53
58
|
return {
|
|
54
59
|
id: claims.sub,
|
|
55
60
|
email: claims.email,
|
|
56
61
|
name: claims.name ?? claims.preferred_username ?? 'Unknown',
|
|
57
62
|
role,
|
|
63
|
+
exp: claims.exp,
|
|
58
64
|
};
|
|
59
65
|
}
|
|
60
66
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keycloak.js","sourceRoot":"","sources":["../../src/auth/keycloak.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAEF,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"keycloak.js","sourceRoot":"","sources":["../../src/auth/keycloak.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/mock.d.ts
CHANGED
|
@@ -11,20 +11,24 @@
|
|
|
11
11
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
12
|
*/
|
|
13
13
|
import type { MiddlewareHandler } from 'hono';
|
|
14
|
-
import type {
|
|
15
|
-
import type { AuthProvider } from './types.js';
|
|
14
|
+
import type { AuthProvider, AuthResult } from './types.js';
|
|
16
15
|
export interface MockUserConfig {
|
|
17
16
|
name?: string;
|
|
18
17
|
email?: string;
|
|
18
|
+
roster?: boolean;
|
|
19
19
|
}
|
|
20
20
|
export declare const MOCK_ROLE_COOKIE = "mock-role";
|
|
21
|
+
export declare const MOCK_USER_COOKIE = "mock-user";
|
|
22
|
+
export declare const MOCK_EXP_COOKIE = "mock-exp";
|
|
23
|
+
export declare const MOCK_AS_PARAM = "as";
|
|
21
24
|
export declare class MockAuthProvider implements AuthProvider {
|
|
22
25
|
private readonly userConfig;
|
|
23
26
|
constructor(config?: MockUserConfig);
|
|
24
|
-
authenticate(req: Request): Promise<
|
|
27
|
+
authenticate(req: Request): Promise<AuthResult | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Turns ?role= and, with the roster on, ?user= and ?ttl= into cookies;
|
|
30
|
+
* "default" clears. ?ttl= seconds gives the session an expiry, which is
|
|
31
|
+
* what drives stream rotation and the 401 that follows it.
|
|
32
|
+
*/
|
|
33
|
+
cookieMiddleware(): MiddlewareHandler;
|
|
25
34
|
}
|
|
26
|
-
/**
|
|
27
|
-
* Dev-only middleware that turns `?role=<reader|editor|admin>` into a persistent
|
|
28
|
-
* `mock-role` cookie, and clears it on `?role=default`.
|
|
29
|
-
*/
|
|
30
|
-
export declare function mockRoleCookieMiddleware(): MiddlewareHandler;
|
package/dist/auth/mock.js
CHANGED
|
@@ -13,17 +13,80 @@
|
|
|
13
13
|
import { setCookie } from 'hono/cookie';
|
|
14
14
|
import { UserRole } from '../types.js';
|
|
15
15
|
export const MOCK_ROLE_COOKIE = 'mock-role';
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
export const MOCK_USER_COOKIE = 'mock-user';
|
|
17
|
+
export const MOCK_EXP_COOKIE = 'mock-exp';
|
|
18
|
+
export const MOCK_AS_PARAM = 'as';
|
|
19
|
+
const RESET_VALUE = 'default';
|
|
20
|
+
const MAX_TTL_SECONDS = 86_400;
|
|
21
|
+
// Mock sessions do not expire. Saying so with a distant deadline rather than
|
|
22
|
+
// no deadline keeps `exp` total for every consumer: it is far beyond the
|
|
23
|
+
// 30-minute stream lifetime, so computeLifetimeMs() min()s it away and
|
|
24
|
+
// rotation still falls to the jitter, exactly as an absent one did.
|
|
25
|
+
const NO_EXPIRY_SECONDS = 100 * 365 * 24 * 60 * 60;
|
|
26
|
+
function noExpiry() {
|
|
27
|
+
return Math.floor(Date.now() / 1000) + NO_EXPIRY_SECONDS;
|
|
28
|
+
}
|
|
29
|
+
const ROLE_ALIASES = new Map([
|
|
30
|
+
['reader', UserRole.Reader],
|
|
31
|
+
['editor', UserRole.Editor],
|
|
32
|
+
['admin', UserRole.Admin],
|
|
33
|
+
['connector', UserRole.Connector],
|
|
34
|
+
]);
|
|
35
|
+
// Opt-in: `cyberismo app` ships mock auth, where a roster identity would forge
|
|
36
|
+
// git commit authorship. Dev and e2e need several users in one backend process.
|
|
37
|
+
const MOCK_USERS = new Map([
|
|
38
|
+
[
|
|
39
|
+
'alice',
|
|
40
|
+
{
|
|
41
|
+
id: 'mock-user-alice',
|
|
42
|
+
name: 'Alice',
|
|
43
|
+
email: 'alice@example.com',
|
|
44
|
+
role: UserRole.Admin,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
[
|
|
48
|
+
'bob',
|
|
49
|
+
{
|
|
50
|
+
id: 'mock-user-bob',
|
|
51
|
+
name: 'Bob',
|
|
52
|
+
email: 'bob@example.com',
|
|
53
|
+
role: UserRole.Editor,
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
[
|
|
57
|
+
'carol',
|
|
58
|
+
{
|
|
59
|
+
id: 'mock-user-carol',
|
|
60
|
+
name: 'Carol',
|
|
61
|
+
email: 'carol@example.com',
|
|
62
|
+
role: UserRole.Reader,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
]);
|
|
23
66
|
function parseRole(value) {
|
|
24
67
|
if (!value)
|
|
25
68
|
return null;
|
|
26
|
-
return ROLE_ALIASES
|
|
69
|
+
return ROLE_ALIASES.get(value.toLowerCase()) ?? null;
|
|
70
|
+
}
|
|
71
|
+
function parseUser(value) {
|
|
72
|
+
if (!value)
|
|
73
|
+
return null;
|
|
74
|
+
return MOCK_USERS.get(value.toLowerCase()) ?? null;
|
|
75
|
+
}
|
|
76
|
+
/** An unreadable deadline is dropped rather than treated as long past, which
|
|
77
|
+
* would lock the user out with no request left to clear the cookie. */
|
|
78
|
+
function parseExpiry(value) {
|
|
79
|
+
const exp = Number(value);
|
|
80
|
+
return value && Number.isInteger(exp) && exp > 0 ? exp : null;
|
|
81
|
+
}
|
|
82
|
+
/** Seconds from now to the absolute epoch-second deadline to store. */
|
|
83
|
+
function toDeadline(value) {
|
|
84
|
+
const seconds = Number(value);
|
|
85
|
+
if (!Number.isInteger(seconds) || seconds <= 0)
|
|
86
|
+
return null;
|
|
87
|
+
if (seconds > MAX_TTL_SECONDS)
|
|
88
|
+
return null;
|
|
89
|
+
return String(Math.floor(Date.now() / 1000) + seconds);
|
|
27
90
|
}
|
|
28
91
|
function readCookie(header, name) {
|
|
29
92
|
if (!header)
|
|
@@ -38,40 +101,65 @@ function readCookie(header, name) {
|
|
|
38
101
|
}
|
|
39
102
|
return undefined;
|
|
40
103
|
}
|
|
104
|
+
function applyOverride(c, override, cookieName, toCookieValue) {
|
|
105
|
+
if (!override)
|
|
106
|
+
return;
|
|
107
|
+
if (override.toLowerCase() === RESET_VALUE) {
|
|
108
|
+
setCookie(c, cookieName, '', { path: '/', maxAge: 0 });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const value = toCookieValue(override);
|
|
112
|
+
if (value === null)
|
|
113
|
+
return;
|
|
114
|
+
setCookie(c, cookieName, value, { path: '/', sameSite: 'Lax' });
|
|
115
|
+
}
|
|
41
116
|
export class MockAuthProvider {
|
|
42
117
|
userConfig;
|
|
43
118
|
constructor(config) {
|
|
44
119
|
this.userConfig = config ?? {};
|
|
45
120
|
}
|
|
46
121
|
async authenticate(req) {
|
|
47
|
-
const
|
|
48
|
-
|
|
122
|
+
const cookies = req.headers.get('cookie');
|
|
123
|
+
const cookieRole = parseRole(readCookie(cookies, MOCK_ROLE_COOKIE));
|
|
124
|
+
if (this.userConfig.roster) {
|
|
125
|
+
// One-shot: a second identity from inside a tab already signed in as
|
|
126
|
+
// someone else, so neither the cookie nor the role override applies.
|
|
127
|
+
const asUser = parseUser(new URL(req.url).searchParams.get(MOCK_AS_PARAM));
|
|
128
|
+
if (asUser)
|
|
129
|
+
return { ...asUser, exp: noExpiry() };
|
|
130
|
+
}
|
|
131
|
+
const rosterUser = this.userConfig.roster
|
|
132
|
+
? parseUser(readCookie(cookies, MOCK_USER_COOKIE))
|
|
133
|
+
: null;
|
|
134
|
+
const expiry = this.userConfig.roster
|
|
135
|
+
? parseExpiry(readCookie(cookies, MOCK_EXP_COOKIE))
|
|
136
|
+
: null;
|
|
137
|
+
if (expiry !== null && expiry * 1000 <= Date.now())
|
|
138
|
+
return null;
|
|
139
|
+
const exp = expiry ?? noExpiry();
|
|
140
|
+
const identity = rosterUser ?? {
|
|
49
141
|
id: 'mock-user',
|
|
50
142
|
email: this.userConfig.email ?? 'admin@cyberismo.local',
|
|
51
143
|
name: this.userConfig.name ?? 'Local Admin',
|
|
52
|
-
role:
|
|
144
|
+
role: UserRole.Admin,
|
|
53
145
|
};
|
|
146
|
+
return { ...identity, role: cookieRole ?? identity.role, exp };
|
|
54
147
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (
|
|
65
|
-
|
|
148
|
+
/**
|
|
149
|
+
* Turns ?role= and, with the roster on, ?user= and ?ttl= into cookies;
|
|
150
|
+
* "default" clears. ?ttl= seconds gives the session an expiry, which is
|
|
151
|
+
* what drives stream rotation and the 401 that follows it.
|
|
152
|
+
*/
|
|
153
|
+
cookieMiddleware() {
|
|
154
|
+
return async (c, next) => {
|
|
155
|
+
const params = new URL(c.req.url).searchParams;
|
|
156
|
+
applyOverride(c, params.get('role'), MOCK_ROLE_COOKIE, (value) => parseRole(value) ? value.toLowerCase() : null);
|
|
157
|
+
if (this.userConfig.roster) {
|
|
158
|
+
applyOverride(c, params.get('user'), MOCK_USER_COOKIE, (value) => parseUser(value) ? value.toLowerCase() : null);
|
|
159
|
+
applyOverride(c, params.get('ttl'), MOCK_EXP_COOKIE, toDeadline);
|
|
66
160
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
sameSite: 'Lax',
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
await next();
|
|
75
|
-
};
|
|
161
|
+
await next();
|
|
162
|
+
};
|
|
163
|
+
}
|
|
76
164
|
}
|
|
77
165
|
//# sourceMappingURL=mock.js.map
|
package/dist/auth/mock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/auth/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAGF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/auth/mock.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/types.d.ts
CHANGED
|
@@ -11,6 +11,12 @@
|
|
|
11
11
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
12
|
*/
|
|
13
13
|
import type { UserInfo } from '../types.js';
|
|
14
|
+
export interface AuthResult extends UserInfo {
|
|
15
|
+
/** Credential deadline (epoch seconds). Always present: a provider whose
|
|
16
|
+
* sessions do not expire says so with a deadline far enough out to be
|
|
17
|
+
* inert, rather than leaving every consumer to handle its absence. */
|
|
18
|
+
exp: number;
|
|
19
|
+
}
|
|
14
20
|
export interface AuthProvider {
|
|
15
|
-
authenticate(req: Request): Promise<
|
|
21
|
+
authenticate(req: Request): Promise<AuthResult | null>;
|
|
16
22
|
}
|
|
@@ -11,16 +11,17 @@
|
|
|
11
11
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
12
|
*/
|
|
13
13
|
import { Hono } from 'hono';
|
|
14
|
-
import { streamSSE } from 'hono/streaming';
|
|
15
14
|
import { getCardDetails } from './lib.js';
|
|
16
15
|
import * as cardService from './service.js';
|
|
17
16
|
import { isSSGContext, ssgParams } from 'hono/ssg';
|
|
18
17
|
import { UserRole } from '../../types.js';
|
|
19
|
-
import { presenceStore } from './presence.js';
|
|
20
18
|
import { requireRole } from '../../middleware/auth.js';
|
|
21
19
|
import { zValidator } from '../../middleware/zvalidator.js';
|
|
22
20
|
import { createLinkSchema, removeLinkSchema, updateLinkSchema, exportCardPdfSchema, } from './schema.js';
|
|
23
21
|
const router = new Hono();
|
|
22
|
+
function notifyCardsUpdated(c, keys) {
|
|
23
|
+
c.get('events').cardsUpdated(keys, c.get('user'));
|
|
24
|
+
}
|
|
24
25
|
/**
|
|
25
26
|
* @swagger
|
|
26
27
|
* /api/cards:
|
|
@@ -198,7 +199,9 @@ router.patch('/:key', requireRole(UserRole.Editor), async (c) => {
|
|
|
198
199
|
const raw = c.req.query('raw');
|
|
199
200
|
const body = await c.req.json();
|
|
200
201
|
try {
|
|
201
|
-
await cardService.updateCard(commands, key, body)
|
|
202
|
+
if (await cardService.updateCard(commands, key, body)) {
|
|
203
|
+
notifyCardsUpdated(c, [key]);
|
|
204
|
+
}
|
|
202
205
|
const result = await getCardDetails(c.get('commands'), key, isSSGContext(c), raw?.toLowerCase() === 'true' ? true : false);
|
|
203
206
|
if (result.status === 200) {
|
|
204
207
|
return c.json(result.data);
|
|
@@ -332,6 +335,7 @@ router.post('/:key/attachments', requireRole(UserRole.Editor), async (c) => {
|
|
|
332
335
|
return c.json({ error: 'No files uploaded' }, 400);
|
|
333
336
|
}
|
|
334
337
|
const result = await cardService.uploadAttachments(commands, key, files);
|
|
338
|
+
notifyCardsUpdated(c, [key]);
|
|
335
339
|
return c.json(result);
|
|
336
340
|
}
|
|
337
341
|
catch (error) {
|
|
@@ -371,6 +375,7 @@ router.delete('/:key/attachments/:filename', requireRole(UserRole.Editor), async
|
|
|
371
375
|
const { key, filename } = c.req.param();
|
|
372
376
|
try {
|
|
373
377
|
const result = await cardService.removeAttachment(commands, key, filename);
|
|
378
|
+
notifyCardsUpdated(c, [key]);
|
|
374
379
|
return c.json(result);
|
|
375
380
|
}
|
|
376
381
|
catch (error) {
|
|
@@ -381,45 +386,6 @@ router.delete('/:key/attachments/:filename', requireRole(UserRole.Editor), async
|
|
|
381
386
|
}, 500);
|
|
382
387
|
}
|
|
383
388
|
});
|
|
384
|
-
/**
|
|
385
|
-
* @swagger
|
|
386
|
-
* /api/cards/{key}/attachments/{filename}/open:
|
|
387
|
-
* post:
|
|
388
|
-
* summary: Open an attachment using the system's default application
|
|
389
|
-
* parameters:
|
|
390
|
-
* - name: key
|
|
391
|
-
* in: path
|
|
392
|
-
* required: true
|
|
393
|
-
* schema:
|
|
394
|
-
* type: string
|
|
395
|
-
* - name: filename
|
|
396
|
-
* in: path
|
|
397
|
-
* required: true
|
|
398
|
-
* schema:
|
|
399
|
-
* type: string
|
|
400
|
-
* responses:
|
|
401
|
-
* 200:
|
|
402
|
-
* description: Attachment opened successfully
|
|
403
|
-
* 400:
|
|
404
|
-
* description: Invalid request
|
|
405
|
-
* 500:
|
|
406
|
-
* description: Server error
|
|
407
|
-
*/
|
|
408
|
-
router.post('/:key/attachments/:filename/open', requireRole(UserRole.Reader), async (c) => {
|
|
409
|
-
const commands = c.get('commands');
|
|
410
|
-
const { key, filename } = c.req.param();
|
|
411
|
-
try {
|
|
412
|
-
const result = await cardService.openAttachment(commands, key, filename);
|
|
413
|
-
return c.json(result);
|
|
414
|
-
}
|
|
415
|
-
catch (error) {
|
|
416
|
-
return c.json({
|
|
417
|
-
error: error instanceof Error
|
|
418
|
-
? error.message
|
|
419
|
-
: 'Failed to open attachment',
|
|
420
|
-
}, 500);
|
|
421
|
-
}
|
|
422
|
-
});
|
|
423
389
|
/**
|
|
424
390
|
* @swagger
|
|
425
391
|
* /api/cards/{key}/parse:
|
|
@@ -501,6 +467,7 @@ router.post('/:key/links', requireRole(UserRole.Editor), zValidator('json', crea
|
|
|
501
467
|
const { toCard, linkType, description, direction } = c.req.valid('json');
|
|
502
468
|
try {
|
|
503
469
|
const result = await cardService.createLink(commands, key, toCard, linkType, direction, description);
|
|
470
|
+
notifyCardsUpdated(c, [key, toCard]);
|
|
504
471
|
return c.json(result);
|
|
505
472
|
}
|
|
506
473
|
catch (error) {
|
|
@@ -546,6 +513,7 @@ router.delete('/:key/links', requireRole(UserRole.Editor), zValidator('json', re
|
|
|
546
513
|
const { toCard, linkType, description, direction } = c.req.valid('json');
|
|
547
514
|
try {
|
|
548
515
|
const result = await cardService.removeLink(commands, key, toCard, linkType, direction, description);
|
|
516
|
+
notifyCardsUpdated(c, [key, toCard]);
|
|
549
517
|
return c.json(result);
|
|
550
518
|
}
|
|
551
519
|
catch (error) {
|
|
@@ -601,6 +569,7 @@ router.put('/:key/links', requireRole(UserRole.Editor), zValidator('json', updat
|
|
|
601
569
|
const { toCard, linkType, description, direction, previousToCard, previousLinkType, previousDirection, previousDescription, } = c.req.valid('json');
|
|
602
570
|
try {
|
|
603
571
|
const result = await cardService.updateLink(commands, key, toCard, linkType, direction, previousToCard, previousLinkType, previousDirection, description, previousDescription);
|
|
572
|
+
notifyCardsUpdated(c, [key, toCard, previousToCard]);
|
|
604
573
|
return c.json(result);
|
|
605
574
|
}
|
|
606
575
|
catch (error) {
|
|
@@ -663,47 +632,5 @@ router.get('/:key/a/:attachment', requireRole(UserRole.Reader), ssgParams(async
|
|
|
663
632
|
}, 404);
|
|
664
633
|
}
|
|
665
634
|
});
|
|
666
|
-
/**
|
|
667
|
-
* @swagger
|
|
668
|
-
* /api/cards/{key}/presence:
|
|
669
|
-
* get:
|
|
670
|
-
* summary: SSE stream of users currently viewing or editing this card
|
|
671
|
-
* parameters:
|
|
672
|
-
* - name: key
|
|
673
|
-
* in: path
|
|
674
|
-
* required: true
|
|
675
|
-
* description: Card key (string)
|
|
676
|
-
* - name: mode
|
|
677
|
-
* in: query
|
|
678
|
-
* required: false
|
|
679
|
-
* schema:
|
|
680
|
-
* type: string
|
|
681
|
-
* enum: [viewing, editing]
|
|
682
|
-
* description: Whether the user is viewing or editing (default: viewing)
|
|
683
|
-
* responses:
|
|
684
|
-
* 200:
|
|
685
|
-
* description: SSE stream with presence events
|
|
686
|
-
*/
|
|
687
|
-
router.get('/:key/presence', requireRole(UserRole.Reader), (c) => {
|
|
688
|
-
const key = c.req.param('key');
|
|
689
|
-
const mode = c.req.query('mode') === 'editing' ? 'editing' : 'viewing';
|
|
690
|
-
const user = c.get('user');
|
|
691
|
-
if (!key) {
|
|
692
|
-
return c.text('No card key', 400);
|
|
693
|
-
}
|
|
694
|
-
return streamSSE(c, async (stream) => {
|
|
695
|
-
const connId = presenceStore.add(key, user, mode, (data) => void stream.writeSSE(data));
|
|
696
|
-
let aborted = false;
|
|
697
|
-
stream.onAbort(() => {
|
|
698
|
-
aborted = true;
|
|
699
|
-
presenceStore.remove(key, connId);
|
|
700
|
-
});
|
|
701
|
-
// Keep connection alive with periodic heartbeat
|
|
702
|
-
while (!aborted) {
|
|
703
|
-
await stream.write(': hb\n\n');
|
|
704
|
-
await stream.sleep(30000);
|
|
705
|
-
}
|
|
706
|
-
});
|
|
707
|
-
});
|
|
708
635
|
export default router;
|
|
709
636
|
//# sourceMappingURL=index.js.map
|