@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
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
|
|
4
|
+
const MAX_LIFETIME_MS = 30 * 60_000;
|
|
5
|
+
const ROTATION_MARGIN_MS = 30_000;
|
|
6
|
+
|
|
7
|
+
/** Rotation deadline in ms from now. */
|
|
8
|
+
export function computeLifetimeMs(exp: number, now = Date.now()): number {
|
|
9
|
+
const jittered = MAX_LIFETIME_MS * (0.6 + Math.random() * 0.4);
|
|
10
|
+
const remaining = exp * 1000 - now;
|
|
11
|
+
// Jitter may only shorten: the token `exp` clamp is hard.
|
|
12
|
+
const untilExpiry =
|
|
13
|
+
remaining > ROTATION_MARGIN_MS
|
|
14
|
+
? remaining - ROTATION_MARGIN_MS
|
|
15
|
+
: Math.max(remaining, 0);
|
|
16
|
+
return Math.min(untilExpiry, jittered);
|
|
17
|
+
}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import type { SSEMessage } from 'hono/streaming';
|
|
6
|
+
import type { ActorRef, ChangeEvent } from '@cyberismo/model';
|
|
7
|
+
|
|
8
|
+
const LEASE_MS = 90_000;
|
|
9
|
+
const EXPIRY_INTERVAL_MS = 30_000;
|
|
10
|
+
const RETIRED_LEASE_MS = 15_000;
|
|
11
|
+
|
|
12
|
+
export interface PresenceEntry {
|
|
13
|
+
userId: string;
|
|
14
|
+
userName: string;
|
|
15
|
+
mode: 'viewing' | 'editing';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface Capabilities {
|
|
19
|
+
canSeeIdentity: boolean;
|
|
20
|
+
canDeclareEditing: boolean;
|
|
21
|
+
canSeePresence: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** The socket one connection's client is written to. A retired connection
|
|
25
|
+
* must not be written to at all; `deliver` and `closeQuietly` enforce that,
|
|
26
|
+
* since the route has already ended the stream by then. */
|
|
27
|
+
export interface Delivery {
|
|
28
|
+
send(message: SSEMessage): void;
|
|
29
|
+
close(): void;
|
|
30
|
+
terminate(message: SSEMessage): void;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface Connection {
|
|
34
|
+
user: { id: string; name: string };
|
|
35
|
+
capabilities: Capabilities;
|
|
36
|
+
delivery: Delivery;
|
|
37
|
+
cardKey: string | null;
|
|
38
|
+
mode: PresenceEntry['mode'];
|
|
39
|
+
sequence: number;
|
|
40
|
+
expiresAt: number;
|
|
41
|
+
retired: boolean;
|
|
42
|
+
/** Last presence list serialized to this connection, for per-recipient dedup. */
|
|
43
|
+
lastSent: string | null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Where a project's change events come from. */
|
|
47
|
+
export interface ChangeSource {
|
|
48
|
+
subscribe(listener: (event: ChangeEvent) => void): () => void;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** The open subscriptions of one project and the presence leases they hold. */
|
|
52
|
+
export class ProjectEvents {
|
|
53
|
+
private connections = new Map<string, Connection>();
|
|
54
|
+
private expiryTimer: ReturnType<typeof setInterval>;
|
|
55
|
+
private unsubscribe: () => void;
|
|
56
|
+
|
|
57
|
+
/** Announces the cards each of `changes`' events names, whoever wrote them. */
|
|
58
|
+
constructor(changes?: ChangeSource) {
|
|
59
|
+
this.expiryTimer = setInterval(() => this.expire(), EXPIRY_INTERVAL_MS);
|
|
60
|
+
this.expiryTimer.unref();
|
|
61
|
+
this.unsubscribe =
|
|
62
|
+
changes?.subscribe((event) => this.changed(event)) ?? (() => {});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
connect(
|
|
66
|
+
user: Connection['user'],
|
|
67
|
+
capabilities: Capabilities,
|
|
68
|
+
delivery: Delivery,
|
|
69
|
+
): string {
|
|
70
|
+
const connectionId = randomUUID();
|
|
71
|
+
this.connections.set(connectionId, {
|
|
72
|
+
user,
|
|
73
|
+
capabilities,
|
|
74
|
+
delivery,
|
|
75
|
+
cardKey: null,
|
|
76
|
+
mode: 'viewing',
|
|
77
|
+
sequence: -1,
|
|
78
|
+
expiresAt: 0,
|
|
79
|
+
retired: false,
|
|
80
|
+
lastSent: null,
|
|
81
|
+
});
|
|
82
|
+
// EventSource cannot read response headers, so the stream is the only
|
|
83
|
+
// way back with a connection handle.
|
|
84
|
+
this.deliver(connectionId, {
|
|
85
|
+
event: 'ready',
|
|
86
|
+
data: JSON.stringify({ connectionId }),
|
|
87
|
+
});
|
|
88
|
+
return connectionId;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
update(
|
|
92
|
+
connectionId: string,
|
|
93
|
+
userId: string,
|
|
94
|
+
sequence: number,
|
|
95
|
+
cardKey: string | null,
|
|
96
|
+
mode: PresenceEntry['mode'],
|
|
97
|
+
): boolean {
|
|
98
|
+
const connection = this.connections.get(connectionId);
|
|
99
|
+
if (!connection || connection.retired || connection.user.id !== userId) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
// Monotonic per connection, so a delayed request cannot undo a newer one.
|
|
103
|
+
if (sequence <= connection.sequence) return true;
|
|
104
|
+
// Coerced rather than rejected: a fake editing warning deters others from editing.
|
|
105
|
+
if (!connection.capabilities.canDeclareEditing) mode = 'viewing';
|
|
106
|
+
if (connection.cardKey === cardKey && connection.mode === mode) {
|
|
107
|
+
connection.sequence = sequence;
|
|
108
|
+
connection.expiresAt = Date.now() + LEASE_MS;
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
this.applyMove(connection, sequence, cardKey, mode, Date.now());
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private applyMove(
|
|
116
|
+
connection: Connection,
|
|
117
|
+
sequence: number,
|
|
118
|
+
cardKey: string | null,
|
|
119
|
+
mode: PresenceEntry['mode'],
|
|
120
|
+
now: number,
|
|
121
|
+
): void {
|
|
122
|
+
const previous = connection.cardKey;
|
|
123
|
+
if (previous !== cardKey) connection.lastSent = null;
|
|
124
|
+
Object.assign(connection, {
|
|
125
|
+
sequence,
|
|
126
|
+
cardKey,
|
|
127
|
+
mode,
|
|
128
|
+
expiresAt: now + LEASE_MS,
|
|
129
|
+
});
|
|
130
|
+
if (previous) this.presenceUpdated(previous);
|
|
131
|
+
if (cardKey && cardKey !== previous) this.presenceUpdated(cardKey);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
disconnect(connectionId: string): void {
|
|
135
|
+
const connection = this.connections.get(connectionId);
|
|
136
|
+
if (!connection) return;
|
|
137
|
+
this.connections.delete(connectionId);
|
|
138
|
+
this.closeQuietly(connection);
|
|
139
|
+
if (connection.cardKey) this.presenceUpdated(connection.cardKey);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// `users()` dedups by user id, so a retiring connection's entry can outlive
|
|
143
|
+
// its socket without observers seeing a change.
|
|
144
|
+
retire(connectionId: string): void {
|
|
145
|
+
const connection = this.connections.get(connectionId);
|
|
146
|
+
if (!connection) return;
|
|
147
|
+
connection.retired = true;
|
|
148
|
+
// The entry only has to bridge the client's reconnect. Left on its full
|
|
149
|
+
// lease it would go on reporting the card and mode held at retirement,
|
|
150
|
+
// and `editing` wins in users(), so it would mask the live entry the
|
|
151
|
+
// replacement declares.
|
|
152
|
+
connection.expiresAt = Math.min(
|
|
153
|
+
connection.expiresAt,
|
|
154
|
+
Date.now() + RETIRED_LEASE_MS,
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Only card changes go on the wire; a removed card is announced as updated.
|
|
159
|
+
private changed(event: ChangeEvent): void {
|
|
160
|
+
const cardKeys = event.changes.flatMap((change) =>
|
|
161
|
+
change.kind === 'card.updated' || change.kind === 'card.removed'
|
|
162
|
+
? [change.key]
|
|
163
|
+
: [],
|
|
164
|
+
);
|
|
165
|
+
if (cardKeys.length > 0) this.cardsUpdated(cardKeys, event.actor);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
cardsUpdated(cardKeys: string[], actor: ActorRef): void {
|
|
169
|
+
for (const cardKey of new Set(cardKeys)) {
|
|
170
|
+
const withIdentity = this.encode('card.updated', {
|
|
171
|
+
cardKey,
|
|
172
|
+
userId: actor.id,
|
|
173
|
+
userName: actor.name,
|
|
174
|
+
});
|
|
175
|
+
const withoutIdentity = this.encode('card.updated', { cardKey });
|
|
176
|
+
// Project-wide, since a page can show fields of cards it is not on.
|
|
177
|
+
for (const [connectionId, connection] of [...this.connections]) {
|
|
178
|
+
this.deliver(
|
|
179
|
+
connectionId,
|
|
180
|
+
connection.capabilities.canSeeIdentity
|
|
181
|
+
? withIdentity
|
|
182
|
+
: withoutIdentity,
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
dispose(): void {
|
|
189
|
+
this.unsubscribe();
|
|
190
|
+
clearInterval(this.expiryTimer);
|
|
191
|
+
const connections = [...this.connections.values()];
|
|
192
|
+
this.connections.clear();
|
|
193
|
+
for (const connection of connections) {
|
|
194
|
+
this.closeQuietly(connection);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
private users(cardKey: string): PresenceEntry[] {
|
|
199
|
+
const users = new Map<string, PresenceEntry>();
|
|
200
|
+
for (const { user, cardKey: key, mode } of this.connections.values()) {
|
|
201
|
+
if (key !== cardKey) continue;
|
|
202
|
+
if (!users.has(user.id) || mode === 'editing') {
|
|
203
|
+
users.set(user.id, { userId: user.id, userName: user.name, mode });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Sorted so identical occupancy always serializes the same way, which
|
|
207
|
+
// the per-recipient dedup in presenceUpdated() depends on.
|
|
208
|
+
return [...users.values()].sort((a, b) => a.userId.localeCompare(b.userId));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
private presenceUpdated(cardKey: string): void {
|
|
212
|
+
const users = this.users(cardKey);
|
|
213
|
+
const serialized = JSON.stringify(users);
|
|
214
|
+
const message = this.encode('presence.updated', { cardKey, users });
|
|
215
|
+
for (const [connectionId, connection] of this.onCard(cardKey)) {
|
|
216
|
+
// Presence exists to keep editors from colliding, so a reader has no use
|
|
217
|
+
// for it and is not told who else is here. Readers still declare their
|
|
218
|
+
// own presence, which is why users() keeps them: editors see readers.
|
|
219
|
+
if (!connection.capabilities.canSeePresence) continue;
|
|
220
|
+
if (connection.lastSent === serialized) continue;
|
|
221
|
+
this.deliver(connectionId, message);
|
|
222
|
+
connection.lastSent = serialized;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Presence is delivered per card.
|
|
227
|
+
private onCard(cardKey: string): [string, Connection][] {
|
|
228
|
+
return [...this.connections].filter(([, c]) => c.cardKey === cardKey);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
private encode(event: string, data: unknown): SSEMessage {
|
|
232
|
+
return { event, data: JSON.stringify(data) };
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
private deliver(connectionId: string, message: SSEMessage): void {
|
|
236
|
+
const connection = this.connections.get(connectionId);
|
|
237
|
+
// onCard() still yields a retired connection: it keeps its cardKey so the
|
|
238
|
+
// occupant list does not change while its replacement connects.
|
|
239
|
+
if (!connection || connection.retired) return;
|
|
240
|
+
try {
|
|
241
|
+
connection.delivery.send(message);
|
|
242
|
+
} catch {
|
|
243
|
+
this.disconnect(connectionId);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
private expire(): void {
|
|
248
|
+
for (const [connectionId, connection] of this.connections) {
|
|
249
|
+
if (connection.expiresAt > Date.now()) continue;
|
|
250
|
+
if (!connection.retired && !connection.cardKey) continue;
|
|
251
|
+
const cardKey = connection.cardKey;
|
|
252
|
+
if (connection.retired) this.connections.delete(connectionId);
|
|
253
|
+
else connection.cardKey = null;
|
|
254
|
+
if (cardKey) this.presenceUpdated(cardKey);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
private closeQuietly(connection: Connection): void {
|
|
259
|
+
if (connection.retired) return;
|
|
260
|
+
try {
|
|
261
|
+
connection.delivery.close();
|
|
262
|
+
} catch {
|
|
263
|
+
/* already closed */
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
|
|
6
|
+
export const presenceSchema = z.object({
|
|
7
|
+
connectionId: z.uuid(),
|
|
8
|
+
sequence: z.number().int().nonnegative(),
|
|
9
|
+
cardKey: z.string().min(1).nullable(),
|
|
10
|
+
mode: z.enum(['viewing', 'editing']),
|
|
11
|
+
});
|
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright © Cyberismo Ltd and contributors 2025
|
|
4
|
-
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
-
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
-
the Free Software Foundation.
|
|
7
|
-
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
-
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
-
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
-
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
-
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
13
3
|
|
|
14
4
|
import { Hono } from 'hono';
|
|
15
5
|
import * as fieldTypeService from './service.js';
|
|
@@ -35,10 +25,10 @@ const router = new Hono();
|
|
|
35
25
|
* description: project_path not set or other internal error
|
|
36
26
|
*/
|
|
37
27
|
router.get('/', requireRole(UserRole.Reader), async (c) => {
|
|
38
|
-
const
|
|
28
|
+
const ws = c.get('ws');
|
|
39
29
|
|
|
40
30
|
try {
|
|
41
|
-
const fieldTypes = await fieldTypeService.getFieldTypes(
|
|
31
|
+
const fieldTypes = await fieldTypeService.getFieldTypes(ws);
|
|
42
32
|
return c.json(fieldTypes);
|
|
43
33
|
} catch (error) {
|
|
44
34
|
return c.json(
|
|
@@ -84,11 +74,11 @@ router.post(
|
|
|
84
74
|
requireRole(UserRole.Admin),
|
|
85
75
|
zValidator('json', createFieldTypeSchema),
|
|
86
76
|
async (c) => {
|
|
87
|
-
const
|
|
77
|
+
const ws = c.get('ws');
|
|
88
78
|
const { identifier, dataType } = c.req.valid('json');
|
|
89
79
|
|
|
90
80
|
try {
|
|
91
|
-
await fieldTypeService.createFieldType(
|
|
81
|
+
await fieldTypeService.createFieldType(ws, identifier, dataType);
|
|
92
82
|
return c.json({ message: 'Field type created successfully' });
|
|
93
83
|
} catch (error) {
|
|
94
84
|
return c.json(
|
|
@@ -1,15 +1,6 @@
|
|
|
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 { z } from 'zod';
|
|
14
5
|
import { identifierSchema } from '../../common/validationSchemas.js';
|
|
15
6
|
|
|
@@ -1,38 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright © Cyberismo Ltd and contributors 2025
|
|
4
|
-
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
-
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
-
the Free Software Foundation.
|
|
7
|
-
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
-
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
-
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
-
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
-
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
13
3
|
|
|
14
|
-
import type {
|
|
15
|
-
import type { DataType } from '@cyberismo/
|
|
4
|
+
import type { Workspace } from '@cyberismo/data-handler';
|
|
5
|
+
import type { DataType } from '@cyberismo/model';
|
|
16
6
|
|
|
17
|
-
export async function getFieldTypes(
|
|
18
|
-
const response = await
|
|
7
|
+
export async function getFieldTypes(ws: Workspace) {
|
|
8
|
+
const response = await ws.resources.list('fieldTypes');
|
|
19
9
|
if (!response) {
|
|
20
10
|
throw new Error('No field types found');
|
|
21
11
|
}
|
|
22
12
|
|
|
23
13
|
const fieldTypes = await Promise.all(
|
|
24
|
-
response.map((fieldType: string) =>
|
|
25
|
-
commands.showCmd.showResource(fieldType),
|
|
26
|
-
),
|
|
14
|
+
response.map((fieldType: string) => ws.resources.show(fieldType)),
|
|
27
15
|
);
|
|
28
16
|
|
|
29
17
|
return fieldTypes;
|
|
30
18
|
}
|
|
31
19
|
|
|
32
20
|
export async function createFieldType(
|
|
33
|
-
|
|
21
|
+
ws: Workspace,
|
|
34
22
|
identifier: string,
|
|
35
23
|
dataType: DataType,
|
|
36
24
|
) {
|
|
37
|
-
await
|
|
25
|
+
await ws.resources.create(identifier, 'fieldTypes', { dataType });
|
|
38
26
|
}
|
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright © Cyberismo Ltd and contributors 2025
|
|
4
|
-
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
-
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
-
the Free Software Foundation.
|
|
7
|
-
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
-
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
-
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
-
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
-
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
13
3
|
|
|
14
4
|
import { Hono } from 'hono';
|
|
15
5
|
import * as graphModelService from './service.js';
|
|
@@ -50,10 +40,10 @@ router.post(
|
|
|
50
40
|
requireRole(UserRole.Admin),
|
|
51
41
|
zValidator('json', createGraphModelSchema),
|
|
52
42
|
async (c) => {
|
|
53
|
-
const
|
|
43
|
+
const ws = c.get('ws');
|
|
54
44
|
const { identifier } = c.req.valid('json');
|
|
55
45
|
|
|
56
|
-
await graphModelService.createGraphModel(
|
|
46
|
+
await graphModelService.createGraphModel(ws, identifier);
|
|
57
47
|
return c.json({ message: 'Graph model created successfully' });
|
|
58
48
|
},
|
|
59
49
|
);
|
|
@@ -1,15 +1,6 @@
|
|
|
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 { z } from 'zod';
|
|
14
5
|
import { identifierSchema } from '../../common/validationSchemas.js';
|
|
15
6
|
|
|
@@ -1,21 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright © Cyberismo Ltd and contributors 2025
|
|
4
|
-
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
-
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
-
the Free Software Foundation.
|
|
7
|
-
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
-
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
-
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
-
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
-
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
13
3
|
|
|
14
|
-
import type {
|
|
4
|
+
import type { Workspace } from '@cyberismo/data-handler';
|
|
15
5
|
|
|
16
|
-
export async function createGraphModel(
|
|
17
|
-
|
|
18
|
-
graphModelName: string,
|
|
19
|
-
) {
|
|
20
|
-
await commands.createCmd.createGraphModel(graphModelName);
|
|
6
|
+
export async function createGraphModel(ws: Workspace, graphModelName: string) {
|
|
7
|
+
await ws.resources.create(graphModelName, 'graphModels', {});
|
|
21
8
|
}
|
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright © Cyberismo Ltd and contributors 2025
|
|
4
|
-
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
-
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
-
the Free Software Foundation.
|
|
7
|
-
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
-
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
-
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
-
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
-
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
13
3
|
|
|
14
4
|
import { Hono } from 'hono';
|
|
15
5
|
import * as graphViewService from './service.js';
|
|
@@ -50,9 +40,9 @@ router.post(
|
|
|
50
40
|
requireRole(UserRole.Admin),
|
|
51
41
|
zValidator('json', createGraphViewSchema),
|
|
52
42
|
async (c) => {
|
|
53
|
-
const
|
|
43
|
+
const ws = c.get('ws');
|
|
54
44
|
const { identifier } = c.req.valid('json');
|
|
55
|
-
await graphViewService.createGraphView(
|
|
45
|
+
await graphViewService.createGraphView(ws, identifier);
|
|
56
46
|
return c.json({ message: 'Graph view created successfully' });
|
|
57
47
|
},
|
|
58
48
|
);
|
|
@@ -1,20 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright © Cyberismo Ltd and contributors 2025
|
|
4
|
-
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
-
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
-
the Free Software Foundation.
|
|
7
|
-
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
-
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
-
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
-
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
-
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
13
3
|
|
|
14
|
-
import type {
|
|
15
|
-
export async function createGraphView(
|
|
16
|
-
|
|
17
|
-
graphViewName: string,
|
|
18
|
-
) {
|
|
19
|
-
await commands.createCmd.createGraphView(graphViewName);
|
|
4
|
+
import type { Workspace } from '@cyberismo/data-handler';
|
|
5
|
+
export async function createGraphView(ws: Workspace, graphViewName: string) {
|
|
6
|
+
await ws.resources.create(graphViewName, 'graphViews', {});
|
|
20
7
|
}
|
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright © Cyberismo Ltd and contributors 2025
|
|
4
|
-
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
-
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
-
the Free Software Foundation.
|
|
7
|
-
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
-
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
-
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
-
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
-
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
13
3
|
|
|
14
4
|
import { Hono } from 'hono';
|
|
15
5
|
import * as labelsService from './service.js';
|
|
@@ -31,8 +21,8 @@ const router = new Hono();
|
|
|
31
21
|
*/
|
|
32
22
|
|
|
33
23
|
router.get('/', requireRole(UserRole.Reader), async (c) => {
|
|
34
|
-
const
|
|
35
|
-
const labels = await labelsService.getLabels(
|
|
24
|
+
const ws = c.get('ws');
|
|
25
|
+
const labels = await labelsService.getLabels(ws);
|
|
36
26
|
return c.json(labels);
|
|
37
27
|
});
|
|
38
28
|
|
|
@@ -1,23 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright © Cyberismo Ltd and contributors 2025
|
|
4
|
-
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
-
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
-
the Free Software Foundation.
|
|
7
|
-
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
-
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
-
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
-
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
-
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
13
3
|
|
|
14
|
-
import type {
|
|
4
|
+
import type { Workspace } from '@cyberismo/data-handler';
|
|
15
5
|
|
|
16
6
|
/**
|
|
17
7
|
* Returns all unique labels available in the project.
|
|
18
|
-
* @param
|
|
8
|
+
* @param ws command manager used for the query
|
|
19
9
|
* @returns a list of labels
|
|
20
10
|
*/
|
|
21
|
-
export async function getLabels(
|
|
22
|
-
return (await
|
|
11
|
+
export async function getLabels(ws: Workspace): Promise<string[]> {
|
|
12
|
+
return (await ws.cards.labels()).sort();
|
|
23
13
|
}
|
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright © Cyberismo Ltd and contributors 2025
|
|
4
|
-
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
-
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
-
the Free Software Foundation.
|
|
7
|
-
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
-
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
-
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
-
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
-
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
-
*/
|
|
1
|
+
// SPDX-FileCopyrightText: Cyberismo Ltd and contributors
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
13
3
|
|
|
14
4
|
import { Hono } from 'hono';
|
|
15
5
|
import * as linkTypeService from './service.js';
|
|
@@ -35,10 +25,10 @@ const router = new Hono();
|
|
|
35
25
|
* description: project_path not set or other internal error
|
|
36
26
|
*/
|
|
37
27
|
router.get('/', requireRole(UserRole.Reader), async (c) => {
|
|
38
|
-
const
|
|
28
|
+
const ws = c.get('ws');
|
|
39
29
|
|
|
40
30
|
try {
|
|
41
|
-
const linkTypes = await linkTypeService.getLinkTypes(
|
|
31
|
+
const linkTypes = await linkTypeService.getLinkTypes(ws);
|
|
42
32
|
return c.json(linkTypes);
|
|
43
33
|
} catch (error) {
|
|
44
34
|
return c.json(
|
|
@@ -80,10 +70,10 @@ router.post(
|
|
|
80
70
|
requireRole(UserRole.Admin),
|
|
81
71
|
zValidator('json', createLinkTypeSchema),
|
|
82
72
|
async (c) => {
|
|
83
|
-
const
|
|
73
|
+
const ws = c.get('ws');
|
|
84
74
|
const { identifier } = c.req.valid('json');
|
|
85
75
|
|
|
86
|
-
await linkTypeService.createLinkType(
|
|
76
|
+
await linkTypeService.createLinkType(ws, identifier);
|
|
87
77
|
return c.json({ message: 'Link type created successfully' });
|
|
88
78
|
},
|
|
89
79
|
);
|