@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/README.md
CHANGED
|
@@ -1 +1,22 @@
|
|
|
1
1
|
Hono backend server for [Cyberismo Solution](https://cyberismo.com/solution)
|
|
2
|
+
|
|
3
|
+
## Mock identities
|
|
4
|
+
|
|
5
|
+
With `AUTH_MODE=mock` the roster is on: alice (Admin), bob (Editor) and carol
|
|
6
|
+
(Reader). `?user=<name>` sets a `mock-user` cookie and `?role=<role>` a
|
|
7
|
+
`mock-role` cookie, both sticky until `=default` clears them; the cookie is
|
|
8
|
+
per browser profile, so a tab cannot outrank the profile it lives in.
|
|
9
|
+
`?as=<name>` names a roster identity for that one request without touching
|
|
10
|
+
either cookie, which is how a second participant is scripted from a tab
|
|
11
|
+
already signed in as someone else; being a one-shot identity rather than the
|
|
12
|
+
tab's session, it is not subject to that expiry. `?ttl=<seconds>` gives
|
|
13
|
+
the session an expiry, which is how rotation and the 401 after it can be
|
|
14
|
+
watched without waiting out the default stream lifetime; `?ttl=default`
|
|
15
|
+
clears it. `?user=`, `?as=` and `?ttl=` all need the roster, so `cyberismo app`
|
|
16
|
+
sessions can neither switch identity nor expire; `?role=` works either way.
|
|
17
|
+
|
|
18
|
+
Locally: `pnpm dev`, then visit `/api/auth/me?user=alice` and `?user=bob` in
|
|
19
|
+
separate browser profiles, reloading the app after a change. In one profile,
|
|
20
|
+
open the app as Alice and drive Bob from the console with `?as=bob`: his SSE
|
|
21
|
+
stream yields a `connectionId`, and `PUT .../events/presence?as=bob` or
|
|
22
|
+
`PATCH .../cards/:key?as=bob` then shows up in Alice's tab.
|
package/dist/app.d.ts
CHANGED
|
@@ -1,24 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
Cyberismo
|
|
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
|
-
*/
|
|
13
1
|
import { Hono } from 'hono';
|
|
14
2
|
import type { AppVars, TreeOptions } from './types.js';
|
|
15
3
|
import type { AuthProvider } from './auth/types.js';
|
|
16
|
-
import type {
|
|
4
|
+
import type { ProjectDirectory } from '@cyberismo/data-handler';
|
|
17
5
|
/**
|
|
18
6
|
* Create the Hono app for the backend
|
|
19
7
|
* @param authProvider - Authentication provider
|
|
20
|
-
* @param
|
|
8
|
+
* @param directory - Directory the projects are opened from
|
|
9
|
+
* @param exportPrefixes - The projects a static export serves; set only in
|
|
10
|
+
* export mode
|
|
21
11
|
*/
|
|
22
|
-
export declare function createApp(authProvider: AuthProvider,
|
|
12
|
+
export declare function createApp(authProvider: AuthProvider, directory: ProjectDirectory, opts?: TreeOptions, exportPrefixes?: string[], multiProjectRoot?: string): Hono<{
|
|
23
13
|
Variables: AppVars;
|
|
24
14
|
}, import("hono/types").BlankSchema, "/">;
|
package/dist/app.js
CHANGED
|
@@ -1,28 +1,21 @@
|
|
|
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 { Hono } from 'hono';
|
|
14
|
-
import {
|
|
4
|
+
import { staticFrontendDirRelative } from './utils.js';
|
|
15
5
|
import { serveStatic } from '@hono/node-server/serve-static';
|
|
16
|
-
import {
|
|
6
|
+
import { attachProjectDirectory } from './middleware/commandManager.js';
|
|
7
|
+
import { errorResponse } from './common/errors.js';
|
|
17
8
|
import calculationsRouter from './domain/calculations/index.js';
|
|
18
9
|
import cardsRouter from './domain/cards/index.js';
|
|
19
10
|
import cardTypesRouter from './domain/cardTypes/index.js';
|
|
20
11
|
import connectorsRouter from './domain/connectors/index.js';
|
|
12
|
+
import eventsRouter from './domain/events/index.js';
|
|
21
13
|
import fieldTypesRouter from './domain/fieldTypes/index.js';
|
|
22
14
|
import graphModelsRouter from './domain/graphModels/index.js';
|
|
23
15
|
import graphViewsRouter from './domain/graphViews/index.js';
|
|
24
16
|
import linkTypesRouter from './domain/linkTypes/index.js';
|
|
25
17
|
import reportsRouter from './domain/reports/index.js';
|
|
18
|
+
import skillsRouter from './domain/skills/index.js';
|
|
26
19
|
import templatesRouter from './domain/templates/index.js';
|
|
27
20
|
import treeRouter from './domain/tree/index.js';
|
|
28
21
|
import workflowsRouter from './domain/workflows/index.js';
|
|
@@ -37,10 +30,11 @@ import { isSSGContext } from 'hono/ssg';
|
|
|
37
30
|
import treeMiddleware from './middleware/tree.js';
|
|
38
31
|
import projectRouter from './domain/project/index.js';
|
|
39
32
|
import { createMcpRouter } from './domain/mcp/index.js';
|
|
33
|
+
import { writableProjects } from './overlay.js';
|
|
40
34
|
import { createAuthRouter } from './domain/auth/index.js';
|
|
41
35
|
import { createAuthMiddleware } from './middleware/auth.js';
|
|
42
|
-
import { MockAuthProvider
|
|
43
|
-
import {
|
|
36
|
+
import { MockAuthProvider } from './auth/mock.js';
|
|
37
|
+
import { EventsByProject } from './domain/events/events-by-project.js';
|
|
44
38
|
import { createProjectsRouter } from './domain/projects/index.js';
|
|
45
39
|
import { simpleMcpAuthRouter } from '@hono/mcp';
|
|
46
40
|
/**
|
|
@@ -53,11 +47,13 @@ function createProjectScopedRoutes(middleware) {
|
|
|
53
47
|
projectScoped.route('/cards', cardsRouter);
|
|
54
48
|
projectScoped.route('/cardTypes', cardTypesRouter);
|
|
55
49
|
projectScoped.route('/connectors', connectorsRouter);
|
|
50
|
+
projectScoped.route('/events', eventsRouter);
|
|
56
51
|
projectScoped.route('/fieldTypes', fieldTypesRouter);
|
|
57
52
|
projectScoped.route('/graphModels', graphModelsRouter);
|
|
58
53
|
projectScoped.route('/graphViews', graphViewsRouter);
|
|
59
54
|
projectScoped.route('/linkTypes', linkTypesRouter);
|
|
60
55
|
projectScoped.route('/reports', reportsRouter);
|
|
56
|
+
projectScoped.route('/skills', skillsRouter);
|
|
61
57
|
projectScoped.route('/templates', templatesRouter);
|
|
62
58
|
projectScoped.route('/tree', treeRouter);
|
|
63
59
|
projectScoped.route('/workflows', workflowsRouter);
|
|
@@ -70,10 +66,14 @@ function createProjectScopedRoutes(middleware) {
|
|
|
70
66
|
/**
|
|
71
67
|
* Create the Hono app for the backend
|
|
72
68
|
* @param authProvider - Authentication provider
|
|
73
|
-
* @param
|
|
69
|
+
* @param directory - Directory the projects are opened from
|
|
70
|
+
* @param exportPrefixes - The projects a static export serves; set only in
|
|
71
|
+
* export mode
|
|
74
72
|
*/
|
|
75
|
-
export function createApp(authProvider,
|
|
73
|
+
export function createApp(authProvider, directory, opts, exportPrefixes, multiProjectRoot) {
|
|
76
74
|
const app = new Hono();
|
|
75
|
+
const exportMode = exportPrefixes !== undefined;
|
|
76
|
+
const events = new EventsByProject(directory);
|
|
77
77
|
// Public — no auth middleware (MCP clients call this before they have a token)
|
|
78
78
|
// RFC 9728 resource metadata & OAuth authorization server metadata via @hono/mcp
|
|
79
79
|
const issuer = process.env.OIDC_ISSUER;
|
|
@@ -90,24 +90,24 @@ export function createApp(authProvider, registry, opts, exportMode = false, mult
|
|
|
90
90
|
return c.json({
|
|
91
91
|
staticMode: exportMode,
|
|
92
92
|
logoutUrl: process.env.APP_LOGOUT_URL || '',
|
|
93
|
-
presenceEnabled: process.env.APP_PRESENCE_ENABLED === 'true',
|
|
94
93
|
defaultProject: process.env.CYBERISMO_DEFAULT_PROJECT || undefined,
|
|
94
|
+
extensionUrl: process.env.APP_EXTENSION_URL || undefined,
|
|
95
95
|
});
|
|
96
96
|
});
|
|
97
|
-
//
|
|
98
|
-
// so role gating can be
|
|
97
|
+
// Mock-auth only: let `?role=` and, with the roster on, `?user=` set persistent
|
|
98
|
+
// cookies so role gating and identity can be switched locally without a restart.
|
|
99
99
|
if (authProvider instanceof MockAuthProvider) {
|
|
100
|
-
app.use(
|
|
100
|
+
app.use(authProvider.cookieMiddleware());
|
|
101
101
|
}
|
|
102
102
|
// Apply authentication middleware to all API and MCP routes
|
|
103
103
|
app.use('/api/*', createAuthMiddleware(authProvider));
|
|
104
104
|
app.use('/mcp', createAuthMiddleware(authProvider));
|
|
105
105
|
app.use('/mcp/*', createAuthMiddleware(authProvider));
|
|
106
|
-
// Global routes (no project
|
|
106
|
+
// Global routes (no project handle needed)
|
|
107
107
|
app.route('/api/auth', createAuthRouter());
|
|
108
|
-
app.route('/api/projects', createProjectsRouter(
|
|
108
|
+
app.route('/api/projects', createProjectsRouter(directory, multiProjectRoot));
|
|
109
109
|
// Test-mode reset endpoint: wipes the project dir, restores it from the
|
|
110
|
-
// golden snapshot, and
|
|
110
|
+
// golden snapshot, and reopens its projects in place. Used by the
|
|
111
111
|
// Playwright e2e harness to restore the project between spec files.
|
|
112
112
|
// Gated by NODE_ENV so it never ships in production.
|
|
113
113
|
if (process.env.NODE_ENV === 'test') {
|
|
@@ -129,21 +129,25 @@ export function createApp(authProvider, registry, opts, exportMode = false, mult
|
|
|
129
129
|
error: `Refusing to reset suspicious project path: ${resolvedProject}`,
|
|
130
130
|
}, 400);
|
|
131
131
|
}
|
|
132
|
-
|
|
132
|
+
// Windows holds transient locks on files the server has just touched,
|
|
133
|
+
// which surface as EBUSY on the final rmdir. Retry rather than fail the reset.
|
|
134
|
+
await fs.rm(resolvedProject, {
|
|
135
|
+
recursive: true,
|
|
136
|
+
force: true,
|
|
137
|
+
maxRetries: 5,
|
|
138
|
+
retryDelay: 100,
|
|
139
|
+
});
|
|
133
140
|
await fs.cp(goldenPath, resolvedProject, { recursive: true });
|
|
134
|
-
const projects = await
|
|
141
|
+
const projects = await directory.list();
|
|
135
142
|
if (projects.length === 0) {
|
|
136
143
|
return c.json({
|
|
137
144
|
error: `reset scan found no projects at ${resolvedProject}`,
|
|
138
145
|
}, 500);
|
|
139
146
|
}
|
|
140
|
-
const entries = [];
|
|
141
147
|
for (const project of projects) {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
entries.push({ prefix: project.prefix, commands });
|
|
148
|
+
await directory.replace(project.prefix);
|
|
149
|
+
events.drop(project.prefix);
|
|
145
150
|
}
|
|
146
|
-
await registry.replace(entries);
|
|
147
151
|
return c.body(null, 204);
|
|
148
152
|
});
|
|
149
153
|
}
|
|
@@ -159,21 +163,21 @@ export function createApp(authProvider, registry, opts, exportMode = false, mult
|
|
|
159
163
|
return c.json({ publicKey: null });
|
|
160
164
|
}
|
|
161
165
|
});
|
|
162
|
-
if (
|
|
166
|
+
if (exportPrefixes) {
|
|
163
167
|
// Export mode: mount at each concrete prefix so SSG sees
|
|
164
168
|
// static routes instead of dynamic :prefix patterns it would skip.
|
|
165
|
-
for (const
|
|
166
|
-
const scoped = createProjectScopedRoutes(
|
|
169
|
+
for (const prefix of exportPrefixes) {
|
|
170
|
+
const scoped = createProjectScopedRoutes(attachProjectDirectory(directory, events, prefix));
|
|
167
171
|
app.route(`/api/projects/${prefix}`, scoped);
|
|
168
172
|
}
|
|
169
173
|
}
|
|
170
174
|
else {
|
|
171
175
|
// Normal mode: dynamic :prefix param
|
|
172
|
-
const scoped = createProjectScopedRoutes(
|
|
176
|
+
const scoped = createProjectScopedRoutes(attachProjectDirectory(directory, events));
|
|
173
177
|
app.route('/api/projects/:prefix', scoped);
|
|
174
178
|
}
|
|
175
179
|
// MCP endpoint for AI assistant integration
|
|
176
|
-
app.route('/mcp', createMcpRouter(
|
|
180
|
+
app.route('/mcp', createMcpRouter(writableProjects(directory)));
|
|
177
181
|
app.use('*', serveStatic({
|
|
178
182
|
root: staticFrontendDirRelative,
|
|
179
183
|
}));
|
|
@@ -187,15 +191,13 @@ export function createApp(authProvider, registry, opts, exportMode = false, mult
|
|
|
187
191
|
return c.html(file.toString());
|
|
188
192
|
});
|
|
189
193
|
// Error handling
|
|
194
|
+
// Only server faults are logged; client errors are answered, not logged.
|
|
190
195
|
app.onError((err, c) => {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
196
|
+
const { status, body } = errorResponse(err);
|
|
197
|
+
if (status >= 500 && !isSSGContext(c) && process.env.NODE_ENV !== 'test') {
|
|
198
|
+
console.error(err.stack);
|
|
195
199
|
}
|
|
196
|
-
return c.json(
|
|
197
|
-
error: err.message || 'Internal Server Error',
|
|
198
|
-
}, 500);
|
|
200
|
+
return c.json(body, status);
|
|
199
201
|
});
|
|
200
202
|
return app;
|
|
201
203
|
}
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -1,16 +1,4 @@
|
|
|
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
1
|
export type { AuthProvider } from './types.js';
|
|
14
|
-
export { MockAuthProvider
|
|
2
|
+
export { MockAuthProvider } from './mock.js';
|
|
15
3
|
export { KeycloakAuthProvider } from './keycloak.js';
|
|
16
4
|
export type { KeycloakConfig } from './keycloak.js';
|
package/dist/auth/index.js
CHANGED
|
@@ -1,15 +1,5 @@
|
|
|
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. 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
|
-
export { MockAuthProvider, mockRoleCookieMiddleware } from './mock.js';
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
export { MockAuthProvider } from './mock.js';
|
|
14
4
|
export { KeycloakAuthProvider } from './keycloak.js';
|
|
15
5
|
//# sourceMappingURL=index.js.map
|
package/dist/auth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,yCAAyC;AAGzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/auth/keycloak.d.ts
CHANGED
|
@@ -1,17 +1,4 @@
|
|
|
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 { AuthProvider } from './types.js';
|
|
1
|
+
import type { AuthProvider, AuthResult } from './types.js';
|
|
15
2
|
export interface KeycloakConfig {
|
|
16
3
|
issuer: string;
|
|
17
4
|
audience: string;
|
|
@@ -22,6 +9,6 @@ export declare class KeycloakAuthProvider implements AuthProvider {
|
|
|
22
9
|
private jwks;
|
|
23
10
|
constructor(config: KeycloakConfig);
|
|
24
11
|
private getJWKS;
|
|
25
|
-
authenticate(req: Request): Promise<
|
|
12
|
+
authenticate(req: Request): Promise<AuthResult | null>;
|
|
26
13
|
private mapRole;
|
|
27
14
|
}
|
package/dist/auth/keycloak.js
CHANGED
|
@@ -1,15 +1,5 @@
|
|
|
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
|
import { createRemoteJWKSet, jwtVerify } from 'jose';
|
|
14
4
|
import { UserRole } from '../types.js';
|
|
15
5
|
export class KeycloakAuthProvider {
|
|
@@ -50,11 +40,17 @@ export class KeycloakAuthProvider {
|
|
|
50
40
|
if (!claims.email) {
|
|
51
41
|
throw new Error('Missing email');
|
|
52
42
|
}
|
|
43
|
+
// Optional in RFC 7519, and jwtVerify only checks it when present, so a
|
|
44
|
+
// token without one would rotate on jitter alone and never clamp.
|
|
45
|
+
if (!claims.exp) {
|
|
46
|
+
throw new Error('Missing exp');
|
|
47
|
+
}
|
|
53
48
|
return {
|
|
54
49
|
id: claims.sub,
|
|
55
50
|
email: claims.email,
|
|
56
51
|
name: claims.name ?? claims.preferred_username ?? 'Unknown',
|
|
57
52
|
role,
|
|
53
|
+
exp: claims.exp,
|
|
58
54
|
};
|
|
59
55
|
}
|
|
60
56
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keycloak.js","sourceRoot":"","sources":["../../src/auth/keycloak.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"keycloak.js","sourceRoot":"","sources":["../../src/auth/keycloak.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/mock.d.ts
CHANGED
|
@@ -1,30 +1,22 @@
|
|
|
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
1
|
import type { MiddlewareHandler } from 'hono';
|
|
14
|
-
import type {
|
|
15
|
-
import type { AuthProvider } from './types.js';
|
|
2
|
+
import type { AuthProvider, AuthResult } from './types.js';
|
|
16
3
|
export interface MockUserConfig {
|
|
17
4
|
name?: string;
|
|
18
5
|
email?: string;
|
|
6
|
+
roster?: boolean;
|
|
19
7
|
}
|
|
20
8
|
export declare const MOCK_ROLE_COOKIE = "mock-role";
|
|
9
|
+
export declare const MOCK_USER_COOKIE = "mock-user";
|
|
10
|
+
export declare const MOCK_EXP_COOKIE = "mock-exp";
|
|
11
|
+
export declare const MOCK_AS_PARAM = "as";
|
|
21
12
|
export declare class MockAuthProvider implements AuthProvider {
|
|
22
13
|
private readonly userConfig;
|
|
23
14
|
constructor(config?: MockUserConfig);
|
|
24
|
-
authenticate(req: Request): Promise<
|
|
15
|
+
authenticate(req: Request): Promise<AuthResult | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Turns ?role= and, with the roster on, ?user= and ?ttl= into cookies;
|
|
18
|
+
* "default" clears. ?ttl= seconds gives the session an expiry, which is
|
|
19
|
+
* what drives stream rotation and the 401 that follows it.
|
|
20
|
+
*/
|
|
21
|
+
cookieMiddleware(): MiddlewareHandler;
|
|
25
22
|
}
|
|
26
|
-
/**
|
|
27
|
-
* Dev-only middleware that turns `?role=<reader|editor|admin>` into a persistent
|
|
28
|
-
* `mock-role` cookie, and clears it on `?role=default`.
|
|
29
|
-
*/
|
|
30
|
-
export declare function mockRoleCookieMiddleware(): MiddlewareHandler;
|
package/dist/auth/mock.js
CHANGED
|
@@ -1,29 +1,82 @@
|
|
|
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
|
import { setCookie } from 'hono/cookie';
|
|
14
4
|
import { UserRole } from '../types.js';
|
|
15
5
|
export const MOCK_ROLE_COOKIE = 'mock-role';
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
6
|
+
export const MOCK_USER_COOKIE = 'mock-user';
|
|
7
|
+
export const MOCK_EXP_COOKIE = 'mock-exp';
|
|
8
|
+
export const MOCK_AS_PARAM = 'as';
|
|
9
|
+
const RESET_VALUE = 'default';
|
|
10
|
+
const MAX_TTL_SECONDS = 86_400;
|
|
11
|
+
// Mock sessions do not expire. Saying so with a distant deadline rather than
|
|
12
|
+
// no deadline keeps `exp` total for every consumer: it is far beyond the
|
|
13
|
+
// 30-minute stream lifetime, so computeLifetimeMs() min()s it away and
|
|
14
|
+
// rotation still falls to the jitter, exactly as an absent one did.
|
|
15
|
+
const NO_EXPIRY_SECONDS = 100 * 365 * 24 * 60 * 60;
|
|
16
|
+
function noExpiry() {
|
|
17
|
+
return Math.floor(Date.now() / 1000) + NO_EXPIRY_SECONDS;
|
|
18
|
+
}
|
|
19
|
+
const ROLE_ALIASES = new Map([
|
|
20
|
+
['reader', UserRole.Reader],
|
|
21
|
+
['editor', UserRole.Editor],
|
|
22
|
+
['admin', UserRole.Admin],
|
|
23
|
+
['connector', UserRole.Connector],
|
|
24
|
+
]);
|
|
25
|
+
// Opt-in: `cyberismo app` ships mock auth, where a roster identity would forge
|
|
26
|
+
// git commit authorship. Dev and e2e need several users in one backend process.
|
|
27
|
+
const MOCK_USERS = new Map([
|
|
28
|
+
[
|
|
29
|
+
'alice',
|
|
30
|
+
{
|
|
31
|
+
id: 'mock-user-alice',
|
|
32
|
+
name: 'Alice',
|
|
33
|
+
email: 'alice@example.com',
|
|
34
|
+
role: UserRole.Admin,
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
[
|
|
38
|
+
'bob',
|
|
39
|
+
{
|
|
40
|
+
id: 'mock-user-bob',
|
|
41
|
+
name: 'Bob',
|
|
42
|
+
email: 'bob@example.com',
|
|
43
|
+
role: UserRole.Editor,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
[
|
|
47
|
+
'carol',
|
|
48
|
+
{
|
|
49
|
+
id: 'mock-user-carol',
|
|
50
|
+
name: 'Carol',
|
|
51
|
+
email: 'carol@example.com',
|
|
52
|
+
role: UserRole.Reader,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
]);
|
|
23
56
|
function parseRole(value) {
|
|
24
57
|
if (!value)
|
|
25
58
|
return null;
|
|
26
|
-
return ROLE_ALIASES
|
|
59
|
+
return ROLE_ALIASES.get(value.toLowerCase()) ?? null;
|
|
60
|
+
}
|
|
61
|
+
function parseUser(value) {
|
|
62
|
+
if (!value)
|
|
63
|
+
return null;
|
|
64
|
+
return MOCK_USERS.get(value.toLowerCase()) ?? null;
|
|
65
|
+
}
|
|
66
|
+
/** An unreadable deadline is dropped rather than treated as long past, which
|
|
67
|
+
* would lock the user out with no request left to clear the cookie. */
|
|
68
|
+
function parseExpiry(value) {
|
|
69
|
+
const exp = Number(value);
|
|
70
|
+
return value && Number.isInteger(exp) && exp > 0 ? exp : null;
|
|
71
|
+
}
|
|
72
|
+
/** Seconds from now to the absolute epoch-second deadline to store. */
|
|
73
|
+
function toDeadline(value) {
|
|
74
|
+
const seconds = Number(value);
|
|
75
|
+
if (!Number.isInteger(seconds) || seconds <= 0)
|
|
76
|
+
return null;
|
|
77
|
+
if (seconds > MAX_TTL_SECONDS)
|
|
78
|
+
return null;
|
|
79
|
+
return String(Math.floor(Date.now() / 1000) + seconds);
|
|
27
80
|
}
|
|
28
81
|
function readCookie(header, name) {
|
|
29
82
|
if (!header)
|
|
@@ -38,40 +91,65 @@ function readCookie(header, name) {
|
|
|
38
91
|
}
|
|
39
92
|
return undefined;
|
|
40
93
|
}
|
|
94
|
+
function applyOverride(c, override, cookieName, toCookieValue) {
|
|
95
|
+
if (!override)
|
|
96
|
+
return;
|
|
97
|
+
if (override.toLowerCase() === RESET_VALUE) {
|
|
98
|
+
setCookie(c, cookieName, '', { path: '/', maxAge: 0 });
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const value = toCookieValue(override);
|
|
102
|
+
if (value === null)
|
|
103
|
+
return;
|
|
104
|
+
setCookie(c, cookieName, value, { path: '/', sameSite: 'Lax' });
|
|
105
|
+
}
|
|
41
106
|
export class MockAuthProvider {
|
|
42
107
|
userConfig;
|
|
43
108
|
constructor(config) {
|
|
44
109
|
this.userConfig = config ?? {};
|
|
45
110
|
}
|
|
46
111
|
async authenticate(req) {
|
|
47
|
-
const
|
|
48
|
-
|
|
112
|
+
const cookies = req.headers.get('cookie');
|
|
113
|
+
const cookieRole = parseRole(readCookie(cookies, MOCK_ROLE_COOKIE));
|
|
114
|
+
if (this.userConfig.roster) {
|
|
115
|
+
// One-shot: a second identity from inside a tab already signed in as
|
|
116
|
+
// someone else, so neither the cookie nor the role override applies.
|
|
117
|
+
const asUser = parseUser(new URL(req.url).searchParams.get(MOCK_AS_PARAM));
|
|
118
|
+
if (asUser)
|
|
119
|
+
return { ...asUser, exp: noExpiry() };
|
|
120
|
+
}
|
|
121
|
+
const rosterUser = this.userConfig.roster
|
|
122
|
+
? parseUser(readCookie(cookies, MOCK_USER_COOKIE))
|
|
123
|
+
: null;
|
|
124
|
+
const expiry = this.userConfig.roster
|
|
125
|
+
? parseExpiry(readCookie(cookies, MOCK_EXP_COOKIE))
|
|
126
|
+
: null;
|
|
127
|
+
if (expiry !== null && expiry * 1000 <= Date.now())
|
|
128
|
+
return null;
|
|
129
|
+
const exp = expiry ?? noExpiry();
|
|
130
|
+
const identity = rosterUser ?? {
|
|
49
131
|
id: 'mock-user',
|
|
50
132
|
email: this.userConfig.email ?? 'admin@cyberismo.local',
|
|
51
133
|
name: this.userConfig.name ?? 'Local Admin',
|
|
52
|
-
role:
|
|
134
|
+
role: UserRole.Admin,
|
|
53
135
|
};
|
|
136
|
+
return { ...identity, role: cookieRole ?? identity.role, exp };
|
|
54
137
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (
|
|
65
|
-
|
|
138
|
+
/**
|
|
139
|
+
* Turns ?role= and, with the roster on, ?user= and ?ttl= into cookies;
|
|
140
|
+
* "default" clears. ?ttl= seconds gives the session an expiry, which is
|
|
141
|
+
* what drives stream rotation and the 401 that follows it.
|
|
142
|
+
*/
|
|
143
|
+
cookieMiddleware() {
|
|
144
|
+
return async (c, next) => {
|
|
145
|
+
const params = new URL(c.req.url).searchParams;
|
|
146
|
+
applyOverride(c, params.get('role'), MOCK_ROLE_COOKIE, (value) => parseRole(value) ? value.toLowerCase() : null);
|
|
147
|
+
if (this.userConfig.roster) {
|
|
148
|
+
applyOverride(c, params.get('user'), MOCK_USER_COOKIE, (value) => parseUser(value) ? value.toLowerCase() : null);
|
|
149
|
+
applyOverride(c, params.get('ttl'), MOCK_EXP_COOKIE, toDeadline);
|
|
66
150
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
sameSite: 'Lax',
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
await next();
|
|
75
|
-
};
|
|
151
|
+
await next();
|
|
152
|
+
};
|
|
153
|
+
}
|
|
76
154
|
}
|
|
77
155
|
//# sourceMappingURL=mock.js.map
|