@cyberismo/backend 1.2.0 → 1.3.1

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.
Files changed (472) hide show
  1. package/dist/app.d.ts +5 -15
  2. package/dist/app.js +31 -44
  3. package/dist/app.js.map +1 -1
  4. package/dist/auth/index.d.ts +0 -12
  5. package/dist/auth/index.js +2 -12
  6. package/dist/auth/index.js.map +1 -1
  7. package/dist/auth/keycloak.d.ts +0 -12
  8. package/dist/auth/keycloak.js +2 -12
  9. package/dist/auth/keycloak.js.map +1 -1
  10. package/dist/auth/mock.d.ts +0 -12
  11. package/dist/auth/mock.js +2 -12
  12. package/dist/auth/mock.js.map +1 -1
  13. package/dist/auth/types.d.ts +0 -12
  14. package/dist/auth/types.js +2 -12
  15. package/dist/auth/types.js.map +1 -1
  16. package/dist/common/errors.d.ts +12 -0
  17. package/dist/common/errors.js +31 -0
  18. package/dist/common/errors.js.map +1 -0
  19. package/dist/common/validationSchemas.d.ts +0 -12
  20. package/dist/common/validationSchemas.js +2 -12
  21. package/dist/common/validationSchemas.js.map +1 -1
  22. package/dist/domain/auth/index.d.ts +0 -12
  23. package/dist/domain/auth/index.js +2 -12
  24. package/dist/domain/auth/index.js.map +1 -1
  25. package/dist/domain/calculations/index.d.ts +0 -12
  26. package/dist/domain/calculations/index.js +4 -14
  27. package/dist/domain/calculations/index.js.map +1 -1
  28. package/dist/domain/calculations/schema.d.ts +0 -12
  29. package/dist/domain/calculations/schema.js +2 -12
  30. package/dist/domain/calculations/schema.js.map +1 -1
  31. package/dist/domain/calculations/service.d.ts +2 -14
  32. package/dist/domain/calculations/service.js +7 -17
  33. package/dist/domain/calculations/service.js.map +1 -1
  34. package/dist/domain/cardTypes/index.d.ts +0 -12
  35. package/dist/domain/cardTypes/index.js +10 -20
  36. package/dist/domain/cardTypes/index.js.map +1 -1
  37. package/dist/domain/cardTypes/schema.d.ts +0 -12
  38. package/dist/domain/cardTypes/schema.js +2 -12
  39. package/dist/domain/cardTypes/schema.js.map +1 -1
  40. package/dist/domain/cardTypes/service.d.ts +4 -16
  41. package/dist/domain/cardTypes/service.js +17 -25
  42. package/dist/domain/cardTypes/service.js.map +1 -1
  43. package/dist/domain/cards/index.d.ts +0 -12
  44. package/dist/domain/cards/index.js +120 -102
  45. package/dist/domain/cards/index.js.map +1 -1
  46. package/dist/domain/cards/lib.d.ts +6 -23
  47. package/dist/domain/cards/lib.js +7 -126
  48. package/dist/domain/cards/lib.js.map +1 -1
  49. package/dist/domain/cards/mermaid.d.ts +8 -0
  50. package/dist/domain/cards/mermaid.js +23 -0
  51. package/dist/domain/cards/mermaid.js.map +1 -0
  52. package/dist/domain/cards/schema.d.ts +6 -12
  53. package/dist/domain/cards/schema.js +6 -12
  54. package/dist/domain/cards/schema.js.map +1 -1
  55. package/dist/domain/cards/service.d.ts +28 -32
  56. package/dist/domain/cards/service.js +119 -83
  57. package/dist/domain/cards/service.js.map +1 -1
  58. package/dist/domain/connectors/index.d.ts +0 -12
  59. package/dist/domain/connectors/index.js +4 -14
  60. package/dist/domain/connectors/index.js.map +1 -1
  61. package/dist/domain/connectors/service.d.ts +2 -14
  62. package/dist/domain/connectors/service.js +4 -14
  63. package/dist/domain/connectors/service.js.map +1 -1
  64. package/dist/domain/events/events-by-project.d.ts +19 -0
  65. package/dist/domain/events/events-by-project.js +57 -0
  66. package/dist/domain/events/events-by-project.js.map +1 -0
  67. package/dist/domain/events/index.d.ts +0 -12
  68. package/dist/domain/events/index.js +3 -13
  69. package/dist/domain/events/index.js.map +1 -1
  70. package/dist/domain/events/lifetime.d.ts +0 -12
  71. package/dist/domain/events/lifetime.js +2 -12
  72. package/dist/domain/events/lifetime.js.map +1 -1
  73. package/dist/domain/events/project-events.d.ts +10 -14
  74. package/dist/domain/events/project-events.js +22 -18
  75. package/dist/domain/events/project-events.js.map +1 -1
  76. package/dist/domain/events/schema.d.ts +0 -12
  77. package/dist/domain/events/schema.js +2 -12
  78. package/dist/domain/events/schema.js.map +1 -1
  79. package/dist/domain/fieldTypes/index.d.ts +0 -12
  80. package/dist/domain/fieldTypes/index.js +6 -16
  81. package/dist/domain/fieldTypes/index.js.map +1 -1
  82. package/dist/domain/fieldTypes/schema.d.ts +0 -12
  83. package/dist/domain/fieldTypes/schema.js +2 -12
  84. package/dist/domain/fieldTypes/schema.js.map +1 -1
  85. package/dist/domain/fieldTypes/service.d.ts +4 -16
  86. package/dist/domain/fieldTypes/service.js +7 -17
  87. package/dist/domain/fieldTypes/service.js.map +1 -1
  88. package/dist/domain/graphModels/index.d.ts +0 -12
  89. package/dist/domain/graphModels/index.js +4 -14
  90. package/dist/domain/graphModels/index.js.map +1 -1
  91. package/dist/domain/graphModels/schema.d.ts +0 -12
  92. package/dist/domain/graphModels/schema.js +2 -12
  93. package/dist/domain/graphModels/schema.js.map +1 -1
  94. package/dist/domain/graphModels/service.d.ts +2 -14
  95. package/dist/domain/graphModels/service.js +4 -14
  96. package/dist/domain/graphModels/service.js.map +1 -1
  97. package/dist/domain/graphViews/index.d.ts +0 -12
  98. package/dist/domain/graphViews/index.js +4 -14
  99. package/dist/domain/graphViews/index.js.map +1 -1
  100. package/dist/domain/graphViews/schema.js +2 -0
  101. package/dist/domain/graphViews/schema.js.map +1 -1
  102. package/dist/domain/graphViews/service.d.ts +2 -14
  103. package/dist/domain/graphViews/service.js +4 -14
  104. package/dist/domain/graphViews/service.js.map +1 -1
  105. package/dist/domain/labels/index.d.ts +0 -12
  106. package/dist/domain/labels/index.js +4 -14
  107. package/dist/domain/labels/index.js.map +1 -1
  108. package/dist/domain/labels/service.d.ts +3 -15
  109. package/dist/domain/labels/service.js +5 -15
  110. package/dist/domain/labels/service.js.map +1 -1
  111. package/dist/domain/linkTypes/index.d.ts +0 -12
  112. package/dist/domain/linkTypes/index.js +6 -16
  113. package/dist/domain/linkTypes/index.js.map +1 -1
  114. package/dist/domain/linkTypes/schema.d.ts +0 -12
  115. package/dist/domain/linkTypes/schema.js +2 -12
  116. package/dist/domain/linkTypes/schema.js.map +1 -1
  117. package/dist/domain/linkTypes/service.d.ts +3 -15
  118. package/dist/domain/linkTypes/service.js +7 -17
  119. package/dist/domain/linkTypes/service.js.map +1 -1
  120. package/dist/domain/logicPrograms/index.d.ts +0 -12
  121. package/dist/domain/logicPrograms/index.js +4 -14
  122. package/dist/domain/logicPrograms/index.js.map +1 -1
  123. package/dist/domain/logicPrograms/service.d.ts +2 -14
  124. package/dist/domain/logicPrograms/service.js +5 -3
  125. package/dist/domain/logicPrograms/service.js.map +1 -1
  126. package/dist/domain/mcp/index.d.ts +3 -15
  127. package/dist/domain/mcp/index.js +27 -21
  128. package/dist/domain/mcp/index.js.map +1 -1
  129. package/dist/domain/project/index.d.ts +0 -12
  130. package/dist/domain/project/index.js +30 -40
  131. package/dist/domain/project/index.js.map +1 -1
  132. package/dist/domain/project/schema.d.ts +0 -12
  133. package/dist/domain/project/schema.js +2 -12
  134. package/dist/domain/project/schema.js.map +1 -1
  135. package/dist/domain/project/service.d.ts +16 -28
  136. package/dist/domain/project/service.js +48 -58
  137. package/dist/domain/project/service.js.map +1 -1
  138. package/dist/domain/projects/index.d.ts +2 -14
  139. package/dist/domain/projects/index.js +19 -36
  140. package/dist/domain/projects/index.js.map +1 -1
  141. package/dist/domain/projects/schema.d.ts +1 -12
  142. package/dist/domain/projects/schema.js +3 -12
  143. package/dist/domain/projects/schema.js.map +1 -1
  144. package/dist/domain/projects/service.d.ts +9 -35
  145. package/dist/domain/projects/service.js +12 -48
  146. package/dist/domain/projects/service.js.map +1 -1
  147. package/dist/domain/reports/index.d.ts +0 -12
  148. package/dist/domain/reports/index.js +4 -14
  149. package/dist/domain/reports/index.js.map +1 -1
  150. package/dist/domain/reports/schema.d.ts +0 -12
  151. package/dist/domain/reports/schema.js +2 -12
  152. package/dist/domain/reports/schema.js.map +1 -1
  153. package/dist/domain/reports/service.d.ts +2 -14
  154. package/dist/domain/reports/service.js +4 -14
  155. package/dist/domain/reports/service.js.map +1 -1
  156. package/dist/domain/resources/index.d.ts +0 -12
  157. package/dist/domain/resources/index.js +19 -26
  158. package/dist/domain/resources/index.js.map +1 -1
  159. package/dist/domain/resources/schema.js +2 -0
  160. package/dist/domain/resources/schema.js.map +1 -1
  161. package/dist/domain/resources/service.d.ts +11 -23
  162. package/dist/domain/resources/service.js +48 -59
  163. package/dist/domain/resources/service.js.map +1 -1
  164. package/dist/domain/skills/index.d.ts +0 -12
  165. package/dist/domain/skills/index.js +4 -14
  166. package/dist/domain/skills/index.js.map +1 -1
  167. package/dist/domain/skills/schema.d.ts +0 -12
  168. package/dist/domain/skills/schema.js +2 -12
  169. package/dist/domain/skills/schema.js.map +1 -1
  170. package/dist/domain/skills/service.d.ts +2 -14
  171. package/dist/domain/skills/service.js +4 -14
  172. package/dist/domain/skills/service.js.map +1 -1
  173. package/dist/domain/templates/index.d.ts +0 -12
  174. package/dist/domain/templates/index.js +8 -18
  175. package/dist/domain/templates/index.js.map +1 -1
  176. package/dist/domain/templates/schema.d.ts +0 -12
  177. package/dist/domain/templates/schema.js +2 -12
  178. package/dist/domain/templates/schema.js.map +1 -1
  179. package/dist/domain/templates/service.d.ts +4 -16
  180. package/dist/domain/templates/service.js +8 -18
  181. package/dist/domain/templates/service.js.map +1 -1
  182. package/dist/domain/tree/index.d.ts +0 -12
  183. package/dist/domain/tree/index.js +4 -14
  184. package/dist/domain/tree/index.js.map +1 -1
  185. package/dist/domain/tree/service.d.ts +3 -15
  186. package/dist/domain/tree/service.js +8 -15
  187. package/dist/domain/tree/service.js.map +1 -1
  188. package/dist/domain/workflows/index.d.ts +0 -12
  189. package/dist/domain/workflows/index.js +4 -14
  190. package/dist/domain/workflows/index.js.map +1 -1
  191. package/dist/domain/workflows/schema.d.ts +0 -12
  192. package/dist/domain/workflows/schema.js +2 -12
  193. package/dist/domain/workflows/schema.js.map +1 -1
  194. package/dist/domain/workflows/service.d.ts +2 -14
  195. package/dist/domain/workflows/service.js +4 -14
  196. package/dist/domain/workflows/service.js.map +1 -1
  197. package/dist/export.d.ts +6 -20
  198. package/dist/export.js +19 -29
  199. package/dist/export.js.map +1 -1
  200. package/dist/frontend.d.ts +22 -0
  201. package/dist/frontend.js +51 -0
  202. package/dist/frontend.js.map +1 -0
  203. package/dist/index.d.ts +3 -5
  204. package/dist/index.js +22 -48
  205. package/dist/index.js.map +1 -1
  206. package/dist/main.js +19 -30
  207. package/dist/main.js.map +1 -1
  208. package/dist/middleware/auth.d.ts +0 -12
  209. package/dist/middleware/auth.js +2 -12
  210. package/dist/middleware/auth.js.map +1 -1
  211. package/dist/middleware/commandManager.d.ts +15 -20
  212. package/dist/middleware/commandManager.js +27 -36
  213. package/dist/middleware/commandManager.js.map +1 -1
  214. package/dist/middleware/tree.js +2 -0
  215. package/dist/middleware/tree.js.map +1 -1
  216. package/dist/middleware/zvalidator.js +2 -0
  217. package/dist/middleware/zvalidator.js.map +1 -1
  218. package/dist/overlay.d.ts +4 -16
  219. package/dist/overlay.js +22 -17
  220. package/dist/overlay.js.map +1 -1
  221. package/dist/public/THIRD-PARTY.txt +1397 -286
  222. package/dist/public/assets/__vite-browser-external-DGgK3jMU.js +1 -0
  223. package/dist/public/assets/abnfDiagram-WEYOIA3C-B3qq7PKv.js +1 -0
  224. package/dist/public/assets/architecture-WOLXFQ4H-Bzau2LI0.js +1 -0
  225. package/dist/public/assets/architectureDiagram-ZHVYKT53-Bg0cUwdb.js +36 -0
  226. package/dist/public/assets/blockDiagram-RJAE7QA3-0RJB-ra-.js +140 -0
  227. package/dist/public/assets/c4Diagram-XDPPPE54-BzoQcLvf.js +38 -0
  228. package/dist/public/assets/channel-6BNdw4Ax.js +1 -0
  229. package/dist/public/assets/{chunk-SVP7TREG-CIQMl7hl.js → chunk-2E7WHVMD-6aqPk-Hk.js} +4 -4
  230. package/dist/public/assets/chunk-4EMNKR2T-vovNSAaE.js +1 -0
  231. package/dist/public/assets/{chunk-F27PBJKO-tDfs6zeO.js → chunk-55XCU76K-DXkKnt2y.js} +1 -1
  232. package/dist/public/assets/chunk-7S6XSTFO-B9bfO0l3.js +2 -0
  233. package/dist/public/assets/chunk-AQDTSKZB-ilLy_cYP.js +72 -0
  234. package/dist/public/assets/chunk-DSNLSHJZ-DAudglXu.js +129 -0
  235. package/dist/public/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
  236. package/dist/public/assets/chunk-HAGFOTED-CSKFgs6b.js +62 -0
  237. package/dist/public/assets/chunk-HNE4Q36P-Cu5gPBVk.js +1 -0
  238. package/dist/public/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
  239. package/dist/public/assets/chunk-NGNAAXSQ-DI_UYJZ4.js +136 -0
  240. package/dist/public/assets/chunk-NQOKRVIF-Bpcvhq1n.js +213 -0
  241. package/dist/public/assets/chunk-UHW7PFBP-BDjvOaTH.js +1 -0
  242. package/dist/public/assets/chunk-VQ5W62QI-DHTcO93W.js +1 -0
  243. package/dist/public/assets/chunk-WQQL4CDK-H6nAhuck.js +10 -0
  244. package/dist/public/assets/{chunk-XXDRQBXY-B7bWyHjt.js → chunk-XXDRQBXY-BUghdEVl.js} +1 -1
  245. package/dist/public/assets/chunk-YZO67HFG-D13E0_Yh.js +1 -0
  246. package/dist/public/assets/chunk-ZAUX2LTX-Dp5y-2wt.js +1 -0
  247. package/dist/public/assets/chunk-ZCHMQSOR-RJjlln1D.js +2 -0
  248. package/dist/public/assets/classDiagram-v2-4MYWR3UA-CAqiFCSv.js +217 -0
  249. package/dist/public/assets/cose-bilkent-JH36ORCC-C_VOHzoP.js +1 -0
  250. package/dist/public/assets/cynefin-EF2NZ3EQ-Dyk4ZPjK.js +1 -0
  251. package/dist/public/assets/{cynefinDiagram-5FMLGOSQ-_V_nrIhD.js → cynefinDiagram-WF24UDRP-b_Ia8gQX.js} +1 -1
  252. package/dist/public/assets/cytoscape.esm-GRKmfDkD.js +321 -0
  253. package/dist/public/assets/dagre-NK4GIZVX-CH1K1yF8.js +4 -0
  254. package/dist/public/assets/{diagram-VX7I27RA-De_UQv8C.js → diagram-CBK3MWTC-OaKd5avy.js} +13 -13
  255. package/dist/public/assets/diagram-I5XIIV2D-Cmu5z1ad.js +24 -0
  256. package/dist/public/assets/{diagram-S7CK7UJ4-25IjIKyo.js → diagram-ODIL2UCW-Cz1kkDDX.js} +7 -7
  257. package/dist/public/assets/diagram-PFBEJUXE-faMkmqUW.js +3 -0
  258. package/dist/public/assets/{diagram-UQ7AKVKN-C5VvsV7x.js → diagram-RJA3I4VV-nycvfte-.js} +2 -2
  259. package/dist/public/assets/diagram-TYUNFSNR-CjEv5QCm.js +200 -0
  260. package/dist/public/assets/{dist-BDCdLWk4.js → dist-DGs_yUrP.js} +1 -1
  261. package/dist/public/assets/ebnfDiagram-V4P3TTPT-DN-IIxCy.js +1 -0
  262. package/dist/public/assets/elk-QONTBCTQ-Bsam88GP.js +27 -0
  263. package/dist/public/assets/erDiagram-KYQIGQAA-DEU_qqNK.js +99 -0
  264. package/dist/public/assets/eventmodeling-K75KTNOO-Bl6NCM9E.js +1 -0
  265. package/dist/public/assets/flowDiagram-IUGLLWBU-Cl4qZ-36.js +1 -0
  266. package/dist/public/assets/ganttDiagram-R7GPNTJY-BmMd4aGi.js +292 -0
  267. package/dist/public/assets/gitGraph-VSP46ZUC-Q0H2PWek.js +1 -0
  268. package/dist/public/assets/gitGraphDiagram-PDYL7XHY-BlCTBYTj.js +106 -0
  269. package/dist/public/assets/index-CuBJ0hof.css +1 -0
  270. package/dist/public/assets/index-D701BZPh.js +2219 -0
  271. package/dist/public/assets/info-OHQRW6UA-D0TMPJxW.js +1 -0
  272. package/dist/public/assets/infoDiagram-MVDRKAX5-CljbtJXu.js +2 -0
  273. package/dist/public/assets/{ishikawaDiagram-5VMMS53U-KvT4DU1u.js → ishikawaDiagram-HPEHV2GE-_Y3Fr0hu.js} +6 -6
  274. package/dist/public/assets/{journeyDiagram-3NMN7TZE-PhGRkXkq.js → journeyDiagram-BOSHW7O7-Bo55jJ4m.js} +39 -39
  275. package/dist/public/assets/kanban-definition-FNSA4HC5-Cd-10MtF.js +89 -0
  276. package/dist/public/assets/katex-MEuSR36T.js +257 -0
  277. package/dist/public/assets/line-BDmh4sWC.js +1 -0
  278. package/dist/public/assets/linear-Dt7xjMrI.js +1 -0
  279. package/dist/public/assets/mermaid-parser.core-BJ1yyzvV.js +7 -0
  280. package/dist/public/assets/mindmap-definition-6OY57UG3-CRgumPuN.js +98 -0
  281. package/dist/public/assets/packet-JDAUHWVQ-DsTMT3Kw.js +1 -0
  282. package/dist/public/assets/pegDiagram-ECIUJNBX-BEGI5k3m.js +1 -0
  283. package/dist/public/assets/pie-XZMESJXO-COyqzA3N.js +1 -0
  284. package/dist/public/assets/pieDiagram-GNMPY74T-CrLJhZJJ.js +39 -0
  285. package/dist/public/assets/{quadrantDiagram-AXDQQJYC-B9dlNtZl.js → quadrantDiagram-D57K4MC3-Fl7HMHxK.js} +6 -6
  286. package/dist/public/assets/radar-ABXABTNO-DeXHKowk.js +1 -0
  287. package/dist/public/assets/railroad-I3PHUGI6-CUjKUdPz.js +1 -0
  288. package/dist/public/assets/railroad-abnf-LNEFI6M7-B1aEgHE6.js +1 -0
  289. package/dist/public/assets/railroad-ebnf-DWYD2UWJ-DmmI3Voz.js +1 -0
  290. package/dist/public/assets/railroad-peg-JR7BVNR7-BHzi9m7r.js +1 -0
  291. package/dist/public/assets/railroadDiagram-Y72NRBL7-D1oeE5fy.js +1 -0
  292. package/dist/public/assets/requirementDiagram-EQYSW5RA-BJDKK1aS.js +84 -0
  293. package/dist/public/assets/rolldown-runtime-BCiCTKAo.js +1 -0
  294. package/dist/public/assets/{sankeyDiagram-P5KCCOFB-C4rb2pZ9.js → sankeyDiagram-SY24JHO5-C4g0OwZ9.js} +7 -7
  295. package/dist/public/assets/sequenceDiagram-BLEHNHQU-CEvy4P-b.js +169 -0
  296. package/dist/public/assets/src-MPsEqXxq.js +1 -0
  297. package/dist/public/assets/stateDiagram-v2-A6IESKWZ-BFhvw4Gl.js +291 -0
  298. package/dist/public/assets/swimlanes-B3ENRKFQ-BIl_Q-FM.js +1 -0
  299. package/dist/public/assets/swimlanesDiagram-AYQRV4AK-rvDbKEHQ.js +8 -0
  300. package/dist/public/assets/timeline-definition-JXYKGLGB-qAoWTH4N.js +120 -0
  301. package/dist/public/assets/treeView-D4JQ5SDB-vq16JKkJ.js +1 -0
  302. package/dist/public/assets/treemap-SAJKECNS-C0IZTaDk.js +1 -0
  303. package/dist/public/assets/usecaseDiagram-WPOLBNNX-Dq8iz49r.js +328 -0
  304. package/dist/public/assets/vennDiagram-Q3Y3IDCW-Br4JmRjM.js +34 -0
  305. package/dist/public/assets/wardley-7MLQ67FV-CEPlAQ79.js +1 -0
  306. package/dist/public/assets/{wardleyDiagram-VM6X3IG4-BOXpwLCv.js → wardleyDiagram-IVAIDKWA-DURB7Ue6.js} +4 -4
  307. package/dist/public/assets/xychartDiagram-4URNHDU4-BiZywfhy.js +7 -0
  308. package/dist/public/index.html +27 -21
  309. package/dist/public/sbom.cdx.json +1 -1
  310. package/dist/types.d.ts +0 -12
  311. package/dist/types.js +2 -12
  312. package/dist/types.js.map +1 -1
  313. package/dist/utils.d.ts +12 -5
  314. package/dist/utils.js +18 -43
  315. package/dist/utils.js.map +1 -1
  316. package/package.json +13 -12
  317. package/src/app.ts +37 -52
  318. package/src/auth/index.ts +2 -12
  319. package/src/auth/keycloak.ts +2 -12
  320. package/src/auth/mock.ts +2 -12
  321. package/src/auth/types.ts +2 -12
  322. package/src/common/errors.ts +45 -0
  323. package/src/common/validationSchemas.ts +3 -12
  324. package/src/domain/auth/index.ts +2 -12
  325. package/src/domain/calculations/index.ts +4 -14
  326. package/src/domain/calculations/schema.ts +2 -12
  327. package/src/domain/calculations/service.ts +8 -21
  328. package/src/domain/cardTypes/index.ts +10 -20
  329. package/src/domain/cardTypes/schema.ts +3 -12
  330. package/src/domain/cardTypes/service.ts +22 -29
  331. package/src/domain/cards/index.ts +158 -128
  332. package/src/domain/cards/lib.ts +9 -161
  333. package/src/domain/cards/mermaid.ts +25 -0
  334. package/src/domain/cards/schema.ts +8 -12
  335. package/src/domain/cards/service.ts +165 -118
  336. package/src/domain/connectors/index.ts +5 -14
  337. package/src/domain/connectors/service.ts +5 -20
  338. package/src/domain/events/events-by-project.ts +59 -0
  339. package/src/domain/events/index.ts +3 -13
  340. package/src/domain/events/lifetime.ts +2 -12
  341. package/src/domain/events/project-events.ts +30 -18
  342. package/src/domain/events/schema.ts +2 -12
  343. package/src/domain/fieldTypes/index.ts +6 -16
  344. package/src/domain/fieldTypes/schema.ts +3 -12
  345. package/src/domain/fieldTypes/service.ts +9 -21
  346. package/src/domain/graphModels/index.ts +4 -14
  347. package/src/domain/graphModels/schema.ts +3 -12
  348. package/src/domain/graphModels/service.ts +5 -18
  349. package/src/domain/graphViews/index.ts +4 -14
  350. package/src/domain/graphViews/schema.ts +3 -0
  351. package/src/domain/graphViews/service.ts +5 -18
  352. package/src/domain/labels/index.ts +4 -14
  353. package/src/domain/labels/service.ts +6 -16
  354. package/src/domain/linkTypes/index.ts +6 -16
  355. package/src/domain/linkTypes/schema.ts +2 -12
  356. package/src/domain/linkTypes/service.ts +8 -21
  357. package/src/domain/logicPrograms/index.ts +5 -17
  358. package/src/domain/logicPrograms/service.ts +7 -16
  359. package/src/domain/mcp/index.ts +33 -24
  360. package/src/domain/project/index.ts +34 -40
  361. package/src/domain/project/schema.ts +2 -12
  362. package/src/domain/project/service.ts +56 -71
  363. package/src/domain/projects/index.ts +34 -50
  364. package/src/domain/projects/schema.ts +3 -12
  365. package/src/domain/projects/service.ts +18 -88
  366. package/src/domain/reports/index.ts +4 -14
  367. package/src/domain/reports/schema.ts +2 -12
  368. package/src/domain/reports/service.ts +5 -18
  369. package/src/domain/resources/index.ts +19 -30
  370. package/src/domain/resources/schema.ts +3 -0
  371. package/src/domain/resources/service.ts +55 -90
  372. package/src/domain/skills/index.ts +4 -14
  373. package/src/domain/skills/schema.ts +2 -12
  374. package/src/domain/skills/service.ts +5 -15
  375. package/src/domain/templates/index.ts +8 -18
  376. package/src/domain/templates/schema.ts +2 -12
  377. package/src/domain/templates/service.ts +9 -22
  378. package/src/domain/tree/index.ts +4 -14
  379. package/src/domain/tree/service.ts +10 -21
  380. package/src/domain/workflows/index.ts +4 -14
  381. package/src/domain/workflows/schema.ts +2 -12
  382. package/src/domain/workflows/service.ts +5 -18
  383. package/src/export.ts +24 -33
  384. package/src/frontend.ts +58 -0
  385. package/src/index.ts +32 -53
  386. package/src/main.ts +25 -35
  387. package/src/middleware/auth.ts +2 -12
  388. package/src/middleware/commandManager.ts +35 -50
  389. package/src/middleware/tree.ts +3 -0
  390. package/src/middleware/zvalidator.ts +3 -0
  391. package/src/overlay.ts +29 -19
  392. package/src/types.ts +2 -12
  393. package/src/utils.ts +26 -46
  394. package/dist/project-errors.d.ts +0 -18
  395. package/dist/project-errors.js +0 -25
  396. package/dist/project-errors.js.map +0 -1
  397. package/dist/project-registry.d.ts +0 -65
  398. package/dist/project-registry.js +0 -121
  399. package/dist/project-registry.js.map +0 -1
  400. package/dist/public/assets/__vite-browser-external-PaJ7c2l8.js +0 -1
  401. package/dist/public/assets/abnfDiagram-VCTEODGH-DB2dfOGe.js +0 -1
  402. package/dist/public/assets/architecture-7GRP2DOG-2V0X8hxt.js +0 -1
  403. package/dist/public/assets/architectureDiagram-5GKGNRK7-CRhUR2Ul.js +0 -36
  404. package/dist/public/assets/blockDiagram-I7D4REHJ-DJKsYF1v.js +0 -129
  405. package/dist/public/assets/c4Diagram-7LVT6UL2-BTwMzoAF.js +0 -38
  406. package/dist/public/assets/channel-C0JtPpMA.js +0 -1
  407. package/dist/public/assets/chunk-4HAMMTFA-DjjgrBsB.js +0 -62
  408. package/dist/public/assets/chunk-75Z2AOVW-CKqXRGJV.js +0 -2
  409. package/dist/public/assets/chunk-DU6HZSFF-iJGdiRt7.js +0 -127
  410. package/dist/public/assets/chunk-FOHPRMQF-DzxwRta7.js +0 -161
  411. package/dist/public/assets/chunk-GMAD6QVW-DxHVEaGj.js +0 -72
  412. package/dist/public/assets/chunk-GVQU2GXP-AMxD4_Ta.js +0 -1
  413. package/dist/public/assets/chunk-IMKFNOWR-0rz8QrYC.js +0 -231
  414. package/dist/public/assets/chunk-L3NEJ4N5-BK3KAKMe.js +0 -1
  415. package/dist/public/assets/chunk-OSK3NFVY-B8MdrI_M.js +0 -10
  416. package/dist/public/assets/chunk-P2QGCYS3-D3J5AcHg.js +0 -1
  417. package/dist/public/assets/chunk-POPQ4Y6H-CsYg_XkK.js +0 -1
  418. package/dist/public/assets/chunk-PWAF6VOD-D9cdEIZp.js +0 -1
  419. package/dist/public/assets/chunk-SHT3W25Y-1jjokCf3.js +0 -168
  420. package/dist/public/assets/chunk-TICWLB2K-Ccsy2PYz.js +0 -206
  421. package/dist/public/assets/classDiagram-ZZMXUADV-mWyXNAXi.js +0 -1
  422. package/dist/public/assets/classDiagram-v2-VYDZK3BY-mWyXNAXi.js +0 -1
  423. package/dist/public/assets/cose-bilkent-JH36ORCC-DPzc3Pv4.js +0 -1
  424. package/dist/public/assets/cynefin-OW5HDTMX-BIVDCYOU.js +0 -1
  425. package/dist/public/assets/cytoscape.esm-NgwPT4ez.js +0 -321
  426. package/dist/public/assets/dagre-C-rnJpZF.js +0 -1
  427. package/dist/public/assets/dagre-GXQ25YYZ-CJc0wc6f.js +0 -4
  428. package/dist/public/assets/diagram-VSXAHHWV-Dw3rKVL_.js +0 -3
  429. package/dist/public/assets/diagram-Z3DM3KII-Bd-65QQW.js +0 -24
  430. package/dist/public/assets/ebnfDiagram-PWID7BFC-CrxdET5U.js +0 -1
  431. package/dist/public/assets/erDiagram-RLTQ6QDP-BKo0Uyna.js +0 -99
  432. package/dist/public/assets/eventmodeling-NTZA5JFV-DKkAdJZd.js +0 -1
  433. package/dist/public/assets/flowDiagram-HODETNUW-CEE2wjdt.js +0 -1
  434. package/dist/public/assets/ganttDiagram-EL5Y4UJY-BHFn8vk0.js +0 -292
  435. package/dist/public/assets/gitGraph-4MIJSDKK-Bpvnb45u.js +0 -1
  436. package/dist/public/assets/gitGraphDiagram-WWUBYQGX-Bw0EoxBY.js +0 -106
  437. package/dist/public/assets/index-D3HS7YxF.js +0 -2228
  438. package/dist/public/assets/index-Sv3WxZ_8.css +0 -1
  439. package/dist/public/assets/info-A6RAGUB7-BvvG_zrk.js +0 -1
  440. package/dist/public/assets/infoDiagram-27XIBGKW-CtpdJmtL.js +0 -2
  441. package/dist/public/assets/kanban-definition-UXKFOSKX-Oyx5QgRq.js +0 -89
  442. package/dist/public/assets/katex-ZlcWpGUi.js +0 -257
  443. package/dist/public/assets/line-Dr41HTk1.js +0 -1
  444. package/dist/public/assets/linear-DDBi9FwZ.js +0 -1
  445. package/dist/public/assets/mermaid-parser.core-DsIAxDBa.js +0 -7
  446. package/dist/public/assets/mindmap-definition-YA3MSWOX-r8hvd6gP.js +0 -96
  447. package/dist/public/assets/packet-AYTQ26CC-B0EpJ2Sc.js +0 -1
  448. package/dist/public/assets/pegDiagram-XKGWAZYB-DaNkQTQF.js +0 -1
  449. package/dist/public/assets/pie-WAS4IAKB-Dt2zttL9.js +0 -1
  450. package/dist/public/assets/pieDiagram-E7YTZNPT-x0XWEGbd.js +0 -39
  451. package/dist/public/assets/radar-RG4KPBEZ-DjbR4-5l.js +0 -1
  452. package/dist/public/assets/railroad-74A4TZTK-Bk3B5r_R.js +0 -1
  453. package/dist/public/assets/railroad-abnf-HS5TGJTU-DxaWfACD.js +0 -1
  454. package/dist/public/assets/railroad-ebnf-LZEXJU2U-DscxXZO0.js +0 -1
  455. package/dist/public/assets/railroad-peg-WCYAUIDC-BCWzRFzw.js +0 -1
  456. package/dist/public/assets/railroadDiagram-O6MQD6OU-DhwsoX6A.js +0 -1
  457. package/dist/public/assets/requirementDiagram-BXWQKSXE-BiqZ6axf.js +0 -84
  458. package/dist/public/assets/rolldown-runtime-B0Z9INg1.js +0 -1
  459. package/dist/public/assets/sequenceDiagram-WJ2MYXX4-DRKTnGD7.js +0 -162
  460. package/dist/public/assets/src-an_qrnIj.js +0 -1
  461. package/dist/public/assets/stateDiagram-D77RDMKH-xxdybg5Z.js +0 -1
  462. package/dist/public/assets/stateDiagram-v2-MP3YSRHH-CXzmJy_a.js +0 -1
  463. package/dist/public/assets/swimlanes-42K2YHIH-DyGI1gI6.js +0 -1
  464. package/dist/public/assets/swimlanesDiagram-VR7AAH4N-7hqb6VoW.js +0 -8
  465. package/dist/public/assets/timeline-definition-24CTP7MA-C2pIp77Q.js +0 -120
  466. package/dist/public/assets/treeView-Q6P3EWNA-CxRtaaB8.js +0 -1
  467. package/dist/public/assets/treemap-WGGIJYW6-G1IHiwTa.js +0 -1
  468. package/dist/public/assets/vennDiagram-4TSXK5OY-CwimQRR9.js +0 -34
  469. package/dist/public/assets/wardley-WFR3VGLG-DkQ3TjZX.js +0 -1
  470. package/dist/public/assets/xychartDiagram-S5SC5T6Z-ChOPYsHc.js +0 -7
  471. package/src/project-errors.ts +0 -33
  472. package/src/project-registry.ts +0 -161
@@ -1 +1 @@
1
- {"bomFormat":"CycloneDX","specVersion":"1.6","components":[{"type":"library","name":"react","version":"19.3.0","purl":"pkg:npm/react@19.3.0"},{"type":"library","name":"scheduler","version":"0.28.0","purl":"pkg:npm/scheduler@0.28.0"},{"type":"library","name":"react-dom","version":"19.3.0","purl":"pkg:npm/react-dom@19.3.0"},{"type":"library","name":"react-router","version":"8.4.0","purl":"pkg:npm/react-router@8.4.0"},{"type":"library","name":"@mui/joy","version":"5.0.0-beta.52","purl":"pkg:npm/%40mui/joy@5.0.0-beta.52"},{"type":"library","name":"@mui/utils","version":"5.17.1","purl":"pkg:npm/%40mui/utils@5.17.1"},{"type":"library","name":"@babel/runtime","version":"7.29.7","purl":"pkg:npm/%40babel/runtime@7.29.7"},{"type":"library","name":"@emotion/sheet","version":"1.4.0","purl":"pkg:npm/%40emotion/sheet@1.4.0"},{"type":"library","name":"stylis","version":"4.2.0","purl":"pkg:npm/stylis@4.2.0"},{"type":"library","name":"@emotion/memoize","version":"0.9.0","purl":"pkg:npm/%40emotion/memoize@0.9.0"},{"type":"library","name":"@emotion/cache","version":"11.14.0","purl":"pkg:npm/%40emotion/cache@11.14.0"},{"type":"library","name":"react-is","version":"16.13.1","purl":"pkg:npm/react-is@16.13.1"},{"type":"library","name":"hoist-non-react-statics","version":"3.3.2","purl":"pkg:npm/hoist-non-react-statics@3.3.2"},{"type":"library","name":"@emotion/utils","version":"1.4.2","purl":"pkg:npm/%40emotion/utils@1.4.2"},{"type":"library","name":"@emotion/hash","version":"0.9.2","purl":"pkg:npm/%40emotion/hash@0.9.2"},{"type":"library","name":"@emotion/unitless","version":"0.10.0","purl":"pkg:npm/%40emotion/unitless@0.10.0"},{"type":"library","name":"@emotion/serialize","version":"1.3.3","purl":"pkg:npm/%40emotion/serialize@1.3.3"},{"type":"library","name":"@emotion/use-insertion-effect-with-fallbacks","version":"1.2.0","purl":"pkg:npm/%40emotion/use-insertion-effect-with-fallbacks@1.2.0"},{"type":"library","name":"@emotion/react","version":"11.14.0","purl":"pkg:npm/%40emotion/react@11.14.0"},{"type":"library","name":"@emotion/is-prop-valid","version":"1.4.0","purl":"pkg:npm/%40emotion/is-prop-valid@1.4.0"},{"type":"library","name":"@emotion/styled","version":"11.14.1","purl":"pkg:npm/%40emotion/styled@11.14.1"},{"type":"library","name":"@mui/styled-engine","version":"5.18.0","purl":"pkg:npm/%40mui/styled-engine@5.18.0"},{"type":"library","name":"@mui/system","version":"5.18.0","purl":"pkg:npm/%40mui/system@5.18.0"},{"type":"library","name":"clsx","version":"2.1.1","purl":"pkg:npm/clsx@2.1.1"},{"type":"library","name":"@mui/private-theming","version":"5.17.1","purl":"pkg:npm/%40mui/private-theming@5.17.1"},{"type":"library","name":"@mui/base","version":"5.0.0-beta.40-1","purl":"pkg:npm/%40mui/base@5.0.0-beta.40-1"},{"type":"library","name":"@popperjs/core","version":"2.11.8","purl":"pkg:npm/%40popperjs/core@2.11.8"},{"type":"library","name":"use-sync-external-store","version":"1.6.0","purl":"pkg:npm/use-sync-external-store@1.6.0"},{"type":"library","name":"dequal","version":"2.0.3","purl":"pkg:npm/dequal@2.0.3"},{"type":"library","name":"swr","version":"2.5.1","purl":"pkg:npm/swr@2.5.1"},{"type":"library","name":"react-hook-form","version":"7.89.0","purl":"pkg:npm/react-hook-form@7.89.0"},{"type":"library","name":"@cyberismo/data-handler","version":"1.2.0","purl":"pkg:npm/%40cyberismo/data-handler@1.2.0"},{"type":"library","name":"redux","version":"5.0.1","purl":"pkg:npm/redux@5.0.1"},{"type":"library","name":"immer","version":"11.1.8","purl":"pkg:npm/immer@11.1.8"},{"type":"library","name":"redux-thunk","version":"3.1.0","purl":"pkg:npm/redux-thunk@3.1.0"},{"type":"library","name":"@reduxjs/toolkit","version":"2.12.0","purl":"pkg:npm/%40reduxjs/toolkit@2.12.0"},{"type":"library","name":"@lezer/common","version":"1.5.2","purl":"pkg:npm/%40lezer/common@1.5.2"},{"type":"library","name":"@lezer/highlight","version":"1.2.3","purl":"pkg:npm/%40lezer/highlight@1.2.3"},{"type":"library","name":"@marijn/find-cluster-break","version":"1.0.3","purl":"pkg:npm/%40marijn/find-cluster-break@1.0.3"},{"type":"library","name":"@codemirror/state","version":"6.7.6","purl":"pkg:npm/%40codemirror/state@6.7.6"},{"type":"library","name":"style-mod","version":"4.1.3","purl":"pkg:npm/style-mod@4.1.3"},{"type":"library","name":"w3c-keyname","version":"2.2.8","purl":"pkg:npm/w3c-keyname@2.2.8"},{"type":"library","name":"crelt","version":"1.0.7","purl":"pkg:npm/crelt@1.0.7"},{"type":"library","name":"@codemirror/view","version":"6.43.13","purl":"pkg:npm/%40codemirror/view@6.43.13"},{"type":"library","name":"@codemirror/language","version":"6.12.4","purl":"pkg:npm/%40codemirror/language@6.12.4"},{"type":"library","name":"@uiw/codemirror-themes","version":"4.25.12","purl":"pkg:npm/%40uiw/codemirror-themes@4.25.12"},{"type":"library","name":"@uiw/codemirror-theme-vscode","version":"4.25.12","purl":"pkg:npm/%40uiw/codemirror-theme-vscode@4.25.12"},{"type":"library","name":"@uiw/codemirror-theme-github","version":"4.25.12","purl":"pkg:npm/%40uiw/codemirror-theme-github@4.25.12"},{"type":"library","name":"redux-persist","version":"6.0.0","purl":"pkg:npm/redux-persist@6.0.0"},{"type":"library","name":"@mui/material","version":"9.4.0","purl":"pkg:npm/%40mui/material@9.4.0"},{"type":"library","name":"react-redux","version":"9.3.0","purl":"pkg:npm/react-redux@9.3.0"},{"type":"library","name":"i18next","version":"26.4.2","purl":"pkg:npm/i18next@26.4.2"},{"type":"library","name":"html-parse-stringify","version":"4.0.1","purl":"pkg:npm/html-parse-stringify@4.0.1"},{"type":"library","name":"react-i18next","version":"17.0.15","purl":"pkg:npm/react-i18next@17.0.15"},{"type":"library","name":"@mui/icons-material","version":"9.4.0","purl":"pkg:npm/%40mui/icons-material@9.4.0"},{"type":"library","name":"@asciidoctor/core","version":"4.1.1","purl":"pkg:npm/%40asciidoctor/core@4.1.1"},{"type":"library","name":"date-fns","version":"4.4.0","purl":"pkg:npm/date-fns@4.4.0"},{"type":"library","name":"react-arborist","version":"3.16.0","purl":"pkg:npm/react-arborist@3.16.0"},{"type":"library","name":"memoize-one","version":"5.2.1","purl":"pkg:npm/memoize-one@5.2.1"},{"type":"library","name":"react-window","version":"1.8.11","purl":"pkg:npm/react-window@1.8.11"},{"type":"library","name":"react-dnd","version":"14.0.5","purl":"pkg:npm/react-dnd@14.0.5"},{"type":"library","name":"dnd-core","version":"14.0.1","purl":"pkg:npm/dnd-core@14.0.1"},{"type":"library","name":"@react-dnd/invariant","version":"2.0.0","purl":"pkg:npm/%40react-dnd/invariant@2.0.0"},{"type":"library","name":"@react-dnd/asap","version":"4.0.1","purl":"pkg:npm/%40react-dnd/asap@4.0.1"},{"type":"library","name":"@react-dnd/shallowequal","version":"2.0.0","purl":"pkg:npm/%40react-dnd/shallowequal@2.0.0"},{"type":"library","name":"fast-deep-equal","version":"3.1.3","purl":"pkg:npm/fast-deep-equal@3.1.3"},{"type":"library","name":"react-dnd-html5-backend","version":"14.1.0","purl":"pkg:npm/react-dnd-html5-backend@14.1.0"},{"type":"library","name":"semver","version":"7.8.5","purl":"pkg:npm/semver@7.8.5"},{"type":"library","name":"react-resizable-panels","version":"4.14.2","purl":"pkg:npm/react-resizable-panels@4.14.2"},{"type":"library","name":"node-html-parser","version":"9.0.4","purl":"pkg:npm/node-html-parser@9.0.4"},{"type":"library","name":"html-dom-parser","version":"8.0.2","purl":"pkg:npm/html-dom-parser@8.0.2"},{"type":"library","name":"react-property","version":"2.0.2","purl":"pkg:npm/react-property@2.0.2"},{"type":"library","name":"inline-style-parser","version":"0.2.9","purl":"pkg:npm/inline-style-parser@0.2.9"},{"type":"library","name":"style-to-object","version":"2.0.2","purl":"pkg:npm/style-to-object@2.0.2"},{"type":"library","name":"style-to-js","version":"2.0.2","purl":"pkg:npm/style-to-js@2.0.2"},{"type":"library","name":"html-react-parser","version":"6.1.8","purl":"pkg:npm/html-react-parser@6.1.8"},{"type":"library","name":"domelementtype","version":"3.0.0","purl":"pkg:npm/domelementtype@3.0.0"},{"type":"library","name":"domhandler","version":"6.0.1","purl":"pkg:npm/domhandler@6.0.1"},{"type":"library","name":"d3-array","version":"3.2.4","purl":"pkg:npm/d3-array@3.2.4"},{"type":"library","name":"internmap","version":"2.0.3","purl":"pkg:npm/internmap@2.0.3"},{"type":"library","name":"d3-color","version":"3.1.0","purl":"pkg:npm/d3-color@3.1.0"},{"type":"library","name":"d3-interpolate","version":"3.0.1","purl":"pkg:npm/d3-interpolate@3.0.1"},{"type":"library","name":"d3-timer","version":"3.0.1","purl":"pkg:npm/d3-timer@3.0.1"},{"type":"library","name":"d3-ease","version":"3.0.1","purl":"pkg:npm/d3-ease@3.0.1"},{"type":"library","name":"robust-predicates","version":"3.0.3","purl":"pkg:npm/robust-predicates@3.0.3"},{"type":"library","name":"delaunator","version":"5.1.0","purl":"pkg:npm/delaunator@5.1.0"},{"type":"library","name":"d3-delaunay","version":"6.0.4","purl":"pkg:npm/d3-delaunay@6.0.4"},{"type":"library","name":"d3-dsv","version":"3.0.1","purl":"pkg:npm/d3-dsv@3.0.1"},{"type":"library","name":"d3-force","version":"3.0.0","purl":"pkg:npm/d3-force@3.0.0"},{"type":"library","name":"d3-quadtree","version":"3.0.1","purl":"pkg:npm/d3-quadtree@3.0.1"},{"type":"library","name":"d3-geo","version":"3.1.1","purl":"pkg:npm/d3-geo@3.1.1"},{"type":"library","name":"d3-hierarchy","version":"3.1.2","purl":"pkg:npm/d3-hierarchy@3.1.2"},{"type":"library","name":"d3-scale","version":"4.0.2","purl":"pkg:npm/d3-scale@4.0.2"},{"type":"library","name":"d3-time","version":"3.1.0","purl":"pkg:npm/d3-time@3.1.0"},{"type":"library","name":"d3-time-format","version":"4.1.0","purl":"pkg:npm/d3-time-format@4.1.0"},{"type":"library","name":"d3-scale-chromatic","version":"3.1.0","purl":"pkg:npm/d3-scale-chromatic@3.1.0"},{"type":"library","name":"d3-shape","version":"3.2.0","purl":"pkg:npm/d3-shape@3.2.0"},{"type":"library","name":"mermaid","version":"11.17.2","purl":"pkg:npm/mermaid@11.17.2"},{"type":"library","name":"es-toolkit","version":"1.52.0","purl":"pkg:npm/es-toolkit@1.52.0"},{"type":"library","name":"json-stringify-pretty-compact","version":"4.0.0","purl":"pkg:npm/json-stringify-pretty-compact@4.0.0"},{"type":"library","name":"vega-util","version":"2.1.3","purl":"pkg:npm/vega-util@2.1.3"},{"type":"library","name":"topojson-client","version":"3.1.0","purl":"pkg:npm/topojson-client@3.1.0"},{"type":"library","name":"vega-time","version":"3.3.0","purl":"pkg:npm/vega-time@3.3.0"},{"type":"library","name":"vega-format","version":"2.1.3","purl":"pkg:npm/vega-format@2.1.3"},{"type":"library","name":"vega-loader","version":"5.1.3","purl":"pkg:npm/vega-loader@5.1.3"},{"type":"library","name":"vega-dataflow","version":"6.1.3","purl":"pkg:npm/vega-dataflow@6.1.3"},{"type":"library","name":"vega-statistics","version":"2.0.0","purl":"pkg:npm/vega-statistics@2.0.0"},{"type":"library","name":"vega-transforms","version":"5.2.2","purl":"pkg:npm/vega-transforms@5.2.2"},{"type":"library","name":"vega-canvas","version":"2.0.0","purl":"pkg:npm/vega-canvas@2.0.0"},{"type":"library","name":"vega-scale","version":"8.1.3","purl":"pkg:npm/vega-scale@8.1.3"},{"type":"library","name":"vega-scenegraph","version":"5.3.0","purl":"pkg:npm/vega-scenegraph@5.3.0"},{"type":"library","name":"vega-view-transforms","version":"5.2.2","purl":"pkg:npm/vega-view-transforms@5.2.2"},{"type":"library","name":"vega-encode","version":"5.2.2","purl":"pkg:npm/vega-encode@5.2.2"},{"type":"library","name":"d3-geo-projection","version":"4.0.0","purl":"pkg:npm/d3-geo-projection@4.0.0"},{"type":"library","name":"vega-projection","version":"2.1.3","purl":"pkg:npm/vega-projection@2.1.3"},{"type":"library","name":"vega-geo","version":"5.1.3","purl":"pkg:npm/vega-geo@5.1.3"},{"type":"library","name":"vega-force","version":"5.1.3","purl":"pkg:npm/vega-force@5.1.3"},{"type":"library","name":"vega-hierarchy","version":"5.1.3","purl":"pkg:npm/vega-hierarchy@5.1.3"},{"type":"library","name":"vega-label","version":"2.1.3","purl":"pkg:npm/vega-label@2.1.3"},{"type":"library","name":"vega-regression","version":"2.1.3","purl":"pkg:npm/vega-regression@2.1.3"},{"type":"library","name":"vega-voronoi","version":"5.1.3","purl":"pkg:npm/vega-voronoi@5.1.3"},{"type":"library","name":"vega-wordcloud","version":"5.1.3","purl":"pkg:npm/vega-wordcloud@5.1.3"},{"type":"library","name":"vega-crossfilter","version":"5.1.3","purl":"pkg:npm/vega-crossfilter@5.1.3"},{"type":"library","name":"vega-expression","version":"6.2.2","purl":"pkg:npm/vega-expression@6.2.2"},{"type":"library","name":"vega-selections","version":"6.1.5","purl":"pkg:npm/vega-selections@6.1.5"},{"type":"library","name":"vega-functions","version":"6.2.0","purl":"pkg:npm/vega-functions@6.2.0"},{"type":"library","name":"vega-runtime","version":"7.1.3","purl":"pkg:npm/vega-runtime@7.1.3"},{"type":"library","name":"vega-view","version":"6.2.0","purl":"pkg:npm/vega-view@6.2.0"},{"type":"library","name":"vega-event-selector","version":"4.0.0","purl":"pkg:npm/vega-event-selector@4.0.0"},{"type":"library","name":"vega-parser","version":"7.1.3","purl":"pkg:npm/vega-parser@7.1.3"},{"type":"library","name":"vega","version":"6.4.0","purl":"pkg:npm/vega@6.4.0"},{"type":"library","name":"vega-interpreter","version":"2.3.1","purl":"pkg:npm/vega-interpreter@2.3.1"},{"type":"library","name":"vega-lite","version":"6.4.3","purl":"pkg:npm/vega-lite@6.4.3"},{"type":"library","name":"vega-schema-url-parser","version":"3.0.2","purl":"pkg:npm/vega-schema-url-parser@3.0.2"},{"type":"library","name":"vega-themes","version":"3.0.0","purl":"pkg:npm/vega-themes@3.0.0"},{"type":"library","name":"vega-tooltip","version":"1.0.0","purl":"pkg:npm/vega-tooltip@1.0.0"},{"type":"library","name":"vega-embed","version":"7.1.0","purl":"pkg:npm/vega-embed@7.1.0"},{"type":"library","name":"react-vega","version":"8.0.0","purl":"pkg:npm/react-vega@8.0.0"},{"type":"library","name":"@codemirror/commands","version":"6.11.1","purl":"pkg:npm/%40codemirror/commands@6.11.1"},{"type":"library","name":"@codemirror/search","version":"6.7.0","purl":"pkg:npm/%40codemirror/search@6.7.0"},{"type":"library","name":"@codemirror/autocomplete","version":"6.20.2","purl":"pkg:npm/%40codemirror/autocomplete@6.20.2"},{"type":"library","name":"@codemirror/lint","version":"6.9.6","purl":"pkg:npm/%40codemirror/lint@6.9.6"},{"type":"library","name":"@uiw/codemirror-extensions-basic-setup","version":"4.25.12","purl":"pkg:npm/%40uiw/codemirror-extensions-basic-setup@4.25.12"},{"type":"library","name":"@codemirror/theme-one-dark","version":"6.1.3","purl":"pkg:npm/%40codemirror/theme-one-dark@6.1.3"},{"type":"library","name":"@uiw/react-codemirror","version":"4.25.12","purl":"pkg:npm/%40uiw/react-codemirror@4.25.12"},{"type":"library","name":"codemirror-asciidoc","version":"2.0.1","purl":"pkg:npm/codemirror-asciidoc@2.0.1"},{"type":"library","name":"marked","version":"18.0.14","purl":"pkg:npm/marked@18.0.14"},{"type":"library","name":"@hookform/resolvers","version":"5.9.1","purl":"pkg:npm/%40hookform/resolvers@5.9.1"},{"type":"library","name":"zod","version":"4.6.5","purl":"pkg:npm/zod@4.6.5"},{"type":"library","name":"khroma","version":"2.1.0","purl":"pkg:npm/khroma@2.1.0"},{"type":"library","name":"@upsetjs/venn.js","version":"2.0.0","purl":"pkg:npm/%40upsetjs/venn.js@2.0.0"},{"type":"library","name":"d3-sankey","version":"0.12.3","purl":"pkg:npm/d3-sankey@0.12.3"},{"type":"library","name":"d3-path","version":"1.0.9","purl":"pkg:npm/d3-path@1.0.9"},{"type":"library","name":"uuid","version":"14.0.2","purl":"pkg:npm/uuid@14.0.2"},{"type":"library","name":"d3-axis","version":"3.0.0","purl":"pkg:npm/d3-axis@3.0.0"},{"type":"library","name":"dayjs","version":"1.11.23","purl":"pkg:npm/dayjs@1.11.23"},{"type":"library","name":"layout-base","version":"1.0.2","purl":"pkg:npm/layout-base@1.0.2"},{"type":"library","name":"cose-base","version":"1.0.3","purl":"pkg:npm/cose-base@1.0.3"},{"type":"library","name":"cytoscape-cose-bilkent","version":"4.1.0","purl":"pkg:npm/cytoscape-cose-bilkent@4.1.0"},{"type":"library","name":"cytoscape-fcose","version":"2.2.0","purl":"pkg:npm/cytoscape-fcose@2.2.0"},{"type":"library","name":"katex","version":"0.16.47","purl":"pkg:npm/katex@0.16.47"},{"type":"library","name":"dompurify","version":"3.4.16","purl":"pkg:npm/dompurify@3.4.16"},{"type":"library","name":"d3-dispatch","version":"3.0.1","purl":"pkg:npm/d3-dispatch@3.0.1"},{"type":"library","name":"d3-selection","version":"3.0.0","purl":"pkg:npm/d3-selection@3.0.0"},{"type":"library","name":"d3-transition","version":"3.0.1","purl":"pkg:npm/d3-transition@3.0.1"},{"type":"library","name":"d3-brush","version":"3.0.0","purl":"pkg:npm/d3-brush@3.0.0"},{"type":"library","name":"d3-zoom","version":"3.0.0","purl":"pkg:npm/d3-zoom@3.0.0"},{"type":"library","name":"d3-format","version":"3.1.2","purl":"pkg:npm/d3-format@3.1.2"},{"type":"library","name":"@braintree/sanitize-url","version":"7.1.2","purl":"pkg:npm/%40braintree/sanitize-url@7.1.2"},{"type":"library","name":"@iconify/utils","version":"3.1.4","purl":"pkg:npm/%40iconify/utils@3.1.4"},{"type":"library","name":"fastdom","version":"1.0.12","purl":"pkg:npm/fastdom@1.0.12"},{"type":"library","name":"ts-dedent","version":"2.3.0","purl":"pkg:npm/ts-dedent@2.3.0"},{"type":"library","name":"roughjs","version":"4.6.6","purl":"pkg:npm/roughjs@4.6.6"},{"type":"library","name":"lodash-es","version":"4.18.1","purl":"pkg:npm/lodash-es@4.18.1"},{"type":"library","name":"dagre-d3-es","version":"7.0.14","purl":"pkg:npm/dagre-d3-es@7.0.14"},{"type":"library","name":"@mermaid-js/parser","version":"1.2.1","purl":"pkg:npm/%40mermaid-js/parser@1.2.1"},{"type":"library","name":"cytoscape","version":"3.34.2","purl":"pkg:npm/cytoscape@3.34.2"}]}
1
+ {"bomFormat":"CycloneDX","specVersion":"1.6","components":[{"type":"library","name":"react","version":"19.3.1","purl":"pkg:npm/react@19.3.1"},{"type":"library","name":"scheduler","version":"0.28.0","purl":"pkg:npm/scheduler@0.28.0"},{"type":"library","name":"react-dom","version":"19.3.1","purl":"pkg:npm/react-dom@19.3.1"},{"type":"library","name":"react-router","version":"8.5.1","purl":"pkg:npm/react-router@8.5.1"},{"type":"library","name":"@mui/joy","version":"5.0.0-beta.52","purl":"pkg:npm/%40mui/joy@5.0.0-beta.52"},{"type":"library","name":"@mui/utils","version":"5.17.1","purl":"pkg:npm/%40mui/utils@5.17.1"},{"type":"library","name":"@babel/runtime","version":"7.29.7","purl":"pkg:npm/%40babel/runtime@7.29.7"},{"type":"library","name":"@emotion/sheet","version":"1.4.0","purl":"pkg:npm/%40emotion/sheet@1.4.0"},{"type":"library","name":"stylis","version":"4.2.0","purl":"pkg:npm/stylis@4.2.0"},{"type":"library","name":"@emotion/memoize","version":"0.9.0","purl":"pkg:npm/%40emotion/memoize@0.9.0"},{"type":"library","name":"@emotion/cache","version":"11.14.0","purl":"pkg:npm/%40emotion/cache@11.14.0"},{"type":"library","name":"react-is","version":"16.13.1","purl":"pkg:npm/react-is@16.13.1"},{"type":"library","name":"hoist-non-react-statics","version":"3.3.2","purl":"pkg:npm/hoist-non-react-statics@3.3.2"},{"type":"library","name":"@emotion/utils","version":"1.4.2","purl":"pkg:npm/%40emotion/utils@1.4.2"},{"type":"library","name":"@emotion/hash","version":"0.9.2","purl":"pkg:npm/%40emotion/hash@0.9.2"},{"type":"library","name":"@emotion/unitless","version":"0.10.0","purl":"pkg:npm/%40emotion/unitless@0.10.0"},{"type":"library","name":"@emotion/serialize","version":"1.3.3","purl":"pkg:npm/%40emotion/serialize@1.3.3"},{"type":"library","name":"@emotion/use-insertion-effect-with-fallbacks","version":"1.2.0","purl":"pkg:npm/%40emotion/use-insertion-effect-with-fallbacks@1.2.0"},{"type":"library","name":"@emotion/react","version":"11.14.0","purl":"pkg:npm/%40emotion/react@11.14.0"},{"type":"library","name":"@emotion/is-prop-valid","version":"1.4.0","purl":"pkg:npm/%40emotion/is-prop-valid@1.4.0"},{"type":"library","name":"@emotion/styled","version":"11.14.1","purl":"pkg:npm/%40emotion/styled@11.14.1"},{"type":"library","name":"@mui/styled-engine","version":"5.18.0","purl":"pkg:npm/%40mui/styled-engine@5.18.0"},{"type":"library","name":"@mui/system","version":"5.18.0","purl":"pkg:npm/%40mui/system@5.18.0"},{"type":"library","name":"clsx","version":"2.1.1","purl":"pkg:npm/clsx@2.1.1"},{"type":"library","name":"@mui/private-theming","version":"5.17.1","purl":"pkg:npm/%40mui/private-theming@5.17.1"},{"type":"library","name":"@mui/base","version":"5.0.0-beta.40-1","purl":"pkg:npm/%40mui/base@5.0.0-beta.40-1"},{"type":"library","name":"@popperjs/core","version":"2.11.8","purl":"pkg:npm/%40popperjs/core@2.11.8"},{"type":"library","name":"use-sync-external-store","version":"1.6.0","purl":"pkg:npm/use-sync-external-store@1.6.0"},{"type":"library","name":"dequal","version":"2.0.3","purl":"pkg:npm/dequal@2.0.3"},{"type":"library","name":"swr","version":"2.5.1","purl":"pkg:npm/swr@2.5.1"},{"type":"library","name":"react-hook-form","version":"7.91.0","purl":"pkg:npm/react-hook-form@7.91.0"},{"type":"library","name":"@cyberismo/model","version":"1.3.1","purl":"pkg:npm/%40cyberismo/model@1.3.1"},{"type":"library","name":"redux","version":"5.0.1","purl":"pkg:npm/redux@5.0.1"},{"type":"library","name":"immer","version":"11.1.8","purl":"pkg:npm/immer@11.1.8"},{"type":"library","name":"redux-thunk","version":"3.1.0","purl":"pkg:npm/redux-thunk@3.1.0"},{"type":"library","name":"@reduxjs/toolkit","version":"2.13.0","purl":"pkg:npm/%40reduxjs/toolkit@2.13.0"},{"type":"library","name":"@lezer/common","version":"1.5.2","purl":"pkg:npm/%40lezer/common@1.5.2"},{"type":"library","name":"@lezer/highlight","version":"1.2.3","purl":"pkg:npm/%40lezer/highlight@1.2.3"},{"type":"library","name":"@marijn/find-cluster-break","version":"1.0.3","purl":"pkg:npm/%40marijn/find-cluster-break@1.0.3"},{"type":"library","name":"@codemirror/state","version":"6.7.6","purl":"pkg:npm/%40codemirror/state@6.7.6"},{"type":"library","name":"style-mod","version":"4.1.3","purl":"pkg:npm/style-mod@4.1.3"},{"type":"library","name":"w3c-keyname","version":"2.2.8","purl":"pkg:npm/w3c-keyname@2.2.8"},{"type":"library","name":"crelt","version":"1.0.7","purl":"pkg:npm/crelt@1.0.7"},{"type":"library","name":"@codemirror/view","version":"6.43.15","purl":"pkg:npm/%40codemirror/view@6.43.15"},{"type":"library","name":"@codemirror/streamparser","version":"6.0.0","purl":"pkg:npm/%40codemirror/streamparser@6.0.0"},{"type":"library","name":"@codemirror/language","version":"6.13.1","purl":"pkg:npm/%40codemirror/language@6.13.1"},{"type":"library","name":"@uiw/codemirror-themes","version":"4.25.12","purl":"pkg:npm/%40uiw/codemirror-themes@4.25.12"},{"type":"library","name":"@uiw/codemirror-theme-vscode","version":"4.25.12","purl":"pkg:npm/%40uiw/codemirror-theme-vscode@4.25.12"},{"type":"library","name":"@uiw/codemirror-theme-github","version":"4.25.12","purl":"pkg:npm/%40uiw/codemirror-theme-github@4.25.12"},{"type":"library","name":"redux-persist","version":"6.0.0","purl":"pkg:npm/redux-persist@6.0.0"},{"type":"library","name":"@mui/material","version":"9.5.0","purl":"pkg:npm/%40mui/material@9.5.0"},{"type":"library","name":"react-redux","version":"9.3.1","purl":"pkg:npm/react-redux@9.3.1"},{"type":"library","name":"i18next","version":"26.5.12","purl":"pkg:npm/i18next@26.5.12"},{"type":"library","name":"html-parse-stringify","version":"4.0.1","purl":"pkg:npm/html-parse-stringify@4.0.1"},{"type":"library","name":"react-i18next","version":"17.1.9","purl":"pkg:npm/react-i18next@17.1.9"},{"type":"library","name":"@mui/icons-material","version":"9.5.0","purl":"pkg:npm/%40mui/icons-material@9.5.0"},{"type":"library","name":"@asciidoctor/core","version":"4.1.1","purl":"pkg:npm/%40asciidoctor/core@4.1.1"},{"type":"library","name":"date-fns","version":"4.4.0","purl":"pkg:npm/date-fns@4.4.0"},{"type":"library","name":"react-dnd","version":"16.0.1","purl":"pkg:npm/react-dnd@16.0.1"},{"type":"library","name":"@react-dnd/invariant","version":"4.0.2","purl":"pkg:npm/%40react-dnd/invariant@4.0.2"},{"type":"library","name":"dnd-core","version":"16.0.1","purl":"pkg:npm/dnd-core@16.0.1"},{"type":"library","name":"@react-dnd/asap","version":"5.0.2","purl":"pkg:npm/%40react-dnd/asap@5.0.2"},{"type":"library","name":"fast-deep-equal","version":"3.1.3","purl":"pkg:npm/fast-deep-equal@3.1.3"},{"type":"library","name":"@react-dnd/shallowequal","version":"4.0.2","purl":"pkg:npm/%40react-dnd/shallowequal@4.0.2"},{"type":"library","name":"react-arborist","version":"4.0.1","purl":"pkg:npm/react-arborist@4.0.1"},{"type":"library","name":"memoize-one","version":"5.2.1","purl":"pkg:npm/memoize-one@5.2.1"},{"type":"library","name":"react-window","version":"1.8.11","purl":"pkg:npm/react-window@1.8.11"},{"type":"library","name":"react-dnd-html5-backend","version":"16.0.1","purl":"pkg:npm/react-dnd-html5-backend@16.0.1"},{"type":"library","name":"semver","version":"7.8.5","purl":"pkg:npm/semver@7.8.5"},{"type":"library","name":"react-resizable-panels","version":"4.15.2","purl":"pkg:npm/react-resizable-panels@4.15.2"},{"type":"library","name":"node-html-parser","version":"9.0.6","purl":"pkg:npm/node-html-parser@9.0.6"},{"type":"library","name":"html-dom-parser","version":"8.0.2","purl":"pkg:npm/html-dom-parser@8.0.2"},{"type":"library","name":"react-property","version":"2.0.2","purl":"pkg:npm/react-property@2.0.2"},{"type":"library","name":"inline-style-parser","version":"0.2.9","purl":"pkg:npm/inline-style-parser@0.2.9"},{"type":"library","name":"style-to-object","version":"2.0.2","purl":"pkg:npm/style-to-object@2.0.2"},{"type":"library","name":"style-to-js","version":"2.0.2","purl":"pkg:npm/style-to-js@2.0.2"},{"type":"library","name":"html-react-parser","version":"6.1.9","purl":"pkg:npm/html-react-parser@6.1.9"},{"type":"library","name":"domelementtype","version":"3.0.0","purl":"pkg:npm/domelementtype@3.0.0"},{"type":"library","name":"domhandler","version":"6.0.1","purl":"pkg:npm/domhandler@6.0.1"},{"type":"library","name":"d3-array","version":"3.2.4","purl":"pkg:npm/d3-array@3.2.4"},{"type":"library","name":"internmap","version":"2.0.3","purl":"pkg:npm/internmap@2.0.3"},{"type":"library","name":"d3-color","version":"3.1.0","purl":"pkg:npm/d3-color@3.1.0"},{"type":"library","name":"d3-interpolate","version":"3.0.1","purl":"pkg:npm/d3-interpolate@3.0.1"},{"type":"library","name":"d3-timer","version":"3.0.1","purl":"pkg:npm/d3-timer@3.0.1"},{"type":"library","name":"d3-ease","version":"3.0.1","purl":"pkg:npm/d3-ease@3.0.1"},{"type":"library","name":"robust-predicates","version":"3.0.3","purl":"pkg:npm/robust-predicates@3.0.3"},{"type":"library","name":"delaunator","version":"5.1.0","purl":"pkg:npm/delaunator@5.1.0"},{"type":"library","name":"d3-delaunay","version":"6.0.4","purl":"pkg:npm/d3-delaunay@6.0.4"},{"type":"library","name":"d3-dsv","version":"3.0.1","purl":"pkg:npm/d3-dsv@3.0.1"},{"type":"library","name":"d3-force","version":"3.0.0","purl":"pkg:npm/d3-force@3.0.0"},{"type":"library","name":"d3-quadtree","version":"3.0.1","purl":"pkg:npm/d3-quadtree@3.0.1"},{"type":"library","name":"d3-geo","version":"3.1.1","purl":"pkg:npm/d3-geo@3.1.1"},{"type":"library","name":"d3-hierarchy","version":"3.1.2","purl":"pkg:npm/d3-hierarchy@3.1.2"},{"type":"library","name":"d3-scale","version":"4.0.2","purl":"pkg:npm/d3-scale@4.0.2"},{"type":"library","name":"d3-time","version":"3.1.0","purl":"pkg:npm/d3-time@3.1.0"},{"type":"library","name":"d3-time-format","version":"4.1.0","purl":"pkg:npm/d3-time-format@4.1.0"},{"type":"library","name":"d3-scale-chromatic","version":"3.1.0","purl":"pkg:npm/d3-scale-chromatic@3.1.0"},{"type":"library","name":"d3-shape","version":"3.2.0","purl":"pkg:npm/d3-shape@3.2.0"},{"type":"library","name":"mermaid","version":"12.2.0","purl":"pkg:npm/mermaid@12.2.0"},{"type":"library","name":"es-toolkit","version":"1.52.0","purl":"pkg:npm/es-toolkit@1.52.0"},{"type":"library","name":"json-stringify-pretty-compact","version":"4.0.0","purl":"pkg:npm/json-stringify-pretty-compact@4.0.0"},{"type":"library","name":"vega-util","version":"2.1.3","purl":"pkg:npm/vega-util@2.1.3"},{"type":"library","name":"topojson-client","version":"3.1.0","purl":"pkg:npm/topojson-client@3.1.0"},{"type":"library","name":"vega-time","version":"3.3.0","purl":"pkg:npm/vega-time@3.3.0"},{"type":"library","name":"vega-format","version":"2.1.3","purl":"pkg:npm/vega-format@2.1.3"},{"type":"library","name":"vega-loader","version":"5.1.3","purl":"pkg:npm/vega-loader@5.1.3"},{"type":"library","name":"vega-dataflow","version":"6.1.3","purl":"pkg:npm/vega-dataflow@6.1.3"},{"type":"library","name":"vega-statistics","version":"2.0.0","purl":"pkg:npm/vega-statistics@2.0.0"},{"type":"library","name":"vega-transforms","version":"5.2.2","purl":"pkg:npm/vega-transforms@5.2.2"},{"type":"library","name":"vega-canvas","version":"2.0.0","purl":"pkg:npm/vega-canvas@2.0.0"},{"type":"library","name":"vega-scale","version":"8.1.3","purl":"pkg:npm/vega-scale@8.1.3"},{"type":"library","name":"vega-scenegraph","version":"5.3.0","purl":"pkg:npm/vega-scenegraph@5.3.0"},{"type":"library","name":"vega-view-transforms","version":"5.2.2","purl":"pkg:npm/vega-view-transforms@5.2.2"},{"type":"library","name":"vega-encode","version":"5.2.2","purl":"pkg:npm/vega-encode@5.2.2"},{"type":"library","name":"d3-geo-projection","version":"4.0.0","purl":"pkg:npm/d3-geo-projection@4.0.0"},{"type":"library","name":"vega-projection","version":"2.1.3","purl":"pkg:npm/vega-projection@2.1.3"},{"type":"library","name":"vega-geo","version":"5.1.3","purl":"pkg:npm/vega-geo@5.1.3"},{"type":"library","name":"vega-force","version":"5.1.3","purl":"pkg:npm/vega-force@5.1.3"},{"type":"library","name":"vega-hierarchy","version":"5.1.3","purl":"pkg:npm/vega-hierarchy@5.1.3"},{"type":"library","name":"vega-label","version":"2.1.3","purl":"pkg:npm/vega-label@2.1.3"},{"type":"library","name":"vega-regression","version":"2.1.3","purl":"pkg:npm/vega-regression@2.1.3"},{"type":"library","name":"vega-voronoi","version":"5.1.3","purl":"pkg:npm/vega-voronoi@5.1.3"},{"type":"library","name":"vega-wordcloud","version":"5.1.3","purl":"pkg:npm/vega-wordcloud@5.1.3"},{"type":"library","name":"vega-crossfilter","version":"5.1.3","purl":"pkg:npm/vega-crossfilter@5.1.3"},{"type":"library","name":"vega-expression","version":"6.2.2","purl":"pkg:npm/vega-expression@6.2.2"},{"type":"library","name":"vega-selections","version":"6.1.5","purl":"pkg:npm/vega-selections@6.1.5"},{"type":"library","name":"vega-functions","version":"6.2.0","purl":"pkg:npm/vega-functions@6.2.0"},{"type":"library","name":"vega-runtime","version":"7.1.3","purl":"pkg:npm/vega-runtime@7.1.3"},{"type":"library","name":"vega-view","version":"6.2.0","purl":"pkg:npm/vega-view@6.2.0"},{"type":"library","name":"vega-event-selector","version":"4.0.0","purl":"pkg:npm/vega-event-selector@4.0.0"},{"type":"library","name":"vega-parser","version":"7.1.3","purl":"pkg:npm/vega-parser@7.1.3"},{"type":"library","name":"vega","version":"6.4.0","purl":"pkg:npm/vega@6.4.0"},{"type":"library","name":"vega-interpreter","version":"2.3.1","purl":"pkg:npm/vega-interpreter@2.3.1"},{"type":"library","name":"vega-lite","version":"6.5.0","purl":"pkg:npm/vega-lite@6.5.0"},{"type":"library","name":"vega-schema-url-parser","version":"3.0.2","purl":"pkg:npm/vega-schema-url-parser@3.0.2"},{"type":"library","name":"vega-themes","version":"3.0.0","purl":"pkg:npm/vega-themes@3.0.0"},{"type":"library","name":"vega-tooltip","version":"1.0.0","purl":"pkg:npm/vega-tooltip@1.0.0"},{"type":"library","name":"vega-embed","version":"7.1.0","purl":"pkg:npm/vega-embed@7.1.0"},{"type":"library","name":"react-vega","version":"8.0.0","purl":"pkg:npm/react-vega@8.0.0"},{"type":"library","name":"@codemirror/commands","version":"6.11.1","purl":"pkg:npm/%40codemirror/commands@6.11.1"},{"type":"library","name":"@codemirror/search","version":"6.7.0","purl":"pkg:npm/%40codemirror/search@6.7.0"},{"type":"library","name":"@codemirror/autocomplete","version":"6.20.2","purl":"pkg:npm/%40codemirror/autocomplete@6.20.2"},{"type":"library","name":"@codemirror/lint","version":"6.9.6","purl":"pkg:npm/%40codemirror/lint@6.9.6"},{"type":"library","name":"@uiw/codemirror-extensions-basic-setup","version":"4.25.12","purl":"pkg:npm/%40uiw/codemirror-extensions-basic-setup@4.25.12"},{"type":"library","name":"@codemirror/theme-one-dark","version":"6.1.3","purl":"pkg:npm/%40codemirror/theme-one-dark@6.1.3"},{"type":"library","name":"@uiw/react-codemirror","version":"4.25.12","purl":"pkg:npm/%40uiw/react-codemirror@4.25.12"},{"type":"library","name":"codemirror-asciidoc","version":"2.0.1","purl":"pkg:npm/codemirror-asciidoc@2.0.1"},{"type":"library","name":"marked","version":"18.1.2","purl":"pkg:npm/marked@18.1.2"},{"type":"library","name":"@hookform/resolvers","version":"6.0.2","purl":"pkg:npm/%40hookform/resolvers@6.0.2"},{"type":"library","name":"zod","version":"4.6.7","purl":"pkg:npm/zod@4.6.7"},{"type":"library","name":"khroma","version":"2.1.0","purl":"pkg:npm/khroma@2.1.0"},{"type":"library","name":"@upsetjs/venn.js","version":"2.0.0","purl":"pkg:npm/%40upsetjs/venn.js@2.0.0"},{"type":"library","name":"@chevrotain/utils","version":"13.2.0","purl":"pkg:npm/%40chevrotain/utils@13.2.0"},{"type":"library","name":"@chevrotain/gast","version":"13.2.0","purl":"pkg:npm/%40chevrotain/gast@13.2.0"},{"type":"library","name":"chevrotain","version":"13.2.0","purl":"pkg:npm/chevrotain@13.2.0"},{"type":"library","name":"@chevrotain/regexp-to-ast","version":"13.2.0","purl":"pkg:npm/%40chevrotain/regexp-to-ast@13.2.0"},{"type":"library","name":"d3-sankey","version":"0.12.3","purl":"pkg:npm/d3-sankey@0.12.3"},{"type":"library","name":"d3-path","version":"1.0.9","purl":"pkg:npm/d3-path@1.0.9"},{"type":"library","name":"uuid","version":"14.0.2","purl":"pkg:npm/uuid@14.0.2"},{"type":"library","name":"d3-axis","version":"3.0.0","purl":"pkg:npm/d3-axis@3.0.0"},{"type":"library","name":"dayjs","version":"1.11.23","purl":"pkg:npm/dayjs@1.11.23"},{"type":"library","name":"layout-base","version":"1.0.2","purl":"pkg:npm/layout-base@1.0.2"},{"type":"library","name":"cose-base","version":"1.0.3","purl":"pkg:npm/cose-base@1.0.3"},{"type":"library","name":"cytoscape-cose-bilkent","version":"4.1.0","purl":"pkg:npm/cytoscape-cose-bilkent@4.1.0"},{"type":"library","name":"lodash-es","version":"4.18.1","purl":"pkg:npm/lodash-es@4.18.1"},{"type":"library","name":"dagre-d3-es","version":"7.0.14","purl":"pkg:npm/dagre-d3-es@7.0.14"},{"type":"library","name":"elkjs","version":"0.9.3","purl":"pkg:npm/elkjs@0.9.3"},{"type":"library","name":"cytoscape-fcose","version":"2.2.0","purl":"pkg:npm/cytoscape-fcose@2.2.0"},{"type":"library","name":"katex","version":"0.18.10","purl":"pkg:npm/katex@0.18.10"},{"type":"library","name":"dompurify","version":"3.4.17","purl":"pkg:npm/dompurify@3.4.17"},{"type":"library","name":"d3-dispatch","version":"3.0.1","purl":"pkg:npm/d3-dispatch@3.0.1"},{"type":"library","name":"d3-selection","version":"3.0.0","purl":"pkg:npm/d3-selection@3.0.0"},{"type":"library","name":"d3-transition","version":"3.0.1","purl":"pkg:npm/d3-transition@3.0.1"},{"type":"library","name":"d3-brush","version":"3.0.0","purl":"pkg:npm/d3-brush@3.0.0"},{"type":"library","name":"d3-zoom","version":"3.0.0","purl":"pkg:npm/d3-zoom@3.0.0"},{"type":"library","name":"d3-format","version":"3.1.2","purl":"pkg:npm/d3-format@3.1.2"},{"type":"library","name":"@braintree/sanitize-url","version":"7.1.2","purl":"pkg:npm/%40braintree/sanitize-url@7.1.2"},{"type":"library","name":"@iconify/utils","version":"3.1.4","purl":"pkg:npm/%40iconify/utils@3.1.4"},{"type":"library","name":"ts-dedent","version":"2.3.0","purl":"pkg:npm/ts-dedent@2.3.0"},{"type":"library","name":"roughjs","version":"4.6.6","purl":"pkg:npm/roughjs@4.6.6"},{"type":"library","name":"@mermaid-js/parser","version":"2.0.1","purl":"pkg:npm/%40mermaid-js/parser@2.0.1"},{"type":"library","name":"cytoscape","version":"3.34.2","purl":"pkg:npm/cytoscape@3.34.2"}]}
package/dist/types.d.ts CHANGED
@@ -1,15 +1,3 @@
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 type { Context } from 'hono';
14
2
  export interface ResourceFileContentResponse {
15
3
  content: string;
package/dist/types.js CHANGED
@@ -1,15 +1,5 @@
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
- */
1
+ // SPDX-FileCopyrightText: Cyberismo Ltd and contributors
2
+ // SPDX-License-Identifier: AGPL-3.0-only
13
3
  /**
14
4
  * User roles - checked directly in middleware
15
5
  * Role hierarchy: Admin > Editor > Reader
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAiBF;;;;;;;;GAQG;AACH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,2BAAe,CAAA;IACf,6BAAiB,CAAA;IACjB,6BAAiB,CAAA;IACjB,mCAAuB,CAAA;AACzB,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,yCAAyC;AAiBzC;;;;;;;;GAQG;AACH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,2BAAe,CAAA;IACf,6BAAiB,CAAA;IACjB,6BAAiB,CAAA;IACjB,mCAAuB,CAAA;AACzB,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB"}
package/dist/utils.d.ts CHANGED
@@ -1,14 +1,21 @@
1
+ import { serve, type ServerType } from '@hono/node-server';
1
2
  /**
2
3
  * The relative path to the static frontend directory.
3
4
  */
4
5
  export declare const staticFrontendDirRelative: string;
5
6
  /**
6
- * Finds a free port.
7
- * @param port - The port to start looking for.
8
- * @param maxAttempts - The maximum number of attempts to find a free port.
9
- * @returns The free port.
7
+ * Starts the server, moving to the next port while the current one is taken.
8
+ * The bind itself is the check, so a port can't be taken between check and use.
9
+ * @param fetch - Request handler.
10
+ * @param port - The first port to try.
11
+ * @param host - The host to bind.
12
+ * @param maxPort - The last port to try; defaults to `port` (no retry).
13
+ * @returns The listening server and the port it bound.
10
14
  */
11
- export declare function findFreePort(minPort: number, maxPort: number): Promise<number>;
15
+ export declare function listen(fetch: Parameters<typeof serve>[0]['fetch'], port: number, host: string, maxPort?: number): Promise<{
16
+ server: ServerType;
17
+ port: number;
18
+ }>;
12
19
  export declare function gitOptionsFromEnv(): {
13
20
  autocommit: boolean;
14
21
  autopush: boolean;
package/dist/utils.js CHANGED
@@ -1,57 +1,32 @@
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
- */
1
+ // SPDX-FileCopyrightText: Cyberismo Ltd and contributors
2
+ // SPDX-License-Identifier: AGPL-3.0-only
13
3
  import path from 'node:path';
14
- import { createServer } from 'node:net';
4
+ import { serve } from '@hono/node-server';
15
5
  /**
16
6
  * The relative path to the static frontend directory.
17
7
  */
18
8
  export const staticFrontendDirRelative = path.relative(process.cwd(), path.resolve(import.meta.dirname, 'public'));
19
9
  /**
20
- * Finds a free port.
21
- * @param port - The port to start looking for.
22
- * @param maxAttempts - The maximum number of attempts to find a free port.
23
- * @returns The free port.
10
+ * Starts the server, moving to the next port while the current one is taken.
11
+ * The bind itself is the check, so a port can't be taken between check and use.
12
+ * @param fetch - Request handler.
13
+ * @param port - The first port to try.
14
+ * @param host - The host to bind.
15
+ * @param maxPort - The last port to try; defaults to `port` (no retry).
16
+ * @returns The listening server and the port it bound.
24
17
  */
25
- export async function findFreePort(minPort, maxPort) {
26
- for (let i = minPort; i < maxPort; i++) {
27
- try {
28
- await testPort(i);
29
- return i;
30
- }
31
- catch (err) {
32
- if (err instanceof Error && err.message.includes('EADDRINUSE')) {
33
- console.log(`Port ${i} is already in use, trying next port...`);
18
+ export function listen(fetch, port, host, maxPort = port) {
19
+ return new Promise((resolve, reject) => {
20
+ const server = serve({ fetch, port, hostname: host }, (info) => resolve({ server, port: info.port }));
21
+ server.once('error', (err) => {
22
+ if (err.code === 'EADDRINUSE' && port < maxPort) {
23
+ console.log(`Port ${port} is already in use, trying next port...`);
24
+ resolve(listen(fetch, port + 1, host, maxPort));
34
25
  }
35
26
  else {
36
- throw err;
27
+ reject(err);
37
28
  }
38
- }
39
- }
40
- throw new Error('Failed to find free port');
41
- }
42
- function testPort(port) {
43
- return new Promise((resolve, reject) => {
44
- const server = createServer();
45
- server.listen(port, () => {
46
- server.close();
47
- resolve(true);
48
- });
49
- server.on('error', (err) => {
50
- reject(err);
51
29
  });
52
- setTimeout(() => {
53
- reject(new Error('Timed out waiting for port to be free'));
54
- }, 2000);
55
30
  });
56
31
  }
57
32
  export function gitOptionsFromEnv() {
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AACF,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC,QAAQ,CACpD,OAAO,CAAC,GAAG,EAAE,EACb,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAC5C,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,OAAe;IAEf,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;YAClB,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACvB,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QACH,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAC7D,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB;IAI/B,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM;QACvD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM;KACpD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,yCAAyC;AAEzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAmB,MAAM,mBAAmB,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC,QAAQ,CACpD,OAAO,CAAC,GAAG,EAAE,EACb,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAC5C,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CACpB,KAA2C,EAC3C,IAAY,EACZ,IAAY,EACZ,UAAkB,IAAI;IAEtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7D,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CACrC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAClD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,yCAAyC,CAAC,CAAC;gBACnE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB;IAI/B,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM;QACvD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM;KACpD,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@cyberismo/backend",
3
- "version": "1.2.0",
3
+ "version": "1.3.1",
4
4
  "description": "Express backend for Cyberismo",
5
5
  "main": "dist/index.js",
6
6
  "keywords": [],
7
7
  "author": "sami.merila@cyberismo.com",
8
- "license": "AGPL-3.0",
8
+ "license": "AGPL-3.0-only",
9
9
  "homepage": "https://github.com/CyberismoCom/cyberismo",
10
10
  "repository": {
11
11
  "type": "git",
@@ -16,19 +16,20 @@
16
16
  "node": ">=22"
17
17
  },
18
18
  "dependencies": {
19
- "@cyberismo/assets": "1.2.0",
20
- "@cyberismo/data-handler": "1.2.0",
21
- "@cyberismo/mcp": "1.2.0",
22
- "@hono/mcp": "^0.3.2",
23
- "@hono/node-server": "^2.1.1",
19
+ "@cyberismo/assets": "1.3.1",
20
+ "@cyberismo/data-handler": "1.3.1",
21
+ "@cyberismo/mcp": "1.3.1",
22
+ "@cyberismo/model": "1.3.1",
23
+ "@hono/mcp": "^0.3.5",
24
+ "@hono/node-server": "^2.1.5",
24
25
  "@hono/zod-validator": "^0.9.1",
25
- "@modelcontextprotocol/sdk": "^1.30.1",
26
+ "@modelcontextprotocol/sdk": "^1.32.2",
26
27
  "@types/mime-types": "^3.0.1",
27
- "dotenv": "^18.0.4",
28
- "hono": "^4.13.10",
29
- "jose": "^6.2.12",
28
+ "dotenv": "^18.0.9",
29
+ "hono": "^4.13.14",
30
+ "jose": "^6.2.14",
30
31
  "mime-types": "^3.0.2",
31
- "zod": "^4.6.5"
32
+ "zod": "^4.6.7"
32
33
  },
33
34
  "devDependencies": {
34
35
  "@cyberismo/app": "0.0.2"
package/src/app.ts CHANGED
@@ -1,19 +1,11 @@
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
- */
1
+ // SPDX-FileCopyrightText: Cyberismo Ltd and contributors
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+
13
4
  import { Hono, type MiddlewareHandler } from 'hono';
14
- import { gitOptionsFromEnv, staticFrontendDirRelative } from './utils.js';
15
- import { serveStatic } from '@hono/node-server/serve-static';
16
- import { attachProjectRegistry } from './middleware/commandManager.js';
5
+ import { staticFrontendDirRelative } from './utils.js';
6
+ import { frontendFallback, serveFrontend } from './frontend.js';
7
+ import { attachProjectDirectory } from './middleware/commandManager.js';
8
+ import { errorResponse } from './common/errors.js';
17
9
  import calculationsRouter from './domain/calculations/index.js';
18
10
  import cardsRouter from './domain/cards/index.js';
19
11
  import cardTypesRouter from './domain/cardTypes/index.js';
@@ -45,8 +37,8 @@ import { createAuthRouter } from './domain/auth/index.js';
45
37
  import { createAuthMiddleware } from './middleware/auth.js';
46
38
  import type { AuthProvider } from './auth/types.js';
47
39
  import { MockAuthProvider } from './auth/mock.js';
48
- import type { ProjectRegistry } from './project-registry.js';
49
- import { CommandManager, scanForProjects } from '@cyberismo/data-handler';
40
+ import type { ProjectDirectory } from '@cyberismo/data-handler';
41
+ import { EventsByProject } from './domain/events/events-by-project.js';
50
42
  import { createProjectsRouter } from './domain/projects/index.js';
51
43
  import { simpleMcpAuthRouter } from '@hono/mcp';
52
44
 
@@ -82,16 +74,20 @@ function createProjectScopedRoutes(
82
74
  /**
83
75
  * Create the Hono app for the backend
84
76
  * @param authProvider - Authentication provider
85
- * @param registry - ProjectRegistry holding all project CommandManagers
77
+ * @param directory - Directory the projects are opened from
78
+ * @param exportPrefixes - The projects a static export serves; set only in
79
+ * export mode
86
80
  */
87
81
  export function createApp(
88
82
  authProvider: AuthProvider,
89
- registry: ProjectRegistry,
83
+ directory: ProjectDirectory,
90
84
  opts?: TreeOptions,
91
- exportMode = false,
85
+ exportPrefixes?: string[],
92
86
  multiProjectRoot?: string,
93
87
  ) {
94
88
  const app = new Hono<{ Variables: AppVars }>();
89
+ const exportMode = exportPrefixes !== undefined;
90
+ const events = new EventsByProject(directory);
95
91
 
96
92
  // Public — no auth middleware (MCP clients call this before they have a token)
97
93
  // RFC 9728 resource metadata & OAuth authorization server metadata via @hono/mcp
@@ -130,12 +126,12 @@ export function createApp(
130
126
  app.use('/mcp', createAuthMiddleware(authProvider));
131
127
  app.use('/mcp/*', createAuthMiddleware(authProvider));
132
128
 
133
- // Global routes (no project-specific CommandManager needed)
129
+ // Global routes (no project handle needed)
134
130
  app.route('/api/auth', createAuthRouter());
135
- app.route('/api/projects', createProjectsRouter(registry, multiProjectRoot));
131
+ app.route('/api/projects', createProjectsRouter(directory, multiProjectRoot));
136
132
 
137
133
  // Test-mode reset endpoint: wipes the project dir, restores it from the
138
- // golden snapshot, and rebuilds the registry in place. Used by the
134
+ // golden snapshot, and reopens its projects in place. Used by the
139
135
  // Playwright e2e harness to restore the project between spec files.
140
136
  // Gated by NODE_ENV so it never ships in production.
141
137
  if (process.env.NODE_ENV === 'test') {
@@ -175,7 +171,7 @@ export function createApp(
175
171
  retryDelay: 100,
176
172
  });
177
173
  await fs.cp(goldenPath, resolvedProject, { recursive: true });
178
- const projects = await scanForProjects(resolvedProject);
174
+ const projects = await directory.list();
179
175
 
180
176
  if (projects.length === 0) {
181
177
  return c.json(
@@ -185,13 +181,10 @@ export function createApp(
185
181
  500,
186
182
  );
187
183
  }
188
- const entries = [];
189
184
  for (const project of projects) {
190
- const commands = new CommandManager(project.path, gitOptionsFromEnv());
191
- await commands.initialize();
192
- entries.push({ prefix: project.prefix, commands });
185
+ await directory.replace(project.prefix);
186
+ events.drop(project.prefix);
193
187
  }
194
- await registry.replace(entries);
195
188
  return c.body(null, 204);
196
189
  });
197
190
  }
@@ -209,30 +202,27 @@ export function createApp(
209
202
  }
210
203
  });
211
204
 
212
- if (exportMode) {
205
+ if (exportPrefixes) {
213
206
  // Export mode: mount at each concrete prefix so SSG sees
214
207
  // static routes instead of dynamic :prefix patterns it would skip.
215
- for (const { prefix } of registry.list()) {
208
+ for (const prefix of exportPrefixes) {
216
209
  const scoped = createProjectScopedRoutes(
217
- attachProjectRegistry(registry, prefix),
210
+ attachProjectDirectory(directory, events, prefix),
218
211
  );
219
212
  app.route(`/api/projects/${prefix}`, scoped);
220
213
  }
221
214
  } else {
222
215
  // Normal mode: dynamic :prefix param
223
- const scoped = createProjectScopedRoutes(attachProjectRegistry(registry));
216
+ const scoped = createProjectScopedRoutes(
217
+ attachProjectDirectory(directory, events),
218
+ );
224
219
  app.route('/api/projects/:prefix', scoped);
225
220
  }
226
221
 
227
222
  // MCP endpoint for AI assistant integration
228
- app.route('/mcp', createMcpRouter(writableProjects(registry)));
223
+ app.route('/mcp', createMcpRouter(writableProjects(directory)));
229
224
 
230
- app.use(
231
- '*',
232
- serveStatic({
233
- root: staticFrontendDirRelative,
234
- }),
235
- );
225
+ app.use('*', serveFrontend(staticFrontendDirRelative));
236
226
 
237
227
  // serve index.html for all other routes
238
228
  app.notFound(async (c) => {
@@ -242,24 +232,19 @@ export function createApp(
242
232
  ) {
243
233
  return c.text('Not Found', 404);
244
234
  }
245
- const file = await readFile(
235
+ return frontendFallback(
236
+ c,
246
237
  path.join(import.meta.dirname, 'public', 'index.html'),
247
238
  );
248
- return c.html(file.toString());
249
239
  });
250
240
  // Error handling
241
+ // Only server faults are logged; client errors are answered, not logged.
251
242
  app.onError((err, c) => {
252
- if (!isSSGContext(c)) {
253
- if (process.env.NODE_ENV !== 'test') {
254
- console.error(err.stack);
255
- }
243
+ const { status, body } = errorResponse(err);
244
+ if (status >= 500 && !isSSGContext(c) && process.env.NODE_ENV !== 'test') {
245
+ console.error(err.stack);
256
246
  }
257
- return c.json(
258
- {
259
- error: err.message || 'Internal Server Error',
260
- },
261
- 500,
262
- );
247
+ return c.json(body, status);
263
248
  });
264
249
 
265
250
  return app;
package/src/auth/index.ts CHANGED
@@ -1,15 +1,5 @@
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
- */
1
+ // SPDX-FileCopyrightText: Cyberismo Ltd and contributors
2
+ // SPDX-License-Identifier: AGPL-3.0-only
13
3
 
14
4
  export type { AuthProvider } from './types.js';
15
5
  export { MockAuthProvider } from './mock.js';
@@ -1,15 +1,5 @@
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
- */
1
+ // SPDX-FileCopyrightText: Cyberismo Ltd and contributors
2
+ // SPDX-License-Identifier: AGPL-3.0-only
13
3
 
14
4
  import { createRemoteJWKSet, jwtVerify } from 'jose';
15
5
  import type { JWTPayload } from 'jose';
package/src/auth/mock.ts CHANGED
@@ -1,15 +1,5 @@
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
- */
1
+ // SPDX-FileCopyrightText: Cyberismo Ltd and contributors
2
+ // SPDX-License-Identifier: AGPL-3.0-only
13
3
 
14
4
  import type { Context, MiddlewareHandler } from 'hono';
15
5
  import { setCookie } from 'hono/cookie';
package/src/auth/types.ts CHANGED
@@ -1,15 +1,5 @@
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
- */
1
+ // SPDX-FileCopyrightText: Cyberismo Ltd and contributors
2
+ // SPDX-License-Identifier: AGPL-3.0-only
13
3
 
14
4
  import type { UserInfo } from '../types.js';
15
5