@cyberismo/backend 1.1.2 → 1.3.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.d.ts +5 -15
- package/dist/app.js +46 -44
- package/dist/app.js.map +1 -1
- package/dist/auth/index.d.ts +1 -13
- package/dist/auth/index.js +3 -13
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/keycloak.d.ts +2 -15
- package/dist/auth/keycloak.js +8 -12
- package/dist/auth/keycloak.js.map +1 -1
- package/dist/auth/mock.d.ts +12 -20
- package/dist/auth/mock.js +121 -43
- package/dist/auth/mock.js.map +1 -1
- package/dist/auth/types.d.ts +7 -13
- package/dist/auth/types.js +2 -12
- package/dist/auth/types.js.map +1 -1
- package/dist/common/errors.d.ts +12 -0
- package/dist/common/errors.js +31 -0
- package/dist/common/errors.js.map +1 -0
- package/dist/common/validationSchemas.d.ts +0 -12
- package/dist/common/validationSchemas.js +2 -12
- package/dist/common/validationSchemas.js.map +1 -1
- package/dist/domain/auth/index.d.ts +0 -12
- package/dist/domain/auth/index.js +2 -12
- package/dist/domain/auth/index.js.map +1 -1
- package/dist/domain/calculations/index.d.ts +0 -12
- package/dist/domain/calculations/index.js +4 -14
- package/dist/domain/calculations/index.js.map +1 -1
- package/dist/domain/calculations/schema.d.ts +0 -12
- package/dist/domain/calculations/schema.js +2 -12
- package/dist/domain/calculations/schema.js.map +1 -1
- package/dist/domain/calculations/service.d.ts +2 -14
- package/dist/domain/calculations/service.js +7 -17
- package/dist/domain/calculations/service.js.map +1 -1
- package/dist/domain/cardTypes/index.d.ts +0 -12
- package/dist/domain/cardTypes/index.js +10 -20
- package/dist/domain/cardTypes/index.js.map +1 -1
- package/dist/domain/cardTypes/schema.d.ts +0 -12
- package/dist/domain/cardTypes/schema.js +2 -12
- package/dist/domain/cardTypes/schema.js.map +1 -1
- package/dist/domain/cardTypes/service.d.ts +4 -16
- package/dist/domain/cardTypes/service.js +17 -25
- package/dist/domain/cardTypes/service.js.map +1 -1
- package/dist/domain/cards/index.d.ts +0 -12
- package/dist/domain/cards/index.js +120 -175
- package/dist/domain/cards/index.js.map +1 -1
- package/dist/domain/cards/lib.d.ts +6 -23
- package/dist/domain/cards/lib.js +7 -135
- package/dist/domain/cards/lib.js.map +1 -1
- package/dist/domain/cards/mermaid.d.ts +8 -0
- package/dist/domain/cards/mermaid.js +23 -0
- package/dist/domain/cards/mermaid.js.map +1 -0
- package/dist/domain/cards/schema.d.ts +6 -12
- package/dist/domain/cards/schema.js +15 -15
- package/dist/domain/cards/schema.js.map +1 -1
- package/dist/domain/cards/service.d.ts +29 -36
- package/dist/domain/cards/service.js +119 -90
- package/dist/domain/cards/service.js.map +1 -1
- package/dist/domain/connectors/index.d.ts +0 -12
- package/dist/domain/connectors/index.js +4 -14
- package/dist/domain/connectors/index.js.map +1 -1
- package/dist/domain/connectors/service.d.ts +2 -14
- package/dist/domain/connectors/service.js +4 -14
- package/dist/domain/connectors/service.js.map +1 -1
- package/dist/domain/events/events-by-project.d.ts +19 -0
- package/dist/domain/events/events-by-project.js +57 -0
- package/dist/domain/events/events-by-project.js.map +1 -0
- package/dist/domain/events/index.d.ts +3 -0
- package/dist/domain/events/index.js +84 -0
- package/dist/domain/events/index.js.map +1 -0
- package/dist/domain/events/lifetime.d.ts +2 -0
- package/dist/domain/events/lifetime.js +15 -0
- package/dist/domain/events/lifetime.js.map +1 -0
- package/dist/domain/events/project-events.d.ts +63 -0
- package/dist/domain/events/project-events.js +204 -0
- package/dist/domain/events/project-events.js.map +1 -0
- package/dist/domain/events/schema.d.ts +10 -0
- package/dist/domain/events/schema.js +10 -0
- package/dist/domain/events/schema.js.map +1 -0
- package/dist/domain/fieldTypes/index.d.ts +0 -12
- package/dist/domain/fieldTypes/index.js +6 -16
- package/dist/domain/fieldTypes/index.js.map +1 -1
- package/dist/domain/fieldTypes/schema.d.ts +0 -12
- package/dist/domain/fieldTypes/schema.js +2 -12
- package/dist/domain/fieldTypes/schema.js.map +1 -1
- package/dist/domain/fieldTypes/service.d.ts +4 -16
- package/dist/domain/fieldTypes/service.js +7 -17
- package/dist/domain/fieldTypes/service.js.map +1 -1
- package/dist/domain/graphModels/index.d.ts +0 -12
- package/dist/domain/graphModels/index.js +4 -14
- package/dist/domain/graphModels/index.js.map +1 -1
- package/dist/domain/graphModels/schema.d.ts +0 -12
- package/dist/domain/graphModels/schema.js +2 -12
- package/dist/domain/graphModels/schema.js.map +1 -1
- package/dist/domain/graphModels/service.d.ts +2 -14
- package/dist/domain/graphModels/service.js +4 -14
- package/dist/domain/graphModels/service.js.map +1 -1
- package/dist/domain/graphViews/index.d.ts +0 -12
- package/dist/domain/graphViews/index.js +4 -14
- package/dist/domain/graphViews/index.js.map +1 -1
- package/dist/domain/graphViews/schema.js +2 -0
- package/dist/domain/graphViews/schema.js.map +1 -1
- package/dist/domain/graphViews/service.d.ts +2 -14
- package/dist/domain/graphViews/service.js +4 -14
- package/dist/domain/graphViews/service.js.map +1 -1
- package/dist/domain/labels/index.d.ts +0 -12
- package/dist/domain/labels/index.js +4 -14
- package/dist/domain/labels/index.js.map +1 -1
- package/dist/domain/labels/service.d.ts +3 -15
- package/dist/domain/labels/service.js +5 -15
- package/dist/domain/labels/service.js.map +1 -1
- package/dist/domain/linkTypes/index.d.ts +0 -12
- package/dist/domain/linkTypes/index.js +6 -16
- package/dist/domain/linkTypes/index.js.map +1 -1
- package/dist/domain/linkTypes/schema.d.ts +0 -12
- package/dist/domain/linkTypes/schema.js +2 -12
- package/dist/domain/linkTypes/schema.js.map +1 -1
- package/dist/domain/linkTypes/service.d.ts +3 -15
- package/dist/domain/linkTypes/service.js +7 -17
- package/dist/domain/linkTypes/service.js.map +1 -1
- package/dist/domain/logicPrograms/index.d.ts +0 -12
- package/dist/domain/logicPrograms/index.js +4 -14
- package/dist/domain/logicPrograms/index.js.map +1 -1
- package/dist/domain/logicPrograms/service.d.ts +2 -14
- package/dist/domain/logicPrograms/service.js +5 -3
- package/dist/domain/logicPrograms/service.js.map +1 -1
- package/dist/domain/mcp/index.d.ts +3 -15
- package/dist/domain/mcp/index.js +27 -21
- package/dist/domain/mcp/index.js.map +1 -1
- package/dist/domain/project/index.d.ts +0 -12
- package/dist/domain/project/index.js +41 -39
- package/dist/domain/project/index.js.map +1 -1
- package/dist/domain/project/schema.d.ts +8 -12
- package/dist/domain/project/schema.js +36 -18
- package/dist/domain/project/schema.js.map +1 -1
- package/dist/domain/project/service.d.ts +20 -28
- package/dist/domain/project/service.js +56 -60
- package/dist/domain/project/service.js.map +1 -1
- package/dist/domain/projects/index.d.ts +2 -14
- package/dist/domain/projects/index.js +23 -36
- package/dist/domain/projects/index.js.map +1 -1
- package/dist/domain/projects/schema.d.ts +1 -12
- package/dist/domain/projects/schema.js +3 -12
- package/dist/domain/projects/schema.js.map +1 -1
- package/dist/domain/projects/service.d.ts +9 -35
- package/dist/domain/projects/service.js +12 -48
- package/dist/domain/projects/service.js.map +1 -1
- package/dist/domain/reports/index.d.ts +0 -12
- package/dist/domain/reports/index.js +4 -14
- package/dist/domain/reports/index.js.map +1 -1
- package/dist/domain/reports/schema.d.ts +0 -12
- package/dist/domain/reports/schema.js +2 -12
- package/dist/domain/reports/schema.js.map +1 -1
- package/dist/domain/reports/service.d.ts +2 -14
- package/dist/domain/reports/service.js +4 -14
- package/dist/domain/reports/service.js.map +1 -1
- package/dist/domain/resources/index.d.ts +0 -12
- package/dist/domain/resources/index.js +91 -26
- package/dist/domain/resources/index.js.map +1 -1
- package/dist/domain/resources/schema.d.ts +8 -2
- package/dist/domain/resources/schema.js +8 -1
- package/dist/domain/resources/schema.js.map +1 -1
- package/dist/domain/resources/service.d.ts +23 -23
- package/dist/domain/resources/service.js +83 -51
- package/dist/domain/resources/service.js.map +1 -1
- package/dist/domain/skills/index.d.ts +3 -0
- package/dist/domain/skills/index.js +42 -0
- package/dist/domain/skills/index.js.map +1 -0
- package/dist/domain/skills/schema.d.ts +4 -0
- package/dist/domain/skills/schema.js +8 -0
- package/dist/domain/skills/schema.js.map +1 -0
- package/dist/domain/skills/service.d.ts +2 -0
- package/dist/domain/skills/service.js +6 -0
- package/dist/domain/skills/service.js.map +1 -0
- package/dist/domain/templates/index.d.ts +0 -12
- package/dist/domain/templates/index.js +8 -18
- package/dist/domain/templates/index.js.map +1 -1
- package/dist/domain/templates/schema.d.ts +0 -12
- package/dist/domain/templates/schema.js +2 -12
- package/dist/domain/templates/schema.js.map +1 -1
- package/dist/domain/templates/service.d.ts +4 -16
- package/dist/domain/templates/service.js +8 -18
- package/dist/domain/templates/service.js.map +1 -1
- package/dist/domain/tree/index.d.ts +0 -12
- package/dist/domain/tree/index.js +4 -14
- package/dist/domain/tree/index.js.map +1 -1
- package/dist/domain/tree/service.d.ts +3 -15
- package/dist/domain/tree/service.js +8 -15
- package/dist/domain/tree/service.js.map +1 -1
- package/dist/domain/workflows/index.d.ts +0 -12
- package/dist/domain/workflows/index.js +4 -14
- package/dist/domain/workflows/index.js.map +1 -1
- package/dist/domain/workflows/schema.d.ts +0 -12
- package/dist/domain/workflows/schema.js +2 -12
- package/dist/domain/workflows/schema.js.map +1 -1
- package/dist/domain/workflows/service.d.ts +2 -14
- package/dist/domain/workflows/service.js +4 -14
- package/dist/domain/workflows/service.js.map +1 -1
- package/dist/export.d.ts +8 -21
- package/dist/export.js +71 -66
- package/dist/export.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.js +20 -41
- package/dist/index.js.map +1 -1
- package/dist/main.js +36 -32
- package/dist/main.js.map +1 -1
- package/dist/middleware/auth.d.ts +5 -12
- package/dist/middleware/auth.js +22 -16
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/commandManager.d.ts +17 -20
- package/dist/middleware/commandManager.js +27 -35
- package/dist/middleware/commandManager.js.map +1 -1
- package/dist/middleware/tree.js +2 -0
- package/dist/middleware/tree.js.map +1 -1
- package/dist/middleware/zvalidator.js +2 -0
- package/dist/middleware/zvalidator.js.map +1 -1
- package/dist/overlay.d.ts +33 -0
- package/dist/overlay.js +162 -0
- package/dist/overlay.js.map +1 -0
- package/dist/public/THIRD-PARTY.txt +1892 -688
- package/dist/public/assets/__vite-browser-external-DGgK3jMU.js +1 -0
- package/dist/public/assets/abnfDiagram-WEYOIA3C-B3qq7PKv.js +1 -0
- package/dist/public/assets/architecture-WOLXFQ4H-Bzau2LI0.js +1 -0
- package/dist/public/assets/architectureDiagram-ZHVYKT53-Bg0cUwdb.js +36 -0
- package/dist/public/assets/blockDiagram-RJAE7QA3-0RJB-ra-.js +140 -0
- package/dist/public/assets/c4Diagram-XDPPPE54-BzoQcLvf.js +38 -0
- package/dist/public/assets/channel-6BNdw4Ax.js +1 -0
- package/dist/public/assets/{chunk-MOJQB5TN-D1shKbMs.js → chunk-2E7WHVMD-6aqPk-Hk.js} +4 -4
- package/dist/public/assets/chunk-4EMNKR2T-vovNSAaE.js +1 -0
- package/dist/public/assets/chunk-55XCU76K-DXkKnt2y.js +1 -0
- package/dist/public/assets/chunk-7S6XSTFO-B9bfO0l3.js +2 -0
- package/dist/public/assets/chunk-AQDTSKZB-ilLy_cYP.js +72 -0
- package/dist/public/assets/chunk-DSNLSHJZ-DAudglXu.js +129 -0
- package/dist/public/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
- package/dist/public/assets/chunk-HAGFOTED-CSKFgs6b.js +62 -0
- package/dist/public/assets/chunk-HNE4Q36P-Cu5gPBVk.js +1 -0
- package/dist/public/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
- package/dist/public/assets/chunk-NGNAAXSQ-DI_UYJZ4.js +136 -0
- package/dist/public/assets/chunk-NQOKRVIF-Bpcvhq1n.js +213 -0
- package/dist/public/assets/chunk-UHW7PFBP-BDjvOaTH.js +1 -0
- package/dist/public/assets/chunk-VQ5W62QI-DHTcO93W.js +1 -0
- package/dist/public/assets/chunk-WQQL4CDK-H6nAhuck.js +10 -0
- package/dist/public/assets/chunk-XXDRQBXY-BUghdEVl.js +1 -0
- package/dist/public/assets/chunk-YZO67HFG-D13E0_Yh.js +1 -0
- package/dist/public/assets/chunk-ZAUX2LTX-Dp5y-2wt.js +1 -0
- package/dist/public/assets/chunk-ZCHMQSOR-RJjlln1D.js +2 -0
- package/dist/public/assets/classDiagram-v2-4MYWR3UA-CAqiFCSv.js +217 -0
- package/dist/public/assets/cose-bilkent-JH36ORCC-C_VOHzoP.js +1 -0
- package/dist/public/assets/cynefin-EF2NZ3EQ-Dyk4ZPjK.js +1 -0
- package/dist/public/assets/cynefinDiagram-WF24UDRP-b_Ia8gQX.js +62 -0
- package/dist/public/assets/cytoscape.esm-GRKmfDkD.js +321 -0
- package/dist/public/assets/dagre-NK4GIZVX-CH1K1yF8.js +4 -0
- package/dist/public/assets/diagram-CBK3MWTC-OaKd5avy.js +24 -0
- package/dist/public/assets/diagram-I5XIIV2D-Cmu5z1ad.js +24 -0
- package/dist/public/assets/diagram-ODIL2UCW-Cz1kkDDX.js +30 -0
- package/dist/public/assets/diagram-PFBEJUXE-faMkmqUW.js +3 -0
- package/dist/public/assets/diagram-RJA3I4VV-nycvfte-.js +41 -0
- package/dist/public/assets/diagram-TYUNFSNR-CjEv5QCm.js +200 -0
- package/dist/public/assets/dist-DGs_yUrP.js +1 -0
- package/dist/public/assets/ebnfDiagram-V4P3TTPT-DN-IIxCy.js +1 -0
- package/dist/public/assets/elk-QONTBCTQ-Bsam88GP.js +27 -0
- package/dist/public/assets/erDiagram-KYQIGQAA-DEU_qqNK.js +99 -0
- package/dist/public/assets/eventmodeling-K75KTNOO-Bl6NCM9E.js +1 -0
- package/dist/public/assets/flowDiagram-IUGLLWBU-Cl4qZ-36.js +1 -0
- package/dist/public/assets/ganttDiagram-R7GPNTJY-BmMd4aGi.js +292 -0
- package/dist/public/assets/gitGraph-VSP46ZUC-Q0H2PWek.js +1 -0
- package/dist/public/assets/gitGraphDiagram-PDYL7XHY-BlCTBYTj.js +106 -0
- package/dist/public/assets/index-CuBJ0hof.css +1 -0
- package/dist/public/assets/index-D6WqGtsG.js +27876 -0
- package/dist/public/assets/index-D701BZPh.js +2219 -0
- package/dist/public/assets/info-OHQRW6UA-D0TMPJxW.js +1 -0
- package/dist/public/assets/infoDiagram-MVDRKAX5-CljbtJXu.js +2 -0
- package/dist/public/assets/{ishikawaDiagram-FXEZZL3T-CiLpASIW.js → ishikawaDiagram-HPEHV2GE-_Y3Fr0hu.js} +6 -6
- package/dist/public/assets/journeyDiagram-BOSHW7O7-Bo55jJ4m.js +139 -0
- package/dist/public/assets/kanban-definition-FNSA4HC5-Cd-10MtF.js +89 -0
- package/dist/public/assets/katex-MEuSR36T.js +257 -0
- package/dist/public/assets/line-BDmh4sWC.js +1 -0
- package/dist/public/assets/linear-Dt7xjMrI.js +1 -0
- package/dist/public/assets/mermaid-parser.core-BJ1yyzvV.js +7 -0
- package/dist/public/assets/mindmap-definition-6OY57UG3-CRgumPuN.js +98 -0
- package/dist/public/assets/packet-JDAUHWVQ-DsTMT3Kw.js +1 -0
- package/dist/public/assets/path-B_0haWDX.js +1 -0
- package/dist/public/assets/pegDiagram-ECIUJNBX-BEGI5k3m.js +1 -0
- package/dist/public/assets/pie-XZMESJXO-COyqzA3N.js +1 -0
- package/dist/public/assets/pieDiagram-GNMPY74T-CrLJhZJJ.js +39 -0
- package/dist/public/assets/{quadrantDiagram-ABIIQ3AL-B3czMbdS.js → quadrantDiagram-D57K4MC3-Fl7HMHxK.js} +6 -6
- package/dist/public/assets/radar-ABXABTNO-DeXHKowk.js +1 -0
- package/dist/public/assets/railroad-I3PHUGI6-CUjKUdPz.js +1 -0
- package/dist/public/assets/railroad-abnf-LNEFI6M7-B1aEgHE6.js +1 -0
- package/dist/public/assets/railroad-ebnf-DWYD2UWJ-DmmI3Voz.js +1 -0
- package/dist/public/assets/railroad-peg-JR7BVNR7-BHzi9m7r.js +1 -0
- package/dist/public/assets/railroadDiagram-Y72NRBL7-D1oeE5fy.js +1 -0
- package/dist/public/assets/requirementDiagram-EQYSW5RA-BJDKK1aS.js +84 -0
- package/dist/public/assets/rolldown-runtime-BCiCTKAo.js +1 -0
- package/dist/public/assets/{rough.esm-By172zw-.js → rough.esm-Dy-Kn_BL.js} +1 -1
- package/dist/public/assets/sankeyDiagram-SY24JHO5-C4g0OwZ9.js +40 -0
- package/dist/public/assets/sequenceDiagram-BLEHNHQU-CEvy4P-b.js +169 -0
- package/dist/public/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/dist/public/assets/src-MPsEqXxq.js +1 -0
- package/dist/public/assets/stateDiagram-v2-A6IESKWZ-BFhvw4Gl.js +291 -0
- package/dist/public/assets/swimlanes-B3ENRKFQ-BIl_Q-FM.js +1 -0
- package/dist/public/assets/swimlanesDiagram-AYQRV4AK-rvDbKEHQ.js +8 -0
- package/dist/public/assets/timeline-definition-JXYKGLGB-qAoWTH4N.js +120 -0
- package/dist/public/assets/treeView-D4JQ5SDB-vq16JKkJ.js +1 -0
- package/dist/public/assets/treemap-SAJKECNS-C0IZTaDk.js +1 -0
- package/dist/public/assets/usecaseDiagram-WPOLBNNX-Dq8iz49r.js +328 -0
- package/dist/public/assets/vennDiagram-Q3Y3IDCW-Br4JmRjM.js +34 -0
- package/dist/public/assets/wardley-7MLQ67FV-CEPlAQ79.js +1 -0
- package/dist/public/assets/wardleyDiagram-IVAIDKWA-DURB7Ue6.js +78 -0
- package/dist/public/assets/xychartDiagram-4URNHDU4-BiZywfhy.js +7 -0
- package/dist/public/index.html +27 -28
- package/dist/public/sbom.cdx.json +1 -0
- package/dist/types.d.ts +0 -12
- package/dist/types.js +2 -12
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +12 -5
- package/dist/utils.js +18 -43
- package/dist/utils.js.map +1 -1
- package/package.json +14 -14
- package/src/app.ts +51 -49
- package/src/auth/index.ts +3 -13
- package/src/auth/keycloak.ts +10 -15
- package/src/auth/mock.ts +144 -48
- package/src/auth/types.ts +10 -13
- package/src/common/errors.ts +45 -0
- package/src/common/validationSchemas.ts +3 -12
- package/src/domain/auth/index.ts +2 -12
- package/src/domain/calculations/index.ts +4 -14
- package/src/domain/calculations/schema.ts +2 -12
- package/src/domain/calculations/service.ts +8 -21
- package/src/domain/cardTypes/index.ts +10 -20
- package/src/domain/cardTypes/schema.ts +3 -12
- package/src/domain/cardTypes/service.ts +22 -29
- package/src/domain/cards/index.ts +158 -218
- package/src/domain/cards/lib.ts +9 -173
- package/src/domain/cards/mermaid.ts +25 -0
- package/src/domain/cards/schema.ts +19 -15
- package/src/domain/cards/service.ts +166 -134
- package/src/domain/connectors/index.ts +5 -14
- package/src/domain/connectors/service.ts +5 -20
- package/src/domain/events/events-by-project.ts +59 -0
- package/src/domain/events/index.ts +102 -0
- package/src/domain/events/lifetime.ts +17 -0
- package/src/domain/events/project-events.ts +266 -0
- package/src/domain/events/schema.ts +11 -0
- package/src/domain/fieldTypes/index.ts +6 -16
- package/src/domain/fieldTypes/schema.ts +3 -12
- package/src/domain/fieldTypes/service.ts +9 -21
- package/src/domain/graphModels/index.ts +4 -14
- package/src/domain/graphModels/schema.ts +3 -12
- package/src/domain/graphModels/service.ts +5 -18
- package/src/domain/graphViews/index.ts +4 -14
- package/src/domain/graphViews/schema.ts +3 -0
- package/src/domain/graphViews/service.ts +5 -18
- package/src/domain/labels/index.ts +4 -14
- package/src/domain/labels/service.ts +6 -16
- package/src/domain/linkTypes/index.ts +6 -16
- package/src/domain/linkTypes/schema.ts +2 -12
- package/src/domain/linkTypes/service.ts +8 -21
- package/src/domain/logicPrograms/index.ts +5 -17
- package/src/domain/logicPrograms/service.ts +7 -16
- package/src/domain/mcp/index.ts +33 -24
- package/src/domain/project/index.ts +59 -37
- package/src/domain/project/schema.ts +41 -18
- package/src/domain/project/service.ts +81 -71
- package/src/domain/projects/index.ts +38 -50
- package/src/domain/projects/schema.ts +3 -12
- package/src/domain/projects/service.ts +18 -88
- package/src/domain/reports/index.ts +4 -14
- package/src/domain/reports/schema.ts +2 -12
- package/src/domain/reports/service.ts +5 -18
- package/src/domain/resources/index.ts +102 -30
- package/src/domain/resources/schema.ts +15 -2
- package/src/domain/resources/service.ts +98 -81
- package/src/domain/skills/index.ts +51 -0
- package/src/domain/skills/schema.ts +9 -0
- package/src/domain/skills/service.ts +8 -0
- package/src/domain/templates/index.ts +8 -18
- package/src/domain/templates/schema.ts +2 -12
- package/src/domain/templates/service.ts +9 -22
- package/src/domain/tree/index.ts +4 -14
- package/src/domain/tree/service.ts +10 -21
- package/src/domain/workflows/index.ts +4 -14
- package/src/domain/workflows/schema.ts +2 -12
- package/src/domain/workflows/service.ts +5 -18
- package/src/export.ts +82 -73
- package/src/index.ts +30 -46
- package/src/main.ts +45 -37
- package/src/middleware/auth.ts +25 -16
- package/src/middleware/commandManager.ts +37 -49
- package/src/middleware/tree.ts +3 -0
- package/src/middleware/zvalidator.ts +3 -0
- package/src/overlay.ts +185 -0
- package/src/types.ts +2 -12
- package/src/utils.ts +26 -46
- 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/project-registry.d.ts +0 -57
- package/dist/project-registry.js +0 -93
- package/dist/project-registry.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-EX3LRPZG-Db0XYyxy.js +0 -231
- package/dist/public/assets/chunk-FWX5IMBZ-BF_P2-Do.js +0 -2
- package/dist/public/assets/chunk-HOUHSVGY-L35GPy9G.js +0 -1
- 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-V7JOEXUC-71b0ABpv.js +0 -206
- package/dist/public/assets/chunk-VAUOI2AC-C-GBw18h.js +0 -1
- package/dist/public/assets/chunk-VR4S4FIN-tUhbELKr.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-FQU43EPY-DS-ryuRg.js +0 -3
- 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/gitGraphDiagram-IHSO6WYX-CksvJvsQ.js +0 -106
- package/dist/public/assets/index-COSSLZqt.css +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/kanban-definition-HUTT4EX6-DYP_x6zD.js +0 -89
- package/dist/public/assets/katex-DolUETbr.js +0 -257
- package/dist/public/assets/line-C8Sfsgt8.js +0 -1
- 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/mindmap-definition-LN4V7U3C-3IAd4gp3.js +0 -96
- 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/requirementDiagram-TGXJPOKE-CmvJWy_S.js +0 -84
- package/dist/public/assets/sankeyDiagram-HTMAVEWB-tAeOzMTn.js +0 -40
- package/dist/public/assets/sequenceDiagram-DBY2YBRQ-r0pwijM4.js +0 -162
- 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/vennDiagram-L72KCM5P-ti2qNcvo.js +0 -34
- package/dist/public/assets/wardley-OPB4EBWU-BX2ghg5e.js +0 -1
- package/dist/public/assets/wardleyDiagram-EHGQE667-C8lblm8x.js +0 -78
- package/dist/public/assets/xychartDiagram-FW5EYKEG-US-_k5eu.js +0 -7
- package/src/domain/cards/presence.ts +0 -124
- package/src/project-registry.ts +0 -130
package/src/main.ts
CHANGED
|
@@ -1,22 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
import { scanForProjects } from '@cyberismo/data-handler';
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
|
|
4
|
+
import { localFolder } from '@cyberismo/data-handler';
|
|
14
5
|
import { startServer } from './index.js';
|
|
15
6
|
import { exportSite } from './export.js';
|
|
16
7
|
import { MockAuthProvider } from './auth/mock.js';
|
|
17
8
|
import { KeycloakAuthProvider } from './auth/keycloak.js';
|
|
18
9
|
import type { AuthProvider } from './auth/types.js';
|
|
19
|
-
import {
|
|
10
|
+
import { formatProjectErrors } from '@cyberismo/model';
|
|
20
11
|
import { gitOptionsFromEnv } from './utils.js';
|
|
21
12
|
import { parseArgs } from 'node:util';
|
|
22
13
|
import dotenv from 'dotenv';
|
|
@@ -35,7 +26,7 @@ function createAuthProvider(): AuthProvider {
|
|
|
35
26
|
}
|
|
36
27
|
|
|
37
28
|
if (authMode === 'mock') {
|
|
38
|
-
return new MockAuthProvider();
|
|
29
|
+
return new MockAuthProvider({ roster: true });
|
|
39
30
|
}
|
|
40
31
|
|
|
41
32
|
if (authMode === 'idp') {
|
|
@@ -59,9 +50,21 @@ function createAuthProvider(): AuthProvider {
|
|
|
59
50
|
}
|
|
60
51
|
|
|
61
52
|
const projectPath = process.env.npm_config_project_path || process.cwd();
|
|
62
|
-
|
|
53
|
+
|
|
54
|
+
const { values: args } = parseArgs({
|
|
55
|
+
options: {
|
|
56
|
+
export: { type: 'boolean', default: false },
|
|
57
|
+
'default-project': { type: 'string' },
|
|
58
|
+
},
|
|
59
|
+
strict: false,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
let opened;
|
|
63
63
|
try {
|
|
64
|
-
|
|
64
|
+
opened = await localFolder(
|
|
65
|
+
projectPath,
|
|
66
|
+
args.export ? undefined : gitOptionsFromEnv(),
|
|
67
|
+
);
|
|
65
68
|
} catch (error) {
|
|
66
69
|
console.error(
|
|
67
70
|
error instanceof Error
|
|
@@ -70,32 +73,37 @@ try {
|
|
|
70
73
|
);
|
|
71
74
|
process.exit(1);
|
|
72
75
|
}
|
|
73
|
-
|
|
74
|
-
const { values: args } = parseArgs({
|
|
75
|
-
options: {
|
|
76
|
-
export: { type: 'boolean', default: false },
|
|
77
|
-
'default-project': { type: 'string' },
|
|
78
|
-
},
|
|
79
|
-
strict: false,
|
|
80
|
-
});
|
|
76
|
+
const { directory, failed } = opened;
|
|
81
77
|
|
|
82
78
|
if (args.export) {
|
|
83
|
-
|
|
79
|
+
const projects = await directory.list();
|
|
80
|
+
if (projects.length === 0 && failed.length === 0) {
|
|
84
81
|
console.error('No projects found to export.');
|
|
85
82
|
process.exit(1);
|
|
86
83
|
}
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
84
|
+
const defaultProject =
|
|
85
|
+
typeof args['default-project'] === 'string'
|
|
86
|
+
? args['default-project']
|
|
87
|
+
: undefined;
|
|
88
|
+
if (
|
|
89
|
+
projects.length === 0 ||
|
|
90
|
+
failed.some((f) => f.prefix === defaultProject)
|
|
91
|
+
) {
|
|
92
|
+
console.error(formatProjectErrors(failed));
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
const { errors: exportErrors } = await exportSite(directory, undefined, {
|
|
96
|
+
defaultProject,
|
|
93
97
|
});
|
|
98
|
+
const errors = [...failed, ...exportErrors];
|
|
99
|
+
if (errors.length > 0) {
|
|
100
|
+
console.error(formatProjectErrors(errors));
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
94
103
|
} else {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
);
|
|
104
|
+
if (failed.length > 0) {
|
|
105
|
+
console.error(formatProjectErrors(failed));
|
|
106
|
+
}
|
|
99
107
|
const authProvider = createAuthProvider();
|
|
100
|
-
await startServer(authProvider,
|
|
108
|
+
await startServer(authProvider, directory, true, projectPath);
|
|
101
109
|
}
|
package/src/middleware/auth.ts
CHANGED
|
@@ -1,25 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
13
3
|
|
|
14
4
|
import type { Context, MiddlewareHandler } from 'hono';
|
|
15
5
|
import type { UserInfo } from '../types.js';
|
|
16
6
|
import { UserRole } from '../types.js';
|
|
17
7
|
import type { AuthProvider } from '../auth/types.js';
|
|
8
|
+
import { isReadOnly } from '../overlay.js';
|
|
18
9
|
|
|
19
10
|
// Extend Hono Context type to include our custom properties
|
|
20
11
|
declare module 'hono' {
|
|
21
12
|
interface ContextVariableMap {
|
|
22
13
|
user: UserInfo;
|
|
14
|
+
tokenExp: number;
|
|
23
15
|
}
|
|
24
16
|
}
|
|
25
17
|
|
|
@@ -30,6 +22,14 @@ const roleLevel: Record<UserRole, number> = {
|
|
|
30
22
|
[UserRole.Admin]: 2,
|
|
31
23
|
};
|
|
32
24
|
|
|
25
|
+
/** Everyone below administrator is a reader; lifting read-only is their job. */
|
|
26
|
+
function applyReadOnly(user: UserInfo): UserInfo {
|
|
27
|
+
if (user.role === UserRole.Admin) {
|
|
28
|
+
return user;
|
|
29
|
+
}
|
|
30
|
+
return { ...user, role: UserRole.Reader };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
33
|
/**
|
|
34
34
|
* Create authentication middleware from an AuthProvider.
|
|
35
35
|
* Validates the user and attaches user info to the context.
|
|
@@ -38,10 +38,12 @@ export function createAuthMiddleware(
|
|
|
38
38
|
provider: AuthProvider,
|
|
39
39
|
): MiddlewareHandler {
|
|
40
40
|
return async (c, next) => {
|
|
41
|
-
const
|
|
41
|
+
const result = await provider.authenticate(c.req.raw);
|
|
42
42
|
|
|
43
|
-
if (
|
|
44
|
-
|
|
43
|
+
if (result) {
|
|
44
|
+
const { exp, ...user } = result;
|
|
45
|
+
c.set('user', isReadOnly(c.req.path) ? applyReadOnly(user) : user);
|
|
46
|
+
c.set('tokenExp', exp);
|
|
45
47
|
} else {
|
|
46
48
|
// RFC 9728 §5.1: include resource_metadata in WWW-Authenticate
|
|
47
49
|
// only for MCP routes, where the metadata document applies.
|
|
@@ -60,6 +62,13 @@ export function createAuthMiddleware(
|
|
|
60
62
|
};
|
|
61
63
|
}
|
|
62
64
|
|
|
65
|
+
/**
|
|
66
|
+
* Check if a role meets or exceeds a minimum role in the hierarchy.
|
|
67
|
+
*/
|
|
68
|
+
export function isAtLeastRole(role: UserRole, minimumRole: UserRole): boolean {
|
|
69
|
+
return roleLevel[role] >= roleLevel[minimumRole];
|
|
70
|
+
}
|
|
71
|
+
|
|
63
72
|
/**
|
|
64
73
|
* Check if the current user has at least the required role
|
|
65
74
|
*/
|
|
@@ -69,7 +78,7 @@ export function hasRole(c: Context, minimumRole: UserRole): boolean {
|
|
|
69
78
|
return false;
|
|
70
79
|
}
|
|
71
80
|
|
|
72
|
-
return
|
|
81
|
+
return isAtLeastRole(user.role, minimumRole);
|
|
73
82
|
}
|
|
74
83
|
|
|
75
84
|
/**
|
|
@@ -1,78 +1,66 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright © Cyberismo Ltd and contributors 2025
|
|
4
|
-
|
|
5
|
-
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation.
|
|
6
|
-
|
|
7
|
-
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
|
|
8
|
-
|
|
9
|
-
You should have received a copy of the GNU Affero General Public
|
|
10
|
-
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
11
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
12
3
|
|
|
13
4
|
import type { Context, MiddlewareHandler } from 'hono';
|
|
14
|
-
import type {
|
|
5
|
+
import type { ActorRef } from '@cyberismo/model';
|
|
6
|
+
import type { ProjectDirectory, Workspace } from '@cyberismo/data-handler';
|
|
15
7
|
import { getCurrentUser } from './auth.js';
|
|
16
|
-
import type
|
|
8
|
+
import { UserRole, type UserInfo } from '../types.js';
|
|
9
|
+
import type { ProjectEvents } from '../domain/events/project-events.js';
|
|
10
|
+
import type { EventsByProject } from '../domain/events/events-by-project.js';
|
|
17
11
|
|
|
18
12
|
// Extend Hono Context type to include our custom properties
|
|
19
13
|
declare module 'hono' {
|
|
20
14
|
interface ContextVariableMap {
|
|
21
|
-
|
|
15
|
+
ws: Workspace;
|
|
16
|
+
events: ProjectEvents;
|
|
22
17
|
projectPath: string;
|
|
23
|
-
|
|
18
|
+
directory: ProjectDirectory;
|
|
19
|
+
eventsByProject: EventsByProject;
|
|
24
20
|
}
|
|
25
21
|
}
|
|
26
22
|
|
|
27
|
-
/**
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
) {
|
|
35
|
-
const user = getCurrentUser(c);
|
|
36
|
-
if (!user) {
|
|
37
|
-
throw new Error('CommandManager expects a user');
|
|
38
|
-
}
|
|
39
|
-
c.set('commands', commands);
|
|
40
|
-
c.set('projectPath', commands.project.basePath);
|
|
41
|
-
await commands.runAsAuthor({ name: user.name, email: user.email }, () =>
|
|
42
|
-
next(),
|
|
43
|
-
);
|
|
23
|
+
/** The actor a user acts as. */
|
|
24
|
+
export function actorOf(user: UserInfo): ActorRef {
|
|
25
|
+
return {
|
|
26
|
+
kind: user.role === UserRole.Connector ? 'connector' : 'user',
|
|
27
|
+
id: user.id,
|
|
28
|
+
name: user.name,
|
|
29
|
+
};
|
|
44
30
|
}
|
|
45
31
|
|
|
46
|
-
// TODO: Remove once MCP is made project-scoped via attachProjectRegistry
|
|
47
|
-
export const attachCommandManager = (
|
|
48
|
-
commands: CommandManager,
|
|
49
|
-
): MiddlewareHandler => {
|
|
50
|
-
return (c, next) => runWithCommands(c, commands, next);
|
|
51
|
-
};
|
|
52
|
-
|
|
53
32
|
/**
|
|
54
|
-
* Middleware that
|
|
55
|
-
*
|
|
33
|
+
* Middleware that opens the authenticated user's handle over the project
|
|
34
|
+
* and puts it, with the project's events and the directory, on the context.
|
|
35
|
+
* An unknown project is refused with ProjectNotFoundError (404).
|
|
56
36
|
*
|
|
57
|
-
* @param
|
|
37
|
+
* @param directory - Directory the project is opened from.
|
|
38
|
+
* @param events - Events of the directory's projects.
|
|
58
39
|
* @param fixedPrefix - When provided, used instead of the `:prefix` route
|
|
59
40
|
* param. This is needed in export/SSG mode where routes are mounted at
|
|
60
41
|
* concrete paths (e.g. `/api/projects/decision/...`) with no dynamic param.
|
|
61
42
|
*/
|
|
62
|
-
export const
|
|
63
|
-
|
|
43
|
+
export const attachProjectDirectory = (
|
|
44
|
+
directory: ProjectDirectory,
|
|
45
|
+
events: EventsByProject,
|
|
64
46
|
fixedPrefix?: string,
|
|
65
47
|
): MiddlewareHandler => {
|
|
66
48
|
return async (c: Context, next) => {
|
|
67
|
-
c.set('registry', registry);
|
|
68
49
|
const prefix = c.req.param('prefix') ?? fixedPrefix;
|
|
69
50
|
if (!prefix) {
|
|
70
51
|
return c.json({ error: 'Project prefix is required' }, 400);
|
|
71
52
|
}
|
|
72
|
-
const
|
|
73
|
-
if (!
|
|
74
|
-
|
|
53
|
+
const user = getCurrentUser(c);
|
|
54
|
+
if (!user) {
|
|
55
|
+
throw new Error('A project handle expects a user');
|
|
75
56
|
}
|
|
76
|
-
|
|
57
|
+
const identity = { name: user.name, email: user.email };
|
|
58
|
+
const ws = await directory.open(prefix, actorOf(user), identity);
|
|
59
|
+
c.set('directory', directory);
|
|
60
|
+
c.set('eventsByProject', events);
|
|
61
|
+
c.set('events', await events.for(prefix));
|
|
62
|
+
c.set('ws', ws);
|
|
63
|
+
c.set('projectPath', ws.path);
|
|
64
|
+
await next();
|
|
77
65
|
};
|
|
78
66
|
};
|
package/src/middleware/tree.ts
CHANGED
package/src/overlay.ts
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Which projects, or the whole instance, are read-only.
|
|
6
|
+
*
|
|
7
|
+
* Polled on a timer so no request waits for it, and permissive on every
|
|
8
|
+
* uncertain path: a freeze arriving late beats an outage. Unset
|
|
9
|
+
* CYBERISMO_OVERLAY_URL means no policy, which is the standalone default.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
import {
|
|
14
|
+
ProjectNotFoundError,
|
|
15
|
+
type ProjectDirectory,
|
|
16
|
+
} from '@cyberismo/data-handler';
|
|
17
|
+
|
|
18
|
+
const POLL_INTERVAL_MS = 10_000;
|
|
19
|
+
const FETCH_TIMEOUT_MS = 2_000;
|
|
20
|
+
|
|
21
|
+
const policySchema = z
|
|
22
|
+
.object({
|
|
23
|
+
readOnly: z.boolean().catch(false),
|
|
24
|
+
projects: z
|
|
25
|
+
.record(z.string(), z.object({ readOnly: z.boolean().catch(false) }))
|
|
26
|
+
.catch({}),
|
|
27
|
+
})
|
|
28
|
+
.catch(() => EMPTY);
|
|
29
|
+
|
|
30
|
+
export type Policy = z.infer<typeof policySchema>;
|
|
31
|
+
|
|
32
|
+
const EMPTY: Policy = { readOnly: false, projects: {} };
|
|
33
|
+
|
|
34
|
+
let current: Policy = EMPTY;
|
|
35
|
+
|
|
36
|
+
export function getPolicy(): Policy {
|
|
37
|
+
return current;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function setPolicy(policy: Policy): void {
|
|
41
|
+
current = policy;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function isProjectReadOnly(prefix: string): boolean {
|
|
45
|
+
return current.readOnly || current.projects[prefix]?.readOnly === true;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** `/api/projects/<prefix>/…` is the only request shape naming a project. */
|
|
49
|
+
export function isReadOnly(path: string): boolean {
|
|
50
|
+
if (current.readOnly) return true;
|
|
51
|
+
const match = /^\/api\/projects\/([^/?#]+)/.exec(path);
|
|
52
|
+
if (!match) return false;
|
|
53
|
+
let prefix: string;
|
|
54
|
+
try {
|
|
55
|
+
prefix = decodeURIComponent(match[1]);
|
|
56
|
+
} catch {
|
|
57
|
+
prefix = match[1];
|
|
58
|
+
}
|
|
59
|
+
return isProjectReadOnly(prefix);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Temporary: the app is the source of truth for which projects exist, so it
|
|
64
|
+
* tells overlay. That inverts once projects are created in overlay's admin
|
|
65
|
+
* views, after which overlay reports them and this goes away.
|
|
66
|
+
*/
|
|
67
|
+
async function reportProjects(
|
|
68
|
+
base: string,
|
|
69
|
+
token: string | undefined,
|
|
70
|
+
projects: { prefix: string }[],
|
|
71
|
+
): Promise<void> {
|
|
72
|
+
const response = await fetch(`${base.replace(/\/$/, '')}/projects`, {
|
|
73
|
+
method: 'PUT',
|
|
74
|
+
headers: {
|
|
75
|
+
'Content-Type': 'application/json',
|
|
76
|
+
...(token ? { 'X-Overlay-Token': token } : {}),
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify({ projects }),
|
|
79
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
80
|
+
});
|
|
81
|
+
if (!response.ok) {
|
|
82
|
+
throw new Error(`responded ${response.status}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function startPolicyPolling(
|
|
87
|
+
projects: () => Promise<{ prefix: string }[]> = async () => [],
|
|
88
|
+
): void {
|
|
89
|
+
const base = process.env.CYBERISMO_OVERLAY_URL;
|
|
90
|
+
if (!base) return;
|
|
91
|
+
const token = process.env.CYBERISMO_OVERLAY_TOKEN;
|
|
92
|
+
const url = `${base.replace(/\/$/, '')}/tenant`;
|
|
93
|
+
|
|
94
|
+
let lastFailure: string | undefined;
|
|
95
|
+
|
|
96
|
+
const poll = async () => {
|
|
97
|
+
try {
|
|
98
|
+
const response = await fetch(url, {
|
|
99
|
+
headers: token ? { 'X-Overlay-Token': token } : {},
|
|
100
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
101
|
+
});
|
|
102
|
+
if (!response.ok) {
|
|
103
|
+
throw new Error(`responded ${response.status}`);
|
|
104
|
+
}
|
|
105
|
+
setPolicy(policySchema.parse(await response.json()));
|
|
106
|
+
if (lastFailure) {
|
|
107
|
+
console.error(`overlay: ${url} is reachable again`);
|
|
108
|
+
lastFailure = undefined;
|
|
109
|
+
}
|
|
110
|
+
} catch (error) {
|
|
111
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
112
|
+
if (reason !== lastFailure) {
|
|
113
|
+
lastFailure = reason;
|
|
114
|
+
console.error(`overlay: ${url} ${reason}, keeping the previous policy`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// Reported every tick from a fresh list, so a project created after start-up
|
|
120
|
+
// is registered within one interval.
|
|
121
|
+
let lastReportFailure: string | undefined;
|
|
122
|
+
const report = async () => {
|
|
123
|
+
const current = await projects();
|
|
124
|
+
if (current.length === 0) return;
|
|
125
|
+
try {
|
|
126
|
+
await reportProjects(base, token, current);
|
|
127
|
+
lastReportFailure = undefined;
|
|
128
|
+
} catch (error) {
|
|
129
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
130
|
+
if (reason !== lastReportFailure) {
|
|
131
|
+
lastReportFailure = reason;
|
|
132
|
+
console.error(`overlay: could not report projects, ${reason}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// setInterval does not wait for the previous run, so skip a tick rather than
|
|
138
|
+
// letting two overlap.
|
|
139
|
+
let running = false;
|
|
140
|
+
const tick = async () => {
|
|
141
|
+
if (running) return;
|
|
142
|
+
running = true;
|
|
143
|
+
try {
|
|
144
|
+
await poll();
|
|
145
|
+
await report();
|
|
146
|
+
} finally {
|
|
147
|
+
running = false;
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
void tick();
|
|
152
|
+
setInterval(() => void tick(), POLL_INTERVAL_MS).unref();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Hide read-only projects from MCP.
|
|
157
|
+
*
|
|
158
|
+
* MCP takes the project as an argument rather than in the path, so the role cap
|
|
159
|
+
* cannot see which one a call touches. Making a frozen project unresolvable
|
|
160
|
+
* fails closed, at the cost of hiding it from reads and from administrators too.
|
|
161
|
+
*/
|
|
162
|
+
export function writableProjects(
|
|
163
|
+
directory: ProjectDirectory,
|
|
164
|
+
): ProjectDirectory {
|
|
165
|
+
return {
|
|
166
|
+
open: async (prefix, actor, identity) => {
|
|
167
|
+
if (isProjectReadOnly(prefix)) {
|
|
168
|
+
throw new ProjectNotFoundError(prefix);
|
|
169
|
+
}
|
|
170
|
+
return directory.open(prefix, actor, identity);
|
|
171
|
+
},
|
|
172
|
+
list: async () =>
|
|
173
|
+
(await directory.list()).filter((p) => !isProjectReadOnly(p.prefix)),
|
|
174
|
+
create: (params, actor, identity) =>
|
|
175
|
+
directory.create(params, actor, identity),
|
|
176
|
+
clone: (url) => directory.clone(url),
|
|
177
|
+
rename: async (prefix, newPrefix, actor, identity, options) => {
|
|
178
|
+
if (isProjectReadOnly(prefix)) {
|
|
179
|
+
throw new ProjectNotFoundError(prefix);
|
|
180
|
+
}
|
|
181
|
+
return directory.rename(prefix, newPrefix, actor, identity, options);
|
|
182
|
+
},
|
|
183
|
+
replace: (prefix) => directory.replace(prefix),
|
|
184
|
+
};
|
|
185
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright © Cyberismo Ltd and contributors 2025
|
|
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
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
13
3
|
|
|
14
4
|
import type { Context } from 'hono';
|
|
15
5
|
|
package/src/utils.ts
CHANGED
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
|
|
13
4
|
import path from 'node:path';
|
|
14
|
-
import {
|
|
5
|
+
import { serve, type ServerType } from '@hono/node-server';
|
|
15
6
|
|
|
16
7
|
/**
|
|
17
8
|
* The relative path to the static frontend directory.
|
|
@@ -22,43 +13,32 @@ export const staticFrontendDirRelative = path.relative(
|
|
|
22
13
|
);
|
|
23
14
|
|
|
24
15
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* @param
|
|
28
|
-
* @
|
|
16
|
+
* Starts the server, moving to the next port while the current one is taken.
|
|
17
|
+
* The bind itself is the check, so a port can't be taken between check and use.
|
|
18
|
+
* @param fetch - Request handler.
|
|
19
|
+
* @param port - The first port to try.
|
|
20
|
+
* @param host - The host to bind.
|
|
21
|
+
* @param maxPort - The last port to try; defaults to `port` (no retry).
|
|
22
|
+
* @returns The listening server and the port it bound.
|
|
29
23
|
*/
|
|
30
|
-
export
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
24
|
+
export function listen(
|
|
25
|
+
fetch: Parameters<typeof serve>[0]['fetch'],
|
|
26
|
+
port: number,
|
|
27
|
+
host: string,
|
|
28
|
+
maxPort: number = port,
|
|
29
|
+
): Promise<{ server: ServerType; port: number }> {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
const server = serve({ fetch, port, hostname: host }, (info) =>
|
|
32
|
+
resolve({ server, port: info.port }),
|
|
33
|
+
);
|
|
34
|
+
server.once('error', (err: NodeJS.ErrnoException) => {
|
|
35
|
+
if (err.code === 'EADDRINUSE' && port < maxPort) {
|
|
36
|
+
console.log(`Port ${port} is already in use, trying next port...`);
|
|
37
|
+
resolve(listen(fetch, port + 1, host, maxPort));
|
|
41
38
|
} else {
|
|
42
|
-
|
|
39
|
+
reject(err);
|
|
43
40
|
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
throw new Error('Failed to find free port');
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function testPort(port: number) {
|
|
50
|
-
return new Promise((resolve, reject) => {
|
|
51
|
-
const server = createServer();
|
|
52
|
-
server.listen(port, () => {
|
|
53
|
-
server.close();
|
|
54
|
-
resolve(true);
|
|
55
|
-
});
|
|
56
|
-
server.on('error', (err) => {
|
|
57
|
-
reject(err);
|
|
58
41
|
});
|
|
59
|
-
setTimeout(() => {
|
|
60
|
-
reject(new Error('Timed out waiting for port to be free'));
|
|
61
|
-
}, 2000);
|
|
62
42
|
});
|
|
63
43
|
}
|
|
64
44
|
|
|
@@ -1,50 +0,0 @@
|
|
|
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
|
-
import type { UserInfo } from '../../types.js';
|
|
14
|
-
import type { SSEMessage } from 'hono/streaming';
|
|
15
|
-
export interface PresenceEntry {
|
|
16
|
-
userId: string;
|
|
17
|
-
userName: string;
|
|
18
|
-
mode: 'viewing' | 'editing';
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* In-memory presence tracker for card editing/viewing.
|
|
22
|
-
* Tracks which users are currently looking at or editing each card,
|
|
23
|
-
* and notifies all connected clients via SSE when presence changes.
|
|
24
|
-
*/
|
|
25
|
-
declare class PresenceStore {
|
|
26
|
-
private connections;
|
|
27
|
-
private nextId;
|
|
28
|
-
/**
|
|
29
|
-
* Add a user connection for a card. Returns a connection ID for later removal.
|
|
30
|
-
*/
|
|
31
|
-
add(cardKey: string, user: UserInfo, mode: 'viewing' | 'editing', send: (message: SSEMessage) => void): string;
|
|
32
|
-
/**
|
|
33
|
-
* Remove a connection and broadcast updated presence.
|
|
34
|
-
*/
|
|
35
|
-
remove(cardKey: string, connId: string): void;
|
|
36
|
-
/**
|
|
37
|
-
* Get current presence list for a card.
|
|
38
|
-
*/
|
|
39
|
-
getPresence(cardKey: string): PresenceEntry[];
|
|
40
|
-
/**
|
|
41
|
-
* Broadcast current presence to all connected clients for a card.
|
|
42
|
-
*/
|
|
43
|
-
private broadcast;
|
|
44
|
-
/**
|
|
45
|
-
* Remove all connections. Intended for test cleanup.
|
|
46
|
-
*/
|
|
47
|
-
removeAll(): void;
|
|
48
|
-
}
|
|
49
|
-
export declare const presenceStore: PresenceStore;
|
|
50
|
-
export {};
|