@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.
Files changed (510) hide show
  1. package/README.md +21 -0
  2. package/dist/app.d.ts +5 -15
  3. package/dist/app.js +46 -44
  4. package/dist/app.js.map +1 -1
  5. package/dist/auth/index.d.ts +1 -13
  6. package/dist/auth/index.js +3 -13
  7. package/dist/auth/index.js.map +1 -1
  8. package/dist/auth/keycloak.d.ts +2 -15
  9. package/dist/auth/keycloak.js +8 -12
  10. package/dist/auth/keycloak.js.map +1 -1
  11. package/dist/auth/mock.d.ts +12 -20
  12. package/dist/auth/mock.js +121 -43
  13. package/dist/auth/mock.js.map +1 -1
  14. package/dist/auth/types.d.ts +7 -13
  15. package/dist/auth/types.js +2 -12
  16. package/dist/auth/types.js.map +1 -1
  17. package/dist/common/errors.d.ts +12 -0
  18. package/dist/common/errors.js +31 -0
  19. package/dist/common/errors.js.map +1 -0
  20. package/dist/common/validationSchemas.d.ts +0 -12
  21. package/dist/common/validationSchemas.js +2 -12
  22. package/dist/common/validationSchemas.js.map +1 -1
  23. package/dist/domain/auth/index.d.ts +0 -12
  24. package/dist/domain/auth/index.js +2 -12
  25. package/dist/domain/auth/index.js.map +1 -1
  26. package/dist/domain/calculations/index.d.ts +0 -12
  27. package/dist/domain/calculations/index.js +4 -14
  28. package/dist/domain/calculations/index.js.map +1 -1
  29. package/dist/domain/calculations/schema.d.ts +0 -12
  30. package/dist/domain/calculations/schema.js +2 -12
  31. package/dist/domain/calculations/schema.js.map +1 -1
  32. package/dist/domain/calculations/service.d.ts +2 -14
  33. package/dist/domain/calculations/service.js +7 -17
  34. package/dist/domain/calculations/service.js.map +1 -1
  35. package/dist/domain/cardTypes/index.d.ts +0 -12
  36. package/dist/domain/cardTypes/index.js +10 -20
  37. package/dist/domain/cardTypes/index.js.map +1 -1
  38. package/dist/domain/cardTypes/schema.d.ts +0 -12
  39. package/dist/domain/cardTypes/schema.js +2 -12
  40. package/dist/domain/cardTypes/schema.js.map +1 -1
  41. package/dist/domain/cardTypes/service.d.ts +4 -16
  42. package/dist/domain/cardTypes/service.js +17 -25
  43. package/dist/domain/cardTypes/service.js.map +1 -1
  44. package/dist/domain/cards/index.d.ts +0 -12
  45. package/dist/domain/cards/index.js +120 -175
  46. package/dist/domain/cards/index.js.map +1 -1
  47. package/dist/domain/cards/lib.d.ts +6 -23
  48. package/dist/domain/cards/lib.js +7 -135
  49. package/dist/domain/cards/lib.js.map +1 -1
  50. package/dist/domain/cards/mermaid.d.ts +8 -0
  51. package/dist/domain/cards/mermaid.js +23 -0
  52. package/dist/domain/cards/mermaid.js.map +1 -0
  53. package/dist/domain/cards/schema.d.ts +6 -12
  54. package/dist/domain/cards/schema.js +15 -15
  55. package/dist/domain/cards/schema.js.map +1 -1
  56. package/dist/domain/cards/service.d.ts +29 -36
  57. package/dist/domain/cards/service.js +119 -90
  58. package/dist/domain/cards/service.js.map +1 -1
  59. package/dist/domain/connectors/index.d.ts +0 -12
  60. package/dist/domain/connectors/index.js +4 -14
  61. package/dist/domain/connectors/index.js.map +1 -1
  62. package/dist/domain/connectors/service.d.ts +2 -14
  63. package/dist/domain/connectors/service.js +4 -14
  64. package/dist/domain/connectors/service.js.map +1 -1
  65. package/dist/domain/events/events-by-project.d.ts +19 -0
  66. package/dist/domain/events/events-by-project.js +57 -0
  67. package/dist/domain/events/events-by-project.js.map +1 -0
  68. package/dist/domain/events/index.d.ts +3 -0
  69. package/dist/domain/events/index.js +84 -0
  70. package/dist/domain/events/index.js.map +1 -0
  71. package/dist/domain/events/lifetime.d.ts +2 -0
  72. package/dist/domain/events/lifetime.js +15 -0
  73. package/dist/domain/events/lifetime.js.map +1 -0
  74. package/dist/domain/events/project-events.d.ts +63 -0
  75. package/dist/domain/events/project-events.js +204 -0
  76. package/dist/domain/events/project-events.js.map +1 -0
  77. package/dist/domain/events/schema.d.ts +10 -0
  78. package/dist/domain/events/schema.js +10 -0
  79. package/dist/domain/events/schema.js.map +1 -0
  80. package/dist/domain/fieldTypes/index.d.ts +0 -12
  81. package/dist/domain/fieldTypes/index.js +6 -16
  82. package/dist/domain/fieldTypes/index.js.map +1 -1
  83. package/dist/domain/fieldTypes/schema.d.ts +0 -12
  84. package/dist/domain/fieldTypes/schema.js +2 -12
  85. package/dist/domain/fieldTypes/schema.js.map +1 -1
  86. package/dist/domain/fieldTypes/service.d.ts +4 -16
  87. package/dist/domain/fieldTypes/service.js +7 -17
  88. package/dist/domain/fieldTypes/service.js.map +1 -1
  89. package/dist/domain/graphModels/index.d.ts +0 -12
  90. package/dist/domain/graphModels/index.js +4 -14
  91. package/dist/domain/graphModels/index.js.map +1 -1
  92. package/dist/domain/graphModels/schema.d.ts +0 -12
  93. package/dist/domain/graphModels/schema.js +2 -12
  94. package/dist/domain/graphModels/schema.js.map +1 -1
  95. package/dist/domain/graphModels/service.d.ts +2 -14
  96. package/dist/domain/graphModels/service.js +4 -14
  97. package/dist/domain/graphModels/service.js.map +1 -1
  98. package/dist/domain/graphViews/index.d.ts +0 -12
  99. package/dist/domain/graphViews/index.js +4 -14
  100. package/dist/domain/graphViews/index.js.map +1 -1
  101. package/dist/domain/graphViews/schema.js +2 -0
  102. package/dist/domain/graphViews/schema.js.map +1 -1
  103. package/dist/domain/graphViews/service.d.ts +2 -14
  104. package/dist/domain/graphViews/service.js +4 -14
  105. package/dist/domain/graphViews/service.js.map +1 -1
  106. package/dist/domain/labels/index.d.ts +0 -12
  107. package/dist/domain/labels/index.js +4 -14
  108. package/dist/domain/labels/index.js.map +1 -1
  109. package/dist/domain/labels/service.d.ts +3 -15
  110. package/dist/domain/labels/service.js +5 -15
  111. package/dist/domain/labels/service.js.map +1 -1
  112. package/dist/domain/linkTypes/index.d.ts +0 -12
  113. package/dist/domain/linkTypes/index.js +6 -16
  114. package/dist/domain/linkTypes/index.js.map +1 -1
  115. package/dist/domain/linkTypes/schema.d.ts +0 -12
  116. package/dist/domain/linkTypes/schema.js +2 -12
  117. package/dist/domain/linkTypes/schema.js.map +1 -1
  118. package/dist/domain/linkTypes/service.d.ts +3 -15
  119. package/dist/domain/linkTypes/service.js +7 -17
  120. package/dist/domain/linkTypes/service.js.map +1 -1
  121. package/dist/domain/logicPrograms/index.d.ts +0 -12
  122. package/dist/domain/logicPrograms/index.js +4 -14
  123. package/dist/domain/logicPrograms/index.js.map +1 -1
  124. package/dist/domain/logicPrograms/service.d.ts +2 -14
  125. package/dist/domain/logicPrograms/service.js +5 -3
  126. package/dist/domain/logicPrograms/service.js.map +1 -1
  127. package/dist/domain/mcp/index.d.ts +3 -15
  128. package/dist/domain/mcp/index.js +27 -21
  129. package/dist/domain/mcp/index.js.map +1 -1
  130. package/dist/domain/project/index.d.ts +0 -12
  131. package/dist/domain/project/index.js +41 -39
  132. package/dist/domain/project/index.js.map +1 -1
  133. package/dist/domain/project/schema.d.ts +8 -12
  134. package/dist/domain/project/schema.js +36 -18
  135. package/dist/domain/project/schema.js.map +1 -1
  136. package/dist/domain/project/service.d.ts +20 -28
  137. package/dist/domain/project/service.js +56 -60
  138. package/dist/domain/project/service.js.map +1 -1
  139. package/dist/domain/projects/index.d.ts +2 -14
  140. package/dist/domain/projects/index.js +23 -36
  141. package/dist/domain/projects/index.js.map +1 -1
  142. package/dist/domain/projects/schema.d.ts +1 -12
  143. package/dist/domain/projects/schema.js +3 -12
  144. package/dist/domain/projects/schema.js.map +1 -1
  145. package/dist/domain/projects/service.d.ts +9 -35
  146. package/dist/domain/projects/service.js +12 -48
  147. package/dist/domain/projects/service.js.map +1 -1
  148. package/dist/domain/reports/index.d.ts +0 -12
  149. package/dist/domain/reports/index.js +4 -14
  150. package/dist/domain/reports/index.js.map +1 -1
  151. package/dist/domain/reports/schema.d.ts +0 -12
  152. package/dist/domain/reports/schema.js +2 -12
  153. package/dist/domain/reports/schema.js.map +1 -1
  154. package/dist/domain/reports/service.d.ts +2 -14
  155. package/dist/domain/reports/service.js +4 -14
  156. package/dist/domain/reports/service.js.map +1 -1
  157. package/dist/domain/resources/index.d.ts +0 -12
  158. package/dist/domain/resources/index.js +91 -26
  159. package/dist/domain/resources/index.js.map +1 -1
  160. package/dist/domain/resources/schema.d.ts +8 -2
  161. package/dist/domain/resources/schema.js +8 -1
  162. package/dist/domain/resources/schema.js.map +1 -1
  163. package/dist/domain/resources/service.d.ts +23 -23
  164. package/dist/domain/resources/service.js +83 -51
  165. package/dist/domain/resources/service.js.map +1 -1
  166. package/dist/domain/skills/index.d.ts +3 -0
  167. package/dist/domain/skills/index.js +42 -0
  168. package/dist/domain/skills/index.js.map +1 -0
  169. package/dist/domain/skills/schema.d.ts +4 -0
  170. package/dist/domain/skills/schema.js +8 -0
  171. package/dist/domain/skills/schema.js.map +1 -0
  172. package/dist/domain/skills/service.d.ts +2 -0
  173. package/dist/domain/skills/service.js +6 -0
  174. package/dist/domain/skills/service.js.map +1 -0
  175. package/dist/domain/templates/index.d.ts +0 -12
  176. package/dist/domain/templates/index.js +8 -18
  177. package/dist/domain/templates/index.js.map +1 -1
  178. package/dist/domain/templates/schema.d.ts +0 -12
  179. package/dist/domain/templates/schema.js +2 -12
  180. package/dist/domain/templates/schema.js.map +1 -1
  181. package/dist/domain/templates/service.d.ts +4 -16
  182. package/dist/domain/templates/service.js +8 -18
  183. package/dist/domain/templates/service.js.map +1 -1
  184. package/dist/domain/tree/index.d.ts +0 -12
  185. package/dist/domain/tree/index.js +4 -14
  186. package/dist/domain/tree/index.js.map +1 -1
  187. package/dist/domain/tree/service.d.ts +3 -15
  188. package/dist/domain/tree/service.js +8 -15
  189. package/dist/domain/tree/service.js.map +1 -1
  190. package/dist/domain/workflows/index.d.ts +0 -12
  191. package/dist/domain/workflows/index.js +4 -14
  192. package/dist/domain/workflows/index.js.map +1 -1
  193. package/dist/domain/workflows/schema.d.ts +0 -12
  194. package/dist/domain/workflows/schema.js +2 -12
  195. package/dist/domain/workflows/schema.js.map +1 -1
  196. package/dist/domain/workflows/service.d.ts +2 -14
  197. package/dist/domain/workflows/service.js +4 -14
  198. package/dist/domain/workflows/service.js.map +1 -1
  199. package/dist/export.d.ts +8 -21
  200. package/dist/export.js +71 -66
  201. package/dist/export.js.map +1 -1
  202. package/dist/index.d.ts +3 -4
  203. package/dist/index.js +20 -41
  204. package/dist/index.js.map +1 -1
  205. package/dist/main.js +36 -32
  206. package/dist/main.js.map +1 -1
  207. package/dist/middleware/auth.d.ts +5 -12
  208. package/dist/middleware/auth.js +22 -16
  209. package/dist/middleware/auth.js.map +1 -1
  210. package/dist/middleware/commandManager.d.ts +17 -20
  211. package/dist/middleware/commandManager.js +27 -35
  212. package/dist/middleware/commandManager.js.map +1 -1
  213. package/dist/middleware/tree.js +2 -0
  214. package/dist/middleware/tree.js.map +1 -1
  215. package/dist/middleware/zvalidator.js +2 -0
  216. package/dist/middleware/zvalidator.js.map +1 -1
  217. package/dist/overlay.d.ts +33 -0
  218. package/dist/overlay.js +162 -0
  219. package/dist/overlay.js.map +1 -0
  220. package/dist/public/THIRD-PARTY.txt +1892 -688
  221. package/dist/public/assets/__vite-browser-external-DGgK3jMU.js +1 -0
  222. package/dist/public/assets/abnfDiagram-WEYOIA3C-B3qq7PKv.js +1 -0
  223. package/dist/public/assets/architecture-WOLXFQ4H-Bzau2LI0.js +1 -0
  224. package/dist/public/assets/architectureDiagram-ZHVYKT53-Bg0cUwdb.js +36 -0
  225. package/dist/public/assets/blockDiagram-RJAE7QA3-0RJB-ra-.js +140 -0
  226. package/dist/public/assets/c4Diagram-XDPPPE54-BzoQcLvf.js +38 -0
  227. package/dist/public/assets/channel-6BNdw4Ax.js +1 -0
  228. package/dist/public/assets/{chunk-MOJQB5TN-D1shKbMs.js → chunk-2E7WHVMD-6aqPk-Hk.js} +4 -4
  229. package/dist/public/assets/chunk-4EMNKR2T-vovNSAaE.js +1 -0
  230. package/dist/public/assets/chunk-55XCU76K-DXkKnt2y.js +1 -0
  231. package/dist/public/assets/chunk-7S6XSTFO-B9bfO0l3.js +2 -0
  232. package/dist/public/assets/chunk-AQDTSKZB-ilLy_cYP.js +72 -0
  233. package/dist/public/assets/chunk-DSNLSHJZ-DAudglXu.js +129 -0
  234. package/dist/public/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
  235. package/dist/public/assets/chunk-HAGFOTED-CSKFgs6b.js +62 -0
  236. package/dist/public/assets/chunk-HNE4Q36P-Cu5gPBVk.js +1 -0
  237. package/dist/public/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
  238. package/dist/public/assets/chunk-NGNAAXSQ-DI_UYJZ4.js +136 -0
  239. package/dist/public/assets/chunk-NQOKRVIF-Bpcvhq1n.js +213 -0
  240. package/dist/public/assets/chunk-UHW7PFBP-BDjvOaTH.js +1 -0
  241. package/dist/public/assets/chunk-VQ5W62QI-DHTcO93W.js +1 -0
  242. package/dist/public/assets/chunk-WQQL4CDK-H6nAhuck.js +10 -0
  243. package/dist/public/assets/chunk-XXDRQBXY-BUghdEVl.js +1 -0
  244. package/dist/public/assets/chunk-YZO67HFG-D13E0_Yh.js +1 -0
  245. package/dist/public/assets/chunk-ZAUX2LTX-Dp5y-2wt.js +1 -0
  246. package/dist/public/assets/chunk-ZCHMQSOR-RJjlln1D.js +2 -0
  247. package/dist/public/assets/classDiagram-v2-4MYWR3UA-CAqiFCSv.js +217 -0
  248. package/dist/public/assets/cose-bilkent-JH36ORCC-C_VOHzoP.js +1 -0
  249. package/dist/public/assets/cynefin-EF2NZ3EQ-Dyk4ZPjK.js +1 -0
  250. package/dist/public/assets/cynefinDiagram-WF24UDRP-b_Ia8gQX.js +62 -0
  251. package/dist/public/assets/cytoscape.esm-GRKmfDkD.js +321 -0
  252. package/dist/public/assets/dagre-NK4GIZVX-CH1K1yF8.js +4 -0
  253. package/dist/public/assets/diagram-CBK3MWTC-OaKd5avy.js +24 -0
  254. package/dist/public/assets/diagram-I5XIIV2D-Cmu5z1ad.js +24 -0
  255. package/dist/public/assets/diagram-ODIL2UCW-Cz1kkDDX.js +30 -0
  256. package/dist/public/assets/diagram-PFBEJUXE-faMkmqUW.js +3 -0
  257. package/dist/public/assets/diagram-RJA3I4VV-nycvfte-.js +41 -0
  258. package/dist/public/assets/diagram-TYUNFSNR-CjEv5QCm.js +200 -0
  259. package/dist/public/assets/dist-DGs_yUrP.js +1 -0
  260. package/dist/public/assets/ebnfDiagram-V4P3TTPT-DN-IIxCy.js +1 -0
  261. package/dist/public/assets/elk-QONTBCTQ-Bsam88GP.js +27 -0
  262. package/dist/public/assets/erDiagram-KYQIGQAA-DEU_qqNK.js +99 -0
  263. package/dist/public/assets/eventmodeling-K75KTNOO-Bl6NCM9E.js +1 -0
  264. package/dist/public/assets/flowDiagram-IUGLLWBU-Cl4qZ-36.js +1 -0
  265. package/dist/public/assets/ganttDiagram-R7GPNTJY-BmMd4aGi.js +292 -0
  266. package/dist/public/assets/gitGraph-VSP46ZUC-Q0H2PWek.js +1 -0
  267. package/dist/public/assets/gitGraphDiagram-PDYL7XHY-BlCTBYTj.js +106 -0
  268. package/dist/public/assets/index-CuBJ0hof.css +1 -0
  269. package/dist/public/assets/index-D6WqGtsG.js +27876 -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-FXEZZL3T-CiLpASIW.js → ishikawaDiagram-HPEHV2GE-_Y3Fr0hu.js} +6 -6
  274. package/dist/public/assets/journeyDiagram-BOSHW7O7-Bo55jJ4m.js +139 -0
  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/path-B_0haWDX.js +1 -0
  283. package/dist/public/assets/pegDiagram-ECIUJNBX-BEGI5k3m.js +1 -0
  284. package/dist/public/assets/pie-XZMESJXO-COyqzA3N.js +1 -0
  285. package/dist/public/assets/pieDiagram-GNMPY74T-CrLJhZJJ.js +39 -0
  286. package/dist/public/assets/{quadrantDiagram-ABIIQ3AL-B3czMbdS.js → quadrantDiagram-D57K4MC3-Fl7HMHxK.js} +6 -6
  287. package/dist/public/assets/radar-ABXABTNO-DeXHKowk.js +1 -0
  288. package/dist/public/assets/railroad-I3PHUGI6-CUjKUdPz.js +1 -0
  289. package/dist/public/assets/railroad-abnf-LNEFI6M7-B1aEgHE6.js +1 -0
  290. package/dist/public/assets/railroad-ebnf-DWYD2UWJ-DmmI3Voz.js +1 -0
  291. package/dist/public/assets/railroad-peg-JR7BVNR7-BHzi9m7r.js +1 -0
  292. package/dist/public/assets/railroadDiagram-Y72NRBL7-D1oeE5fy.js +1 -0
  293. package/dist/public/assets/requirementDiagram-EQYSW5RA-BJDKK1aS.js +84 -0
  294. package/dist/public/assets/rolldown-runtime-BCiCTKAo.js +1 -0
  295. package/dist/public/assets/{rough.esm-By172zw-.js → rough.esm-Dy-Kn_BL.js} +1 -1
  296. package/dist/public/assets/sankeyDiagram-SY24JHO5-C4g0OwZ9.js +40 -0
  297. package/dist/public/assets/sequenceDiagram-BLEHNHQU-CEvy4P-b.js +169 -0
  298. package/dist/public/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
  299. package/dist/public/assets/src-MPsEqXxq.js +1 -0
  300. package/dist/public/assets/stateDiagram-v2-A6IESKWZ-BFhvw4Gl.js +291 -0
  301. package/dist/public/assets/swimlanes-B3ENRKFQ-BIl_Q-FM.js +1 -0
  302. package/dist/public/assets/swimlanesDiagram-AYQRV4AK-rvDbKEHQ.js +8 -0
  303. package/dist/public/assets/timeline-definition-JXYKGLGB-qAoWTH4N.js +120 -0
  304. package/dist/public/assets/treeView-D4JQ5SDB-vq16JKkJ.js +1 -0
  305. package/dist/public/assets/treemap-SAJKECNS-C0IZTaDk.js +1 -0
  306. package/dist/public/assets/usecaseDiagram-WPOLBNNX-Dq8iz49r.js +328 -0
  307. package/dist/public/assets/vennDiagram-Q3Y3IDCW-Br4JmRjM.js +34 -0
  308. package/dist/public/assets/wardley-7MLQ67FV-CEPlAQ79.js +1 -0
  309. package/dist/public/assets/wardleyDiagram-IVAIDKWA-DURB7Ue6.js +78 -0
  310. package/dist/public/assets/xychartDiagram-4URNHDU4-BiZywfhy.js +7 -0
  311. package/dist/public/index.html +27 -28
  312. package/dist/public/sbom.cdx.json +1 -0
  313. package/dist/types.d.ts +0 -12
  314. package/dist/types.js +2 -12
  315. package/dist/types.js.map +1 -1
  316. package/dist/utils.d.ts +12 -5
  317. package/dist/utils.js +18 -43
  318. package/dist/utils.js.map +1 -1
  319. package/package.json +14 -14
  320. package/src/app.ts +51 -49
  321. package/src/auth/index.ts +3 -13
  322. package/src/auth/keycloak.ts +10 -15
  323. package/src/auth/mock.ts +144 -48
  324. package/src/auth/types.ts +10 -13
  325. package/src/common/errors.ts +45 -0
  326. package/src/common/validationSchemas.ts +3 -12
  327. package/src/domain/auth/index.ts +2 -12
  328. package/src/domain/calculations/index.ts +4 -14
  329. package/src/domain/calculations/schema.ts +2 -12
  330. package/src/domain/calculations/service.ts +8 -21
  331. package/src/domain/cardTypes/index.ts +10 -20
  332. package/src/domain/cardTypes/schema.ts +3 -12
  333. package/src/domain/cardTypes/service.ts +22 -29
  334. package/src/domain/cards/index.ts +158 -218
  335. package/src/domain/cards/lib.ts +9 -173
  336. package/src/domain/cards/mermaid.ts +25 -0
  337. package/src/domain/cards/schema.ts +19 -15
  338. package/src/domain/cards/service.ts +166 -134
  339. package/src/domain/connectors/index.ts +5 -14
  340. package/src/domain/connectors/service.ts +5 -20
  341. package/src/domain/events/events-by-project.ts +59 -0
  342. package/src/domain/events/index.ts +102 -0
  343. package/src/domain/events/lifetime.ts +17 -0
  344. package/src/domain/events/project-events.ts +266 -0
  345. package/src/domain/events/schema.ts +11 -0
  346. package/src/domain/fieldTypes/index.ts +6 -16
  347. package/src/domain/fieldTypes/schema.ts +3 -12
  348. package/src/domain/fieldTypes/service.ts +9 -21
  349. package/src/domain/graphModels/index.ts +4 -14
  350. package/src/domain/graphModels/schema.ts +3 -12
  351. package/src/domain/graphModels/service.ts +5 -18
  352. package/src/domain/graphViews/index.ts +4 -14
  353. package/src/domain/graphViews/schema.ts +3 -0
  354. package/src/domain/graphViews/service.ts +5 -18
  355. package/src/domain/labels/index.ts +4 -14
  356. package/src/domain/labels/service.ts +6 -16
  357. package/src/domain/linkTypes/index.ts +6 -16
  358. package/src/domain/linkTypes/schema.ts +2 -12
  359. package/src/domain/linkTypes/service.ts +8 -21
  360. package/src/domain/logicPrograms/index.ts +5 -17
  361. package/src/domain/logicPrograms/service.ts +7 -16
  362. package/src/domain/mcp/index.ts +33 -24
  363. package/src/domain/project/index.ts +59 -37
  364. package/src/domain/project/schema.ts +41 -18
  365. package/src/domain/project/service.ts +81 -71
  366. package/src/domain/projects/index.ts +38 -50
  367. package/src/domain/projects/schema.ts +3 -12
  368. package/src/domain/projects/service.ts +18 -88
  369. package/src/domain/reports/index.ts +4 -14
  370. package/src/domain/reports/schema.ts +2 -12
  371. package/src/domain/reports/service.ts +5 -18
  372. package/src/domain/resources/index.ts +102 -30
  373. package/src/domain/resources/schema.ts +15 -2
  374. package/src/domain/resources/service.ts +98 -81
  375. package/src/domain/skills/index.ts +51 -0
  376. package/src/domain/skills/schema.ts +9 -0
  377. package/src/domain/skills/service.ts +8 -0
  378. package/src/domain/templates/index.ts +8 -18
  379. package/src/domain/templates/schema.ts +2 -12
  380. package/src/domain/templates/service.ts +9 -22
  381. package/src/domain/tree/index.ts +4 -14
  382. package/src/domain/tree/service.ts +10 -21
  383. package/src/domain/workflows/index.ts +4 -14
  384. package/src/domain/workflows/schema.ts +2 -12
  385. package/src/domain/workflows/service.ts +5 -18
  386. package/src/export.ts +82 -73
  387. package/src/index.ts +30 -46
  388. package/src/main.ts +45 -37
  389. package/src/middleware/auth.ts +25 -16
  390. package/src/middleware/commandManager.ts +37 -49
  391. package/src/middleware/tree.ts +3 -0
  392. package/src/middleware/zvalidator.ts +3 -0
  393. package/src/overlay.ts +185 -0
  394. package/src/types.ts +2 -12
  395. package/src/utils.ts +26 -46
  396. package/dist/domain/cards/presence.d.ts +0 -50
  397. package/dist/domain/cards/presence.js +0 -93
  398. package/dist/domain/cards/presence.js.map +0 -1
  399. package/dist/project-registry.d.ts +0 -57
  400. package/dist/project-registry.js +0 -93
  401. package/dist/project-registry.js.map +0 -1
  402. package/dist/public/assets/abnfDiagram-VRR7QNED-Djr4KJ5E.js +0 -1
  403. package/dist/public/assets/arc-DrR4k_H-.js +0 -1
  404. package/dist/public/assets/architecture-TIHT7OUA-XL6N-4o9.js +0 -1
  405. package/dist/public/assets/architectureDiagram-ZJ3FMSHR-DsMU2Uwa.js +0 -36
  406. package/dist/public/assets/blockDiagram-677ZJIJ3-DRBmQUQJ.js +0 -132
  407. package/dist/public/assets/c4Diagram-LMCZKHZV-E0rM02LD.js +0 -10
  408. package/dist/public/assets/channel-D5fnImJy.js +0 -1
  409. package/dist/public/assets/chunk-32BRIVSS-BnDY0aSV.js +0 -1
  410. package/dist/public/assets/chunk-52WLFC77-N5YugKaZ.js +0 -10
  411. package/dist/public/assets/chunk-5FCAYU7R-I3_t_Ic_.js +0 -1
  412. package/dist/public/assets/chunk-5HE753X5-Dxz40rzH.js +0 -1
  413. package/dist/public/assets/chunk-5JV3BV7I-CNwCKRLH.js +0 -1
  414. package/dist/public/assets/chunk-5TONJI2A-ezWQ_Z2j.js +0 -2
  415. package/dist/public/assets/chunk-7BUUIJ7U-Bb538aSH.js +0 -1
  416. package/dist/public/assets/chunk-BIQX33UG-DS132-R_.js +0 -1
  417. package/dist/public/assets/chunk-C7G6YPKG-BN-cNjoj.js +0 -1
  418. package/dist/public/assets/chunk-CQNSW5MT-D8Mn1I73.js +0 -1
  419. package/dist/public/assets/chunk-CYSBUYHQ-Dc64Dwdo.js +0 -1
  420. package/dist/public/assets/chunk-EMLP6XTP-aIK0V8GX.js +0 -1
  421. package/dist/public/assets/chunk-EX3LRPZG-Db0XYyxy.js +0 -231
  422. package/dist/public/assets/chunk-FWX5IMBZ-BF_P2-Do.js +0 -2
  423. package/dist/public/assets/chunk-HOUHSVGY-L35GPy9G.js +0 -1
  424. package/dist/public/assets/chunk-ICXQ74PX-Bb8zaHde.js +0 -2
  425. package/dist/public/assets/chunk-JG7HCLWE-BtAXK3iQ.js +0 -2
  426. package/dist/public/assets/chunk-KEIR6QF5-DEvma7oi.js +0 -161
  427. package/dist/public/assets/chunk-MOZMSUNE-5FIqIBsY.js +0 -1
  428. package/dist/public/assets/chunk-OGEWGWER-BVIFy9xz.js +0 -1
  429. package/dist/public/assets/chunk-OSBZ3O6U-Cfd7kf1R.js +0 -1
  430. package/dist/public/assets/chunk-PUDLZKDR-Db3FSNR9.js +0 -156
  431. package/dist/public/assets/chunk-Q4XR5HBZ-BuKFRUzR.js +0 -70
  432. package/dist/public/assets/chunk-QBLGF6JB-DUGZXFh-.js +0 -1
  433. package/dist/public/assets/chunk-R7FJI6CG-D7mUd-qN.js +0 -1
  434. package/dist/public/assets/chunk-RYQCIY6F-C_3rESBd.js +0 -1
  435. package/dist/public/assets/chunk-U6XO7XAA-C3UhlwA1.js +0 -2
  436. package/dist/public/assets/chunk-V7JOEXUC-71b0ABpv.js +0 -206
  437. package/dist/public/assets/chunk-VAUOI2AC-C-GBw18h.js +0 -1
  438. package/dist/public/assets/chunk-VR4S4FIN-tUhbELKr.js +0 -1
  439. package/dist/public/assets/chunk-WYO6CB5R-BQoO62-B.js +0 -127
  440. package/dist/public/assets/chunk-XXDRQBXY-Co8n4ZHT.js +0 -1
  441. package/dist/public/assets/chunk-YOTPTUD7-DhCRKU1A.js +0 -1
  442. package/dist/public/assets/chunk-ZGVPDNZ5-hpz2Ryq5.js +0 -62
  443. package/dist/public/assets/chunk-ZIRB5QZD-BpeS1aZ7.js +0 -32
  444. package/dist/public/assets/classDiagram-OUVF2IWQ-CXdVorPK.js +0 -1
  445. package/dist/public/assets/classDiagram-v2-EOCWNBFH-CXdVorPK.js +0 -1
  446. package/dist/public/assets/colors-Cg5Vh3br.js +0 -1
  447. package/dist/public/assets/cose-bilkent-JH36ORCC-4GoRbloS.js +0 -1
  448. package/dist/public/assets/cynefin-VYW2F7L2-BPH-25fI.js +0 -1
  449. package/dist/public/assets/cynefinDiagram-TSTJHNR4-PEf16euv.js +0 -62
  450. package/dist/public/assets/cytoscape.esm-C3UvhD5t.js +0 -321
  451. package/dist/public/assets/dagre-Buvkdvvj.js +0 -1
  452. package/dist/public/assets/dagre-VKFMJZFB-DPsCMBF1.js +0 -4
  453. package/dist/public/assets/diagram-FQU43EPY-DS-ryuRg.js +0 -3
  454. package/dist/public/assets/diagram-G47NLZAW-CzUoYkFf.js +0 -24
  455. package/dist/public/assets/diagram-NH7WQ7WH-MhGnE2fh.js +0 -24
  456. package/dist/public/assets/diagram-OA4YK3LP-CsQ9aFR_.js +0 -30
  457. package/dist/public/assets/diagram-WEI45ONY-Er3q49ew.js +0 -41
  458. package/dist/public/assets/dist-BzwexiH1.js +0 -1
  459. package/dist/public/assets/ebnfDiagram-CCIWWBDH-AnJAsk14.js +0 -1
  460. package/dist/public/assets/erDiagram-Q63AITRT-DulA16my.js +0 -85
  461. package/dist/public/assets/eventmodeling-45OFAUF4-CoIhTpHU.js +0 -1
  462. package/dist/public/assets/flowDiagram-23GEKE2U-BGMXUq18.js +0 -1
  463. package/dist/public/assets/ganttDiagram-NO4QXBWP-DAvCPT7_.js +0 -292
  464. package/dist/public/assets/gitGraph-TEB2WS4Q-BcPsZts5.js +0 -1
  465. package/dist/public/assets/gitGraphDiagram-IHSO6WYX-CksvJvsQ.js +0 -106
  466. package/dist/public/assets/index-COSSLZqt.css +0 -1
  467. package/dist/public/assets/index-Y8Ckwau7.js +0 -447
  468. package/dist/public/assets/info-DKCQHKI2-7VGzrAVB.js +0 -1
  469. package/dist/public/assets/infoDiagram-FWYZ7A6U-D_by7lSL.js +0 -2
  470. package/dist/public/assets/journeyDiagram-5HDEW3XC-DpvFmk7c.js +0 -139
  471. package/dist/public/assets/kanban-definition-HUTT4EX6-DYP_x6zD.js +0 -89
  472. package/dist/public/assets/katex-DolUETbr.js +0 -257
  473. package/dist/public/assets/line-C8Sfsgt8.js +0 -1
  474. package/dist/public/assets/linear-BWTvbP1l.js +0 -1
  475. package/dist/public/assets/map-BaFkSB1l.js +0 -1
  476. package/dist/public/assets/mermaid-parser.core--8614tkK.js +0 -4
  477. package/dist/public/assets/mindmap-definition-LN4V7U3C-3IAd4gp3.js +0 -96
  478. package/dist/public/assets/ordinal-BdBDtYTt.js +0 -1
  479. package/dist/public/assets/packet-7NZHBO7P-KYt33H0C.js +0 -1
  480. package/dist/public/assets/path-HTXttWil.js +0 -1
  481. package/dist/public/assets/pegDiagram-2B236MQR-BQNFxYz2.js +0 -1
  482. package/dist/public/assets/pie-RZYD4A2V-xKz9s9I4.js +0 -1
  483. package/dist/public/assets/pieDiagram-ENE6RG2P-Cy13tg8_.js +0 -39
  484. package/dist/public/assets/radar-I7S5WNFK-B4QTX-fX.js +0 -1
  485. package/dist/public/assets/railroad-3IZDKUUU-Co_9rPVC.js +0 -1
  486. package/dist/public/assets/railroad-abnf-AHOZXSZD-Bhy_c3ol.js +0 -1
  487. package/dist/public/assets/railroad-ebnf-EBAXGLYW-B9ENjG34.js +0 -1
  488. package/dist/public/assets/railroad-peg-LSFZ7HO6-CyJxDBsB.js +0 -1
  489. package/dist/public/assets/railroadDiagram-RFXS5EU6-M2j5SJF2.js +0 -1
  490. package/dist/public/assets/range-EplFIxc7.js +0 -1
  491. package/dist/public/assets/requirementDiagram-TGXJPOKE-CmvJWy_S.js +0 -84
  492. package/dist/public/assets/sankeyDiagram-HTMAVEWB-tAeOzMTn.js +0 -40
  493. package/dist/public/assets/sequenceDiagram-DBY2YBRQ-r0pwijM4.js +0 -162
  494. package/dist/public/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +0 -1
  495. package/dist/public/assets/src-DOh7_en_.js +0 -1
  496. package/dist/public/assets/stateDiagram-2N3HPSRC-a9IdkSQG.js +0 -1
  497. package/dist/public/assets/stateDiagram-v2-6OUMAXLB-s2blPtZ-.js +0 -1
  498. package/dist/public/assets/swimlanes-5IMT3BWC-5w0Cdxk6.js +0 -2
  499. package/dist/public/assets/swimlanesDiagram-G3AALYLV-BWa-KRed.js +0 -8
  500. package/dist/public/assets/time-BM2d9MsQ.js +0 -1
  501. package/dist/public/assets/timeline-definition-FHXFAJF6-CvXlv_4Y.js +0 -120
  502. package/dist/public/assets/treeView-QDETBFTQ-B9cxjfpB.js +0 -1
  503. package/dist/public/assets/treemap-6X3UGDF4-BplEq4hB.js +0 -1
  504. package/dist/public/assets/treemap-BfjIY-m6.js +0 -1
  505. package/dist/public/assets/vennDiagram-L72KCM5P-ti2qNcvo.js +0 -34
  506. package/dist/public/assets/wardley-OPB4EBWU-BX2ghg5e.js +0 -1
  507. package/dist/public/assets/wardleyDiagram-EHGQE667-C8lblm8x.js +0 -78
  508. package/dist/public/assets/xychartDiagram-FW5EYKEG-US-_k5eu.js +0 -7
  509. package/src/domain/cards/presence.ts +0 -124
  510. package/src/project-registry.ts +0 -130
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.1.2",
3
+ "version": "1.3.0",
4
4
  "description": "Express backend for Cyberismo",
5
5
  "main": "dist/index.js",
6
6
  "keywords": [],
7
7
  "author": "sami.merila@cyberismo.com",
8
- "license": "AGPL-3.0",
8
+ "license": "AGPL-3.0-only",
9
9
  "homepage": "https://github.com/CyberismoCom/cyberismo",
10
10
  "repository": {
11
11
  "type": "git",
@@ -16,20 +16,20 @@
16
16
  "node": ">=22"
17
17
  },
18
18
  "dependencies": {
19
- "@asciidoctor/core": "^4.0.6",
20
- "@hono/mcp": "^0.3.1",
21
- "@hono/node-server": "^2.0.12",
22
- "@hono/zod-validator": "^0.9.0",
23
- "@modelcontextprotocol/sdk": "^1.30.0",
19
+ "@cyberismo/assets": "1.3.0",
20
+ "@cyberismo/data-handler": "1.3.0",
21
+ "@cyberismo/mcp": "1.3.0",
22
+ "@cyberismo/model": "1.2.0",
23
+ "@hono/mcp": "^0.3.5",
24
+ "@hono/node-server": "^2.1.5",
25
+ "@hono/zod-validator": "^0.9.1",
26
+ "@modelcontextprotocol/sdk": "^1.32.2",
24
27
  "@types/mime-types": "^3.0.1",
25
- "dotenv": "^17.3.1",
26
- "hono": "^4.12.32",
27
- "jose": "^6.2.5",
28
+ "dotenv": "^18.0.9",
29
+ "hono": "^4.13.14",
30
+ "jose": "^6.2.14",
28
31
  "mime-types": "^3.0.2",
29
- "zod": "^4.3.6",
30
- "@cyberismo/assets": "1.1.2",
31
- "@cyberismo/data-handler": "1.1.2",
32
- "@cyberismo/mcp": "1.1.2"
32
+ "zod": "^4.6.7"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@cyberismo/app": "0.0.2"
package/src/app.ts CHANGED
@@ -1,28 +1,22 @@
1
- /**
2
- 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';
5
+ import { staticFrontendDirRelative } from './utils.js';
15
6
  import { serveStatic } from '@hono/node-server/serve-static';
16
- import { attachProjectRegistry } from './middleware/commandManager.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';
20
12
  import connectorsRouter from './domain/connectors/index.js';
13
+ import eventsRouter from './domain/events/index.js';
21
14
  import fieldTypesRouter from './domain/fieldTypes/index.js';
22
15
  import graphModelsRouter from './domain/graphModels/index.js';
23
16
  import graphViewsRouter from './domain/graphViews/index.js';
24
17
  import linkTypesRouter from './domain/linkTypes/index.js';
25
18
  import reportsRouter from './domain/reports/index.js';
19
+ import skillsRouter from './domain/skills/index.js';
26
20
  import templatesRouter from './domain/templates/index.js';
27
21
  import treeRouter from './domain/tree/index.js';
28
22
  import workflowsRouter from './domain/workflows/index.js';
@@ -38,12 +32,13 @@ import type { AppVars, TreeOptions } from './types.js';
38
32
  import treeMiddleware from './middleware/tree.js';
39
33
  import projectRouter from './domain/project/index.js';
40
34
  import { createMcpRouter } from './domain/mcp/index.js';
35
+ import { writableProjects } from './overlay.js';
41
36
  import { createAuthRouter } from './domain/auth/index.js';
42
37
  import { createAuthMiddleware } from './middleware/auth.js';
43
38
  import type { AuthProvider } from './auth/types.js';
44
- import { MockAuthProvider, mockRoleCookieMiddleware } from './auth/mock.js';
45
- import type { ProjectRegistry } from './project-registry.js';
46
- import { CommandManager, scanForProjects } from '@cyberismo/data-handler';
39
+ import { MockAuthProvider } from './auth/mock.js';
40
+ import type { ProjectDirectory } from '@cyberismo/data-handler';
41
+ import { EventsByProject } from './domain/events/events-by-project.js';
47
42
  import { createProjectsRouter } from './domain/projects/index.js';
48
43
  import { simpleMcpAuthRouter } from '@hono/mcp';
49
44
 
@@ -59,11 +54,13 @@ function createProjectScopedRoutes(
59
54
  projectScoped.route('/cards', cardsRouter);
60
55
  projectScoped.route('/cardTypes', cardTypesRouter);
61
56
  projectScoped.route('/connectors', connectorsRouter);
57
+ projectScoped.route('/events', eventsRouter);
62
58
  projectScoped.route('/fieldTypes', fieldTypesRouter);
63
59
  projectScoped.route('/graphModels', graphModelsRouter);
64
60
  projectScoped.route('/graphViews', graphViewsRouter);
65
61
  projectScoped.route('/linkTypes', linkTypesRouter);
66
62
  projectScoped.route('/reports', reportsRouter);
63
+ projectScoped.route('/skills', skillsRouter);
67
64
  projectScoped.route('/templates', templatesRouter);
68
65
  projectScoped.route('/tree', treeRouter);
69
66
  projectScoped.route('/workflows', workflowsRouter);
@@ -77,16 +74,20 @@ function createProjectScopedRoutes(
77
74
  /**
78
75
  * Create the Hono app for the backend
79
76
  * @param authProvider - Authentication provider
80
- * @param 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
81
80
  */
82
81
  export function createApp(
83
82
  authProvider: AuthProvider,
84
- registry: ProjectRegistry,
83
+ directory: ProjectDirectory,
85
84
  opts?: TreeOptions,
86
- exportMode = false,
85
+ exportPrefixes?: string[],
87
86
  multiProjectRoot?: string,
88
87
  ) {
89
88
  const app = new Hono<{ Variables: AppVars }>();
89
+ const exportMode = exportPrefixes !== undefined;
90
+ const events = new EventsByProject(directory);
90
91
 
91
92
  // Public — no auth middleware (MCP clients call this before they have a token)
92
93
  // RFC 9728 resource metadata & OAuth authorization server metadata via @hono/mcp
@@ -109,15 +110,15 @@ export function createApp(
109
110
  return c.json({
110
111
  staticMode: exportMode,
111
112
  logoutUrl: process.env.APP_LOGOUT_URL || '',
112
- presenceEnabled: process.env.APP_PRESENCE_ENABLED === 'true',
113
113
  defaultProject: process.env.CYBERISMO_DEFAULT_PROJECT || undefined,
114
+ extensionUrl: process.env.APP_EXTENSION_URL || undefined,
114
115
  });
115
116
  });
116
117
 
117
- // Dev-only: let `?role=<reader|editor|admin>` set a persistent mock-role cookie
118
- // so role gating can be exercised locally without code changes or a restart.
118
+ // Mock-auth only: let `?role=` and, with the roster on, `?user=` set persistent
119
+ // cookies so role gating and identity can be switched locally without a restart.
119
120
  if (authProvider instanceof MockAuthProvider) {
120
- app.use(mockRoleCookieMiddleware());
121
+ app.use(authProvider.cookieMiddleware());
121
122
  }
122
123
 
123
124
  // Apply authentication middleware to all API and MCP routes
@@ -125,12 +126,12 @@ export function createApp(
125
126
  app.use('/mcp', createAuthMiddleware(authProvider));
126
127
  app.use('/mcp/*', createAuthMiddleware(authProvider));
127
128
 
128
- // Global routes (no project-specific CommandManager needed)
129
+ // Global routes (no project handle needed)
129
130
  app.route('/api/auth', createAuthRouter());
130
- app.route('/api/projects', createProjectsRouter(registry, multiProjectRoot));
131
+ app.route('/api/projects', createProjectsRouter(directory, multiProjectRoot));
131
132
 
132
133
  // Test-mode reset endpoint: wipes the project dir, restores it from the
133
- // golden snapshot, and rebuilds the registry in place. Used by the
134
+ // golden snapshot, and reopens its projects in place. Used by the
134
135
  // Playwright e2e harness to restore the project between spec files.
135
136
  // Gated by NODE_ENV so it never ships in production.
136
137
  if (process.env.NODE_ENV === 'test') {
@@ -161,9 +162,16 @@ export function createApp(
161
162
  400,
162
163
  );
163
164
  }
164
- await fs.rm(resolvedProject, { recursive: true, force: true });
165
+ // Windows holds transient locks on files the server has just touched,
166
+ // which surface as EBUSY on the final rmdir. Retry rather than fail the reset.
167
+ await fs.rm(resolvedProject, {
168
+ recursive: true,
169
+ force: true,
170
+ maxRetries: 5,
171
+ retryDelay: 100,
172
+ });
165
173
  await fs.cp(goldenPath, resolvedProject, { recursive: true });
166
- const projects = await scanForProjects(resolvedProject);
174
+ const projects = await directory.list();
167
175
 
168
176
  if (projects.length === 0) {
169
177
  return c.json(
@@ -173,13 +181,10 @@ export function createApp(
173
181
  500,
174
182
  );
175
183
  }
176
- const entries = [];
177
184
  for (const project of projects) {
178
- const commands = new CommandManager(project.path, gitOptionsFromEnv());
179
- await commands.initialize();
180
- entries.push({ prefix: project.prefix, commands });
185
+ await directory.replace(project.prefix);
186
+ events.drop(project.prefix);
181
187
  }
182
- await registry.replace(entries);
183
188
  return c.body(null, 204);
184
189
  });
185
190
  }
@@ -197,23 +202,25 @@ export function createApp(
197
202
  }
198
203
  });
199
204
 
200
- if (exportMode) {
205
+ if (exportPrefixes) {
201
206
  // Export mode: mount at each concrete prefix so SSG sees
202
207
  // static routes instead of dynamic :prefix patterns it would skip.
203
- for (const { prefix } of registry.list()) {
208
+ for (const prefix of exportPrefixes) {
204
209
  const scoped = createProjectScopedRoutes(
205
- attachProjectRegistry(registry, prefix),
210
+ attachProjectDirectory(directory, events, prefix),
206
211
  );
207
212
  app.route(`/api/projects/${prefix}`, scoped);
208
213
  }
209
214
  } else {
210
215
  // Normal mode: dynamic :prefix param
211
- const scoped = createProjectScopedRoutes(attachProjectRegistry(registry));
216
+ const scoped = createProjectScopedRoutes(
217
+ attachProjectDirectory(directory, events),
218
+ );
212
219
  app.route('/api/projects/:prefix', scoped);
213
220
  }
214
221
 
215
222
  // MCP endpoint for AI assistant integration
216
- app.route('/mcp', createMcpRouter(registry));
223
+ app.route('/mcp', createMcpRouter(writableProjects(directory)));
217
224
 
218
225
  app.use(
219
226
  '*',
@@ -236,18 +243,13 @@ export function createApp(
236
243
  return c.html(file.toString());
237
244
  });
238
245
  // Error handling
246
+ // Only server faults are logged; client errors are answered, not logged.
239
247
  app.onError((err, c) => {
240
- if (!isSSGContext(c)) {
241
- if (process.env.NODE_ENV !== 'test') {
242
- console.error(err.stack);
243
- }
248
+ const { status, body } = errorResponse(err);
249
+ if (status >= 500 && !isSSGContext(c) && process.env.NODE_ENV !== 'test') {
250
+ console.error(err.stack);
244
251
  }
245
- return c.json(
246
- {
247
- error: err.message || 'Internal Server Error',
248
- },
249
- 500,
250
- );
252
+ return c.json(body, status);
251
253
  });
252
254
 
253
255
  return app;
package/src/auth/index.ts CHANGED
@@ -1,17 +1,7 @@
1
- /**
2
- 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
- export { MockAuthProvider, mockRoleCookieMiddleware } from './mock.js';
5
+ export { MockAuthProvider } from './mock.js';
16
6
  export { KeycloakAuthProvider } from './keycloak.js';
17
7
  export type { KeycloakConfig } from './keycloak.js';
@@ -1,21 +1,10 @@
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';
16
6
  import { UserRole } from '../types.js';
17
- import type { UserInfo } from '../types.js';
18
- import type { AuthProvider } from './types.js';
7
+ import type { AuthProvider, AuthResult } from './types.js';
19
8
 
20
9
  export interface KeycloakConfig {
21
10
  issuer: string;
@@ -51,7 +40,7 @@ export class KeycloakAuthProvider implements AuthProvider {
51
40
  return this.jwks;
52
41
  }
53
42
 
54
- async authenticate(req: Request): Promise<UserInfo | null> {
43
+ async authenticate(req: Request): Promise<AuthResult | null> {
55
44
  const authHeader = req.headers.get('authorization');
56
45
  if (!authHeader) {
57
46
  return null;
@@ -78,12 +67,18 @@ export class KeycloakAuthProvider implements AuthProvider {
78
67
  if (!claims.email) {
79
68
  throw new Error('Missing email');
80
69
  }
70
+ // Optional in RFC 7519, and jwtVerify only checks it when present, so a
71
+ // token without one would rotate on jitter alone and never clamp.
72
+ if (!claims.exp) {
73
+ throw new Error('Missing exp');
74
+ }
81
75
 
82
76
  return {
83
77
  id: claims.sub,
84
78
  email: claims.email,
85
79
  name: claims.name ?? claims.preferred_username ?? 'Unknown',
86
80
  role,
81
+ exp: claims.exp,
87
82
  };
88
83
  } catch {
89
84
  // TODO: add proper logging
package/src/auth/mock.ts CHANGED
@@ -1,40 +1,103 @@
1
- /**
2
- Cyberismo
3
- Copyright © Cyberismo Ltd and contributors 2026
4
- This program is free software: you can redistribute it and/or modify it under
5
- the terms of the GNU Affero General Public License version 3 as published by
6
- the Free Software Foundation. This program is distributed in the hope that it
7
- will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
8
- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
- See the GNU Affero General Public License for more details.
10
- You should have received a copy of the GNU Affero General Public
11
- License along with this program. If not, see <https://www.gnu.org/licenses/>.
12
- */
13
-
14
- import type { MiddlewareHandler } from 'hono';
1
+ // SPDX-FileCopyrightText: Cyberismo Ltd and contributors
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+
4
+ import type { Context, MiddlewareHandler } from 'hono';
15
5
  import { setCookie } from 'hono/cookie';
16
6
  import { UserRole } from '../types.js';
17
7
  import type { UserInfo } from '../types.js';
18
- import type { AuthProvider } from './types.js';
8
+ import type { AuthProvider, AuthResult } from './types.js';
19
9
 
20
10
  export interface MockUserConfig {
21
11
  name?: string;
22
12
  email?: string;
13
+ roster?: boolean;
23
14
  }
24
15
 
25
16
  export const MOCK_ROLE_COOKIE = 'mock-role';
26
- const ROLE_RESET_VALUE = 'default';
17
+ export const MOCK_USER_COOKIE = 'mock-user';
18
+ export const MOCK_EXP_COOKIE = 'mock-exp';
19
+ export const MOCK_AS_PARAM = 'as';
20
+ const RESET_VALUE = 'default';
21
+ const MAX_TTL_SECONDS = 86_400;
22
+ // Mock sessions do not expire. Saying so with a distant deadline rather than
23
+ // no deadline keeps `exp` total for every consumer: it is far beyond the
24
+ // 30-minute stream lifetime, so computeLifetimeMs() min()s it away and
25
+ // rotation still falls to the jitter, exactly as an absent one did.
26
+ const NO_EXPIRY_SECONDS = 100 * 365 * 24 * 60 * 60;
27
+
28
+ function noExpiry(): number {
29
+ return Math.floor(Date.now() / 1000) + NO_EXPIRY_SECONDS;
30
+ }
31
+
32
+ const ROLE_ALIASES = new Map<string, UserRole>([
33
+ ['reader', UserRole.Reader],
34
+ ['editor', UserRole.Editor],
35
+ ['admin', UserRole.Admin],
36
+ ['connector', UserRole.Connector],
37
+ ]);
38
+
39
+ interface MockUser {
40
+ id: string;
41
+ name: string;
42
+ email: string;
43
+ role: UserRole;
44
+ }
27
45
 
28
- const ROLE_ALIASES: Record<string, UserRole> = {
29
- reader: UserRole.Reader,
30
- editor: UserRole.Editor,
31
- admin: UserRole.Admin,
32
- connector: UserRole.Connector,
33
- };
46
+ // Opt-in: `cyberismo app` ships mock auth, where a roster identity would forge
47
+ // git commit authorship. Dev and e2e need several users in one backend process.
48
+ const MOCK_USERS = new Map<string, MockUser>([
49
+ [
50
+ 'alice',
51
+ {
52
+ id: 'mock-user-alice',
53
+ name: 'Alice',
54
+ email: 'alice@example.com',
55
+ role: UserRole.Admin,
56
+ },
57
+ ],
58
+ [
59
+ 'bob',
60
+ {
61
+ id: 'mock-user-bob',
62
+ name: 'Bob',
63
+ email: 'bob@example.com',
64
+ role: UserRole.Editor,
65
+ },
66
+ ],
67
+ [
68
+ 'carol',
69
+ {
70
+ id: 'mock-user-carol',
71
+ name: 'Carol',
72
+ email: 'carol@example.com',
73
+ role: UserRole.Reader,
74
+ },
75
+ ],
76
+ ]);
34
77
 
35
78
  function parseRole(value: string | null | undefined): UserRole | null {
36
79
  if (!value) return null;
37
- return ROLE_ALIASES[value.toLowerCase()] ?? null;
80
+ return ROLE_ALIASES.get(value.toLowerCase()) ?? null;
81
+ }
82
+
83
+ function parseUser(value: string | null | undefined): MockUser | null {
84
+ if (!value) return null;
85
+ return MOCK_USERS.get(value.toLowerCase()) ?? null;
86
+ }
87
+
88
+ /** An unreadable deadline is dropped rather than treated as long past, which
89
+ * would lock the user out with no request left to clear the cookie. */
90
+ function parseExpiry(value: string | null | undefined): number | null {
91
+ const exp = Number(value);
92
+ return value && Number.isInteger(exp) && exp > 0 ? exp : null;
93
+ }
94
+
95
+ /** Seconds from now to the absolute epoch-second deadline to store. */
96
+ function toDeadline(value: string): string | null {
97
+ const seconds = Number(value);
98
+ if (!Number.isInteger(seconds) || seconds <= 0) return null;
99
+ if (seconds > MAX_TTL_SECONDS) return null;
100
+ return String(Math.floor(Date.now() / 1000) + seconds);
38
101
  }
39
102
 
40
103
  function readCookie(header: string | null, name: string): string | undefined {
@@ -48,6 +111,22 @@ function readCookie(header: string | null, name: string): string | undefined {
48
111
  return undefined;
49
112
  }
50
113
 
114
+ function applyOverride(
115
+ c: Context,
116
+ override: string | null,
117
+ cookieName: string,
118
+ toCookieValue: (value: string) => string | null,
119
+ ): void {
120
+ if (!override) return;
121
+ if (override.toLowerCase() === RESET_VALUE) {
122
+ setCookie(c, cookieName, '', { path: '/', maxAge: 0 });
123
+ return;
124
+ }
125
+ const value = toCookieValue(override);
126
+ if (value === null) return;
127
+ setCookie(c, cookieName, value, { path: '/', sameSite: 'Lax' });
128
+ }
129
+
51
130
  export class MockAuthProvider implements AuthProvider {
52
131
  private readonly userConfig: MockUserConfig;
53
132
 
@@ -55,36 +134,53 @@ export class MockAuthProvider implements AuthProvider {
55
134
  this.userConfig = config ?? {};
56
135
  }
57
136
 
58
- async authenticate(req: Request): Promise<UserInfo> {
59
- const cookieRole = parseRole(
60
- readCookie(req.headers.get('cookie'), MOCK_ROLE_COOKIE),
61
- );
62
- return {
137
+ async authenticate(req: Request): Promise<AuthResult | null> {
138
+ const cookies = req.headers.get('cookie');
139
+ const cookieRole = parseRole(readCookie(cookies, MOCK_ROLE_COOKIE));
140
+ if (this.userConfig.roster) {
141
+ // One-shot: a second identity from inside a tab already signed in as
142
+ // someone else, so neither the cookie nor the role override applies.
143
+ const asUser = parseUser(
144
+ new URL(req.url).searchParams.get(MOCK_AS_PARAM),
145
+ );
146
+ if (asUser) return { ...asUser, exp: noExpiry() };
147
+ }
148
+ const rosterUser = this.userConfig.roster
149
+ ? parseUser(readCookie(cookies, MOCK_USER_COOKIE))
150
+ : null;
151
+ const expiry = this.userConfig.roster
152
+ ? parseExpiry(readCookie(cookies, MOCK_EXP_COOKIE))
153
+ : null;
154
+ if (expiry !== null && expiry * 1000 <= Date.now()) return null;
155
+ const exp = expiry ?? noExpiry();
156
+
157
+ const identity: UserInfo = rosterUser ?? {
63
158
  id: 'mock-user',
64
159
  email: this.userConfig.email ?? 'admin@cyberismo.local',
65
160
  name: this.userConfig.name ?? 'Local Admin',
66
- role: cookieRole ?? UserRole.Admin,
161
+ role: UserRole.Admin,
67
162
  };
163
+ return { ...identity, role: cookieRole ?? identity.role, exp };
68
164
  }
69
- }
70
165
 
71
- /**
72
- * Dev-only middleware that turns `?role=<reader|editor|admin>` into a persistent
73
- * `mock-role` cookie, and clears it on `?role=default`.
74
- */
75
- export function mockRoleCookieMiddleware(): MiddlewareHandler {
76
- return async (c, next) => {
77
- const override = new URL(c.req.url).searchParams.get('role');
78
- if (override) {
79
- if (override.toLowerCase() === ROLE_RESET_VALUE) {
80
- setCookie(c, MOCK_ROLE_COOKIE, '', { path: '/', maxAge: 0 });
81
- } else if (parseRole(override)) {
82
- setCookie(c, MOCK_ROLE_COOKIE, override.toLowerCase(), {
83
- path: '/',
84
- sameSite: 'Lax',
85
- });
166
+ /**
167
+ * Turns ?role= and, with the roster on, ?user= and ?ttl= into cookies;
168
+ * "default" clears. ?ttl= seconds gives the session an expiry, which is
169
+ * what drives stream rotation and the 401 that follows it.
170
+ */
171
+ cookieMiddleware(): MiddlewareHandler {
172
+ return async (c, next) => {
173
+ const params = new URL(c.req.url).searchParams;
174
+ applyOverride(c, params.get('role'), MOCK_ROLE_COOKIE, (value) =>
175
+ parseRole(value) ? value.toLowerCase() : null,
176
+ );
177
+ if (this.userConfig.roster) {
178
+ applyOverride(c, params.get('user'), MOCK_USER_COOKIE, (value) =>
179
+ parseUser(value) ? value.toLowerCase() : null,
180
+ );
181
+ applyOverride(c, params.get('ttl'), MOCK_EXP_COOKIE, toDeadline);
86
182
  }
87
- }
88
- await next();
89
- };
183
+ await next();
184
+ };
185
+ }
90
186
  }