@cyberismo/backend 1.1.1 → 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 +22 -11
- 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 +23 -10
- 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/dist/utils.d.ts +4 -0
- package/dist/utils.js +6 -0
- package/dist/utils.js.map +1 -1
- package/package.json +12 -13
- package/src/app.ts +22 -11
- 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 +30 -11
- 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/src/utils.ts +10 -0
- 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-H1CkT-JT.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/dist/export.js
CHANGED
|
@@ -18,6 +18,8 @@ import { staticFrontendDirRelative } from './utils.js';
|
|
|
18
18
|
import { toSSG } from 'hono/ssg';
|
|
19
19
|
import { findAllCards, findRelevantAttachments, } from './domain/cards/service.js';
|
|
20
20
|
const _cardQueryCache = new Map();
|
|
21
|
+
/** Label for errors from routes that belong to no project. */
|
|
22
|
+
const SHARED_ROUTES = '(shared)';
|
|
21
23
|
const OVERHEAD_CALLS = 6; // estimated number of overhead calls during export in addition to card exports
|
|
22
24
|
/**
|
|
23
25
|
* DO NO USE DIRECTLY. This resets the callOnce map, allowing you to redo the export.
|
|
@@ -59,7 +61,7 @@ export async function getCardQueryResult(commands, cardKey) {
|
|
|
59
61
|
* @param options.cardKey - Key of the card to export. If not provided, all cards will be exported.
|
|
60
62
|
* @param options.defaultProject - Default project prefix to write into config.json.
|
|
61
63
|
* @param onProgress - Optional progress callback function.
|
|
62
|
-
* @returns
|
|
64
|
+
* @returns Errors that occurred during export, grouped by project.
|
|
63
65
|
*/
|
|
64
66
|
export async function exportSite(registry, exportDir, options, onProgress) {
|
|
65
67
|
exportDir = exportDir || 'static';
|
|
@@ -88,48 +90,61 @@ export async function exportSite(registry, exportDir, options, onProgress) {
|
|
|
88
90
|
const attachments = await findRelevantAttachments(commands, opts);
|
|
89
91
|
total += cards.length + attachments.length;
|
|
90
92
|
}
|
|
91
|
-
//
|
|
93
|
+
// One pass per project so an error is attributed to the project whose route
|
|
94
|
+
// produced it (the response itself carries no project). Shared routes get
|
|
95
|
+
// their own pass so each route is emitted exactly once.
|
|
96
|
+
const prefixes = registry.list().map((p) => p.prefix);
|
|
97
|
+
const projectOf = (pathname) => prefixes.find((p) => {
|
|
98
|
+
const base = `/api/projects/${p}`;
|
|
99
|
+
return pathname === base || pathname.startsWith(`${base}/`);
|
|
100
|
+
});
|
|
92
101
|
let done = 0;
|
|
93
102
|
onProgress?.(done, total);
|
|
94
103
|
const errors = [];
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (
|
|
116
|
-
error
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
104
|
+
for (const scope of [undefined, ...prefixes]) {
|
|
105
|
+
const scopeErrors = [];
|
|
106
|
+
await toSSG(app, fs, {
|
|
107
|
+
dir: exportDir,
|
|
108
|
+
concurrency: 5,
|
|
109
|
+
plugins: [
|
|
110
|
+
{
|
|
111
|
+
beforeRequestHook: (req) => {
|
|
112
|
+
const url = new URL(req.url);
|
|
113
|
+
// Skip MCP routes — they require session state and are not part of the static site
|
|
114
|
+
if (url.pathname.startsWith('/mcp')) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
// Skip OIDC/well-known routes — not relevant for static export
|
|
118
|
+
if (url.pathname.startsWith('/.well-known')) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
return projectOf(url.pathname) === scope ? req : false;
|
|
122
|
+
},
|
|
123
|
+
afterResponseHook: async (response) => {
|
|
124
|
+
if (![200, 201, 204].includes(response.status)) {
|
|
125
|
+
const error = await response.json();
|
|
126
|
+
if (typeof error === 'object' &&
|
|
127
|
+
error != null &&
|
|
128
|
+
'error' in error &&
|
|
129
|
+
typeof error.error === 'string') {
|
|
130
|
+
scopeErrors.push(error.error);
|
|
131
|
+
}
|
|
132
|
+
return false; // ignore route
|
|
120
133
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
return response;
|
|
134
|
+
done++;
|
|
135
|
+
if (done > total) {
|
|
136
|
+
total = done; // adjust total if underestimated
|
|
137
|
+
}
|
|
138
|
+
onProgress?.(done, total);
|
|
139
|
+
return response;
|
|
140
|
+
},
|
|
129
141
|
},
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
142
|
+
],
|
|
143
|
+
});
|
|
144
|
+
if (scopeErrors.length > 0) {
|
|
145
|
+
errors.push({ prefix: scope ?? SHARED_ROUTES, errors: scopeErrors });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
133
148
|
return {
|
|
134
149
|
errors,
|
|
135
150
|
};
|
package/dist/export.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAEF,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGlC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export type { MockUserConfig } from './auth/mock.js';
|
|
|
5
5
|
export type { AuthProvider } from './auth/types.js';
|
|
6
6
|
export { exportSite, type ExportSiteOptions } from './export.js';
|
|
7
7
|
export { ProjectRegistry } from './project-registry.js';
|
|
8
|
+
export { formatProjectErrors, type ProjectErrors } from './project-errors.js';
|
|
8
9
|
/**
|
|
9
10
|
* Preview the exported site
|
|
10
11
|
* @param dir - Directory to preview
|
package/dist/index.js
CHANGED
|
@@ -16,10 +16,12 @@ import { serveStatic } from '@hono/node-server/serve-static';
|
|
|
16
16
|
import path from 'node:path';
|
|
17
17
|
import { readFile } from 'node:fs/promises';
|
|
18
18
|
import { findFreePort } from './utils.js';
|
|
19
|
+
import { startPolicyPolling } from './overlay.js';
|
|
19
20
|
import { createApp } from './app.js';
|
|
20
21
|
export { MockAuthProvider } from './auth/mock.js';
|
|
21
22
|
export { exportSite } from './export.js';
|
|
22
23
|
export { ProjectRegistry } from './project-registry.js';
|
|
24
|
+
export { formatProjectErrors } from './project-errors.js';
|
|
23
25
|
const DEFAULT_PORT = 3000;
|
|
24
26
|
const DEFAULT_MAX_PORT = DEFAULT_PORT + 100;
|
|
25
27
|
/**
|
|
@@ -57,6 +59,7 @@ export async function startServer(authProvider, registry, findPort = true, multi
|
|
|
57
59
|
if (findPort && !useOsAssigned) {
|
|
58
60
|
port = await findFreePort(port, DEFAULT_MAX_PORT);
|
|
59
61
|
}
|
|
62
|
+
startPolicyPolling(() => registry.list().map((p) => ({ prefix: p.prefix })));
|
|
60
63
|
const app = createApp(authProvider, registry, undefined, false, multiProjectRoot);
|
|
61
64
|
startApp(app, port);
|
|
62
65
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AACF,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAA0B,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/main.js
CHANGED
|
@@ -16,6 +16,8 @@ import { exportSite } from './export.js';
|
|
|
16
16
|
import { MockAuthProvider } from './auth/mock.js';
|
|
17
17
|
import { KeycloakAuthProvider } from './auth/keycloak.js';
|
|
18
18
|
import { ProjectRegistry } from './project-registry.js';
|
|
19
|
+
import { formatProjectErrors } from './project-errors.js';
|
|
20
|
+
import { gitOptionsFromEnv } from './utils.js';
|
|
19
21
|
import { parseArgs } from 'node:util';
|
|
20
22
|
import dotenv from 'dotenv';
|
|
21
23
|
// Load environment variables from .env file
|
|
@@ -27,7 +29,7 @@ function createAuthProvider() {
|
|
|
27
29
|
process.exit(1);
|
|
28
30
|
}
|
|
29
31
|
if (authMode === 'mock') {
|
|
30
|
-
return new MockAuthProvider();
|
|
32
|
+
return new MockAuthProvider({ roster: true });
|
|
31
33
|
}
|
|
32
34
|
if (authMode === 'idp') {
|
|
33
35
|
const issuer = process.env.OIDC_ISSUER;
|
|
@@ -64,18 +66,29 @@ if (args.export) {
|
|
|
64
66
|
console.error('No projects found to export.');
|
|
65
67
|
process.exit(1);
|
|
66
68
|
}
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
69
|
+
const defaultProject = typeof args['default-project'] === 'string'
|
|
70
|
+
? args['default-project']
|
|
71
|
+
: undefined;
|
|
72
|
+
const { registry, failed } = await ProjectRegistry.fromScannedProjects(projects);
|
|
73
|
+
if (registry.list().length === 0 ||
|
|
74
|
+
failed.some((f) => f.prefix === defaultProject)) {
|
|
75
|
+
console.error(formatProjectErrors(failed));
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
const { errors: exportErrors } = await exportSite(registry, undefined, {
|
|
79
|
+
defaultProject,
|
|
72
80
|
});
|
|
81
|
+
const errors = [...failed, ...exportErrors];
|
|
82
|
+
if (errors.length > 0) {
|
|
83
|
+
console.error(formatProjectErrors(errors));
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
73
86
|
}
|
|
74
87
|
else {
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
88
|
+
const { registry, failed } = await ProjectRegistry.fromScannedProjects(projects, gitOptionsFromEnv());
|
|
89
|
+
if (failed.length > 0) {
|
|
90
|
+
console.error(formatProjectErrors(failed));
|
|
91
|
+
}
|
|
79
92
|
const authProvider = createAuthProvider();
|
|
80
93
|
await startServer(authProvider, registry, true, projectPath);
|
|
81
94
|
}
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AACF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,4CAA4C;AAC5C,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAEvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CACX,4EAA4E,CAC7E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,IAAI,gBAAgB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ import type { AuthProvider } from '../auth/types.js';
|
|
|
17
17
|
declare module 'hono' {
|
|
18
18
|
interface ContextVariableMap {
|
|
19
19
|
user: UserInfo;
|
|
20
|
+
tokenExp: number;
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
23
|
/**
|
|
@@ -24,6 +25,10 @@ declare module 'hono' {
|
|
|
24
25
|
* Validates the user and attaches user info to the context.
|
|
25
26
|
*/
|
|
26
27
|
export declare function createAuthMiddleware(provider: AuthProvider): MiddlewareHandler;
|
|
28
|
+
/**
|
|
29
|
+
* Check if a role meets or exceeds a minimum role in the hierarchy.
|
|
30
|
+
*/
|
|
31
|
+
export declare function isAtLeastRole(role: UserRole, minimumRole: UserRole): boolean;
|
|
27
32
|
/**
|
|
28
33
|
* Check if the current user has at least the required role
|
|
29
34
|
*/
|
package/dist/middleware/auth.js
CHANGED
|
@@ -11,21 +11,31 @@
|
|
|
11
11
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
12
|
*/
|
|
13
13
|
import { UserRole } from '../types.js';
|
|
14
|
+
import { isReadOnly } from '../overlay.js';
|
|
14
15
|
const roleLevel = {
|
|
15
16
|
[UserRole.Connector]: -1,
|
|
16
17
|
[UserRole.Reader]: 0,
|
|
17
18
|
[UserRole.Editor]: 1,
|
|
18
19
|
[UserRole.Admin]: 2,
|
|
19
20
|
};
|
|
21
|
+
/** Everyone below administrator is a reader; lifting read-only is their job. */
|
|
22
|
+
function applyReadOnly(user) {
|
|
23
|
+
if (user.role === UserRole.Admin) {
|
|
24
|
+
return user;
|
|
25
|
+
}
|
|
26
|
+
return { ...user, role: UserRole.Reader };
|
|
27
|
+
}
|
|
20
28
|
/**
|
|
21
29
|
* Create authentication middleware from an AuthProvider.
|
|
22
30
|
* Validates the user and attaches user info to the context.
|
|
23
31
|
*/
|
|
24
32
|
export function createAuthMiddleware(provider) {
|
|
25
33
|
return async (c, next) => {
|
|
26
|
-
const
|
|
27
|
-
if (
|
|
28
|
-
|
|
34
|
+
const result = await provider.authenticate(c.req.raw);
|
|
35
|
+
if (result) {
|
|
36
|
+
const { exp, ...user } = result;
|
|
37
|
+
c.set('user', isReadOnly(c.req.path) ? applyReadOnly(user) : user);
|
|
38
|
+
c.set('tokenExp', exp);
|
|
29
39
|
}
|
|
30
40
|
else {
|
|
31
41
|
// RFC 9728 §5.1: include resource_metadata in WWW-Authenticate
|
|
@@ -43,6 +53,12 @@ export function createAuthMiddleware(provider) {
|
|
|
43
53
|
await next();
|
|
44
54
|
};
|
|
45
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if a role meets or exceeds a minimum role in the hierarchy.
|
|
58
|
+
*/
|
|
59
|
+
export function isAtLeastRole(role, minimumRole) {
|
|
60
|
+
return roleLevel[role] >= roleLevel[minimumRole];
|
|
61
|
+
}
|
|
46
62
|
/**
|
|
47
63
|
* Check if the current user has at least the required role
|
|
48
64
|
*/
|
|
@@ -51,7 +67,7 @@ export function hasRole(c, minimumRole) {
|
|
|
51
67
|
if (!user) {
|
|
52
68
|
return false;
|
|
53
69
|
}
|
|
54
|
-
return
|
|
70
|
+
return isAtLeastRole(user.role, minimumRole);
|
|
55
71
|
}
|
|
56
72
|
/**
|
|
57
73
|
* Require minimum role middleware factory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAIF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,9 +12,11 @@
|
|
|
12
12
|
import type { MiddlewareHandler } from 'hono';
|
|
13
13
|
import type { CommandManager } from '@cyberismo/data-handler';
|
|
14
14
|
import type { ProjectRegistry } from '../project-registry.js';
|
|
15
|
+
import type { ProjectEvents } from '../domain/events/project-events.js';
|
|
15
16
|
declare module 'hono' {
|
|
16
17
|
interface ContextVariableMap {
|
|
17
18
|
commands: CommandManager;
|
|
19
|
+
events: ProjectEvents;
|
|
18
20
|
projectPath: string;
|
|
19
21
|
registry: ProjectRegistry;
|
|
20
22
|
}
|
|
@@ -46,6 +46,7 @@ export const attachProjectRegistry = (registry, fixedPrefix) => {
|
|
|
46
46
|
if (!commands) {
|
|
47
47
|
return c.json({ error: `Project '${prefix}' not found` }, 404);
|
|
48
48
|
}
|
|
49
|
+
c.set('events', registry.eventsFor(commands));
|
|
49
50
|
return runWithCommands(c, commands, next);
|
|
50
51
|
};
|
|
51
52
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandManager.js","sourceRoot":"","sources":["../../src/middleware/commandManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AAIF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"commandManager.js","sourceRoot":"","sources":["../../src/middleware/commandManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AAIF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAc3C;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,CAAU,EACV,QAAwB,EACxB,IAAyB;IAEzB,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IACD,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC5B,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CACtE,IAAI,EAAE,CACP,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,QAAwB,EACL,EAAE;IACrB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAAyB,EACzB,WAAoB,EACD,EAAE;IACrB,OAAO,KAAK,EAAE,CAAU,EAAE,IAAI,EAAE,EAAE;QAChC,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,MAAM,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9C,OAAO,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Cyberismo
|
|
3
|
+
Copyright © Cyberismo Ltd and contributors 2026
|
|
4
|
+
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
+
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
+
the Free Software Foundation. This program is distributed in the hope that it
|
|
7
|
+
will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
8
|
+
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
9
|
+
See the GNU Affero General Public License for more details.
|
|
10
|
+
You should have received a copy of the GNU Affero General Public
|
|
11
|
+
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Which projects, or the whole instance, are read-only.
|
|
15
|
+
*
|
|
16
|
+
* Polled on a timer so no request waits for it, and permissive on every
|
|
17
|
+
* uncertain path: a freeze arriving late beats an outage. Unset
|
|
18
|
+
* CYBERISMO_OVERLAY_URL means no policy, which is the standalone default.
|
|
19
|
+
*/
|
|
20
|
+
import { z } from 'zod';
|
|
21
|
+
import type { ProjectProvider } from '@cyberismo/data-handler';
|
|
22
|
+
declare const policySchema: z.ZodCatch<z.ZodObject<{
|
|
23
|
+
readOnly: z.ZodCatch<z.ZodBoolean>;
|
|
24
|
+
projects: z.ZodCatch<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
25
|
+
readOnly: z.ZodCatch<z.ZodBoolean>;
|
|
26
|
+
}, z.core.$strip>>>;
|
|
27
|
+
}, z.core.$strip>>;
|
|
28
|
+
export type Policy = z.infer<typeof policySchema>;
|
|
29
|
+
export declare function getPolicy(): Policy;
|
|
30
|
+
export declare function setPolicy(policy: Policy): void;
|
|
31
|
+
export declare function isProjectReadOnly(prefix: string): boolean;
|
|
32
|
+
/** `/api/projects/<prefix>/…` is the only request shape naming a project. */
|
|
33
|
+
export declare function isReadOnly(path: string): boolean;
|
|
34
|
+
export declare function startPolicyPolling(projects?: () => {
|
|
35
|
+
prefix: string;
|
|
36
|
+
}[]): void;
|
|
37
|
+
/**
|
|
38
|
+
* Hide read-only projects from MCP.
|
|
39
|
+
*
|
|
40
|
+
* MCP takes the project as an argument rather than in the path, so the role cap
|
|
41
|
+
* cannot see which one a call touches. Making a frozen project unresolvable
|
|
42
|
+
* fails closed, at the cost of hiding it from reads and from administrators too.
|
|
43
|
+
*/
|
|
44
|
+
export declare function writableProjects(provider: ProjectProvider): ProjectProvider;
|
|
45
|
+
export {};
|
package/dist/overlay.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Cyberismo
|
|
3
|
+
Copyright © Cyberismo Ltd and contributors 2026
|
|
4
|
+
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
+
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
+
the Free Software Foundation. This program is distributed in the hope that it
|
|
7
|
+
will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
8
|
+
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
9
|
+
See the GNU Affero General Public License for more details.
|
|
10
|
+
You should have received a copy of the GNU Affero General Public
|
|
11
|
+
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Which projects, or the whole instance, are read-only.
|
|
15
|
+
*
|
|
16
|
+
* Polled on a timer so no request waits for it, and permissive on every
|
|
17
|
+
* uncertain path: a freeze arriving late beats an outage. Unset
|
|
18
|
+
* CYBERISMO_OVERLAY_URL means no policy, which is the standalone default.
|
|
19
|
+
*/
|
|
20
|
+
import { z } from 'zod';
|
|
21
|
+
const POLL_INTERVAL_MS = 10_000;
|
|
22
|
+
const FETCH_TIMEOUT_MS = 2_000;
|
|
23
|
+
const policySchema = z
|
|
24
|
+
.object({
|
|
25
|
+
readOnly: z.boolean().catch(false),
|
|
26
|
+
projects: z
|
|
27
|
+
.record(z.string(), z.object({ readOnly: z.boolean().catch(false) }))
|
|
28
|
+
.catch({}),
|
|
29
|
+
})
|
|
30
|
+
.catch(() => EMPTY);
|
|
31
|
+
const EMPTY = { readOnly: false, projects: {} };
|
|
32
|
+
let current = EMPTY;
|
|
33
|
+
export function getPolicy() {
|
|
34
|
+
return current;
|
|
35
|
+
}
|
|
36
|
+
export function setPolicy(policy) {
|
|
37
|
+
current = policy;
|
|
38
|
+
}
|
|
39
|
+
export function isProjectReadOnly(prefix) {
|
|
40
|
+
return current.readOnly || current.projects[prefix]?.readOnly === true;
|
|
41
|
+
}
|
|
42
|
+
/** `/api/projects/<prefix>/…` is the only request shape naming a project. */
|
|
43
|
+
export function isReadOnly(path) {
|
|
44
|
+
if (current.readOnly)
|
|
45
|
+
return true;
|
|
46
|
+
const match = /^\/api\/projects\/([^/?#]+)/.exec(path);
|
|
47
|
+
if (!match)
|
|
48
|
+
return false;
|
|
49
|
+
let prefix;
|
|
50
|
+
try {
|
|
51
|
+
prefix = decodeURIComponent(match[1]);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
prefix = match[1];
|
|
55
|
+
}
|
|
56
|
+
return isProjectReadOnly(prefix);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Temporary: the app is the source of truth for which projects exist, so it
|
|
60
|
+
* tells overlay. That inverts once projects are created in overlay's admin
|
|
61
|
+
* views, after which overlay reports them and this goes away.
|
|
62
|
+
*/
|
|
63
|
+
async function reportProjects(base, token, projects) {
|
|
64
|
+
const response = await fetch(`${base.replace(/\/$/, '')}/projects`, {
|
|
65
|
+
method: 'PUT',
|
|
66
|
+
headers: {
|
|
67
|
+
'Content-Type': 'application/json',
|
|
68
|
+
...(token ? { 'X-Overlay-Token': token } : {}),
|
|
69
|
+
},
|
|
70
|
+
body: JSON.stringify({ projects }),
|
|
71
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
72
|
+
});
|
|
73
|
+
if (!response.ok) {
|
|
74
|
+
throw new Error(`responded ${response.status}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function startPolicyPolling(projects = () => []) {
|
|
78
|
+
const base = process.env.CYBERISMO_OVERLAY_URL;
|
|
79
|
+
if (!base)
|
|
80
|
+
return;
|
|
81
|
+
const token = process.env.CYBERISMO_OVERLAY_TOKEN;
|
|
82
|
+
const url = `${base.replace(/\/$/, '')}/tenant`;
|
|
83
|
+
let lastFailure;
|
|
84
|
+
const poll = async () => {
|
|
85
|
+
try {
|
|
86
|
+
const response = await fetch(url, {
|
|
87
|
+
headers: token ? { 'X-Overlay-Token': token } : {},
|
|
88
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
89
|
+
});
|
|
90
|
+
if (!response.ok) {
|
|
91
|
+
throw new Error(`responded ${response.status}`);
|
|
92
|
+
}
|
|
93
|
+
setPolicy(policySchema.parse(await response.json()));
|
|
94
|
+
if (lastFailure) {
|
|
95
|
+
console.error(`overlay: ${url} is reachable again`);
|
|
96
|
+
lastFailure = undefined;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
101
|
+
if (reason !== lastFailure) {
|
|
102
|
+
lastFailure = reason;
|
|
103
|
+
console.error(`overlay: ${url} ${reason}, keeping the previous policy`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
// Reported every tick from a fresh list, so a project created after start-up
|
|
108
|
+
// is registered within one interval.
|
|
109
|
+
let lastReportFailure;
|
|
110
|
+
const report = async () => {
|
|
111
|
+
const current = projects();
|
|
112
|
+
if (current.length === 0)
|
|
113
|
+
return;
|
|
114
|
+
try {
|
|
115
|
+
await reportProjects(base, token, current);
|
|
116
|
+
lastReportFailure = undefined;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
120
|
+
if (reason !== lastReportFailure) {
|
|
121
|
+
lastReportFailure = reason;
|
|
122
|
+
console.error(`overlay: could not report projects, ${reason}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
// setInterval does not wait for the previous run, so skip a tick rather than
|
|
127
|
+
// letting two overlap.
|
|
128
|
+
let running = false;
|
|
129
|
+
const tick = async () => {
|
|
130
|
+
if (running)
|
|
131
|
+
return;
|
|
132
|
+
running = true;
|
|
133
|
+
try {
|
|
134
|
+
await poll();
|
|
135
|
+
await report();
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
running = false;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
void tick();
|
|
142
|
+
setInterval(() => void tick(), POLL_INTERVAL_MS).unref();
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Hide read-only projects from MCP.
|
|
146
|
+
*
|
|
147
|
+
* MCP takes the project as an argument rather than in the path, so the role cap
|
|
148
|
+
* cannot see which one a call touches. Making a frozen project unresolvable
|
|
149
|
+
* fails closed, at the cost of hiding it from reads and from administrators too.
|
|
150
|
+
*/
|
|
151
|
+
export function writableProjects(provider) {
|
|
152
|
+
return {
|
|
153
|
+
get: (prefix) => isProjectReadOnly(prefix) ? undefined : provider.get(prefix),
|
|
154
|
+
list: () => provider.list().filter((p) => !isProjectReadOnly(p.prefix)),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Cyberismo
|
|
3
|
+
Copyright © Cyberismo Ltd and contributors 2026
|
|
4
|
+
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
+
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
+
the Free Software Foundation.
|
|
7
|
+
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
+
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
+
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
+
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
+
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
+
*/
|
|
13
|
+
export interface ProjectErrors {
|
|
14
|
+
prefix: string;
|
|
15
|
+
errors: string[];
|
|
16
|
+
}
|
|
17
|
+
/** Formats errors as one block per project, capping each at `limit` lines. */
|
|
18
|
+
export declare function formatProjectErrors(groups: ProjectErrors[], limit?: number): string;
|