@cyberismo/backend 1.1.2 → 1.2.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 (301) hide show
  1. package/README.md +21 -0
  2. package/dist/app.js +19 -7
  3. package/dist/app.js.map +1 -1
  4. package/dist/auth/index.d.ts +1 -1
  5. package/dist/auth/index.js +1 -1
  6. package/dist/auth/index.js.map +1 -1
  7. package/dist/auth/keycloak.d.ts +2 -3
  8. package/dist/auth/keycloak.js +6 -0
  9. package/dist/auth/keycloak.js.map +1 -1
  10. package/dist/auth/mock.d.ts +12 -8
  11. package/dist/auth/mock.js +119 -31
  12. package/dist/auth/mock.js.map +1 -1
  13. package/dist/auth/types.d.ts +7 -1
  14. package/dist/domain/cards/index.js +11 -84
  15. package/dist/domain/cards/index.js.map +1 -1
  16. package/dist/domain/cards/lib.js +2 -11
  17. package/dist/domain/cards/lib.js.map +1 -1
  18. package/dist/domain/cards/schema.js +9 -3
  19. package/dist/domain/cards/schema.js.map +1 -1
  20. package/dist/domain/cards/service.d.ts +2 -5
  21. package/dist/domain/cards/service.js +8 -15
  22. package/dist/domain/cards/service.js.map +1 -1
  23. package/dist/domain/events/index.d.ts +15 -0
  24. package/dist/domain/events/index.js +94 -0
  25. package/dist/domain/events/index.js.map +1 -0
  26. package/dist/domain/events/lifetime.d.ts +14 -0
  27. package/dist/domain/events/lifetime.js +25 -0
  28. package/dist/domain/events/lifetime.js.map +1 -0
  29. package/dist/domain/events/project-events.d.ts +67 -0
  30. package/dist/domain/events/project-events.js +200 -0
  31. package/dist/domain/events/project-events.js.map +1 -0
  32. package/dist/domain/events/schema.d.ts +22 -0
  33. package/dist/domain/events/schema.js +20 -0
  34. package/dist/domain/events/schema.js.map +1 -0
  35. package/dist/domain/project/index.js +17 -5
  36. package/dist/domain/project/index.js.map +1 -1
  37. package/dist/domain/project/schema.d.ts +8 -0
  38. package/dist/domain/project/schema.js +34 -6
  39. package/dist/domain/project/schema.js.map +1 -1
  40. package/dist/domain/project/service.d.ts +9 -5
  41. package/dist/domain/project/service.js +22 -16
  42. package/dist/domain/project/service.js.map +1 -1
  43. package/dist/domain/projects/index.js +5 -1
  44. package/dist/domain/projects/index.js.map +1 -1
  45. package/dist/domain/resources/index.js +74 -2
  46. package/dist/domain/resources/index.js.map +1 -1
  47. package/dist/domain/resources/schema.d.ts +8 -2
  48. package/dist/domain/resources/schema.js +6 -1
  49. package/dist/domain/resources/schema.js.map +1 -1
  50. package/dist/domain/resources/service.d.ts +13 -1
  51. package/dist/domain/resources/service.js +45 -2
  52. package/dist/domain/resources/service.js.map +1 -1
  53. package/dist/domain/skills/index.d.ts +15 -0
  54. package/dist/domain/skills/index.js +52 -0
  55. package/dist/domain/skills/index.js.map +1 -0
  56. package/dist/domain/skills/schema.d.ts +16 -0
  57. package/dist/domain/skills/schema.js +18 -0
  58. package/dist/domain/skills/schema.js.map +1 -0
  59. package/dist/domain/skills/service.d.ts +14 -0
  60. package/dist/domain/skills/service.js +16 -0
  61. package/dist/domain/skills/service.js.map +1 -0
  62. package/dist/export.d.ts +3 -2
  63. package/dist/export.js +53 -38
  64. package/dist/export.js.map +1 -1
  65. package/dist/index.d.ts +1 -0
  66. package/dist/index.js +3 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/main.js +22 -7
  69. package/dist/main.js.map +1 -1
  70. package/dist/middleware/auth.d.ts +5 -0
  71. package/dist/middleware/auth.js +20 -4
  72. package/dist/middleware/auth.js.map +1 -1
  73. package/dist/middleware/commandManager.d.ts +2 -0
  74. package/dist/middleware/commandManager.js +1 -0
  75. package/dist/middleware/commandManager.js.map +1 -1
  76. package/dist/overlay.d.ts +45 -0
  77. package/dist/overlay.js +157 -0
  78. package/dist/overlay.js.map +1 -0
  79. package/dist/project-errors.d.ts +18 -0
  80. package/dist/project-errors.js +25 -0
  81. package/dist/project-errors.js.map +1 -0
  82. package/dist/project-registry.d.ts +9 -1
  83. package/dist/project-registry.js +37 -9
  84. package/dist/project-registry.js.map +1 -1
  85. package/dist/public/THIRD-PARTY.txt +528 -435
  86. package/dist/public/assets/__vite-browser-external-PaJ7c2l8.js +1 -0
  87. package/dist/public/assets/abnfDiagram-VCTEODGH-DB2dfOGe.js +1 -0
  88. package/dist/public/assets/architecture-7GRP2DOG-2V0X8hxt.js +1 -0
  89. package/dist/public/assets/architectureDiagram-5GKGNRK7-CRhUR2Ul.js +36 -0
  90. package/dist/public/assets/blockDiagram-I7D4REHJ-DJKsYF1v.js +129 -0
  91. package/dist/public/assets/c4Diagram-7LVT6UL2-BTwMzoAF.js +38 -0
  92. package/dist/public/assets/channel-C0JtPpMA.js +1 -0
  93. package/dist/public/assets/chunk-4HAMMTFA-DjjgrBsB.js +62 -0
  94. package/dist/public/assets/chunk-75Z2AOVW-CKqXRGJV.js +2 -0
  95. package/dist/public/assets/chunk-DU6HZSFF-iJGdiRt7.js +127 -0
  96. package/dist/public/assets/chunk-F27PBJKO-tDfs6zeO.js +1 -0
  97. package/dist/public/assets/chunk-FOHPRMQF-DzxwRta7.js +161 -0
  98. package/dist/public/assets/chunk-GMAD6QVW-DxHVEaGj.js +72 -0
  99. package/dist/public/assets/chunk-GVQU2GXP-AMxD4_Ta.js +1 -0
  100. package/dist/public/assets/{chunk-EX3LRPZG-Db0XYyxy.js → chunk-IMKFNOWR-0rz8QrYC.js} +2 -2
  101. package/dist/public/assets/chunk-L3NEJ4N5-BK3KAKMe.js +1 -0
  102. package/dist/public/assets/chunk-OSK3NFVY-B8MdrI_M.js +10 -0
  103. package/dist/public/assets/chunk-P2QGCYS3-D3J5AcHg.js +1 -0
  104. package/dist/public/assets/{chunk-VR4S4FIN-tUhbELKr.js → chunk-POPQ4Y6H-CsYg_XkK.js} +1 -1
  105. package/dist/public/assets/{chunk-HOUHSVGY-L35GPy9G.js → chunk-PWAF6VOD-D9cdEIZp.js} +1 -1
  106. package/dist/public/assets/chunk-SHT3W25Y-1jjokCf3.js +168 -0
  107. package/dist/public/assets/{chunk-MOJQB5TN-D1shKbMs.js → chunk-SVP7TREG-CIQMl7hl.js} +1 -1
  108. package/dist/public/assets/{chunk-V7JOEXUC-71b0ABpv.js → chunk-TICWLB2K-Ccsy2PYz.js} +3 -3
  109. package/dist/public/assets/chunk-XXDRQBXY-B7bWyHjt.js +1 -0
  110. package/dist/public/assets/classDiagram-ZZMXUADV-mWyXNAXi.js +1 -0
  111. package/dist/public/assets/classDiagram-v2-VYDZK3BY-mWyXNAXi.js +1 -0
  112. package/dist/public/assets/cose-bilkent-JH36ORCC-DPzc3Pv4.js +1 -0
  113. package/dist/public/assets/cynefin-OW5HDTMX-BIVDCYOU.js +1 -0
  114. package/dist/public/assets/cynefinDiagram-5FMLGOSQ-_V_nrIhD.js +62 -0
  115. package/dist/public/assets/cytoscape.esm-NgwPT4ez.js +321 -0
  116. package/dist/public/assets/dagre-C-rnJpZF.js +1 -0
  117. package/dist/public/assets/dagre-GXQ25YYZ-CJc0wc6f.js +4 -0
  118. package/dist/public/assets/diagram-S7CK7UJ4-25IjIKyo.js +30 -0
  119. package/dist/public/assets/diagram-UQ7AKVKN-C5VvsV7x.js +41 -0
  120. package/dist/public/assets/{diagram-FQU43EPY-DS-ryuRg.js → diagram-VSXAHHWV-Dw3rKVL_.js} +3 -3
  121. package/dist/public/assets/diagram-VX7I27RA-De_UQv8C.js +24 -0
  122. package/dist/public/assets/diagram-Z3DM3KII-Bd-65QQW.js +24 -0
  123. package/dist/public/assets/dist-BDCdLWk4.js +1 -0
  124. package/dist/public/assets/ebnfDiagram-PWID7BFC-CrxdET5U.js +1 -0
  125. package/dist/public/assets/erDiagram-RLTQ6QDP-BKo0Uyna.js +99 -0
  126. package/dist/public/assets/eventmodeling-NTZA5JFV-DKkAdJZd.js +1 -0
  127. package/dist/public/assets/flowDiagram-HODETNUW-CEE2wjdt.js +1 -0
  128. package/dist/public/assets/ganttDiagram-EL5Y4UJY-BHFn8vk0.js +292 -0
  129. package/dist/public/assets/gitGraph-4MIJSDKK-Bpvnb45u.js +1 -0
  130. package/dist/public/assets/{gitGraphDiagram-IHSO6WYX-CksvJvsQ.js → gitGraphDiagram-WWUBYQGX-Bw0EoxBY.js} +9 -9
  131. package/dist/public/assets/index-D3HS7YxF.js +2228 -0
  132. package/dist/public/assets/index-D6WqGtsG.js +27876 -0
  133. package/dist/public/assets/{index-COSSLZqt.css → index-Sv3WxZ_8.css} +1 -1
  134. package/dist/public/assets/info-A6RAGUB7-BvvG_zrk.js +1 -0
  135. package/dist/public/assets/infoDiagram-27XIBGKW-CtpdJmtL.js +2 -0
  136. package/dist/public/assets/{ishikawaDiagram-FXEZZL3T-CiLpASIW.js → ishikawaDiagram-5VMMS53U-KvT4DU1u.js} +2 -2
  137. package/dist/public/assets/journeyDiagram-3NMN7TZE-PhGRkXkq.js +139 -0
  138. package/dist/public/assets/{kanban-definition-HUTT4EX6-DYP_x6zD.js → kanban-definition-UXKFOSKX-Oyx5QgRq.js} +4 -4
  139. package/dist/public/assets/{katex-DolUETbr.js → katex-ZlcWpGUi.js} +3 -3
  140. package/dist/public/assets/{line-C8Sfsgt8.js → line-Dr41HTk1.js} +1 -1
  141. package/dist/public/assets/linear-DDBi9FwZ.js +1 -0
  142. package/dist/public/assets/mermaid-parser.core-DsIAxDBa.js +7 -0
  143. package/dist/public/assets/{mindmap-definition-LN4V7U3C-3IAd4gp3.js → mindmap-definition-YA3MSWOX-r8hvd6gP.js} +1 -1
  144. package/dist/public/assets/packet-AYTQ26CC-B0EpJ2Sc.js +1 -0
  145. package/dist/public/assets/path-B_0haWDX.js +1 -0
  146. package/dist/public/assets/pegDiagram-XKGWAZYB-DaNkQTQF.js +1 -0
  147. package/dist/public/assets/pie-WAS4IAKB-Dt2zttL9.js +1 -0
  148. package/dist/public/assets/pieDiagram-E7YTZNPT-x0XWEGbd.js +39 -0
  149. package/dist/public/assets/{quadrantDiagram-ABIIQ3AL-B3czMbdS.js → quadrantDiagram-AXDQQJYC-B9dlNtZl.js} +3 -3
  150. package/dist/public/assets/radar-RG4KPBEZ-DjbR4-5l.js +1 -0
  151. package/dist/public/assets/railroad-74A4TZTK-Bk3B5r_R.js +1 -0
  152. package/dist/public/assets/railroad-abnf-HS5TGJTU-DxaWfACD.js +1 -0
  153. package/dist/public/assets/railroad-ebnf-LZEXJU2U-DscxXZO0.js +1 -0
  154. package/dist/public/assets/railroad-peg-WCYAUIDC-BCWzRFzw.js +1 -0
  155. package/dist/public/assets/railroadDiagram-O6MQD6OU-DhwsoX6A.js +1 -0
  156. package/dist/public/assets/{requirementDiagram-TGXJPOKE-CmvJWy_S.js → requirementDiagram-BXWQKSXE-BiqZ6axf.js} +2 -2
  157. package/dist/public/assets/rolldown-runtime-B0Z9INg1.js +1 -0
  158. package/dist/public/assets/{rough.esm-By172zw-.js → rough.esm-Dy-Kn_BL.js} +1 -1
  159. package/dist/public/assets/{sankeyDiagram-HTMAVEWB-tAeOzMTn.js → sankeyDiagram-P5KCCOFB-C4rb2pZ9.js} +1 -1
  160. package/dist/public/assets/{sequenceDiagram-DBY2YBRQ-r0pwijM4.js → sequenceDiagram-WJ2MYXX4-DRKTnGD7.js} +9 -9
  161. package/dist/public/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
  162. package/dist/public/assets/src-an_qrnIj.js +1 -0
  163. package/dist/public/assets/stateDiagram-D77RDMKH-xxdybg5Z.js +1 -0
  164. package/dist/public/assets/stateDiagram-v2-MP3YSRHH-CXzmJy_a.js +1 -0
  165. package/dist/public/assets/swimlanes-42K2YHIH-DyGI1gI6.js +1 -0
  166. package/dist/public/assets/swimlanesDiagram-VR7AAH4N-7hqb6VoW.js +8 -0
  167. package/dist/public/assets/timeline-definition-24CTP7MA-C2pIp77Q.js +120 -0
  168. package/dist/public/assets/treeView-Q6P3EWNA-CxRtaaB8.js +1 -0
  169. package/dist/public/assets/treemap-WGGIJYW6-G1IHiwTa.js +1 -0
  170. package/dist/public/assets/{vennDiagram-L72KCM5P-ti2qNcvo.js → vennDiagram-4TSXK5OY-CwimQRR9.js} +2 -2
  171. package/dist/public/assets/wardley-WFR3VGLG-DkQ3TjZX.js +1 -0
  172. package/dist/public/assets/{wardleyDiagram-EHGQE667-C8lblm8x.js → wardleyDiagram-VM6X3IG4-BOXpwLCv.js} +15 -15
  173. package/dist/public/assets/{xychartDiagram-FW5EYKEG-US-_k5eu.js → xychartDiagram-S5SC5T6Z-ChOPYsHc.js} +3 -3
  174. package/dist/public/index.html +19 -26
  175. package/dist/public/sbom.cdx.json +1 -0
  176. package/package.json +12 -13
  177. package/src/app.ts +19 -7
  178. package/src/auth/index.ts +1 -1
  179. package/src/auth/keycloak.ts +8 -3
  180. package/src/auth/mock.ts +141 -35
  181. package/src/auth/types.ts +8 -1
  182. package/src/domain/cards/index.ts +12 -102
  183. package/src/domain/cards/lib.ts +2 -14
  184. package/src/domain/cards/schema.ts +11 -3
  185. package/src/domain/cards/service.ts +9 -24
  186. package/src/domain/events/index.ts +112 -0
  187. package/src/domain/events/lifetime.ts +27 -0
  188. package/src/domain/events/project-events.ts +254 -0
  189. package/src/domain/events/schema.ts +21 -0
  190. package/src/domain/project/index.ts +31 -3
  191. package/src/domain/project/schema.ts +39 -6
  192. package/src/domain/project/service.ts +42 -17
  193. package/src/domain/projects/index.ts +5 -1
  194. package/src/domain/resources/index.ts +85 -2
  195. package/src/domain/resources/schema.ts +12 -2
  196. package/src/domain/resources/service.ts +55 -3
  197. package/src/domain/skills/index.ts +61 -0
  198. package/src/domain/skills/schema.ts +19 -0
  199. package/src/domain/skills/service.ts +18 -0
  200. package/src/export.ts +60 -42
  201. package/src/index.ts +3 -0
  202. package/src/main.ts +26 -8
  203. package/src/middleware/auth.ts +23 -4
  204. package/src/middleware/commandManager.ts +3 -0
  205. package/src/overlay.ts +175 -0
  206. package/src/project-errors.ts +33 -0
  207. package/src/project-registry.ts +41 -10
  208. package/dist/domain/cards/presence.d.ts +0 -50
  209. package/dist/domain/cards/presence.js +0 -93
  210. package/dist/domain/cards/presence.js.map +0 -1
  211. package/dist/public/assets/abnfDiagram-VRR7QNED-Djr4KJ5E.js +0 -1
  212. package/dist/public/assets/arc-DrR4k_H-.js +0 -1
  213. package/dist/public/assets/architecture-TIHT7OUA-XL6N-4o9.js +0 -1
  214. package/dist/public/assets/architectureDiagram-ZJ3FMSHR-DsMU2Uwa.js +0 -36
  215. package/dist/public/assets/blockDiagram-677ZJIJ3-DRBmQUQJ.js +0 -132
  216. package/dist/public/assets/c4Diagram-LMCZKHZV-E0rM02LD.js +0 -10
  217. package/dist/public/assets/channel-D5fnImJy.js +0 -1
  218. package/dist/public/assets/chunk-32BRIVSS-BnDY0aSV.js +0 -1
  219. package/dist/public/assets/chunk-52WLFC77-N5YugKaZ.js +0 -10
  220. package/dist/public/assets/chunk-5FCAYU7R-I3_t_Ic_.js +0 -1
  221. package/dist/public/assets/chunk-5HE753X5-Dxz40rzH.js +0 -1
  222. package/dist/public/assets/chunk-5JV3BV7I-CNwCKRLH.js +0 -1
  223. package/dist/public/assets/chunk-5TONJI2A-ezWQ_Z2j.js +0 -2
  224. package/dist/public/assets/chunk-7BUUIJ7U-Bb538aSH.js +0 -1
  225. package/dist/public/assets/chunk-BIQX33UG-DS132-R_.js +0 -1
  226. package/dist/public/assets/chunk-C7G6YPKG-BN-cNjoj.js +0 -1
  227. package/dist/public/assets/chunk-CQNSW5MT-D8Mn1I73.js +0 -1
  228. package/dist/public/assets/chunk-CYSBUYHQ-Dc64Dwdo.js +0 -1
  229. package/dist/public/assets/chunk-EMLP6XTP-aIK0V8GX.js +0 -1
  230. package/dist/public/assets/chunk-FWX5IMBZ-BF_P2-Do.js +0 -2
  231. package/dist/public/assets/chunk-ICXQ74PX-Bb8zaHde.js +0 -2
  232. package/dist/public/assets/chunk-JG7HCLWE-BtAXK3iQ.js +0 -2
  233. package/dist/public/assets/chunk-KEIR6QF5-DEvma7oi.js +0 -161
  234. package/dist/public/assets/chunk-MOZMSUNE-5FIqIBsY.js +0 -1
  235. package/dist/public/assets/chunk-OGEWGWER-BVIFy9xz.js +0 -1
  236. package/dist/public/assets/chunk-OSBZ3O6U-Cfd7kf1R.js +0 -1
  237. package/dist/public/assets/chunk-PUDLZKDR-Db3FSNR9.js +0 -156
  238. package/dist/public/assets/chunk-Q4XR5HBZ-BuKFRUzR.js +0 -70
  239. package/dist/public/assets/chunk-QBLGF6JB-DUGZXFh-.js +0 -1
  240. package/dist/public/assets/chunk-R7FJI6CG-D7mUd-qN.js +0 -1
  241. package/dist/public/assets/chunk-RYQCIY6F-C_3rESBd.js +0 -1
  242. package/dist/public/assets/chunk-U6XO7XAA-C3UhlwA1.js +0 -2
  243. package/dist/public/assets/chunk-VAUOI2AC-C-GBw18h.js +0 -1
  244. package/dist/public/assets/chunk-WYO6CB5R-BQoO62-B.js +0 -127
  245. package/dist/public/assets/chunk-XXDRQBXY-Co8n4ZHT.js +0 -1
  246. package/dist/public/assets/chunk-YOTPTUD7-DhCRKU1A.js +0 -1
  247. package/dist/public/assets/chunk-ZGVPDNZ5-hpz2Ryq5.js +0 -62
  248. package/dist/public/assets/chunk-ZIRB5QZD-BpeS1aZ7.js +0 -32
  249. package/dist/public/assets/classDiagram-OUVF2IWQ-CXdVorPK.js +0 -1
  250. package/dist/public/assets/classDiagram-v2-EOCWNBFH-CXdVorPK.js +0 -1
  251. package/dist/public/assets/colors-Cg5Vh3br.js +0 -1
  252. package/dist/public/assets/cose-bilkent-JH36ORCC-4GoRbloS.js +0 -1
  253. package/dist/public/assets/cynefin-VYW2F7L2-BPH-25fI.js +0 -1
  254. package/dist/public/assets/cynefinDiagram-TSTJHNR4-PEf16euv.js +0 -62
  255. package/dist/public/assets/cytoscape.esm-C3UvhD5t.js +0 -321
  256. package/dist/public/assets/dagre-Buvkdvvj.js +0 -1
  257. package/dist/public/assets/dagre-VKFMJZFB-DPsCMBF1.js +0 -4
  258. package/dist/public/assets/diagram-G47NLZAW-CzUoYkFf.js +0 -24
  259. package/dist/public/assets/diagram-NH7WQ7WH-MhGnE2fh.js +0 -24
  260. package/dist/public/assets/diagram-OA4YK3LP-CsQ9aFR_.js +0 -30
  261. package/dist/public/assets/diagram-WEI45ONY-Er3q49ew.js +0 -41
  262. package/dist/public/assets/dist-BzwexiH1.js +0 -1
  263. package/dist/public/assets/ebnfDiagram-CCIWWBDH-AnJAsk14.js +0 -1
  264. package/dist/public/assets/erDiagram-Q63AITRT-DulA16my.js +0 -85
  265. package/dist/public/assets/eventmodeling-45OFAUF4-CoIhTpHU.js +0 -1
  266. package/dist/public/assets/flowDiagram-23GEKE2U-BGMXUq18.js +0 -1
  267. package/dist/public/assets/ganttDiagram-NO4QXBWP-DAvCPT7_.js +0 -292
  268. package/dist/public/assets/gitGraph-TEB2WS4Q-BcPsZts5.js +0 -1
  269. package/dist/public/assets/index-Y8Ckwau7.js +0 -447
  270. package/dist/public/assets/info-DKCQHKI2-7VGzrAVB.js +0 -1
  271. package/dist/public/assets/infoDiagram-FWYZ7A6U-D_by7lSL.js +0 -2
  272. package/dist/public/assets/journeyDiagram-5HDEW3XC-DpvFmk7c.js +0 -139
  273. package/dist/public/assets/linear-BWTvbP1l.js +0 -1
  274. package/dist/public/assets/map-BaFkSB1l.js +0 -1
  275. package/dist/public/assets/mermaid-parser.core--8614tkK.js +0 -4
  276. package/dist/public/assets/ordinal-BdBDtYTt.js +0 -1
  277. package/dist/public/assets/packet-7NZHBO7P-KYt33H0C.js +0 -1
  278. package/dist/public/assets/path-HTXttWil.js +0 -1
  279. package/dist/public/assets/pegDiagram-2B236MQR-BQNFxYz2.js +0 -1
  280. package/dist/public/assets/pie-RZYD4A2V-xKz9s9I4.js +0 -1
  281. package/dist/public/assets/pieDiagram-ENE6RG2P-Cy13tg8_.js +0 -39
  282. package/dist/public/assets/radar-I7S5WNFK-B4QTX-fX.js +0 -1
  283. package/dist/public/assets/railroad-3IZDKUUU-Co_9rPVC.js +0 -1
  284. package/dist/public/assets/railroad-abnf-AHOZXSZD-Bhy_c3ol.js +0 -1
  285. package/dist/public/assets/railroad-ebnf-EBAXGLYW-B9ENjG34.js +0 -1
  286. package/dist/public/assets/railroad-peg-LSFZ7HO6-CyJxDBsB.js +0 -1
  287. package/dist/public/assets/railroadDiagram-RFXS5EU6-M2j5SJF2.js +0 -1
  288. package/dist/public/assets/range-EplFIxc7.js +0 -1
  289. package/dist/public/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +0 -1
  290. package/dist/public/assets/src-DOh7_en_.js +0 -1
  291. package/dist/public/assets/stateDiagram-2N3HPSRC-a9IdkSQG.js +0 -1
  292. package/dist/public/assets/stateDiagram-v2-6OUMAXLB-s2blPtZ-.js +0 -1
  293. package/dist/public/assets/swimlanes-5IMT3BWC-5w0Cdxk6.js +0 -2
  294. package/dist/public/assets/swimlanesDiagram-G3AALYLV-BWa-KRed.js +0 -8
  295. package/dist/public/assets/time-BM2d9MsQ.js +0 -1
  296. package/dist/public/assets/timeline-definition-FHXFAJF6-CvXlv_4Y.js +0 -120
  297. package/dist/public/assets/treeView-QDETBFTQ-B9cxjfpB.js +0 -1
  298. package/dist/public/assets/treemap-6X3UGDF4-BplEq4hB.js +0 -1
  299. package/dist/public/assets/treemap-BfjIY-m6.js +0 -1
  300. package/dist/public/assets/wardley-OPB4EBWU-BX2ghg5e.js +0 -1
  301. package/src/domain/cards/presence.ts +0 -124
package/README.md CHANGED
@@ -1 +1,22 @@
1
1
  Hono backend server for [Cyberismo Solution](https://cyberismo.com/solution)
2
+
3
+ ## Mock identities
4
+
5
+ With `AUTH_MODE=mock` the roster is on: alice (Admin), bob (Editor) and carol
6
+ (Reader). `?user=<name>` sets a `mock-user` cookie and `?role=<role>` a
7
+ `mock-role` cookie, both sticky until `=default` clears them; the cookie is
8
+ per browser profile, so a tab cannot outrank the profile it lives in.
9
+ `?as=<name>` names a roster identity for that one request without touching
10
+ either cookie, which is how a second participant is scripted from a tab
11
+ already signed in as someone else; being a one-shot identity rather than the
12
+ tab's session, it is not subject to that expiry. `?ttl=<seconds>` gives
13
+ the session an expiry, which is how rotation and the 401 after it can be
14
+ watched without waiting out the default stream lifetime; `?ttl=default`
15
+ clears it. `?user=`, `?as=` and `?ttl=` all need the roster, so `cyberismo app`
16
+ sessions can neither switch identity nor expire; `?role=` works either way.
17
+
18
+ Locally: `pnpm dev`, then visit `/api/auth/me?user=alice` and `?user=bob` in
19
+ separate browser profiles, reloading the app after a change. In one profile,
20
+ open the app as Alice and drive Bob from the console with `?as=bob`: his SSE
21
+ stream yields a `connectionId`, and `PUT .../events/presence?as=bob` or
22
+ `PATCH .../cards/:key?as=bob` then shows up in Alice's tab.
package/dist/app.js CHANGED
@@ -18,11 +18,13 @@ import calculationsRouter from './domain/calculations/index.js';
18
18
  import cardsRouter from './domain/cards/index.js';
19
19
  import cardTypesRouter from './domain/cardTypes/index.js';
20
20
  import connectorsRouter from './domain/connectors/index.js';
21
+ import eventsRouter from './domain/events/index.js';
21
22
  import fieldTypesRouter from './domain/fieldTypes/index.js';
22
23
  import graphModelsRouter from './domain/graphModels/index.js';
23
24
  import graphViewsRouter from './domain/graphViews/index.js';
24
25
  import linkTypesRouter from './domain/linkTypes/index.js';
25
26
  import reportsRouter from './domain/reports/index.js';
27
+ import skillsRouter from './domain/skills/index.js';
26
28
  import templatesRouter from './domain/templates/index.js';
27
29
  import treeRouter from './domain/tree/index.js';
28
30
  import workflowsRouter from './domain/workflows/index.js';
@@ -37,9 +39,10 @@ import { isSSGContext } from 'hono/ssg';
37
39
  import treeMiddleware from './middleware/tree.js';
38
40
  import projectRouter from './domain/project/index.js';
39
41
  import { createMcpRouter } from './domain/mcp/index.js';
42
+ import { writableProjects } from './overlay.js';
40
43
  import { createAuthRouter } from './domain/auth/index.js';
41
44
  import { createAuthMiddleware } from './middleware/auth.js';
42
- import { MockAuthProvider, mockRoleCookieMiddleware } from './auth/mock.js';
45
+ import { MockAuthProvider } from './auth/mock.js';
43
46
  import { CommandManager, scanForProjects } from '@cyberismo/data-handler';
44
47
  import { createProjectsRouter } from './domain/projects/index.js';
45
48
  import { simpleMcpAuthRouter } from '@hono/mcp';
@@ -53,11 +56,13 @@ function createProjectScopedRoutes(middleware) {
53
56
  projectScoped.route('/cards', cardsRouter);
54
57
  projectScoped.route('/cardTypes', cardTypesRouter);
55
58
  projectScoped.route('/connectors', connectorsRouter);
59
+ projectScoped.route('/events', eventsRouter);
56
60
  projectScoped.route('/fieldTypes', fieldTypesRouter);
57
61
  projectScoped.route('/graphModels', graphModelsRouter);
58
62
  projectScoped.route('/graphViews', graphViewsRouter);
59
63
  projectScoped.route('/linkTypes', linkTypesRouter);
60
64
  projectScoped.route('/reports', reportsRouter);
65
+ projectScoped.route('/skills', skillsRouter);
61
66
  projectScoped.route('/templates', templatesRouter);
62
67
  projectScoped.route('/tree', treeRouter);
63
68
  projectScoped.route('/workflows', workflowsRouter);
@@ -90,14 +95,14 @@ export function createApp(authProvider, registry, opts, exportMode = false, mult
90
95
  return c.json({
91
96
  staticMode: exportMode,
92
97
  logoutUrl: process.env.APP_LOGOUT_URL || '',
93
- presenceEnabled: process.env.APP_PRESENCE_ENABLED === 'true',
94
98
  defaultProject: process.env.CYBERISMO_DEFAULT_PROJECT || undefined,
99
+ extensionUrl: process.env.APP_EXTENSION_URL || undefined,
95
100
  });
96
101
  });
97
- // Dev-only: let `?role=<reader|editor|admin>` set a persistent mock-role cookie
98
- // so role gating can be exercised locally without code changes or a restart.
102
+ // Mock-auth only: let `?role=` and, with the roster on, `?user=` set persistent
103
+ // cookies so role gating and identity can be switched locally without a restart.
99
104
  if (authProvider instanceof MockAuthProvider) {
100
- app.use(mockRoleCookieMiddleware());
105
+ app.use(authProvider.cookieMiddleware());
101
106
  }
102
107
  // Apply authentication middleware to all API and MCP routes
103
108
  app.use('/api/*', createAuthMiddleware(authProvider));
@@ -129,7 +134,14 @@ export function createApp(authProvider, registry, opts, exportMode = false, mult
129
134
  error: `Refusing to reset suspicious project path: ${resolvedProject}`,
130
135
  }, 400);
131
136
  }
132
- await fs.rm(resolvedProject, { recursive: true, force: true });
137
+ // Windows holds transient locks on files the server has just touched,
138
+ // which surface as EBUSY on the final rmdir. Retry rather than fail the reset.
139
+ await fs.rm(resolvedProject, {
140
+ recursive: true,
141
+ force: true,
142
+ maxRetries: 5,
143
+ retryDelay: 100,
144
+ });
133
145
  await fs.cp(goldenPath, resolvedProject, { recursive: true });
134
146
  const projects = await scanForProjects(resolvedProject);
135
147
  if (projects.length === 0) {
@@ -173,7 +185,7 @@ export function createApp(authProvider, registry, opts, exportMode = false, mult
173
185
  app.route('/api/projects/:prefix', scoped);
174
186
  }
175
187
  // MCP endpoint for AI assistant integration
176
- app.route('/mcp', createMcpRouter(registry));
188
+ app.route('/mcp', createMcpRouter(writableProjects(registry)));
177
189
  app.use('*', serveStatic({
178
190
  root: staticFrontendDirRelative,
179
191
  }));
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,6 @@
11
11
  License along with this program. If not, see <https://www.gnu.org/licenses/>.
12
12
  */
13
13
  export type { AuthProvider } from './types.js';
14
- export { MockAuthProvider, mockRoleCookieMiddleware } from './mock.js';
14
+ export { MockAuthProvider } from './mock.js';
15
15
  export { KeycloakAuthProvider } from './keycloak.js';
16
16
  export type { KeycloakConfig } from './keycloak.js';
@@ -10,6 +10,6 @@
10
10
  You should have received a copy of the GNU Affero General Public
11
11
  License along with this program. If not, see <https://www.gnu.org/licenses/>.
12
12
  */
13
- export { MockAuthProvider, mockRoleCookieMiddleware } from './mock.js';
13
+ export { MockAuthProvider } from './mock.js';
14
14
  export { KeycloakAuthProvider } from './keycloak.js';
15
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAGF,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAGF,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC"}
@@ -10,8 +10,7 @@
10
10
  You should have received a copy of the GNU Affero General Public
11
11
  License along with this program. If not, see <https://www.gnu.org/licenses/>.
12
12
  */
13
- import type { UserInfo } from '../types.js';
14
- import type { AuthProvider } from './types.js';
13
+ import type { AuthProvider, AuthResult } from './types.js';
15
14
  export interface KeycloakConfig {
16
15
  issuer: string;
17
16
  audience: string;
@@ -22,6 +21,6 @@ export declare class KeycloakAuthProvider implements AuthProvider {
22
21
  private jwks;
23
22
  constructor(config: KeycloakConfig);
24
23
  private getJWKS;
25
- authenticate(req: Request): Promise<UserInfo | null>;
24
+ authenticate(req: Request): Promise<AuthResult | null>;
26
25
  private mapRole;
27
26
  }
@@ -50,11 +50,17 @@ export class KeycloakAuthProvider {
50
50
  if (!claims.email) {
51
51
  throw new Error('Missing email');
52
52
  }
53
+ // Optional in RFC 7519, and jwtVerify only checks it when present, so a
54
+ // token without one would rotate on jitter alone and never clamp.
55
+ if (!claims.exp) {
56
+ throw new Error('Missing exp');
57
+ }
53
58
  return {
54
59
  id: claims.sub,
55
60
  email: claims.email,
56
61
  name: claims.name ?? claims.preferred_username ?? 'Unknown',
57
62
  role,
63
+ exp: claims.exp,
58
64
  };
59
65
  }
60
66
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"keycloak.js","sourceRoot":"","sources":["../../src/auth/keycloak.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keycloak.js","sourceRoot":"","sources":["../../src/auth/keycloak.ts"],"names":[],"mappings":"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"}
@@ -11,20 +11,24 @@
11
11
  License along with this program. If not, see <https://www.gnu.org/licenses/>.
12
12
  */
13
13
  import type { MiddlewareHandler } from 'hono';
14
- import type { UserInfo } from '../types.js';
15
- import type { AuthProvider } from './types.js';
14
+ import type { AuthProvider, AuthResult } from './types.js';
16
15
  export interface MockUserConfig {
17
16
  name?: string;
18
17
  email?: string;
18
+ roster?: boolean;
19
19
  }
20
20
  export declare const MOCK_ROLE_COOKIE = "mock-role";
21
+ export declare const MOCK_USER_COOKIE = "mock-user";
22
+ export declare const MOCK_EXP_COOKIE = "mock-exp";
23
+ export declare const MOCK_AS_PARAM = "as";
21
24
  export declare class MockAuthProvider implements AuthProvider {
22
25
  private readonly userConfig;
23
26
  constructor(config?: MockUserConfig);
24
- authenticate(req: Request): Promise<UserInfo>;
27
+ authenticate(req: Request): Promise<AuthResult | null>;
28
+ /**
29
+ * Turns ?role= and, with the roster on, ?user= and ?ttl= into cookies;
30
+ * "default" clears. ?ttl= seconds gives the session an expiry, which is
31
+ * what drives stream rotation and the 401 that follows it.
32
+ */
33
+ cookieMiddleware(): MiddlewareHandler;
25
34
  }
26
- /**
27
- * Dev-only middleware that turns `?role=<reader|editor|admin>` into a persistent
28
- * `mock-role` cookie, and clears it on `?role=default`.
29
- */
30
- export declare function mockRoleCookieMiddleware(): MiddlewareHandler;
package/dist/auth/mock.js CHANGED
@@ -13,17 +13,80 @@
13
13
  import { setCookie } from 'hono/cookie';
14
14
  import { UserRole } from '../types.js';
15
15
  export const MOCK_ROLE_COOKIE = 'mock-role';
16
- const ROLE_RESET_VALUE = 'default';
17
- const ROLE_ALIASES = {
18
- reader: UserRole.Reader,
19
- editor: UserRole.Editor,
20
- admin: UserRole.Admin,
21
- connector: UserRole.Connector,
22
- };
16
+ export const MOCK_USER_COOKIE = 'mock-user';
17
+ export const MOCK_EXP_COOKIE = 'mock-exp';
18
+ export const MOCK_AS_PARAM = 'as';
19
+ const RESET_VALUE = 'default';
20
+ const MAX_TTL_SECONDS = 86_400;
21
+ // Mock sessions do not expire. Saying so with a distant deadline rather than
22
+ // no deadline keeps `exp` total for every consumer: it is far beyond the
23
+ // 30-minute stream lifetime, so computeLifetimeMs() min()s it away and
24
+ // rotation still falls to the jitter, exactly as an absent one did.
25
+ const NO_EXPIRY_SECONDS = 100 * 365 * 24 * 60 * 60;
26
+ function noExpiry() {
27
+ return Math.floor(Date.now() / 1000) + NO_EXPIRY_SECONDS;
28
+ }
29
+ const ROLE_ALIASES = new Map([
30
+ ['reader', UserRole.Reader],
31
+ ['editor', UserRole.Editor],
32
+ ['admin', UserRole.Admin],
33
+ ['connector', UserRole.Connector],
34
+ ]);
35
+ // Opt-in: `cyberismo app` ships mock auth, where a roster identity would forge
36
+ // git commit authorship. Dev and e2e need several users in one backend process.
37
+ const MOCK_USERS = new Map([
38
+ [
39
+ 'alice',
40
+ {
41
+ id: 'mock-user-alice',
42
+ name: 'Alice',
43
+ email: 'alice@example.com',
44
+ role: UserRole.Admin,
45
+ },
46
+ ],
47
+ [
48
+ 'bob',
49
+ {
50
+ id: 'mock-user-bob',
51
+ name: 'Bob',
52
+ email: 'bob@example.com',
53
+ role: UserRole.Editor,
54
+ },
55
+ ],
56
+ [
57
+ 'carol',
58
+ {
59
+ id: 'mock-user-carol',
60
+ name: 'Carol',
61
+ email: 'carol@example.com',
62
+ role: UserRole.Reader,
63
+ },
64
+ ],
65
+ ]);
23
66
  function parseRole(value) {
24
67
  if (!value)
25
68
  return null;
26
- return ROLE_ALIASES[value.toLowerCase()] ?? null;
69
+ return ROLE_ALIASES.get(value.toLowerCase()) ?? null;
70
+ }
71
+ function parseUser(value) {
72
+ if (!value)
73
+ return null;
74
+ return MOCK_USERS.get(value.toLowerCase()) ?? null;
75
+ }
76
+ /** An unreadable deadline is dropped rather than treated as long past, which
77
+ * would lock the user out with no request left to clear the cookie. */
78
+ function parseExpiry(value) {
79
+ const exp = Number(value);
80
+ return value && Number.isInteger(exp) && exp > 0 ? exp : null;
81
+ }
82
+ /** Seconds from now to the absolute epoch-second deadline to store. */
83
+ function toDeadline(value) {
84
+ const seconds = Number(value);
85
+ if (!Number.isInteger(seconds) || seconds <= 0)
86
+ return null;
87
+ if (seconds > MAX_TTL_SECONDS)
88
+ return null;
89
+ return String(Math.floor(Date.now() / 1000) + seconds);
27
90
  }
28
91
  function readCookie(header, name) {
29
92
  if (!header)
@@ -38,40 +101,65 @@ function readCookie(header, name) {
38
101
  }
39
102
  return undefined;
40
103
  }
104
+ function applyOverride(c, override, cookieName, toCookieValue) {
105
+ if (!override)
106
+ return;
107
+ if (override.toLowerCase() === RESET_VALUE) {
108
+ setCookie(c, cookieName, '', { path: '/', maxAge: 0 });
109
+ return;
110
+ }
111
+ const value = toCookieValue(override);
112
+ if (value === null)
113
+ return;
114
+ setCookie(c, cookieName, value, { path: '/', sameSite: 'Lax' });
115
+ }
41
116
  export class MockAuthProvider {
42
117
  userConfig;
43
118
  constructor(config) {
44
119
  this.userConfig = config ?? {};
45
120
  }
46
121
  async authenticate(req) {
47
- const cookieRole = parseRole(readCookie(req.headers.get('cookie'), MOCK_ROLE_COOKIE));
48
- return {
122
+ const cookies = req.headers.get('cookie');
123
+ const cookieRole = parseRole(readCookie(cookies, MOCK_ROLE_COOKIE));
124
+ if (this.userConfig.roster) {
125
+ // One-shot: a second identity from inside a tab already signed in as
126
+ // someone else, so neither the cookie nor the role override applies.
127
+ const asUser = parseUser(new URL(req.url).searchParams.get(MOCK_AS_PARAM));
128
+ if (asUser)
129
+ return { ...asUser, exp: noExpiry() };
130
+ }
131
+ const rosterUser = this.userConfig.roster
132
+ ? parseUser(readCookie(cookies, MOCK_USER_COOKIE))
133
+ : null;
134
+ const expiry = this.userConfig.roster
135
+ ? parseExpiry(readCookie(cookies, MOCK_EXP_COOKIE))
136
+ : null;
137
+ if (expiry !== null && expiry * 1000 <= Date.now())
138
+ return null;
139
+ const exp = expiry ?? noExpiry();
140
+ const identity = rosterUser ?? {
49
141
  id: 'mock-user',
50
142
  email: this.userConfig.email ?? 'admin@cyberismo.local',
51
143
  name: this.userConfig.name ?? 'Local Admin',
52
- role: cookieRole ?? UserRole.Admin,
144
+ role: UserRole.Admin,
53
145
  };
146
+ return { ...identity, role: cookieRole ?? identity.role, exp };
54
147
  }
55
- }
56
- /**
57
- * Dev-only middleware that turns `?role=<reader|editor|admin>` into a persistent
58
- * `mock-role` cookie, and clears it on `?role=default`.
59
- */
60
- export function mockRoleCookieMiddleware() {
61
- return async (c, next) => {
62
- const override = new URL(c.req.url).searchParams.get('role');
63
- if (override) {
64
- if (override.toLowerCase() === ROLE_RESET_VALUE) {
65
- setCookie(c, MOCK_ROLE_COOKIE, '', { path: '/', maxAge: 0 });
148
+ /**
149
+ * Turns ?role= and, with the roster on, ?user= and ?ttl= into cookies;
150
+ * "default" clears. ?ttl= seconds gives the session an expiry, which is
151
+ * what drives stream rotation and the 401 that follows it.
152
+ */
153
+ cookieMiddleware() {
154
+ return async (c, next) => {
155
+ const params = new URL(c.req.url).searchParams;
156
+ applyOverride(c, params.get('role'), MOCK_ROLE_COOKIE, (value) => parseRole(value) ? value.toLowerCase() : null);
157
+ if (this.userConfig.roster) {
158
+ applyOverride(c, params.get('user'), MOCK_USER_COOKIE, (value) => parseUser(value) ? value.toLowerCase() : null);
159
+ applyOverride(c, params.get('ttl'), MOCK_EXP_COOKIE, toDeadline);
66
160
  }
67
- else if (parseRole(override)) {
68
- setCookie(c, MOCK_ROLE_COOKIE, override.toLowerCase(), {
69
- path: '/',
70
- sameSite: 'Lax',
71
- });
72
- }
73
- }
74
- await next();
75
- };
161
+ await next();
162
+ };
163
+ }
76
164
  }
77
165
  //# sourceMappingURL=mock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/auth/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAGF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AASvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAC5C,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAEnC,MAAM,YAAY,GAA6B;IAC7C,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;CAC9B,CAAC;AAEF,SAAS,SAAS,CAAC,KAAgC;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AACnD,CAAC;AAED,SAAS,UAAU,CAAC,MAAqB,EAAE,IAAY;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,SAAS;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI;YAAE,SAAS;QAChD,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,gBAAgB;IACV,UAAU,CAAiB;IAE5C,YAAY,MAAuB;QACjC,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAY;QAC7B,MAAM,UAAU,GAAG,SAAS,CAC1B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,CACxD,CAAC;QACF,OAAO;YACL,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,uBAAuB;YACvD,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,aAAa;YAC3C,IAAI,EAAE,UAAU,IAAI,QAAQ,CAAC,KAAK;SACnC,CAAC;IACJ,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,gBAAgB,EAAE,CAAC;gBAChD,SAAS,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;iBAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,SAAS,CAAC,CAAC,EAAE,gBAAgB,EAAE,QAAQ,CAAC,WAAW,EAAE,EAAE;oBACrD,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,KAAK;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/auth/mock.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,12 @@
11
11
  License along with this program. If not, see <https://www.gnu.org/licenses/>.
12
12
  */
13
13
  import type { UserInfo } from '../types.js';
14
+ export interface AuthResult extends UserInfo {
15
+ /** Credential deadline (epoch seconds). Always present: a provider whose
16
+ * sessions do not expire says so with a deadline far enough out to be
17
+ * inert, rather than leaving every consumer to handle its absence. */
18
+ exp: number;
19
+ }
14
20
  export interface AuthProvider {
15
- authenticate(req: Request): Promise<UserInfo | null>;
21
+ authenticate(req: Request): Promise<AuthResult | null>;
16
22
  }
@@ -11,16 +11,17 @@
11
11
  License along with this program. If not, see <https://www.gnu.org/licenses/>.
12
12
  */
13
13
  import { Hono } from 'hono';
14
- import { streamSSE } from 'hono/streaming';
15
14
  import { getCardDetails } from './lib.js';
16
15
  import * as cardService from './service.js';
17
16
  import { isSSGContext, ssgParams } from 'hono/ssg';
18
17
  import { UserRole } from '../../types.js';
19
- import { presenceStore } from './presence.js';
20
18
  import { requireRole } from '../../middleware/auth.js';
21
19
  import { zValidator } from '../../middleware/zvalidator.js';
22
20
  import { createLinkSchema, removeLinkSchema, updateLinkSchema, exportCardPdfSchema, } from './schema.js';
23
21
  const router = new Hono();
22
+ function notifyCardsUpdated(c, keys) {
23
+ c.get('events').cardsUpdated(keys, c.get('user'));
24
+ }
24
25
  /**
25
26
  * @swagger
26
27
  * /api/cards:
@@ -198,7 +199,9 @@ router.patch('/:key', requireRole(UserRole.Editor), async (c) => {
198
199
  const raw = c.req.query('raw');
199
200
  const body = await c.req.json();
200
201
  try {
201
- await cardService.updateCard(commands, key, body);
202
+ if (await cardService.updateCard(commands, key, body)) {
203
+ notifyCardsUpdated(c, [key]);
204
+ }
202
205
  const result = await getCardDetails(c.get('commands'), key, isSSGContext(c), raw?.toLowerCase() === 'true' ? true : false);
203
206
  if (result.status === 200) {
204
207
  return c.json(result.data);
@@ -332,6 +335,7 @@ router.post('/:key/attachments', requireRole(UserRole.Editor), async (c) => {
332
335
  return c.json({ error: 'No files uploaded' }, 400);
333
336
  }
334
337
  const result = await cardService.uploadAttachments(commands, key, files);
338
+ notifyCardsUpdated(c, [key]);
335
339
  return c.json(result);
336
340
  }
337
341
  catch (error) {
@@ -371,6 +375,7 @@ router.delete('/:key/attachments/:filename', requireRole(UserRole.Editor), async
371
375
  const { key, filename } = c.req.param();
372
376
  try {
373
377
  const result = await cardService.removeAttachment(commands, key, filename);
378
+ notifyCardsUpdated(c, [key]);
374
379
  return c.json(result);
375
380
  }
376
381
  catch (error) {
@@ -381,45 +386,6 @@ router.delete('/:key/attachments/:filename', requireRole(UserRole.Editor), async
381
386
  }, 500);
382
387
  }
383
388
  });
384
- /**
385
- * @swagger
386
- * /api/cards/{key}/attachments/{filename}/open:
387
- * post:
388
- * summary: Open an attachment using the system's default application
389
- * parameters:
390
- * - name: key
391
- * in: path
392
- * required: true
393
- * schema:
394
- * type: string
395
- * - name: filename
396
- * in: path
397
- * required: true
398
- * schema:
399
- * type: string
400
- * responses:
401
- * 200:
402
- * description: Attachment opened successfully
403
- * 400:
404
- * description: Invalid request
405
- * 500:
406
- * description: Server error
407
- */
408
- router.post('/:key/attachments/:filename/open', requireRole(UserRole.Reader), async (c) => {
409
- const commands = c.get('commands');
410
- const { key, filename } = c.req.param();
411
- try {
412
- const result = await cardService.openAttachment(commands, key, filename);
413
- return c.json(result);
414
- }
415
- catch (error) {
416
- return c.json({
417
- error: error instanceof Error
418
- ? error.message
419
- : 'Failed to open attachment',
420
- }, 500);
421
- }
422
- });
423
389
  /**
424
390
  * @swagger
425
391
  * /api/cards/{key}/parse:
@@ -501,6 +467,7 @@ router.post('/:key/links', requireRole(UserRole.Editor), zValidator('json', crea
501
467
  const { toCard, linkType, description, direction } = c.req.valid('json');
502
468
  try {
503
469
  const result = await cardService.createLink(commands, key, toCard, linkType, direction, description);
470
+ notifyCardsUpdated(c, [key, toCard]);
504
471
  return c.json(result);
505
472
  }
506
473
  catch (error) {
@@ -546,6 +513,7 @@ router.delete('/:key/links', requireRole(UserRole.Editor), zValidator('json', re
546
513
  const { toCard, linkType, description, direction } = c.req.valid('json');
547
514
  try {
548
515
  const result = await cardService.removeLink(commands, key, toCard, linkType, direction, description);
516
+ notifyCardsUpdated(c, [key, toCard]);
549
517
  return c.json(result);
550
518
  }
551
519
  catch (error) {
@@ -601,6 +569,7 @@ router.put('/:key/links', requireRole(UserRole.Editor), zValidator('json', updat
601
569
  const { toCard, linkType, description, direction, previousToCard, previousLinkType, previousDirection, previousDescription, } = c.req.valid('json');
602
570
  try {
603
571
  const result = await cardService.updateLink(commands, key, toCard, linkType, direction, previousToCard, previousLinkType, previousDirection, description, previousDescription);
572
+ notifyCardsUpdated(c, [key, toCard, previousToCard]);
604
573
  return c.json(result);
605
574
  }
606
575
  catch (error) {
@@ -663,47 +632,5 @@ router.get('/:key/a/:attachment', requireRole(UserRole.Reader), ssgParams(async
663
632
  }, 404);
664
633
  }
665
634
  });
666
- /**
667
- * @swagger
668
- * /api/cards/{key}/presence:
669
- * get:
670
- * summary: SSE stream of users currently viewing or editing this card
671
- * parameters:
672
- * - name: key
673
- * in: path
674
- * required: true
675
- * description: Card key (string)
676
- * - name: mode
677
- * in: query
678
- * required: false
679
- * schema:
680
- * type: string
681
- * enum: [viewing, editing]
682
- * description: Whether the user is viewing or editing (default: viewing)
683
- * responses:
684
- * 200:
685
- * description: SSE stream with presence events
686
- */
687
- router.get('/:key/presence', requireRole(UserRole.Reader), (c) => {
688
- const key = c.req.param('key');
689
- const mode = c.req.query('mode') === 'editing' ? 'editing' : 'viewing';
690
- const user = c.get('user');
691
- if (!key) {
692
- return c.text('No card key', 400);
693
- }
694
- return streamSSE(c, async (stream) => {
695
- const connId = presenceStore.add(key, user, mode, (data) => void stream.writeSSE(data));
696
- let aborted = false;
697
- stream.onAbort(() => {
698
- aborted = true;
699
- presenceStore.remove(key, connId);
700
- });
701
- // Keep connection alive with periodic heartbeat
702
- while (!aborted) {
703
- await stream.write(': hb\n\n');
704
- await stream.sleep(30000);
705
- }
706
- });
707
- });
708
635
  export default router;
709
636
  //# sourceMappingURL=index.js.map