@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
|
@@ -5,12 +5,14 @@ import {
|
|
|
5
5
|
resourceTypes,
|
|
6
6
|
} from '../../common/validationSchemas.js';
|
|
7
7
|
|
|
8
|
-
export const
|
|
8
|
+
export const prefixIdentifierParamsSchema = z.object({
|
|
9
9
|
prefix: z.string(),
|
|
10
10
|
identifier: identifierSchema,
|
|
11
11
|
});
|
|
12
12
|
|
|
13
|
-
export type
|
|
13
|
+
export type PrefixIdentifierParams = z.infer<
|
|
14
|
+
typeof prefixIdentifierParamsSchema
|
|
15
|
+
>;
|
|
14
16
|
|
|
15
17
|
export const workflowGraphQuerySchema = z.object({
|
|
16
18
|
card: z.string().optional(),
|
|
@@ -18,6 +20,14 @@ export const workflowGraphQuerySchema = z.object({
|
|
|
18
20
|
|
|
19
21
|
export type WorkflowGraphQuery = z.infer<typeof workflowGraphQuerySchema>;
|
|
20
22
|
|
|
23
|
+
export const skillPreviewBodySchema = z.object({
|
|
24
|
+
skillContent: z.string().optional(),
|
|
25
|
+
skillQuery: z.string().optional(),
|
|
26
|
+
cardKey: z.string().optional(),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export type SkillPreviewBody = z.infer<typeof skillPreviewBodySchema>;
|
|
30
|
+
|
|
21
31
|
export const resourceFileParamsSchema = resourceParamsSchema.extend({
|
|
22
32
|
file: z.string(),
|
|
23
33
|
});
|
|
@@ -26,7 +26,11 @@ import {
|
|
|
26
26
|
resourceNameToString,
|
|
27
27
|
} from '@cyberismo/data-handler';
|
|
28
28
|
import type { ResourceParams } from '../../common/validationSchemas.js';
|
|
29
|
-
import type {
|
|
29
|
+
import type {
|
|
30
|
+
SkillPreviewBody,
|
|
31
|
+
UpdateOperationBody,
|
|
32
|
+
ValidateResourceParams,
|
|
33
|
+
} from './schema.js';
|
|
30
34
|
|
|
31
35
|
const resourceTypes: ResourceFolderType[] = [
|
|
32
36
|
'calculations',
|
|
@@ -36,17 +40,18 @@ const resourceTypes: ResourceFolderType[] = [
|
|
|
36
40
|
'graphViews',
|
|
37
41
|
'linkTypes',
|
|
38
42
|
'reports',
|
|
43
|
+
'skills',
|
|
39
44
|
'templates',
|
|
40
45
|
'workflows',
|
|
41
46
|
];
|
|
42
47
|
|
|
43
48
|
async function getModules(commands: CommandManager) {
|
|
44
49
|
try {
|
|
45
|
-
const modules = await commands.
|
|
50
|
+
const modules = await commands.modulesCmd.list();
|
|
46
51
|
return Promise.all(
|
|
47
52
|
modules.map(async (mod) => {
|
|
48
53
|
try {
|
|
49
|
-
const module = await commands.
|
|
54
|
+
const module = await commands.modulesCmd.show(mod.name);
|
|
50
55
|
return { name: module.name, cardKeyPrefix: module.cardKeyPrefix };
|
|
51
56
|
} catch {
|
|
52
57
|
return { name: mod.name, cardKeyPrefix: mod.name };
|
|
@@ -530,6 +535,53 @@ export async function getWorkflowGraph(
|
|
|
530
535
|
});
|
|
531
536
|
}
|
|
532
537
|
|
|
538
|
+
/**
|
|
539
|
+
* Renders a skill's instructions for the configuration editor preview.
|
|
540
|
+
* Unlike the MCP `get_skill` tool, this does not require the skill to be
|
|
541
|
+
* enabled by the logic programs — the author is still working on it. When
|
|
542
|
+
* `skillContent` or `skillQuery` is given, that unsaved editor content is
|
|
543
|
+
* rendered instead of what is stored on disk. The lookups and the rendering
|
|
544
|
+
* share one consistency window so the preview matches a single project state.
|
|
545
|
+
* @returns the rendered instructions as markdown.
|
|
546
|
+
* @throws Error with 'not found' in the message when the skill or card cannot
|
|
547
|
+
* be resolved; any other error means the template or query failed to render.
|
|
548
|
+
*/
|
|
549
|
+
export async function previewSkill(
|
|
550
|
+
commands: CommandManager,
|
|
551
|
+
skillName: string,
|
|
552
|
+
body: SkillPreviewBody,
|
|
553
|
+
): Promise<string> {
|
|
554
|
+
const { cardKey, skillContent, skillQuery } = body;
|
|
555
|
+
return commands.consistent(async () => {
|
|
556
|
+
try {
|
|
557
|
+
await commands.showCmd.showResource(skillName, 'skills');
|
|
558
|
+
} catch (error) {
|
|
559
|
+
if (error instanceof Error && error.message.includes('does not exist')) {
|
|
560
|
+
throw new Error(`Skill '${skillName}' not found`, { cause: error });
|
|
561
|
+
}
|
|
562
|
+
throw error;
|
|
563
|
+
}
|
|
564
|
+
if (cardKey) {
|
|
565
|
+
try {
|
|
566
|
+
await commands.showCmd.showCardDetails(cardKey);
|
|
567
|
+
} catch (error) {
|
|
568
|
+
if (
|
|
569
|
+
error instanceof Error &&
|
|
570
|
+
error.message.includes('does not exist')
|
|
571
|
+
) {
|
|
572
|
+
throw new Error(`Card '${cardKey}' not found`, { cause: error });
|
|
573
|
+
}
|
|
574
|
+
throw error;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
return commands.showCmd.renderSkill(skillName, {
|
|
578
|
+
cardKey,
|
|
579
|
+
skillContent,
|
|
580
|
+
skillQuery,
|
|
581
|
+
});
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
|
|
533
585
|
/**
|
|
534
586
|
* Perform an updateOperation on a resource key.
|
|
535
587
|
* This delegates to the data-handler mutation engine.
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
|
|
14
|
+
import { Hono } from 'hono';
|
|
15
|
+
import * as skillService from './service.js';
|
|
16
|
+
import { createSkillSchema } from './schema.js';
|
|
17
|
+
import { zValidator } from '../../middleware/zvalidator.js';
|
|
18
|
+
import { UserRole } from '../../types.js';
|
|
19
|
+
import { requireRole } from '../../middleware/auth.js';
|
|
20
|
+
|
|
21
|
+
const router = new Hono();
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @swagger
|
|
25
|
+
* /api/skills:
|
|
26
|
+
* post:
|
|
27
|
+
* summary: Create a new skill
|
|
28
|
+
* description: Creates a new skill with the specified identifier
|
|
29
|
+
* requestBody:
|
|
30
|
+
* required: true
|
|
31
|
+
* content:
|
|
32
|
+
* application/json:
|
|
33
|
+
* schema:
|
|
34
|
+
* type: object
|
|
35
|
+
* properties:
|
|
36
|
+
* identifier:
|
|
37
|
+
* type: string
|
|
38
|
+
* required:
|
|
39
|
+
* - identifier
|
|
40
|
+
* responses:
|
|
41
|
+
* 200:
|
|
42
|
+
* description: Skill created successfully
|
|
43
|
+
* 400:
|
|
44
|
+
* description: Invalid request body
|
|
45
|
+
* 500:
|
|
46
|
+
* description: Server error
|
|
47
|
+
*/
|
|
48
|
+
router.post(
|
|
49
|
+
'/',
|
|
50
|
+
requireRole(UserRole.Admin),
|
|
51
|
+
zValidator('json', createSkillSchema),
|
|
52
|
+
async (c) => {
|
|
53
|
+
const commands = c.get('commands');
|
|
54
|
+
const { identifier } = c.req.valid('json');
|
|
55
|
+
|
|
56
|
+
await skillService.createSkill(commands, identifier);
|
|
57
|
+
return c.json({ message: 'Skill created successfully' });
|
|
58
|
+
},
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
export default router;
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import { identifierSchema } from '../../common/validationSchemas.js';
|
|
16
|
+
|
|
17
|
+
export const createSkillSchema = z.object({
|
|
18
|
+
identifier: identifierSchema,
|
|
19
|
+
});
|
|
@@ -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
|
+
|
|
14
|
+
import type { CommandManager } from '@cyberismo/data-handler';
|
|
15
|
+
|
|
16
|
+
export async function createSkill(commands: CommandManager, skillName: string) {
|
|
17
|
+
await commands.createCmd.createSkill(skillName);
|
|
18
|
+
}
|
package/src/export.ts
CHANGED
|
@@ -22,6 +22,7 @@ import { staticFrontendDirRelative } from './utils.js';
|
|
|
22
22
|
import type { QueryResult } from '@cyberismo/data-handler/types/queries';
|
|
23
23
|
import { toSSG } from 'hono/ssg';
|
|
24
24
|
import type { TreeOptions } from './types.js';
|
|
25
|
+
import type { ProjectErrors } from './project-errors.js';
|
|
25
26
|
import {
|
|
26
27
|
findAllCards,
|
|
27
28
|
findRelevantAttachments,
|
|
@@ -32,6 +33,8 @@ export interface ExportSiteOptions extends TreeOptions {
|
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
const _cardQueryCache = new Map<string, Promise<QueryResult<'card'>[]>>();
|
|
36
|
+
/** Label for errors from routes that belong to no project. */
|
|
37
|
+
const SHARED_ROUTES = '(shared)';
|
|
35
38
|
const OVERHEAD_CALLS = 6; // estimated number of overhead calls during export in addition to card exports
|
|
36
39
|
|
|
37
40
|
/**
|
|
@@ -82,14 +85,14 @@ export async function getCardQueryResult(
|
|
|
82
85
|
* @param options.cardKey - Key of the card to export. If not provided, all cards will be exported.
|
|
83
86
|
* @param options.defaultProject - Default project prefix to write into config.json.
|
|
84
87
|
* @param onProgress - Optional progress callback function.
|
|
85
|
-
* @returns
|
|
88
|
+
* @returns Errors that occurred during export, grouped by project.
|
|
86
89
|
*/
|
|
87
90
|
export async function exportSite(
|
|
88
91
|
registry: ProjectRegistry,
|
|
89
92
|
exportDir?: string,
|
|
90
93
|
options?: ExportSiteOptions,
|
|
91
94
|
onProgress?: (current: number, total: number) => void,
|
|
92
|
-
): Promise<{ errors:
|
|
95
|
+
): Promise<{ errors: ProjectErrors[] }> {
|
|
93
96
|
exportDir = exportDir || 'static';
|
|
94
97
|
const { defaultProject, ...treeOpts } = options ?? {};
|
|
95
98
|
const opts: TreeOptions = {
|
|
@@ -125,50 +128,65 @@ export async function exportSite(
|
|
|
125
128
|
total += cards.length + attachments.length;
|
|
126
129
|
}
|
|
127
130
|
|
|
128
|
-
//
|
|
131
|
+
// One pass per project so an error is attributed to the project whose route
|
|
132
|
+
// produced it (the response itself carries no project). Shared routes get
|
|
133
|
+
// their own pass so each route is emitted exactly once.
|
|
134
|
+
const prefixes = registry.list().map((p) => p.prefix);
|
|
135
|
+
const projectOf = (pathname: string) =>
|
|
136
|
+
prefixes.find((p) => {
|
|
137
|
+
const base = `/api/projects/${p}`;
|
|
138
|
+
return pathname === base || pathname.startsWith(`${base}/`);
|
|
139
|
+
});
|
|
140
|
+
|
|
129
141
|
let done = 0;
|
|
130
142
|
onProgress?.(done, total);
|
|
131
|
-
const errors:
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
143
|
+
const errors: ProjectErrors[] = [];
|
|
144
|
+
for (const scope of [undefined, ...prefixes]) {
|
|
145
|
+
const scopeErrors: string[] = [];
|
|
146
|
+
await toSSG(app, fs, {
|
|
147
|
+
dir: exportDir,
|
|
148
|
+
concurrency: 5,
|
|
149
|
+
plugins: [
|
|
150
|
+
{
|
|
151
|
+
beforeRequestHook: (req) => {
|
|
152
|
+
const url = new URL(req.url);
|
|
153
|
+
// Skip MCP routes — they require session state and are not part of the static site
|
|
154
|
+
if (url.pathname.startsWith('/mcp')) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
// Skip OIDC/well-known routes — not relevant for static export
|
|
158
|
+
if (url.pathname.startsWith('/.well-known')) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
return projectOf(url.pathname) === scope ? req : false;
|
|
162
|
+
},
|
|
163
|
+
afterResponseHook: async (response) => {
|
|
164
|
+
if (![200, 201, 204].includes(response.status)) {
|
|
165
|
+
const error = await response.json();
|
|
166
|
+
if (
|
|
167
|
+
typeof error === 'object' &&
|
|
168
|
+
error != null &&
|
|
169
|
+
'error' in error &&
|
|
170
|
+
typeof error.error === 'string'
|
|
171
|
+
) {
|
|
172
|
+
scopeErrors.push(error.error);
|
|
173
|
+
}
|
|
174
|
+
return false; // ignore route
|
|
159
175
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
return response;
|
|
176
|
+
done++;
|
|
177
|
+
if (done > total) {
|
|
178
|
+
total = done; // adjust total if underestimated
|
|
179
|
+
}
|
|
180
|
+
onProgress?.(done, total);
|
|
181
|
+
return response;
|
|
182
|
+
},
|
|
168
183
|
},
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
184
|
+
],
|
|
185
|
+
});
|
|
186
|
+
if (scopeErrors.length > 0) {
|
|
187
|
+
errors.push({ prefix: scope ?? SHARED_ROUTES, errors: scopeErrors });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
172
190
|
return {
|
|
173
191
|
errors,
|
|
174
192
|
};
|
package/src/index.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { serveStatic } from '@hono/node-server/serve-static';
|
|
|
17
17
|
import path from 'node:path';
|
|
18
18
|
import { readFile } from 'node:fs/promises';
|
|
19
19
|
import { findFreePort } from './utils.js';
|
|
20
|
+
import { startPolicyPolling } from './overlay.js';
|
|
20
21
|
import { createApp } from './app.js';
|
|
21
22
|
import type { AuthProvider } from './auth/types.js';
|
|
22
23
|
import type { ProjectRegistry } from './project-registry.js';
|
|
@@ -25,6 +26,7 @@ export type { MockUserConfig } from './auth/mock.js';
|
|
|
25
26
|
export type { AuthProvider } from './auth/types.js';
|
|
26
27
|
export { exportSite, type ExportSiteOptions } from './export.js';
|
|
27
28
|
export { ProjectRegistry } from './project-registry.js';
|
|
29
|
+
export { formatProjectErrors, type ProjectErrors } from './project-errors.js';
|
|
28
30
|
|
|
29
31
|
const DEFAULT_PORT = 3000;
|
|
30
32
|
const DEFAULT_MAX_PORT = DEFAULT_PORT + 100;
|
|
@@ -72,6 +74,7 @@ export async function startServer(
|
|
|
72
74
|
if (findPort && !useOsAssigned) {
|
|
73
75
|
port = await findFreePort(port, DEFAULT_MAX_PORT);
|
|
74
76
|
}
|
|
77
|
+
startPolicyPolling(() => registry.list().map((p) => ({ prefix: p.prefix })));
|
|
75
78
|
const app = createApp(
|
|
76
79
|
authProvider,
|
|
77
80
|
registry,
|
package/src/main.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { MockAuthProvider } from './auth/mock.js';
|
|
|
17
17
|
import { KeycloakAuthProvider } from './auth/keycloak.js';
|
|
18
18
|
import type { AuthProvider } from './auth/types.js';
|
|
19
19
|
import { ProjectRegistry } from './project-registry.js';
|
|
20
|
+
import { formatProjectErrors } from './project-errors.js';
|
|
20
21
|
import { gitOptionsFromEnv } from './utils.js';
|
|
21
22
|
import { parseArgs } from 'node:util';
|
|
22
23
|
import dotenv from 'dotenv';
|
|
@@ -35,7 +36,7 @@ function createAuthProvider(): AuthProvider {
|
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
if (authMode === 'mock') {
|
|
38
|
-
return new MockAuthProvider();
|
|
39
|
+
return new MockAuthProvider({ roster: true });
|
|
39
40
|
}
|
|
40
41
|
|
|
41
42
|
if (authMode === 'idp') {
|
|
@@ -84,18 +85,35 @@ if (args.export) {
|
|
|
84
85
|
console.error('No projects found to export.');
|
|
85
86
|
process.exit(1);
|
|
86
87
|
}
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
88
|
+
const defaultProject =
|
|
89
|
+
typeof args['default-project'] === 'string'
|
|
90
|
+
? args['default-project']
|
|
91
|
+
: undefined;
|
|
92
|
+
const { registry, failed } =
|
|
93
|
+
await ProjectRegistry.fromScannedProjects(projects);
|
|
94
|
+
if (
|
|
95
|
+
registry.list().length === 0 ||
|
|
96
|
+
failed.some((f) => f.prefix === defaultProject)
|
|
97
|
+
) {
|
|
98
|
+
console.error(formatProjectErrors(failed));
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
const { errors: exportErrors } = await exportSite(registry, undefined, {
|
|
102
|
+
defaultProject,
|
|
93
103
|
});
|
|
104
|
+
const errors = [...failed, ...exportErrors];
|
|
105
|
+
if (errors.length > 0) {
|
|
106
|
+
console.error(formatProjectErrors(errors));
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
94
109
|
} else {
|
|
95
|
-
const registry = await ProjectRegistry.fromScannedProjects(
|
|
110
|
+
const { registry, failed } = await ProjectRegistry.fromScannedProjects(
|
|
96
111
|
projects,
|
|
97
112
|
gitOptionsFromEnv(),
|
|
98
113
|
);
|
|
114
|
+
if (failed.length > 0) {
|
|
115
|
+
console.error(formatProjectErrors(failed));
|
|
116
|
+
}
|
|
99
117
|
const authProvider = createAuthProvider();
|
|
100
118
|
await startServer(authProvider, registry, true, projectPath);
|
|
101
119
|
}
|
package/src/middleware/auth.ts
CHANGED
|
@@ -15,11 +15,13 @@ import type { Context, MiddlewareHandler } from 'hono';
|
|
|
15
15
|
import type { UserInfo } from '../types.js';
|
|
16
16
|
import { UserRole } from '../types.js';
|
|
17
17
|
import type { AuthProvider } from '../auth/types.js';
|
|
18
|
+
import { isReadOnly } from '../overlay.js';
|
|
18
19
|
|
|
19
20
|
// Extend Hono Context type to include our custom properties
|
|
20
21
|
declare module 'hono' {
|
|
21
22
|
interface ContextVariableMap {
|
|
22
23
|
user: UserInfo;
|
|
24
|
+
tokenExp: number;
|
|
23
25
|
}
|
|
24
26
|
}
|
|
25
27
|
|
|
@@ -30,6 +32,14 @@ const roleLevel: Record<UserRole, number> = {
|
|
|
30
32
|
[UserRole.Admin]: 2,
|
|
31
33
|
};
|
|
32
34
|
|
|
35
|
+
/** Everyone below administrator is a reader; lifting read-only is their job. */
|
|
36
|
+
function applyReadOnly(user: UserInfo): UserInfo {
|
|
37
|
+
if (user.role === UserRole.Admin) {
|
|
38
|
+
return user;
|
|
39
|
+
}
|
|
40
|
+
return { ...user, role: UserRole.Reader };
|
|
41
|
+
}
|
|
42
|
+
|
|
33
43
|
/**
|
|
34
44
|
* Create authentication middleware from an AuthProvider.
|
|
35
45
|
* Validates the user and attaches user info to the context.
|
|
@@ -38,10 +48,12 @@ export function createAuthMiddleware(
|
|
|
38
48
|
provider: AuthProvider,
|
|
39
49
|
): MiddlewareHandler {
|
|
40
50
|
return async (c, next) => {
|
|
41
|
-
const
|
|
51
|
+
const result = await provider.authenticate(c.req.raw);
|
|
42
52
|
|
|
43
|
-
if (
|
|
44
|
-
|
|
53
|
+
if (result) {
|
|
54
|
+
const { exp, ...user } = result;
|
|
55
|
+
c.set('user', isReadOnly(c.req.path) ? applyReadOnly(user) : user);
|
|
56
|
+
c.set('tokenExp', exp);
|
|
45
57
|
} else {
|
|
46
58
|
// RFC 9728 §5.1: include resource_metadata in WWW-Authenticate
|
|
47
59
|
// only for MCP routes, where the metadata document applies.
|
|
@@ -60,6 +72,13 @@ export function createAuthMiddleware(
|
|
|
60
72
|
};
|
|
61
73
|
}
|
|
62
74
|
|
|
75
|
+
/**
|
|
76
|
+
* Check if a role meets or exceeds a minimum role in the hierarchy.
|
|
77
|
+
*/
|
|
78
|
+
export function isAtLeastRole(role: UserRole, minimumRole: UserRole): boolean {
|
|
79
|
+
return roleLevel[role] >= roleLevel[minimumRole];
|
|
80
|
+
}
|
|
81
|
+
|
|
63
82
|
/**
|
|
64
83
|
* Check if the current user has at least the required role
|
|
65
84
|
*/
|
|
@@ -69,7 +88,7 @@ export function hasRole(c: Context, minimumRole: UserRole): boolean {
|
|
|
69
88
|
return false;
|
|
70
89
|
}
|
|
71
90
|
|
|
72
|
-
return
|
|
91
|
+
return isAtLeastRole(user.role, minimumRole);
|
|
73
92
|
}
|
|
74
93
|
|
|
75
94
|
/**
|
|
@@ -14,11 +14,13 @@ import type { Context, MiddlewareHandler } from 'hono';
|
|
|
14
14
|
import type { CommandManager } from '@cyberismo/data-handler';
|
|
15
15
|
import { getCurrentUser } from './auth.js';
|
|
16
16
|
import type { ProjectRegistry } from '../project-registry.js';
|
|
17
|
+
import type { ProjectEvents } from '../domain/events/project-events.js';
|
|
17
18
|
|
|
18
19
|
// Extend Hono Context type to include our custom properties
|
|
19
20
|
declare module 'hono' {
|
|
20
21
|
interface ContextVariableMap {
|
|
21
22
|
commands: CommandManager;
|
|
23
|
+
events: ProjectEvents;
|
|
22
24
|
projectPath: string;
|
|
23
25
|
registry: ProjectRegistry;
|
|
24
26
|
}
|
|
@@ -73,6 +75,7 @@ export const attachProjectRegistry = (
|
|
|
73
75
|
if (!commands) {
|
|
74
76
|
return c.json({ error: `Project '${prefix}' not found` }, 404);
|
|
75
77
|
}
|
|
78
|
+
c.set('events', registry.eventsFor(commands));
|
|
76
79
|
return runWithCommands(c, commands, next);
|
|
77
80
|
};
|
|
78
81
|
};
|