@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/dist/utils.js
CHANGED
|
@@ -1,57 +1,32 @@
|
|
|
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
|
import path from 'node:path';
|
|
14
|
-
import {
|
|
4
|
+
import { serve } from '@hono/node-server';
|
|
15
5
|
/**
|
|
16
6
|
* The relative path to the static frontend directory.
|
|
17
7
|
*/
|
|
18
8
|
export const staticFrontendDirRelative = path.relative(process.cwd(), path.resolve(import.meta.dirname, 'public'));
|
|
19
9
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* @param
|
|
23
|
-
* @
|
|
10
|
+
* Starts the server, moving to the next port while the current one is taken.
|
|
11
|
+
* The bind itself is the check, so a port can't be taken between check and use.
|
|
12
|
+
* @param fetch - Request handler.
|
|
13
|
+
* @param port - The first port to try.
|
|
14
|
+
* @param host - The host to bind.
|
|
15
|
+
* @param maxPort - The last port to try; defaults to `port` (no retry).
|
|
16
|
+
* @returns The listening server and the port it bound.
|
|
24
17
|
*/
|
|
25
|
-
export
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (err instanceof Error && err.message.includes('EADDRINUSE')) {
|
|
33
|
-
console.log(`Port ${i} is already in use, trying next port...`);
|
|
18
|
+
export function listen(fetch, port, host, maxPort = port) {
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
const server = serve({ fetch, port, hostname: host }, (info) => resolve({ server, port: info.port }));
|
|
21
|
+
server.once('error', (err) => {
|
|
22
|
+
if (err.code === 'EADDRINUSE' && port < maxPort) {
|
|
23
|
+
console.log(`Port ${port} is already in use, trying next port...`);
|
|
24
|
+
resolve(listen(fetch, port + 1, host, maxPort));
|
|
34
25
|
}
|
|
35
26
|
else {
|
|
36
|
-
|
|
27
|
+
reject(err);
|
|
37
28
|
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
throw new Error('Failed to find free port');
|
|
41
|
-
}
|
|
42
|
-
function testPort(port) {
|
|
43
|
-
return new Promise((resolve, reject) => {
|
|
44
|
-
const server = createServer();
|
|
45
|
-
server.listen(port, () => {
|
|
46
|
-
server.close();
|
|
47
|
-
resolve(true);
|
|
48
|
-
});
|
|
49
|
-
server.on('error', (err) => {
|
|
50
|
-
reject(err);
|
|
51
29
|
});
|
|
52
|
-
setTimeout(() => {
|
|
53
|
-
reject(new Error('Timed out waiting for port to be free'));
|
|
54
|
-
}, 2000);
|
|
55
30
|
});
|
|
56
31
|
}
|
|
57
32
|
export function gitOptionsFromEnv() {
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,yCAAyC;AAEzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAmB,MAAM,mBAAmB,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC,QAAQ,CACpD,OAAO,CAAC,GAAG,EAAE,EACb,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAC5C,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CACpB,KAA2C,EAC3C,IAAY,EACZ,IAAY,EACZ,UAAkB,IAAI;IAEtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7D,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CACrC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAClD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,yCAAyC,CAAC,CAAC;gBACnE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB;IAI/B,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM;QACvD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM;KACpD,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyberismo/backend",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Express backend for Cyberismo",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"keywords": [],
|
|
7
7
|
"author": "sami.merila@cyberismo.com",
|
|
8
|
-
"license": "AGPL-3.0",
|
|
8
|
+
"license": "AGPL-3.0-only",
|
|
9
9
|
"homepage": "https://github.com/CyberismoCom/cyberismo",
|
|
10
10
|
"repository": {
|
|
11
11
|
"type": "git",
|
|
@@ -16,20 +16,20 @@
|
|
|
16
16
|
"node": ">=22"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@
|
|
20
|
-
"@
|
|
21
|
-
"@
|
|
22
|
-
"@
|
|
23
|
-
"@
|
|
19
|
+
"@cyberismo/assets": "1.3.0",
|
|
20
|
+
"@cyberismo/data-handler": "1.3.0",
|
|
21
|
+
"@cyberismo/mcp": "1.3.0",
|
|
22
|
+
"@cyberismo/model": "1.2.0",
|
|
23
|
+
"@hono/mcp": "^0.3.5",
|
|
24
|
+
"@hono/node-server": "^2.1.5",
|
|
25
|
+
"@hono/zod-validator": "^0.9.1",
|
|
26
|
+
"@modelcontextprotocol/sdk": "^1.32.2",
|
|
24
27
|
"@types/mime-types": "^3.0.1",
|
|
25
|
-
"dotenv": "^
|
|
26
|
-
"hono": "^4.
|
|
27
|
-
"jose": "^6.2.
|
|
28
|
+
"dotenv": "^18.0.9",
|
|
29
|
+
"hono": "^4.13.14",
|
|
30
|
+
"jose": "^6.2.14",
|
|
28
31
|
"mime-types": "^3.0.2",
|
|
29
|
-
"zod": "^4.
|
|
30
|
-
"@cyberismo/assets": "1.1.2",
|
|
31
|
-
"@cyberismo/data-handler": "1.1.2",
|
|
32
|
-
"@cyberismo/mcp": "1.1.2"
|
|
32
|
+
"zod": "^4.6.7"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@cyberismo/app": "0.0.2"
|
package/src/app.ts
CHANGED
|
@@ -1,28 +1,22 @@
|
|
|
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 { Hono, type MiddlewareHandler } from 'hono';
|
|
14
|
-
import {
|
|
5
|
+
import { staticFrontendDirRelative } from './utils.js';
|
|
15
6
|
import { serveStatic } from '@hono/node-server/serve-static';
|
|
16
|
-
import {
|
|
7
|
+
import { attachProjectDirectory } from './middleware/commandManager.js';
|
|
8
|
+
import { errorResponse } from './common/errors.js';
|
|
17
9
|
import calculationsRouter from './domain/calculations/index.js';
|
|
18
10
|
import cardsRouter from './domain/cards/index.js';
|
|
19
11
|
import cardTypesRouter from './domain/cardTypes/index.js';
|
|
20
12
|
import connectorsRouter from './domain/connectors/index.js';
|
|
13
|
+
import eventsRouter from './domain/events/index.js';
|
|
21
14
|
import fieldTypesRouter from './domain/fieldTypes/index.js';
|
|
22
15
|
import graphModelsRouter from './domain/graphModels/index.js';
|
|
23
16
|
import graphViewsRouter from './domain/graphViews/index.js';
|
|
24
17
|
import linkTypesRouter from './domain/linkTypes/index.js';
|
|
25
18
|
import reportsRouter from './domain/reports/index.js';
|
|
19
|
+
import skillsRouter from './domain/skills/index.js';
|
|
26
20
|
import templatesRouter from './domain/templates/index.js';
|
|
27
21
|
import treeRouter from './domain/tree/index.js';
|
|
28
22
|
import workflowsRouter from './domain/workflows/index.js';
|
|
@@ -38,12 +32,13 @@ import type { AppVars, TreeOptions } from './types.js';
|
|
|
38
32
|
import treeMiddleware from './middleware/tree.js';
|
|
39
33
|
import projectRouter from './domain/project/index.js';
|
|
40
34
|
import { createMcpRouter } from './domain/mcp/index.js';
|
|
35
|
+
import { writableProjects } from './overlay.js';
|
|
41
36
|
import { createAuthRouter } from './domain/auth/index.js';
|
|
42
37
|
import { createAuthMiddleware } from './middleware/auth.js';
|
|
43
38
|
import type { AuthProvider } from './auth/types.js';
|
|
44
|
-
import { MockAuthProvider
|
|
45
|
-
import type {
|
|
46
|
-
import {
|
|
39
|
+
import { MockAuthProvider } from './auth/mock.js';
|
|
40
|
+
import type { ProjectDirectory } from '@cyberismo/data-handler';
|
|
41
|
+
import { EventsByProject } from './domain/events/events-by-project.js';
|
|
47
42
|
import { createProjectsRouter } from './domain/projects/index.js';
|
|
48
43
|
import { simpleMcpAuthRouter } from '@hono/mcp';
|
|
49
44
|
|
|
@@ -59,11 +54,13 @@ function createProjectScopedRoutes(
|
|
|
59
54
|
projectScoped.route('/cards', cardsRouter);
|
|
60
55
|
projectScoped.route('/cardTypes', cardTypesRouter);
|
|
61
56
|
projectScoped.route('/connectors', connectorsRouter);
|
|
57
|
+
projectScoped.route('/events', eventsRouter);
|
|
62
58
|
projectScoped.route('/fieldTypes', fieldTypesRouter);
|
|
63
59
|
projectScoped.route('/graphModels', graphModelsRouter);
|
|
64
60
|
projectScoped.route('/graphViews', graphViewsRouter);
|
|
65
61
|
projectScoped.route('/linkTypes', linkTypesRouter);
|
|
66
62
|
projectScoped.route('/reports', reportsRouter);
|
|
63
|
+
projectScoped.route('/skills', skillsRouter);
|
|
67
64
|
projectScoped.route('/templates', templatesRouter);
|
|
68
65
|
projectScoped.route('/tree', treeRouter);
|
|
69
66
|
projectScoped.route('/workflows', workflowsRouter);
|
|
@@ -77,16 +74,20 @@ function createProjectScopedRoutes(
|
|
|
77
74
|
/**
|
|
78
75
|
* Create the Hono app for the backend
|
|
79
76
|
* @param authProvider - Authentication provider
|
|
80
|
-
* @param
|
|
77
|
+
* @param directory - Directory the projects are opened from
|
|
78
|
+
* @param exportPrefixes - The projects a static export serves; set only in
|
|
79
|
+
* export mode
|
|
81
80
|
*/
|
|
82
81
|
export function createApp(
|
|
83
82
|
authProvider: AuthProvider,
|
|
84
|
-
|
|
83
|
+
directory: ProjectDirectory,
|
|
85
84
|
opts?: TreeOptions,
|
|
86
|
-
|
|
85
|
+
exportPrefixes?: string[],
|
|
87
86
|
multiProjectRoot?: string,
|
|
88
87
|
) {
|
|
89
88
|
const app = new Hono<{ Variables: AppVars }>();
|
|
89
|
+
const exportMode = exportPrefixes !== undefined;
|
|
90
|
+
const events = new EventsByProject(directory);
|
|
90
91
|
|
|
91
92
|
// Public — no auth middleware (MCP clients call this before they have a token)
|
|
92
93
|
// RFC 9728 resource metadata & OAuth authorization server metadata via @hono/mcp
|
|
@@ -109,15 +110,15 @@ export function createApp(
|
|
|
109
110
|
return c.json({
|
|
110
111
|
staticMode: exportMode,
|
|
111
112
|
logoutUrl: process.env.APP_LOGOUT_URL || '',
|
|
112
|
-
presenceEnabled: process.env.APP_PRESENCE_ENABLED === 'true',
|
|
113
113
|
defaultProject: process.env.CYBERISMO_DEFAULT_PROJECT || undefined,
|
|
114
|
+
extensionUrl: process.env.APP_EXTENSION_URL || undefined,
|
|
114
115
|
});
|
|
115
116
|
});
|
|
116
117
|
|
|
117
|
-
//
|
|
118
|
-
// so role gating can be
|
|
118
|
+
// Mock-auth only: let `?role=` and, with the roster on, `?user=` set persistent
|
|
119
|
+
// cookies so role gating and identity can be switched locally without a restart.
|
|
119
120
|
if (authProvider instanceof MockAuthProvider) {
|
|
120
|
-
app.use(
|
|
121
|
+
app.use(authProvider.cookieMiddleware());
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
// Apply authentication middleware to all API and MCP routes
|
|
@@ -125,12 +126,12 @@ export function createApp(
|
|
|
125
126
|
app.use('/mcp', createAuthMiddleware(authProvider));
|
|
126
127
|
app.use('/mcp/*', createAuthMiddleware(authProvider));
|
|
127
128
|
|
|
128
|
-
// Global routes (no project
|
|
129
|
+
// Global routes (no project handle needed)
|
|
129
130
|
app.route('/api/auth', createAuthRouter());
|
|
130
|
-
app.route('/api/projects', createProjectsRouter(
|
|
131
|
+
app.route('/api/projects', createProjectsRouter(directory, multiProjectRoot));
|
|
131
132
|
|
|
132
133
|
// Test-mode reset endpoint: wipes the project dir, restores it from the
|
|
133
|
-
// golden snapshot, and
|
|
134
|
+
// golden snapshot, and reopens its projects in place. Used by the
|
|
134
135
|
// Playwright e2e harness to restore the project between spec files.
|
|
135
136
|
// Gated by NODE_ENV so it never ships in production.
|
|
136
137
|
if (process.env.NODE_ENV === 'test') {
|
|
@@ -161,9 +162,16 @@ export function createApp(
|
|
|
161
162
|
400,
|
|
162
163
|
);
|
|
163
164
|
}
|
|
164
|
-
|
|
165
|
+
// Windows holds transient locks on files the server has just touched,
|
|
166
|
+
// which surface as EBUSY on the final rmdir. Retry rather than fail the reset.
|
|
167
|
+
await fs.rm(resolvedProject, {
|
|
168
|
+
recursive: true,
|
|
169
|
+
force: true,
|
|
170
|
+
maxRetries: 5,
|
|
171
|
+
retryDelay: 100,
|
|
172
|
+
});
|
|
165
173
|
await fs.cp(goldenPath, resolvedProject, { recursive: true });
|
|
166
|
-
const projects = await
|
|
174
|
+
const projects = await directory.list();
|
|
167
175
|
|
|
168
176
|
if (projects.length === 0) {
|
|
169
177
|
return c.json(
|
|
@@ -173,13 +181,10 @@ export function createApp(
|
|
|
173
181
|
500,
|
|
174
182
|
);
|
|
175
183
|
}
|
|
176
|
-
const entries = [];
|
|
177
184
|
for (const project of projects) {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
entries.push({ prefix: project.prefix, commands });
|
|
185
|
+
await directory.replace(project.prefix);
|
|
186
|
+
events.drop(project.prefix);
|
|
181
187
|
}
|
|
182
|
-
await registry.replace(entries);
|
|
183
188
|
return c.body(null, 204);
|
|
184
189
|
});
|
|
185
190
|
}
|
|
@@ -197,23 +202,25 @@ export function createApp(
|
|
|
197
202
|
}
|
|
198
203
|
});
|
|
199
204
|
|
|
200
|
-
if (
|
|
205
|
+
if (exportPrefixes) {
|
|
201
206
|
// Export mode: mount at each concrete prefix so SSG sees
|
|
202
207
|
// static routes instead of dynamic :prefix patterns it would skip.
|
|
203
|
-
for (const
|
|
208
|
+
for (const prefix of exportPrefixes) {
|
|
204
209
|
const scoped = createProjectScopedRoutes(
|
|
205
|
-
|
|
210
|
+
attachProjectDirectory(directory, events, prefix),
|
|
206
211
|
);
|
|
207
212
|
app.route(`/api/projects/${prefix}`, scoped);
|
|
208
213
|
}
|
|
209
214
|
} else {
|
|
210
215
|
// Normal mode: dynamic :prefix param
|
|
211
|
-
const scoped = createProjectScopedRoutes(
|
|
216
|
+
const scoped = createProjectScopedRoutes(
|
|
217
|
+
attachProjectDirectory(directory, events),
|
|
218
|
+
);
|
|
212
219
|
app.route('/api/projects/:prefix', scoped);
|
|
213
220
|
}
|
|
214
221
|
|
|
215
222
|
// MCP endpoint for AI assistant integration
|
|
216
|
-
app.route('/mcp', createMcpRouter(
|
|
223
|
+
app.route('/mcp', createMcpRouter(writableProjects(directory)));
|
|
217
224
|
|
|
218
225
|
app.use(
|
|
219
226
|
'*',
|
|
@@ -236,18 +243,13 @@ export function createApp(
|
|
|
236
243
|
return c.html(file.toString());
|
|
237
244
|
});
|
|
238
245
|
// Error handling
|
|
246
|
+
// Only server faults are logged; client errors are answered, not logged.
|
|
239
247
|
app.onError((err, c) => {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
}
|
|
248
|
+
const { status, body } = errorResponse(err);
|
|
249
|
+
if (status >= 500 && !isSSGContext(c) && process.env.NODE_ENV !== 'test') {
|
|
250
|
+
console.error(err.stack);
|
|
244
251
|
}
|
|
245
|
-
return c.json(
|
|
246
|
-
{
|
|
247
|
-
error: err.message || 'Internal Server Error',
|
|
248
|
-
},
|
|
249
|
-
500,
|
|
250
|
-
);
|
|
252
|
+
return c.json(body, status);
|
|
251
253
|
});
|
|
252
254
|
|
|
253
255
|
return app;
|
package/src/auth/index.ts
CHANGED
|
@@ -1,17 +1,7 @@
|
|
|
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
|
export type { AuthProvider } from './types.js';
|
|
15
|
-
export { MockAuthProvider
|
|
5
|
+
export { MockAuthProvider } from './mock.js';
|
|
16
6
|
export { KeycloakAuthProvider } from './keycloak.js';
|
|
17
7
|
export type { KeycloakConfig } from './keycloak.js';
|
package/src/auth/keycloak.ts
CHANGED
|
@@ -1,21 +1,10 @@
|
|
|
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 { createRemoteJWKSet, jwtVerify } from 'jose';
|
|
15
5
|
import type { JWTPayload } from 'jose';
|
|
16
6
|
import { UserRole } from '../types.js';
|
|
17
|
-
import type {
|
|
18
|
-
import type { AuthProvider } from './types.js';
|
|
7
|
+
import type { AuthProvider, AuthResult } from './types.js';
|
|
19
8
|
|
|
20
9
|
export interface KeycloakConfig {
|
|
21
10
|
issuer: string;
|
|
@@ -51,7 +40,7 @@ export class KeycloakAuthProvider implements AuthProvider {
|
|
|
51
40
|
return this.jwks;
|
|
52
41
|
}
|
|
53
42
|
|
|
54
|
-
async authenticate(req: Request): Promise<
|
|
43
|
+
async authenticate(req: Request): Promise<AuthResult | null> {
|
|
55
44
|
const authHeader = req.headers.get('authorization');
|
|
56
45
|
if (!authHeader) {
|
|
57
46
|
return null;
|
|
@@ -78,12 +67,18 @@ export class KeycloakAuthProvider implements AuthProvider {
|
|
|
78
67
|
if (!claims.email) {
|
|
79
68
|
throw new Error('Missing email');
|
|
80
69
|
}
|
|
70
|
+
// Optional in RFC 7519, and jwtVerify only checks it when present, so a
|
|
71
|
+
// token without one would rotate on jitter alone and never clamp.
|
|
72
|
+
if (!claims.exp) {
|
|
73
|
+
throw new Error('Missing exp');
|
|
74
|
+
}
|
|
81
75
|
|
|
82
76
|
return {
|
|
83
77
|
id: claims.sub,
|
|
84
78
|
email: claims.email,
|
|
85
79
|
name: claims.name ?? claims.preferred_username ?? 'Unknown',
|
|
86
80
|
role,
|
|
81
|
+
exp: claims.exp,
|
|
87
82
|
};
|
|
88
83
|
} catch {
|
|
89
84
|
// TODO: add proper logging
|
package/src/auth/mock.ts
CHANGED
|
@@ -1,40 +1,103 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
-
the Free Software Foundation. This program is distributed in the hope that it
|
|
7
|
-
will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
8
|
-
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
9
|
-
See the GNU Affero General Public License for more details.
|
|
10
|
-
You should have received a copy of the GNU Affero General Public
|
|
11
|
-
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import type { MiddlewareHandler } from 'hono';
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
|
|
4
|
+
import type { Context, MiddlewareHandler } from 'hono';
|
|
15
5
|
import { setCookie } from 'hono/cookie';
|
|
16
6
|
import { UserRole } from '../types.js';
|
|
17
7
|
import type { UserInfo } from '../types.js';
|
|
18
|
-
import type { AuthProvider } from './types.js';
|
|
8
|
+
import type { AuthProvider, AuthResult } from './types.js';
|
|
19
9
|
|
|
20
10
|
export interface MockUserConfig {
|
|
21
11
|
name?: string;
|
|
22
12
|
email?: string;
|
|
13
|
+
roster?: boolean;
|
|
23
14
|
}
|
|
24
15
|
|
|
25
16
|
export const MOCK_ROLE_COOKIE = 'mock-role';
|
|
26
|
-
const
|
|
17
|
+
export const MOCK_USER_COOKIE = 'mock-user';
|
|
18
|
+
export const MOCK_EXP_COOKIE = 'mock-exp';
|
|
19
|
+
export const MOCK_AS_PARAM = 'as';
|
|
20
|
+
const RESET_VALUE = 'default';
|
|
21
|
+
const MAX_TTL_SECONDS = 86_400;
|
|
22
|
+
// Mock sessions do not expire. Saying so with a distant deadline rather than
|
|
23
|
+
// no deadline keeps `exp` total for every consumer: it is far beyond the
|
|
24
|
+
// 30-minute stream lifetime, so computeLifetimeMs() min()s it away and
|
|
25
|
+
// rotation still falls to the jitter, exactly as an absent one did.
|
|
26
|
+
const NO_EXPIRY_SECONDS = 100 * 365 * 24 * 60 * 60;
|
|
27
|
+
|
|
28
|
+
function noExpiry(): number {
|
|
29
|
+
return Math.floor(Date.now() / 1000) + NO_EXPIRY_SECONDS;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const ROLE_ALIASES = new Map<string, UserRole>([
|
|
33
|
+
['reader', UserRole.Reader],
|
|
34
|
+
['editor', UserRole.Editor],
|
|
35
|
+
['admin', UserRole.Admin],
|
|
36
|
+
['connector', UserRole.Connector],
|
|
37
|
+
]);
|
|
38
|
+
|
|
39
|
+
interface MockUser {
|
|
40
|
+
id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
email: string;
|
|
43
|
+
role: UserRole;
|
|
44
|
+
}
|
|
27
45
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
46
|
+
// Opt-in: `cyberismo app` ships mock auth, where a roster identity would forge
|
|
47
|
+
// git commit authorship. Dev and e2e need several users in one backend process.
|
|
48
|
+
const MOCK_USERS = new Map<string, MockUser>([
|
|
49
|
+
[
|
|
50
|
+
'alice',
|
|
51
|
+
{
|
|
52
|
+
id: 'mock-user-alice',
|
|
53
|
+
name: 'Alice',
|
|
54
|
+
email: 'alice@example.com',
|
|
55
|
+
role: UserRole.Admin,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
[
|
|
59
|
+
'bob',
|
|
60
|
+
{
|
|
61
|
+
id: 'mock-user-bob',
|
|
62
|
+
name: 'Bob',
|
|
63
|
+
email: 'bob@example.com',
|
|
64
|
+
role: UserRole.Editor,
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
[
|
|
68
|
+
'carol',
|
|
69
|
+
{
|
|
70
|
+
id: 'mock-user-carol',
|
|
71
|
+
name: 'Carol',
|
|
72
|
+
email: 'carol@example.com',
|
|
73
|
+
role: UserRole.Reader,
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
]);
|
|
34
77
|
|
|
35
78
|
function parseRole(value: string | null | undefined): UserRole | null {
|
|
36
79
|
if (!value) return null;
|
|
37
|
-
return ROLE_ALIASES
|
|
80
|
+
return ROLE_ALIASES.get(value.toLowerCase()) ?? null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function parseUser(value: string | null | undefined): MockUser | null {
|
|
84
|
+
if (!value) return null;
|
|
85
|
+
return MOCK_USERS.get(value.toLowerCase()) ?? null;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** An unreadable deadline is dropped rather than treated as long past, which
|
|
89
|
+
* would lock the user out with no request left to clear the cookie. */
|
|
90
|
+
function parseExpiry(value: string | null | undefined): number | null {
|
|
91
|
+
const exp = Number(value);
|
|
92
|
+
return value && Number.isInteger(exp) && exp > 0 ? exp : null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Seconds from now to the absolute epoch-second deadline to store. */
|
|
96
|
+
function toDeadline(value: string): string | null {
|
|
97
|
+
const seconds = Number(value);
|
|
98
|
+
if (!Number.isInteger(seconds) || seconds <= 0) return null;
|
|
99
|
+
if (seconds > MAX_TTL_SECONDS) return null;
|
|
100
|
+
return String(Math.floor(Date.now() / 1000) + seconds);
|
|
38
101
|
}
|
|
39
102
|
|
|
40
103
|
function readCookie(header: string | null, name: string): string | undefined {
|
|
@@ -48,6 +111,22 @@ function readCookie(header: string | null, name: string): string | undefined {
|
|
|
48
111
|
return undefined;
|
|
49
112
|
}
|
|
50
113
|
|
|
114
|
+
function applyOverride(
|
|
115
|
+
c: Context,
|
|
116
|
+
override: string | null,
|
|
117
|
+
cookieName: string,
|
|
118
|
+
toCookieValue: (value: string) => string | null,
|
|
119
|
+
): void {
|
|
120
|
+
if (!override) return;
|
|
121
|
+
if (override.toLowerCase() === RESET_VALUE) {
|
|
122
|
+
setCookie(c, cookieName, '', { path: '/', maxAge: 0 });
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const value = toCookieValue(override);
|
|
126
|
+
if (value === null) return;
|
|
127
|
+
setCookie(c, cookieName, value, { path: '/', sameSite: 'Lax' });
|
|
128
|
+
}
|
|
129
|
+
|
|
51
130
|
export class MockAuthProvider implements AuthProvider {
|
|
52
131
|
private readonly userConfig: MockUserConfig;
|
|
53
132
|
|
|
@@ -55,36 +134,53 @@ export class MockAuthProvider implements AuthProvider {
|
|
|
55
134
|
this.userConfig = config ?? {};
|
|
56
135
|
}
|
|
57
136
|
|
|
58
|
-
async authenticate(req: Request): Promise<
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
)
|
|
62
|
-
|
|
137
|
+
async authenticate(req: Request): Promise<AuthResult | null> {
|
|
138
|
+
const cookies = req.headers.get('cookie');
|
|
139
|
+
const cookieRole = parseRole(readCookie(cookies, MOCK_ROLE_COOKIE));
|
|
140
|
+
if (this.userConfig.roster) {
|
|
141
|
+
// One-shot: a second identity from inside a tab already signed in as
|
|
142
|
+
// someone else, so neither the cookie nor the role override applies.
|
|
143
|
+
const asUser = parseUser(
|
|
144
|
+
new URL(req.url).searchParams.get(MOCK_AS_PARAM),
|
|
145
|
+
);
|
|
146
|
+
if (asUser) return { ...asUser, exp: noExpiry() };
|
|
147
|
+
}
|
|
148
|
+
const rosterUser = this.userConfig.roster
|
|
149
|
+
? parseUser(readCookie(cookies, MOCK_USER_COOKIE))
|
|
150
|
+
: null;
|
|
151
|
+
const expiry = this.userConfig.roster
|
|
152
|
+
? parseExpiry(readCookie(cookies, MOCK_EXP_COOKIE))
|
|
153
|
+
: null;
|
|
154
|
+
if (expiry !== null && expiry * 1000 <= Date.now()) return null;
|
|
155
|
+
const exp = expiry ?? noExpiry();
|
|
156
|
+
|
|
157
|
+
const identity: UserInfo = rosterUser ?? {
|
|
63
158
|
id: 'mock-user',
|
|
64
159
|
email: this.userConfig.email ?? 'admin@cyberismo.local',
|
|
65
160
|
name: this.userConfig.name ?? 'Local Admin',
|
|
66
|
-
role:
|
|
161
|
+
role: UserRole.Admin,
|
|
67
162
|
};
|
|
163
|
+
return { ...identity, role: cookieRole ?? identity.role, exp };
|
|
68
164
|
}
|
|
69
|
-
}
|
|
70
165
|
|
|
71
|
-
/**
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
166
|
+
/**
|
|
167
|
+
* Turns ?role= and, with the roster on, ?user= and ?ttl= into cookies;
|
|
168
|
+
* "default" clears. ?ttl= seconds gives the session an expiry, which is
|
|
169
|
+
* what drives stream rotation and the 401 that follows it.
|
|
170
|
+
*/
|
|
171
|
+
cookieMiddleware(): MiddlewareHandler {
|
|
172
|
+
return async (c, next) => {
|
|
173
|
+
const params = new URL(c.req.url).searchParams;
|
|
174
|
+
applyOverride(c, params.get('role'), MOCK_ROLE_COOKIE, (value) =>
|
|
175
|
+
parseRole(value) ? value.toLowerCase() : null,
|
|
176
|
+
);
|
|
177
|
+
if (this.userConfig.roster) {
|
|
178
|
+
applyOverride(c, params.get('user'), MOCK_USER_COOKIE, (value) =>
|
|
179
|
+
parseUser(value) ? value.toLowerCase() : null,
|
|
180
|
+
);
|
|
181
|
+
applyOverride(c, params.get('ttl'), MOCK_EXP_COOKIE, toDeadline);
|
|
86
182
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
183
|
+
await next();
|
|
184
|
+
};
|
|
185
|
+
}
|
|
90
186
|
}
|