@cyberismo/backend 1.1.1 → 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 (305) hide show
  1. package/README.md +21 -0
  2. package/dist/app.js +22 -11
  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 +23 -10
  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/dist/utils.d.ts +4 -0
  177. package/dist/utils.js +6 -0
  178. package/dist/utils.js.map +1 -1
  179. package/package.json +12 -13
  180. package/src/app.ts +22 -11
  181. package/src/auth/index.ts +1 -1
  182. package/src/auth/keycloak.ts +8 -3
  183. package/src/auth/mock.ts +141 -35
  184. package/src/auth/types.ts +8 -1
  185. package/src/domain/cards/index.ts +12 -102
  186. package/src/domain/cards/lib.ts +2 -14
  187. package/src/domain/cards/schema.ts +11 -3
  188. package/src/domain/cards/service.ts +9 -24
  189. package/src/domain/events/index.ts +112 -0
  190. package/src/domain/events/lifetime.ts +27 -0
  191. package/src/domain/events/project-events.ts +254 -0
  192. package/src/domain/events/schema.ts +21 -0
  193. package/src/domain/project/index.ts +31 -3
  194. package/src/domain/project/schema.ts +39 -6
  195. package/src/domain/project/service.ts +42 -17
  196. package/src/domain/projects/index.ts +5 -1
  197. package/src/domain/resources/index.ts +85 -2
  198. package/src/domain/resources/schema.ts +12 -2
  199. package/src/domain/resources/service.ts +55 -3
  200. package/src/domain/skills/index.ts +61 -0
  201. package/src/domain/skills/schema.ts +19 -0
  202. package/src/domain/skills/service.ts +18 -0
  203. package/src/export.ts +60 -42
  204. package/src/index.ts +3 -0
  205. package/src/main.ts +30 -11
  206. package/src/middleware/auth.ts +23 -4
  207. package/src/middleware/commandManager.ts +3 -0
  208. package/src/overlay.ts +175 -0
  209. package/src/project-errors.ts +33 -0
  210. package/src/project-registry.ts +41 -10
  211. package/src/utils.ts +10 -0
  212. package/dist/domain/cards/presence.d.ts +0 -50
  213. package/dist/domain/cards/presence.js +0 -93
  214. package/dist/domain/cards/presence.js.map +0 -1
  215. package/dist/public/assets/abnfDiagram-VRR7QNED-Djr4KJ5E.js +0 -1
  216. package/dist/public/assets/arc-DrR4k_H-.js +0 -1
  217. package/dist/public/assets/architecture-TIHT7OUA-XL6N-4o9.js +0 -1
  218. package/dist/public/assets/architectureDiagram-ZJ3FMSHR-DsMU2Uwa.js +0 -36
  219. package/dist/public/assets/blockDiagram-677ZJIJ3-DRBmQUQJ.js +0 -132
  220. package/dist/public/assets/c4Diagram-LMCZKHZV-E0rM02LD.js +0 -10
  221. package/dist/public/assets/channel-D5fnImJy.js +0 -1
  222. package/dist/public/assets/chunk-32BRIVSS-BnDY0aSV.js +0 -1
  223. package/dist/public/assets/chunk-52WLFC77-N5YugKaZ.js +0 -10
  224. package/dist/public/assets/chunk-5FCAYU7R-I3_t_Ic_.js +0 -1
  225. package/dist/public/assets/chunk-5HE753X5-Dxz40rzH.js +0 -1
  226. package/dist/public/assets/chunk-5JV3BV7I-CNwCKRLH.js +0 -1
  227. package/dist/public/assets/chunk-5TONJI2A-ezWQ_Z2j.js +0 -2
  228. package/dist/public/assets/chunk-7BUUIJ7U-Bb538aSH.js +0 -1
  229. package/dist/public/assets/chunk-BIQX33UG-DS132-R_.js +0 -1
  230. package/dist/public/assets/chunk-C7G6YPKG-BN-cNjoj.js +0 -1
  231. package/dist/public/assets/chunk-CQNSW5MT-D8Mn1I73.js +0 -1
  232. package/dist/public/assets/chunk-CYSBUYHQ-Dc64Dwdo.js +0 -1
  233. package/dist/public/assets/chunk-EMLP6XTP-aIK0V8GX.js +0 -1
  234. package/dist/public/assets/chunk-FWX5IMBZ-BF_P2-Do.js +0 -2
  235. package/dist/public/assets/chunk-ICXQ74PX-Bb8zaHde.js +0 -2
  236. package/dist/public/assets/chunk-JG7HCLWE-BtAXK3iQ.js +0 -2
  237. package/dist/public/assets/chunk-KEIR6QF5-DEvma7oi.js +0 -161
  238. package/dist/public/assets/chunk-MOZMSUNE-5FIqIBsY.js +0 -1
  239. package/dist/public/assets/chunk-OGEWGWER-BVIFy9xz.js +0 -1
  240. package/dist/public/assets/chunk-OSBZ3O6U-Cfd7kf1R.js +0 -1
  241. package/dist/public/assets/chunk-PUDLZKDR-Db3FSNR9.js +0 -156
  242. package/dist/public/assets/chunk-Q4XR5HBZ-BuKFRUzR.js +0 -70
  243. package/dist/public/assets/chunk-QBLGF6JB-DUGZXFh-.js +0 -1
  244. package/dist/public/assets/chunk-R7FJI6CG-D7mUd-qN.js +0 -1
  245. package/dist/public/assets/chunk-RYQCIY6F-C_3rESBd.js +0 -1
  246. package/dist/public/assets/chunk-U6XO7XAA-C3UhlwA1.js +0 -2
  247. package/dist/public/assets/chunk-VAUOI2AC-C-GBw18h.js +0 -1
  248. package/dist/public/assets/chunk-WYO6CB5R-BQoO62-B.js +0 -127
  249. package/dist/public/assets/chunk-XXDRQBXY-Co8n4ZHT.js +0 -1
  250. package/dist/public/assets/chunk-YOTPTUD7-DhCRKU1A.js +0 -1
  251. package/dist/public/assets/chunk-ZGVPDNZ5-hpz2Ryq5.js +0 -62
  252. package/dist/public/assets/chunk-ZIRB5QZD-BpeS1aZ7.js +0 -32
  253. package/dist/public/assets/classDiagram-OUVF2IWQ-CXdVorPK.js +0 -1
  254. package/dist/public/assets/classDiagram-v2-EOCWNBFH-CXdVorPK.js +0 -1
  255. package/dist/public/assets/colors-Cg5Vh3br.js +0 -1
  256. package/dist/public/assets/cose-bilkent-JH36ORCC-4GoRbloS.js +0 -1
  257. package/dist/public/assets/cynefin-VYW2F7L2-BPH-25fI.js +0 -1
  258. package/dist/public/assets/cynefinDiagram-TSTJHNR4-PEf16euv.js +0 -62
  259. package/dist/public/assets/cytoscape.esm-C3UvhD5t.js +0 -321
  260. package/dist/public/assets/dagre-Buvkdvvj.js +0 -1
  261. package/dist/public/assets/dagre-VKFMJZFB-DPsCMBF1.js +0 -4
  262. package/dist/public/assets/diagram-G47NLZAW-CzUoYkFf.js +0 -24
  263. package/dist/public/assets/diagram-NH7WQ7WH-MhGnE2fh.js +0 -24
  264. package/dist/public/assets/diagram-OA4YK3LP-CsQ9aFR_.js +0 -30
  265. package/dist/public/assets/diagram-WEI45ONY-Er3q49ew.js +0 -41
  266. package/dist/public/assets/dist-BzwexiH1.js +0 -1
  267. package/dist/public/assets/ebnfDiagram-CCIWWBDH-AnJAsk14.js +0 -1
  268. package/dist/public/assets/erDiagram-Q63AITRT-DulA16my.js +0 -85
  269. package/dist/public/assets/eventmodeling-45OFAUF4-CoIhTpHU.js +0 -1
  270. package/dist/public/assets/flowDiagram-23GEKE2U-BGMXUq18.js +0 -1
  271. package/dist/public/assets/ganttDiagram-NO4QXBWP-DAvCPT7_.js +0 -292
  272. package/dist/public/assets/gitGraph-TEB2WS4Q-BcPsZts5.js +0 -1
  273. package/dist/public/assets/index-H1CkT-JT.js +0 -447
  274. package/dist/public/assets/info-DKCQHKI2-7VGzrAVB.js +0 -1
  275. package/dist/public/assets/infoDiagram-FWYZ7A6U-D_by7lSL.js +0 -2
  276. package/dist/public/assets/journeyDiagram-5HDEW3XC-DpvFmk7c.js +0 -139
  277. package/dist/public/assets/linear-BWTvbP1l.js +0 -1
  278. package/dist/public/assets/map-BaFkSB1l.js +0 -1
  279. package/dist/public/assets/mermaid-parser.core--8614tkK.js +0 -4
  280. package/dist/public/assets/ordinal-BdBDtYTt.js +0 -1
  281. package/dist/public/assets/packet-7NZHBO7P-KYt33H0C.js +0 -1
  282. package/dist/public/assets/path-HTXttWil.js +0 -1
  283. package/dist/public/assets/pegDiagram-2B236MQR-BQNFxYz2.js +0 -1
  284. package/dist/public/assets/pie-RZYD4A2V-xKz9s9I4.js +0 -1
  285. package/dist/public/assets/pieDiagram-ENE6RG2P-Cy13tg8_.js +0 -39
  286. package/dist/public/assets/radar-I7S5WNFK-B4QTX-fX.js +0 -1
  287. package/dist/public/assets/railroad-3IZDKUUU-Co_9rPVC.js +0 -1
  288. package/dist/public/assets/railroad-abnf-AHOZXSZD-Bhy_c3ol.js +0 -1
  289. package/dist/public/assets/railroad-ebnf-EBAXGLYW-B9ENjG34.js +0 -1
  290. package/dist/public/assets/railroad-peg-LSFZ7HO6-CyJxDBsB.js +0 -1
  291. package/dist/public/assets/railroadDiagram-RFXS5EU6-M2j5SJF2.js +0 -1
  292. package/dist/public/assets/range-EplFIxc7.js +0 -1
  293. package/dist/public/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +0 -1
  294. package/dist/public/assets/src-DOh7_en_.js +0 -1
  295. package/dist/public/assets/stateDiagram-2N3HPSRC-a9IdkSQG.js +0 -1
  296. package/dist/public/assets/stateDiagram-v2-6OUMAXLB-s2blPtZ-.js +0 -1
  297. package/dist/public/assets/swimlanes-5IMT3BWC-5w0Cdxk6.js +0 -2
  298. package/dist/public/assets/swimlanesDiagram-G3AALYLV-BWa-KRed.js +0 -8
  299. package/dist/public/assets/time-BM2d9MsQ.js +0 -1
  300. package/dist/public/assets/timeline-definition-FHXFAJF6-CvXlv_4Y.js +0 -120
  301. package/dist/public/assets/treeView-QDETBFTQ-B9cxjfpB.js +0 -1
  302. package/dist/public/assets/treemap-6X3UGDF4-BplEq4hB.js +0 -1
  303. package/dist/public/assets/treemap-BfjIY-m6.js +0 -1
  304. package/dist/public/assets/wardley-OPB4EBWU-BX2ghg5e.js +0 -1
  305. package/src/domain/cards/presence.ts +0 -124
@@ -5,12 +5,14 @@ import {
5
5
  resourceTypes,
6
6
  } from '../../common/validationSchemas.js';
7
7
 
8
- export const workflowGraphParamsSchema = z.object({
8
+ export const prefixIdentifierParamsSchema = z.object({
9
9
  prefix: z.string(),
10
10
  identifier: identifierSchema,
11
11
  });
12
12
 
13
- export type WorkflowGraphParams = z.infer<typeof workflowGraphParamsSchema>;
13
+ export type PrefixIdentifierParams = z.infer<
14
+ typeof prefixIdentifierParamsSchema
15
+ >;
14
16
 
15
17
  export const workflowGraphQuerySchema = z.object({
16
18
  card: z.string().optional(),
@@ -18,6 +20,14 @@ export const workflowGraphQuerySchema = z.object({
18
20
 
19
21
  export type WorkflowGraphQuery = z.infer<typeof workflowGraphQuerySchema>;
20
22
 
23
+ export const skillPreviewBodySchema = z.object({
24
+ skillContent: z.string().optional(),
25
+ skillQuery: z.string().optional(),
26
+ cardKey: z.string().optional(),
27
+ });
28
+
29
+ export type SkillPreviewBody = z.infer<typeof skillPreviewBodySchema>;
30
+
21
31
  export const resourceFileParamsSchema = resourceParamsSchema.extend({
22
32
  file: z.string(),
23
33
  });
@@ -26,7 +26,11 @@ import {
26
26
  resourceNameToString,
27
27
  } from '@cyberismo/data-handler';
28
28
  import type { ResourceParams } from '../../common/validationSchemas.js';
29
- import type { ValidateResourceParams, UpdateOperationBody } from './schema.js';
29
+ import type {
30
+ SkillPreviewBody,
31
+ UpdateOperationBody,
32
+ ValidateResourceParams,
33
+ } from './schema.js';
30
34
 
31
35
  const resourceTypes: ResourceFolderType[] = [
32
36
  'calculations',
@@ -36,17 +40,18 @@ const resourceTypes: ResourceFolderType[] = [
36
40
  'graphViews',
37
41
  'linkTypes',
38
42
  'reports',
43
+ 'skills',
39
44
  'templates',
40
45
  'workflows',
41
46
  ];
42
47
 
43
48
  async function getModules(commands: CommandManager) {
44
49
  try {
45
- const modules = await commands.showCmd.showModules();
50
+ const modules = await commands.modulesCmd.list();
46
51
  return Promise.all(
47
52
  modules.map(async (mod) => {
48
53
  try {
49
- const module = await commands.showCmd.showModule(mod.name);
54
+ const module = await commands.modulesCmd.show(mod.name);
50
55
  return { name: module.name, cardKeyPrefix: module.cardKeyPrefix };
51
56
  } catch {
52
57
  return { name: mod.name, cardKeyPrefix: mod.name };
@@ -530,6 +535,53 @@ export async function getWorkflowGraph(
530
535
  });
531
536
  }
532
537
 
538
+ /**
539
+ * Renders a skill's instructions for the configuration editor preview.
540
+ * Unlike the MCP `get_skill` tool, this does not require the skill to be
541
+ * enabled by the logic programs — the author is still working on it. When
542
+ * `skillContent` or `skillQuery` is given, that unsaved editor content is
543
+ * rendered instead of what is stored on disk. The lookups and the rendering
544
+ * share one consistency window so the preview matches a single project state.
545
+ * @returns the rendered instructions as markdown.
546
+ * @throws Error with 'not found' in the message when the skill or card cannot
547
+ * be resolved; any other error means the template or query failed to render.
548
+ */
549
+ export async function previewSkill(
550
+ commands: CommandManager,
551
+ skillName: string,
552
+ body: SkillPreviewBody,
553
+ ): Promise<string> {
554
+ const { cardKey, skillContent, skillQuery } = body;
555
+ return commands.consistent(async () => {
556
+ try {
557
+ await commands.showCmd.showResource(skillName, 'skills');
558
+ } catch (error) {
559
+ if (error instanceof Error && error.message.includes('does not exist')) {
560
+ throw new Error(`Skill '${skillName}' not found`, { cause: error });
561
+ }
562
+ throw error;
563
+ }
564
+ if (cardKey) {
565
+ try {
566
+ await commands.showCmd.showCardDetails(cardKey);
567
+ } catch (error) {
568
+ if (
569
+ error instanceof Error &&
570
+ error.message.includes('does not exist')
571
+ ) {
572
+ throw new Error(`Card '${cardKey}' not found`, { cause: error });
573
+ }
574
+ throw error;
575
+ }
576
+ }
577
+ return commands.showCmd.renderSkill(skillName, {
578
+ cardKey,
579
+ skillContent,
580
+ skillQuery,
581
+ });
582
+ });
583
+ }
584
+
533
585
  /**
534
586
  * Perform an updateOperation on a resource key.
535
587
  * This delegates to the data-handler mutation engine.
@@ -0,0 +1,61 @@
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.
7
+ This program is distributed in the hope that it will be useful, but WITHOUT
8
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
9
+ FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
10
+ details. You should have received a copy of the GNU Affero General Public
11
+ License along with this program. If not, see <https://www.gnu.org/licenses/>.
12
+ */
13
+
14
+ import { Hono } from 'hono';
15
+ import * as skillService from './service.js';
16
+ import { createSkillSchema } from './schema.js';
17
+ import { zValidator } from '../../middleware/zvalidator.js';
18
+ import { UserRole } from '../../types.js';
19
+ import { requireRole } from '../../middleware/auth.js';
20
+
21
+ const router = new Hono();
22
+
23
+ /**
24
+ * @swagger
25
+ * /api/skills:
26
+ * post:
27
+ * summary: Create a new skill
28
+ * description: Creates a new skill with the specified identifier
29
+ * requestBody:
30
+ * required: true
31
+ * content:
32
+ * application/json:
33
+ * schema:
34
+ * type: object
35
+ * properties:
36
+ * identifier:
37
+ * type: string
38
+ * required:
39
+ * - identifier
40
+ * responses:
41
+ * 200:
42
+ * description: Skill created successfully
43
+ * 400:
44
+ * description: Invalid request body
45
+ * 500:
46
+ * description: Server error
47
+ */
48
+ router.post(
49
+ '/',
50
+ requireRole(UserRole.Admin),
51
+ zValidator('json', createSkillSchema),
52
+ async (c) => {
53
+ const commands = c.get('commands');
54
+ const { identifier } = c.req.valid('json');
55
+
56
+ await skillService.createSkill(commands, identifier);
57
+ return c.json({ message: 'Skill created successfully' });
58
+ },
59
+ );
60
+
61
+ export default router;
@@ -0,0 +1,19 @@
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.
7
+ This program is distributed in the hope that it will be useful, but WITHOUT
8
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
9
+ FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
10
+ details. You should have received a copy of the GNU Affero General Public
11
+ License along with this program. If not, see <https://www.gnu.org/licenses/>.
12
+ */
13
+
14
+ import { z } from 'zod';
15
+ import { identifierSchema } from '../../common/validationSchemas.js';
16
+
17
+ export const createSkillSchema = z.object({
18
+ identifier: identifierSchema,
19
+ });
@@ -0,0 +1,18 @@
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.
7
+ This program is distributed in the hope that it will be useful, but WITHOUT
8
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
9
+ FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
10
+ details. You should have received a copy of the GNU Affero General Public
11
+ License along with this program. If not, see <https://www.gnu.org/licenses/>.
12
+ */
13
+
14
+ import type { CommandManager } from '@cyberismo/data-handler';
15
+
16
+ export async function createSkill(commands: CommandManager, skillName: string) {
17
+ await commands.createCmd.createSkill(skillName);
18
+ }
package/src/export.ts CHANGED
@@ -22,6 +22,7 @@ import { staticFrontendDirRelative } from './utils.js';
22
22
  import type { QueryResult } from '@cyberismo/data-handler/types/queries';
23
23
  import { toSSG } from 'hono/ssg';
24
24
  import type { TreeOptions } from './types.js';
25
+ import type { ProjectErrors } from './project-errors.js';
25
26
  import {
26
27
  findAllCards,
27
28
  findRelevantAttachments,
@@ -32,6 +33,8 @@ export interface ExportSiteOptions extends TreeOptions {
32
33
  }
33
34
 
34
35
  const _cardQueryCache = new Map<string, Promise<QueryResult<'card'>[]>>();
36
+ /** Label for errors from routes that belong to no project. */
37
+ const SHARED_ROUTES = '(shared)';
35
38
  const OVERHEAD_CALLS = 6; // estimated number of overhead calls during export in addition to card exports
36
39
 
37
40
  /**
@@ -82,14 +85,14 @@ export async function getCardQueryResult(
82
85
  * @param options.cardKey - Key of the card to export. If not provided, all cards will be exported.
83
86
  * @param options.defaultProject - Default project prefix to write into config.json.
84
87
  * @param onProgress - Optional progress callback function.
85
- * @returns An object containing any errors that occurred during export.
88
+ * @returns Errors that occurred during export, grouped by project.
86
89
  */
87
90
  export async function exportSite(
88
91
  registry: ProjectRegistry,
89
92
  exportDir?: string,
90
93
  options?: ExportSiteOptions,
91
94
  onProgress?: (current: number, total: number) => void,
92
- ): Promise<{ errors: string[] }> {
95
+ ): Promise<{ errors: ProjectErrors[] }> {
93
96
  exportDir = exportDir || 'static';
94
97
  const { defaultProject, ...treeOpts } = options ?? {};
95
98
  const opts: TreeOptions = {
@@ -125,50 +128,65 @@ export async function exportSite(
125
128
  total += cards.length + attachments.length;
126
129
  }
127
130
 
128
- // Actual export with progress reporting
131
+ // One pass per project so an error is attributed to the project whose route
132
+ // produced it (the response itself carries no project). Shared routes get
133
+ // their own pass so each route is emitted exactly once.
134
+ const prefixes = registry.list().map((p) => p.prefix);
135
+ const projectOf = (pathname: string) =>
136
+ prefixes.find((p) => {
137
+ const base = `/api/projects/${p}`;
138
+ return pathname === base || pathname.startsWith(`${base}/`);
139
+ });
140
+
129
141
  let done = 0;
130
142
  onProgress?.(done, total);
131
- const errors: string[] = [];
132
- await toSSG(app, fs, {
133
- dir: exportDir,
134
- concurrency: 5,
135
- plugins: [
136
- {
137
- beforeRequestHook: (req) => {
138
- const url = new URL(req.url);
139
- // Skip MCP routes — they require session state and are not part of the static site
140
- if (url.pathname.startsWith('/mcp')) {
141
- return false;
142
- }
143
- // Skip OIDC/well-known routes — not relevant for static export
144
- if (url.pathname.startsWith('/.well-known')) {
145
- return false;
146
- }
147
- return req;
148
- },
149
- afterResponseHook: async (response) => {
150
- if (![200, 201, 204].includes(response.status)) {
151
- const error = await response.json();
152
- if (
153
- typeof error === 'object' &&
154
- error != null &&
155
- 'error' in error &&
156
- typeof error.error === 'string'
157
- ) {
158
- errors.push(error.error);
143
+ const errors: ProjectErrors[] = [];
144
+ for (const scope of [undefined, ...prefixes]) {
145
+ const scopeErrors: string[] = [];
146
+ await toSSG(app, fs, {
147
+ dir: exportDir,
148
+ concurrency: 5,
149
+ plugins: [
150
+ {
151
+ beforeRequestHook: (req) => {
152
+ const url = new URL(req.url);
153
+ // Skip MCP routes — they require session state and are not part of the static site
154
+ if (url.pathname.startsWith('/mcp')) {
155
+ return false;
156
+ }
157
+ // Skip OIDC/well-known routes — not relevant for static export
158
+ if (url.pathname.startsWith('/.well-known')) {
159
+ return false;
160
+ }
161
+ return projectOf(url.pathname) === scope ? req : false;
162
+ },
163
+ afterResponseHook: async (response) => {
164
+ if (![200, 201, 204].includes(response.status)) {
165
+ const error = await response.json();
166
+ if (
167
+ typeof error === 'object' &&
168
+ error != null &&
169
+ 'error' in error &&
170
+ typeof error.error === 'string'
171
+ ) {
172
+ scopeErrors.push(error.error);
173
+ }
174
+ return false; // ignore route
159
175
  }
160
- return false; // ignore route
161
- }
162
- done++;
163
- if (done > total) {
164
- total = done; // adjust total if underestimated
165
- }
166
- onProgress?.(done, total);
167
- return response;
176
+ done++;
177
+ if (done > total) {
178
+ total = done; // adjust total if underestimated
179
+ }
180
+ onProgress?.(done, total);
181
+ return response;
182
+ },
168
183
  },
169
- },
170
- ],
171
- });
184
+ ],
185
+ });
186
+ if (scopeErrors.length > 0) {
187
+ errors.push({ prefix: scope ?? SHARED_ROUTES, errors: scopeErrors });
188
+ }
189
+ }
172
190
  return {
173
191
  errors,
174
192
  };
package/src/index.ts CHANGED
@@ -17,6 +17,7 @@ import { serveStatic } from '@hono/node-server/serve-static';
17
17
  import path from 'node:path';
18
18
  import { readFile } from 'node:fs/promises';
19
19
  import { findFreePort } from './utils.js';
20
+ import { startPolicyPolling } from './overlay.js';
20
21
  import { createApp } from './app.js';
21
22
  import type { AuthProvider } from './auth/types.js';
22
23
  import type { ProjectRegistry } from './project-registry.js';
@@ -25,6 +26,7 @@ export type { MockUserConfig } from './auth/mock.js';
25
26
  export type { AuthProvider } from './auth/types.js';
26
27
  export { exportSite, type ExportSiteOptions } from './export.js';
27
28
  export { ProjectRegistry } from './project-registry.js';
29
+ export { formatProjectErrors, type ProjectErrors } from './project-errors.js';
28
30
 
29
31
  const DEFAULT_PORT = 3000;
30
32
  const DEFAULT_MAX_PORT = DEFAULT_PORT + 100;
@@ -72,6 +74,7 @@ export async function startServer(
72
74
  if (findPort && !useOsAssigned) {
73
75
  port = await findFreePort(port, DEFAULT_MAX_PORT);
74
76
  }
77
+ startPolicyPolling(() => registry.list().map((p) => ({ prefix: p.prefix })));
75
78
  const app = createApp(
76
79
  authProvider,
77
80
  registry,
package/src/main.ts CHANGED
@@ -17,6 +17,8 @@ import { MockAuthProvider } from './auth/mock.js';
17
17
  import { KeycloakAuthProvider } from './auth/keycloak.js';
18
18
  import type { AuthProvider } from './auth/types.js';
19
19
  import { ProjectRegistry } from './project-registry.js';
20
+ import { formatProjectErrors } from './project-errors.js';
21
+ import { gitOptionsFromEnv } from './utils.js';
20
22
  import { parseArgs } from 'node:util';
21
23
  import dotenv from 'dotenv';
22
24
 
@@ -34,7 +36,7 @@ function createAuthProvider(): AuthProvider {
34
36
  }
35
37
 
36
38
  if (authMode === 'mock') {
37
- return new MockAuthProvider();
39
+ return new MockAuthProvider({ roster: true });
38
40
  }
39
41
 
40
42
  if (authMode === 'idp') {
@@ -83,18 +85,35 @@ if (args.export) {
83
85
  console.error('No projects found to export.');
84
86
  process.exit(1);
85
87
  }
86
- const registry = await ProjectRegistry.fromScannedProjects(projects);
87
- await exportSite(registry, undefined, {
88
- defaultProject:
89
- typeof args['default-project'] === 'string'
90
- ? args['default-project']
91
- : undefined,
88
+ const defaultProject =
89
+ typeof args['default-project'] === 'string'
90
+ ? args['default-project']
91
+ : undefined;
92
+ const { registry, failed } =
93
+ await ProjectRegistry.fromScannedProjects(projects);
94
+ if (
95
+ registry.list().length === 0 ||
96
+ failed.some((f) => f.prefix === defaultProject)
97
+ ) {
98
+ console.error(formatProjectErrors(failed));
99
+ process.exit(1);
100
+ }
101
+ const { errors: exportErrors } = await exportSite(registry, undefined, {
102
+ defaultProject,
92
103
  });
104
+ const errors = [...failed, ...exportErrors];
105
+ if (errors.length > 0) {
106
+ console.error(formatProjectErrors(errors));
107
+ process.exit(1);
108
+ }
93
109
  } else {
94
- const autocommit = process.env.CYBERISMO_AUTOCOMMIT === 'true';
95
- const registry = await ProjectRegistry.fromScannedProjects(projects, {
96
- autocommit,
97
- });
110
+ const { registry, failed } = await ProjectRegistry.fromScannedProjects(
111
+ projects,
112
+ gitOptionsFromEnv(),
113
+ );
114
+ if (failed.length > 0) {
115
+ console.error(formatProjectErrors(failed));
116
+ }
98
117
  const authProvider = createAuthProvider();
99
118
  await startServer(authProvider, registry, true, projectPath);
100
119
  }
@@ -15,11 +15,13 @@ import type { Context, MiddlewareHandler } from 'hono';
15
15
  import type { UserInfo } from '../types.js';
16
16
  import { UserRole } from '../types.js';
17
17
  import type { AuthProvider } from '../auth/types.js';
18
+ import { isReadOnly } from '../overlay.js';
18
19
 
19
20
  // Extend Hono Context type to include our custom properties
20
21
  declare module 'hono' {
21
22
  interface ContextVariableMap {
22
23
  user: UserInfo;
24
+ tokenExp: number;
23
25
  }
24
26
  }
25
27
 
@@ -30,6 +32,14 @@ const roleLevel: Record<UserRole, number> = {
30
32
  [UserRole.Admin]: 2,
31
33
  };
32
34
 
35
+ /** Everyone below administrator is a reader; lifting read-only is their job. */
36
+ function applyReadOnly(user: UserInfo): UserInfo {
37
+ if (user.role === UserRole.Admin) {
38
+ return user;
39
+ }
40
+ return { ...user, role: UserRole.Reader };
41
+ }
42
+
33
43
  /**
34
44
  * Create authentication middleware from an AuthProvider.
35
45
  * Validates the user and attaches user info to the context.
@@ -38,10 +48,12 @@ export function createAuthMiddleware(
38
48
  provider: AuthProvider,
39
49
  ): MiddlewareHandler {
40
50
  return async (c, next) => {
41
- const user = await provider.authenticate(c.req.raw);
51
+ const result = await provider.authenticate(c.req.raw);
42
52
 
43
- if (user) {
44
- c.set('user', user);
53
+ if (result) {
54
+ const { exp, ...user } = result;
55
+ c.set('user', isReadOnly(c.req.path) ? applyReadOnly(user) : user);
56
+ c.set('tokenExp', exp);
45
57
  } else {
46
58
  // RFC 9728 §5.1: include resource_metadata in WWW-Authenticate
47
59
  // only for MCP routes, where the metadata document applies.
@@ -60,6 +72,13 @@ export function createAuthMiddleware(
60
72
  };
61
73
  }
62
74
 
75
+ /**
76
+ * Check if a role meets or exceeds a minimum role in the hierarchy.
77
+ */
78
+ export function isAtLeastRole(role: UserRole, minimumRole: UserRole): boolean {
79
+ return roleLevel[role] >= roleLevel[minimumRole];
80
+ }
81
+
63
82
  /**
64
83
  * Check if the current user has at least the required role
65
84
  */
@@ -69,7 +88,7 @@ export function hasRole(c: Context, minimumRole: UserRole): boolean {
69
88
  return false;
70
89
  }
71
90
 
72
- return roleLevel[user.role] >= roleLevel[minimumRole];
91
+ return isAtLeastRole(user.role, minimumRole);
73
92
  }
74
93
 
75
94
  /**
@@ -14,11 +14,13 @@ import type { Context, MiddlewareHandler } from 'hono';
14
14
  import type { CommandManager } from '@cyberismo/data-handler';
15
15
  import { getCurrentUser } from './auth.js';
16
16
  import type { ProjectRegistry } from '../project-registry.js';
17
+ import type { ProjectEvents } from '../domain/events/project-events.js';
17
18
 
18
19
  // Extend Hono Context type to include our custom properties
19
20
  declare module 'hono' {
20
21
  interface ContextVariableMap {
21
22
  commands: CommandManager;
23
+ events: ProjectEvents;
22
24
  projectPath: string;
23
25
  registry: ProjectRegistry;
24
26
  }
@@ -73,6 +75,7 @@ export const attachProjectRegistry = (
73
75
  if (!commands) {
74
76
  return c.json({ error: `Project '${prefix}' not found` }, 404);
75
77
  }
78
+ c.set('events', registry.eventsFor(commands));
76
79
  return runWithCommands(c, commands, next);
77
80
  };
78
81
  };